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
package/scripts/sample-events.ts
DELETED
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
type EventLevel = "info" | "warn" | "error";
|
|
2
|
-
|
|
3
|
-
type SampleEvent = {
|
|
4
|
-
event: string;
|
|
5
|
-
eventId: string;
|
|
6
|
-
level: EventLevel;
|
|
7
|
-
timestamp: string;
|
|
8
|
-
message: string;
|
|
9
|
-
requestId: string;
|
|
10
|
-
traceId?: string;
|
|
11
|
-
spanId?: string;
|
|
12
|
-
parentSpanId?: string;
|
|
13
|
-
durationMs?: number;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
type TaskDefinition = {
|
|
17
|
-
name: string;
|
|
18
|
-
startMessage: string;
|
|
19
|
-
finishMessage: string;
|
|
20
|
-
errorMessage: string;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
type ScheduledEvent = {
|
|
24
|
-
offsetMs: number;
|
|
25
|
-
event: string;
|
|
26
|
-
message: string;
|
|
27
|
-
level?: EventLevel;
|
|
28
|
-
spanId: string;
|
|
29
|
-
parentSpanId?: string;
|
|
30
|
-
durationMs?: number;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const TASKS: TaskDefinition[] = [
|
|
34
|
-
{
|
|
35
|
-
name: "auth.check",
|
|
36
|
-
startMessage: "Validating token",
|
|
37
|
-
finishMessage: "Token validated",
|
|
38
|
-
errorMessage: "Token validation failed",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
name: "db.query",
|
|
42
|
-
startMessage: "Querying primary database",
|
|
43
|
-
finishMessage: "Query complete",
|
|
44
|
-
errorMessage: "Database timeout",
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
name: "cache.lookup",
|
|
48
|
-
startMessage: "Cache lookup",
|
|
49
|
-
finishMessage: "Cache response",
|
|
50
|
-
errorMessage: "Cache lookup failed",
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
name: "worker.dispatch",
|
|
54
|
-
startMessage: "Dispatching queue worker",
|
|
55
|
-
finishMessage: "Worker acknowledged",
|
|
56
|
-
errorMessage: "Worker dispatch stalled",
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
name: "billing.capture",
|
|
60
|
-
startMessage: "Capturing payment",
|
|
61
|
-
finishMessage: "Payment captured",
|
|
62
|
-
errorMessage: "Payment capture failed",
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: "inventory.reserve",
|
|
66
|
-
startMessage: "Reserving inventory",
|
|
67
|
-
finishMessage: "Inventory reserved",
|
|
68
|
-
errorMessage: "Inventory reservation failed",
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: "feature.flag",
|
|
72
|
-
startMessage: "Evaluating feature flags",
|
|
73
|
-
finishMessage: "Flags applied",
|
|
74
|
-
errorMessage: "Flag evaluation failed",
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
name: "webhook.emit",
|
|
78
|
-
startMessage: "Emitting webhook",
|
|
79
|
-
finishMessage: "Webhook delivered",
|
|
80
|
-
errorMessage: "Webhook delivery failed",
|
|
81
|
-
},
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
const REQUEST_DURATION_RANGE_MS = [6000, 18000] as const;
|
|
85
|
-
const REQUEST_INTERVAL_RANGE_MS = [2000, 4000] as const;
|
|
86
|
-
const TASK_COUNT_RANGE = [4, 8] as const;
|
|
87
|
-
const FAILURE_RATE = 0.22;
|
|
88
|
-
|
|
89
|
-
function randomId(prefix: string): string {
|
|
90
|
-
return `${prefix}-${Math.random().toString(36).slice(2, 10)}`;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function randomBetween(min: number, max: number): number {
|
|
94
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function shuffle<T>(items: T[]): T[] {
|
|
98
|
-
const copy = [...items];
|
|
99
|
-
for (let i = copy.length - 1; i > 0; i -= 1) {
|
|
100
|
-
const j = randomBetween(0, i);
|
|
101
|
-
[copy[i], copy[j]] = [copy[j], copy[i]];
|
|
102
|
-
}
|
|
103
|
-
return copy;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function pickOne<T>(items: T[]): T {
|
|
107
|
-
return items[randomBetween(0, items.length - 1)];
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function emitEvent(payload: SampleEvent): void {
|
|
111
|
-
console.log(`@event ${JSON.stringify(payload)}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function buildEvent(params: {
|
|
115
|
-
requestId: string;
|
|
116
|
-
traceId: string;
|
|
117
|
-
spanId: string;
|
|
118
|
-
parentSpanId?: string;
|
|
119
|
-
event: string;
|
|
120
|
-
message: string;
|
|
121
|
-
level?: EventLevel;
|
|
122
|
-
durationMs?: number;
|
|
123
|
-
}): SampleEvent {
|
|
124
|
-
const now = new Date();
|
|
125
|
-
return {
|
|
126
|
-
event: params.event,
|
|
127
|
-
eventId: randomId("evt"),
|
|
128
|
-
level: params.level ?? "info",
|
|
129
|
-
timestamp: now.toISOString(),
|
|
130
|
-
message: params.message,
|
|
131
|
-
requestId: params.requestId,
|
|
132
|
-
traceId: params.traceId,
|
|
133
|
-
spanId: params.spanId,
|
|
134
|
-
parentSpanId: params.parentSpanId,
|
|
135
|
-
durationMs: params.durationMs,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function scheduleEvents(params: {
|
|
140
|
-
requestId: string;
|
|
141
|
-
traceId: string;
|
|
142
|
-
events: ScheduledEvent[];
|
|
143
|
-
}): void {
|
|
144
|
-
const { requestId, traceId, events } = params;
|
|
145
|
-
const sorted = [...events].sort((a, b) => a.offsetMs - b.offsetMs);
|
|
146
|
-
for (const event of sorted) {
|
|
147
|
-
setTimeout(() => {
|
|
148
|
-
emitEvent(buildEvent({
|
|
149
|
-
requestId,
|
|
150
|
-
traceId,
|
|
151
|
-
spanId: event.spanId,
|
|
152
|
-
parentSpanId: event.parentSpanId,
|
|
153
|
-
event: event.event,
|
|
154
|
-
message: event.message,
|
|
155
|
-
level: event.level,
|
|
156
|
-
durationMs: event.durationMs,
|
|
157
|
-
}));
|
|
158
|
-
}, event.offsetMs);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function emitRequestSequence(): void {
|
|
163
|
-
const requestId = randomId("req");
|
|
164
|
-
const traceId = randomId("trace");
|
|
165
|
-
const rootSpanId = randomId("span");
|
|
166
|
-
const totalDuration = randomBetween(...REQUEST_DURATION_RANGE_MS);
|
|
167
|
-
const willFail = Math.random() < FAILURE_RATE;
|
|
168
|
-
const failureOffset = willFail
|
|
169
|
-
? randomBetween(Math.floor(totalDuration * 0.4), Math.floor(totalDuration * 0.85))
|
|
170
|
-
: totalDuration;
|
|
171
|
-
const finalOffset = willFail
|
|
172
|
-
? failureOffset + randomBetween(120, 480)
|
|
173
|
-
: totalDuration + randomBetween(200, 600);
|
|
174
|
-
|
|
175
|
-
const scheduled: ScheduledEvent[] = [
|
|
176
|
-
{
|
|
177
|
-
offsetMs: 0,
|
|
178
|
-
event: "request.start",
|
|
179
|
-
message: "Request started",
|
|
180
|
-
spanId: rootSpanId,
|
|
181
|
-
},
|
|
182
|
-
];
|
|
183
|
-
|
|
184
|
-
const taskCount = randomBetween(...TASK_COUNT_RANGE);
|
|
185
|
-
const selectedTasks = shuffle(TASKS).slice(0, taskCount);
|
|
186
|
-
const taskWindowEnd = Math.max(600, failureOffset - 600);
|
|
187
|
-
|
|
188
|
-
for (const task of selectedTasks) {
|
|
189
|
-
const spanId = randomId("span");
|
|
190
|
-
const startOffset = randomBetween(200, taskWindowEnd);
|
|
191
|
-
if (willFail && startOffset > failureOffset - 200) {
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const duration = randomBetween(400, 3200);
|
|
196
|
-
const finishOffset = startOffset + duration;
|
|
197
|
-
|
|
198
|
-
scheduled.push({
|
|
199
|
-
offsetMs: startOffset,
|
|
200
|
-
event: `${task.name}.start`,
|
|
201
|
-
message: task.startMessage,
|
|
202
|
-
spanId,
|
|
203
|
-
parentSpanId: rootSpanId,
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
if (!willFail || finishOffset < failureOffset - 200) {
|
|
207
|
-
scheduled.push({
|
|
208
|
-
offsetMs: finishOffset,
|
|
209
|
-
event: `${task.name}.finish`,
|
|
210
|
-
message: task.finishMessage,
|
|
211
|
-
spanId,
|
|
212
|
-
parentSpanId: rootSpanId,
|
|
213
|
-
durationMs: duration,
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (willFail) {
|
|
219
|
-
const failureTask = pickOne(selectedTasks);
|
|
220
|
-
const failureSpanId = randomId("span");
|
|
221
|
-
const failureDetailOffset = Math.max(200, failureOffset - randomBetween(150, 400));
|
|
222
|
-
|
|
223
|
-
scheduled.push({
|
|
224
|
-
offsetMs: failureDetailOffset,
|
|
225
|
-
event: `${failureTask.name}.error`,
|
|
226
|
-
message: failureTask.errorMessage,
|
|
227
|
-
spanId: failureSpanId,
|
|
228
|
-
parentSpanId: rootSpanId,
|
|
229
|
-
level: "error",
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
scheduled.push({
|
|
234
|
-
offsetMs: finalOffset,
|
|
235
|
-
event: willFail ? "request.failed" : "request.complete",
|
|
236
|
-
message: willFail ? "Request failed" : "Request completed",
|
|
237
|
-
spanId: rootSpanId,
|
|
238
|
-
level: willFail ? "error" : "info",
|
|
239
|
-
durationMs: finalOffset,
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
scheduleEvents({ requestId, traceId, events: scheduled });
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
emitEvent(buildEvent({
|
|
246
|
-
requestId: "bootstrap",
|
|
247
|
-
traceId: randomId("trace"),
|
|
248
|
-
spanId: randomId("span"),
|
|
249
|
-
event: "sample.start",
|
|
250
|
-
message: "Sample event emitter started",
|
|
251
|
-
level: "info",
|
|
252
|
-
}));
|
|
253
|
-
|
|
254
|
-
function scheduleNextSequence(): void {
|
|
255
|
-
const delay = randomBetween(...REQUEST_INTERVAL_RANGE_MS);
|
|
256
|
-
setTimeout(() => {
|
|
257
|
-
emitRequestSequence();
|
|
258
|
-
scheduleNextSequence();
|
|
259
|
-
}, delay);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
scheduleNextSequence();
|
|
263
|
-
emitRequestSequence();
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Minimal reproduction of the tab/space bug in ghostty-opentui
|
|
4
|
-
*
|
|
5
|
-
* Bug: ptyToJson() and getJson() span output strips spaces from tab expansion
|
|
6
|
-
*
|
|
7
|
-
* Run: bun scripts/test-tabs-minimal.ts
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { ptyToJson, ptyToText, PersistentTerminal } from 'ghostty-opentui';
|
|
11
|
-
|
|
12
|
-
console.log('=== ghostty-opentui Tab Expansion Bug ===\n');
|
|
13
|
-
|
|
14
|
-
const input = 'a\tb\tc'; // 'a', tab, 'b', tab, 'c'
|
|
15
|
-
|
|
16
|
-
// Method 1: ptyToText - WORKS
|
|
17
|
-
const textOutput = ptyToText(input, { cols: 80, rows: 1 });
|
|
18
|
-
console.log('ptyToText():');
|
|
19
|
-
console.log(` Input: "a\\tb\\tc"`);
|
|
20
|
-
console.log(` Output: "${textOutput}"`);
|
|
21
|
-
console.log(` Length: ${textOutput.length}`);
|
|
22
|
-
console.log(` Spaces: ${(textOutput.match(/ /g) || []).length}`);
|
|
23
|
-
console.log();
|
|
24
|
-
|
|
25
|
-
// Method 2: ptyToJson - BROKEN (spans missing spaces)
|
|
26
|
-
const jsonOutput = ptyToJson(input, { cols: 80, rows: 1 });
|
|
27
|
-
const spanText = jsonOutput.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
28
|
-
console.log('ptyToJson() spans:');
|
|
29
|
-
console.log(` Input: "a\\tb\\tc"`);
|
|
30
|
-
console.log(` Output: "${spanText}"`);
|
|
31
|
-
console.log(` Length: ${spanText.length}`);
|
|
32
|
-
console.log(` Spaces: ${(spanText.match(/ /g) || []).length}`);
|
|
33
|
-
console.log(` Spans: ${JSON.stringify(jsonOutput.lines[0]?.spans.map(s => ({ text: s.text, width: s.width })))}`);
|
|
34
|
-
console.log();
|
|
35
|
-
|
|
36
|
-
// Method 3: PersistentTerminal.getText() - WORKS
|
|
37
|
-
const term = new PersistentTerminal({ cols: 80, rows: 24 });
|
|
38
|
-
term.feed(input);
|
|
39
|
-
const termText = term.getText();
|
|
40
|
-
console.log('PersistentTerminal.getText():');
|
|
41
|
-
console.log(` Input: "a\\tb\\tc"`);
|
|
42
|
-
console.log(` Output: "${termText.split('\n')[0]}"`);
|
|
43
|
-
console.log(` Length: ${termText.split('\n')[0].length}`);
|
|
44
|
-
console.log();
|
|
45
|
-
|
|
46
|
-
// Method 4: PersistentTerminal.getJson() - BROKEN (spans missing spaces)
|
|
47
|
-
const termJson = term.getJson();
|
|
48
|
-
const termSpanText = termJson.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
49
|
-
console.log('PersistentTerminal.getJson() spans:');
|
|
50
|
-
console.log(` Input: "a\\tb\\tc"`);
|
|
51
|
-
console.log(` Output: "${termSpanText}"`);
|
|
52
|
-
console.log(` Length: ${termSpanText.length}`);
|
|
53
|
-
console.log(` Spans: ${JSON.stringify(termJson.lines[0]?.spans.map(s => ({ text: s.text, width: s.width })))}`);
|
|
54
|
-
console.log();
|
|
55
|
-
|
|
56
|
-
term.destroy();
|
|
57
|
-
|
|
58
|
-
// Diagnosis
|
|
59
|
-
console.log('=== Diagnosis ===');
|
|
60
|
-
console.log('The terminal emulator correctly expands tabs to spaces internally.');
|
|
61
|
-
console.log('getText() and ptyToText() correctly return the expanded text.');
|
|
62
|
-
console.log('However, getJson() and ptyToJson() span extraction SKIPS space cells.');
|
|
63
|
-
console.log('');
|
|
64
|
-
console.log('This means the TUI Terminal component (which uses spans) shows no spaces!');
|
|
65
|
-
console.log('');
|
|
66
|
-
console.log('Expected span output: [{ text: "a ", width: 8 }, { text: "b ", width: 8 }, { text: "c", width: 1 }]');
|
|
67
|
-
console.log('Or: [{ text: "a", width: 1 }, { text: " ", width: 7 }, { text: "b", width: 1 }, ...]');
|
|
68
|
-
console.log(`Actual span output: ${JSON.stringify(jsonOutput.lines[0]?.spans.map(s => ({ text: s.text, width: s.width })))}`);
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Test potential workarounds for the ghostty-opentui tab bug
|
|
4
|
-
*
|
|
5
|
-
* Run: bun scripts/test-tabs-workaround.ts
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { ptyToJson, PersistentTerminal } from 'ghostty-opentui';
|
|
9
|
-
|
|
10
|
-
console.log('=== Tab Bug Workaround Tests ===\n');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Workaround 1: Expand tabs BEFORE feeding to ghostty
|
|
14
|
-
* This is tricky because we'd need to track cursor position
|
|
15
|
-
*/
|
|
16
|
-
function expandTabs(input: string | Buffer, tabWidth: number = 8): Buffer {
|
|
17
|
-
const str = typeof input === 'string' ? input : input.toString('utf-8');
|
|
18
|
-
let result = '';
|
|
19
|
-
let col = 0;
|
|
20
|
-
|
|
21
|
-
for (const char of str) {
|
|
22
|
-
if (char === '\t') {
|
|
23
|
-
const spacesToNextTab = tabWidth - (col % tabWidth);
|
|
24
|
-
result += ' '.repeat(spacesToNextTab);
|
|
25
|
-
col += spacesToNextTab;
|
|
26
|
-
} else if (char === '\n' || char === '\r') {
|
|
27
|
-
result += char;
|
|
28
|
-
col = 0;
|
|
29
|
-
} else {
|
|
30
|
-
result += char;
|
|
31
|
-
col++;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return Buffer.from(result);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Test the workaround
|
|
39
|
-
const input = 'a\tb\tc';
|
|
40
|
-
const expanded = expandTabs(input);
|
|
41
|
-
console.log(`Workaround 1: Pre-expand tabs`);
|
|
42
|
-
console.log(` Input: "${input.replace(/\t/g, '\\t')}"`);
|
|
43
|
-
console.log(` Expanded: "${expanded.toString()}"`);
|
|
44
|
-
|
|
45
|
-
const result = ptyToJson(expanded, { cols: 80, rows: 1 });
|
|
46
|
-
const spanText = result.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
47
|
-
console.log(` JSON spans: "${spanText}"`);
|
|
48
|
-
console.log(` Length: ${spanText.length}`);
|
|
49
|
-
console.log(` Spaces: ${(spanText.match(/ /g) || []).length}`);
|
|
50
|
-
console.log();
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Workaround 2: Post-process spans to restore spacing using width info
|
|
54
|
-
* Each span has a 'width' field - we could use cursor positions
|
|
55
|
-
*/
|
|
56
|
-
console.log(`Workaround 2: Check if width field helps`);
|
|
57
|
-
const rawResult = ptyToJson('a\tb', { cols: 80, rows: 1 });
|
|
58
|
-
console.log(` Spans: ${JSON.stringify(rawResult.lines[0]?.spans)}`);
|
|
59
|
-
console.log(` Note: width only reflects the text, not the cell position`);
|
|
60
|
-
console.log();
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Workaround 3: Use ANSI cursor movement to fill with spaces?
|
|
64
|
-
* Not really practical
|
|
65
|
-
*/
|
|
66
|
-
|
|
67
|
-
// Test with a more realistic ls-like output
|
|
68
|
-
console.log(`Test with ls-style input:`);
|
|
69
|
-
const lsInput = 'drwxr-xr-x\t24\tbradleat\tstaff\t768\tJan 12\tDocuments';
|
|
70
|
-
const lsExpanded = expandTabs(lsInput);
|
|
71
|
-
console.log(` Input: "${lsInput.replace(/\t/g, '\\t')}"`);
|
|
72
|
-
console.log(` Expanded: "${lsExpanded.toString()}"`);
|
|
73
|
-
|
|
74
|
-
const lsResult = ptyToJson(lsExpanded, { cols: 120, rows: 1 });
|
|
75
|
-
const lsSpanText = lsResult.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
76
|
-
console.log(` JSON spans: "${lsSpanText}"`);
|
|
77
|
-
console.log();
|
|
78
|
-
|
|
79
|
-
// Test with PersistentTerminal
|
|
80
|
-
console.log(`Test with PersistentTerminal + pre-expanded tabs:`);
|
|
81
|
-
const term = new PersistentTerminal({ cols: 80, rows: 24 });
|
|
82
|
-
term.feed(expandTabs('file1.txt\tfile2.txt\tfile3.txt\r\n'));
|
|
83
|
-
const termData = term.getJson();
|
|
84
|
-
const termSpanText = termData.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
85
|
-
console.log(` JSON spans: "${termSpanText}"`);
|
|
86
|
-
console.log(` Length: ${termSpanText.length}`);
|
|
87
|
-
console.log(` getText(): "${term.getText().split('\n')[0]}"`);
|
|
88
|
-
term.destroy();
|
|
89
|
-
console.log();
|
|
90
|
-
|
|
91
|
-
console.log('=== Conclusion ===');
|
|
92
|
-
console.log('Workaround 1 (pre-expand tabs) works but requires tracking cursor position');
|
|
93
|
-
console.log('This is complex for full ANSI streams with cursor movements');
|
|
94
|
-
console.log('');
|
|
95
|
-
console.log('Better solution: Fix ghostty-opentui to emit spaces for null cells in spans');
|
package/scripts/test-tabs.ts
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Test script to investigate tab/space rendering in ghostty-opentui
|
|
4
|
-
*
|
|
5
|
-
* Run with: bun scripts/test-tabs.ts
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { ptyToJson, ptyToText, PersistentTerminal, hasPersistentTerminalSupport } from 'ghostty-opentui';
|
|
9
|
-
|
|
10
|
-
// ANSI escape codes for colors (to make output clearer)
|
|
11
|
-
const RESET = '\x1b[0m';
|
|
12
|
-
const RED = '\x1b[31m';
|
|
13
|
-
const GREEN = '\x1b[32m';
|
|
14
|
-
const YELLOW = '\x1b[33m';
|
|
15
|
-
const CYAN = '\x1b[36m';
|
|
16
|
-
const DIM = '\x1b[2m';
|
|
17
|
-
|
|
18
|
-
function visualizeWhitespace(str: string): string {
|
|
19
|
-
return str
|
|
20
|
-
.replace(/ /g, '·') // Show spaces as middle dot
|
|
21
|
-
.replace(/\t/g, '→\t'); // Show tabs with arrow
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function hexDump(str: string): string {
|
|
25
|
-
return [...str].map(c => {
|
|
26
|
-
const code = c.charCodeAt(0);
|
|
27
|
-
if (code === 32) return `${DIM}SP${RESET}`;
|
|
28
|
-
if (code === 9) return `${RED}TAB${RESET}`;
|
|
29
|
-
if (code < 32) return `${YELLOW}\\x${code.toString(16).padStart(2, '0')}${RESET}`;
|
|
30
|
-
return c;
|
|
31
|
-
}).join(' ');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
console.log(`${CYAN}=== Ghostty-OpenTUI Tab/Space Test ===${RESET}\n`);
|
|
35
|
-
console.log(`Persistent terminal support: ${hasPersistentTerminalSupport() ? GREEN + 'YES' : RED + 'NO'}${RESET}\n`);
|
|
36
|
-
|
|
37
|
-
// Test 1: Simple tab character
|
|
38
|
-
console.log(`${YELLOW}Test 1: Simple tab character${RESET}`);
|
|
39
|
-
const test1Input = 'hello\tworld';
|
|
40
|
-
console.log(`Input (raw): "${test1Input}"`);
|
|
41
|
-
console.log(`Input (hex): ${hexDump(test1Input)}`);
|
|
42
|
-
|
|
43
|
-
const test1Result = ptyToJson(test1Input, { cols: 80, rows: 24 });
|
|
44
|
-
console.log(`Output lines: ${test1Result.lines.length}`);
|
|
45
|
-
for (const line of test1Result.lines) {
|
|
46
|
-
for (const span of line.spans) {
|
|
47
|
-
console.log(` Span: "${visualizeWhitespace(span.text)}" (len=${span.text.length}, width=${span.width})`);
|
|
48
|
-
console.log(` Hex: ${hexDump(span.text)}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
console.log();
|
|
52
|
-
|
|
53
|
-
// Test 2: Multiple tabs (like ls output)
|
|
54
|
-
console.log(`${YELLOW}Test 2: Multiple tabs (simulating ls -la style)${RESET}`);
|
|
55
|
-
const test2Input = 'drwxr-xr-x\t5\tuser\tstaff\t160\tJan 10 12:00\tDocuments';
|
|
56
|
-
console.log(`Input (raw): "${test2Input}"`);
|
|
57
|
-
console.log(`Input (hex): ${hexDump(test2Input)}`);
|
|
58
|
-
|
|
59
|
-
const test2Result = ptyToJson(test2Input, { cols: 120, rows: 24 });
|
|
60
|
-
console.log(`Output lines: ${test2Result.lines.length}`);
|
|
61
|
-
for (const line of test2Result.lines) {
|
|
62
|
-
const fullText = line.spans.map(s => s.text).join('');
|
|
63
|
-
console.log(` Full line: "${visualizeWhitespace(fullText)}" (len=${fullText.length})`);
|
|
64
|
-
console.log(` Spans: ${line.spans.length}`);
|
|
65
|
-
for (let i = 0; i < line.spans.length; i++) {
|
|
66
|
-
const span = line.spans[i];
|
|
67
|
-
console.log(` [${i}] "${visualizeWhitespace(span.text)}" len=${span.text.length} width=${span.width}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
console.log();
|
|
71
|
-
|
|
72
|
-
// Test 3: Actual ls command output
|
|
73
|
-
console.log(`${YELLOW}Test 3: Actual ls command output${RESET}`);
|
|
74
|
-
const proc = Bun.spawnSync(['ls', '-la'], {
|
|
75
|
-
cwd: process.cwd(),
|
|
76
|
-
stdout: 'pipe',
|
|
77
|
-
stderr: 'pipe',
|
|
78
|
-
});
|
|
79
|
-
const lsOutput = proc.stdout.toString();
|
|
80
|
-
console.log(`Raw ls output first 200 chars hex: ${hexDump(lsOutput.slice(0, 200))}`);
|
|
81
|
-
console.log();
|
|
82
|
-
|
|
83
|
-
const test3Result = ptyToJson(lsOutput, { cols: 120, rows: 50 });
|
|
84
|
-
console.log(`Processed ${test3Result.lines.length} lines from ls output`);
|
|
85
|
-
// Show first 5 lines
|
|
86
|
-
for (let i = 0; i < Math.min(5, test3Result.lines.length); i++) {
|
|
87
|
-
const line = test3Result.lines[i];
|
|
88
|
-
const fullText = line.spans.map(s => s.text).join('');
|
|
89
|
-
console.log(` Line ${i}: "${visualizeWhitespace(fullText.slice(0, 80))}..."`);
|
|
90
|
-
}
|
|
91
|
-
console.log();
|
|
92
|
-
|
|
93
|
-
// Test 4: Using PersistentTerminal (like the TUI does)
|
|
94
|
-
console.log(`${YELLOW}Test 4: PersistentTerminal (streaming mode)${RESET}`);
|
|
95
|
-
if (hasPersistentTerminalSupport()) {
|
|
96
|
-
const term = new PersistentTerminal({ cols: 80, rows: 24 });
|
|
97
|
-
|
|
98
|
-
// Feed tab-containing content
|
|
99
|
-
term.feed('file1.txt\tfile2.txt\tfile3.txt\r\n');
|
|
100
|
-
term.feed('another\trow\there\r\n');
|
|
101
|
-
|
|
102
|
-
const data = term.getJson();
|
|
103
|
-
console.log(`Lines: ${data.lines.length}`);
|
|
104
|
-
for (let i = 0; i < data.lines.length; i++) {
|
|
105
|
-
const line = data.lines[i];
|
|
106
|
-
const fullText = line.spans.map(s => s.text).join('');
|
|
107
|
-
console.log(` Line ${i}: "${visualizeWhitespace(fullText)}" (len=${fullText.length})`);
|
|
108
|
-
// Check for spaces
|
|
109
|
-
const spaceCount = (fullText.match(/ /g) || []).length;
|
|
110
|
-
const tabCount = (fullText.match(/\t/g) || []).length;
|
|
111
|
-
console.log(` Spaces: ${spaceCount}, Tabs: ${tabCount}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Also get plain text
|
|
115
|
-
const plainText = term.getText();
|
|
116
|
-
console.log(`\n Plain text output:`);
|
|
117
|
-
console.log(` "${visualizeWhitespace(plainText)}"`);
|
|
118
|
-
|
|
119
|
-
term.destroy();
|
|
120
|
-
} else {
|
|
121
|
-
console.log(`${RED}PersistentTerminal not available${RESET}`);
|
|
122
|
-
}
|
|
123
|
-
console.log();
|
|
124
|
-
|
|
125
|
-
// Test 5: Tab stops at different positions
|
|
126
|
-
console.log(`${YELLOW}Test 5: Tab stops at column positions${RESET}`);
|
|
127
|
-
// Tabs should align to columns 8, 16, 24, etc.
|
|
128
|
-
const tabTests = [
|
|
129
|
-
'a\tb', // 'a' at 0, tab to 8, 'b' at 8
|
|
130
|
-
'ab\tc', // 'ab' at 0-1, tab to 8, 'c' at 8
|
|
131
|
-
'abcdefg\th', // 'abcdefg' at 0-6, tab to 8, 'h' at 8
|
|
132
|
-
'abcdefgh\ti', // 'abcdefgh' at 0-7, tab to 16, 'i' at 16
|
|
133
|
-
'12345678\t9', // exactly 8 chars, tab to 16, '9' at 16
|
|
134
|
-
];
|
|
135
|
-
|
|
136
|
-
for (const input of tabTests) {
|
|
137
|
-
const result = ptyToJson(input, { cols: 80, rows: 1 });
|
|
138
|
-
const line = result.lines[0];
|
|
139
|
-
const fullText = line.spans.map(s => s.text).join('');
|
|
140
|
-
const expectedTabPos = Math.ceil((input.indexOf('\t') + 1) / 8) * 8;
|
|
141
|
-
console.log(` Input: "${input.replace('\t', '\\t')}" -> Output: "${visualizeWhitespace(fullText)}" (len=${fullText.length})`);
|
|
142
|
-
console.log(` Tab should expand to column ${expectedTabPos}, actual len after first word: ${fullText.indexOf(input.split('\t')[1])}`);
|
|
143
|
-
}
|
|
144
|
-
console.log();
|
|
145
|
-
|
|
146
|
-
// Test 6: ptyToText output (plain text extraction)
|
|
147
|
-
console.log(`${YELLOW}Test 6: ptyToText (strips ANSI, keeps spacing)${RESET}`);
|
|
148
|
-
const test6Input = '\x1b[32mgreen\x1b[0m\ttext\there';
|
|
149
|
-
console.log(`Input with ANSI: "${test6Input.replace(/\x1b/g, '\\e')}"`);
|
|
150
|
-
const test6Text = ptyToText(test6Input, { cols: 80, rows: 1 });
|
|
151
|
-
console.log(`ptyToText output: "${visualizeWhitespace(test6Text)}"`);
|
|
152
|
-
console.log(`Length: ${test6Text.length}`);
|
|
153
|
-
console.log();
|
|
154
|
-
|
|
155
|
-
// Summary
|
|
156
|
-
console.log(`${CYAN}=== Summary ===${RESET}`);
|
|
157
|
-
const summaryTest = ptyToJson('a\tb\tc', { cols: 80, rows: 1 });
|
|
158
|
-
const summaryText = summaryTest.lines[0]?.spans.map(s => s.text).join('') || '';
|
|
159
|
-
const hasSpaces = summaryText.includes(' ');
|
|
160
|
-
const hasTabs = summaryText.includes('\t');
|
|
161
|
-
|
|
162
|
-
if (hasSpaces && !hasTabs) {
|
|
163
|
-
console.log(`${GREEN}✓ Tabs are being expanded to spaces correctly${RESET}`);
|
|
164
|
-
} else if (hasTabs) {
|
|
165
|
-
console.log(`${RED}✗ Tabs are NOT being expanded (still literal \\t in output)${RESET}`);
|
|
166
|
-
} else if (!hasSpaces && !hasTabs) {
|
|
167
|
-
console.log(`${RED}✗ Neither spaces nor tabs - whitespace is being stripped!${RESET}`);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
console.log(`\nTest string "a\\tb\\tc" becomes: "${visualizeWhitespace(summaryText)}"`);
|
|
171
|
-
console.log(`Expected: "a·······b·······c" (with · representing spaces to tab stops)`);
|