Skip to content

Commit 6ebc04d

Browse files
authored
v0.9.39: people page, desktop agent browser sign-in and updates, mothership memory erasure, oauth refresh hardening, v2 file paths, disposable email blocking
2 parents d2823ea + ac604b7 commit 6ebc04d

332 files changed

Lines changed: 92232 additions & 4335 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/scripts/http-e2e.sh‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ case "$group" in
145145
export DB_TX_TRIPWIRE=throw
146146
export NEXT_PUBLIC_CHAT_DISABLED=true
147147
export SIM_LINKS=true
148+
export PEOPLE=true
148149
start_app scim 3017 SCIM record-http-status
149150
SCIM_E2E_BASE_URL="$local_app_url" \
150151
SCIM_E2E_DATABASE_URL="$DATABASE_URL" \
@@ -161,6 +162,11 @@ case "$group" in
161162
SIM_LINKS_E2E_AUTH_SECRET="$BETTER_AUTH_SECRET" \
162163
SIM_LINKS_E2E_REPORT_PATH="$report_dir/sim-links-e2e-report.json" \
163164
bun run test:sim-links:e2e
165+
PEOPLE_E2E_BASE_URL="$local_app_url" \
166+
PEOPLE_E2E_DATABASE_URL="$DATABASE_URL" \
167+
PEOPLE_E2E_AUTH_SECRET="$BETTER_AUTH_SECRET" \
168+
PEOPLE_E2E_REPORT_PATH="$report_dir/people-e2e-report.json" \
169+
bun run test:people:e2e
164170
;;
165171

166172
# The search suites serve their own fixtures in-process and need no app. They share this group

‎.github/workflows/ci.yml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ jobs:
114114
migrate:
115115
permissions:
116116
contents: read
117+
id-token: write
117118
name: migrate
118119
needs: [checks]
119120
# Explicit need results instead of the implicit success(): a skipped job
@@ -133,6 +134,8 @@ jobs:
133134
STAGING_DATABASE_URL: ${{ secrets.STAGING_DATABASE_URL }}
134135
MIGRATION_DATABASE_URL: ${{ secrets.MIGRATION_DATABASE_URL }}
135136
STAGING_MIGRATION_DATABASE_URL: ${{ secrets.STAGING_MIGRATION_DATABASE_URL }}
137+
TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }}
138+
TS_AUDIENCE: ${{ secrets.TS_AUDIENCE }}
136139

137140
# Same ordering for dev (schema push before the dev image lands in ECR)
138141
migrate-dev:
@@ -146,6 +149,8 @@ jobs:
146149
environment: dev
147150
secrets:
148151
DEV_DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
152+
TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }}
153+
TS_AUDIENCE: ${{ secrets.TS_AUDIENCE }}
149154

150155
# Dev: build immutable images alongside the schema push and Trigger upload.
151156
image-dev:
@@ -1166,6 +1171,9 @@ jobs:
11661171
11671172
# Process docs embeddings (only when docs change, after images are promoted)
11681173
docs:
1174+
permissions:
1175+
contents: read
1176+
id-token: write
11691177
name: docs
11701178
needs: [promote, docs-changes]
11711179
# Explicit results: see migrate's comment.
@@ -1178,6 +1186,8 @@ jobs:
11781186
secrets:
11791187
DATABASE_URL: ${{ secrets.DATABASE_URL }}
11801188
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
1189+
TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }}
1190+
TS_AUDIENCE: ${{ secrets.TS_AUDIENCE }}
11811191

11821192
# Create GitHub Release (only for version commits on main, after all builds complete)
11831193
release:

‎.github/workflows/desktop-e2e.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ jobs:
115115
PLAYWRIGHT_JSON_OUTPUT_FILE: test-results/desktop-smoke.json
116116
BACKGROUND_EXECUTOR_REPORT_PATH: test-results/background-executor-report.json
117117
TERMINAL_CANCEL_REPORT_PATH: test-results/terminal-cancel-report.json
118+
CONTINUE_SIGN_IN_REPORT_PATH: test-results/continue-sign-in-report.json
118119

119120
- name: Upload test results
120121
if: failure()
@@ -192,6 +193,7 @@ jobs:
192193
env:
193194
BACKGROUND_EXECUTOR_REPORT_PATH: test-results/background-executor-report.json
194195
TERMINAL_CANCEL_REPORT_PATH: test-results/terminal-cancel-report.json
196+
CONTINUE_SIGN_IN_REPORT_PATH: test-results/continue-sign-in-report.json
195197

196198
- name: Upload test results
197199
if: failure()

‎.github/workflows/docs-negotiation.yml‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,16 @@ jobs:
226226
if: always() && steps.build.outcome == 'success'
227227
run: |
228228
mkdir -p apps/docs/test-results
229+
FEEDBACK_TLS_DIR=$(mktemp -d)
230+
export DOCS_FEEDBACK_TEST_CERT="$FEEDBACK_TLS_DIR/cert.pem"
231+
export DOCS_FEEDBACK_TEST_KEY="$FEEDBACK_TLS_DIR/key.pem"
232+
openssl req -x509 -newkey rsa:2048 -nodes -days 1 -subj '/CN=127.0.0.1' -addext 'subjectAltName=IP:127.0.0.1' -keyout "$DOCS_FEEDBACK_TEST_KEY" -out "$DOCS_FEEDBACK_TEST_CERT" 2>/dev/null
233+
export NODE_EXTRA_CA_CERTS="$DOCS_FEEDBACK_TEST_CERT"
234+
export DOCS_FEEDBACK_WEBHOOK_URL=https://127.0.0.1:3443/feedback
235+
export DOCS_FEEDBACK_WEBHOOK_TOKEN=$(openssl rand -hex 32)
229236
bun run --cwd apps/docs start --port 3001 >apps/docs/test-results/docs-server.log 2>&1 &
230237
DOCS_SERVER_PID=$!
231-
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true' EXIT
238+
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true; rm -rf "$FEEDBACK_TLS_DIR"' EXIT
232239
STATUS=0
233240
bun run --cwd apps/docs test:negotiation:e2e || STATUS=1
234241
bun run --cwd apps/docs scripts/test-docs-interfaces-e2e.ts || STATUS=1

‎.github/workflows/docs.yml‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ on:
77
required: false
88
OPENAI_API_KEY:
99
required: false
10+
TS_OAUTH_CLIENT_ID:
11+
required: false
12+
TS_AUDIENCE:
13+
required: false
1014
workflow_dispatch:
1115
inputs:
1216
publish:
@@ -40,6 +44,10 @@ jobs:
4044
concurrency:
4145
group: docs-search-index-production
4246
cancel-in-progress: false
47+
permissions:
48+
contents: read
49+
# Tailscale workload identity federation exchanges this job's OIDC token.
50+
id-token: write
4351

4452
steps:
4553
- name: Record verified deployment and backup
@@ -68,6 +76,15 @@ jobs:
6876
provider: ${{ vars.CI_PROVIDER }}
6977
node-version: '24'
7078

79+
# Database IP restrictions admit the tailnet's app connector; see migrate.yml.
80+
- name: Join the tailnet
81+
if: vars.CI_DB_TAILNET == 'true'
82+
uses: tailscale/github-action@d1b6cd204f8dceda5b3eaad7f1f767be390056cd # v4.2.0
83+
with:
84+
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
85+
audience: ${{ secrets.TS_AUDIENCE }}
86+
tags: tag:ci
87+
7188
- name: Process docs embeddings
7289
working-directory: ./apps/docs
7390
env:

‎.github/workflows/migrate.yml‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ on:
1818
required: false
1919
STAGING_MIGRATION_DATABASE_URL:
2020
required: false
21+
TS_OAUTH_CLIENT_ID:
22+
required: false
23+
TS_AUDIENCE:
24+
required: false
2125
workflow_dispatch:
2226
inputs:
2327
environment:
@@ -46,6 +50,10 @@ jobs:
4650
concurrency:
4751
group: migrate-${{ inputs.environment }}
4852
cancel-in-progress: false
53+
permissions:
54+
contents: read
55+
# Tailscale workload identity federation exchanges this job's OIDC token.
56+
id-token: write
4957

5058
steps:
5159
# An environment only migrates from its own branch, so a manual dispatch
@@ -73,6 +81,18 @@ jobs:
7381
exit 1
7482
fi
7583
84+
# Database IP restrictions admit the tailnet's app connector, never a
85+
# runner's address. The action already passes --accept-routes, which
86+
# Linux nodes need to use app connector routes; repeating it in args
87+
# makes `tailscale up` reject the duplicate flag.
88+
- name: Join the tailnet
89+
if: vars.CI_DB_TAILNET == 'true'
90+
uses: tailscale/github-action@d1b6cd204f8dceda5b3eaad7f1f767be390056cd # v4.2.0
91+
with:
92+
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
93+
audience: ${{ secrets.TS_AUDIENCE }}
94+
tags: tag:ci
95+
7696
- name: Checkout code
7797
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
7898
with:

‎apps/desktop/README.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ tabs and popups select their session from the destination origin. Sign-out and a
171171
or server changes use the existing browser teardown. Browser views retain their own
172172
permission/download policy, SSRF guards, and minimal preload with no `simDesktop` API.
173173

174+
**Continue in Chrome** (browser menu, plus a hint on known sign-in hosts) opens the active
175+
https tab in a chosen Chromium-family profile and **Bring session back** imports only that
176+
page's registrable-domain cookies from it; the rationale and gating live on
177+
`SimDesktopBrowserImportApi.continueSignIn` in `@sim/desktop-bridge`.
178+
174179
Generated HTML remains inside its `allow-scripts` sandbox. The driver can inspect and
175180
interact with inline frames through isolated Chromium worlds, including out-of-process
176181
frames; it does not grant those pages access to the parent app. These shell changes

‎apps/desktop/build/entitlements.mac.plist‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,5 @@
1414
Hardened Runtime denies the camera no matter what the user allowed. -->
1515
<key>com.apple.security.device.camera</key>
1616
<true/>
17-
<!-- WebAuthn hybrid transport (passkey on the user's phone via QR) rides
18-
Bluetooth proximity; without this the QR option silently never
19-
completes in signed builds. -->
20-
<key>com.apple.security.device.bluetooth</key>
21-
<true/>
2217
</dict>
2318
</plist>

‎apps/desktop/e2e-durations.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"chat-panel.spec.ts": 31.08,
88
"check-report.spec.ts": 3.78,
99
"computer-use.spec.ts": 2.07,
10+
"continue-sign-in.spec.ts": 5.8,
1011
"desktop-tools-live-sim.spec.ts": 0.0,
1112
"local-files.spec.ts": 27.68,
1213
"packaged-smoke.spec.ts": 0.0,

0 commit comments

Comments
 (0)