Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
a18d9ec
test(workspaces): characterize runtime boundaries
boudra Aug 10, 2026
4898523
feat(workspaces): introduce runtime execution boundary
boudra Aug 10, 2026
d340365
feat(workspaces): route interactive terminals through runtimes
boudra Aug 10, 2026
b682f56
feat(workspaces): route file access through runtimes
boudra Aug 10, 2026
0520481
feat(workspaces): route Git operations through runtimes
boudra Aug 11, 2026
36241cb
feat(workspaces): run providers through workspace runtimes
boudra Aug 11, 2026
cbf59f4
feat(workspaces): own lifecycle through runtimes
boudra Aug 11, 2026
6ca27a9
feat(workspaces): publish external runtime contract
boudra Aug 11, 2026
3a36c76
feat(workspaces): choose runtime when creating workspaces
boudra Aug 12, 2026
359d544
feat(workspaces): probe providers in selected runtimes
boudra Aug 12, 2026
d03e429
feat(workspaces): accept Docker runtime journeys
boudra Aug 12, 2026
527b252
feat(workspaces): reconcile provider probe lifecycle
boudra Aug 12, 2026
33afa72
feat(workspaces): define project runtime source authority
boudra Aug 12, 2026
cbb8295
fix(workspaces): unblock desktop runtime lifecycle
boudra Aug 12, 2026
36d8464
refactor(workspaces): make Docker a generic runtime
boudra Aug 13, 2026
7c32fcd
refactor(workspaces): finalize runtime package boundaries
boudra Aug 14, 2026
e2ac23d
chore(merge): integrate main into workspace runtimes
boudra Aug 14, 2026
2501a46
fix(build): restore package lock metadata
boudra Aug 14, 2026
accd2d7
fix(build): update Nix dependency hash
boudra Aug 14, 2026
ff83ca4
fix(workspaces): restore clean runtime test paths
boudra Aug 14, 2026
d35c10a
test(workspaces): invoke npm portably on Windows
boudra Aug 14, 2026
51193e7
fix(workspaces): stabilize runtime CI paths
boudra Aug 14, 2026
cd42933
fix(workspaces): preserve runtime lifecycle boundaries
boudra Aug 14, 2026
54f0e63
Merge remote-tracking branch 'origin/main' into workspace-runtime-poc
boudra Aug 14, 2026
8a37f2f
fix: update Nix dependency hash
boudra Aug 14, 2026
a673817
test: include plugin in isolated build fixtures
boudra Aug 14, 2026
642c303
test: remove provider descriptor clock race
boudra Aug 14, 2026
b500809
test: assert worktree backing release
boudra Aug 14, 2026
e5f3b3d
fix(workspaces): preserve portable runtime readiness
boudra Aug 14, 2026
cf4d702
fix(workspaces): release archived runtime backing
boudra Aug 14, 2026
cd35415
test(desktop): combine dev prerequisite build states
boudra Aug 14, 2026
12c1a68
test(workspaces): await runtime teardown
boudra Aug 14, 2026
eafa5f2
fix(workspaces): resolve runtime Git portably
boudra Aug 14, 2026
3175a5f
chore: merge main into workspace runtime branch
boudra Aug 14, 2026
1518eb0
test(workspaces): isolate Git watcher readiness
boudra Aug 14, 2026
697a000
test(workspaces): isolate sibling Git fanout
boudra Aug 14, 2026
16e0967
test(workspaces): make Git isolation deterministic
boudra Aug 14, 2026
6d16961
fix(workspaces): resolve Windows runtime commands
boudra Aug 14, 2026
3a8824e
fix(workspaces): keep helper executable standalone
boudra Aug 14, 2026
692d477
style(workspaces): format Windows helper test
boudra Aug 14, 2026
d582304
test(workspaces): expect helper protocol framing
boudra Aug 14, 2026
91f76c9
test(workspaces): isolate host Git observer seam
boudra Aug 14, 2026
92a1e3f
fix(workspaces): release runtime resources on shutdown
boudra Aug 15, 2026
add858f
test(workspaces): isolate command runtime Git contracts
boudra Aug 15, 2026
18ec416
test(workspaces): bound runtime Git integration waits
boudra Aug 15, 2026
7919390
fix(workspaces): await Git watcher teardown
boudra Aug 15, 2026
bdfa718
test(workspaces): budget command runtime observation
boudra Aug 15, 2026
98bf569
test(workspaces): focus runtime observation isolation
boudra Aug 15, 2026
af14099
fix(workspaces): invalidate watches after helper writes
boudra Aug 15, 2026
1daccc4
test(workspaces): isolate runtime observation routing
boudra Aug 15, 2026
ec12c5c
fix(workspaces): resolve runtime Git observation command
boudra Aug 15, 2026
b607bed
test(workspaces): isolate runtime observation routing
boudra Aug 15, 2026
bf3910b
test(workspaces): keep launch fixture alive
boudra Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .github/ci-paths.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ hub:

