@creativeintelligence/abbie 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/login.js +26 -0
- package/dist/cli/commands/start.js +2 -1
- package/oclif.manifest.json +1 -1
- package/package.json +9 -5
- package/dist/cli/base-command.d.ts.map +0 -1
- package/dist/cli/commands/agent/list.d.ts.map +0 -1
- package/dist/cli/commands/annotation/ack.d.ts.map +0 -1
- package/dist/cli/commands/annotation/create.d.ts.map +0 -1
- package/dist/cli/commands/annotation/events.d.ts.map +0 -1
- package/dist/cli/commands/annotation/export.d.ts.map +0 -1
- package/dist/cli/commands/annotation/import.d.ts.map +0 -1
- package/dist/cli/commands/annotation/ingest.d.ts.map +0 -1
- package/dist/cli/commands/annotation/list.d.ts.map +0 -1
- package/dist/cli/commands/annotation/reply.d.ts.map +0 -1
- package/dist/cli/commands/annotation/resolve.d.ts.map +0 -1
- package/dist/cli/commands/auto/index.d.ts.map +0 -1
- package/dist/cli/commands/backlog/add.d.ts.map +0 -1
- package/dist/cli/commands/backlog/claim.d.ts.map +0 -1
- package/dist/cli/commands/backlog/complete.d.ts.map +0 -1
- package/dist/cli/commands/backlog/list.d.ts.map +0 -1
- package/dist/cli/commands/backlog/pick.d.ts.map +0 -1
- package/dist/cli/commands/backlog/sync.d.ts.map +0 -1
- package/dist/cli/commands/bootstrap.d.ts.map +0 -1
- package/dist/cli/commands/bridge.d.ts.map +0 -1
- package/dist/cli/commands/context/inject.d.ts.map +0 -1
- package/dist/cli/commands/context/list.d.ts.map +0 -1
- package/dist/cli/commands/context/publish.d.ts.map +0 -1
- package/dist/cli/commands/context/read.d.ts.map +0 -1
- package/dist/cli/commands/daemon.d.ts.map +0 -1
- package/dist/cli/commands/digest/index.d.ts.map +0 -1
- package/dist/cli/commands/docs/lint.d.ts.map +0 -1
- package/dist/cli/commands/docs/sync.d.ts.map +0 -1
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/find/index.d.ts.map +0 -1
- package/dist/cli/commands/gc.d.ts.map +0 -1
- package/dist/cli/commands/history/index.d.ts.map +0 -1
- package/dist/cli/commands/hooks/guard.d.ts.map +0 -1
- package/dist/cli/commands/hooks/list.d.ts.map +0 -1
- package/dist/cli/commands/hooks/lock.d.ts.map +0 -1
- package/dist/cli/commands/hooks/status.d.ts.map +0 -1
- package/dist/cli/commands/hooks/test.d.ts.map +0 -1
- package/dist/cli/commands/hooks/unlock.d.ts.map +0 -1
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.e2e.test.d.ts +0 -1
- package/dist/cli/commands/list.e2e.test.js +0 -47
- package/dist/cli/commands/login.d.ts.map +0 -1
- package/dist/cli/commands/logout.d.ts.map +0 -1
- package/dist/cli/commands/panes/broker.d.ts.map +0 -1
- package/dist/cli/commands/panes/pipe-sink.d.ts.map +0 -1
- package/dist/cli/commands/panes/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.e2e.test.d.ts +0 -1
- package/dist/cli/commands/plan.e2e.test.js +0 -74
- package/dist/cli/commands/preview/index.d.ts.map +0 -1
- package/dist/cli/commands/preview/init.d.ts.map +0 -1
- package/dist/cli/commands/preview/list.d.ts.map +0 -1
- package/dist/cli/commands/preview/status.d.ts.map +0 -1
- package/dist/cli/commands/preview/stop.d.ts.map +0 -1
- package/dist/cli/commands/preview/sync.d.ts.map +0 -1
- package/dist/cli/commands/preview/watch.d.ts.map +0 -1
- package/dist/cli/commands/project/add.d.ts.map +0 -1
- package/dist/cli/commands/project/list.d.ts.map +0 -1
- package/dist/cli/commands/project/remove.d.ts.map +0 -1
- package/dist/cli/commands/push.d.ts.map +0 -1
- package/dist/cli/commands/reference/add.d.ts.map +0 -1
- package/dist/cli/commands/reference/delete.d.ts.map +0 -1
- package/dist/cli/commands/reference/extract.d.ts.map +0 -1
- package/dist/cli/commands/reference/list.d.ts.map +0 -1
- package/dist/cli/commands/reference/normalize.d.ts.map +0 -1
- package/dist/cli/commands/reference/open.d.ts.map +0 -1
- package/dist/cli/commands/reference/save.d.ts.map +0 -1
- package/dist/cli/commands/reference/search.d.ts.map +0 -1
- package/dist/cli/commands/reference/show.d.ts.map +0 -1
- package/dist/cli/commands/reference/update-index.d.ts.map +0 -1
- package/dist/cli/commands/reference/update.d.ts.map +0 -1
- package/dist/cli/commands/report/blocked.d.ts.map +0 -1
- package/dist/cli/commands/report/complete.d.ts.map +0 -1
- package/dist/cli/commands/report/progress.d.ts.map +0 -1
- package/dist/cli/commands/report/start.d.ts.map +0 -1
- package/dist/cli/commands/resource/acquire.d.ts.map +0 -1
- package/dist/cli/commands/resource/list.d.ts.map +0 -1
- package/dist/cli/commands/resource/release.d.ts.map +0 -1
- package/dist/cli/commands/resource/wait.d.ts.map +0 -1
- package/dist/cli/commands/review.d.ts.map +0 -1
- package/dist/cli/commands/session/attach.d.ts.map +0 -1
- package/dist/cli/commands/session/await.d.ts.map +0 -1
- package/dist/cli/commands/session/complete.d.ts.map +0 -1
- package/dist/cli/commands/session/create.d.ts.map +0 -1
- package/dist/cli/commands/session/heartbeat.d.ts.map +0 -1
- package/dist/cli/commands/session/list.d.ts.map +0 -1
- package/dist/cli/commands/session/mark-done.d.ts.map +0 -1
- package/dist/cli/commands/session/mine.d.ts.map +0 -1
- package/dist/cli/commands/session/replay.d.ts.map +0 -1
- package/dist/cli/commands/session/run.d.ts.map +0 -1
- package/dist/cli/commands/session/show.d.ts.map +0 -1
- package/dist/cli/commands/session/start.d.ts.map +0 -1
- package/dist/cli/commands/session/state/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/session/state/end.d.ts.map +0 -1
- package/dist/cli/commands/session/state/get.d.ts.map +0 -1
- package/dist/cli/commands/session/state/init.d.ts.map +0 -1
- package/dist/cli/commands/session/state/list.d.ts.map +0 -1
- package/dist/cli/commands/session/state/update.d.ts.map +0 -1
- package/dist/cli/commands/session/stop.d.ts.map +0 -1
- package/dist/cli/commands/session/view.d.ts.map +0 -1
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/state/dump.d.ts.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/trace/export.d.ts.map +0 -1
- package/dist/cli/commands/triage/claim.d.ts.map +0 -1
- package/dist/cli/commands/triage/list.d.ts.map +0 -1
- package/dist/cli/commands/triage/next.d.ts.map +0 -1
- package/dist/cli/commands/triage/pull.d.ts.map +0 -1
- package/dist/cli/commands/triage/stats.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/list.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/start.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/stop.d.ts.map +0 -1
- package/dist/cli/commands/tunnel/url.d.ts.map +0 -1
- package/dist/cli/commands/web/start.d.ts.map +0 -1
- package/dist/cli/commands/windows/context.d.ts.map +0 -1
- package/dist/cli/commands/windows/focus.d.ts.map +0 -1
- package/dist/cli/commands/windows/list.d.ts.map +0 -1
- package/dist/cli/commands/windows/map.d.ts.map +0 -1
- package/dist/cli/commands/windows/read.d.ts.map +0 -1
- package/dist/cli/commands/windows/search.d.ts.map +0 -1
- package/dist/cli/commands/windows/show.d.ts.map +0 -1
- package/dist/cli/commands/windows/watch.d.ts.map +0 -1
- package/dist/lib/active-sessions.d.ts.map +0 -1
- package/dist/lib/agent-adapters.d.ts.map +0 -1
- package/dist/lib/agent-sessions.d.ts.map +0 -1
- package/dist/lib/agent-trace.d.ts.map +0 -1
- package/dist/lib/analytics.d.ts.map +0 -1
- package/dist/lib/annotations-convex.d.ts.map +0 -1
- package/dist/lib/annotations.d.ts.map +0 -1
- package/dist/lib/auto/discover.d.ts.map +0 -1
- package/dist/lib/auto/ideate.d.ts.map +0 -1
- package/dist/lib/auto/spawn.d.ts.map +0 -1
- package/dist/lib/auto/workspace.d.ts.map +0 -1
- package/dist/lib/backlog.d.ts.map +0 -1
- package/dist/lib/backlog.test.d.ts +0 -1
- package/dist/lib/backlog.test.js +0 -162
- package/dist/lib/config-loader.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/claude.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/codex.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/copilot.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/gemini.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/index.d.ts.map +0 -1
- package/dist/lib/config-sync/adapters/opencode.d.ts.map +0 -1
- package/dist/lib/config-sync/index.d.ts.map +0 -1
- package/dist/lib/config-sync/types.d.ts.map +0 -1
- package/dist/lib/config-sync/writer.d.ts.map +0 -1
- package/dist/lib/content-sync/index.d.ts.map +0 -1
- package/dist/lib/content-sync/types.d.ts.map +0 -1
- package/dist/lib/contracts.d.ts.map +0 -1
- package/dist/lib/convex.d.ts.map +0 -1
- package/dist/lib/device.d.ts.map +0 -1
- package/dist/lib/digest/index.d.ts.map +0 -1
- package/dist/lib/docs/lint.d.ts.map +0 -1
- package/dist/lib/docs/lint.test.d.ts +0 -1
- package/dist/lib/docs/lint.test.js +0 -120
- package/dist/lib/docs/sync.d.ts.map +0 -1
- package/dist/lib/doctor/index.d.ts.map +0 -1
- package/dist/lib/doctor/repos.d.ts.map +0 -1
- package/dist/lib/doctor/templates.d.ts.map +0 -1
- package/dist/lib/errors.d.ts.map +0 -1
- package/dist/lib/events.d.ts.map +0 -1
- package/dist/lib/heartbeat.d.ts.map +0 -1
- package/dist/lib/heartbeat.test.d.ts +0 -1
- package/dist/lib/heartbeat.test.js +0 -124
- package/dist/lib/hooks/adapters/claude.d.ts.map +0 -1
- package/dist/lib/hooks/adapters/codex.d.ts.map +0 -1
- package/dist/lib/hooks/adapters/copilot.d.ts.map +0 -1
- package/dist/lib/hooks/context.d.ts.map +0 -1
- package/dist/lib/hooks/index.d.ts.map +0 -1
- package/dist/lib/hooks/registry.d.ts.map +0 -1
- package/dist/lib/hooks/runner.d.ts.map +0 -1
- package/dist/lib/hooks/types.d.ts.map +0 -1
- package/dist/lib/index.test.d.ts +0 -1
- package/dist/lib/index.test.js +0 -334
- package/dist/lib/managed-session.d.ts.map +0 -1
- package/dist/lib/math.d.ts.map +0 -1
- package/dist/lib/math.test.d.ts +0 -1
- package/dist/lib/math.test.js +0 -238
- package/dist/lib/ngrok.d.ts.map +0 -1
- package/dist/lib/nvim/discovery.d.ts.map +0 -1
- package/dist/lib/nvim/discovery.test.d.ts +0 -1
- package/dist/lib/nvim/discovery.test.js +0 -131
- package/dist/lib/nvim/index.d.ts.map +0 -1
- package/dist/lib/nvim/remote.d.ts.map +0 -1
- package/dist/lib/nvim/remote.test.d.ts +0 -1
- package/dist/lib/nvim/remote.test.js +0 -18
- package/dist/lib/panes/broker.d.ts.map +0 -1
- package/dist/lib/panes/index.d.ts.map +0 -1
- package/dist/lib/panes/server.d.ts.map +0 -1
- package/dist/lib/preview/detect.d.ts.map +0 -1
- package/dist/lib/preview/index.d.ts.map +0 -1
- package/dist/lib/preview/manager.d.ts.map +0 -1
- package/dist/lib/preview/schema.d.ts.map +0 -1
- package/dist/lib/preview/sprite.d.ts.map +0 -1
- package/dist/lib/preview/watcher.d.ts.map +0 -1
- package/dist/lib/process/index.d.ts.map +0 -1
- package/dist/lib/process/snapshot.d.ts.map +0 -1
- package/dist/lib/process/snapshot.test.d.ts +0 -1
- package/dist/lib/process/snapshot.test.js +0 -127
- package/dist/lib/project-identity.d.ts.map +0 -1
- package/dist/lib/provider-auth.d.ts.map +0 -1
- package/dist/lib/references.d.ts.map +0 -1
- package/dist/lib/report.d.ts.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.test.d.ts +0 -1
- package/dist/lib/resources.test.js +0 -94
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.test.d.ts +0 -1
- package/dist/lib/runner.test.js +0 -234
- package/dist/lib/session-artifacts.d.ts.map +0 -1
- package/dist/lib/session-manager.d.ts.map +0 -1
- package/dist/lib/session-manager.test.d.ts +0 -1
- package/dist/lib/session-manager.test.js +0 -310
- package/dist/lib/session-result.d.ts.map +0 -1
- package/dist/lib/session-state.d.ts.map +0 -1
- package/dist/lib/slack-workspace.d.ts.map +0 -1
- package/dist/lib/tmux/bridge.d.ts.map +0 -1
- package/dist/lib/tmux/context.d.ts.map +0 -1
- package/dist/lib/tmux/context.test.d.ts +0 -1
- package/dist/lib/tmux/context.test.js +0 -215
- package/dist/lib/tmux/index.d.ts.map +0 -1
- package/dist/lib/tmux/map.d.ts.map +0 -1
- package/dist/lib/tmux/map.test.d.ts +0 -1
- package/dist/lib/tmux/map.test.js +0 -80
- package/dist/lib/tmux/panes.d.ts.map +0 -1
- package/dist/lib/tmux/redaction.d.ts.map +0 -1
- package/dist/lib/tmux/redaction.test.d.ts +0 -1
- package/dist/lib/tmux/redaction.test.js +0 -183
- package/dist/lib/triage-llm.d.ts.map +0 -1
- package/dist/lib/triage-tracker.d.ts.map +0 -1
- package/dist/lib/triage.d.ts.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/windows/index.d.ts.map +0 -1
- package/dist/lib/windows/inventory.d.ts.map +0 -1
- package/dist/lib/windows/inventory.test.d.ts +0 -1
- package/dist/lib/windows/inventory.test.js +0 -292
- package/dist/lib/windows/types.d.ts.map +0 -1
- package/dist/lib.d.ts.map +0 -1
- package/dist/web/app/@overlay/default.d.ts +0 -1
- package/dist/web/app/@overlay/default.js +0 -3
- package/dist/web/app/about/page.d.ts +0 -1
- package/dist/web/app/about/page.js +0 -6
- package/dist/web/app/layout.d.ts +0 -7
- package/dist/web/app/layout.js +0 -19
- package/dist/web/app/page.d.ts +0 -1
- package/dist/web/app/page.js +0 -38
- package/dist/web/app/settings/page.d.ts +0 -1
- package/dist/web/app/settings/page.js +0 -6
- package/dist/web/app/shortcuts/page.d.ts +0 -1
- package/dist/web/app/shortcuts/page.js +0 -6
- package/dist/web/atoms/sidebar.d.ts +0 -16
- package/dist/web/atoms/sidebar.js +0 -58
- package/dist/web/atoms/state.d.ts +0 -24
- package/dist/web/atoms/state.js +0 -43
- package/dist/web/components/command-palette.d.ts +0 -6
- package/dist/web/components/command-palette.js +0 -297
- package/dist/web/components/main-view.d.ts +0 -1
- package/dist/web/components/main-view.js +0 -93
- package/dist/web/components/overlay/page-overlay.d.ts +0 -16
- package/dist/web/components/overlay/page-overlay.js +0 -84
- package/dist/web/components/pane-view.d.ts +0 -5
- package/dist/web/components/pane-view.js +0 -168
- package/dist/web/components/project-files-view.d.ts +0 -6
- package/dist/web/components/project-files-view.js +0 -205
- package/dist/web/components/project-planning-view.d.ts +0 -6
- package/dist/web/components/project-planning-view.js +0 -146
- package/dist/web/components/session-view.d.ts +0 -6
- package/dist/web/components/session-view.js +0 -211
- package/dist/web/components/sessions-list-view.d.ts +0 -1
- package/dist/web/components/sessions-list-view.js +0 -118
- package/dist/web/components/sidebar/index.d.ts +0 -9
- package/dist/web/components/sidebar/index.js +0 -29
- package/dist/web/components/sidebar/kbd.d.ts +0 -17
- package/dist/web/components/sidebar/kbd.js +0 -47
- package/dist/web/components/sidebar/nav-group.d.ts +0 -22
- package/dist/web/components/sidebar/nav-group.js +0 -43
- package/dist/web/components/sidebar/nav-item.d.ts +0 -17
- package/dist/web/components/sidebar/nav-item.js +0 -38
- package/dist/web/components/sidebar/sidebar-header.d.ts +0 -9
- package/dist/web/components/sidebar/sidebar-header.js +0 -18
- package/dist/web/components/sidebar/sidebar-nav.d.ts +0 -7
- package/dist/web/components/sidebar/sidebar-nav.js +0 -505
- package/dist/web/components/sidebar/sidebar-search.d.ts +0 -7
- package/dist/web/components/sidebar/sidebar-search.js +0 -18
- package/dist/web/components/sidebar/sidebar-settings.d.ts +0 -4
- package/dist/web/components/sidebar/sidebar-settings.js +0 -28
- package/dist/web/components/sidebar/sidebar-transition.d.ts +0 -12
- package/dist/web/components/sidebar/sidebar-transition.js +0 -58
- package/dist/web/components/status-bar.d.ts +0 -1
- package/dist/web/components/status-bar.js +0 -53
- package/dist/web/components/terminal.d.ts +0 -4
- package/dist/web/components/terminal.js +0 -324
- package/dist/web/components/toast.d.ts +0 -7
- package/dist/web/components/toast.js +0 -72
- package/dist/web/hooks/use-keybindings.d.ts +0 -30
- package/dist/web/hooks/use-keybindings.js +0 -322
- package/dist/web/hooks/use-state.d.ts +0 -11
- package/dist/web/hooks/use-state.js +0 -84
- package/dist/web/lib/api.d.ts +0 -179
- package/dist/web/lib/api.js +0 -79
- package/dist/web/lib/paths.d.ts +0 -2
- package/dist/web/lib/paths.js +0 -26
- package/dist/web/lib/utils.d.ts +0 -2
- package/dist/web/lib/utils.js +0 -5
- package/dist/web/lib/ws.d.ts +0 -18
- package/dist/web/lib/ws.js +0 -138
- package/dist/web/next.config.d.ts +0 -3
- package/dist/web/next.config.js +0 -9
- package/scripts/generate-manifest.ts +0 -44
- package/src/cli/base-command.ts +0 -233
- package/src/cli/commands/__tests__/annotations.test.ts +0 -704
- package/src/cli/commands/__tests__/bridge.test.ts +0 -101
- package/src/cli/commands/__tests__/daemon.test.ts +0 -79
- package/src/cli/commands/agent/list.ts +0 -75
- package/src/cli/commands/annotation/ack.ts +0 -37
- package/src/cli/commands/annotation/create.ts +0 -67
- package/src/cli/commands/annotation/events.ts +0 -63
- package/src/cli/commands/annotation/export.ts +0 -67
- package/src/cli/commands/annotation/import.ts +0 -98
- package/src/cli/commands/annotation/ingest.ts +0 -112
- package/src/cli/commands/annotation/list.ts +0 -57
- package/src/cli/commands/annotation/reply.ts +0 -46
- package/src/cli/commands/annotation/resolve.ts +0 -37
- package/src/cli/commands/auto/index.ts +0 -755
- package/src/cli/commands/backlog/add.ts +0 -74
- package/src/cli/commands/backlog/claim.ts +0 -53
- package/src/cli/commands/backlog/complete.ts +0 -51
- package/src/cli/commands/backlog/list.ts +0 -107
- package/src/cli/commands/backlog/pick.ts +0 -50
- package/src/cli/commands/backlog/sync.ts +0 -131
- package/src/cli/commands/bootstrap.ts +0 -205
- package/src/cli/commands/bridge.ts +0 -233
- package/src/cli/commands/context/inject.ts +0 -103
- package/src/cli/commands/context/list.ts +0 -112
- package/src/cli/commands/context/publish.ts +0 -83
- package/src/cli/commands/context/read.ts +0 -85
- package/src/cli/commands/daemon.ts +0 -1809
- package/src/cli/commands/digest/index.ts +0 -245
- package/src/cli/commands/docs/lint.ts +0 -93
- package/src/cli/commands/docs/sync.ts +0 -90
- package/src/cli/commands/doctor.ts +0 -267
- package/src/cli/commands/find/index.ts +0 -313
- package/src/cli/commands/history/index.ts +0 -269
- package/src/cli/commands/hooks/guard.ts +0 -71
- package/src/cli/commands/hooks/list.ts +0 -139
- package/src/cli/commands/hooks/lock.ts +0 -47
- package/src/cli/commands/hooks/status.ts +0 -56
- package/src/cli/commands/hooks/test.ts +0 -190
- package/src/cli/commands/hooks/unlock.ts +0 -56
- package/src/cli/commands/list.e2e.test.ts +0 -58
- package/src/cli/commands/list.ts +0 -96
- package/src/cli/commands/login.ts +0 -236
- package/src/cli/commands/logout.ts +0 -45
- package/src/cli/commands/panes/broker.ts +0 -68
- package/src/cli/commands/panes/pipe-sink.ts +0 -101
- package/src/cli/commands/panes/snapshot.ts +0 -156
- package/src/cli/commands/plan.e2e.test.ts +0 -90
- package/src/cli/commands/plan.ts +0 -68
- package/src/cli/commands/preview/index.ts +0 -282
- package/src/cli/commands/preview/list.ts +0 -116
- package/src/cli/commands/preview/status.ts +0 -137
- package/src/cli/commands/preview/stop.ts +0 -165
- package/src/cli/commands/project/add.ts +0 -110
- package/src/cli/commands/project/list.ts +0 -136
- package/src/cli/commands/project/remove.ts +0 -60
- package/src/cli/commands/push.ts +0 -115
- package/src/cli/commands/reference/add.ts +0 -266
- package/src/cli/commands/reference/delete.ts +0 -67
- package/src/cli/commands/reference/extract.ts +0 -389
- package/src/cli/commands/reference/list.ts +0 -117
- package/src/cli/commands/reference/normalize.ts +0 -90
- package/src/cli/commands/reference/open.ts +0 -92
- package/src/cli/commands/reference/save.ts +0 -103
- package/src/cli/commands/reference/search.ts +0 -85
- package/src/cli/commands/reference/show.ts +0 -174
- package/src/cli/commands/reference/update-index.ts +0 -103
- package/src/cli/commands/reference/update.ts +0 -136
- package/src/cli/commands/report/blocked.ts +0 -165
- package/src/cli/commands/report/complete.ts +0 -179
- package/src/cli/commands/report/progress.ts +0 -142
- package/src/cli/commands/report/start.ts +0 -140
- package/src/cli/commands/resource/acquire.ts +0 -116
- package/src/cli/commands/resource/list.ts +0 -77
- package/src/cli/commands/resource/release.ts +0 -64
- package/src/cli/commands/resource/wait.ts +0 -93
- package/src/cli/commands/review.ts +0 -105
- package/src/cli/commands/session/attach.ts +0 -200
- package/src/cli/commands/session/await.ts +0 -83
- package/src/cli/commands/session/complete.ts +0 -100
- package/src/cli/commands/session/create.ts +0 -92
- package/src/cli/commands/session/heartbeat.ts +0 -63
- package/src/cli/commands/session/list.ts +0 -281
- package/src/cli/commands/session/mark-done.ts +0 -132
- package/src/cli/commands/session/mine.ts +0 -189
- package/src/cli/commands/session/replay.ts +0 -659
- package/src/cli/commands/session/run.ts +0 -44
- package/src/cli/commands/session/show.ts +0 -177
- package/src/cli/commands/session/start.ts +0 -580
- package/src/cli/commands/session/state/cleanup.ts +0 -61
- package/src/cli/commands/session/state/end.ts +0 -47
- package/src/cli/commands/session/state/get.ts +0 -65
- package/src/cli/commands/session/state/init.ts +0 -50
- package/src/cli/commands/session/state/list.ts +0 -68
- package/src/cli/commands/session/state/update.ts +0 -108
- package/src/cli/commands/session/stop.ts +0 -134
- package/src/cli/commands/session/view.ts +0 -186
- package/src/cli/commands/start.ts +0 -256
- package/src/cli/commands/state/dump.ts +0 -449
- package/src/cli/commands/status.ts +0 -244
- package/src/cli/commands/sync.ts +0 -174
- package/src/cli/commands/trace/export.ts +0 -255
- package/src/cli/commands/triage/claim.ts +0 -203
- package/src/cli/commands/triage/list.ts +0 -137
- package/src/cli/commands/triage/next.ts +0 -73
- package/src/cli/commands/triage/pull.ts +0 -97
- package/src/cli/commands/triage/stats.ts +0 -82
- package/src/cli/commands/tunnel/list.ts +0 -113
- package/src/cli/commands/tunnel/start.ts +0 -122
- package/src/cli/commands/tunnel/stop.ts +0 -108
- package/src/cli/commands/tunnel/url.ts +0 -82
- package/src/cli/commands/web/start.ts +0 -125
- package/src/cli/commands/windows/context.ts +0 -439
- package/src/cli/commands/windows/focus.ts +0 -130
- package/src/cli/commands/windows/list.ts +0 -213
- package/src/cli/commands/windows/map.ts +0 -223
- package/src/cli/commands/windows/read.ts +0 -279
- package/src/cli/commands/windows/search.ts +0 -219
- package/src/cli/commands/windows/show.ts +0 -188
- package/src/cli/commands/windows/watch.ts +0 -262
- package/src/lib/__tests__/annotations-convex.test.ts +0 -104
- package/src/lib/active-sessions.ts +0 -1486
- package/src/lib/agent-adapters.ts +0 -412
- package/src/lib/agent-sessions.ts +0 -671
- package/src/lib/agent-trace.test.ts +0 -296
- package/src/lib/agent-trace.ts +0 -513
- package/src/lib/analytics.ts +0 -178
- package/src/lib/annotations-convex.ts +0 -296
- package/src/lib/annotations.test.ts +0 -274
- package/src/lib/annotations.ts +0 -836
- package/src/lib/auto/discover.ts +0 -545
- package/src/lib/auto/ideate.ts +0 -412
- package/src/lib/auto/spawn.ts +0 -549
- package/src/lib/auto/workspace.ts +0 -282
- package/src/lib/backlog.test.ts +0 -194
- package/src/lib/backlog.ts +0 -428
- package/src/lib/config-loader.ts +0 -391
- package/src/lib/config-sync/adapters/claude.ts +0 -91
- package/src/lib/config-sync/adapters/codex.ts +0 -135
- package/src/lib/config-sync/adapters/copilot.ts +0 -98
- package/src/lib/config-sync/adapters/gemini.ts +0 -86
- package/src/lib/config-sync/adapters/index.ts +0 -39
- package/src/lib/config-sync/adapters/opencode.ts +0 -94
- package/src/lib/config-sync/index.ts +0 -399
- package/src/lib/config-sync/types.ts +0 -92
- package/src/lib/config-sync/writer.ts +0 -188
- package/src/lib/content-sync/index.ts +0 -882
- package/src/lib/content-sync/types.ts +0 -104
- package/src/lib/contracts.test.ts +0 -186
- package/src/lib/contracts.ts +0 -195
- package/src/lib/convex.ts +0 -54
- package/src/lib/device.ts +0 -41
- package/src/lib/digest/index.ts +0 -529
- package/src/lib/docs/lint.test.ts +0 -135
- package/src/lib/docs/lint.ts +0 -310
- package/src/lib/docs/sync.ts +0 -184
- package/src/lib/doctor/index.ts +0 -647
- package/src/lib/doctor/repos.ts +0 -381
- package/src/lib/doctor/templates.ts +0 -191
- package/src/lib/errors.ts +0 -111
- package/src/lib/events.ts +0 -479
- package/src/lib/heartbeat.test.ts +0 -164
- package/src/lib/heartbeat.ts +0 -326
- package/src/lib/hooks/adapters/claude.ts +0 -115
- package/src/lib/hooks/adapters/codex.ts +0 -92
- package/src/lib/hooks/adapters/copilot.ts +0 -141
- package/src/lib/hooks/context.ts +0 -174
- package/src/lib/hooks/index.ts +0 -39
- package/src/lib/hooks/registry.ts +0 -101
- package/src/lib/hooks/runner.ts +0 -208
- package/src/lib/hooks/types.ts +0 -89
- package/src/lib/index.test.ts +0 -426
- package/src/lib/managed-session.ts +0 -117
- package/src/lib/math.test.ts +0 -299
- package/src/lib/math.ts +0 -120
- package/src/lib/ngrok.ts +0 -441
- package/src/lib/nvim/discovery.test.ts +0 -157
- package/src/lib/nvim/discovery.ts +0 -181
- package/src/lib/nvim/index.ts +0 -28
- package/src/lib/nvim/remote.test.ts +0 -21
- package/src/lib/nvim/remote.ts +0 -184
- package/src/lib/panes/README.md +0 -20
- package/src/lib/panes/broker.ts +0 -261
- package/src/lib/panes/index.ts +0 -1
- package/src/lib/panes/server.ts +0 -379
- package/src/lib/preview/detect.ts +0 -184
- package/src/lib/preview/index.ts +0 -1
- package/src/lib/process/index.ts +0 -16
- package/src/lib/process/snapshot.test.ts +0 -188
- package/src/lib/process/snapshot.ts +0 -257
- package/src/lib/provider-auth.ts +0 -258
- package/src/lib/references.ts +0 -481
- package/src/lib/report.ts +0 -973
- package/src/lib/resources.test.ts +0 -132
- package/src/lib/resources.ts +0 -429
- package/src/lib/runner.test.ts +0 -288
- package/src/lib/runner.ts +0 -1223
- package/src/lib/session-artifacts.test.ts +0 -107
- package/src/lib/session-artifacts.ts +0 -193
- package/src/lib/session-manager.test.ts +0 -402
- package/src/lib/session-manager.ts +0 -150
- package/src/lib/session-result.test.ts +0 -98
- package/src/lib/session-result.ts +0 -262
- package/src/lib/session-state.ts +0 -470
- package/src/lib/slack-workspace.ts +0 -25
- package/src/lib/tmux/bridge.ts +0 -439
- package/src/lib/tmux/context.test.ts +0 -242
- package/src/lib/tmux/context.ts +0 -380
- package/src/lib/tmux/index.ts +0 -46
- package/src/lib/tmux/map.test.ts +0 -99
- package/src/lib/tmux/map.ts +0 -252
- package/src/lib/tmux/panes.ts +0 -170
- package/src/lib/tmux/redaction.test.ts +0 -231
- package/src/lib/tmux/redaction.ts +0 -201
- package/src/lib/triage-llm.ts +0 -312
- package/src/lib/triage-tracker.ts +0 -400
- package/src/lib/triage.ts +0 -655
- package/src/lib/types.ts +0 -61
- package/src/lib/windows/index.ts +0 -2
- package/src/lib/windows/inventory.test.ts +0 -370
- package/src/lib/windows/inventory.ts +0 -352
- package/src/lib/windows/types.ts +0 -46
- package/src/lib.ts +0 -260
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { createContext, memo, useCallback, useContext, useEffect, useId, useMemo, useRef, useState, } from 'react';
|
|
3
|
-
import { useAtom, useAtomValue, useSetAtom } from 'jotai';
|
|
4
|
-
import { Menu } from '@base-ui-components/react/menu';
|
|
5
|
-
import { Reorder, useDragControls } from 'motion/react';
|
|
6
|
-
import { CubeTransparentIcon, Squares2X2Icon, Bars3BottomLeftIcon, ClipboardIcon, EllipsisHorizontalIcon, Bars2Icon, FolderOpenIcon, CodeBracketIcon, ChevronRightIcon, CheckIcon, EyeIcon, } from '@heroicons/react/24/outline';
|
|
7
|
-
import { cn } from '@/lib/utils';
|
|
8
|
-
import { stateAtom, tmuxWindowsAtom, selectedProjectAtom, selectedProjectViewAtom, selectedSessionIdAtom, viewModeAtom, projectsAtom, } from '@/atoms/state';
|
|
9
|
-
import { DEFAULT_PROJECT_SIDEBAR_ITEMS, expandedProjectsAtom, projectSidebarItemsAtom, setProjectExpandedAtom, setProjectSidebarItemEnabledAtom, } from '@/atoms/sidebar';
|
|
10
|
-
import { api } from '@/lib/api';
|
|
11
|
-
import { toastError, toastSuccess } from '@/components/toast';
|
|
12
|
-
import { formatTmuxWindowName } from '@/lib/paths';
|
|
13
|
-
import { NavGroup } from './nav-group';
|
|
14
|
-
import { NavItem } from './nav-item';
|
|
15
|
-
const HoverContext = createContext(null);
|
|
16
|
-
function HoverProvider({ children }) {
|
|
17
|
-
const [lastHoveredId, setLastHoveredId] = useState(null);
|
|
18
|
-
const setLastHovered = useCallback((id) => {
|
|
19
|
-
setLastHoveredId(id);
|
|
20
|
-
}, []);
|
|
21
|
-
return (<HoverContext.Provider value={{ lastHoveredId, setLastHovered }}>
|
|
22
|
-
{children}
|
|
23
|
-
</HoverContext.Provider>);
|
|
24
|
-
}
|
|
25
|
-
// Base styles for menu items (without hover state)
|
|
26
|
-
const menuItemBaseClass = cn('relative flex w-full items-center gap-2.5 px-2 py-2 text-sm', 'outline-none cursor-pointer select-none', 'text-foreground-secondary');
|
|
27
|
-
const menuCheckboxBaseClass = cn('relative flex w-full items-center justify-between gap-2.5 px-2 py-2 text-sm', 'outline-none cursor-pointer select-none', 'text-foreground-secondary');
|
|
28
|
-
// Sticky hover tile styles (applied when item is hovered or last hovered)
|
|
29
|
-
// inset-x-0.5 (2px) aligns better with px-2.5 content padding
|
|
30
|
-
const stickyHoverTileClass = cn('before:absolute before:inset-x-px before:inset-y-0', 'before:z-[-1] before:rounded-lg', 'before:bg-background-tertiary');
|
|
31
|
-
function StickyMenuItem({ children, onClick, className }) {
|
|
32
|
-
const itemId = useId();
|
|
33
|
-
const hoverContext = useContext(HoverContext);
|
|
34
|
-
const isLastHovered = hoverContext?.lastHoveredId === itemId;
|
|
35
|
-
return (<Menu.Item onClick={onClick} onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuItemBaseClass, 'z-0', isLastHovered && ['text-foreground', stickyHoverTileClass],
|
|
36
|
-
// Also show on data-[highlighted] for keyboard navigation
|
|
37
|
-
'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
|
|
38
|
-
{children}
|
|
39
|
-
</Menu.Item>);
|
|
40
|
-
}
|
|
41
|
-
function StickySubmenuTrigger({ children, className }) {
|
|
42
|
-
const itemId = useId();
|
|
43
|
-
const hoverContext = useContext(HoverContext);
|
|
44
|
-
const isLastHovered = hoverContext?.lastHoveredId === itemId;
|
|
45
|
-
return (<Menu.SubmenuTrigger onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuItemBaseClass, 'z-0 justify-between', isLastHovered && ['text-foreground', stickyHoverTileClass], 'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
|
|
46
|
-
{children}
|
|
47
|
-
</Menu.SubmenuTrigger>);
|
|
48
|
-
}
|
|
49
|
-
function StickyCheckboxItem({ children, checked, onCheckedChange, closeOnClick = false, className, }) {
|
|
50
|
-
const itemId = useId();
|
|
51
|
-
const hoverContext = useContext(HoverContext);
|
|
52
|
-
const isLastHovered = hoverContext?.lastHoveredId === itemId;
|
|
53
|
-
return (<Menu.CheckboxItem checked={checked} closeOnClick={closeOnClick} onCheckedChange={onCheckedChange} onPointerEnter={() => hoverContext?.setLastHovered(itemId)} className={cn(menuCheckboxBaseClass, 'z-0', isLastHovered && ['text-foreground', stickyHoverTileClass], 'data-[highlighted]:text-foreground', 'data-[highlighted]:before:absolute data-[highlighted]:before:inset-x-px data-[highlighted]:before:inset-y-0', 'data-[highlighted]:before:z-[-1] data-[highlighted]:before:rounded-lg', 'data-[highlighted]:before:bg-background-tertiary', className)}>
|
|
54
|
-
{children}
|
|
55
|
-
</Menu.CheckboxItem>);
|
|
56
|
-
}
|
|
57
|
-
// ----------------------------------------------------------------------------
|
|
58
|
-
/**
|
|
59
|
-
* Main navigation - project list (tmux windows) with expandable sections.
|
|
60
|
-
*/
|
|
61
|
-
export function SidebarNav({ className, onScrolledChange, }) {
|
|
62
|
-
const [, setState] = useAtom(stateAtom);
|
|
63
|
-
const windows = useAtomValue(tmuxWindowsAtom);
|
|
64
|
-
const projects = useAtomValue(projectsAtom);
|
|
65
|
-
const expandedProjects = useAtomValue(expandedProjectsAtom);
|
|
66
|
-
const projectItems = useAtomValue(projectSidebarItemsAtom);
|
|
67
|
-
const setProjectExpanded = useSetAtom(setProjectExpandedAtom);
|
|
68
|
-
const setProjectSidebarItemEnabled = useSetAtom(setProjectSidebarItemEnabledAtom);
|
|
69
|
-
const [selectedProject, setSelectedProject] = useAtom(selectedProjectAtom);
|
|
70
|
-
const [selectedProjectView, setSelectedProjectView] = useAtom(selectedProjectViewAtom);
|
|
71
|
-
const setSelectedSessionId = useSetAtom(selectedSessionIdAtom);
|
|
72
|
-
const setViewMode = useSetAtom(viewModeAtom);
|
|
73
|
-
const [openProjectMenu, setOpenProjectMenu] = useState(null);
|
|
74
|
-
const [draggingProjectKey, setDraggingProjectKey] = useState(null);
|
|
75
|
-
const draggingProjectKeyRef = useRef(null);
|
|
76
|
-
const [dragDirection, setDragDirection] = useState(null);
|
|
77
|
-
const windowsRef = useRef(windows);
|
|
78
|
-
const frozenWindowsRef = useRef(null);
|
|
79
|
-
const [orderedProjectKeys, setOrderedProjectKeys] = useState([]);
|
|
80
|
-
const orderAtDragStartRef = useRef([]);
|
|
81
|
-
const orderedProjectKeysRef = useRef([]);
|
|
82
|
-
const lastTmuxOrderKeysRef = useRef([]);
|
|
83
|
-
const [reorderSaving, setReorderSaving] = useState(false);
|
|
84
|
-
const getProjectEmoji = useCallback((name) => {
|
|
85
|
-
return projects.projects[name]?.emoji ?? projects.defaultEmoji;
|
|
86
|
-
}, [projects]);
|
|
87
|
-
const getWindowKey = useCallback((window) => {
|
|
88
|
-
// In normal operation, this is `window.id` (stable like "@47").
|
|
89
|
-
// If the API server is out of date and doesn't provide ids, fall back to the index.
|
|
90
|
-
return window.id || (Number.isFinite(window.index) ? String(window.index) : window.name);
|
|
91
|
-
}, []);
|
|
92
|
-
useEffect(() => {
|
|
93
|
-
windowsRef.current = windows;
|
|
94
|
-
}, [windows]);
|
|
95
|
-
const windowsForRender = draggingProjectKey != null ? (frozenWindowsRef.current ?? windows) : windows;
|
|
96
|
-
const windowsByKey = useMemo(() => {
|
|
97
|
-
const map = new Map();
|
|
98
|
-
for (const w of windowsForRender) {
|
|
99
|
-
map.set(getWindowKey(w), w);
|
|
100
|
-
}
|
|
101
|
-
return map;
|
|
102
|
-
}, [windowsForRender, getWindowKey]);
|
|
103
|
-
const tmuxOrderKeys = useMemo(() => windowsForRender.map(getWindowKey), [windowsForRender, getWindowKey]);
|
|
104
|
-
const draggingExpanded = useMemo(() => {
|
|
105
|
-
if (!draggingProjectKey)
|
|
106
|
-
return false;
|
|
107
|
-
const window = windowsByKey.get(draggingProjectKey);
|
|
108
|
-
if (!window)
|
|
109
|
-
return false;
|
|
110
|
-
return expandedProjects[window.name] ?? false;
|
|
111
|
-
}, [draggingProjectKey, expandedProjects, windowsByKey]);
|
|
112
|
-
const setDragDirectionSafe = useCallback((next) => {
|
|
113
|
-
setDragDirection((prev) => (prev === next ? prev : next));
|
|
114
|
-
}, []);
|
|
115
|
-
const softLayoutActive = draggingExpanded || dragDirection === 'up';
|
|
116
|
-
const handleReorder = useCallback((nextKeys) => {
|
|
117
|
-
const prev = orderedProjectKeysRef.current;
|
|
118
|
-
const isSame = prev.length === nextKeys.length && prev.every((value, i) => value === nextKeys[i]);
|
|
119
|
-
if (isSame)
|
|
120
|
-
return;
|
|
121
|
-
setOrderedProjectKeys(nextKeys);
|
|
122
|
-
orderedProjectKeysRef.current = nextKeys;
|
|
123
|
-
}, []);
|
|
124
|
-
useEffect(() => {
|
|
125
|
-
draggingProjectKeyRef.current = draggingProjectKey;
|
|
126
|
-
}, [draggingProjectKey]);
|
|
127
|
-
// Keep UI order in sync with tmux order:
|
|
128
|
-
// - If user hasn't reordered locally, follow tmux exactly.
|
|
129
|
-
// - If user has reordered locally, preserve local order but reconcile added/removed windows.
|
|
130
|
-
useEffect(() => {
|
|
131
|
-
if (reorderSaving)
|
|
132
|
-
return;
|
|
133
|
-
if (draggingProjectKeyRef.current)
|
|
134
|
-
return;
|
|
135
|
-
setOrderedProjectKeys((prev) => {
|
|
136
|
-
if (prev.length === 0) {
|
|
137
|
-
orderedProjectKeysRef.current = tmuxOrderKeys;
|
|
138
|
-
lastTmuxOrderKeysRef.current = tmuxOrderKeys;
|
|
139
|
-
return tmuxOrderKeys;
|
|
140
|
-
}
|
|
141
|
-
const lastTmux = lastTmuxOrderKeysRef.current;
|
|
142
|
-
const prevWasTmux = prev.length === lastTmux.length && prev.every((v, i) => v === lastTmux[i]);
|
|
143
|
-
const next = prevWasTmux
|
|
144
|
-
? tmuxOrderKeys
|
|
145
|
-
: [
|
|
146
|
-
...prev.filter((k) => tmuxOrderKeys.includes(k)),
|
|
147
|
-
...tmuxOrderKeys.filter((k) => !prev.includes(k)),
|
|
148
|
-
];
|
|
149
|
-
lastTmuxOrderKeysRef.current = tmuxOrderKeys;
|
|
150
|
-
orderedProjectKeysRef.current = next;
|
|
151
|
-
if (prev.length === next.length && prev.every((v, i) => v === next[i]))
|
|
152
|
-
return prev;
|
|
153
|
-
return next;
|
|
154
|
-
});
|
|
155
|
-
}, [tmuxOrderKeys]);
|
|
156
|
-
const selectProjectView = useCallback((windowKey, windowName, view) => {
|
|
157
|
-
setSelectedProject(windowKey);
|
|
158
|
-
setSelectedProjectView(view);
|
|
159
|
-
setSelectedSessionId(null);
|
|
160
|
-
setViewMode('windows');
|
|
161
|
-
setProjectExpanded({ project: windowName, expanded: true });
|
|
162
|
-
}, [setSelectedProject, setSelectedProjectView, setSelectedSessionId, setViewMode, setProjectExpanded]);
|
|
163
|
-
useEffect(() => {
|
|
164
|
-
if (!selectedProject)
|
|
165
|
-
return;
|
|
166
|
-
const window = windows.find((w) => getWindowKey(w) === selectedProject);
|
|
167
|
-
if (!window)
|
|
168
|
-
return;
|
|
169
|
-
setProjectExpanded({ project: window.name, expanded: true });
|
|
170
|
-
}, [selectedProject, setProjectExpanded, windows, getWindowKey]);
|
|
171
|
-
const commitReorder = useCallback(async () => {
|
|
172
|
-
const start = orderAtDragStartRef.current;
|
|
173
|
-
const end = orderedProjectKeysRef.current;
|
|
174
|
-
if (start.length === end.length && start.every((v, i) => v === end[i]))
|
|
175
|
-
return;
|
|
176
|
-
if (reorderSaving)
|
|
177
|
-
return;
|
|
178
|
-
const orderIds = [];
|
|
179
|
-
for (const key of end) {
|
|
180
|
-
const w = windowsByKey.get(key);
|
|
181
|
-
if (!w?.id) {
|
|
182
|
-
toastError('Reorder requires tmux window ids. Restart `agents web --dev`.');
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
orderIds.push(w.id);
|
|
186
|
-
}
|
|
187
|
-
setReorderSaving(true);
|
|
188
|
-
try {
|
|
189
|
-
await api.reorderTmuxWindowsOrder(orderIds);
|
|
190
|
-
// Confirm order applied (tmux should be synchronous, but we'll retry briefly).
|
|
191
|
-
let refreshed = await api.getState();
|
|
192
|
-
for (let attempt = 0; attempt < 2; attempt++) {
|
|
193
|
-
const refreshedIds = (refreshed.tmux.windows ?? []).map((w) => w.id);
|
|
194
|
-
const matches = refreshedIds.length === orderIds.length &&
|
|
195
|
-
refreshedIds.every((id, i) => id === orderIds[i]);
|
|
196
|
-
if (matches)
|
|
197
|
-
break;
|
|
198
|
-
await new Promise((r) => setTimeout(r, 150));
|
|
199
|
-
refreshed = await api.getState();
|
|
200
|
-
}
|
|
201
|
-
const refreshedIds = (refreshed.tmux.windows ?? []).map((w) => w.id);
|
|
202
|
-
const matches = refreshedIds.length === orderIds.length &&
|
|
203
|
-
refreshedIds.every((id, i) => id === orderIds[i]);
|
|
204
|
-
if (!matches)
|
|
205
|
-
throw new Error('tmux reorder did not apply');
|
|
206
|
-
setState(refreshed);
|
|
207
|
-
}
|
|
208
|
-
catch {
|
|
209
|
-
toastError('Failed to reorder');
|
|
210
|
-
// Revert back to current tmux order.
|
|
211
|
-
setOrderedProjectKeys(tmuxOrderKeys);
|
|
212
|
-
orderedProjectKeysRef.current = tmuxOrderKeys;
|
|
213
|
-
lastTmuxOrderKeysRef.current = tmuxOrderKeys;
|
|
214
|
-
api.getState().then(setState).catch(() => { });
|
|
215
|
-
}
|
|
216
|
-
finally {
|
|
217
|
-
setReorderSaving(false);
|
|
218
|
-
}
|
|
219
|
-
}, [setState, windowsByKey, getWindowKey, tmuxOrderKeys, reorderSaving]);
|
|
220
|
-
const beginDrag = useCallback((windowKey) => {
|
|
221
|
-
orderAtDragStartRef.current = [...orderedProjectKeysRef.current];
|
|
222
|
-
frozenWindowsRef.current = windowsRef.current;
|
|
223
|
-
setDragDirection(null);
|
|
224
|
-
setDraggingProjectKey(windowKey);
|
|
225
|
-
}, []);
|
|
226
|
-
const endDrag = useCallback(() => {
|
|
227
|
-
frozenWindowsRef.current = null;
|
|
228
|
-
setDraggingProjectKey(null);
|
|
229
|
-
setDragDirection(null);
|
|
230
|
-
commitReorder();
|
|
231
|
-
}, [commitReorder]);
|
|
232
|
-
const scrolledRef = useRef(false);
|
|
233
|
-
const handleScroll = useCallback((event) => {
|
|
234
|
-
if (!onScrolledChange)
|
|
235
|
-
return;
|
|
236
|
-
const scrolled = event.currentTarget.scrollTop > 4;
|
|
237
|
-
if (scrolled === scrolledRef.current)
|
|
238
|
-
return;
|
|
239
|
-
scrolledRef.current = scrolled;
|
|
240
|
-
onScrolledChange(scrolled);
|
|
241
|
-
}, [onScrolledChange]);
|
|
242
|
-
if (windows.length === 0) {
|
|
243
|
-
return (<div className={cn('flex-1 space-y-0.5 overflow-y-auto p-2', className)}>
|
|
244
|
-
<p className="px-2 py-8 text-center text-xs text-foreground-tertiary">
|
|
245
|
-
No tmux windows.
|
|
246
|
-
</p>
|
|
247
|
-
</div>);
|
|
248
|
-
}
|
|
249
|
-
return (<Reorder.Group axis="y" as="div" values={orderedProjectKeys} onReorder={handleReorder} layoutScroll onScroll={handleScroll} className={cn('flex-1 space-y-0.5 overflow-y-auto p-2', className)}>
|
|
250
|
-
{orderedProjectKeys.map((windowKey) => {
|
|
251
|
-
const window = windowsByKey.get(windowKey);
|
|
252
|
-
if (!window)
|
|
253
|
-
return null;
|
|
254
|
-
const expanded = expandedProjects[window.name] ?? false;
|
|
255
|
-
const menuOpen = openProjectMenu === windowKey;
|
|
256
|
-
const label = formatTmuxWindowName(window.name);
|
|
257
|
-
const disabled = draggingProjectKey != null && draggingProjectKey !== windowKey;
|
|
258
|
-
const projectVisibility = projectItems[window.name];
|
|
259
|
-
const terminalVisible = projectVisibility?.terminal ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.terminal;
|
|
260
|
-
const filesVisible = projectVisibility?.files ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.files;
|
|
261
|
-
const planningVisible = projectVisibility?.planning ?? DEFAULT_PROJECT_SIDEBAR_ITEMS.planning;
|
|
262
|
-
return (<ProjectRow key={windowKey} tmuxWindow={window} windowKey={windowKey} label={label} expanded={expanded} terminalVisible={terminalVisible} filesVisible={filesVisible} planningVisible={planningVisible} menuOpen={menuOpen} dragging={draggingProjectKey === windowKey} softLayout={softLayoutActive && draggingProjectKey !== windowKey} disabled={disabled} selected={selectedProject === windowKey} selectedView={selectedProjectView} getProjectEmoji={getProjectEmoji} onSelectView={selectProjectView} onExpandedChange={setProjectExpanded} onOpenMenuChange={setOpenProjectMenu} onDragStart={beginDrag} onDragEnd={endDrag} onDragDirectionChange={setDragDirectionSafe} setSidebarItemEnabled={setProjectSidebarItemEnabled}/>);
|
|
263
|
-
})}
|
|
264
|
-
</Reorder.Group>);
|
|
265
|
-
}
|
|
266
|
-
const ProjectRow = memo(function ProjectRow({ tmuxWindow, windowKey, label, expanded, terminalVisible, filesVisible, planningVisible, menuOpen, dragging, softLayout, disabled, selected, selectedView, getProjectEmoji, onSelectView, onExpandedChange, onOpenMenuChange, onDragStart, onDragEnd, onDragDirectionChange, setSidebarItemEnabled, }) {
|
|
267
|
-
const dragControls = useDragControls();
|
|
268
|
-
const dragStartRef = useRef(null);
|
|
269
|
-
const didDragRef = useRef(false);
|
|
270
|
-
const lastDragDirectionRef = useRef(null);
|
|
271
|
-
const reorderDuration = softLayout ? (expanded ? 0.18 : 0.22) : 0.12;
|
|
272
|
-
const handleTriggerPointerDown = useCallback((event) => {
|
|
273
|
-
if (event.button !== 0)
|
|
274
|
-
return;
|
|
275
|
-
didDragRef.current = false;
|
|
276
|
-
dragStartRef.current = {
|
|
277
|
-
pointerId: event.pointerId,
|
|
278
|
-
x: event.clientX,
|
|
279
|
-
y: event.clientY,
|
|
280
|
-
};
|
|
281
|
-
try {
|
|
282
|
-
event.currentTarget.setPointerCapture(event.pointerId);
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
// no-op
|
|
286
|
-
}
|
|
287
|
-
}, []);
|
|
288
|
-
const handleTriggerPointerMove = useCallback((event) => {
|
|
289
|
-
const start = dragStartRef.current;
|
|
290
|
-
if (!start)
|
|
291
|
-
return;
|
|
292
|
-
if (start.pointerId !== event.pointerId)
|
|
293
|
-
return;
|
|
294
|
-
if (didDragRef.current)
|
|
295
|
-
return;
|
|
296
|
-
const dx = event.clientX - start.x;
|
|
297
|
-
const dy = event.clientY - start.y;
|
|
298
|
-
if (dx * dx + dy * dy < 16)
|
|
299
|
-
return; // 4px threshold
|
|
300
|
-
didDragRef.current = true;
|
|
301
|
-
dragControls.start(event);
|
|
302
|
-
}, [dragControls]);
|
|
303
|
-
const handleTriggerPointerUp = useCallback((event) => {
|
|
304
|
-
const start = dragStartRef.current;
|
|
305
|
-
if (!start)
|
|
306
|
-
return;
|
|
307
|
-
if (start.pointerId !== event.pointerId)
|
|
308
|
-
return;
|
|
309
|
-
dragStartRef.current = null;
|
|
310
|
-
try {
|
|
311
|
-
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
312
|
-
}
|
|
313
|
-
catch {
|
|
314
|
-
// no-op
|
|
315
|
-
}
|
|
316
|
-
}, []);
|
|
317
|
-
const handleTriggerPointerCancel = useCallback(() => {
|
|
318
|
-
dragStartRef.current = null;
|
|
319
|
-
}, []);
|
|
320
|
-
const handleTriggerClickCapture = useCallback((event) => {
|
|
321
|
-
if (!didDragRef.current)
|
|
322
|
-
return;
|
|
323
|
-
event.preventDefault();
|
|
324
|
-
event.stopPropagation();
|
|
325
|
-
didDragRef.current = false;
|
|
326
|
-
}, []);
|
|
327
|
-
const projectMenu = (<Menu.Root open={menuOpen} onOpenChange={(open) => onOpenMenuChange(open ? windowKey : null)}>
|
|
328
|
-
<Menu.Trigger aria-label="Project actions" className={cn('flex h-7 w-7 items-center justify-center', 'cursor-pointer rounded-md outline-none', 'transition-opacity duration-100', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', dragging
|
|
329
|
-
? 'pointer-events-none opacity-0'
|
|
330
|
-
: menuOpen
|
|
331
|
-
? 'text-foreground'
|
|
332
|
-
: 'text-foreground-quaternary hover:text-foreground-secondary')} onClick={(e) => e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}>
|
|
333
|
-
<EllipsisHorizontalIcon className="h-4 w-4"/>
|
|
334
|
-
</Menu.Trigger>
|
|
335
|
-
<Menu.Portal>
|
|
336
|
-
<Menu.Positioner sideOffset={8} align="end">
|
|
337
|
-
<Menu.Popup className={cn('z-50 min-w-[200px] rounded-xl p-1', 'bg-card border border-border shadow-xl', 'outline-none', 'origin-[var(--transform-origin)]', 'transition-[transform,opacity] duration-150', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', 'data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0', 'data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0')}>
|
|
338
|
-
<HoverProvider>
|
|
339
|
-
{/* Primary actions */}
|
|
340
|
-
<Menu.Group>
|
|
341
|
-
<StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'terminal')}>
|
|
342
|
-
<CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
343
|
-
Open terminal
|
|
344
|
-
</StickyMenuItem>
|
|
345
|
-
|
|
346
|
-
<StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'files')}>
|
|
347
|
-
<Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>
|
|
348
|
-
Open files
|
|
349
|
-
</StickyMenuItem>
|
|
350
|
-
|
|
351
|
-
<StickyMenuItem onClick={() => onSelectView(windowKey, tmuxWindow.name, 'planning')}>
|
|
352
|
-
<Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
353
|
-
Open planning
|
|
354
|
-
</StickyMenuItem>
|
|
355
|
-
</Menu.Group>
|
|
356
|
-
|
|
357
|
-
<Menu.Separator className="my-1 h-px bg-border/50"/>
|
|
358
|
-
|
|
359
|
-
{/* External actions */}
|
|
360
|
-
<Menu.Group>
|
|
361
|
-
<StickyMenuItem onClick={async () => {
|
|
362
|
-
try {
|
|
363
|
-
const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
|
|
364
|
-
const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
|
|
365
|
-
if (!path)
|
|
366
|
-
return;
|
|
367
|
-
// Open in Finder using the native API
|
|
368
|
-
globalThis.window.open(`file://${path}`, '_blank');
|
|
369
|
-
}
|
|
370
|
-
catch {
|
|
371
|
-
toastError('Failed to open in Finder');
|
|
372
|
-
}
|
|
373
|
-
}}>
|
|
374
|
-
<FolderOpenIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
375
|
-
Open in Finder
|
|
376
|
-
</StickyMenuItem>
|
|
377
|
-
|
|
378
|
-
<StickyMenuItem onClick={async () => {
|
|
379
|
-
try {
|
|
380
|
-
const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
|
|
381
|
-
const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
|
|
382
|
-
if (!path)
|
|
383
|
-
return;
|
|
384
|
-
// Uses VSCode's URL scheme
|
|
385
|
-
globalThis.window.open(`vscode://file/${path}`, '_blank');
|
|
386
|
-
}
|
|
387
|
-
catch {
|
|
388
|
-
toastError('Failed to open in VS Code');
|
|
389
|
-
}
|
|
390
|
-
}}>
|
|
391
|
-
<CodeBracketIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
392
|
-
Open in VS Code
|
|
393
|
-
</StickyMenuItem>
|
|
394
|
-
|
|
395
|
-
<StickyMenuItem onClick={async () => {
|
|
396
|
-
try {
|
|
397
|
-
const { panes } = await api.getTmuxPanes(tmuxWindow.id || windowKey);
|
|
398
|
-
const path = panes.find((p) => p.active)?.currentPath ?? panes[0]?.currentPath;
|
|
399
|
-
if (!path)
|
|
400
|
-
return;
|
|
401
|
-
await navigator.clipboard.writeText(path);
|
|
402
|
-
toastSuccess('Copied path');
|
|
403
|
-
}
|
|
404
|
-
catch {
|
|
405
|
-
toastError('Failed to copy path');
|
|
406
|
-
}
|
|
407
|
-
}}>
|
|
408
|
-
<ClipboardIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
409
|
-
Copy path
|
|
410
|
-
</StickyMenuItem>
|
|
411
|
-
</Menu.Group>
|
|
412
|
-
|
|
413
|
-
<Menu.Separator className="my-1 h-px bg-border/50"/>
|
|
414
|
-
|
|
415
|
-
{/* View options submenu */}
|
|
416
|
-
<Menu.SubmenuRoot>
|
|
417
|
-
<StickySubmenuTrigger>
|
|
418
|
-
<span className="flex items-center gap-2.5">
|
|
419
|
-
<EyeIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
420
|
-
Sidebar views
|
|
421
|
-
</span>
|
|
422
|
-
<ChevronRightIcon className="h-3.5 w-3.5 text-foreground-quaternary"/>
|
|
423
|
-
</StickySubmenuTrigger>
|
|
424
|
-
<Menu.Portal>
|
|
425
|
-
<Menu.Positioner sideOffset={2} alignOffset={-4}>
|
|
426
|
-
<Menu.Popup className={cn('z-50 min-w-[200px] rounded-xl p-1', 'bg-card border border-border shadow-xl', 'outline-none', 'origin-[var(--transform-origin)]', 'transition-[transform,opacity] duration-150', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', 'data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0', 'data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0')}>
|
|
427
|
-
<HoverProvider>
|
|
428
|
-
<StickyCheckboxItem checked={filesVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'files', enabled: checked })}>
|
|
429
|
-
<span className="flex items-center gap-2.5">
|
|
430
|
-
<Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>
|
|
431
|
-
Files
|
|
432
|
-
</span>
|
|
433
|
-
<Menu.CheckboxItemIndicator className="text-foreground-secondary">
|
|
434
|
-
<CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
|
|
435
|
-
</Menu.CheckboxItemIndicator>
|
|
436
|
-
</StickyCheckboxItem>
|
|
437
|
-
|
|
438
|
-
<StickyCheckboxItem checked={terminalVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'terminal', enabled: checked })}>
|
|
439
|
-
<span className="flex items-center gap-2.5">
|
|
440
|
-
<CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
441
|
-
Terminal
|
|
442
|
-
</span>
|
|
443
|
-
<Menu.CheckboxItemIndicator className="text-foreground-secondary">
|
|
444
|
-
<CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
|
|
445
|
-
</Menu.CheckboxItemIndicator>
|
|
446
|
-
</StickyCheckboxItem>
|
|
447
|
-
|
|
448
|
-
<StickyCheckboxItem checked={planningVisible} onCheckedChange={(checked) => setSidebarItemEnabled({ project: tmuxWindow.name, item: 'planning', enabled: checked })}>
|
|
449
|
-
<span className="flex items-center gap-2.5">
|
|
450
|
-
<Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>
|
|
451
|
-
Planning
|
|
452
|
-
</span>
|
|
453
|
-
<Menu.CheckboxItemIndicator className="text-foreground-secondary">
|
|
454
|
-
<CheckIcon className="h-3.5 w-3.5 stroke-[2]"/>
|
|
455
|
-
</Menu.CheckboxItemIndicator>
|
|
456
|
-
</StickyCheckboxItem>
|
|
457
|
-
</HoverProvider>
|
|
458
|
-
</Menu.Popup>
|
|
459
|
-
</Menu.Positioner>
|
|
460
|
-
</Menu.Portal>
|
|
461
|
-
</Menu.SubmenuRoot>
|
|
462
|
-
</HoverProvider>
|
|
463
|
-
</Menu.Popup>
|
|
464
|
-
</Menu.Positioner>
|
|
465
|
-
</Menu.Portal>
|
|
466
|
-
</Menu.Root>);
|
|
467
|
-
return (<Reorder.Item as="div" value={windowKey} drag="y" dragControls={dragControls} dragListener={false} layout="position" onDragStart={() => {
|
|
468
|
-
lastDragDirectionRef.current = null;
|
|
469
|
-
onOpenMenuChange(null);
|
|
470
|
-
onDragStart(windowKey);
|
|
471
|
-
}} onDragEnd={() => {
|
|
472
|
-
lastDragDirectionRef.current = null;
|
|
473
|
-
onDragEnd();
|
|
474
|
-
}} onDrag={(_event, info) => {
|
|
475
|
-
if (!dragging)
|
|
476
|
-
return;
|
|
477
|
-
if (Math.abs(info.offset.y) < 2)
|
|
478
|
-
return;
|
|
479
|
-
const direction = info.offset.y < 0 ? 'up' : 'down';
|
|
480
|
-
if (direction === lastDragDirectionRef.current)
|
|
481
|
-
return;
|
|
482
|
-
lastDragDirectionRef.current = direction;
|
|
483
|
-
onDragDirectionChange(direction);
|
|
484
|
-
}} whileDrag={{ scale: 1.005 }} dragMomentum={false} dragElastic={0.02} transition={{ duration: reorderDuration, ease: [0.32, 0.72, 0, 1] }} className={cn('relative rounded-[10px] will-change-transform', disabled && 'pointer-events-none')}>
|
|
485
|
-
<NavGroup label={label} dragging={dragging} leading={<span aria-label="Reorder project" className={cn('flex w-4 shrink-0 items-center justify-center', 'cursor-move', 'text-foreground-quaternary', 'transition-opacity duration-100', '[transition-timing-function:cubic-bezier(0.32,0.72,0,1)]', dragging ? 'opacity-0' : menuOpen ? 'opacity-100' : 'opacity-60 group-hover:opacity-100')}>
|
|
486
|
-
<Bars2Icon className="h-3.5 w-3.5"/>
|
|
487
|
-
</span>} icon={getProjectEmoji(tmuxWindow.name)} expanded={expanded} onExpandedChange={(next) => onExpandedChange({ project: tmuxWindow.name, expanded: next })} triggerProps={{
|
|
488
|
-
onPointerDown: handleTriggerPointerDown,
|
|
489
|
-
onPointerMove: handleTriggerPointerMove,
|
|
490
|
-
onPointerUp: handleTriggerPointerUp,
|
|
491
|
-
onPointerCancel: handleTriggerPointerCancel,
|
|
492
|
-
onClickCapture: handleTriggerClickCapture,
|
|
493
|
-
}} actions={projectMenu} actionsVisible={menuOpen} className={cn(dragging && 'pointer-events-none')}>
|
|
494
|
-
<div className="space-y-0.5" onPointerDown={(e) => e.stopPropagation()} onPointerDownCapture={(e) => e.stopPropagation()}>
|
|
495
|
-
{filesVisible && (<NavItem label="Files" icon={<Squares2X2Icon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'files'} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'files')}/>)}
|
|
496
|
-
|
|
497
|
-
{terminalVisible && (<NavItem label="Terminal" icon={<CubeTransparentIcon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'terminal'} shortcut={typeof tmuxWindow.index === 'number' && tmuxWindow.index >= 0 && tmuxWindow.index < 9
|
|
498
|
-
? ['G', String(tmuxWindow.index + 1)]
|
|
499
|
-
: undefined} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'terminal')}/>)}
|
|
500
|
-
|
|
501
|
-
{planningVisible && (<NavItem label="Planning" icon={<Bars3BottomLeftIcon className="h-4 w-4 stroke-[1.75]"/>} selected={selected && selectedView === 'planning'} onClick={() => onSelectView(windowKey, tmuxWindow.name, 'planning')}/>)}
|
|
502
|
-
</div>
|
|
503
|
-
</NavGroup>
|
|
504
|
-
</Reorder.Item>);
|
|
505
|
-
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useSetAtom } from 'jotai';
|
|
3
|
-
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
|
4
|
-
import { commandPaletteOpenAtom } from '@/atoms/state';
|
|
5
|
-
import { cn } from '@/lib/utils';
|
|
6
|
-
/**
|
|
7
|
-
* Search button that opens the command palette.
|
|
8
|
-
* Pill button styled to match Share/Actions buttons.
|
|
9
|
-
*/
|
|
10
|
-
export function SidebarSearch({ dividerVisible }) {
|
|
11
|
-
const setCommandPaletteOpen = useSetAtom(commandPaletteOpenAtom);
|
|
12
|
-
return (<div className={cn('flex h-12 items-center px-2', dividerVisible && 'border-b border-border/60')}>
|
|
13
|
-
<button onClick={() => setCommandPaletteOpen(true)} className={cn('flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-medium', 'outline-none transition-colors', 'bg-background-secondary text-foreground-secondary', 'hover:bg-background-tertiary hover:text-foreground')}>
|
|
14
|
-
<MagnifyingGlassIcon className="h-3.5 w-3.5"/>
|
|
15
|
-
<span>Search</span>
|
|
16
|
-
</button>
|
|
17
|
-
</div>);
|
|
18
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import Link from 'next/link';
|
|
3
|
-
import { useTheme } from 'next-themes';
|
|
4
|
-
import { AdjustmentsHorizontalIcon, CommandLineIcon, InformationCircleIcon, SunIcon, MoonIcon, } from '@heroicons/react/24/outline';
|
|
5
|
-
import { NavItem } from './nav-item';
|
|
6
|
-
const SETTINGS_ITEMS = [
|
|
7
|
-
{ id: 'general', label: 'General', Icon: AdjustmentsHorizontalIcon, href: '/settings' },
|
|
8
|
-
{ id: 'shortcuts', label: 'Keyboard shortcuts', Icon: CommandLineIcon, href: '/shortcuts' },
|
|
9
|
-
{ id: 'about', label: 'About', Icon: InformationCircleIcon, href: '/about' },
|
|
10
|
-
];
|
|
11
|
-
/**
|
|
12
|
-
* Settings navigation view (Vercel drill-down pattern).
|
|
13
|
-
*/
|
|
14
|
-
export function SidebarSettings() {
|
|
15
|
-
const { theme, setTheme } = useTheme();
|
|
16
|
-
const isDark = theme === 'dark';
|
|
17
|
-
const toggleTheme = () => {
|
|
18
|
-
setTheme(isDark ? 'light' : 'dark');
|
|
19
|
-
};
|
|
20
|
-
return (<div className="space-y-0.5 p-2">
|
|
21
|
-
{SETTINGS_ITEMS.map((item) => (<Link key={item.id} href={item.href}>
|
|
22
|
-
<NavItem label={item.label} icon={<item.Icon className="h-4 w-4 stroke-[1.75]"/>}/>
|
|
23
|
-
</Link>))}
|
|
24
|
-
|
|
25
|
-
{/* Theme toggle */}
|
|
26
|
-
<NavItem label={isDark ? 'Light mode' : 'Dark mode'} icon={isDark ? <SunIcon className="h-4 w-4 stroke-[1.75]"/> : <MoonIcon className="h-4 w-4 stroke-[1.75]"/>} onClick={toggleTheme}/>
|
|
27
|
-
</div>);
|
|
28
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
interface SidebarTransitionProps {
|
|
2
|
-
className?: string;
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Animated container for sidebar view transitions using motion.
|
|
6
|
-
* Renders the appropriate view content and handles smooth transitions.
|
|
7
|
-
*
|
|
8
|
-
* Forward (drill in): main exits left, settings enters from right
|
|
9
|
-
* Back (drill out): settings exits right, main enters from left
|
|
10
|
-
*/
|
|
11
|
-
export declare function SidebarTransition({ className }: SidebarTransitionProps): any;
|
|
12
|
-
export {};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
3
|
-
import { useAtomValue, useSetAtom } from 'jotai';
|
|
4
|
-
import { motion, AnimatePresence } from 'motion/react';
|
|
5
|
-
import { Cog6ToothIcon } from '@heroicons/react/24/outline';
|
|
6
|
-
import { sidebarViewAtom, navigationDirectionAtom, pushViewAtom } from '@/atoms/sidebar';
|
|
7
|
-
import { cn } from '@/lib/utils';
|
|
8
|
-
import { SidebarHeader } from './sidebar-header';
|
|
9
|
-
import { SidebarSearch } from './sidebar-search';
|
|
10
|
-
import { SidebarNav } from './sidebar-nav';
|
|
11
|
-
import { SidebarSettings } from './sidebar-settings';
|
|
12
|
-
import { NavItem } from './nav-item';
|
|
13
|
-
const TRANSITION_DURATION = 0.25;
|
|
14
|
-
const EASE = [0.32, 0.72, 0, 1];
|
|
15
|
-
// Separate components to ensure AnimatePresence can properly track them
|
|
16
|
-
function MainView({ navScrolled, onNavScrolledChange, onNavigate, }) {
|
|
17
|
-
return (<>
|
|
18
|
-
<SidebarSearch dividerVisible={navScrolled}/>
|
|
19
|
-
<SidebarNav className="flex-1" onScrolledChange={onNavScrolledChange}/>
|
|
20
|
-
<div className="border-t border-border px-2 py-2">
|
|
21
|
-
<NavItem label="Settings" icon={<Cog6ToothIcon className="h-4 w-4 stroke-[1.75]"/>} shortcut={['G', 'S']} onClick={onNavigate}/>
|
|
22
|
-
</div>
|
|
23
|
-
</>);
|
|
24
|
-
}
|
|
25
|
-
function SettingsView() {
|
|
26
|
-
return (<>
|
|
27
|
-
<SidebarHeader title="Settings"/>
|
|
28
|
-
<div className="flex-1 overflow-y-auto">
|
|
29
|
-
<SidebarSettings />
|
|
30
|
-
</div>
|
|
31
|
-
</>);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Animated container for sidebar view transitions using motion.
|
|
35
|
-
* Renders the appropriate view content and handles smooth transitions.
|
|
36
|
-
*
|
|
37
|
-
* Forward (drill in): main exits left, settings enters from right
|
|
38
|
-
* Back (drill out): settings exits right, main enters from left
|
|
39
|
-
*/
|
|
40
|
-
export function SidebarTransition({ className }) {
|
|
41
|
-
const view = useAtomValue(sidebarViewAtom);
|
|
42
|
-
const direction = useAtomValue(navigationDirectionAtom);
|
|
43
|
-
const pushView = useSetAtom(pushViewAtom);
|
|
44
|
-
const [navScrolled, setNavScrolled] = useState(false);
|
|
45
|
-
useEffect(() => {
|
|
46
|
-
if (view !== 'main')
|
|
47
|
-
setNavScrolled(false);
|
|
48
|
-
}, [view]);
|
|
49
|
-
return (<div className={cn('relative flex-1 overflow-hidden', className)}>
|
|
50
|
-
<AnimatePresence mode="popLayout" initial={false} custom={direction}>
|
|
51
|
-
{view === 'main' ? (<motion.div key="main" custom={direction} initial={{ opacity: 0, x: -16, filter: 'blur(6px)' }} animate={{ opacity: 1, x: 0, filter: 'blur(0px)' }} exit={{ opacity: 0, x: -16, filter: 'blur(6px)' }} transition={{ duration: TRANSITION_DURATION, ease: EASE }} className="absolute inset-0 flex flex-col">
|
|
52
|
-
<MainView navScrolled={navScrolled} onNavScrolledChange={setNavScrolled} onNavigate={() => pushView('settings')}/>
|
|
53
|
-
</motion.div>) : (<motion.div key="settings" custom={direction} initial={{ opacity: 0, x: 16, filter: 'blur(6px)' }} animate={{ opacity: 1, x: 0, filter: 'blur(0px)' }} exit={{ opacity: 0, x: 16, filter: 'blur(6px)' }} transition={{ duration: TRANSITION_DURATION, ease: EASE }} className="absolute inset-0 flex flex-col">
|
|
54
|
-
<SettingsView />
|
|
55
|
-
</motion.div>)}
|
|
56
|
-
</AnimatePresence>
|
|
57
|
-
</div>);
|
|
58
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function StatusBar(): any;
|