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,217 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Router - manages session lifecycle
|
|
4
|
-
* Always running, spawns sessions on demand
|
|
5
|
-
*
|
|
6
|
-
* Usage: bun router.ts
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { unlinkSync, existsSync } from "fs";
|
|
10
|
-
import { spawn } from "bun";
|
|
11
|
-
import {
|
|
12
|
-
ROUTER_SOCKET,
|
|
13
|
-
SESSION_SOCKET_PREFIX,
|
|
14
|
-
type RouterCommand,
|
|
15
|
-
type RouterResponse,
|
|
16
|
-
type SessionInfo,
|
|
17
|
-
} from "./protocol";
|
|
18
|
-
|
|
19
|
-
// Clean up existing socket
|
|
20
|
-
try { unlinkSync(ROUTER_SOCKET); } catch {}
|
|
21
|
-
|
|
22
|
-
// Active sessions
|
|
23
|
-
const sessions = new Map<string, {
|
|
24
|
-
info: SessionInfo;
|
|
25
|
-
proc: Bun.Subprocess;
|
|
26
|
-
stdin: WritableStream<Uint8Array>;
|
|
27
|
-
}>();
|
|
28
|
-
|
|
29
|
-
// Generate session ID
|
|
30
|
-
function genId(): string {
|
|
31
|
-
return Math.random().toString(36).substring(2, 10);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Find session by project/workspace
|
|
35
|
-
function findSession(project: string, workspace: string) {
|
|
36
|
-
for (const [id, session] of sessions) {
|
|
37
|
-
if (session.info.project === project && session.info.workspace === workspace) {
|
|
38
|
-
return session;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Spawn a new session
|
|
45
|
-
async function createSession(project: string, workspace: string, cwd: string): Promise<SessionInfo> {
|
|
46
|
-
const id = genId();
|
|
47
|
-
const socketPath = `${SESSION_SOCKET_PREFIX}${id}.sock`;
|
|
48
|
-
|
|
49
|
-
const proc = spawn({
|
|
50
|
-
cmd: ["bun", "run", `${import.meta.dir}/session.ts`, socketPath, cwd, project, workspace],
|
|
51
|
-
stdout: "pipe",
|
|
52
|
-
stdin: "pipe",
|
|
53
|
-
stderr: "inherit",
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Wait for ready event
|
|
57
|
-
const reader = proc.stdout.getReader();
|
|
58
|
-
const { value } = await reader.read();
|
|
59
|
-
const ready = JSON.parse(new TextDecoder().decode(value));
|
|
60
|
-
|
|
61
|
-
if (ready.event !== "ready") {
|
|
62
|
-
throw new Error("Session failed to start");
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const info: SessionInfo = {
|
|
66
|
-
id,
|
|
67
|
-
project,
|
|
68
|
-
workspace,
|
|
69
|
-
socketPath,
|
|
70
|
-
pid: ready.pid,
|
|
71
|
-
attached: false,
|
|
72
|
-
createdAt: Date.now(),
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const sessionData = { info, proc, stdin: proc.stdin };
|
|
76
|
-
sessions.set(id, sessionData);
|
|
77
|
-
|
|
78
|
-
// Monitor session stdout for state updates
|
|
79
|
-
(async () => {
|
|
80
|
-
while (true) {
|
|
81
|
-
const { done, value } = await reader.read();
|
|
82
|
-
if (done) break;
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
const lines = new TextDecoder().decode(value).trim().split('\n');
|
|
86
|
-
for (const line of lines) {
|
|
87
|
-
const event = JSON.parse(line);
|
|
88
|
-
if (event.attached !== undefined) {
|
|
89
|
-
const session = sessions.get(id);
|
|
90
|
-
if (session) session.info.attached = event.attached;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
} catch {}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Session ended
|
|
97
|
-
sessions.delete(id);
|
|
98
|
-
console.log(`[router] Session ${id} ended`);
|
|
99
|
-
})();
|
|
100
|
-
|
|
101
|
-
console.log(`[router] Created session ${id} for ${project}/${workspace}`);
|
|
102
|
-
return info;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Kick client from session
|
|
106
|
-
async function kickSession(sessionId: string): Promise<boolean> {
|
|
107
|
-
const session = sessions.get(sessionId);
|
|
108
|
-
if (!session) return false;
|
|
109
|
-
|
|
110
|
-
const writer = session.stdin.getWriter();
|
|
111
|
-
await writer.write(new TextEncoder().encode("kick\n"));
|
|
112
|
-
writer.releaseLock();
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Start router server
|
|
117
|
-
const server = Bun.listen({
|
|
118
|
-
unix: ROUTER_SOCKET,
|
|
119
|
-
socket: {
|
|
120
|
-
async data(socket, data) {
|
|
121
|
-
try {
|
|
122
|
-
const cmd: RouterCommand = JSON.parse(data.toString());
|
|
123
|
-
let response: RouterResponse;
|
|
124
|
-
|
|
125
|
-
switch (cmd.type) {
|
|
126
|
-
case "list":
|
|
127
|
-
response = {
|
|
128
|
-
type: "sessions",
|
|
129
|
-
sessions: Array.from(sessions.values()).map(s => s.info)
|
|
130
|
-
};
|
|
131
|
-
break;
|
|
132
|
-
|
|
133
|
-
case "create": {
|
|
134
|
-
// Check if session already exists for this workspace
|
|
135
|
-
const existing = findSession(cmd.project, cmd.workspace);
|
|
136
|
-
|
|
137
|
-
if (existing) {
|
|
138
|
-
if (existing.info.attached) {
|
|
139
|
-
// Session exists and has a client
|
|
140
|
-
response = { type: "already-attached", session: existing.info };
|
|
141
|
-
} else {
|
|
142
|
-
// Session exists but detached - reuse it
|
|
143
|
-
response = { type: "created", session: existing.info };
|
|
144
|
-
}
|
|
145
|
-
} else {
|
|
146
|
-
// Create new session
|
|
147
|
-
const session = await createSession(cmd.project, cmd.workspace, cmd.cwd);
|
|
148
|
-
response = { type: "created", session };
|
|
149
|
-
}
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
case "attach": {
|
|
154
|
-
const session = sessions.get(cmd.sessionId);
|
|
155
|
-
if (!session) {
|
|
156
|
-
response = { type: "error", message: "Session not found" };
|
|
157
|
-
} else if (session.info.attached && cmd.mode !== "take-over") {
|
|
158
|
-
response = { type: "already-attached", session: session.info };
|
|
159
|
-
} else {
|
|
160
|
-
if (cmd.mode === "take-over" && session.info.attached) {
|
|
161
|
-
await kickSession(cmd.sessionId);
|
|
162
|
-
await Bun.sleep(50); // Let kick propagate
|
|
163
|
-
}
|
|
164
|
-
response = { type: "created", session: session.info };
|
|
165
|
-
}
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
case "kick": {
|
|
170
|
-
const kicked = await kickSession(cmd.sessionId);
|
|
171
|
-
response = kicked ? { type: "ok" } : { type: "error", message: "Session not found" };
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
case "kill": {
|
|
176
|
-
const toKill = sessions.get(cmd.sessionId);
|
|
177
|
-
if (toKill) {
|
|
178
|
-
toKill.proc.kill();
|
|
179
|
-
sessions.delete(cmd.sessionId);
|
|
180
|
-
response = { type: "ok" };
|
|
181
|
-
} else {
|
|
182
|
-
response = { type: "error", message: "Session not found" };
|
|
183
|
-
}
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
default:
|
|
188
|
-
response = { type: "error", message: "Unknown command" };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
socket.write(JSON.stringify(response));
|
|
192
|
-
} catch (e: any) {
|
|
193
|
-
socket.write(JSON.stringify({ type: "error", message: e.message }));
|
|
194
|
-
}
|
|
195
|
-
},
|
|
196
|
-
error(socket, error) {
|
|
197
|
-
console.error("[router] Client error:", error.message);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
console.log(`[router] Listening on ${ROUTER_SOCKET}`);
|
|
203
|
-
console.log("[router] Ready");
|
|
204
|
-
|
|
205
|
-
// Cleanup on exit
|
|
206
|
-
process.on("SIGTERM", () => {
|
|
207
|
-
for (const [id, session] of sessions) {
|
|
208
|
-
session.proc.kill();
|
|
209
|
-
}
|
|
210
|
-
server.stop();
|
|
211
|
-
try { unlinkSync(ROUTER_SOCKET); } catch {}
|
|
212
|
-
process.exit(0);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
process.on("SIGINT", () => {
|
|
216
|
-
process.emit("SIGTERM" as any);
|
|
217
|
-
});
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Session server - manages a single PTY session
|
|
4
|
-
* One client at a time, supports kick for takeover
|
|
5
|
-
*
|
|
6
|
-
* Usage: bun session.ts <socket-path> <cwd> <project> <workspace>
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { unlinkSync } from "fs";
|
|
10
|
-
import {
|
|
11
|
-
encodeControl,
|
|
12
|
-
isControl,
|
|
13
|
-
decodeControl,
|
|
14
|
-
type SessionControl,
|
|
15
|
-
} from "./protocol";
|
|
16
|
-
|
|
17
|
-
const [socketPath, cwd, project, workspace] = process.argv.slice(2);
|
|
18
|
-
|
|
19
|
-
if (!socketPath || !cwd) {
|
|
20
|
-
console.error("Usage: bun session.ts <socket-path> <cwd> <project> <workspace>");
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Clean up existing socket
|
|
25
|
-
try { unlinkSync(socketPath); } catch {}
|
|
26
|
-
|
|
27
|
-
// Scrollback buffer (keep last 50KB)
|
|
28
|
-
const MAX_SCROLLBACK = 50 * 1024;
|
|
29
|
-
let scrollback = Buffer.alloc(0);
|
|
30
|
-
|
|
31
|
-
// Current attached client (only one allowed)
|
|
32
|
-
let client: any = null;
|
|
33
|
-
|
|
34
|
-
// Create PTY
|
|
35
|
-
const terminal = new Bun.Terminal({
|
|
36
|
-
cols: 120,
|
|
37
|
-
rows: 40,
|
|
38
|
-
data(term, data) {
|
|
39
|
-
// Add to scrollback
|
|
40
|
-
scrollback = Buffer.concat([scrollback, data]);
|
|
41
|
-
if (scrollback.length > MAX_SCROLLBACK) {
|
|
42
|
-
scrollback = scrollback.subarray(-MAX_SCROLLBACK);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Send to attached client
|
|
46
|
-
if (client) {
|
|
47
|
-
client.write(data);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// Spawn shell
|
|
53
|
-
const proc = Bun.spawn(["bash"], {
|
|
54
|
-
terminal,
|
|
55
|
-
cwd,
|
|
56
|
-
env: {
|
|
57
|
-
...process.env,
|
|
58
|
-
SPACES_PROJECT: project,
|
|
59
|
-
SPACES_WORKSPACE: workspace,
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// Handle shell exit
|
|
64
|
-
proc.exited.then(code => {
|
|
65
|
-
if (client) {
|
|
66
|
-
client.write(encodeControl({ type: "exited", code }));
|
|
67
|
-
}
|
|
68
|
-
// Give client time to receive exit message
|
|
69
|
-
setTimeout(() => {
|
|
70
|
-
server.stop();
|
|
71
|
-
try { unlinkSync(socketPath); } catch {}
|
|
72
|
-
process.exit(code);
|
|
73
|
-
}, 100);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Report state to router
|
|
77
|
-
function reportState(event: string) {
|
|
78
|
-
console.log(JSON.stringify({ event, attached: client !== null }));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Kick current client
|
|
82
|
-
function kickClient() {
|
|
83
|
-
if (client) {
|
|
84
|
-
client.write(encodeControl({ type: "kicked" }));
|
|
85
|
-
client.end();
|
|
86
|
-
client = null;
|
|
87
|
-
reportState("client_kicked");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Start server
|
|
92
|
-
const server = Bun.listen({
|
|
93
|
-
unix: socketPath,
|
|
94
|
-
socket: {
|
|
95
|
-
open(socket) {
|
|
96
|
-
if (client) {
|
|
97
|
-
// Already have a client - kick them
|
|
98
|
-
kickClient();
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
client = socket;
|
|
102
|
-
reportState("client_attached");
|
|
103
|
-
|
|
104
|
-
// Send scrollback to new client
|
|
105
|
-
const attachMsg = encodeControl({
|
|
106
|
-
type: "attached",
|
|
107
|
-
scrollback: scrollback.toString("base64")
|
|
108
|
-
});
|
|
109
|
-
socket.write(attachMsg);
|
|
110
|
-
},
|
|
111
|
-
|
|
112
|
-
data(socket, data) {
|
|
113
|
-
const buf = Buffer.from(data);
|
|
114
|
-
|
|
115
|
-
if (isControl(buf)) {
|
|
116
|
-
const ctrl = decodeControl(buf) as SessionControl;
|
|
117
|
-
|
|
118
|
-
switch (ctrl.type) {
|
|
119
|
-
case "resize":
|
|
120
|
-
terminal.resize(ctrl.cols, ctrl.rows);
|
|
121
|
-
break;
|
|
122
|
-
case "detach":
|
|
123
|
-
if (socket === client) {
|
|
124
|
-
client = null;
|
|
125
|
-
reportState("client_detached");
|
|
126
|
-
}
|
|
127
|
-
socket.end();
|
|
128
|
-
break;
|
|
129
|
-
case "ping":
|
|
130
|
-
socket.write(encodeControl({ type: "pong" }));
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
} else {
|
|
134
|
-
// Raw input - write to PTY
|
|
135
|
-
terminal.write(buf);
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
close(socket) {
|
|
140
|
-
if (socket === client) {
|
|
141
|
-
client = null;
|
|
142
|
-
reportState("client_disconnected");
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
error(socket, error) {
|
|
147
|
-
console.error(JSON.stringify({ event: "error", message: error.message }));
|
|
148
|
-
if (socket === client) {
|
|
149
|
-
client = null;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
console.log(JSON.stringify({
|
|
156
|
-
event: "ready",
|
|
157
|
-
socketPath,
|
|
158
|
-
pid: process.pid,
|
|
159
|
-
project,
|
|
160
|
-
workspace,
|
|
161
|
-
attached: false
|
|
162
|
-
}));
|
|
163
|
-
|
|
164
|
-
// Handle stdin commands from router (for kick)
|
|
165
|
-
const decoder = new TextDecoder();
|
|
166
|
-
for await (const chunk of Bun.stdin.stream()) {
|
|
167
|
-
const cmd = decoder.decode(chunk).trim();
|
|
168
|
-
if (cmd === "kick") {
|
|
169
|
-
kickClient();
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Handle termination
|
|
174
|
-
process.on("SIGTERM", () => {
|
|
175
|
-
proc.kill();
|
|
176
|
-
terminal.close();
|
|
177
|
-
server.stop();
|
|
178
|
-
try { unlinkSync(socketPath); } catch {}
|
|
179
|
-
process.exit(0);
|
|
180
|
-
});
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Test router + session architecture (single client per session)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
ROUTER_SOCKET,
|
|
8
|
-
type RouterCommand,
|
|
9
|
-
type RouterResponse,
|
|
10
|
-
encodeControl,
|
|
11
|
-
isControl,
|
|
12
|
-
decodeControl,
|
|
13
|
-
type SessionEvent,
|
|
14
|
-
} from "./protocol";
|
|
15
|
-
|
|
16
|
-
async function routerCommand(cmd: RouterCommand): Promise<RouterResponse> {
|
|
17
|
-
return new Promise(async (resolve, reject) => {
|
|
18
|
-
const socket = await Bun.connect({
|
|
19
|
-
unix: ROUTER_SOCKET,
|
|
20
|
-
socket: {
|
|
21
|
-
data(socket, data) {
|
|
22
|
-
resolve(JSON.parse(data.toString()));
|
|
23
|
-
socket.end();
|
|
24
|
-
},
|
|
25
|
-
error(socket, error) {
|
|
26
|
-
reject(error);
|
|
27
|
-
},
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
socket.write(JSON.stringify(cmd));
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
console.log("=== Testing Router Architecture (Single Client) ===\n");
|
|
35
|
-
|
|
36
|
-
// 1. Create a session
|
|
37
|
-
console.log("1. Create session test/workspace-1");
|
|
38
|
-
const create1 = await routerCommand({
|
|
39
|
-
type: "create",
|
|
40
|
-
project: "test",
|
|
41
|
-
workspace: "workspace-1",
|
|
42
|
-
cwd: process.cwd()
|
|
43
|
-
});
|
|
44
|
-
console.log(" Response:", create1.type);
|
|
45
|
-
if (create1.type !== "created") process.exit(1);
|
|
46
|
-
const session1 = create1.session;
|
|
47
|
-
|
|
48
|
-
// 2. Connect a client
|
|
49
|
-
console.log("\n2. Connect client to session");
|
|
50
|
-
let client1Kicked = false;
|
|
51
|
-
const client1 = await Bun.connect({
|
|
52
|
-
unix: session1.socketPath,
|
|
53
|
-
socket: {
|
|
54
|
-
data(socket, data) {
|
|
55
|
-
const buf = Buffer.from(data);
|
|
56
|
-
if (isControl(buf)) {
|
|
57
|
-
const event = decodeControl(buf) as SessionEvent;
|
|
58
|
-
if (event.type === "kicked") {
|
|
59
|
-
client1Kicked = true;
|
|
60
|
-
console.log(" Client 1 received: kicked");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
await Bun.sleep(100);
|
|
67
|
-
|
|
68
|
-
// 3. Check attached state
|
|
69
|
-
console.log("\n3. Check session is attached");
|
|
70
|
-
const list1 = await routerCommand({ type: "list" });
|
|
71
|
-
const attached = (list1 as any).sessions[0]?.attached;
|
|
72
|
-
console.log(" Attached:", attached ? "✓" : "✗");
|
|
73
|
-
|
|
74
|
-
// 4. Try to create same session again (should return already-attached)
|
|
75
|
-
console.log("\n4. Try to create same session again");
|
|
76
|
-
const create2 = await routerCommand({
|
|
77
|
-
type: "create",
|
|
78
|
-
project: "test",
|
|
79
|
-
workspace: "workspace-1",
|
|
80
|
-
cwd: process.cwd()
|
|
81
|
-
});
|
|
82
|
-
console.log(" Response:", create2.type, create2.type === "already-attached" ? "✓" : "✗");
|
|
83
|
-
|
|
84
|
-
// 5. Take over with kick
|
|
85
|
-
console.log("\n5. Take over session (kick client 1)");
|
|
86
|
-
const attach = await routerCommand({
|
|
87
|
-
type: "attach",
|
|
88
|
-
sessionId: session1.id,
|
|
89
|
-
mode: "take-over"
|
|
90
|
-
});
|
|
91
|
-
console.log(" Response:", attach.type);
|
|
92
|
-
await Bun.sleep(100);
|
|
93
|
-
console.log(" Client 1 was kicked:", client1Kicked ? "✓" : "✗");
|
|
94
|
-
|
|
95
|
-
// 6. Connect new client after kick
|
|
96
|
-
console.log("\n6. Connect new client after kick");
|
|
97
|
-
const client2 = await Bun.connect({
|
|
98
|
-
unix: session1.socketPath,
|
|
99
|
-
socket: { data() {} }
|
|
100
|
-
});
|
|
101
|
-
await Bun.sleep(100);
|
|
102
|
-
|
|
103
|
-
// 7. Detach client 2, check session still exists
|
|
104
|
-
console.log("\n7. Detach client 2");
|
|
105
|
-
client2.write(encodeControl({ type: "detach" }));
|
|
106
|
-
await Bun.sleep(100);
|
|
107
|
-
|
|
108
|
-
const list2 = await routerCommand({ type: "list" });
|
|
109
|
-
const stillExists = (list2 as any).sessions.length === 1;
|
|
110
|
-
const nowDetached = !(list2 as any).sessions[0]?.attached;
|
|
111
|
-
console.log(" Session still exists:", stillExists ? "✓" : "✗");
|
|
112
|
-
console.log(" Now detached:", nowDetached ? "✓" : "✗");
|
|
113
|
-
|
|
114
|
-
// 8. Reattach to detached session (no prompt needed)
|
|
115
|
-
console.log("\n8. Reattach to detached session");
|
|
116
|
-
const create3 = await routerCommand({
|
|
117
|
-
type: "create",
|
|
118
|
-
project: "test",
|
|
119
|
-
workspace: "workspace-1",
|
|
120
|
-
cwd: process.cwd()
|
|
121
|
-
});
|
|
122
|
-
console.log(" Response:", create3.type, create3.type === "created" ? "✓" : "✗");
|
|
123
|
-
|
|
124
|
-
// 9. Clean up
|
|
125
|
-
console.log("\n9. Kill session");
|
|
126
|
-
const kill = await routerCommand({ type: "kill", sessionId: session1.id });
|
|
127
|
-
console.log(" Response:", kill.type);
|
|
128
|
-
|
|
129
|
-
const list3 = await routerCommand({ type: "list" });
|
|
130
|
-
console.log(" Sessions remaining:", (list3 as any).sessions.length);
|
|
131
|
-
|
|
132
|
-
console.log("\n=== Test Complete ===");
|
|
133
|
-
process.exit(0);
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unix socket bandwidth test
|
|
3
|
-
* How much can we push through a single socket?
|
|
4
|
-
*/
|
|
5
|
-
import { unlinkSync } from "fs";
|
|
6
|
-
|
|
7
|
-
const SOCKET_PATH = "/tmp/spaces-bw.sock";
|
|
8
|
-
try { unlinkSync(SOCKET_PATH); } catch {}
|
|
9
|
-
|
|
10
|
-
const CHUNK_SIZE = 64 * 1024; // 64KB chunks
|
|
11
|
-
const TEST_DURATION_MS = 2000;
|
|
12
|
-
|
|
13
|
-
let totalBytes = 0;
|
|
14
|
-
let messageCount = 0;
|
|
15
|
-
|
|
16
|
-
const server = Bun.listen({
|
|
17
|
-
unix: SOCKET_PATH,
|
|
18
|
-
socket: {
|
|
19
|
-
data(socket, data) {
|
|
20
|
-
totalBytes += data.byteLength;
|
|
21
|
-
messageCount++;
|
|
22
|
-
// Echo back (simulates bidirectional)
|
|
23
|
-
socket.write(data);
|
|
24
|
-
},
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
await Bun.sleep(50);
|
|
29
|
-
|
|
30
|
-
const chunk = Buffer.alloc(CHUNK_SIZE, "x");
|
|
31
|
-
let clientReceived = 0;
|
|
32
|
-
|
|
33
|
-
const client = await Bun.connect({
|
|
34
|
-
unix: SOCKET_PATH,
|
|
35
|
-
socket: {
|
|
36
|
-
data(socket, data) {
|
|
37
|
-
clientReceived += data.byteLength;
|
|
38
|
-
},
|
|
39
|
-
drain(socket) {
|
|
40
|
-
// Socket ready for more data - keep pumping
|
|
41
|
-
socket.write(chunk);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
console.log("Testing Unix socket bandwidth (bidirectional)...\n");
|
|
47
|
-
|
|
48
|
-
const start = performance.now();
|
|
49
|
-
|
|
50
|
-
// Prime the pump
|
|
51
|
-
for (let i = 0; i < 100; i++) {
|
|
52
|
-
client.write(chunk);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
await Bun.sleep(TEST_DURATION_MS);
|
|
56
|
-
|
|
57
|
-
const elapsed = (performance.now() - start) / 1000;
|
|
58
|
-
const serverThroughput = (totalBytes / 1024 / 1024) / elapsed;
|
|
59
|
-
const clientThroughput = (clientReceived / 1024 / 1024) / elapsed;
|
|
60
|
-
|
|
61
|
-
console.log("=== Single Socket Bandwidth ===");
|
|
62
|
-
console.log(`Server received: ${(totalBytes / 1024 / 1024).toFixed(0)} MB`);
|
|
63
|
-
console.log(`Client received: ${(clientReceived / 1024 / 1024).toFixed(0)} MB`);
|
|
64
|
-
console.log(`Server throughput: ${serverThroughput.toFixed(0)} MB/s`);
|
|
65
|
-
console.log(`Client throughput: ${clientThroughput.toFixed(0)} MB/s`);
|
|
66
|
-
console.log(`Messages: ${messageCount}`);
|
|
67
|
-
console.log(`Avg chunk: ${(totalBytes / messageCount / 1024).toFixed(1)} KB`);
|
|
68
|
-
|
|
69
|
-
// Context
|
|
70
|
-
console.log("\n=== Context ===");
|
|
71
|
-
console.log(`4K terminal @ 60fps: ~${(4000 * 60 * 60 / 1024 / 1024).toFixed(1)} MB/s worst case`);
|
|
72
|
-
console.log(`Typical terminal use: < 1 MB/s`);
|
|
73
|
-
console.log(`10 concurrent sessions: < 10 MB/s`);
|
|
74
|
-
|
|
75
|
-
server.stop();
|
|
76
|
-
client.end();
|
|
77
|
-
try { unlinkSync(SOCKET_PATH); } catch {}
|
package/homebrew/gitspace.rb
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Homebrew formula for GitSpace CLI (gssh)
|
|
2
|
-
#
|
|
3
|
-
# To install from a tap:
|
|
4
|
-
# brew tap inkibra/gitspace
|
|
5
|
-
# brew install gitspace
|
|
6
|
-
#
|
|
7
|
-
# Or install directly from this file:
|
|
8
|
-
# brew install --formula homebrew/gitspace.rb
|
|
9
|
-
|
|
10
|
-
class Gitspace < Formula
|
|
11
|
-
desc "CLI for managing GitHub workspaces with git worktrees and secure remote terminal access"
|
|
12
|
-
homepage "https://gitspace.sh"
|
|
13
|
-
version "0.1.5"
|
|
14
|
-
license "SEE LICENSE IN LICENSE"
|
|
15
|
-
|
|
16
|
-
on_macos do
|
|
17
|
-
on_arm do
|
|
18
|
-
url "https://github.com/inkibra/gitspace.sh/releases/download/v#{version}/gssh-darwin-arm64.tar.gz"
|
|
19
|
-
# sha256 "REPLACE_WITH_ACTUAL_SHA256"
|
|
20
|
-
end
|
|
21
|
-
on_intel do
|
|
22
|
-
url "https://github.com/inkibra/gitspace.sh/releases/download/v#{version}/gssh-darwin-x64.tar.gz"
|
|
23
|
-
# sha256 "REPLACE_WITH_ACTUAL_SHA256"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
on_linux do
|
|
28
|
-
on_arm do
|
|
29
|
-
url "https://github.com/inkibra/gitspace.sh/releases/download/v#{version}/gssh-linux-arm64.tar.gz"
|
|
30
|
-
# sha256 "REPLACE_WITH_ACTUAL_SHA256"
|
|
31
|
-
end
|
|
32
|
-
on_intel do
|
|
33
|
-
url "https://github.com/inkibra/gitspace.sh/releases/download/v#{version}/gssh-linux-x64.tar.gz"
|
|
34
|
-
# sha256 "REPLACE_WITH_ACTUAL_SHA256"
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def install
|
|
39
|
-
bin.install "gssh"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
test do
|
|
43
|
-
assert_match "gssh", shell_output("#{bin}/gssh --version")
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md).
|
|
2
|
-
|
|
3
|
-
This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license).
|
package/landing-page/README.md
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
# Landing Page Design
|
|
3
|
-
|
|
4
|
-
This is a code bundle for Landing Page Design. The original project is available at https://www.figma.com/design/X1VjullY3NR4Kh5s63m6JS/Landing-Page-Design.
|
|
5
|
-
|
|
6
|
-
## Running the code
|
|
7
|
-
|
|
8
|
-
Run `npm i` to install the dependencies.
|
|
9
|
-
|
|
10
|
-
Run `npm run dev` to start the development server.
|
|
11
|
-
|