gitspace 0.2.0-rc.1
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/.claude/settings.local.json +21 -0
- package/.gitspace/bundle.json +50 -0
- package/.gitspace/select/01-status.sh +40 -0
- package/.gitspace/setup/01-install-deps.sh +12 -0
- package/.gitspace/setup/02-typecheck.sh +16 -0
- package/AGENTS.md +439 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +25 -0
- package/README.md +607 -0
- package/bin/gssh +62 -0
- package/bun.lock +647 -0
- package/docs/CONNECTION.md +623 -0
- package/docs/GATEWAY-WORKER.md +319 -0
- package/docs/GETTING-STARTED.md +448 -0
- package/docs/GITSPACE-PLATFORM.md +1819 -0
- package/docs/INFRASTRUCTURE.md +1347 -0
- package/docs/PROTOCOL.md +619 -0
- package/docs/QUICKSTART.md +174 -0
- package/docs/RELAY.md +327 -0
- package/docs/REMOTE-DESIGN.md +549 -0
- package/docs/ROADMAP.md +564 -0
- package/docs/SITE_DOCS_FIGMA_MAKE.md +1167 -0
- package/docs/STACK-DESIGN.md +588 -0
- package/docs/UNIFIED_ARCHITECTURE.md +292 -0
- package/experiments/pty-benchmark.ts +148 -0
- package/experiments/pty-latency.ts +100 -0
- package/experiments/router/client.ts +199 -0
- package/experiments/router/protocol.ts +74 -0
- package/experiments/router/router.ts +217 -0
- package/experiments/router/session.ts +180 -0
- package/experiments/router/test.ts +133 -0
- package/experiments/socket-bandwidth.ts +77 -0
- package/homebrew/gitspace.rb +45 -0
- package/landing-page/ATTRIBUTIONS.md +3 -0
- package/landing-page/README.md +11 -0
- package/landing-page/bun.lock +801 -0
- package/landing-page/guidelines/Guidelines.md +61 -0
- package/landing-page/index.html +37 -0
- package/landing-page/package.json +90 -0
- package/landing-page/postcss.config.mjs +15 -0
- package/landing-page/public/_redirects +1 -0
- package/landing-page/public/favicon.png +0 -0
- package/landing-page/src/app/App.tsx +53 -0
- package/landing-page/src/app/components/figma/ImageWithFallback.tsx +27 -0
- package/landing-page/src/app/components/ui/accordion.tsx +66 -0
- package/landing-page/src/app/components/ui/alert-dialog.tsx +157 -0
- package/landing-page/src/app/components/ui/alert.tsx +66 -0
- package/landing-page/src/app/components/ui/aspect-ratio.tsx +11 -0
- package/landing-page/src/app/components/ui/avatar.tsx +53 -0
- package/landing-page/src/app/components/ui/badge.tsx +46 -0
- package/landing-page/src/app/components/ui/breadcrumb.tsx +109 -0
- package/landing-page/src/app/components/ui/button.tsx +57 -0
- package/landing-page/src/app/components/ui/calendar.tsx +75 -0
- package/landing-page/src/app/components/ui/card.tsx +92 -0
- package/landing-page/src/app/components/ui/carousel.tsx +241 -0
- package/landing-page/src/app/components/ui/chart.tsx +353 -0
- package/landing-page/src/app/components/ui/checkbox.tsx +32 -0
- package/landing-page/src/app/components/ui/collapsible.tsx +33 -0
- package/landing-page/src/app/components/ui/command.tsx +177 -0
- package/landing-page/src/app/components/ui/context-menu.tsx +252 -0
- package/landing-page/src/app/components/ui/dialog.tsx +135 -0
- package/landing-page/src/app/components/ui/drawer.tsx +132 -0
- package/landing-page/src/app/components/ui/dropdown-menu.tsx +257 -0
- package/landing-page/src/app/components/ui/form.tsx +168 -0
- package/landing-page/src/app/components/ui/hover-card.tsx +44 -0
- package/landing-page/src/app/components/ui/input-otp.tsx +77 -0
- package/landing-page/src/app/components/ui/input.tsx +21 -0
- package/landing-page/src/app/components/ui/label.tsx +24 -0
- package/landing-page/src/app/components/ui/menubar.tsx +276 -0
- package/landing-page/src/app/components/ui/navigation-menu.tsx +168 -0
- package/landing-page/src/app/components/ui/pagination.tsx +127 -0
- package/landing-page/src/app/components/ui/popover.tsx +48 -0
- package/landing-page/src/app/components/ui/progress.tsx +31 -0
- package/landing-page/src/app/components/ui/radio-group.tsx +45 -0
- package/landing-page/src/app/components/ui/resizable.tsx +56 -0
- package/landing-page/src/app/components/ui/scroll-area.tsx +58 -0
- package/landing-page/src/app/components/ui/select.tsx +189 -0
- package/landing-page/src/app/components/ui/separator.tsx +28 -0
- package/landing-page/src/app/components/ui/sheet.tsx +139 -0
- package/landing-page/src/app/components/ui/sidebar.tsx +726 -0
- package/landing-page/src/app/components/ui/skeleton.tsx +13 -0
- package/landing-page/src/app/components/ui/slider.tsx +63 -0
- package/landing-page/src/app/components/ui/sonner.tsx +25 -0
- package/landing-page/src/app/components/ui/switch.tsx +31 -0
- package/landing-page/src/app/components/ui/table.tsx +116 -0
- package/landing-page/src/app/components/ui/tabs.tsx +66 -0
- package/landing-page/src/app/components/ui/textarea.tsx +18 -0
- package/landing-page/src/app/components/ui/toggle-group.tsx +73 -0
- package/landing-page/src/app/components/ui/toggle.tsx +47 -0
- package/landing-page/src/app/components/ui/tooltip.tsx +61 -0
- package/landing-page/src/app/components/ui/use-mobile.ts +21 -0
- package/landing-page/src/app/components/ui/utils.ts +6 -0
- package/landing-page/src/components/docs/DocsContent.tsx +718 -0
- package/landing-page/src/components/docs/DocsSidebar.tsx +84 -0
- package/landing-page/src/components/landing/CTA.tsx +59 -0
- package/landing-page/src/components/landing/Comparison.tsx +84 -0
- package/landing-page/src/components/landing/FaultyTerminal.tsx +424 -0
- package/landing-page/src/components/landing/Features.tsx +201 -0
- package/landing-page/src/components/landing/Hero.tsx +142 -0
- package/landing-page/src/components/landing/Pricing.tsx +140 -0
- package/landing-page/src/components/landing/Roadmap.tsx +86 -0
- package/landing-page/src/components/landing/Security.tsx +81 -0
- package/landing-page/src/components/landing/TerminalWindow.tsx +27 -0
- package/landing-page/src/components/landing/UseCases.tsx +55 -0
- package/landing-page/src/components/landing/Workflow.tsx +101 -0
- package/landing-page/src/components/layout/DashboardNavbar.tsx +37 -0
- package/landing-page/src/components/layout/Footer.tsx +55 -0
- package/landing-page/src/components/layout/LandingNavbar.tsx +82 -0
- package/landing-page/src/components/ui/badge.tsx +39 -0
- package/landing-page/src/components/ui/breadcrumb.tsx +115 -0
- package/landing-page/src/components/ui/button.tsx +57 -0
- package/landing-page/src/components/ui/card.tsx +79 -0
- package/landing-page/src/components/ui/mock-terminal.tsx +68 -0
- package/landing-page/src/components/ui/separator.tsx +28 -0
- package/landing-page/src/lib/utils.ts +6 -0
- package/landing-page/src/main.tsx +10 -0
- package/landing-page/src/pages/Dashboard.tsx +133 -0
- package/landing-page/src/pages/DocsPage.tsx +79 -0
- package/landing-page/src/pages/LandingPage.tsx +31 -0
- package/landing-page/src/pages/TerminalView.tsx +106 -0
- package/landing-page/src/styles/fonts.css +0 -0
- package/landing-page/src/styles/index.css +3 -0
- package/landing-page/src/styles/tailwind.css +4 -0
- package/landing-page/src/styles/theme.css +181 -0
- package/landing-page/vite.config.ts +19 -0
- package/npm/darwin-arm64/bin/gssh +0 -0
- package/npm/darwin-arm64/package.json +20 -0
- package/package.json +74 -0
- package/scripts/build.ts +284 -0
- package/scripts/release.ts +140 -0
- package/src/__tests__/test-utils.ts +298 -0
- package/src/commands/__tests__/serve-messages.test.ts +190 -0
- package/src/commands/access.ts +298 -0
- package/src/commands/add.ts +452 -0
- package/src/commands/auth.ts +364 -0
- package/src/commands/connect.ts +287 -0
- package/src/commands/directory.ts +16 -0
- package/src/commands/host.ts +396 -0
- package/src/commands/identity.ts +184 -0
- package/src/commands/list.ts +200 -0
- package/src/commands/relay.ts +315 -0
- package/src/commands/remove.ts +241 -0
- package/src/commands/serve.ts +1493 -0
- package/src/commands/share.ts +456 -0
- package/src/commands/status.ts +125 -0
- package/src/commands/switch.ts +353 -0
- package/src/commands/tmux.ts +317 -0
- package/src/core/__tests__/access.test.ts +240 -0
- package/src/core/access.ts +277 -0
- package/src/core/bundle.ts +342 -0
- package/src/core/config.ts +510 -0
- package/src/core/git.ts +317 -0
- package/src/core/github.ts +151 -0
- package/src/core/identity.ts +631 -0
- package/src/core/linear.ts +225 -0
- package/src/core/shell.ts +161 -0
- package/src/core/trusted-relays.ts +315 -0
- package/src/index.ts +821 -0
- package/src/lib/remote-session/index.ts +7 -0
- package/src/lib/remote-session/protocol.ts +267 -0
- package/src/lib/remote-session/session-handler.ts +581 -0
- package/src/lib/remote-session/workspace-scanner.ts +167 -0
- package/src/lib/tmux-lite/README.md +81 -0
- package/src/lib/tmux-lite/cli.ts +796 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/handshake-runner.ts +349 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/mock-relay.ts +291 -0
- package/src/lib/tmux-lite/crypto/__tests__/helpers/test-identities.ts +142 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/authorization.integration.test.ts +339 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/e2e-communication.integration.test.ts +477 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/error-handling.integration.test.ts +499 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/handshake.integration.test.ts +371 -0
- package/src/lib/tmux-lite/crypto/__tests__/integration/security.integration.test.ts +573 -0
- package/src/lib/tmux-lite/crypto/access-control.test.ts +512 -0
- package/src/lib/tmux-lite/crypto/access-control.ts +320 -0
- package/src/lib/tmux-lite/crypto/frames.test.ts +262 -0
- package/src/lib/tmux-lite/crypto/frames.ts +141 -0
- package/src/lib/tmux-lite/crypto/handshake.ts +894 -0
- package/src/lib/tmux-lite/crypto/identity.test.ts +220 -0
- package/src/lib/tmux-lite/crypto/identity.ts +286 -0
- package/src/lib/tmux-lite/crypto/index.ts +51 -0
- package/src/lib/tmux-lite/crypto/invites.test.ts +381 -0
- package/src/lib/tmux-lite/crypto/invites.ts +215 -0
- package/src/lib/tmux-lite/crypto/keyexchange.ts +435 -0
- package/src/lib/tmux-lite/crypto/keys.test.ts +58 -0
- package/src/lib/tmux-lite/crypto/keys.ts +47 -0
- package/src/lib/tmux-lite/crypto/secretbox.test.ts +169 -0
- package/src/lib/tmux-lite/crypto/secretbox.ts +124 -0
- package/src/lib/tmux-lite/handshake-handler.ts +451 -0
- package/src/lib/tmux-lite/protocol.test.ts +307 -0
- package/src/lib/tmux-lite/protocol.ts +266 -0
- package/src/lib/tmux-lite/relay-client.ts +506 -0
- package/src/lib/tmux-lite/server.ts +1250 -0
- package/src/lib/tmux-lite/shell-integration.sh +37 -0
- package/src/lib/tmux-lite/terminal-queries.test.ts +54 -0
- package/src/lib/tmux-lite/terminal-queries.ts +49 -0
- package/src/relay/__tests__/e2e-flow.test.ts +1284 -0
- package/src/relay/__tests__/helpers/auth.ts +354 -0
- package/src/relay/__tests__/helpers/ports.ts +51 -0
- package/src/relay/__tests__/protocol-validation.test.ts +265 -0
- package/src/relay/authorization.ts +303 -0
- package/src/relay/embedded-assets.generated.d.ts +15 -0
- package/src/relay/identity.ts +352 -0
- package/src/relay/index.ts +57 -0
- package/src/relay/pipes.test.ts +427 -0
- package/src/relay/pipes.ts +195 -0
- package/src/relay/protocol.ts +804 -0
- package/src/relay/registries.test.ts +437 -0
- package/src/relay/registries.ts +593 -0
- package/src/relay/server.test.ts +1323 -0
- package/src/relay/server.ts +1092 -0
- package/src/relay/signing.ts +238 -0
- package/src/relay/types.ts +69 -0
- package/src/serve/client-session-manager.ts +622 -0
- package/src/serve/daemon.ts +497 -0
- package/src/serve/pty-session.ts +236 -0
- package/src/serve/types.ts +169 -0
- package/src/shared/components/Flow.tsx +453 -0
- package/src/shared/components/Flow.tui.tsx +343 -0
- package/src/shared/components/Flow.web.tsx +442 -0
- package/src/shared/components/Inbox.tsx +446 -0
- package/src/shared/components/Inbox.tui.tsx +262 -0
- package/src/shared/components/Inbox.web.tsx +329 -0
- package/src/shared/components/MachineList.tsx +187 -0
- package/src/shared/components/MachineList.tui.tsx +161 -0
- package/src/shared/components/MachineList.web.tsx +210 -0
- package/src/shared/components/ProjectList.tsx +176 -0
- package/src/shared/components/ProjectList.tui.tsx +109 -0
- package/src/shared/components/ProjectList.web.tsx +143 -0
- package/src/shared/components/SpacesBrowser.tsx +332 -0
- package/src/shared/components/SpacesBrowser.tui.tsx +163 -0
- package/src/shared/components/SpacesBrowser.web.tsx +221 -0
- package/src/shared/components/index.ts +103 -0
- package/src/shared/hooks/index.ts +16 -0
- package/src/shared/hooks/useNavigation.ts +226 -0
- package/src/shared/index.ts +122 -0
- package/src/shared/providers/LocalMachineProvider.ts +425 -0
- package/src/shared/providers/MachineProvider.ts +165 -0
- package/src/shared/providers/RemoteMachineProvider.ts +444 -0
- package/src/shared/providers/index.ts +26 -0
- package/src/shared/types.ts +145 -0
- package/src/tui/adapters.ts +120 -0
- package/src/tui/app.tsx +1816 -0
- package/src/tui/components/Terminal.tsx +580 -0
- package/src/tui/hooks/index.ts +35 -0
- package/src/tui/hooks/useAppState.ts +314 -0
- package/src/tui/hooks/useDaemonStatus.ts +174 -0
- package/src/tui/hooks/useInboxTUI.ts +113 -0
- package/src/tui/hooks/useRemoteMachines.ts +209 -0
- package/src/tui/index.ts +24 -0
- package/src/tui/state.ts +299 -0
- package/src/tui/terminal-bracketed-paste.test.ts +45 -0
- package/src/tui/terminal-bracketed-paste.ts +47 -0
- package/src/types/bundle.ts +112 -0
- package/src/types/config.ts +89 -0
- package/src/types/errors.ts +206 -0
- package/src/types/identity.ts +284 -0
- package/src/types/workspace-fuzzy.ts +49 -0
- package/src/types/workspace.ts +151 -0
- package/src/utils/bun-socket-writer.ts +80 -0
- package/src/utils/deps.ts +127 -0
- package/src/utils/fuzzy-match.ts +125 -0
- package/src/utils/logger.ts +127 -0
- package/src/utils/markdown.ts +254 -0
- package/src/utils/onboarding.ts +229 -0
- package/src/utils/prompts.ts +114 -0
- package/src/utils/run-commands.ts +112 -0
- package/src/utils/run-scripts.ts +142 -0
- package/src/utils/sanitize.ts +98 -0
- package/src/utils/secrets.ts +122 -0
- package/src/utils/shell-escape.ts +40 -0
- package/src/utils/utf8.ts +79 -0
- package/src/utils/workspace-state.ts +47 -0
- package/src/web/README.md +73 -0
- package/src/web/bun.lock +575 -0
- package/src/web/eslint.config.js +23 -0
- package/src/web/index.html +16 -0
- package/src/web/package.json +37 -0
- package/src/web/public/vite.svg +1 -0
- package/src/web/src/App.tsx +604 -0
- package/src/web/src/assets/react.svg +1 -0
- package/src/web/src/components/Terminal.tsx +207 -0
- package/src/web/src/hooks/useRelayConnection.ts +224 -0
- package/src/web/src/hooks/useTerminal.ts +699 -0
- package/src/web/src/index.css +55 -0
- package/src/web/src/lib/crypto/__tests__/web-terminal.test.ts +1158 -0
- package/src/web/src/lib/crypto/frames.ts +205 -0
- package/src/web/src/lib/crypto/handshake.ts +396 -0
- package/src/web/src/lib/crypto/identity.ts +128 -0
- package/src/web/src/lib/crypto/keyexchange.ts +246 -0
- package/src/web/src/lib/crypto/relay-signing.ts +53 -0
- package/src/web/src/lib/invite.ts +58 -0
- package/src/web/src/lib/storage/identity-store.ts +94 -0
- package/src/web/src/main.tsx +10 -0
- package/src/web/src/types/identity.ts +45 -0
- package/src/web/tsconfig.app.json +28 -0
- package/src/web/tsconfig.json +7 -0
- package/src/web/tsconfig.node.json +26 -0
- package/src/web/vite.config.ts +31 -0
- package/todo-security.md +92 -0
- package/tsconfig.json +23 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/12b7107e435bf1b9a8713a7f320472a63e543104d633d89a26f8d21f4e4ef182.sqlite-wal +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-shm +0 -0
- package/worker/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/1a1ac3db1ab86ecf712f90322868a9aabc2c7dc9fe2dfbe94f9b075096276b0f.sqlite-wal +0 -0
- package/worker/bun.lock +237 -0
- package/worker/package.json +22 -0
- package/worker/schema.sql +96 -0
- package/worker/src/handlers/auth.ts +451 -0
- package/worker/src/handlers/subdomains.ts +376 -0
- package/worker/src/handlers/user.ts +98 -0
- package/worker/src/index.ts +70 -0
- package/worker/src/middleware/auth.ts +152 -0
- package/worker/src/services/cloudflare.ts +609 -0
- package/worker/src/types.ts +96 -0
- package/worker/tsconfig.json +15 -0
- package/worker/wrangler.toml +26 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote session protocol - encrypted messages between client and machine
|
|
3
|
+
*
|
|
4
|
+
* These messages are sent over the encrypted channel after X3DH handshake.
|
|
5
|
+
*
|
|
6
|
+
* ## Protocol Layers
|
|
7
|
+
*
|
|
8
|
+
* 1. **Browsing Mode**: Uses JSON-RPC style messages (list_workspaces, attach_session, etc.)
|
|
9
|
+
* - Client sends: ClientToMachineMessage
|
|
10
|
+
* - Machine responds: MachineToClientMessage
|
|
11
|
+
*
|
|
12
|
+
* 2. **Attached Mode**: Uses binary framing with tmux-lite protocol
|
|
13
|
+
* - STREAM_ID.DATA (0): Raw PTY bytes (stdin/stdout)
|
|
14
|
+
* - STREAM_ID.CONTROL (1): JSON SessionCtrl messages (resize, detach, attach-init)
|
|
15
|
+
* - See src/lib/tmux-lite/protocol.ts for SessionCtrl/SessionEvent types
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// Re-export InboxItem from tmux-lite protocol
|
|
19
|
+
export type { InboxItem } from "../tmux-lite/protocol.js";
|
|
20
|
+
|
|
21
|
+
// Re-export attached mode control types from tmux-lite
|
|
22
|
+
// These are used in attached mode for resize/detach/attach-init
|
|
23
|
+
export type { SessionCtrl, SessionEvent } from "../tmux-lite/protocol.js";
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Client → Machine Messages (Browsing Mode)
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
/** Request list of workspaces on the machine */
|
|
30
|
+
export interface ListWorkspacesRequest {
|
|
31
|
+
type: "list_workspaces";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Request list of sessions, optionally filtered by workspace */
|
|
35
|
+
export interface ListSessionsRequest {
|
|
36
|
+
type: "list_sessions";
|
|
37
|
+
workspaceId?: string; // Filter by workspace, or all if omitted
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Attach to a session (existing or new) */
|
|
41
|
+
export interface AttachSessionRequest {
|
|
42
|
+
type: "attach_session";
|
|
43
|
+
sessionId?: string; // Attach to existing session
|
|
44
|
+
workspaceId?: string; // Create new session in workspace
|
|
45
|
+
sessionName?: string; // Name for new session (optional)
|
|
46
|
+
cols?: number; // Terminal dimensions
|
|
47
|
+
rows?: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Request list of projects on the machine */
|
|
51
|
+
export interface ListProjectsRequest {
|
|
52
|
+
type: "list_projects";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Kill a session */
|
|
56
|
+
export interface KillSessionRequest {
|
|
57
|
+
type: "kill_session";
|
|
58
|
+
sessionId: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Delete a workspace */
|
|
62
|
+
export interface DeleteWorkspaceRequest {
|
|
63
|
+
type: "delete_workspace";
|
|
64
|
+
workspaceId: string;
|
|
65
|
+
projectName: string; // Needed to locate workspace
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Request inbox items */
|
|
69
|
+
export interface GetInboxRequest {
|
|
70
|
+
type: "get_inbox";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Clear inbox item(s) */
|
|
74
|
+
export interface ClearInboxRequest {
|
|
75
|
+
type: "clear_inbox";
|
|
76
|
+
id?: string; // If omitted, clears all
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Mark inbox item as read */
|
|
80
|
+
export interface MarkInboxReadRequest {
|
|
81
|
+
type: "mark_inbox_read";
|
|
82
|
+
id: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ============================================================================
|
|
86
|
+
// Machine → Client Messages (Browsing Mode)
|
|
87
|
+
// ============================================================================
|
|
88
|
+
|
|
89
|
+
/** Workspace information */
|
|
90
|
+
export interface WorkspaceInfo {
|
|
91
|
+
id: string; // Workspace directory name
|
|
92
|
+
name: string; // Display name
|
|
93
|
+
path: string; // Full path
|
|
94
|
+
projectName: string; // Parent project name
|
|
95
|
+
branch?: string; // Git branch if available
|
|
96
|
+
sessionCount: number; // Number of active sessions
|
|
97
|
+
isStale?: boolean; // No activity for 30+ days
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Session information */
|
|
101
|
+
export interface SessionInfo {
|
|
102
|
+
id: string;
|
|
103
|
+
name: string; // Display name (project:workspace:num)
|
|
104
|
+
workspaceId: string;
|
|
105
|
+
attached: boolean; // Currently attached by another client
|
|
106
|
+
createdAt: number;
|
|
107
|
+
processTitle?: string; // Current process (e.g., "vim", "npm run dev")
|
|
108
|
+
exitCode?: number; // If session has exited
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Response with workspace list */
|
|
112
|
+
export interface WorkspaceListResponse {
|
|
113
|
+
type: "workspace_list";
|
|
114
|
+
workspaces: WorkspaceInfo[];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Response with session list */
|
|
118
|
+
export interface SessionListResponse {
|
|
119
|
+
type: "session_list";
|
|
120
|
+
sessions: SessionInfo[];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Session attached successfully - transitions to attached mode */
|
|
124
|
+
export interface AttachedResponse {
|
|
125
|
+
type: "attached";
|
|
126
|
+
sessionId: string;
|
|
127
|
+
sessionName: string;
|
|
128
|
+
cols: number;
|
|
129
|
+
rows: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Detached from session - back to browsing mode */
|
|
133
|
+
export interface DetachedResponse {
|
|
134
|
+
type: "detached";
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Session exited */
|
|
138
|
+
export interface SessionExitedResponse {
|
|
139
|
+
type: "session_exited";
|
|
140
|
+
sessionId: string;
|
|
141
|
+
exitCode: number;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Error response */
|
|
145
|
+
export interface ErrorResponse {
|
|
146
|
+
type: "error";
|
|
147
|
+
code: string;
|
|
148
|
+
message: string;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Project information */
|
|
152
|
+
export interface ProjectInfo {
|
|
153
|
+
name: string;
|
|
154
|
+
repository: string;
|
|
155
|
+
workspaceCount: number;
|
|
156
|
+
isCurrent: boolean;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Response with project list */
|
|
160
|
+
export interface ProjectListResponse {
|
|
161
|
+
type: "project_list";
|
|
162
|
+
projects: ProjectInfo[];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Session killed response */
|
|
166
|
+
export interface SessionKilledResponse {
|
|
167
|
+
type: "session_killed";
|
|
168
|
+
sessionId: string;
|
|
169
|
+
workspaceId: string;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Workspace deleted response */
|
|
173
|
+
export interface WorkspaceDeletedResponse {
|
|
174
|
+
type: "workspace_deleted";
|
|
175
|
+
workspaceId: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Response with inbox items */
|
|
179
|
+
export interface InboxListResponse {
|
|
180
|
+
type: "inbox_list";
|
|
181
|
+
items: import("../tmux-lite/protocol.js").InboxItem[];
|
|
182
|
+
unreadCount: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Inbox item(s) cleared response */
|
|
186
|
+
export interface InboxClearedResponse {
|
|
187
|
+
type: "inbox_cleared";
|
|
188
|
+
id?: string; // Which item was cleared, or undefined if all cleared
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Inbox item marked as read response */
|
|
192
|
+
export interface InboxMarkedReadResponse {
|
|
193
|
+
type: "inbox_marked_read";
|
|
194
|
+
id: string;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ============================================================================
|
|
198
|
+
// Union Types
|
|
199
|
+
// ============================================================================
|
|
200
|
+
|
|
201
|
+
/** All messages from client to machine (browsing mode) */
|
|
202
|
+
export type ClientToMachineMessage =
|
|
203
|
+
| ListWorkspacesRequest
|
|
204
|
+
| ListSessionsRequest
|
|
205
|
+
| AttachSessionRequest
|
|
206
|
+
| ListProjectsRequest
|
|
207
|
+
| KillSessionRequest
|
|
208
|
+
| DeleteWorkspaceRequest
|
|
209
|
+
| GetInboxRequest
|
|
210
|
+
| ClearInboxRequest
|
|
211
|
+
| MarkInboxReadRequest;
|
|
212
|
+
|
|
213
|
+
/** All messages from machine to client (browsing mode) */
|
|
214
|
+
export type MachineToClientMessage =
|
|
215
|
+
| WorkspaceListResponse
|
|
216
|
+
| SessionListResponse
|
|
217
|
+
| AttachedResponse
|
|
218
|
+
| DetachedResponse
|
|
219
|
+
| SessionExitedResponse
|
|
220
|
+
| ErrorResponse
|
|
221
|
+
| ProjectListResponse
|
|
222
|
+
| SessionKilledResponse
|
|
223
|
+
| WorkspaceDeletedResponse
|
|
224
|
+
| InboxListResponse
|
|
225
|
+
| InboxClearedResponse
|
|
226
|
+
| InboxMarkedReadResponse;
|
|
227
|
+
|
|
228
|
+
/** All remote session messages */
|
|
229
|
+
export type RemoteSessionMessage =
|
|
230
|
+
| ClientToMachineMessage
|
|
231
|
+
| MachineToClientMessage;
|
|
232
|
+
|
|
233
|
+
// ============================================================================
|
|
234
|
+
// Parsing
|
|
235
|
+
// ============================================================================
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Parse a remote session message from JSON
|
|
239
|
+
*/
|
|
240
|
+
export function parseRemoteMessage(json: string): RemoteSessionMessage | null {
|
|
241
|
+
try {
|
|
242
|
+
const msg = JSON.parse(json);
|
|
243
|
+
if (!msg || typeof msg.type !== "string") {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return msg as RemoteSessionMessage;
|
|
247
|
+
} catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Serialize a remote session message to JSON
|
|
254
|
+
*/
|
|
255
|
+
export function serializeRemoteMessage(msg: RemoteSessionMessage): string {
|
|
256
|
+
return JSON.stringify(msg);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Check if a message is a browse command (workspace/session listing)
|
|
261
|
+
*/
|
|
262
|
+
export function isBrowseMessage(msg: RemoteSessionMessage): msg is
|
|
263
|
+
| ListWorkspacesRequest
|
|
264
|
+
| ListSessionsRequest
|
|
265
|
+
| AttachSessionRequest {
|
|
266
|
+
return ["list_workspaces", "list_sessions", "attach_session"].includes(msg.type);
|
|
267
|
+
}
|