gitspace 0.2.0-rc.20 → 0.2.0-rc.21
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/package.json +11 -6
- package/.claude/settings.local.json +0 -10
- package/.gitspace/bundle.json +0 -50
- package/.gitspace/events.json +0 -11
- package/.gitspace/processes.json +0 -23
- package/.gitspace/scripts/select/01-status.sh +0 -39
- package/.gitspace/scripts/setup/01-install-deps.sh +0 -12
- package/.gitspace/scripts/setup/02-typecheck.sh +0 -16
- package/AGENTS.md +0 -469
- package/CLAUDE.md +0 -1
- package/bun.lock +0 -794
- package/docs/CONNECTION.md +0 -623
- package/docs/GATEWAY-WORKER.md +0 -319
- package/docs/GETTING-STARTED.md +0 -448
- package/docs/GITSPACE-PLATFORM.md +0 -1819
- package/docs/INFRASTRUCTURE.md +0 -1347
- package/docs/PROTOCOL.md +0 -619
- package/docs/QUICKSTART.md +0 -183
- package/docs/RELAY.md +0 -327
- package/docs/REMOTE-DESIGN.md +0 -554
- package/docs/ROADMAP.md +0 -564
- package/docs/SITE_DOCS_FIGMA_MAKE.md +0 -1176
- package/docs/STACK-DESIGN.md +0 -588
- package/docs/UNIFIED_ARCHITECTURE.md +0 -138
- package/experiments/pty-benchmark.ts +0 -148
- package/experiments/pty-latency.ts +0 -100
- package/experiments/router/client.ts +0 -199
- package/experiments/router/protocol.ts +0 -74
- package/experiments/router/router.ts +0 -217
- package/experiments/router/session.ts +0 -180
- package/experiments/router/test.ts +0 -133
- package/experiments/socket-bandwidth.ts +0 -77
- package/homebrew/gitspace.rb +0 -45
- package/landing-page/ATTRIBUTIONS.md +0 -3
- package/landing-page/README.md +0 -11
- package/landing-page/bun.lock +0 -801
- package/landing-page/guidelines/Guidelines.md +0 -61
- package/landing-page/index.html +0 -37
- package/landing-page/package.json +0 -90
- package/landing-page/postcss.config.mjs +0 -15
- package/landing-page/public/_redirects +0 -1
- package/landing-page/public/favicon.png +0 -0
- package/landing-page/src/app/App.tsx +0 -53
- package/landing-page/src/app/components/figma/ImageWithFallback.tsx +0 -27
- package/landing-page/src/app/components/ui/accordion.tsx +0 -66
- package/landing-page/src/app/components/ui/alert-dialog.tsx +0 -157
- package/landing-page/src/app/components/ui/alert.tsx +0 -66
- package/landing-page/src/app/components/ui/aspect-ratio.tsx +0 -11
- package/landing-page/src/app/components/ui/avatar.tsx +0 -53
- package/landing-page/src/app/components/ui/badge.tsx +0 -46
- package/landing-page/src/app/components/ui/breadcrumb.tsx +0 -109
- package/landing-page/src/app/components/ui/button.tsx +0 -57
- package/landing-page/src/app/components/ui/calendar.tsx +0 -75
- package/landing-page/src/app/components/ui/card.tsx +0 -92
- package/landing-page/src/app/components/ui/carousel.tsx +0 -241
- package/landing-page/src/app/components/ui/chart.tsx +0 -353
- package/landing-page/src/app/components/ui/checkbox.tsx +0 -32
- package/landing-page/src/app/components/ui/collapsible.tsx +0 -33
- package/landing-page/src/app/components/ui/command.tsx +0 -177
- package/landing-page/src/app/components/ui/context-menu.tsx +0 -252
- package/landing-page/src/app/components/ui/dialog.tsx +0 -135
- package/landing-page/src/app/components/ui/drawer.tsx +0 -132
- package/landing-page/src/app/components/ui/dropdown-menu.tsx +0 -257
- package/landing-page/src/app/components/ui/form.tsx +0 -168
- package/landing-page/src/app/components/ui/hover-card.tsx +0 -44
- package/landing-page/src/app/components/ui/input-otp.tsx +0 -77
- package/landing-page/src/app/components/ui/input.tsx +0 -21
- package/landing-page/src/app/components/ui/label.tsx +0 -24
- package/landing-page/src/app/components/ui/menubar.tsx +0 -276
- package/landing-page/src/app/components/ui/navigation-menu.tsx +0 -168
- package/landing-page/src/app/components/ui/pagination.tsx +0 -127
- package/landing-page/src/app/components/ui/popover.tsx +0 -48
- package/landing-page/src/app/components/ui/progress.tsx +0 -31
- package/landing-page/src/app/components/ui/radio-group.tsx +0 -45
- package/landing-page/src/app/components/ui/resizable.tsx +0 -56
- package/landing-page/src/app/components/ui/scroll-area.tsx +0 -58
- package/landing-page/src/app/components/ui/select.tsx +0 -189
- package/landing-page/src/app/components/ui/separator.tsx +0 -28
- package/landing-page/src/app/components/ui/sheet.tsx +0 -139
- package/landing-page/src/app/components/ui/sidebar.tsx +0 -726
- package/landing-page/src/app/components/ui/skeleton.tsx +0 -13
- package/landing-page/src/app/components/ui/slider.tsx +0 -63
- package/landing-page/src/app/components/ui/sonner.tsx +0 -25
- package/landing-page/src/app/components/ui/switch.tsx +0 -31
- package/landing-page/src/app/components/ui/table.tsx +0 -116
- package/landing-page/src/app/components/ui/tabs.tsx +0 -66
- package/landing-page/src/app/components/ui/textarea.tsx +0 -18
- package/landing-page/src/app/components/ui/toggle-group.tsx +0 -73
- package/landing-page/src/app/components/ui/toggle.tsx +0 -47
- package/landing-page/src/app/components/ui/tooltip.tsx +0 -61
- package/landing-page/src/app/components/ui/use-mobile.ts +0 -21
- package/landing-page/src/app/components/ui/utils.ts +0 -6
- package/landing-page/src/components/docs/DocsContent.tsx +0 -801
- package/landing-page/src/components/docs/DocsSidebar.tsx +0 -90
- package/landing-page/src/components/landing/CTA.tsx +0 -59
- package/landing-page/src/components/landing/Comparison.tsx +0 -84
- package/landing-page/src/components/landing/FaultyTerminal.tsx +0 -424
- package/landing-page/src/components/landing/Features.tsx +0 -201
- package/landing-page/src/components/landing/Hero.tsx +0 -142
- package/landing-page/src/components/landing/Pricing.tsx +0 -140
- package/landing-page/src/components/landing/Roadmap.tsx +0 -86
- package/landing-page/src/components/landing/Security.tsx +0 -81
- package/landing-page/src/components/landing/TerminalWindow.tsx +0 -27
- package/landing-page/src/components/landing/UseCases.tsx +0 -55
- package/landing-page/src/components/landing/Workflow.tsx +0 -101
- package/landing-page/src/components/layout/DashboardNavbar.tsx +0 -37
- package/landing-page/src/components/layout/Footer.tsx +0 -55
- package/landing-page/src/components/layout/LandingNavbar.tsx +0 -82
- package/landing-page/src/components/ui/badge.tsx +0 -39
- package/landing-page/src/components/ui/breadcrumb.tsx +0 -115
- package/landing-page/src/components/ui/button.tsx +0 -57
- package/landing-page/src/components/ui/card.tsx +0 -79
- package/landing-page/src/components/ui/mock-terminal.tsx +0 -68
- package/landing-page/src/components/ui/separator.tsx +0 -28
- package/landing-page/src/lib/utils.ts +0 -6
- package/landing-page/src/main.tsx +0 -10
- package/landing-page/src/pages/Dashboard.tsx +0 -133
- package/landing-page/src/pages/DocsPage.tsx +0 -79
- package/landing-page/src/pages/LandingPage.tsx +0 -31
- package/landing-page/src/pages/TerminalView.tsx +0 -106
- package/landing-page/src/styles/fonts.css +0 -0
- package/landing-page/src/styles/index.css +0 -3
- package/landing-page/src/styles/tailwind.css +0 -4
- package/landing-page/src/styles/theme.css +0 -181
- package/landing-page/vite.config.ts +0 -19
- package/scripts/GHOSTTY_TAB_BUG.md +0 -106
- package/scripts/build.ts +0 -298
- package/scripts/migrate-secrets.ts +0 -77
- package/scripts/release.ts +0 -140
- package/scripts/sample-events.ts +0 -263
- package/scripts/test-tabs-minimal.ts +0 -68
- package/scripts/test-tabs-workaround.ts +0 -95
- package/scripts/test-tabs.ts +0 -171
- package/src/__tests__/test-utils.ts +0 -298
- package/src/app/input/__tests__/sessionCommands.test.ts +0 -40
- package/src/app/input/sessionCommands.ts +0 -94
- package/src/app/session/__tests__/useAttachController.test.ts +0 -229
- package/src/app/session/createSessionBackend.bun.ts +0 -76
- package/src/app/session/createSessionBackend.web.ts +0 -104
- package/src/app/session/types.ts +0 -16
- package/src/app/session/useAttachController.ts +0 -220
- package/src/app/session/useProcessActions.ts +0 -201
- package/src/app/session/useSessionClient.ts +0 -35
- package/src/app/session/useWorkspaceDeleteFlow.ts +0 -170
- package/src/app.tui.tsx +0 -2929
- package/src/app.web.tsx +0 -1454
- package/src/commands/__tests__/connect-key.test.ts +0 -10
- package/src/commands/__tests__/events.test.ts +0 -201
- package/src/commands/__tests__/notifications.test.ts +0 -349
- package/src/commands/__tests__/process.test.ts +0 -251
- package/src/commands/__tests__/serve-messages.test.ts +0 -190
- package/src/commands/__tests__/serve-process-hosting.test.ts +0 -63
- package/src/commands/access.ts +0 -298
- package/src/commands/add.ts +0 -455
- package/src/commands/auth.ts +0 -369
- package/src/commands/bundle.ts +0 -232
- package/src/commands/config.ts +0 -242
- package/src/commands/connect-key.ts +0 -1
- package/src/commands/connect.ts +0 -576
- package/src/commands/directory.ts +0 -16
- package/src/commands/events.ts +0 -157
- package/src/commands/host.ts +0 -566
- package/src/commands/identity.ts +0 -184
- package/src/commands/linear.ts +0 -717
- package/src/commands/list.ts +0 -181
- package/src/commands/migrate.ts +0 -52
- package/src/commands/notifications.ts +0 -351
- package/src/commands/process.ts +0 -104
- package/src/commands/relay.ts +0 -315
- package/src/commands/remove.ts +0 -279
- package/src/commands/review.ts +0 -787
- package/src/commands/serve.ts +0 -1946
- package/src/commands/share.ts +0 -451
- package/src/commands/status.ts +0 -125
- package/src/commands/switch.ts +0 -361
- package/src/commands/tmux.ts +0 -317
- package/src/components/DPad.web.tsx +0 -343
- package/src/components/DiffViewer.web.tsx +0 -1192
- package/src/components/Events.tsx +0 -137
- package/src/components/Events.tui.tsx +0 -129
- package/src/components/Events.web.tsx +0 -386
- package/src/components/FloatingControls.web.tsx +0 -112
- package/src/components/FloatingJogWheel.web.tsx +0 -240
- package/src/components/Flow.tsx +0 -458
- package/src/components/Flow.tui.tsx +0 -343
- package/src/components/Flow.web.tsx +0 -442
- package/src/components/Inbox.tsx +0 -448
- package/src/components/Inbox.tui.tsx +0 -262
- package/src/components/Inbox.web.tsx +0 -329
- package/src/components/MachineList.tsx +0 -187
- package/src/components/MachineList.tui.tsx +0 -161
- package/src/components/MachineList.web.tsx +0 -210
- package/src/components/NumPad.web.tsx +0 -270
- package/src/components/ProjectList.tsx +0 -175
- package/src/components/ProjectList.tui.tsx +0 -109
- package/src/components/ProjectList.web.tsx +0 -143
- package/src/components/ProjectOnboardingStep.ts +0 -23
- package/src/components/ProjectOnboardingStep.tui.tsx +0 -88
- package/src/components/ProjectOnboardingStep.web.tsx +0 -59
- package/src/components/RemoteMachineScreen.tui.tsx +0 -690
- package/src/components/ScriptTerminal.tui.tsx +0 -160
- package/src/components/ScriptTerminal.web.tsx +0 -89
- package/src/components/SessionTerminal.tui.tsx +0 -406
- package/src/components/SessionTerminal.web.tsx +0 -467
- package/src/components/SpacesBrowser.tsx +0 -540
- package/src/components/SpacesBrowser.tui.tsx +0 -258
- package/src/components/SpacesBrowser.web.tsx +0 -332
- package/src/components/TerminalControls.web.tsx +0 -464
- package/src/components/ThreadPanel.web.tsx +0 -798
- package/src/components/__tests__/SpacesBrowser.test.ts +0 -541
- package/src/components/__tests__/SpacesBrowser.tui.test.tsx +0 -249
- package/src/components/__tests__/script-terminal-buffer.tui.test.ts +0 -72
- package/src/components/index.ts +0 -105
- package/src/components/review-decision-colors.ts +0 -11
- package/src/components/script-terminal-buffer.tui.ts +0 -37
- package/src/components/session-terminal-page-navigation.ts +0 -48
- package/src/components/terminal-bracketed-paste.tui.test.ts +0 -43
- package/src/components/terminal-bracketed-paste.tui.ts +0 -46
- package/src/core/__tests__/access.test.ts +0 -240
- package/src/core/__tests__/bundle-refresh.test.ts +0 -567
- package/src/core/__tests__/bundle.test.ts +0 -209
- package/src/core/__tests__/github-review.test.ts +0 -781
- package/src/core/__tests__/project-lifecycle.test.ts +0 -137
- package/src/core/__tests__/workspace-lifecycle.test.ts +0 -159
- package/src/core/__tests__/workspace.test.ts +0 -149
- package/src/core/access.ts +0 -277
- package/src/core/bundle-refresh.ts +0 -1064
- package/src/core/bundle.ts +0 -326
- package/src/core/config.ts +0 -405
- package/src/core/git.ts +0 -768
- package/src/core/github-review.ts +0 -761
- package/src/core/github.ts +0 -151
- package/src/core/identity.ts +0 -631
- package/src/core/linear.ts +0 -403
- package/src/core/preferences-service.ts +0 -17
- package/src/core/project-catalog.ts +0 -52
- package/src/core/project-lifecycle.ts +0 -163
- package/src/core/review-executor.ts +0 -316
- package/src/core/review.ts +0 -407
- package/src/core/secret-runtime.ts +0 -167
- package/src/core/shell.ts +0 -117
- package/src/core/trusted-relays.ts +0 -315
- package/src/core/workspace-lifecycle.ts +0 -216
- package/src/core/workspace.ts +0 -363
- package/src/hooks/__tests__/useLocalSession.tui.test.ts +0 -557
- package/src/hooks/index.ts +0 -8
- package/src/hooks/index.tui.ts +0 -32
- package/src/hooks/useDaemonStatus.tui.ts +0 -174
- package/src/hooks/useLocalSession.tui.ts +0 -395
- package/src/hooks/useRelayConnection.web.ts +0 -54
- package/src/hooks/useRemoteMachines.tui.ts +0 -166
- package/src/hooks/useRemoteTerminal.tui.ts +0 -22
- package/src/hooks/useReview.web.ts +0 -248
- package/src/hooks/useTerminal.web.ts +0 -36
- package/src/hooks/useUserActivity.ts +0 -61
- package/src/hooks/useVisualViewport.web.ts +0 -104
- package/src/index.ts +0 -1376
- package/src/lib/events/__tests__/collector-filter.test.ts +0 -105
- package/src/lib/events/__tests__/store-query.test.ts +0 -103
- package/src/lib/events/collector.ts +0 -494
- package/src/lib/events/filters.ts +0 -26
- package/src/lib/events/index.ts +0 -11
- package/src/lib/events/indexer.ts +0 -14
- package/src/lib/events/paths.ts +0 -69
- package/src/lib/events/reader.ts +0 -212
- package/src/lib/events/store.ts +0 -141
- package/src/lib/invite.web.ts +0 -58
- package/src/lib/preferences-service.web.ts +0 -41
- package/src/lib/processes/__tests__/config.test.ts +0 -83
- package/src/lib/processes/__tests__/names.test.ts +0 -125
- package/src/lib/processes/__tests__/schema.test.ts +0 -208
- package/src/lib/processes/__tests__/watchdog.test.ts +0 -210
- package/src/lib/processes/autostart.ts +0 -16
- package/src/lib/processes/config.ts +0 -187
- package/src/lib/processes/control.ts +0 -53
- package/src/lib/processes/editor.ts +0 -32
- package/src/lib/processes/events-config.ts +0 -37
- package/src/lib/processes/index.ts +0 -14
- package/src/lib/processes/instances.ts +0 -20
- package/src/lib/processes/manager.ts +0 -131
- package/src/lib/processes/names.ts +0 -71
- package/src/lib/processes/registry.ts +0 -26
- package/src/lib/processes/runner.ts +0 -211
- package/src/lib/processes/scheduler.ts +0 -17
- package/src/lib/processes/schema.ts +0 -74
- package/src/lib/processes/session-list.ts +0 -15
- package/src/lib/processes/state.ts +0 -82
- package/src/lib/processes/watchdog.test.ts +0 -79
- package/src/lib/processes/watchdog.ts +0 -106
- package/src/lib/remote-session/__tests__/protocol.test.ts +0 -291
- package/src/lib/remote-session/index.ts +0 -7
- package/src/lib/remote-session/protocol.ts +0 -443
- package/src/lib/remote-session/session-handler.ts +0 -1298
- package/src/lib/remote-session/workspace-scanner.ts +0 -161
- package/src/lib/sonner.web.ts +0 -1
- package/src/lib/storage/identity-store.web.ts +0 -94
- package/src/lib/tmux-lite/README.md +0 -81
- package/src/lib/tmux-lite/cli.ts +0 -855
- package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +0 -349
- package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +0 -291
- package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +0 -142
- package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +0 -339
- package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +0 -477
- package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +0 -499
- package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +0 -371
- package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +0 -573
- package/src/lib/tmux-lite/crypto/access-control.test.ts +0 -512
- package/src/lib/tmux-lite/crypto/access-control.ts +0 -320
- package/src/lib/tmux-lite/crypto/frames.test.ts +0 -262
- package/src/lib/tmux-lite/crypto/frames.ts +0 -141
- package/src/lib/tmux-lite/crypto/handshake.ts +0 -894
- package/src/lib/tmux-lite/crypto/identity.test.ts +0 -220
- package/src/lib/tmux-lite/crypto/identity.ts +0 -286
- package/src/lib/tmux-lite/crypto/index.ts +0 -51
- package/src/lib/tmux-lite/crypto/invites.test.ts +0 -381
- package/src/lib/tmux-lite/crypto/invites.ts +0 -215
- package/src/lib/tmux-lite/crypto/keyexchange.ts +0 -435
- package/src/lib/tmux-lite/crypto/keys.test.ts +0 -58
- package/src/lib/tmux-lite/crypto/keys.ts +0 -47
- package/src/lib/tmux-lite/crypto/secretbox.test.ts +0 -169
- package/src/lib/tmux-lite/crypto/secretbox.ts +0 -124
- package/src/lib/tmux-lite/handshake-handler.ts +0 -451
- package/src/lib/tmux-lite/process-run.integration.test.ts +0 -266
- package/src/lib/tmux-lite/protocol.test.ts +0 -307
- package/src/lib/tmux-lite/protocol.ts +0 -291
- package/src/lib/tmux-lite/relay-client.ts +0 -506
- package/src/lib/tmux-lite/server-lifecycle.test.ts +0 -212
- package/src/lib/tmux-lite/server.ts +0 -1412
- package/src/lib/tmux-lite/shell-integration.sh +0 -37
- package/src/lib/tmux-lite/terminal-queries.test.ts +0 -54
- package/src/lib/tmux-lite/terminal-queries.ts +0 -49
- package/src/notifications/__tests__/useNotifications.test.ts +0 -739
- package/src/notifications/index.ts +0 -32
- package/src/notifications/policy.test.ts +0 -424
- package/src/notifications/policy.ts +0 -139
- package/src/notifications/types.ts +0 -82
- package/src/notifications/useNotifications.ts +0 -350
- package/src/pages/ReviewPage.web.tsx +0 -511
- package/src/preferences/index.ts +0 -1
- package/src/preferences/types.ts +0 -9
- package/src/relay/__tests__/e2e-flow.test.ts +0 -1284
- package/src/relay/__tests__/helpers/auth.ts +0 -354
- package/src/relay/__tests__/helpers/ports.ts +0 -51
- package/src/relay/__tests__/protocol-validation.test.ts +0 -265
- package/src/relay/authorization.ts +0 -303
- package/src/relay/embedded-assets.generated.d.ts +0 -15
- package/src/relay/identity.ts +0 -352
- package/src/relay/index.ts +0 -57
- package/src/relay/pipes.test.ts +0 -427
- package/src/relay/pipes.ts +0 -195
- package/src/relay/protocol.ts +0 -804
- package/src/relay/registries.test.ts +0 -437
- package/src/relay/registries.ts +0 -593
- package/src/relay/server.test.ts +0 -1323
- package/src/relay/server.ts +0 -1128
- package/src/relay/signing.ts +0 -238
- package/src/relay/types.ts +0 -69
- package/src/relay-client/__tests__/machine-directory-client.test.ts +0 -152
- package/src/relay-client/__tests__/useMachineDirectory.test.ts +0 -172
- package/src/relay-client/adapters/browser.ts +0 -27
- package/src/relay-client/adapters/node.ts +0 -29
- package/src/relay-client/index.ts +0 -33
- package/src/relay-client/machine-directory-client.ts +0 -244
- package/src/relay-client/useMachineDirectory.ts +0 -175
- package/src/serve/client-session-manager.ts +0 -635
- package/src/serve/daemon.ts +0 -497
- package/src/serve/pty-session.ts +0 -236
- package/src/serve/types.ts +0 -174
- package/src/session/__tests__/backend-manager.test.ts +0 -101
- package/src/session/__tests__/local-session-backend.test.ts +0 -1129
- package/src/session/__tests__/reducer.test.ts +0 -80
- package/src/session/__tests__/remote-session-backend.test.ts +0 -995
- package/src/session/__tests__/session-name.test.ts +0 -35
- package/src/session/__tests__/useBundleRefreshAttachFlow.test.ts +0 -431
- package/src/session/__tests__/useRemoteSessionClient.test.ts +0 -424
- package/src/session/__tests__/workspace-shell-hooks.integration.test.ts +0 -268
- package/src/session/__tests__/workspace-shell-hooks.test.ts +0 -24
- package/src/session/adapters/browser-remote.ts +0 -101
- package/src/session/adapters/node-remote.ts +0 -135
- package/src/session/backend-key.ts +0 -5
- package/src/session/backend-manager.ts +0 -80
- package/src/session/backend.ts +0 -93
- package/src/session/backends/local-session-backend.ts +0 -1119
- package/src/session/backends/remote-session-backend.ts +0 -1378
- package/src/session/crypto/__tests__/web-terminal.test.ts +0 -1158
- package/src/session/crypto/frames.web.ts +0 -205
- package/src/session/crypto/handshake.web.ts +0 -396
- package/src/session/crypto/identity.web.ts +0 -133
- package/src/session/crypto/keyexchange.web.ts +0 -246
- package/src/session/crypto/relay-signing.web.ts +0 -53
- package/src/session/events.ts +0 -38
- package/src/session/index.ts +0 -116
- package/src/session/reducer.ts +0 -274
- package/src/session/selectors.ts +0 -28
- package/src/session/session-name.ts +0 -50
- package/src/session/types.ts +0 -101
- package/src/session/useBundleRefreshAttachFlow.ts +0 -608
- package/src/session/useRemoteSessionClient.ts +0 -424
- package/src/session/useSessionEngine.ts +0 -432
- package/src/session/workspace-shell-hooks.ts +0 -35
- package/src/tui/__tests__/input-text.test.ts +0 -24
- package/src/tui/__tests__/local-terminal-sync.test.ts +0 -82
- package/src/tui/__tests__/session-terminal-page-navigation.test.ts +0 -94
- package/src/tui/app.tsx +0 -2
- package/src/tui/index.ts +0 -18
- package/src/tui/input-text.ts +0 -38
- package/src/tui/local-terminal-sync.ts +0 -41
- package/src/types/bundle-refresh.ts +0 -42
- package/src/types/bundle.ts +0 -130
- package/src/types/config.ts +0 -287
- package/src/types/errors.ts +0 -292
- package/src/types/events.ts +0 -91
- package/src/types/identity.ts +0 -284
- package/src/types/processes.ts +0 -45
- package/src/types/review.ts +0 -349
- package/src/types/script-phase.ts +0 -3
- package/src/types/workspace-fuzzy.ts +0 -49
- package/src/types/workspace.ts +0 -151
- package/src/utils/__tests__/onboarding.test.ts +0 -358
- package/src/utils/__tests__/run-scripts.test.ts +0 -535
- package/src/utils/__tests__/run-workspace-scripts.test.ts +0 -406
- package/src/utils/__tests__/workspace-setup.integration.test.ts +0 -633
- package/src/utils/__tests__/workspace-state.test.ts +0 -78
- package/src/utils/bun-socket-writer.ts +0 -80
- package/src/utils/clipboard.ts +0 -53
- package/src/utils/deps.test.ts +0 -31
- package/src/utils/deps.ts +0 -145
- package/src/utils/device.web.ts +0 -163
- package/src/utils/fuzzy-match.ts +0 -125
- package/src/utils/hostnames.ts +0 -43
- package/src/utils/hunk-header.ts +0 -17
- package/src/utils/id.ts +0 -9
- package/src/utils/logger.ts +0 -127
- package/src/utils/markdown.ts +0 -254
- package/src/utils/normalize-env-key.ts +0 -13
- package/src/utils/onboarding.ts +0 -279
- package/src/utils/prompts.ts +0 -176
- package/src/utils/run-commands.ts +0 -112
- package/src/utils/run-scripts.ts +0 -337
- package/src/utils/run-workspace-scripts.ts +0 -355
- package/src/utils/sanitize.test.ts +0 -149
- package/src/utils/sanitize.ts +0 -162
- package/src/utils/secrets.ts +0 -836
- package/src/utils/shell-escape.ts +0 -40
- package/src/utils/utf8.ts +0 -79
- package/src/utils/workspace-id.ts +0 -55
- package/src/utils/workspace-state.ts +0 -427
- package/src/version.generated.d.ts +0 -2
- package/todo-security.md +0 -92
- package/tsconfig.json +0 -29
- package/web/README.md +0 -73
- package/web/bun.lock +0 -675
- package/web/eslint.config.js +0 -23
- package/web/index.css +0 -249
- package/web/index.html +0 -16
- package/web/main.tsx +0 -10
- package/web/package.json +0 -39
- package/web/public/vite.svg +0 -1
- package/web/tsconfig.app.json +0 -35
- package/web/tsconfig.json +0 -7
- package/web/tsconfig.node.json +0 -26
- package/web/vite.config.ts +0 -39
- package/worker/bun.lock +0 -237
- package/worker/package.json +0 -22
- package/worker/schema.sql +0 -96
- package/worker/src/handlers/auth.ts +0 -451
- package/worker/src/handlers/subdomains.ts +0 -376
- package/worker/src/handlers/user.ts +0 -98
- package/worker/src/index.ts +0 -70
- package/worker/src/middleware/auth.ts +0 -152
- package/worker/src/services/cloudflare.ts +0 -609
- package/worker/src/types.ts +0 -96
- package/worker/tsconfig.json +0 -15
- package/worker/wrangler.toml +0 -26
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TUI Hook for remote machine directory connections.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { useCallback, useMemo } from 'react';
|
|
6
|
-
import type { Identity } from '../types/identity.js';
|
|
7
|
-
import { keypairExists, loadKeypair } from '../core/identity.js';
|
|
8
|
-
import { signMessage } from '../relay/signing.js';
|
|
9
|
-
import type { MachineInfo } from '../components/index.js';
|
|
10
|
-
import {
|
|
11
|
-
useMachineDirectory,
|
|
12
|
-
type RelayStatus,
|
|
13
|
-
nodeRelaySocketAdapter,
|
|
14
|
-
type NodeRelaySocket,
|
|
15
|
-
} from '../relay-client/index.js';
|
|
16
|
-
|
|
17
|
-
export interface RelayConfig {
|
|
18
|
-
url: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface UseRemoteMachinesOptions {
|
|
22
|
-
relayConfig?: RelayConfig;
|
|
23
|
-
onError?: (error: Error) => void;
|
|
24
|
-
/** Optional preloaded identity (avoids password/env lookup). */
|
|
25
|
-
identity?: Identity;
|
|
26
|
-
/** Optional password for loading local identity from disk. */
|
|
27
|
-
identityPassword?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export type ConnectionStatus = RelayStatus;
|
|
31
|
-
|
|
32
|
-
export interface UseRemoteMachinesReturn {
|
|
33
|
-
// Connection state
|
|
34
|
-
status: ConnectionStatus;
|
|
35
|
-
error: string | null;
|
|
36
|
-
identity: Identity | null;
|
|
37
|
-
|
|
38
|
-
// Machine list
|
|
39
|
-
machines: MachineInfo[];
|
|
40
|
-
|
|
41
|
-
// Actions
|
|
42
|
-
connect: () => Promise<void>;
|
|
43
|
-
disconnect: () => void;
|
|
44
|
-
refreshMachines: () => Promise<void>;
|
|
45
|
-
|
|
46
|
-
// Mode
|
|
47
|
-
isRemoteMode: boolean;
|
|
48
|
-
isLocal: (machine: MachineInfo) => boolean;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function resolveIdentity(options: UseRemoteMachinesOptions): Promise<Identity | null> {
|
|
52
|
-
if (options.identity) {
|
|
53
|
-
return options.identity;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (!keypairExists()) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const password = options.identityPassword || process.env.GITSPACE_IDENTITY_PASSWORD;
|
|
61
|
-
if (!password) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
return await loadKeypair(password);
|
|
67
|
-
} catch {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function useRemoteMachines(options: UseRemoteMachinesOptions = {}): UseRemoteMachinesReturn {
|
|
73
|
-
const { relayConfig, onError } = options;
|
|
74
|
-
const isRemoteMode = !!relayConfig;
|
|
75
|
-
|
|
76
|
-
const localMachine = useMemo<MachineInfo>(
|
|
77
|
-
() => ({
|
|
78
|
-
machineId: 'local',
|
|
79
|
-
label: 'This Machine',
|
|
80
|
-
online: true,
|
|
81
|
-
isAuthorized: true,
|
|
82
|
-
}),
|
|
83
|
-
[]
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const isLocal = useCallback((machine: MachineInfo) => {
|
|
87
|
-
return machine.machineId === 'local';
|
|
88
|
-
}, []);
|
|
89
|
-
|
|
90
|
-
const directory = useMachineDirectory<NodeRelaySocket, Identity>({
|
|
91
|
-
enabled: isRemoteMode,
|
|
92
|
-
autoConnect: isRemoteMode,
|
|
93
|
-
socketAdapter: nodeRelaySocketAdapter,
|
|
94
|
-
mapMachines: (remoteMachines) => [localMachine, ...remoteMachines],
|
|
95
|
-
resolveClientConfig: async () => {
|
|
96
|
-
if (!relayConfig) {
|
|
97
|
-
throw new Error('Relay config is required for remote mode');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const identity = await resolveIdentity(options);
|
|
101
|
-
if (!identity) {
|
|
102
|
-
throw new Error(
|
|
103
|
-
'Remote relay requires an unlocked identity. Set GITSPACE_IDENTITY_PASSWORD or pass identity to useRemoteMachines.'
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
relayUrl: relayConfig.url,
|
|
109
|
-
clientIdentityId: identity.id,
|
|
110
|
-
identity,
|
|
111
|
-
signer: <T extends object>(message: T): T => {
|
|
112
|
-
const privateKey = identity.signing.secretKey.slice(0, 32);
|
|
113
|
-
return signMessage(message, privateKey, identity.signing.publicKey);
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
onError,
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
const connect = useCallback(async () => {
|
|
121
|
-
if (!isRemoteMode) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
await directory.connect();
|
|
125
|
-
}, [directory, isRemoteMode]);
|
|
126
|
-
|
|
127
|
-
const disconnect = useCallback(() => {
|
|
128
|
-
if (!isRemoteMode) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
directory.disconnect();
|
|
132
|
-
}, [directory, isRemoteMode]);
|
|
133
|
-
|
|
134
|
-
const refreshMachines = useCallback(async () => {
|
|
135
|
-
if (!isRemoteMode) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
await directory.refreshMachines();
|
|
139
|
-
}, [directory, isRemoteMode]);
|
|
140
|
-
|
|
141
|
-
if (!isRemoteMode) {
|
|
142
|
-
return {
|
|
143
|
-
status: 'connected',
|
|
144
|
-
error: null,
|
|
145
|
-
identity: null,
|
|
146
|
-
machines: [localMachine],
|
|
147
|
-
connect,
|
|
148
|
-
disconnect,
|
|
149
|
-
refreshMachines,
|
|
150
|
-
isRemoteMode,
|
|
151
|
-
isLocal,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
status: directory.status,
|
|
157
|
-
error: directory.error,
|
|
158
|
-
identity: directory.identity,
|
|
159
|
-
machines: directory.machines.length > 0 ? directory.machines : [localMachine],
|
|
160
|
-
connect,
|
|
161
|
-
disconnect,
|
|
162
|
-
refreshMachines,
|
|
163
|
-
isRemoteMode,
|
|
164
|
-
isLocal,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { useSessionClient } from '../app/session/useSessionClient.js'
|
|
2
|
-
import {
|
|
3
|
-
createBunRemoteSessionBackend,
|
|
4
|
-
type BunRemoteSessionConnectParams,
|
|
5
|
-
} from '../app/session/createSessionBackend.bun.js'
|
|
6
|
-
import type {
|
|
7
|
-
SessionClientConnectionStatus,
|
|
8
|
-
SessionClientMode,
|
|
9
|
-
SessionClientScriptState,
|
|
10
|
-
} from '../app/session/types.js'
|
|
11
|
-
|
|
12
|
-
export type ConnectionStatus = SessionClientConnectionStatus
|
|
13
|
-
export type SessionMode = SessionClientMode
|
|
14
|
-
export type ScriptState = SessionClientScriptState
|
|
15
|
-
|
|
16
|
-
export type ConnectionParams = BunRemoteSessionConnectParams
|
|
17
|
-
|
|
18
|
-
export function useRemoteTerminal() {
|
|
19
|
-
return useSessionClient<ConnectionParams>({
|
|
20
|
-
createBackend: createBunRemoteSessionBackend,
|
|
21
|
-
})
|
|
22
|
-
}
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource react */
|
|
2
|
-
/**
|
|
3
|
-
* useReview — React hook for the review system.
|
|
4
|
-
*
|
|
5
|
-
* Calls terminal.sendReviewRequest() over the existing encrypted WebSocket
|
|
6
|
-
* channel and manages local state for threads, diff, and loading.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { useState, useCallback } from 'react';
|
|
10
|
-
import type { ReviewThread, ThreadTarget, HunkDecision, ReviewOperation } from '../types/review.js';
|
|
11
|
-
|
|
12
|
-
export interface UseReviewOptions {
|
|
13
|
-
sendReviewRequest: (operation: ReviewOperation) => Promise<import('../types/review.js').ReviewResult>;
|
|
14
|
-
projectName: string;
|
|
15
|
-
workspaceName: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface UseReviewReturn {
|
|
19
|
-
/** All review threads for this workspace */
|
|
20
|
-
threads: ReviewThread[];
|
|
21
|
-
/** The raw unified diff text */
|
|
22
|
-
diff: string | null;
|
|
23
|
-
/** Base branch (e.g. "main") */
|
|
24
|
-
baseBranch: string | null;
|
|
25
|
-
/** Current branch */
|
|
26
|
-
headBranch: string | null;
|
|
27
|
-
/** True while any operation is in flight */
|
|
28
|
-
loading: boolean;
|
|
29
|
-
/** Last error message, if any */
|
|
30
|
-
error: string | null;
|
|
31
|
-
|
|
32
|
-
/** Load threads from the machine */
|
|
33
|
-
loadThreads: () => Promise<void>;
|
|
34
|
-
/** Load the current diff from the machine */
|
|
35
|
-
loadDiff: () => Promise<void>;
|
|
36
|
-
|
|
37
|
-
/** Create a new thread */
|
|
38
|
-
createThread: (target: ThreadTarget, body: string, decision?: HunkDecision) => Promise<void>;
|
|
39
|
-
/** Add a reply to an existing thread */
|
|
40
|
-
addReply: (threadId: string, body: string) => Promise<void>;
|
|
41
|
-
/** Update thread properties (resolve/unresolve, change hunk decision) */
|
|
42
|
-
updateThread: (threadId: string, updates: { resolved?: boolean; decision?: HunkDecision }) => Promise<void>;
|
|
43
|
-
/** Update the body of a specific comment */
|
|
44
|
-
updateComment: (threadId: string, commentId: string, body: string) => Promise<void>;
|
|
45
|
-
/** Delete a comment */
|
|
46
|
-
deleteComment: (threadId: string, commentId: string) => Promise<void>;
|
|
47
|
-
/** Import GitHub PR review comments */
|
|
48
|
-
importGitHub: (prNumber?: number) => Promise<{ imported: number }>;
|
|
49
|
-
/** Push local review to GitHub as a formal PR review */
|
|
50
|
-
pushGitHub: (prNumber?: number) => Promise<{ prNumber: number; url: string }>;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function useReview({ sendReviewRequest, projectName, workspaceName }: UseReviewOptions): UseReviewReturn {
|
|
54
|
-
const [threads, setThreads] = useState<ReviewThread[]>([]);
|
|
55
|
-
const [diff, setDiff] = useState<string | null>(null);
|
|
56
|
-
const [baseBranch, setBaseBranch] = useState<string | null>(null);
|
|
57
|
-
const [headBranch, setHeadBranch] = useState<string | null>(null);
|
|
58
|
-
const [inFlightCount, setInFlightCount] = useState(0);
|
|
59
|
-
const [error, setError] = useState<string | null>(null);
|
|
60
|
-
|
|
61
|
-
const loading = inFlightCount > 0;
|
|
62
|
-
|
|
63
|
-
const run = useCallback(async <T>(fn: () => Promise<T>): Promise<T> => {
|
|
64
|
-
setInFlightCount((count) => count + 1);
|
|
65
|
-
setError(null);
|
|
66
|
-
try {
|
|
67
|
-
return await fn();
|
|
68
|
-
} catch (err) {
|
|
69
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
70
|
-
setError(message);
|
|
71
|
-
throw err;
|
|
72
|
-
} finally {
|
|
73
|
-
setInFlightCount((count) => (count > 0 ? count - 1 : 0));
|
|
74
|
-
}
|
|
75
|
-
}, []);
|
|
76
|
-
|
|
77
|
-
const loadThreads = useCallback(async () => {
|
|
78
|
-
await run(async () => {
|
|
79
|
-
const result = await sendReviewRequest({
|
|
80
|
-
op: 'get_threads',
|
|
81
|
-
projectName,
|
|
82
|
-
workspaceName,
|
|
83
|
-
});
|
|
84
|
-
if (result.op === 'threads') {
|
|
85
|
-
setThreads(result.threads);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
89
|
-
|
|
90
|
-
const loadDiff = useCallback(async () => {
|
|
91
|
-
await run(async () => {
|
|
92
|
-
const result = await sendReviewRequest({
|
|
93
|
-
op: 'get_diff',
|
|
94
|
-
projectName,
|
|
95
|
-
workspaceName,
|
|
96
|
-
});
|
|
97
|
-
if (result.op === 'diff') {
|
|
98
|
-
setDiff(result.diff);
|
|
99
|
-
setBaseBranch(result.baseBranch);
|
|
100
|
-
setHeadBranch(result.headBranch);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
104
|
-
|
|
105
|
-
const createThread = useCallback(async (
|
|
106
|
-
target: ThreadTarget,
|
|
107
|
-
body: string,
|
|
108
|
-
decision?: HunkDecision
|
|
109
|
-
) => {
|
|
110
|
-
await run(async () => {
|
|
111
|
-
const result = await sendReviewRequest({
|
|
112
|
-
op: 'create_thread',
|
|
113
|
-
projectName,
|
|
114
|
-
workspaceName,
|
|
115
|
-
target,
|
|
116
|
-
body,
|
|
117
|
-
decision,
|
|
118
|
-
});
|
|
119
|
-
if (result.op === 'thread_created') {
|
|
120
|
-
setThreads((prev) => [...prev, result.thread]);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
124
|
-
|
|
125
|
-
const addReply = useCallback(async (threadId: string, body: string) => {
|
|
126
|
-
await run(async () => {
|
|
127
|
-
const result = await sendReviewRequest({
|
|
128
|
-
op: 'add_reply',
|
|
129
|
-
projectName,
|
|
130
|
-
workspaceName,
|
|
131
|
-
threadId,
|
|
132
|
-
body,
|
|
133
|
-
});
|
|
134
|
-
if (result.op === 'comment_added') {
|
|
135
|
-
setThreads((prev) => prev.map((t) => t.id === threadId ? result.thread : t));
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
139
|
-
|
|
140
|
-
const updateThread = useCallback(async (
|
|
141
|
-
threadId: string,
|
|
142
|
-
updates: { resolved?: boolean; decision?: HunkDecision }
|
|
143
|
-
) => {
|
|
144
|
-
await run(async () => {
|
|
145
|
-
const result = await sendReviewRequest({
|
|
146
|
-
op: 'update_thread',
|
|
147
|
-
projectName,
|
|
148
|
-
workspaceName,
|
|
149
|
-
threadId,
|
|
150
|
-
...updates,
|
|
151
|
-
});
|
|
152
|
-
if (result.op === 'thread_updated') {
|
|
153
|
-
setThreads((prev) => prev.map((t) => t.id === threadId ? result.thread : t));
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
157
|
-
|
|
158
|
-
const updateComment = useCallback(async (
|
|
159
|
-
threadId: string,
|
|
160
|
-
commentId: string,
|
|
161
|
-
body: string
|
|
162
|
-
) => {
|
|
163
|
-
await run(async () => {
|
|
164
|
-
const result = await sendReviewRequest({
|
|
165
|
-
op: 'update_comment',
|
|
166
|
-
projectName,
|
|
167
|
-
workspaceName,
|
|
168
|
-
threadId,
|
|
169
|
-
commentId,
|
|
170
|
-
body,
|
|
171
|
-
});
|
|
172
|
-
if (result.op === 'comment_updated') {
|
|
173
|
-
setThreads((prev) => prev.map((t) => t.id === threadId ? result.thread : t));
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
177
|
-
|
|
178
|
-
const deleteComment = useCallback(async (threadId: string, commentId: string) => {
|
|
179
|
-
await run(async () => {
|
|
180
|
-
const result = await sendReviewRequest({
|
|
181
|
-
op: 'delete_comment',
|
|
182
|
-
projectName,
|
|
183
|
-
workspaceName,
|
|
184
|
-
threadId,
|
|
185
|
-
commentId,
|
|
186
|
-
});
|
|
187
|
-
if (result.op === 'comment_deleted') {
|
|
188
|
-
// When the last comment is deleted, the server removes the whole thread
|
|
189
|
-
// and returns a stub with comments: []. Filter it out rather than keeping
|
|
190
|
-
// a zombie thread in state.
|
|
191
|
-
if (result.thread.comments.length === 0) {
|
|
192
|
-
setThreads((prev) => prev.filter((t) => t.id !== threadId));
|
|
193
|
-
} else {
|
|
194
|
-
setThreads((prev) => prev.map((t) => t.id === threadId ? result.thread : t));
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
199
|
-
|
|
200
|
-
const importGitHub = useCallback(async (prNumber?: number): Promise<{ imported: number }> => {
|
|
201
|
-
return run(async () => {
|
|
202
|
-
const result = await sendReviewRequest({
|
|
203
|
-
op: 'import_github',
|
|
204
|
-
projectName,
|
|
205
|
-
workspaceName,
|
|
206
|
-
prNumber,
|
|
207
|
-
});
|
|
208
|
-
if (result.op === 'github_imported') {
|
|
209
|
-
setThreads(result.threads);
|
|
210
|
-
return { imported: result.imported };
|
|
211
|
-
}
|
|
212
|
-
throw new Error(`Unexpected response from import_github: ${result.op}`);
|
|
213
|
-
});
|
|
214
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
215
|
-
|
|
216
|
-
const pushGitHub = useCallback(async (prNumber?: number): Promise<{ prNumber: number; url: string }> => {
|
|
217
|
-
return run(async () => {
|
|
218
|
-
const result = await sendReviewRequest({
|
|
219
|
-
op: 'push_github',
|
|
220
|
-
projectName,
|
|
221
|
-
workspaceName,
|
|
222
|
-
prNumber,
|
|
223
|
-
});
|
|
224
|
-
if (result.op === 'github_pushed') {
|
|
225
|
-
return { prNumber: result.prNumber, url: result.url };
|
|
226
|
-
}
|
|
227
|
-
throw new Error('Unexpected response from push_github');
|
|
228
|
-
});
|
|
229
|
-
}, [run, sendReviewRequest, projectName, workspaceName]);
|
|
230
|
-
|
|
231
|
-
return {
|
|
232
|
-
threads,
|
|
233
|
-
diff,
|
|
234
|
-
baseBranch,
|
|
235
|
-
headBranch,
|
|
236
|
-
loading,
|
|
237
|
-
error,
|
|
238
|
-
loadThreads,
|
|
239
|
-
loadDiff,
|
|
240
|
-
createThread,
|
|
241
|
-
addReply,
|
|
242
|
-
updateThread,
|
|
243
|
-
updateComment,
|
|
244
|
-
deleteComment,
|
|
245
|
-
importGitHub,
|
|
246
|
-
pushGitHub,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Web terminal hook backed by shared session client facade.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type {
|
|
6
|
-
WorkspaceInfo,
|
|
7
|
-
SessionInfo,
|
|
8
|
-
ProjectInfo,
|
|
9
|
-
} from '../lib/remote-session/protocol'
|
|
10
|
-
import { useSessionClient } from '../app/session/useSessionClient.js'
|
|
11
|
-
import {
|
|
12
|
-
createWebRemoteSessionBackend,
|
|
13
|
-
type WebRemoteSessionConnectParams,
|
|
14
|
-
} from '../app/session/createSessionBackend.web.js'
|
|
15
|
-
import type {
|
|
16
|
-
SessionClientConnectionStatus,
|
|
17
|
-
SessionClientMode,
|
|
18
|
-
SessionClientScriptState,
|
|
19
|
-
SessionClientCommandError,
|
|
20
|
-
} from '../app/session/types.js'
|
|
21
|
-
|
|
22
|
-
export type ConnectionStatus = SessionClientConnectionStatus
|
|
23
|
-
export type SessionMode = SessionClientMode
|
|
24
|
-
|
|
25
|
-
export type { WorkspaceInfo, SessionInfo, ProjectInfo }
|
|
26
|
-
|
|
27
|
-
export type ScriptState = SessionClientScriptState
|
|
28
|
-
export type CommandErrorState = SessionClientCommandError
|
|
29
|
-
|
|
30
|
-
export type ConnectionParams = WebRemoteSessionConnectParams
|
|
31
|
-
|
|
32
|
-
export function useTerminal() {
|
|
33
|
-
return useSessionClient<ConnectionParams>({
|
|
34
|
-
createBackend: createWebRemoteSessionBackend,
|
|
35
|
-
})
|
|
36
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
-
|
|
3
|
-
export interface UseUserActivityOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Whether the UI is currently in a mode where user activity should be tracked.
|
|
6
|
-
* If false, user is treated as active.
|
|
7
|
-
*/
|
|
8
|
-
isActivityTracked: boolean;
|
|
9
|
-
/** Duration window for considering the user active. */
|
|
10
|
-
holdWhenIdleMs: number;
|
|
11
|
-
/** Interval for re-evaluating active/idle state. */
|
|
12
|
-
tickIntervalMs?: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface UseUserActivityResult {
|
|
16
|
-
/** Last activity timestamp in ms since epoch. */
|
|
17
|
-
lastActivityAt: number;
|
|
18
|
-
/** Whether user is currently active. */
|
|
19
|
-
isUserActive: boolean;
|
|
20
|
-
/** Mark activity (call on keypress/terminal input/etc). */
|
|
21
|
-
markActivity: () => void;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Shared user-activity helper used by web and TUI notification logic.
|
|
26
|
-
*/
|
|
27
|
-
export function useUserActivity(options: UseUserActivityOptions): UseUserActivityResult {
|
|
28
|
-
const {
|
|
29
|
-
isActivityTracked,
|
|
30
|
-
holdWhenIdleMs,
|
|
31
|
-
tickIntervalMs = 1000,
|
|
32
|
-
} = options;
|
|
33
|
-
|
|
34
|
-
const [lastActivityAt, setLastActivityAt] = useState(Date.now());
|
|
35
|
-
const [activityTick, setActivityTick] = useState(0);
|
|
36
|
-
|
|
37
|
-
const markActivity = useCallback(() => {
|
|
38
|
-
setLastActivityAt(Date.now());
|
|
39
|
-
}, []);
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
const interval = setInterval(() => {
|
|
43
|
-
setActivityTick((t) => t + 1);
|
|
44
|
-
}, tickIntervalMs);
|
|
45
|
-
|
|
46
|
-
return () => clearInterval(interval);
|
|
47
|
-
}, [tickIntervalMs]);
|
|
48
|
-
|
|
49
|
-
const isUserActive = useMemo(() => {
|
|
50
|
-
if (!isActivityTracked) {
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
return Date.now() - lastActivityAt < holdWhenIdleMs;
|
|
54
|
-
}, [isActivityTracked, lastActivityAt, holdWhenIdleMs, activityTick]);
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
lastActivityAt,
|
|
58
|
-
isUserActive,
|
|
59
|
-
markActivity,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { useEffect, useCallback, useState } from 'react';
|
|
2
|
-
|
|
3
|
-
/** Threshold in pixels to consider the keyboard visible */
|
|
4
|
-
const KEYBOARD_THRESHOLD = 100;
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Hook to track the visual viewport and detect keyboard visibility.
|
|
8
|
-
* Sets CSS custom properties for dynamic layout adjustment:
|
|
9
|
-
* - --visual-viewport-height: actual visible height (shrinks when keyboard shows)
|
|
10
|
-
* - --keyboard-inset: keyboard height for positioning elements above it
|
|
11
|
-
*
|
|
12
|
-
* On iOS Safari, visualViewport.height shrinks when the keyboard appears,
|
|
13
|
-
* but window.innerHeight may stay the same. We use visualViewport directly
|
|
14
|
-
* for accurate sizing.
|
|
15
|
-
*
|
|
16
|
-
* @returns Whether the keyboard is currently visible
|
|
17
|
-
*/
|
|
18
|
-
export function useVisualViewport(): boolean {
|
|
19
|
-
const [keyboardVisible, setKeyboardVisible] = useState(false);
|
|
20
|
-
|
|
21
|
-
const updateViewport = useCallback(() => {
|
|
22
|
-
if (typeof window === 'undefined') return;
|
|
23
|
-
|
|
24
|
-
const viewport = window.visualViewport;
|
|
25
|
-
if (!viewport) {
|
|
26
|
-
// Fallback for browsers without Visual Viewport API
|
|
27
|
-
document.documentElement.style.setProperty('--visual-viewport-height', '100dvh');
|
|
28
|
-
document.documentElement.style.setProperty('--keyboard-inset', '0px');
|
|
29
|
-
setKeyboardVisible(false);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Use visualViewport.height directly - this is the actual visible area
|
|
34
|
-
// On iOS Safari this shrinks when the keyboard appears
|
|
35
|
-
const viewportHeight = viewport.height;
|
|
36
|
-
|
|
37
|
-
// Account for any offset (e.g., when page is scrolled with keyboard)
|
|
38
|
-
const offsetTop = viewport.offsetTop || 0;
|
|
39
|
-
|
|
40
|
-
// Calculate keyboard height from the difference between window and viewport
|
|
41
|
-
// On iOS Safari, window.innerHeight may not change, but visualViewport.height does
|
|
42
|
-
const keyboardHeight = Math.max(0, window.innerHeight - viewportHeight - offsetTop);
|
|
43
|
-
|
|
44
|
-
// Set CSS custom properties
|
|
45
|
-
document.documentElement.style.setProperty('--visual-viewport-height', `${viewportHeight}px`);
|
|
46
|
-
document.documentElement.style.setProperty('--keyboard-inset', `${keyboardHeight}px`);
|
|
47
|
-
|
|
48
|
-
// Update keyboard visibility state
|
|
49
|
-
setKeyboardVisible(keyboardHeight > KEYBOARD_THRESHOLD);
|
|
50
|
-
}, []);
|
|
51
|
-
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (typeof window === 'undefined') return;
|
|
54
|
-
|
|
55
|
-
// Initial update (works even without visualViewport)
|
|
56
|
-
updateViewport();
|
|
57
|
-
|
|
58
|
-
const viewport = window.visualViewport;
|
|
59
|
-
if (!viewport) {
|
|
60
|
-
// No Visual Viewport API - just listen to window resize
|
|
61
|
-
window.addEventListener('resize', updateViewport);
|
|
62
|
-
return () => {
|
|
63
|
-
window.removeEventListener('resize', updateViewport);
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Listen for viewport changes (keyboard show/hide, resize, scroll)
|
|
68
|
-
viewport.addEventListener('resize', updateViewport);
|
|
69
|
-
viewport.addEventListener('scroll', updateViewport);
|
|
70
|
-
|
|
71
|
-
// Also listen to window resize as fallback
|
|
72
|
-
window.addEventListener('resize', updateViewport);
|
|
73
|
-
|
|
74
|
-
return () => {
|
|
75
|
-
viewport.removeEventListener('resize', updateViewport);
|
|
76
|
-
viewport.removeEventListener('scroll', updateViewport);
|
|
77
|
-
window.removeEventListener('resize', updateViewport);
|
|
78
|
-
};
|
|
79
|
-
}, [updateViewport]);
|
|
80
|
-
|
|
81
|
-
return keyboardVisible;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Returns current keyboard height in pixels.
|
|
86
|
-
* Useful for imperative checks.
|
|
87
|
-
*/
|
|
88
|
-
export function getKeyboardHeight(): number {
|
|
89
|
-
if (typeof window === 'undefined') return 0;
|
|
90
|
-
|
|
91
|
-
const viewport = window.visualViewport;
|
|
92
|
-
if (!viewport) return 0;
|
|
93
|
-
|
|
94
|
-
const offsetTop = viewport.offsetTop || 0;
|
|
95
|
-
return Math.max(0, window.innerHeight - viewport.height - offsetTop);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Returns whether the keyboard is currently visible.
|
|
100
|
-
* Uses a threshold to avoid false positives from small viewport changes.
|
|
101
|
-
*/
|
|
102
|
-
export function isKeyboardVisible(threshold = 100): boolean {
|
|
103
|
-
return getKeyboardHeight() > threshold;
|
|
104
|
-
}
|