Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
7c22f28
wb600: foundation contracts for the application explorer (invocation …
ScriptedAlchemy Sep 5, 2026
7a03642
wb600: move the application node model into agent-bundle so the Workb…
ScriptedAlchemy Sep 5, 2026
e716f90
Merge remote-tracking branch 'origin/main' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
fcf7113
wb600: changeset draft for PR 1 (PR number filled at open)
ScriptedAlchemy Sep 5, 2026
9c20ac8
test(workbench): rewrite e2e suites onto the Application tree URL model
ScriptedAlchemy Sep 5, 2026
c884e8c
feat(test): expose the Workbench application tree
ScriptedAlchemy Sep 5, 2026
c9caf71
feat(workbench): add application tree model and view
ScriptedAlchemy Sep 5, 2026
44609e4
feat(workbench): unify route invocation backends
ScriptedAlchemy Sep 5, 2026
5652f5a
docs: rewrite Workbench guide for application IA
ScriptedAlchemy Sep 5, 2026
9ead9a1
Merge branch 'lane/wb600-pr1-tree-model' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
72fb340
Merge branch 'lane/wb600-pr1-invocation-client' (early part) into wb6…
ScriptedAlchemy Sep 5, 2026
b9dffd2
Merge branch 'lane/wb600-pr1-public-test-surface' (early part) into w…
ScriptedAlchemy Sep 5, 2026
be7d195
Merge branch 'lane/wb600-pr1-browser-acceptance' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
640a1d2
feat(dev): add route invocation service
ScriptedAlchemy Sep 5, 2026
1c34a6f
Merge branch 'lane/wb600-pr1-docs-en' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
1845b80
Merge branch 'lane/wb600-pr1-server-invocation' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
b8ca8cd
wb600: align docs and changeset with the registered invocation diagno…
ScriptedAlchemy Sep 5, 2026
11e3a08
wb600: delete leftover Workbench pages and cut Host diagnostics plus …
ScriptedAlchemy Sep 5, 2026
d26326f
Merge branch 'lane/wb600-pr1-deletions-cuts' (early part) into wb600-…
ScriptedAlchemy Sep 5, 2026
7791e0a
Mirror the Workbench IA rewrite into website/docs/zh.
ScriptedAlchemy Sep 5, 2026
154101e
Merge branch 'lane/wb600-pr1-docs-zh' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
aead38d
docs(zh): align invocation diagnostic codes with the registered range
ScriptedAlchemy Sep 5, 2026
1e3a2a6
fix(dev): wire production route invocations
ScriptedAlchemy Sep 5, 2026
def895c
Merge branch 'lane/wb600-pr1-server-invocation' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
1501dcf
fix(test): align Workbench surface inspection
ScriptedAlchemy Sep 5, 2026
67aca84
wb600 L5: Workbench shell, URL router, header status, Problems, Trace…
ScriptedAlchemy Sep 5, 2026
2c1d3d1
Merge remote-tracking branch 'origin/main' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
13fd6ed
Merge branch 'lane/wb600-pr1-shell-routing' (early part) into wb600-p…
ScriptedAlchemy Sep 5, 2026
61505d5
workbench: extract RenderedAgentDocument; extend workspace contracts
ScriptedAlchemy Sep 5, 2026
3b0ed1b
workbench: add RouteWorkspace with Rendered-by-default result tabs
ScriptedAlchemy Sep 5, 2026
87ab846
workbench: move the skills page into SkillWorkspace
ScriptedAlchemy Sep 5, 2026
85a00e9
workbench: route workspace tests and lane notes
ScriptedAlchemy Sep 5, 2026
12d9518
Merge branch 'lane/wb600-pr1-workspace-renderer' (early part) into wb…
ScriptedAlchemy Sep 5, 2026
7580c0d
fix(workbench): wire PR 1 integration seams
ScriptedAlchemy Sep 5, 2026
d50f67b
Merge branch 'lane/wb600-pr1-wiring' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
3b69749
wb600: reconcile the invocation state machine (workspace shape) with …
ScriptedAlchemy Sep 5, 2026
b1f42cf
test: retire the Runtime Playground evidence journey from the nightly…
ScriptedAlchemy Sep 5, 2026
4b2af9f
test: retire the nightly evidence pool with its only journey (Runtime…
ScriptedAlchemy Sep 5, 2026
a3cb85f
refactor: remove workbench type and helper duplication
ScriptedAlchemy Sep 5, 2026
d9a8ab7
chore: remove stale lane narration
ScriptedAlchemy Sep 5, 2026
7fb8669
chore: keep workbench styles desktop-only
ScriptedAlchemy Sep 5, 2026
a830556
test(workbench): drop the pre-integration workbench-surface shim; e2e…
ScriptedAlchemy Sep 5, 2026
d43fc8c
Merge deslop lane (Sol): 15 edits, behavior unchanged
ScriptedAlchemy Sep 5, 2026
c89e240
test(workbench): read primary nav labels from .nav-label
ScriptedAlchemy Sep 5, 2026
bef3363
fix: keep runtime peer out of API load
ScriptedAlchemy Sep 5, 2026
a9bee6f
test(workbench): retire Overview and Playground e2e against the new IA
ScriptedAlchemy Sep 5, 2026
286a086
test(workbench): migrate live feature e2e coverage
ScriptedAlchemy Sep 5, 2026
c1ded29
test(workbench): green browser acceptance for the Application explore…
ScriptedAlchemy Sep 5, 2026
d740ab9
Merge lane e4
ScriptedAlchemy Sep 5, 2026
d342d35
Merge lane e2
ScriptedAlchemy Sep 5, 2026
d332684
Merge lane e3
ScriptedAlchemy Sep 5, 2026
9997d84
Merge lane e1
ScriptedAlchemy Sep 5, 2026
99ea00d
Merge origin/main into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
21770d4
test(workbench): delete retired Runtime Playground cases
ScriptedAlchemy Sep 5, 2026
28bcdf9
chore: deslop e2e remediation lanes
ScriptedAlchemy Sep 5, 2026
c121c10
chore(workbench): delete hooks-model, lifecycles-model, agent-documen…
ScriptedAlchemy Sep 5, 2026
ef34b2f
changeset: reference #629
ScriptedAlchemy Sep 5, 2026
f39720f
fix packed Workbench release gates
ScriptedAlchemy Sep 5, 2026
244dc7d
fix(dev): package the route invocation render child and reap its proc…
ScriptedAlchemy Sep 5, 2026
3731164
fix(dev): pin route snapshot to published epoch
ScriptedAlchemy Sep 5, 2026
d440d09
Merge lane e5
ScriptedAlchemy Sep 5, 2026
95aae59
Merge lane r1
ScriptedAlchemy Sep 5, 2026
b937c80
Merge lane r2
ScriptedAlchemy Sep 5, 2026
a3f40d2
chore(dev): deslop route-invocation child-reap and published-epoch fixes
ScriptedAlchemy Sep 5, 2026
64b69e5
Merge remote-tracking branch 'origin/main' into wb600-pr1-shell
ScriptedAlchemy Sep 5, 2026
13d34cc
fix(dev): gate route invocation on published builds
ScriptedAlchemy Sep 5, 2026
6ce4fb6
Merge lane r3
ScriptedAlchemy Sep 5, 2026
81d84b0
test: declare route fixture dependencies
ScriptedAlchemy Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/wb600-application-explorer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'agent-bundle': minor
---

Redesign the Workbench as an application explorer (#600 PR 1). The dev server gains one route invocation API — `POST /api/routes/invocations` renders any compiled route (MCP tool, resource, prompt, CLI route, script, or event route with a canonical or Claude/Codex/Cursor payload) through the production runtime and returns the render-event stream, final Agent Document, structured result, request context, providers, timings, and the MCP/CLI/host projections; `GET /api/routes/invocations[/<id>]` lists and replays this session's invocations and every completion is published as a `route.invocation` project event (diagnostics `AB8231`, `AB8232`, `AB8236`–`AB8238`). The foreground server serves the Workbench shell for its deep-link paths (`/routes/**`, `/trace`, `/problems`, `/sessions`, `/advanced`). Breaking for `agent-bundle/test`: `inspectWorkbenchSurface()` now reports the Application tree (`application`, with `workbenchLeafPath(leaf)`) and the populated Advanced sections instead of `pages`; `WorkbenchPageName` and `workbenchPageLabel` are removed. (#629)
28 changes: 0 additions & 28 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,34 +55,6 @@ jobs:
if-no-files-found: ignore
retention-days: 7

# Evidence-capture pool (rstest.evidence.config.ts): documentation-artifact
# browser journeys whose behavioural contracts the integration pool already
# proves per PR (see nightlyEvidenceTestFiles in rstest.integration-tests.ts).
# The pool's capture writes its screenshots and evidence.json to a temporary
# directory it removes on exit, so a green run leaves no artifact; the
# tracked copies in docs/assets are regenerated by hand (see
# examples/rsc-agent-runtime/README.md). Budget: install + build + the
# example's cold rsbuild in globalSetup + a 480 s capture watchdog.
evidence:
name: Evidence capture (Node 22.19)
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/setup-workspace
with:
node-version: 22.19.0
playwright-browser: chromium
- run: pnpm test:evidence
- if: failure()
name: Preserve Playwright traces of failed browser tests
uses: actions/upload-artifact@v7
with:
name: playwright-traces-evidence
path: .rstest/playwright-traces
if-no-files-found: ignore
retention-days: 7

# Official MCP server conformance runner (rstest.mcp-conformance.config.ts)
# against one generated fixture over loopback HTTP. The expected-failure
# allowlist lives in packages/agent-bundle/tests/fixtures/
Expand Down
1 change: 1 addition & 0 deletions docs/diagnostics.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ even when no error diagnostic was reported.
| `AB8215`–`AB8218` | Workbench read-only host discovery route (`/api/discovery`): `AB8215` invalid path, `AB8216` query string or non-`GET` method (400/405), `AB8217` report over the 16 MiB response limit (413), `AB8218` discovery not available (503). |
| `AB8219`–`AB8223` | Workbench live MCP probe route (user-initiated, read-only initialize + tools/list): `AB8219` invalid path, `AB8220` invalid request/method, `AB8221` probe target not found, `AB8222` response over the 16 MiB budget, `AB8223` probe unavailable. |
| `AB8233`–`AB8235` | Workbench browser-side strict decoders rejecting a dev-server response: `AB8233` lifecycle replay, `AB8234` host discovery, `AB8235` MCP probe report. |
| `AB8231`–`AB8232`, `AB8236`–`AB8238` | Workbench route invocation service (`/api/routes/invocations`): `AB8231` unknown route or invocation id, `AB8232` no published build / invocation manifest unavailable, `AB8236` render child timed out or crashed, `AB8237` malformed invocation request, and `AB8238` unknown fixture id. (`AB8233`–`AB8235` were already assigned to browser-side decoders.) |
| `AB8110`–`AB8113` | Workbench standalone MCP Inspector routes (`/api/inspector/status`, `/api/inspector/launch`): `AB8110` invalid path, `AB8111` invalid request shape or query, `AB8112` the Inspector could not be launched (spawn failure, exit before publishing a URL, or the 30 s startup budget elapsed; 502), `AB8113` routes not available (404 when the launcher is not composed, 503 after shutdown). |
| `AB8120`–`AB8123` | Workbench route manifest (`/api/routes/manifest`): `AB8120` invalid path, `AB8121` not available (404/409/503), `AB8122` query string on the request, `AB8123` the browser client could not decode the response (see below). |
| `AB8024`–`AB8025` | Live host MCP proxy: epoch drift behind a host connection and dev-server unavailability (see below). |
Expand Down
22 changes: 11 additions & 11 deletions examples/hooks-and-scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,25 @@ modes covered.

## Workbench walkthrough

1. **Overview** is the Bundle dashboard. It relates the authored Hook to its
emitted artifact, exercise trace, and evaluation pages; its status is the
authoritative current-or-stale epoch state.
2. **Hooks** defaults to the Claude `sessionStart` binding and its populated
inline canonical JSON, including `"source": "workbench"`. Run the
1. The shell header reports the authoritative current-or-stale epoch state and
links build diagnostics to **Problems**.
2. Under **Application → Events / Hooks**, select the Claude `sessionStart`
binding and its populated inline canonical JSON, including
`"source": "workbench"`. Run the
simulation, then use **Replay saved simulation** to rerun exactly that
epoch-bound input. The result directs the release session through both
checks.
3. **Playground** defaults to Script execution, the Claude target, and
`verify-release`. Run it and wait until the session is finalized: the
3. Under **Application → Scripts**, select `verify-release` and the Claude
target, then run it. The
emitted script reads the packaged `release/release-manifest.json` relative
to its module and reports release 2.4.0 ready for packaging.
4. Change the target to portable and select `detect-risk`. Its emitted script
reads `release/risk-register.json`, reports high-severity `REL-204`, exits
with code 2, and finalizes a durable blocking trace.
5. **Logs** filters those producer records by producer, level, kind, or
context; open a record to inspect raw details. **Artifacts** is the emitted
file/provenance view, while **Comparisons** aligns outcomes only after two
recorded eval runs.
5. **Advanced → Raw logs** filters those producer records by producer, level,
kind, or context; open a record to inspect raw details. **Advanced →
Artifact** is the emitted file/provenance view, while **Advanced → Evals →
Compare** aligns outcomes only after two recorded eval runs.

## Reversible diagnostic walkthrough

Expand Down
19 changes: 10 additions & 9 deletions examples/host-test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,17 +123,18 @@ the printed command, open the Agents pane, and use the same scenario prompt.

## Workbench walkthrough

1. **Overview** lists the twenty event routes, both MCP servers, the skill, and
the routed CLI with their per-target capability judgments — `workspace/open`
1. **Application** lists the twenty event routes, both MCP servers, the skill,
and the routed CLI with their per-target capability judgments — `workspace/open`
is Cursor-only, `task/*` and `file/change` are Claude-only, and portable
carries no hooks at all.
2. **Hooks** simulates any family with canonical input; the route appends a
record to the log and returns an empty result (only `session/start` speaks
an `additional_context` line naming the log path).
3. **Playground** runs `host-test dump` and the `dump` tool against the same
log, so a simulated hook is visible from the MCP surface immediately.
4. **Lifecycles** replays checked-in native receipts and shows the request
context — and lineage — each replay mounted.
2. Under **Application → Events / Hooks**, select any family and run it with
canonical input; the route appends a record to the log and returns an empty
result (only `session/start` speaks an `additional_context` line naming the
log path).
3. Run the `host-test dump` CLI leaf or the MCP `dump` Tool leaf against the
same log, so a simulated hook is visible from the MCP surface immediately.
4. Use the selected event route's **Replay** tab for checked-in native receipts;
each replay shows its request context and lineage.

## Noninteractive checks

Expand Down
37 changes: 18 additions & 19 deletions examples/mcp-app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,32 @@ and Claude artifacts; the App resource remains portable.

## Workbench walkthrough

1. **Overview** opens on the Bundle dashboard. Its Author, Build, Exercise,
and Evaluate stages connect the source capability to its emitted artifact,
runtime evidence, and eval result.
2. **Skills** defaults to `service-readiness`; compare its authored status
policy and readiness-report resource with generated output and its explicit
eval coverage. **Hooks** defaults to a populated Claude `sessionStart`
canonical input; run the simulation to attach the readiness workflow.
3. **Playground** defaults to Script execution, the Claude target, and
`check-service-fixture`. Run it and wait for the finalized session. The
1. The shell header connects build status and diagnostics to the current
emitted artifact.
2. Under **Application → Skills**, select `service-readiness`; compare its
authored status policy and readiness-report resource with generated output
and its explicit eval coverage. Under **Application → Events / Hooks**,
select `sessionStart`, use the populated Claude canonical input, and run the
simulation to attach the readiness workflow.
3. Under **Application → Scripts**, select `check-service-fixture`, choose the
Claude fixture, and run it. The
emitted checker resolves the packaged status fixture beside its emitted
module, so it succeeds without depending on the shell working directory.
4. **Logs** exposes the resulting producer records. In **Artifacts**, select
portable to inspect `mcp-apps/status.html`; Codex and Claude retain their
host artifacts but not this portable App resource.
5. Before recording two eval runs, **Comparisons** deliberately displays:
4. **Advanced → Raw logs** exposes the resulting producer records. In
**Advanced → Artifact**, select portable to inspect `mcp-apps/status.html`;
Codex and Claude retain their host artifacts but not this portable App resource.
5. Before recording two eval runs, **Advanced → Evals → Compare** deliberately displays:
`At least two recorded runs are needed before a comparison can be aligned.`
That is the precise empty state, not an error.
6. In **MCP playground**, the defaults are portable and the `status` server.
Open the session, list tools, select `show-status`, choose `payments-api`,
and invoke it. Invocation history shows the degraded summary and labelled
6. Under **Application → MCP → status → Tools**, select `show-status`, choose
`payments-api`, and run it. Invocation history shows the degraded summary and labelled
Availability and P95 latency checks (the latter fails). Open the App preview:
the rendered panel also shows `payments-api`, a text-labelled amber
`degraded` indicator, the same summary, and passing/failing checks through
the MCP Apps bridge. Inspect the
protocol trace, use **Restart MCP session**, then close, reset, and reopen
it to exercise the lifecycle.
7. **Evals** defaults to the deterministic `mcp-app-status` suite. Run
protocol trace in the route workspace; use **Advanced → Protocol** for
session restart, reset, and lifecycle inspection.
7. **Advanced → Evals → Runs** defaults to the deterministic `mcp-app-status` suite. Run
`status-is-healthy` and inspect its completed passing trial attributed to
`service-readiness`; it reads only checked-in fixture data and needs no
native login or API key.
Expand Down
3 changes: 2 additions & 1 deletion examples/rsc-agent-runtime/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,8 @@ surface is not treated as stable here: React `19.2.8`, `react-dom` `19.2.8`,
Existing Agent Bundle skills, static MCPs, evaluations, and normal hooks neither require nor activate this runtime. Nothing under `packages/agent-bundle` imports the example or React/RSC runtime packages.

`PlaygroundService` is the landed, provider-neutral durable whole-plugin
authoring timeline foundation. Runtime Playground history is deliberately
authoring timeline foundation. Runtime history now backs the selected
Application route workspace rather than a separate destination. It remains
provider-session-scoped and ephemeral in this example; wiring a provider
adapter, authenticated API, timeline UI, durable Runtime export, or evaluation
promotion onto that history is an explicit non-goal of this demo.
Expand Down
16 changes: 8 additions & 8 deletions examples/skills-starter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,17 @@ required. Both eval suites are deterministic and read only checked-in fixtures.

## Workbench walkthrough

1. **Overview** opens on the Bundle dashboard. It summarizes the three Skills,
generated targets, build health, and the next useful actions.
2. **Skills** lists `dependency-upgrade`, `incident-triage`, and
`release-review`. Browse their linked checklists and report templates. Switch
between Source and Generated to see whether a target copied or adapted the
authored document. Every Skill shows its deterministic outcome-eval coverage;
1. The shell header summarizes build health and current diagnostics.
2. Under **Application → Skills**, select `dependency-upgrade`,
`incident-triage`, or `release-review`. Browse its linked checklists and
report templates. Use the inspector to compare Source and Generated output
and see whether a target copied or adapted the authored document. Every
Skill shows its deterministic outcome-eval coverage;
it is labeled indirect because the deterministic harness cannot observe host
Skill activation.
3. **Artifacts** defaults to the Claude target. Change the target to compare
3. **Advanced → Artifact** defaults to the Claude target. Change the target to compare
the portable, Codex, and Claude output trees and their provenance.
4. **Evals** defaults to the `release-readiness` suite. Run its deterministic
4. **Advanced → Evals → Runs** defaults to the `release-readiness` suite. Run its deterministic
`release-artifact-is-ready` case and inspect the passing trial. It consumes
only the checked-in evidence fixture, so no model login or API key is needed.
5. To practice repair, make a reversible policy edit, press **Rebuild**, and
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"test:projection": "rstest --config rstest.projection.config.ts",
"test:integration": "pnpm build && pnpm test:integration:run",
"test:integration:run": "AGENT_BUNDLE_WORKBENCH_PREBUILT=1 AGENT_BUNDLE_PACKAGE_PREBUILT=1 rstest --config rstest.integration.config.ts",
"test:evidence": "pnpm build && AGENT_BUNDLE_WORKBENCH_PREBUILT=1 AGENT_BUNDLE_PACKAGE_PREBUILT=1 rstest --config rstest.evidence.config.ts",
"test:mcp-conformance": "pnpm build && AGENT_BUNDLE_MCP_CONFORMANCE=1 rstest --config rstest.mcp-conformance.config.ts",
"test:native-host": "pnpm build && AGENT_BUNDLE_NATIVE_HOST_CONTRACTS=1 rstest --config rstest.native-host.config.ts",
"test:watch": "rstest --config rstest.config.ts --watch",
Expand Down
1 change: 1 addition & 0 deletions packages/agent-bundle/rslib.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ export default defineConfig({
// route module may import at run time without pulling the compiler
// into its generated bundle.
routes: './src/routes/public.ts',
'route-invocation-child': './src/dev/routes/route-invocation-child.ts',
rstest: './src/rstest/index.ts',
'terminal-capability': './src/terminal-capability.ts',
test: './src/test/index.ts',
Expand Down
23 changes: 23 additions & 0 deletions packages/agent-bundle/src/contracts/application.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export {
applicationLeafForRouteId,
applicationLeaves,
applicationTreeForManifest,
filterApplicationTree,
findApplicationLeaf,
firstApplicationLeaf,
} from '../dev/routes/application-tree.ts';
export type {
ApplicationGroup,
ApplicationGroupKind,
ApplicationLeaf,
ApplicationLeafExecution,
ApplicationServerGroup,
ApplicationSubgroup,
ApplicationTree,
ApplicationTreeInspectionHook,
ApplicationTreeInspectionMcpServer,
ApplicationTreeInspectionScript,
ApplicationTreeManifestSources,
ApplicationTreeSkill,
ApplicationTreeState,
} from '../dev/routes/application-tree.ts';
26 changes: 26 additions & 0 deletions packages/agent-bundle/src/contracts/invocations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Browser-consumable contract surface for dev-server route invocations — the
* one execution path behind the Workbench route workspace. Type-only: routes
* render on the server through the production runtime.
*/
export type {
RouteInvocationCliProjection,
RouteInvocationEvent,
RouteInvocationEventHost,
RouteInvocationEventOptions,
RouteInvocationEventPayload,
RouteInvocationHostProjection,
RouteInvocationKind,
RouteInvocationListResponse,
RouteInvocationProjection,
RouteInvocationProvider,
RouteInvocationProviderStatus,
RouteInvocationRequest,
RouteInvocationStatus,
RouteInvocationSummary,
RouteInvocationTiming,
} from '../dev/routes/route-invocation.ts';
export type {
RouteInvocation,
RouteInvocationResponse,
} from '../dev/routes/route-invocation-result.ts';
19 changes: 19 additions & 0 deletions packages/agent-bundle/src/contracts/workbench-shell.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export {
applicationNodeKey,
applicationNodePath,
applicationNodeRefForPathSegments,
applicationNodeRefForRouteId,
isApplicationMcpNodeKind,
routeIdForApplicationNodeRef,
sameApplicationNodeRef,
} from '../dev/routes/application-node.ts';
export type {
ApplicationMcpNodeKind,
ApplicationNodeKind,
ApplicationNodeRef,
} from '../dev/routes/application-node.ts';
export {
isWorkbenchShellPath,
workbenchShellAreas,
} from '../dev/workbench-shell-paths.ts';
export type { WorkbenchShellArea } from '../dev/workbench-shell-paths.ts';
4 changes: 4 additions & 0 deletions packages/agent-bundle/src/dev/coordinator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export interface DevCoordinatorOptions {
readonly initialPreparedProject?: PreparedProject;
readonly ignoredPaths?: readonly string[];
readonly onPreparedProject?: (prepared: PreparedProject) => Promise<void>;
readonly onPublishedProject?: (prepared: PreparedProject, epoch: ArtifactEpoch) => void;
readonly outputPaths?: readonly string[];
/** Rebuilds the framework-owned package build (bin/lib) after successful artifact rebuilds. */
readonly packageBuildService?: DevPackageBuilder;
Expand Down Expand Up @@ -209,6 +210,7 @@ export class DevCoordinator {
readonly #ignoredPaths: readonly string[];
readonly #outputPaths: readonly string[];
readonly #onPreparedProject: ((prepared: PreparedProject) => Promise<void>) | undefined;
readonly #onPublishedProject: ((prepared: PreparedProject, epoch: ArtifactEpoch) => void) | undefined;
readonly #packageBuildService: DevPackageBuilder;
readonly #prepareCommand: 'build' | 'dev';
readonly #projectService: ProjectPreparer;
Expand Down Expand Up @@ -248,6 +250,7 @@ export class DevCoordinator {
this.#now = options.now ?? (() => new Date());
this.#nextPreparedProject = options.initialPreparedProject;
this.#onPreparedProject = options.onPreparedProject;
this.#onPublishedProject = options.onPublishedProject;
this.#packageBuildService = options.packageBuildService ?? new DevPackageBuildService();
this.#outputPaths = Object.freeze([...new Set([
...(options.outputPaths ?? ['dist']),
Expand Down Expand Up @@ -563,6 +566,7 @@ export class DevCoordinator {
startedAt: running.startedAt,
});
this.#activeEpoch = result.epoch;
this.#onPublishedProject?.(prepared, result.epoch);
const artifact = artifactStatusFor(this.#activeEpoch, source.revision);
this.#status = freezeProjectStatus({
artifact,
Expand Down
1 change: 1 addition & 0 deletions packages/agent-bundle/src/dev/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ const eventTypes = new Set<ProjectEventType>([
'artifact.status',
'dev.contract.status',
'dev.host.sync',
'route.invocation',
'runtime.event',
]);

Expand Down
Loading
Loading