chore: record next rpc server slices

This commit is contained in:
lda
2026-06-05 00:03:56 +07:00 Unverified
parent 6b6b5ab394
commit 3941b88e8c
5 changed files with 38 additions and 4 deletions
+14
View File
@@ -161,6 +161,20 @@ implementation state.
- Completed: `wf-rpc-server --mcp-config wf_mcp.config.json` starts the - Completed: `wf-rpc-server --mcp-config wf_mcp.config.json` starts the
JSON-RPC transport over an MCP-backed `WorkflowServer`, making the remote JSON-RPC transport over an MCP-backed `WorkflowServer`, making the remote
CLI path usable with MCP sources and desired source registry operations. CLI path usable with MCP sources and desired source registry operations.
- Next concrete platform slices:
- Manual product smoke: run `wf-rpc-server --mcp-config ...`, point
`wf --url ...` at it, and capture real CLI/server UX gaps before adding
more architecture.
- Source registry apply/reload: decide and implement how persisted registry
mutations affect the running source catalog. Prefer an explicit
apply/reload operation before automatic live remount.
- Persisted resume across server restart: prove an interrupted run can be
resumed after rebuilding the MCP-backed RPC server from the same stores and
pinned source environment.
- Auth/source secrets boundary: keep registry desired state separate from
upstream credentials, and surface missing auth as validation diagnostics.
- Run watch/progress: start with polling over existing inspect/trace APIs;
defer SSE/WebSocket/MCP progress until the polling UX is proven insufficient.
- Cleanup candidate: consolidate store/source registry id validation patterns - Cleanup candidate: consolidate store/source registry id validation patterns
(`SOURCE_REGISTRY_ID_PATTERN`, `STORE_ID_PATTERN`) only after another package (`SOURCE_REGISTRY_ID_PATTERN`, `STORE_ID_PATTERN`) only after another package
needs the same rule. Today they intentionally stay close to their stores. needs the same rule. Today they intentionally stay close to their stores.
@@ -358,6 +358,25 @@ Possible providers:
This slice should avoid making "source" mean "MCP connection." MCP is one This slice should avoid making "source" mean "MCP connection." MCP is one
source provider, not the source model. source provider, not the source model.
Current MCP-backed server status:
- MCP-backed `WorkflowServer` construction is implemented.
- `wf-rpc-server --mcp-config <path>` can serve JSON-RPC over that server.
- Source registry read/mutation APIs are reachable remotely when the target
exposes `source_registry_admin`.
Next implementation slices should be:
1. Manual product smoke with the real CLI/server commands. Record UX/runtime
gaps before broadening architecture.
2. Source registry apply/reload semantics. Registry mutation currently updates
desired persisted state; the next explicit decision is whether changes apply
only after restart, through an explicit reload/apply operation, or through
automatic live reconciliation. Prefer explicit reload/apply for v1.
3. Persisted resume across server restart. Rebuild the MCP-backed RPC server
from the same stores and prove interrupted runs resume from the stored
checkpoint and pinned dependency environment.
### Slice 6: Auth and Tenancy ### Slice 6: Auth and Tenancy
Define who can read/write artifacts, deployments, runs, and auth records. Define who can read/write artifacts, deployments, runs, and auth records.
+3 -2
View File
@@ -67,11 +67,12 @@ def serve(
if config is not None: if config is not None:
workflow_config = load_workflow_config(config) workflow_config = load_workflow_config(config)
store = workflow_config.server.store store = workflow_config.server.store
if not isinstance(store, FilesystemStoreConfig): if server is None and not isinstance(store, FilesystemStoreConfig):
raise typer.BadParameter( raise typer.BadParameter(
"wf-rpc-server currently requires filesystem store" "wf-rpc-server currently requires filesystem store"
) )
resolved_store_root = resolved_store_root or store.root if server is None:
resolved_store_root = resolved_store_root or store.root
rpc_transport = next( rpc_transport = next(
( (
transport transport
@@ -79,9 +79,9 @@ async def test_mcp_backed_rpc_reports_connections_and_events(tmp_path) -> None:
transport=transport, base_url="http://test" transport=transport, base_url="http://test"
) as http_client: ) as http_client:
connections = await _rpc( connections = await _rpc(
http_client, "workflow.admin.connections.list", {"limit": 20} http_client, "workflow.admin.connections.list", {}
) )
events = await _rpc(http_client, "workflow.admin.events.list", {"limit": 20}) events = await _rpc(http_client, "workflow.admin.events.list", {})
assert connections["result"]["connections"][0]["id"] == "demo.default" assert connections["result"]["connections"][0]["id"] == "demo.default"
assert any( assert any(