feat(runner): WS protocol server with handshake

apps/runner scaffold (app-tier, walking-skeleton story 04): WS server
speaking @repo/core-runner-protocol. Every inbound/outbound frame is
envelope-wrapped and zod-parsed; hello/ready handshake gates on the
workspace-scoped token (constant-time compare, redacted token on
rejection replies); named error events for version/schema/auth
rejections. Config via env only (token never argv); port announced on
stdout for the story-06 provisioner. Runtime deps: ws (the standard
Node WS server; ADR-022 traces do not apply to app-tier) and zod.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
This commit is contained in:
2026-07-12 22:29:24 +02:00
parent 11e5012572
commit b090e26701
19 changed files with 1331 additions and 11 deletions

50
pnpm-lock.yaml generated
View File

@@ -117,6 +117,46 @@ importers:
specifier: ^3.0.0
version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
apps/runner:
dependencies:
"@repo/core-runner-protocol":
specifier: workspace:*
version: link:../../packages/core-runner-protocol
ws:
specifier: ^8.18.0
version: 8.21.0
zod:
specifier: ^3.25.0
version: 3.25.76
devDependencies:
"@repo/core-eslint":
specifier: workspace:*
version: link:../../packages/core-eslint
"@repo/core-testing":
specifier: workspace:*
version: link:../../packages/core-testing
"@repo/core-typescript":
specifier: workspace:*
version: link:../../packages/core-typescript
"@types/node":
specifier: ^22.0.0
version: 22.19.17
"@types/ws":
specifier: ^8.18.0
version: 8.18.1
"@vitest/coverage-v8":
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
tsx:
specifier: ^4.0.0
version: 4.21.0
typescript:
specifier: ^5.8.0
version: 5.9.3
vitest:
specifier: ^3.0.0
version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
apps/storybook:
devDependencies:
"@playwright/test":
@@ -15019,7 +15059,7 @@ snapshots:
"@parcel/watcher": 2.5.6
effect: 3.21.2
multipasta: 0.2.7
ws: 8.20.0
ws: 8.21.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -15034,7 +15074,7 @@ snapshots:
effect: 3.21.2
mime: 3.0.0
undici: 7.24.4
ws: 8.20.0
ws: 8.21.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -18187,7 +18227,7 @@ snapshots:
recast: 0.23.11
semver: 7.7.4
util: 0.12.5
ws: 8.20.0
ws: 8.21.0
optionalDependencies:
prettier: 3.8.1
transitivePeerDependencies:
@@ -20595,7 +20635,7 @@ snapshots:
"@types/ws": 8.18.1
entities: 7.0.1
whatwg-mimetype: 3.0.0
ws: 8.20.0
ws: 8.21.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -21473,7 +21513,7 @@ snapshots:
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.2.0
ws: 8.20.0
ws: 8.21.0
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil