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,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Process command tests - validates error paths throw SpacesError with exit code 1
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, expect, it, mock, beforeEach } from 'bun:test';
|
|
6
|
-
import { SpacesError } from '../../types/errors.js';
|
|
7
|
-
import type { ProcessInstanceSpec } from '../../types/processes.js';
|
|
8
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
9
|
-
import { join } from 'node:path';
|
|
10
|
-
import { tmpdir } from 'node:os';
|
|
11
|
-
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// Mocks
|
|
14
|
-
// ============================================================================
|
|
15
|
-
|
|
16
|
-
// Mock tmux-lite CLI
|
|
17
|
-
const mockListSessions = mock<() => Promise<Array<{ id: string; name: string; cwd: string }>>>(
|
|
18
|
-
() => Promise.resolve([])
|
|
19
|
-
);
|
|
20
|
-
mock.module('../../lib/tmux-lite/cli.js', () => ({
|
|
21
|
-
listSessions: mockListSessions,
|
|
22
|
-
createSession: mock(() => Promise.resolve({ id: 'sess-1', name: 'test' })),
|
|
23
|
-
killSession: mock(() => Promise.resolve()),
|
|
24
|
-
}));
|
|
25
|
-
|
|
26
|
-
// Mock process manager
|
|
27
|
-
const mockGetProcessSpecs = mock<(workspacePath: string) => ProcessInstanceSpec[]>(() => []);
|
|
28
|
-
const mockStartProcessInstance = mock(() => Promise.resolve({ sessionId: 'sess-1', created: true }));
|
|
29
|
-
const mockStopProcessInstance = mock(() => Promise.resolve());
|
|
30
|
-
const mockListProcessSessions = mock<
|
|
31
|
-
() => Promise<Array<{ sessionId: string; processName: string; instance: number; name: string; workspacePath: string }>>
|
|
32
|
-
>(() => Promise.resolve([]));
|
|
33
|
-
|
|
34
|
-
mock.module('../../lib/processes/manager.js', () => ({
|
|
35
|
-
getProcessSpecs: mockGetProcessSpecs,
|
|
36
|
-
startProcessInstance: mockStartProcessInstance,
|
|
37
|
-
stopProcessInstance: mockStopProcessInstance,
|
|
38
|
-
listProcessSessions: mockListProcessSessions,
|
|
39
|
-
}));
|
|
40
|
-
|
|
41
|
-
// Import after mocking
|
|
42
|
-
const { listProcesses, startProcess, stopProcess, attachProcess } = await import('../process.js');
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// startProcess
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
describe('startProcess', () => {
|
|
49
|
-
beforeEach(() => {
|
|
50
|
-
mockGetProcessSpecs.mockReset();
|
|
51
|
-
mockStartProcessInstance.mockReset();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should throw SpacesError with exit code 1 when --name is missing', async () => {
|
|
55
|
-
try {
|
|
56
|
-
await startProcess({});
|
|
57
|
-
expect.unreachable('should have thrown');
|
|
58
|
-
} catch (err) {
|
|
59
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
60
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
61
|
-
expect((err as SpacesError).code).toBe('USER_ERROR');
|
|
62
|
-
expect((err as SpacesError).message).toContain('--name');
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should throw SpacesError when process name is not found in specs', async () => {
|
|
67
|
-
mockGetProcessSpecs.mockImplementation(() => []);
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
await startProcess({ name: 'nonexistent' });
|
|
71
|
-
expect.unreachable('should have thrown');
|
|
72
|
-
} catch (err) {
|
|
73
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
74
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
75
|
-
expect((err as SpacesError).message).toContain('nonexistent');
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('should start process when spec exists', async () => {
|
|
80
|
-
const spec: ProcessInstanceSpec = {
|
|
81
|
-
name: 'web',
|
|
82
|
-
instance: 1,
|
|
83
|
-
definition: { name: 'web', command: 'npm start' },
|
|
84
|
-
};
|
|
85
|
-
mockGetProcessSpecs.mockImplementation(() => [spec]);
|
|
86
|
-
mockStartProcessInstance.mockResolvedValue({ sessionId: 'sess-1', created: true });
|
|
87
|
-
|
|
88
|
-
// Should not throw
|
|
89
|
-
await startProcess({ name: 'web' });
|
|
90
|
-
|
|
91
|
-
expect(mockStartProcessInstance).toHaveBeenCalledTimes(1);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should throw disabled error when process exists with instances: 0', async () => {
|
|
95
|
-
mockGetProcessSpecs.mockImplementation(() => []);
|
|
96
|
-
const workspacePath = mkdtempSync(join(tmpdir(), 'gssh-process-test-'));
|
|
97
|
-
const gitspaceDir = join(workspacePath, '.gitspace');
|
|
98
|
-
mkdirSync(gitspaceDir, { recursive: true });
|
|
99
|
-
writeFileSync(
|
|
100
|
-
join(gitspaceDir, 'processes.json'),
|
|
101
|
-
JSON.stringify({ processes: [{ name: 'web', command: 'npm start', instances: 0 }] }),
|
|
102
|
-
'utf-8'
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
await startProcess({ name: 'web', workspace: workspacePath });
|
|
107
|
-
expect.unreachable('should have thrown');
|
|
108
|
-
} catch (err) {
|
|
109
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
110
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
111
|
-
expect((err as SpacesError).message).toContain('Process is disabled');
|
|
112
|
-
} finally {
|
|
113
|
-
rmSync(workspacePath, { recursive: true, force: true });
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// ============================================================================
|
|
119
|
-
// stopProcess
|
|
120
|
-
// ============================================================================
|
|
121
|
-
|
|
122
|
-
describe('stopProcess', () => {
|
|
123
|
-
beforeEach(() => {
|
|
124
|
-
mockGetProcessSpecs.mockReset();
|
|
125
|
-
mockStopProcessInstance.mockReset();
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('should throw SpacesError with exit code 1 when --name is missing', async () => {
|
|
129
|
-
try {
|
|
130
|
-
await stopProcess({});
|
|
131
|
-
expect.unreachable('should have thrown');
|
|
132
|
-
} catch (err) {
|
|
133
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
134
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
135
|
-
expect((err as SpacesError).message).toContain('--name');
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should throw SpacesError when process name is not found', async () => {
|
|
140
|
-
mockGetProcessSpecs.mockImplementation(() => []);
|
|
141
|
-
|
|
142
|
-
try {
|
|
143
|
-
await stopProcess({ name: 'nonexistent' });
|
|
144
|
-
expect.unreachable('should have thrown');
|
|
145
|
-
} catch (err) {
|
|
146
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
147
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
148
|
-
expect((err as SpacesError).message).toContain('nonexistent');
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('should stop process when spec exists', async () => {
|
|
153
|
-
const spec: ProcessInstanceSpec = {
|
|
154
|
-
name: 'web',
|
|
155
|
-
instance: 1,
|
|
156
|
-
definition: { name: 'web', command: 'npm start' },
|
|
157
|
-
};
|
|
158
|
-
mockGetProcessSpecs.mockImplementation(() => [spec]);
|
|
159
|
-
mockStopProcessInstance.mockResolvedValue(undefined);
|
|
160
|
-
|
|
161
|
-
await stopProcess({ name: 'web' });
|
|
162
|
-
|
|
163
|
-
expect(mockStopProcessInstance).toHaveBeenCalledTimes(1);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// ============================================================================
|
|
168
|
-
// attachProcess
|
|
169
|
-
// ============================================================================
|
|
170
|
-
|
|
171
|
-
describe('attachProcess', () => {
|
|
172
|
-
beforeEach(() => {
|
|
173
|
-
mockListProcessSessions.mockReset();
|
|
174
|
-
mockListSessions.mockReset();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('should throw SpacesError with exit code 1 when --name is missing', async () => {
|
|
178
|
-
try {
|
|
179
|
-
await attachProcess({});
|
|
180
|
-
expect.unreachable('should have thrown');
|
|
181
|
-
} catch (err) {
|
|
182
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
183
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
184
|
-
expect((err as SpacesError).message).toContain('--name');
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('should throw SpacesError when process is not running', async () => {
|
|
189
|
-
mockListProcessSessions.mockImplementation(() => Promise.resolve([]));
|
|
190
|
-
|
|
191
|
-
try {
|
|
192
|
-
await attachProcess({ name: 'web' });
|
|
193
|
-
expect.unreachable('should have thrown');
|
|
194
|
-
} catch (err) {
|
|
195
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
196
|
-
expect((err as SpacesError).exitCode).toBe(1);
|
|
197
|
-
expect((err as SpacesError).message).toContain('not running');
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('should throw SYSTEM_ERROR when session is not found in tmux', async () => {
|
|
202
|
-
mockListProcessSessions.mockImplementation(() =>
|
|
203
|
-
Promise.resolve([
|
|
204
|
-
{ sessionId: 'sess-99', processName: 'web', instance: 1, name: 'proc:ws:web:1', workspacePath: '/tmp' },
|
|
205
|
-
])
|
|
206
|
-
);
|
|
207
|
-
mockListSessions.mockImplementation(() => Promise.resolve([]));
|
|
208
|
-
|
|
209
|
-
try {
|
|
210
|
-
await attachProcess({ name: 'web' });
|
|
211
|
-
expect.unreachable('should have thrown');
|
|
212
|
-
} catch (err) {
|
|
213
|
-
expect(err).toBeInstanceOf(SpacesError);
|
|
214
|
-
expect((err as SpacesError).exitCode).toBe(2);
|
|
215
|
-
expect((err as SpacesError).code).toBe('SYSTEM_ERROR');
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('should succeed when process is running and session exists', async () => {
|
|
220
|
-
mockListProcessSessions.mockImplementation(() =>
|
|
221
|
-
Promise.resolve([
|
|
222
|
-
{ sessionId: 'sess-1', processName: 'web', instance: 1, name: 'proc:ws:web:1', workspacePath: '/tmp' },
|
|
223
|
-
])
|
|
224
|
-
);
|
|
225
|
-
mockListSessions.mockImplementation(() =>
|
|
226
|
-
Promise.resolve([{ id: 'sess-1', name: 'proc:ws:web:1', cwd: '/tmp' }])
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
// Should not throw
|
|
230
|
-
await attachProcess({ name: 'web' });
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
// ============================================================================
|
|
235
|
-
// listProcesses (no error paths, just smoke test)
|
|
236
|
-
// ============================================================================
|
|
237
|
-
|
|
238
|
-
describe('listProcesses', () => {
|
|
239
|
-
beforeEach(() => {
|
|
240
|
-
mockGetProcessSpecs.mockReset();
|
|
241
|
-
mockListProcessSessions.mockReset();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('should not throw when no processes are configured', async () => {
|
|
245
|
-
mockGetProcessSpecs.mockImplementation(() => []);
|
|
246
|
-
mockListProcessSessions.mockImplementation(() => Promise.resolve([]));
|
|
247
|
-
|
|
248
|
-
// Should not throw
|
|
249
|
-
await listProcesses({});
|
|
250
|
-
});
|
|
251
|
-
});
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Serve Message Handler Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests that the serve command properly handles all message types
|
|
5
|
-
* from the relay server. This ensures no "Unknown message type" errors.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { describe, expect, test } from "bun:test";
|
|
9
|
-
import type { RelayToMachineMessage } from "../../relay/protocol";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* All message types that the relay can send to a machine.
|
|
13
|
-
* The serve command's message handler must handle all of these.
|
|
14
|
-
*/
|
|
15
|
-
const RELAY_TO_MACHINE_MESSAGE_TYPES: RelayToMachineMessage["type"][] = [
|
|
16
|
-
"relay_identity",
|
|
17
|
-
"challenge",
|
|
18
|
-
"registered",
|
|
19
|
-
"access_list",
|
|
20
|
-
"access_update",
|
|
21
|
-
"client_authorized",
|
|
22
|
-
"client_revoked",
|
|
23
|
-
"client_connected",
|
|
24
|
-
"client_disconnected",
|
|
25
|
-
"data",
|
|
26
|
-
"error",
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Message types that require explicit handling (not just acknowledgment).
|
|
31
|
-
*/
|
|
32
|
-
const CRITICAL_MESSAGE_TYPES = [
|
|
33
|
-
"relay_identity", // Must respond with register_machine
|
|
34
|
-
"registered", // Must sync access list
|
|
35
|
-
"client_connected", // Must set up session
|
|
36
|
-
"client_disconnected", // Must clean up session
|
|
37
|
-
"data", // Must route to session
|
|
38
|
-
"error", // Must log/handle error
|
|
39
|
-
"access_list", // Must update local ACL
|
|
40
|
-
"access_update", // Must update local ACL
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Message types that are acknowledgments (can be no-ops).
|
|
45
|
-
*/
|
|
46
|
-
const ACKNOWLEDGMENT_MESSAGE_TYPES = [
|
|
47
|
-
"client_authorized",
|
|
48
|
-
"client_revoked",
|
|
49
|
-
"challenge", // Only used if relay sends separate challenge (usually included in relay_identity)
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
describe("serve message handler coverage", () => {
|
|
53
|
-
test("documents all relay-to-machine message types", () => {
|
|
54
|
-
// This test documents the expected message types.
|
|
55
|
-
// If the protocol adds new types, this test should be updated.
|
|
56
|
-
expect(RELAY_TO_MACHINE_MESSAGE_TYPES).toHaveLength(11);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("critical message types are a subset of all types", () => {
|
|
60
|
-
for (const type of CRITICAL_MESSAGE_TYPES) {
|
|
61
|
-
expect(RELAY_TO_MACHINE_MESSAGE_TYPES).toContain(type as RelayToMachineMessage["type"]);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test("acknowledgment message types are a subset of all types", () => {
|
|
66
|
-
for (const type of ACKNOWLEDGMENT_MESSAGE_TYPES) {
|
|
67
|
-
expect(RELAY_TO_MACHINE_MESSAGE_TYPES).toContain(type as RelayToMachineMessage["type"]);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("all message types are either critical or acknowledgment", () => {
|
|
72
|
-
const allCovered = new Set([
|
|
73
|
-
...CRITICAL_MESSAGE_TYPES,
|
|
74
|
-
...ACKNOWLEDGMENT_MESSAGE_TYPES,
|
|
75
|
-
]);
|
|
76
|
-
|
|
77
|
-
for (const type of RELAY_TO_MACHINE_MESSAGE_TYPES) {
|
|
78
|
-
expect(allCovered.has(type)).toBe(true);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe("message type handling requirements", () => {
|
|
84
|
-
/**
|
|
85
|
-
* These tests document what each message type requires.
|
|
86
|
-
* They serve as living documentation for the serve command implementation.
|
|
87
|
-
*/
|
|
88
|
-
|
|
89
|
-
test("relay_identity requires challenge-response authentication", () => {
|
|
90
|
-
const requirements = {
|
|
91
|
-
type: "relay_identity",
|
|
92
|
-
requiredFields: ["publicKey", "fingerprint", "challenge"],
|
|
93
|
-
expectedResponse: "register_machine with challengeResponse",
|
|
94
|
-
securityNote: "Must verify relay trust before responding",
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
expect(requirements.requiredFields).toContain("challenge");
|
|
98
|
-
expect(requirements.expectedResponse).toContain("challengeResponse");
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("registered triggers access list sync", () => {
|
|
102
|
-
const requirements = {
|
|
103
|
-
type: "registered",
|
|
104
|
-
requiredFields: ["machineId"],
|
|
105
|
-
sideEffects: [
|
|
106
|
-
"Sync all access entries to relay",
|
|
107
|
-
"Start access list file watcher",
|
|
108
|
-
"Set up access command handler",
|
|
109
|
-
],
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
expect(requirements.sideEffects.length).toBeGreaterThan(0);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test("client_authorized is an acknowledgment", () => {
|
|
116
|
-
const requirements = {
|
|
117
|
-
type: "client_authorized",
|
|
118
|
-
requiredFields: ["clientIdentityId"],
|
|
119
|
-
sideEffects: [], // No action needed - authorization was already applied locally
|
|
120
|
-
note: "Sent by relay to confirm authorize_client was processed",
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
expect(requirements.sideEffects).toHaveLength(0);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
test("client_revoked is an acknowledgment", () => {
|
|
127
|
-
const requirements = {
|
|
128
|
-
type: "client_revoked",
|
|
129
|
-
requiredFields: ["clientIdentityId"],
|
|
130
|
-
sideEffects: [], // No action needed - revocation was already applied locally
|
|
131
|
-
note: "Sent by relay to confirm revoke_client was processed",
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
expect(requirements.sideEffects).toHaveLength(0);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test("access_list requires full ACL replacement", () => {
|
|
138
|
-
const requirements = {
|
|
139
|
-
type: "access_list",
|
|
140
|
-
requiredFields: ["entries"],
|
|
141
|
-
sideEffects: [
|
|
142
|
-
"Update local access control list with all entries",
|
|
143
|
-
],
|
|
144
|
-
note: "Sent on reconnect to sync full state",
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
expect(requirements.requiredFields).toContain("entries");
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test("access_update requires incremental ACL update", () => {
|
|
151
|
-
const requirements = {
|
|
152
|
-
type: "access_update",
|
|
153
|
-
requiredFields: ["added", "removed"],
|
|
154
|
-
sideEffects: [
|
|
155
|
-
"Add new entries to local ACL",
|
|
156
|
-
"Remove revoked entries from local ACL",
|
|
157
|
-
],
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
expect(requirements.requiredFields).toContain("added");
|
|
161
|
-
expect(requirements.requiredFields).toContain("removed");
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe("error scenarios", () => {
|
|
166
|
-
test("unknown message types should log warning", () => {
|
|
167
|
-
// The serve command should log unknown message types
|
|
168
|
-
// rather than silently ignoring them
|
|
169
|
-
const unknownType = "some_future_message_type";
|
|
170
|
-
expect(RELAY_TO_MACHINE_MESSAGE_TYPES).not.toContain(unknownType);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("malformed messages should not crash handler", () => {
|
|
174
|
-
// These are examples of malformed messages that the handler
|
|
175
|
-
// should gracefully reject without crashing
|
|
176
|
-
const malformedMessages = [
|
|
177
|
-
null,
|
|
178
|
-
undefined,
|
|
179
|
-
{},
|
|
180
|
-
{ type: null },
|
|
181
|
-
{ type: 123 },
|
|
182
|
-
"not an object",
|
|
183
|
-
{ type: "registered" }, // missing machineId
|
|
184
|
-
{ type: "data" }, // missing data field
|
|
185
|
-
];
|
|
186
|
-
|
|
187
|
-
// Each should be handled without throwing
|
|
188
|
-
expect(malformedMessages.length).toBe(8);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Serve process hosting helpers tests
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
buildServeIngressConfig,
|
|
8
|
-
type ProcessHostEntry,
|
|
9
|
-
} from "../serve";
|
|
10
|
-
import { buildProcessHostname, normalizeHostLabel } from "../../utils/hostnames";
|
|
11
|
-
|
|
12
|
-
describe("process hosting helpers", () => {
|
|
13
|
-
test("normalizeHostLabel cleans and lowercases", () => {
|
|
14
|
-
expect(normalizeHostLabel("My App")).toBe("my-app");
|
|
15
|
-
expect(normalizeHostLabel("API__Server")).toBe("api-server");
|
|
16
|
-
expect(normalizeHostLabel("---")).toBe("x");
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test("buildProcessHostname assembles expected segments", () => {
|
|
20
|
-
const hostname = buildProcessHostname(
|
|
21
|
-
"brad.serve.gitspace.sh",
|
|
22
|
-
"my-workspace",
|
|
23
|
-
"web-api",
|
|
24
|
-
2,
|
|
25
|
-
"web"
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
expect(hostname).toBe("web.web-api-2.my-workspace.brad.serve.gitspace.sh");
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
test("buildServeIngressConfig adds fallback", () => {
|
|
32
|
-
const entries: ProcessHostEntry[] = [
|
|
33
|
-
{
|
|
34
|
-
hostname: "web.api-1.alpha.brad.serve.gitspace.sh",
|
|
35
|
-
service: "http://127.0.0.1:3000",
|
|
36
|
-
protocol: "http",
|
|
37
|
-
workspaceId: "alpha",
|
|
38
|
-
processName: "api",
|
|
39
|
-
instance: 1,
|
|
40
|
-
port: 3000,
|
|
41
|
-
portName: "web",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
hostname: "tcp.api-1.alpha.brad.serve.gitspace.sh",
|
|
45
|
-
service: "tcp://127.0.0.1:9000",
|
|
46
|
-
protocol: "tcp",
|
|
47
|
-
workspaceId: "alpha",
|
|
48
|
-
processName: "api",
|
|
49
|
-
instance: 1,
|
|
50
|
-
port: 9000,
|
|
51
|
-
portName: "tcp",
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
|
|
55
|
-
const config = buildServeIngressConfig(entries);
|
|
56
|
-
expect(config).toContain("ingress:");
|
|
57
|
-
expect(config).toContain("hostname: web.api-1.alpha.brad.serve.gitspace.sh");
|
|
58
|
-
expect(config).toContain("service: http://127.0.0.1:3000");
|
|
59
|
-
expect(config).toContain("hostname: tcp.api-1.alpha.brad.serve.gitspace.sh");
|
|
60
|
-
expect(config).toContain("service: tcp://127.0.0.1:9000");
|
|
61
|
-
expect(config).toContain("service: http_status:404");
|
|
62
|
-
});
|
|
63
|
-
});
|