server:
- "packages/server/**"
- "runtimes/fixture/**"
- "packages/workspace-helper/**"
- "packages/workspace-runtime-contract/**"
- "packages/app/e2e/support/fixtures/recording.*"

desktop:
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ jobs:
- name: Lint
run: npm run lint

- name: Enforce workspace runtime ownership boundaries
run: npm run check:workspace-runtime-boundaries && node --test scripts/workspace-runtime-boundaries.test.mjs

typecheck:
name: typecheck
needs: changes
Expand Down Expand Up @@ -129,6 +132,8 @@ jobs:
- name: Verify public package contents
run: |
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/protocol
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/workspace-runtime-contract
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/workspace-helper
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/client
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/server

Expand Down Expand Up @@ -163,6 +168,18 @@ jobs:
- name: Build server dependencies
run: npm run build:server-deps

- name: Test workspace runtime command contract package
if: ${{ needs.changes.outputs.full != 'false' || needs.changes.outputs.server != 'false' }}
run: npm test --workspace=@getpaseo/workspace-runtime-contract && npm test --workspace=@getpaseo/workspace-helper

- name: Prove the command runtime fixture is independently installable
if: ${{ runner.os == 'Linux' && (needs.changes.outputs.full != 'false' || needs.changes.outputs.server != 'false') }}
run: node --test scripts/workspace-runtime-standalone.test.mjs

- name: Prove clean server builds own public prerequisites
if: ${{ runner.os == 'Linux' && (needs.changes.outputs.full != 'false' || needs.changes.outputs.server != 'false') }}
run: node --test scripts/server-clean-build.test.mjs

