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,350 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useNotifications Hook
|
|
3
|
-
*
|
|
4
|
-
* Shared hook for managing notification toasts and quick-attach.
|
|
5
|
-
* Works with both TUI and Web by accepting platform-specific callbacks.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Show toasts for new inbox items
|
|
9
|
-
* - Hold toasts when user is inactive (latest per session)
|
|
10
|
-
* - Auto-dismiss notifications for the current active session
|
|
11
|
-
* - Flush held toasts when user becomes active
|
|
12
|
-
* - Auto-dismiss held toasts on session detach
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
16
|
-
import type { InboxItem } from '../lib/remote-session/protocol.js';
|
|
17
|
-
import type { NotificationConfig, ToastNotification } from './types.js';
|
|
18
|
-
import { DEFAULT_NOTIFICATION_CONFIG } from './types.js';
|
|
19
|
-
import { diffInbox, getToastableItems, getMostRecentUnread } from './policy.js';
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Get the "skeleton" of a title by keeping only letters and spaces.
|
|
23
|
-
* Used to detect when title changes are just counter/progress/animation updates.
|
|
24
|
-
*
|
|
25
|
-
* Examples:
|
|
26
|
-
* "htop - 12:00:01" → "htop"
|
|
27
|
-
* "CPU: 45%" → "cpu"
|
|
28
|
-
* "Building... 3/10" → "building"
|
|
29
|
-
* "⠋ Loading..." → "loading"
|
|
30
|
-
*/
|
|
31
|
-
function getTitleSkeleton(title: string): string {
|
|
32
|
-
return title
|
|
33
|
-
.toLowerCase()
|
|
34
|
-
.replace(/[^a-z\s]/g, '') // Keep only letters and spaces
|
|
35
|
-
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
36
|
-
.trim();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Check if two titles are semantically different (not just counter updates).
|
|
41
|
-
*/
|
|
42
|
-
function isTitleSignificantlyDifferent(prev: string, curr: string): boolean {
|
|
43
|
-
if (!prev || !curr) return true;
|
|
44
|
-
return getTitleSkeleton(prev) !== getTitleSkeleton(curr);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Per-session debounce interval (ms)
|
|
48
|
-
const TOAST_DEBOUNCE_MS = 15000;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Options for useNotifications hook
|
|
52
|
-
*/
|
|
53
|
-
export interface UseNotificationsOptions {
|
|
54
|
-
/** Current inbox items */
|
|
55
|
-
items: InboxItem[];
|
|
56
|
-
/** Notification config */
|
|
57
|
-
config?: NotificationConfig;
|
|
58
|
-
/** Callback when a toast should be shown */
|
|
59
|
-
onShowToast?: (notification: ToastNotification) => void;
|
|
60
|
-
/** Callback to attach to a session */
|
|
61
|
-
onAttachSession?: (sessionId: string) => void;
|
|
62
|
-
/** Callback to mark an inbox item as read (for auto-dismiss) */
|
|
63
|
-
onMarkRead?: (itemId: string) => Promise<void>;
|
|
64
|
-
/** Polling interval in ms (0 to disable) */
|
|
65
|
-
pollIntervalMs?: number;
|
|
66
|
-
/** Callback to refresh inbox */
|
|
67
|
-
onRefreshInbox?: () => Promise<void>;
|
|
68
|
-
/** Whether user is currently active (for holding toasts). Default: true */
|
|
69
|
-
isUserActive?: boolean;
|
|
70
|
-
/** Session ID user is currently attached to (skip/auto-dismiss toasts for this session) */
|
|
71
|
-
currentSessionId?: string;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Return type for useNotifications hook
|
|
76
|
-
*/
|
|
77
|
-
export interface UseNotificationsReturn {
|
|
78
|
-
/** Currently visible toast (for hotkey handling) */
|
|
79
|
-
activeToast: ToastNotification | null;
|
|
80
|
-
/** Clear the active toast */
|
|
81
|
-
clearActiveToast: () => void;
|
|
82
|
-
/** Attach to the active toast's session (for hotkey) */
|
|
83
|
-
attachToActiveToast: () => void;
|
|
84
|
-
/** Get most recent unread item */
|
|
85
|
-
mostRecentUnread: InboxItem | null;
|
|
86
|
-
/** Number of toasts shown since mount */
|
|
87
|
-
toastCount: number;
|
|
88
|
-
/** Number of toasts currently held (waiting for activity) */
|
|
89
|
-
heldCount: number;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Hook for managing notification toasts
|
|
94
|
-
*
|
|
95
|
-
* Tracks inbox changes and triggers toast callbacks for new items.
|
|
96
|
-
* Maintains an "active toast" reference for quick-attach via hotkey.
|
|
97
|
-
*
|
|
98
|
-
* @example
|
|
99
|
-
* ```tsx
|
|
100
|
-
* const notifications = useNotifications({
|
|
101
|
-
* items: inbox,
|
|
102
|
-
* config: notificationConfig,
|
|
103
|
-
* onShowToast: (toast) => {
|
|
104
|
-
* sonner.info(toast.title, { description: toast.preview });
|
|
105
|
-
* },
|
|
106
|
-
* onAttachSession: (sessionId) => {
|
|
107
|
-
* terminal.attachSession({ sessionId });
|
|
108
|
-
* },
|
|
109
|
-
* onMarkRead: async (itemId) => {
|
|
110
|
-
* await markInboxRead(itemId);
|
|
111
|
-
* },
|
|
112
|
-
* isUserActive,
|
|
113
|
-
* currentSessionId: attachedSession?.id,
|
|
114
|
-
* });
|
|
115
|
-
* ```
|
|
116
|
-
*/
|
|
117
|
-
export function useNotifications(
|
|
118
|
-
options: UseNotificationsOptions
|
|
119
|
-
): UseNotificationsReturn {
|
|
120
|
-
const {
|
|
121
|
-
items,
|
|
122
|
-
config = DEFAULT_NOTIFICATION_CONFIG,
|
|
123
|
-
onShowToast,
|
|
124
|
-
onAttachSession,
|
|
125
|
-
onMarkRead,
|
|
126
|
-
pollIntervalMs = 0,
|
|
127
|
-
onRefreshInbox,
|
|
128
|
-
isUserActive = true,
|
|
129
|
-
currentSessionId,
|
|
130
|
-
} = options;
|
|
131
|
-
|
|
132
|
-
// Track previous inbox items for diffing
|
|
133
|
-
const prevItemsRef = useRef<InboxItem[]>([]);
|
|
134
|
-
|
|
135
|
-
// Track previous session ID to detect detach
|
|
136
|
-
const prevSessionIdRef = useRef<string | undefined>(undefined);
|
|
137
|
-
|
|
138
|
-
// Track previous isUserActive to detect activity resumption
|
|
139
|
-
const prevIsUserActiveRef = useRef<boolean>(true);
|
|
140
|
-
|
|
141
|
-
// Active toast (most recent, for hotkey attach)
|
|
142
|
-
const [activeToast, setActiveToast] = useState<ToastNotification | null>(null);
|
|
143
|
-
|
|
144
|
-
// Toast count for debugging/stats
|
|
145
|
-
const [toastCount, setToastCount] = useState(0);
|
|
146
|
-
|
|
147
|
-
// Held toasts (sessionId -> latest toast) - waiting for user to become active
|
|
148
|
-
const heldToastsRef = useRef<Map<string, ToastNotification>>(new Map());
|
|
149
|
-
const [heldCount, setHeldCount] = useState(0);
|
|
150
|
-
|
|
151
|
-
// Timer ref for clearing active toast
|
|
152
|
-
const clearTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
153
|
-
|
|
154
|
-
// Per-session debounce tracking (sessionId -> last toast timestamp)
|
|
155
|
-
const lastToastTimeRef = useRef<Map<string, number>>(new Map());
|
|
156
|
-
|
|
157
|
-
// Last seen title per session (for filtering minor title changes)
|
|
158
|
-
const lastTitleRef = useRef<Map<string, string>>(new Map());
|
|
159
|
-
|
|
160
|
-
// Clear active toast after a delay (e.g., 10 seconds)
|
|
161
|
-
const TOAST_ACTIVE_DURATION_MS = 10000;
|
|
162
|
-
|
|
163
|
-
const clearActiveToast = useCallback(() => {
|
|
164
|
-
if (clearTimerRef.current) {
|
|
165
|
-
clearTimeout(clearTimerRef.current);
|
|
166
|
-
clearTimerRef.current = null;
|
|
167
|
-
}
|
|
168
|
-
setActiveToast(null);
|
|
169
|
-
}, []);
|
|
170
|
-
|
|
171
|
-
const attachToActiveToast = useCallback(() => {
|
|
172
|
-
if (activeToast && onAttachSession) {
|
|
173
|
-
onAttachSession(activeToast.sessionId);
|
|
174
|
-
clearActiveToast();
|
|
175
|
-
}
|
|
176
|
-
}, [activeToast, onAttachSession, clearActiveToast]);
|
|
177
|
-
|
|
178
|
-
// Helper to show a toast and update state
|
|
179
|
-
const showToast = useCallback((toast: ToastNotification) => {
|
|
180
|
-
onShowToast?.(toast);
|
|
181
|
-
setToastCount((c) => c + 1);
|
|
182
|
-
setActiveToast(toast);
|
|
183
|
-
|
|
184
|
-
// Clear active toast after timeout
|
|
185
|
-
if (clearTimerRef.current) {
|
|
186
|
-
clearTimeout(clearTimerRef.current);
|
|
187
|
-
}
|
|
188
|
-
clearTimerRef.current = setTimeout(() => {
|
|
189
|
-
setActiveToast(null);
|
|
190
|
-
}, TOAST_ACTIVE_DURATION_MS);
|
|
191
|
-
}, [onShowToast]);
|
|
192
|
-
|
|
193
|
-
// Helper to auto-dismiss a notification
|
|
194
|
-
const autoDismiss = useCallback(async (itemId: string) => {
|
|
195
|
-
if (onMarkRead) {
|
|
196
|
-
try {
|
|
197
|
-
await onMarkRead(itemId);
|
|
198
|
-
} catch {
|
|
199
|
-
// Ignore errors - notification is best-effort
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}, [onMarkRead]);
|
|
203
|
-
|
|
204
|
-
// Detect session detach and auto-dismiss held toasts for that session
|
|
205
|
-
useEffect(() => {
|
|
206
|
-
const prevSessionId = prevSessionIdRef.current;
|
|
207
|
-
prevSessionIdRef.current = currentSessionId;
|
|
208
|
-
|
|
209
|
-
// If we just detached from a session (had a session, now don't or different)
|
|
210
|
-
if (prevSessionId && prevSessionId !== currentSessionId) {
|
|
211
|
-
// Auto-dismiss any held toasts for the detached session
|
|
212
|
-
const heldForSession = heldToastsRef.current.get(prevSessionId);
|
|
213
|
-
if (heldForSession) {
|
|
214
|
-
autoDismiss(heldForSession.id);
|
|
215
|
-
heldToastsRef.current.delete(prevSessionId);
|
|
216
|
-
setHeldCount(heldToastsRef.current.size);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}, [currentSessionId, autoDismiss]);
|
|
220
|
-
|
|
221
|
-
// Detect activity resumption and flush held toasts
|
|
222
|
-
useEffect(() => {
|
|
223
|
-
const wasActive = prevIsUserActiveRef.current;
|
|
224
|
-
prevIsUserActiveRef.current = isUserActive;
|
|
225
|
-
|
|
226
|
-
// If user just became active (was inactive, now active)
|
|
227
|
-
if (!wasActive && isUserActive && heldToastsRef.current.size > 0) {
|
|
228
|
-
// Get held toasts, excluding current session
|
|
229
|
-
const toastsToShow = Array.from(heldToastsRef.current.entries())
|
|
230
|
-
.filter(([sessionId]) => sessionId !== currentSessionId)
|
|
231
|
-
.map(([, toast]) => toast)
|
|
232
|
-
.sort((a, b) => a.timestamp - b.timestamp);
|
|
233
|
-
|
|
234
|
-
// Auto-dismiss held toasts for current session (if any)
|
|
235
|
-
if (currentSessionId) {
|
|
236
|
-
const currentSessionToast = heldToastsRef.current.get(currentSessionId);
|
|
237
|
-
if (currentSessionToast) {
|
|
238
|
-
autoDismiss(currentSessionToast.id);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Clear held toasts
|
|
243
|
-
heldToastsRef.current.clear();
|
|
244
|
-
setHeldCount(0);
|
|
245
|
-
|
|
246
|
-
// Show the flushed toasts (update debounce tracking)
|
|
247
|
-
const now = Date.now();
|
|
248
|
-
for (const toast of toastsToShow) {
|
|
249
|
-
lastToastTimeRef.current.set(toast.sessionId, now);
|
|
250
|
-
showToast(toast);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}, [isUserActive, currentSessionId, showToast, autoDismiss]);
|
|
254
|
-
|
|
255
|
-
// Detect new items and handle them based on activity state
|
|
256
|
-
useEffect(() => {
|
|
257
|
-
if (!config.enabled || !config.toast.enabled) {
|
|
258
|
-
prevItemsRef.current = items;
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const diff = diffInbox(prevItemsRef.current, items);
|
|
263
|
-
prevItemsRef.current = items;
|
|
264
|
-
|
|
265
|
-
if (diff.added.length === 0) return;
|
|
266
|
-
|
|
267
|
-
const toastable = getToastableItems(diff.added, config);
|
|
268
|
-
if (toastable.length === 0) return;
|
|
269
|
-
|
|
270
|
-
const holdWhenIdleMs = config.toast.holdWhenIdleMs || 0;
|
|
271
|
-
const shouldHold = holdWhenIdleMs > 0 && !isUserActive;
|
|
272
|
-
|
|
273
|
-
for (const toast of toastable) {
|
|
274
|
-
const now = Date.now();
|
|
275
|
-
|
|
276
|
-
// Per-session debounce: skip if we showed a toast for this session within 15s
|
|
277
|
-
const lastTime = lastToastTimeRef.current.get(toast.sessionId) || 0;
|
|
278
|
-
if (now - lastTime < TOAST_DEBOUNCE_MS) {
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// For title notifications, check if significantly different from last seen
|
|
283
|
-
if (toast.item.type === 'title') {
|
|
284
|
-
const lastTitle = lastTitleRef.current.get(toast.sessionId) || '';
|
|
285
|
-
const newTitle = toast.item.context || '';
|
|
286
|
-
if (!isTitleSignificantlyDifferent(lastTitle, newTitle)) {
|
|
287
|
-
// Update last title but don't show toast
|
|
288
|
-
lastTitleRef.current.set(toast.sessionId, newTitle);
|
|
289
|
-
continue;
|
|
290
|
-
}
|
|
291
|
-
lastTitleRef.current.set(toast.sessionId, newTitle);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Case 1: Notification is for the session user is actively watching
|
|
295
|
-
if (currentSessionId && toast.sessionId === currentSessionId) {
|
|
296
|
-
if (isUserActive) {
|
|
297
|
-
// User is actively watching this session - auto-dismiss
|
|
298
|
-
autoDismiss(toast.id);
|
|
299
|
-
} else {
|
|
300
|
-
// User is attached but inactive - hold it
|
|
301
|
-
heldToastsRef.current.set(toast.sessionId, toast);
|
|
302
|
-
setHeldCount(heldToastsRef.current.size);
|
|
303
|
-
}
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// Case 2: Notification is for a different session
|
|
308
|
-
if (shouldHold) {
|
|
309
|
-
// User is inactive - hold toast (latest per session)
|
|
310
|
-
heldToastsRef.current.set(toast.sessionId, toast);
|
|
311
|
-
setHeldCount(heldToastsRef.current.size);
|
|
312
|
-
} else {
|
|
313
|
-
// User is active - show toast immediately
|
|
314
|
-
lastToastTimeRef.current.set(toast.sessionId, now);
|
|
315
|
-
showToast(toast);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}, [items, config, isUserActive, currentSessionId, showToast, autoDismiss]);
|
|
319
|
-
|
|
320
|
-
// Polling for inbox refresh
|
|
321
|
-
useEffect(() => {
|
|
322
|
-
if (pollIntervalMs <= 0 || !onRefreshInbox) return;
|
|
323
|
-
|
|
324
|
-
const interval = setInterval(() => {
|
|
325
|
-
onRefreshInbox();
|
|
326
|
-
}, pollIntervalMs);
|
|
327
|
-
|
|
328
|
-
return () => clearInterval(interval);
|
|
329
|
-
}, [pollIntervalMs, onRefreshInbox]);
|
|
330
|
-
|
|
331
|
-
// Cleanup timer on unmount
|
|
332
|
-
useEffect(() => {
|
|
333
|
-
return () => {
|
|
334
|
-
if (clearTimerRef.current) {
|
|
335
|
-
clearTimeout(clearTimerRef.current);
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
}, []);
|
|
339
|
-
|
|
340
|
-
const mostRecentUnread = getMostRecentUnread(items);
|
|
341
|
-
|
|
342
|
-
return {
|
|
343
|
-
activeToast,
|
|
344
|
-
clearActiveToast,
|
|
345
|
-
attachToActiveToast,
|
|
346
|
-
mostRecentUnread,
|
|
347
|
-
toastCount,
|
|
348
|
-
heldCount,
|
|
349
|
-
};
|
|
350
|
-
}
|