chore: record next rpc server slices
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user