- name: Run server tests
if: ${{ needs.changes.outputs.full != 'false' || needs.changes.outputs.server != 'false' }}
run: npm run test --workspace=@getpaseo/server
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ on:
- "packages/app/**"
- "packages/cli/**"
- "packages/client/**"
- "packages/desktop/**"
- "packages/workspace-helper/**"
- "packages/workspace-runtime-contract/**"
- "packages/expo-two-way-audio/**"
- "packages/highlight/**"
- "packages/plugin/**"
Expand Down
138 changes: 138 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,144 @@
"max-nested-callbacks": ["error", { "max": 3 }]
},
"overrides": [
{
"files": ["packages/server/src/**/*.{ts,tsx}"],
"rules": {
"no-restricted-imports": [
"error",
{
"patterns": [
{
"group": [
"**/workspace-runtime/internal/**",
"**/workspace-runtime/command/internal/**"
],
"message": "Workspace runtime internals are owned by their public entry points."
},
{
"group": ["**/workspace-helper/internal/**"],
"message": "Normal callers consume WorkspaceFiles from workspace-helper/index. Only the workspace-runtime parent integration and workspace-helper tests may assemble helper clients."
},
{
"group": [
"**/workspace-runtime/integration/**",
"**/workspace-runtime/git-observation/internal/**"
],
"message": "Git callers consume workspace-runtime/git-observation/index. Only runtime internals may assemble shared observation identity, placement, helpers, and lifecycle."
}
]
}
]
}
},
{
"files": [
"packages/server/src/server/workspace-runtime/index.ts",
"packages/server/src/server/workspace-runtime/command/index.ts",
"packages/server/src/server/workspace-runtime/command/internal/**/*.{ts,tsx}",
"packages/server/src/server/workspace-runtime/internal/**/*.{ts,tsx}",
"packages/server/src/server/workspace-helper/**/*.{ts,tsx}",
"packages/server/src/server/workspace-runtime/git-observation/**/*.{ts,tsx}",
"packages/server/src/server/workspace-runtime/internal/service.ts"
],
"rules": {
"no-restricted-imports": "off"
}
},
{
"files": [
"packages/server/src/server/session/files/**/*.{ts,tsx}",
"packages/server/src/server/session/git-mutation/**/*.{ts,tsx}",
"packages/server/src/server/session/provider/**/*.{ts,tsx}",
"packages/server/src/server/session/workspace-git-observer/**/*.{ts,tsx}",
"packages/server/src/server/session/workspace-provisioning/**/*.{ts,tsx}",
"packages/server/src/server/session/workspace-scripts/**/*.{ts,tsx}"
],
"rules": {
"no-restricted-imports": [
"error",
{
"paths": [
{ "name": "child_process", "message": "Use the bound workspace runtime." },
{ "name": "node:child_process", "message": "Use the bound workspace runtime." },
{ "name": "fs", "message": "Use the bound workspace runtime." },
{ "name": "node:fs", "message": "Use the bound workspace runtime." },
{ "name": "fs/promises", "message": "Use the bound workspace runtime." },
{ "name": "node:fs/promises", "message": "Use the bound workspace runtime." },
{ "name": "module", "message": "Dynamic loaders bypass workspace ownership." },
{
"name": "node:module",
"message": "Dynamic loaders bypass workspace ownership."
},
{ "name": "which", "message": "Use the bound workspace runtime." }
],
"patterns": [
{
"group": ["**/utils/run-git-command.{js,ts}"],
"message": "Use the bound workspace runtime."
},
{
"group": [
"**/workspace-runtime/internal/**",
"**/workspace-runtime/command/internal/**",
"**/workspace-runtime/git-observation/internal/**",
"**/workspace-helper/internal/**"
],
"message": "Use the owning public entry point."
}
]
}
]
}
},
{
"files": [
"packages/server/src/server/session/files/**/*.test.{ts,tsx}",
"packages/server/src/server/session/git-mutation/**/*.test.{ts,tsx}",
"packages/server/src/server/session/provider/**/*.test.{ts,tsx}",
"packages/server/src/server/session/workspace-git-observer/**/*.test.{ts,tsx}",
"packages/server/src/server/session/workspace-provisioning/**/*.test.{ts,tsx}",
"packages/server/src/server/session/workspace-scripts/**/*.test.{ts,tsx}"
],
"rules": {
"no-restricted-imports": "off"
}
},
{
"files": ["packages/fixture-workspace-runtime/**/*.{js,mjs,ts,tsx}"],
"rules": {
"no-restricted-imports": [
"error",
{
"paths": [
{
"name": "module",
"message": "The external runtime may not construct dynamic module loaders."
},
{
"name": "node:module",
"message": "The external runtime may not construct dynamic module loaders."
},
{
"name": "@getpaseo/server",
"message": "The external runtime may consume only the published command contract."
}
],
"patterns": [
{
"group": [
"@getpaseo/server/**",
"**/packages/server/**",
"**/workspace-runtime/**/internal/**",
"**/workspace-helper/**/internal/**"
],
"message": "The external runtime may consume only the published command contract."
}
]
}
]
}
},
{
"files": ["packages/app/src/**/*.{ts,tsx}"],
"rules": {
Expand Down
2 changes: 2 additions & 0 deletions docker/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ RUN set -eux; \
npm pack --workspace=@getpaseo/highlight --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/relay --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/protocol --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/workspace-runtime-contract --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/workspace-helper --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/client --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@paseo/plugin --pack-destination /tmp/paseo-packs; \
npm pack --workspace=@getpaseo/server --pack-destination /tmp/paseo-packs; \
Expand Down
15 changes: 15 additions & 0 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ not retain non-Git directories.
| `server/agent/tools/` | Transport-neutral catalog for workspaces, agents, permissions, and automation |
| `server/agent/mcp-server.ts` | Thin MCP adapter that registers the Paseo tool catalog with the MCP SDK |
| `server/agent/providers/` | Provider adapters (see "Agent providers" below) |
| `server/workspace-runtime/` | Runtime-neutral workspace lifecycle, execution, files, Git observation |
| `server/provider-probe/` | Invisible runtime-bound workspaces for pre-creation provider discovery |
| `server/relay-transport.ts` | Outbound relay connection with E2E encryption |
| `server/schedule/` | Cron-based scheduled agents |

Expand All @@ -85,6 +87,19 @@ agent timeline types, provider config schemas, and other values shared by daemon
and clients. Server, app, CLI, and `@getpaseo/client` all depend on this package;
it does not depend on the server.

### Workspace runtime packages

`packages/workspace-runtime-contract` owns the versioned command-runtime lifecycle and exec wire
contract. `packages/workspace-helper` owns the official confined files/watch/command-resolution
executable and its typed binding. The daemon depends on those two packages and registers command
runtimes without importing an implementation.

`runtimes/fixture` is a private generic contract fixture. Runtime implementations live in their own
repositories and depend on published versions of the two public workspace packages. CLI, Desktop,
server, release workflows, and the daemon image do not depend on, bundle, publish, or register an
implementation. Tests invoke registered runtimes through their public command, never through source
imports.

### `packages/client` — Daemon client library and SDK facade

Owns the low-level daemon WebSocket driver plus the higher-level `PaseoClient`
Expand Down
Loading
Loading