feat(agent-manager): allow sessions to move their worktree between sections or ungroup (#12815)

* feat(agent-manager): allow sessions to move their worktree between sections or ungroup

Add a new  to the  tool so a session can
reassign its own worktree to another section or ungroup it by passing
. The move operation validates the target section and
the session's worktree, then pushes refreshed state to the panel.

Also tighten the model-facing contract so the list-to-move workflow is
unambiguous:  is required first, its result is the
source of truth for section and session IDs, and direct edits to
 are rejected by , , and
 with an explicit pointer to the  tool.

- New / in the Agent Manager protocol
- New  domain function with section/session validation
- New  OpenAPI hook so  stays
  nullable in the generated SDK
- Tool schema descriptions now spell out the list-first workflow and
  the no-direct-edit rule
- List output now includes an instruction block and is pretty-printed
- Optional nullable Task fields tolerate  from models
- Focused CLI tests, bridge unit test, and protection test

* chore: remove local PR screenshot

* style(vscode): format agent manager orchestration

* fix(agent-manager): protect state paths on Windows
This commit is contained in:
Marius
2026-08-03 16:32:01 +02:00
committed by GitHub
parent 6ae16f9d62
commit 3d4294e3bb
20 changed files with 660 additions and 262 deletions
+293 -214
View File
@@ -23784,6 +23784,13 @@
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "replayExited",
"schema": {
"type": "string"
}
}
],
"security": [],
@@ -24634,6 +24641,9 @@
{
"$ref": "#/components/schemas/EventSandboxStatusChanged"
},
{
"$ref": "#/components/schemas/EventLspClientDiagnostics"
},
{
"$ref": "#/components/schemas/EventSuggestionShown"
},
@@ -24661,9 +24671,6 @@
{
"$ref": "#/components/schemas/EventKilo-sessionsRemote-status-changed"
},
{
"$ref": "#/components/schemas/EventLspClientDiagnostics"
},
{
"$ref": "#/components/schemas/EventMemoryStatus1"
},
@@ -24679,6 +24686,9 @@
{
"$ref": "#/components/schemas/EventIndexingWarning"
},
{
"$ref": "#/components/schemas/EventModels-devRefreshed"
},
{
"$ref": "#/components/schemas/EventServerConnected"
},
@@ -24847,9 +24857,6 @@
{
"$ref": "#/components/schemas/EventSessionError"
},
{
"$ref": "#/components/schemas/EventModels-devRefreshed"
},
{
"$ref": "#/components/schemas/EventInstallationUpdated"
},
@@ -24857,13 +24864,7 @@
"$ref": "#/components/schemas/EventInstallationUpdate-available"
},
{
"$ref": "#/components/schemas/EventPermissionAsked"
},
{
"$ref": "#/components/schemas/EventPermissionReplied"
},
{
"$ref": "#/components/schemas/EventReferenceUpdated"
"$ref": "#/components/schemas/EventFileEdited"
},
{
"$ref": "#/components/schemas/EventPermissionV2Asked"
@@ -24872,10 +24873,10 @@
"$ref": "#/components/schemas/EventPermissionV2Replied"
},
{
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
"$ref": "#/components/schemas/EventReferenceUpdated"
},
{
"$ref": "#/components/schemas/EventFileEdited"
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
},
{
"$ref": "#/components/schemas/EventFileWatcherUpdated"
@@ -24904,6 +24905,15 @@
{
"$ref": "#/components/schemas/EventTodoUpdated"
},
{
"$ref": "#/components/schemas/EventLspUpdated"
},
{
"$ref": "#/components/schemas/EventPermissionAsked"
},
{
"$ref": "#/components/schemas/EventPermissionReplied"
},
{
"$ref": "#/components/schemas/EventSessionStatus"
},
@@ -24922,9 +24932,6 @@
{
"$ref": "#/components/schemas/EventVcsBranchUpdated"
},
{
"$ref": "#/components/schemas/EventLspUpdated"
},
{
"$ref": "#/components/schemas/EventWorkspaceReady"
},
@@ -25462,6 +25469,40 @@
"required": ["id", "sessionID", "operation", "targetSessionID"],
"additionalProperties": false
},
"AgentManagerMoveRequest": {
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/AgentManagerRequestID"
},
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"operation": {
"type": "string",
"enum": ["move"]
},
"targetSessionID": {
"type": "string",
"pattern": "^ses"
},
"sectionID": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
}
},
"required": ["id", "sessionID", "operation", "targetSessionID", "sectionID"],
"additionalProperties": false
},
"AgentManagerRequest": {
"anyOf": [
{
@@ -25472,6 +25513,9 @@
},
{
"$ref": "#/components/schemas/AgentManagerStopRequest"
},
{
"$ref": "#/components/schemas/AgentManagerMoveRequest"
}
]
},
@@ -27827,6 +27871,9 @@
{
"$ref": "#/components/schemas/EventSandboxStatusChanged"
},
{
"$ref": "#/components/schemas/EventLspClientDiagnostics"
},
{
"$ref": "#/components/schemas/EventSuggestionShown"
},
@@ -27854,9 +27901,6 @@
{
"$ref": "#/components/schemas/EventKilo-sessionsRemote-status-changed"
},
{
"$ref": "#/components/schemas/EventLspClientDiagnostics"
},
{
"$ref": "#/components/schemas/EventMemoryStatus"
},
@@ -27872,6 +27916,9 @@
{
"$ref": "#/components/schemas/EventIndexingWarning"
},
{
"$ref": "#/components/schemas/EventModels-devRefreshed"
},
{
"$ref": "#/components/schemas/EventServerConnected"
},
@@ -28040,9 +28087,6 @@
{
"$ref": "#/components/schemas/EventSessionError"
},
{
"$ref": "#/components/schemas/EventModels-devRefreshed"
},
{
"$ref": "#/components/schemas/EventInstallationUpdated"
},
@@ -28050,13 +28094,7 @@
"$ref": "#/components/schemas/EventInstallationUpdate-available"
},
{
"$ref": "#/components/schemas/EventPermissionAsked"
},
{
"$ref": "#/components/schemas/EventPermissionReplied"
},
{
"$ref": "#/components/schemas/EventReferenceUpdated"
"$ref": "#/components/schemas/EventFileEdited"
},
{
"$ref": "#/components/schemas/EventPermissionV2Asked"
@@ -28065,10 +28103,10 @@
"$ref": "#/components/schemas/EventPermissionV2Replied"
},
{
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
"$ref": "#/components/schemas/EventReferenceUpdated"
},
{
"$ref": "#/components/schemas/EventFileEdited"
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
},
{
"$ref": "#/components/schemas/EventFileWatcherUpdated"
@@ -28097,6 +28135,15 @@
{
"$ref": "#/components/schemas/EventTodoUpdated"
},
{
"$ref": "#/components/schemas/EventLspUpdated"
},
{
"$ref": "#/components/schemas/EventPermissionAsked"
},
{
"$ref": "#/components/schemas/EventPermissionReplied"
},
{
"$ref": "#/components/schemas/EventSessionStatus"
},
@@ -28115,9 +28162,6 @@
{
"$ref": "#/components/schemas/EventVcsBranchUpdated"
},
{
"$ref": "#/components/schemas/EventLspUpdated"
},
{
"$ref": "#/components/schemas/EventWorkspaceReady"
},
@@ -34810,6 +34854,37 @@
"required": ["operation", "sessionID", "stopped"],
"additionalProperties": false
},
"AgentManagerMoveResult": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"enum": ["move"]
},
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"sectionID": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
},
"moved": {
"type": "boolean",
"enum": [true]
}
},
"required": ["operation", "sessionID", "sectionID", "moved"],
"additionalProperties": false
},
"AgentManagerResult": {
"anyOf": [
{
@@ -34820,6 +34895,9 @@
},
{
"$ref": "#/components/schemas/AgentManagerStopResult"
},
{
"$ref": "#/components/schemas/AgentManagerMoveResult"
}
]
},
@@ -34836,6 +34914,7 @@
"stale_session",
"timeout",
"unavailable_session",
"unknown_section",
"unknown_session",
"workspace_unavailable"
]
@@ -35821,6 +35900,33 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventLspClientDiagnostics": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["lsp.client.diagnostics"]
},
"properties": {
"type": "object",
"properties": {
"serverID": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": ["serverID", "path"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventSuggestionShown": {
"type": "object",
"properties": {
@@ -36117,33 +36223,6 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventLspClientDiagnostics": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["lsp.client.diagnostics"]
},
"properties": {
"type": "object",
"properties": {
"serverID": {
"type": "string"
},
"path": {
"type": "string"
}
},
"required": ["serverID", "path"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventMemoryStatus": {
"type": "object",
"properties": {
@@ -37214,6 +37293,24 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventModels-devRefreshed": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["models-dev.refreshed"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventServerConnected": {
"type": "object",
"properties": {
@@ -39256,24 +39353,6 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventModels-devRefreshed": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["models-dev.refreshed"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventInstallationUpdated": {
"type": "object",
"properties": {
@@ -39322,7 +39401,7 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventPermissionAsked": {
"EventFileEdited": {
"type": "object",
"properties": {
"id": {
@@ -39330,109 +39409,22 @@
},
"type": {
"type": "string",
"enum": ["permission.asked"]
"enum": ["file.edited"]
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^per"
},
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"permission": {
"file": {
"type": "string"
},
"patterns": {
"type": "array",
"items": {
"type": "string"
}
},
"metadata": {
"type": "object"
},
"always": {
"type": "array",
"items": {
"type": "string"
}
},
"tool": {
"type": "object",
"properties": {
"messageID": {
"type": "string"
},
"callID": {
"type": "string"
}
},
"required": ["messageID", "callID"],
"additionalProperties": false
}
},
"required": ["id", "sessionID", "permission", "patterns", "metadata", "always"],
"required": ["file"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventPermissionReplied": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["permission.replied"]
},
"properties": {
"type": "object",
"properties": {
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"requestID": {
"type": "string",
"pattern": "^per"
},
"reply": {
"type": "string",
"enum": ["once", "always", "reject"]
}
},
"required": ["sessionID", "requestID", "reply"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventReferenceUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["reference.updated"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"PermissionV2Source": {
"type": "object",
"properties": {
@@ -39536,6 +39528,24 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventReferenceUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["reference.updated"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventProjectDirectoriesUpdated": {
"type": "object",
"properties": {
@@ -39560,30 +39570,6 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventFileEdited": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["file.edited"]
},
"properties": {
"type": "object",
"properties": {
"file": {
"type": "string"
}
},
"required": ["file"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventFileWatcherUpdated": {
"type": "object",
"properties": {
@@ -39910,6 +39896,117 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventLspUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["lsp.updated"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventPermissionAsked": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["permission.asked"]
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^per"
},
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"permission": {
"type": "string"
},
"patterns": {
"type": "array",
"items": {
"type": "string"
}
},
"metadata": {
"type": "object"
},
"always": {
"type": "array",
"items": {
"type": "string"
}
},
"tool": {
"type": "object",
"properties": {
"messageID": {
"type": "string"
},
"callID": {
"type": "string"
}
},
"required": ["messageID", "callID"],
"additionalProperties": false
}
},
"required": ["id", "sessionID", "permission", "patterns", "metadata", "always"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventPermissionReplied": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["permission.replied"]
},
"properties": {
"type": "object",
"properties": {
"sessionID": {
"type": "string",
"pattern": "^ses"
},
"requestID": {
"type": "string",
"pattern": "^per"
},
"reply": {
"type": "string",
"enum": ["once", "always", "reject"]
}
},
"required": ["sessionID", "requestID", "reply"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventSessionStatus": {
"type": "object",
"properties": {
@@ -40130,24 +40227,6 @@
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventLspUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": ["lsp.updated"]
},
"properties": {
"type": "object",
"properties": {}
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventWorkspaceReady": {
"type": "object",
"properties": {