Skip to content

[per-component-executor] - Default split-executor Copilot manifest + OAuth-local validation #1441

Description

@JoshuaRowePhantom

Default split-executor Copilot manifest + OAuth-local validation

Part of design: #1432 ΓÇö per-component-executor-binding
Design document: https://github.com/JoshuaRowePhantom/Phantom.Workspaces/blob/design/docs/design/per-component-executor-binding.md

Scope

Add defaults/agent-manifests/copilot-split-executor with: one kind:"executor" resource worker (id parameter → worker-profile); a worker-profile parameter (kind executor) + a working-directory parameter; a model with options.executor:"worker"; workspace-gui / workspace-entity tools with no executor (inherit local); a GitHub web MCP tool with no executor (local, for OAuth). Add load-time validation that rejects/warns an OAuth-interactive MCP whose executor is non-local. Cross-check the exact tool/model/connection JSON shapes against features/docs/examples/github-copilot-remote-chat.json.

Files

Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.json (new); the manifest/validation code that enforces the OAuth-local rule.

Detailed design

Requirement 11 ΓÇö Default split manifest. Ship a default manifest entity (defaults/agent-manifests/...) implementing this split: the Copilot-SDK chat client runs remotely; the chat router, the workspace tools (workspace-gui / workspace-entity), and the GitHub web MCP server run locally.

Requirement 12 ΓÇö No web-vs-non-web distinction. An MCP server with no executor simply runs on the local session executor. There is no special "web tools go remote" rule.

Requirement 13 ΓÇö OAuth interactivity rationale. MCP servers using interactive OAuth (authorization-code with a loopback/localhost redirect + a browser) MUST run on the machine that can open the user's browser and receive the loopback redirect ΓÇö i.e. the local executor. Therefore OAuth-interactive MCP servers MUST be pinned local; the default manifest pins the GitHub web MCP local for this reason (and because that is where the user authenticates). A key/PAT-authenticated web MCP does not strictly require local, but the default ships it local. Validation note: an MCP tool whose connection uses interactive OAuth combined with a non-local executor MUST be rejected or warned at load/validation time.

The worker-profile parameter is of kind executor (see #1434): at launch the user picks the worker executor by choosing either a trust-profile entity or a user-computer-profile entity (the latter synthesizing an implicit trust profile). The worker executor resource's parameter strategy references worker-profile and resolves through the selected/implicit trust profile's DefaultExecutionTarget.

New file (applicable):

  • Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.json ΓÇö the default split-executor manifest entity.

Contradiction note (shape reference):
3. github-copilot-remote-chat.json is an AgentDefinition, not a manifest. It is kind:"prompt" and drives remoting via model.options.additionalProperties.trust-profile (features/docs/examples/github-copilot-remote-chat.json:6-22,78-94) ΓÇö the OLD per-kind approach. It is a useful shape reference for tool/model/connection JSON, but it does not use kind:"executor" resources or an executor field.

Tests

CopilotSplitExecutorManifestTests (Phantom.Workspaces.Data.Core.Tests)

  • Manifest_Loads
  • Manifest_WorkerProfileParameter_Resolves
  • Manifest_ModelBoundToWorker_ResolvesRemote
  • Manifest_WorkspaceToolsAndGithubWebMcp_ResolveLocal
  • Validation_OAuthInteractiveMcpWithNonLocalExecutor_IsRejected

SplitExecutorIntegrationTests (Phantom.Workspaces.Tests)

  • DefaultManifest_Session_RecordsExecutorBindings_CopilotWorker_WorkspaceLocal
  • DefaultManifest_Topology_RoutesComponentsAccordingly

Testing strategy — Default manifest + validation: The default manifest loads; the worker-profile parameter resolves; the model resolves to the remote worker; the workspace tools and the GitHub web MCP resolve local. A validation test asserts that an OAuth-interactive MCP with a non-local executor is rejected/warned at load. → CopilotSplitExecutorManifestTests.

Testing strategy — Full split-executor integration: Using the default manifest, assert the resulting session records executor-bindings with copilot → worker and workspace/github-web → ".", and that the reconstructed topology routes accordingly. → SplitExecutorIntegrationTests.

Dependencies

Depends on: #1433 ΓÇö Executor resource schema + model
Depends on: #1434 ΓÇö executor parameter kind
Depends on: #1435 ΓÇö PhantomMcpTool.Executor field
Depends on: #1436 ΓÇö Executor-resource resolver
Depends on: #1437 ΓÇö Explicit session executor + executor-bindings persistence + resume
Depends on: #1438 ΓÇö Per-tool MCP execution over transport + production remote MCP host

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't workingverified-locallyImplementation has been verified locally

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions