gestalt-mobile 0.10.0 → 0.12.0

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.
Files changed (42) hide show
  1. package/README.md +64 -14
  2. package/dist/client/assets/index-B7KwEjTE.js +19 -0
  3. package/dist/client/assets/index-CMs5ZzxJ.css +1 -0
  4. package/dist/client/index.html +2 -2
  5. package/dist/server/server/app.js +58 -3
  6. package/dist/server/server/cli.js +6 -0
  7. package/dist/server/server/composition.js +221 -150
  8. package/dist/server/server/config.js +64 -2
  9. package/dist/server/server/features/auth/application/ports.js +8 -0
  10. package/dist/server/server/features/auth/devices/application.js +26 -0
  11. package/dist/server/server/features/auth/devices/list/endpoint.js +12 -0
  12. package/dist/server/server/features/auth/devices/rename/endpoint.js +37 -0
  13. package/dist/server/server/features/auth/devices/revoke/endpoint.js +48 -0
  14. package/dist/server/server/features/auth/domain/authorization.js +101 -0
  15. package/dist/server/server/features/auth/domain/device-nickname.js +13 -0
  16. package/dist/server/server/features/auth/domain/errors.js +7 -0
  17. package/dist/server/server/features/auth/domain/identifiers.js +45 -0
  18. package/dist/server/server/features/auth/enrollment-tickets/cancel/endpoint.js +14 -0
  19. package/dist/server/server/features/auth/enrollment-tickets/endpoint.js +17 -0
  20. package/dist/server/server/features/auth/enrollment-tickets/status/endpoint.js +13 -0
  21. package/dist/server/server/features/auth/login/options/endpoint.js +44 -0
  22. package/dist/server/server/features/auth/login/verify/endpoint.js +88 -0
  23. package/dist/server/server/features/auth/logout/endpoint.js +16 -0
  24. package/dist/server/server/features/auth/register/options/endpoint.js +34 -0
  25. package/dist/server/server/features/auth/register/verify/endpoint.js +56 -0
  26. package/dist/server/server/features/auth/status/endpoint.js +24 -0
  27. package/dist/server/server/features/plans/application/native-plan-alignment.js +39 -0
  28. package/dist/server/server/features/plans/domain/workspace-plan-catalog.js +6 -0
  29. package/dist/server/server/features/plans/get-workspace-plan/endpoint.js +23 -0
  30. package/dist/server/server/features/plans/list-workspace-plans/endpoint.js +18 -0
  31. package/dist/server/server/features/sessions/session-events/endpoint.js +7 -2
  32. package/dist/server/server/platform/auth/simple-webauthn-adapter.js +75 -0
  33. package/dist/server/server/platform/auth/sqlite-authorization-store.js +478 -0
  34. package/dist/server/server/platform/codex/session-runtime.js +28 -0
  35. package/dist/server/server/platform/codex/thread-plan-name.js +23 -0
  36. package/dist/server/server/platform/events/websocket-heartbeat.js +5 -1
  37. package/dist/server/server/platform/http/authorization-boundary.js +60 -0
  38. package/dist/server/server/platform/plans/filesystem-plan-status-source.js +29 -8
  39. package/dist/server/server/platform/plans/filesystem-workspace-plan-catalog.js +113 -0
  40. package/package.json +7 -2
  41. package/dist/client/assets/index-Cjxvsp9k.js +0 -12
  42. package/dist/client/assets/index-DrULMr7l.css +0 -1
package/README.md CHANGED
@@ -54,16 +54,18 @@ configuration or skill files.
54
54
 
55
55
  ## Command-line options
56
56
 
57
- | Option | Default | Purpose |
58
- | ------------------- | ------------------- | -------------------------------------------- |
59
- | `--cwd <path>` | Current directory | Root containing selectable workspaces |
60
- | `--host <address>` | `127.0.0.1` | HTTP listen address |
61
- | `--port <number>` | `3000` | HTTP listen port, from 1 through 65535 |
62
- | `--data-dir <path>` | XDG state directory | Directory containing `relay.sqlite` |
63
- | `--skills <profile>` | | Apply a saved global profile to every session |
64
- | `--skills list` | | List global profiles without starting the server |
65
- | `--help` | | Print usage without starting the application |
66
- | `--version` | | Print the installed package version |
57
+ | Option | Default | Purpose |
58
+ | -------------------------- | -------------------- | ----------------------------------------------------------------- |
59
+ | `--cwd <path>` | Current directory | Root containing selectable workspaces |
60
+ | `--host <address>` | `127.0.0.1` | HTTP listen address |
61
+ | `--port <number>` | `3000` | HTTP listen port, from 1 through 65535 |
62
+ | `--public-origin <origin>` | Loopback Vite origin | Exact browser origin for passkeys; required for non-loopback hosts |
63
+ | `--disable-passkey-auth` | Off | Disable passkey access control and serve every client directly |
64
+ | `--data-dir <path>` | XDG state directory | Directory containing `relay.sqlite` |
65
+ | `--skills <profile>` | | Apply a saved global profile to every session |
66
+ | `--skills list` | | List global profiles without starting the server |
67
+ | `--help` | | Print usage without starting the application |
68
+ | `--version` | | Print the installed package version |
67
69
 
68
70
  `--cwd` may be relative to the directory where the command is invoked. The
69
71
  resolved directory is the selectable root of a recursive workspace tree. Dot
@@ -73,10 +75,36 @@ included only when their real target stays under the resolved root; repeated
73
75
  real targets and cycles are omitted. Browser requests select nodes by opaque ID,
74
76
  while real filesystem paths remain server-side.
75
77
 
76
- Gestalt Mobile has no built-in authentication or TLS. The loopback default is
77
- safe for use on the same computer. `--host 0.0.0.0` exposes the relay and its
78
- Codex controls on every network interface; use it only behind a trusted private
79
- VPN or an authenticated, encrypted reverse proxy.
78
+ ## Passkey deployment and operating limits
79
+
80
+ Gestalt Mobile has built-in passkey authentication, but does **not** terminate
81
+ TLS. `--public-origin` must be the exact origin the browser uses, including its
82
+ external HTTPS scheme and port. `http://localhost` is the development-only
83
+ exception; every other browser origin must be HTTPS. For example, a local
84
+ developer may use `--public-origin http://localhost:3000`, while a deployed
85
+ relay may listen locally on `127.0.0.1:3000` behind
86
+ `https://relay.example.org` with `--public-origin https://relay.example.org`.
87
+
88
+ For mobile or network use, put a trusted HTTPS reverse proxy or tunnel in front
89
+ of the relay. It must preserve the external host and origin, cookies, and
90
+ WebSocket upgrade; do not mount the relay below a rewritten path prefix. Same
91
+ hostname processes may use different ports and share authorization (for example,
92
+ two local relay processes behind `https://relay.example.org`), but an RP-ID/
93
+ hostname change is refused once credentials exist because it would strand those
94
+ credentials. Do not expose `--host 0.0.0.0` before that boundary is in place.
95
+
96
+ An empty authorization store is deliberately bootstrap-open: the first verified passkey becomes the owner. Register a device before exposing the service. The
97
+ final authorized device cannot be deleted; synced passkeys can represent more
98
+ than one physical device, and an enrollment QR/link is neither recovery nor
99
+ proof of physical proximity.
100
+
101
+ `--disable-passkey-auth` restores the unprotected serving behavior from before
102
+ passkey authentication was added. It does not create or consult passkey state,
103
+ and `--public-origin` is not required even for a non-loopback listener. This is
104
+ an explicit unsafe mode: anyone who can reach the HTTP or WebSocket listener has
105
+ full access to workspaces, Codex sessions, and Git operations. Use it only on a
106
+ trusted, access-controlled local environment; never expose that mode directly
107
+ to a shared or public network. Startup prints a warning whenever it is active.
80
108
 
81
109
  ## Persistent state
82
110
 
@@ -87,6 +115,28 @@ stored below `$XDG_STATE_HOME/gestalt-mobile/<workspace-hash>/relay.sqlite`, or
87
115
  `XDG_STATE_HOME` is unset. A matching legacy `codex-relay` database is reused
88
116
  when present.
89
117
 
118
+ Authorization is separate shared state at
119
+ `~/.codex-gestalt/gestalt-mobile/auth.sqlite` (under the selected home). Its
120
+ directory is created owner-only (`0700`); treat the database as sensitive and
121
+ keep it accessible only to the local relay user. Back up `auth.sqlite`
122
+ with `auth.sqlite-wal` and `auth.sqlite-shm` only after **all** instances are
123
+ stopped, or use SQLite backup tooling.
124
+
125
+ Recovery after losing every passkey is deliberately local and manual: stop every
126
+ instance, make a backup, remove only `auth.sqlite` and its `-wal`/`-shm`
127
+ sidecars, restart into visibly open bootstrap mode, and immediately enroll a new
128
+ device before exposing the service. This discards authorization, device, and
129
+ session state only—not workspace relay databases or history—and is dangerous
130
+ while the service is exposed. There is intentionally no hosted service,
131
+ federation, remote administrator, recovery code, credential export,
132
+ authentication audit analytics, attestation trust policy, or automatic reset.
133
+
134
+ For the protocol requirements behind these limits, see the official
135
+ [SimpleWebAuthn server guide](https://simplewebauthn.dev/docs/packages/server),
136
+ [SimpleWebAuthn passkey guidance](https://simplewebauthn.dev/docs/advanced/passkeys/),
137
+ [MDN passkey guide](https://developer.mozilla.org/en-US/docs/Web/Security/Authentication/Passkeys),
138
+ and [W3C WebAuthn RP ID, origin, and challenge requirements](https://www.w3.org/TR/webauthn-3/).
139
+
90
140
  ## Sessions
91
141
 
92
142
  The Sessions tab uses the recursive filesystem tree to choose the base directory