From 207be3c771d281baae6e5fa0fb74be9a056e97a2 Mon Sep 17 00:00:00 2001 From: Can Celik Date: Tue, 1 Sep 2026 15:48:22 +0300 Subject: refactor: render the shell in the client (#3487) * feat: add opt-in client-rendered shell * feat: add client-owned shell mouse controls * feat: complete client-owned shell chrome * feat: add client-owned shell settings and notifications * feat: run client shell custom commands * feat: render popup terminals in client shell * feat: add client-owned scrollback and copy mode * fix: preserve client worktree trust defaults * feat: render startup diagnostics in client shell * feat: render onboarding in client shell * feat: render product announcements in client shell * feat: render release notes in client shell * feat: render mobile switcher in client shell * feat: render kitty graphics in client shell * fix: preserve client shell lifecycle coherence * refactor: route client shell commands through endpoint connections * refactor: make the client-rendered shell the default * refactor: remove monolithic launch mode * refactor: complete client-rendered shell cutover * perf: retain client pane surface updates * perf: scale retained pane surface updates * perf: remove remote pane input latency * test: make client shell checks platform-independent * fix: prevent client timer starvation * test: fix client shell platform gates * test: accept retained surfaces in cross-area checks * test: make client mode assertions platform-neutral * fix: badge only outdated integrations --- docs/next/api/herdr-api.schema.json | 726 ++++++++++++++++++++++++++++++++++-- 1 file changed, 688 insertions(+), 38 deletions(-) (limited to 'docs/next/api/herdr-api.schema.json') diff --git a/docs/next/api/herdr-api.schema.json b/docs/next/api/herdr-api.schema.json index aa0a8c22..8bc06f10 100644 --- a/docs/next/api/herdr-api.schema.json +++ b/docs/next/api/herdr-api.schema.json @@ -1700,6 +1700,47 @@ ], "type": "object" }, + "CommandInvokeParams": { + "properties": { + "command_id": { + "description": "Opaque endpoint-issued command identifier from the client-shell projection.", + "type": "string" + }, + "pane_id": { + "type": [ + "string", + "null" + ] + }, + "selection": { + "anyOf": [ + { + "$ref": "#/schemas/request/$defs/PaneSelectionReadParams" + }, + { + "type": "null" + } + ], + "description": "Client-owned selection coordinates, validated against the pane's content revision." + }, + "tab_id": { + "type": [ + "string", + "null" + ] + }, + "workspace_id": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "command_id" + ], + "type": "object" + }, "EmptyParams": { "type": "object" }, @@ -2403,6 +2444,94 @@ ], "type": "object" }, + "PaneCopyMotion": { + "enum": [ + "line_end", + "first_non_blank", + "next_word_start", + "previous_word_start", + "next_word_end", + "next_big_word_start", + "previous_big_word_start", + "next_big_word_end", + "previous_paragraph", + "next_paragraph" + ], + "type": "string" + }, + "PaneCopyMotionParams": { + "properties": { + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "cursor": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + }, + "motion": { + "$ref": "#/schemas/request/$defs/PaneCopyMotion" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "cursor", + "motion" + ], + "type": "object" + }, + "PaneCopySearchDirection": { + "enum": [ + "forward", + "backward" + ], + "type": "string" + }, + "PaneCopySearchParams": { + "properties": { + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": "integer" + }, + "cursor": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + }, + "direction": { + "$ref": "#/schemas/request/$defs/PaneCopySearchDirection" + }, + "pane_id": { + "type": "string" + }, + "previous": { + "anyOf": [ + { + "$ref": "#/schemas/request/$defs/PaneTextRange" + }, + { + "type": "null" + } + ] + }, + "query": { + "type": "string" + } + }, + "required": [ + "pane_id", + "query", + "direction", + "cursor", + "content_revision" + ], + "type": "object" + }, "PaneCurrentParams": { "properties": { "caller_pane_id": { @@ -2581,6 +2710,47 @@ }, "type": "object" }, + "PaneLinkActivateParams": { + "properties": { + "col": { + "format": "uint16", + "maximum": 65535, + "minimum": 0, + "type": "integer" + }, + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "offset_from_bottom": { + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "pane_id": { + "type": "string" + }, + "viewport_row": { + "format": "uint16", + "maximum": 65535, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "pane_id", + "viewport_row", + "col" + ], + "type": "object" + }, "PaneListParams": { "properties": { "workspace_id": { @@ -3011,6 +3181,50 @@ ], "type": "string" }, + "PaneScrollParams": { + "properties": { + "offset_from_bottom": { + "format": "uint64", + "minimum": 0, + "type": "integer" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "offset_from_bottom" + ], + "type": "object" + }, + "PaneSelectionReadParams": { + "properties": { + "anchor": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + }, + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "cursor": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "anchor", + "cursor" + ], + "type": "object" + }, "PaneSendInputParams": { "properties": { "keys": { @@ -3158,6 +3372,41 @@ ], "type": "object" }, + "PaneTextPoint": { + "properties": { + "col": { + "format": "uint16", + "maximum": 65535, + "minimum": 0, + "type": "integer" + }, + "row": { + "format": "uint32", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "row", + "col" + ], + "type": "object" + }, + "PaneTextRange": { + "properties": { + "end": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + }, + "start": { + "$ref": "#/schemas/request/$defs/PaneTextPoint" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, "PaneWaitForOutputParams": { "properties": { "lines": { @@ -3631,6 +3880,21 @@ } ] }, + "ProductAnnouncementDismissParams": { + "properties": { + "id": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "version", + "id" + ], + "type": "object" + }, "ReadFormat": { "enum": [ "text", @@ -3647,6 +3911,17 @@ ], "type": "string" }, + "ReleaseNotesDismissParams": { + "properties": { + "version": { + "type": "string" + } + }, + "required": [ + "version" + ], + "type": "object" + }, "ServerLiveHandoffParams": { "properties": { "expected_protocol": { @@ -4182,6 +4457,13 @@ "string", "null" ] + }, + "source_workspace_id": { + "description": "Workspace whose focused pane supplies the `follow` cwd policy.", + "type": [ + "string", + "null" + ] } }, "type": "object" @@ -4565,6 +4847,54 @@ ], "type": "object" }, + { + "properties": { + "method": { + "const": "product_announcement.dismiss", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/ProductAnnouncementDismissParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "release_notes.dismiss", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/ReleaseNotesDismissParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "command.invoke", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/CommandInvokeParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, { "properties": { "method": { @@ -5032,11 +5362,91 @@ { "properties": { "method": { - "const": "agent.view.set", + "const": "agent.view.set", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/AgentViewSetParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "agent.view.clear", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/AgentViewClearParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "agent.focus", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/AgentTarget" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "agent.start", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/AgentStartParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "agent.prompt", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/AgentPromptParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, + { + "properties": { + "method": { + "const": "agent.wait", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentViewSetParams" + "$ref": "#/schemas/request/$defs/AgentWaitParams" } }, "required": [ @@ -5048,11 +5458,11 @@ { "properties": { "method": { - "const": "agent.view.clear", + "const": "pane.split", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentViewClearParams" + "$ref": "#/schemas/request/$defs/PaneSplitParams" } }, "required": [ @@ -5064,11 +5474,11 @@ { "properties": { "method": { - "const": "agent.focus", + "const": "pane.swap", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentTarget" + "$ref": "#/schemas/request/$defs/PaneSwapParams" } }, "required": [ @@ -5080,11 +5490,11 @@ { "properties": { "method": { - "const": "agent.start", + "const": "pane.move", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentStartParams" + "$ref": "#/schemas/request/$defs/PaneMoveParams" } }, "required": [ @@ -5096,11 +5506,11 @@ { "properties": { "method": { - "const": "agent.prompt", + "const": "pane.zoom", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentPromptParams" + "$ref": "#/schemas/request/$defs/PaneZoomParams" } }, "required": [ @@ -5112,11 +5522,11 @@ { "properties": { "method": { - "const": "agent.wait", + "const": "pane.layout", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/AgentWaitParams" + "$ref": "#/schemas/request/$defs/PaneLayoutParams" } }, "required": [ @@ -5128,11 +5538,11 @@ { "properties": { "method": { - "const": "pane.split", + "const": "pane.process_info", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneSplitParams" + "$ref": "#/schemas/request/$defs/PaneProcessInfoParams" } }, "required": [ @@ -5144,11 +5554,11 @@ { "properties": { "method": { - "const": "pane.swap", + "const": "layout.export", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneSwapParams" + "$ref": "#/schemas/request/$defs/LayoutExportParams" } }, "required": [ @@ -5160,11 +5570,11 @@ { "properties": { "method": { - "const": "pane.move", + "const": "layout.apply", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneMoveParams" + "$ref": "#/schemas/request/$defs/LayoutApplyParams" } }, "required": [ @@ -5176,11 +5586,11 @@ { "properties": { "method": { - "const": "pane.zoom", + "const": "layout.set_split_ratio", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneZoomParams" + "$ref": "#/schemas/request/$defs/LayoutSetSplitRatioParams" } }, "required": [ @@ -5192,11 +5602,11 @@ { "properties": { "method": { - "const": "pane.layout", + "const": "pane.neighbor", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneLayoutParams" + "$ref": "#/schemas/request/$defs/PaneNeighborParams" } }, "required": [ @@ -5208,11 +5618,11 @@ { "properties": { "method": { - "const": "pane.process_info", + "const": "pane.edges", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneProcessInfoParams" + "$ref": "#/schemas/request/$defs/PaneEdgesParams" } }, "required": [ @@ -5224,11 +5634,11 @@ { "properties": { "method": { - "const": "layout.export", + "const": "pane.focus_direction", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/LayoutExportParams" + "$ref": "#/schemas/request/$defs/PaneFocusDirectionParams" } }, "required": [ @@ -5240,11 +5650,11 @@ { "properties": { "method": { - "const": "layout.apply", + "const": "pane.resize", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/LayoutApplyParams" + "$ref": "#/schemas/request/$defs/PaneResizeParams" } }, "required": [ @@ -5256,11 +5666,11 @@ { "properties": { "method": { - "const": "layout.set_split_ratio", + "const": "pane.scroll", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/LayoutSetSplitRatioParams" + "$ref": "#/schemas/request/$defs/PaneScrollParams" } }, "required": [ @@ -5272,11 +5682,11 @@ { "properties": { "method": { - "const": "pane.neighbor", + "const": "pane.edit_scrollback", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneNeighborParams" + "$ref": "#/schemas/request/$defs/PaneTarget" } }, "required": [ @@ -5288,11 +5698,11 @@ { "properties": { "method": { - "const": "pane.edges", + "const": "pane.selection.read", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneEdgesParams" + "$ref": "#/schemas/request/$defs/PaneSelectionReadParams" } }, "required": [ @@ -5304,11 +5714,11 @@ { "properties": { "method": { - "const": "pane.focus_direction", + "const": "pane.copy_motion", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneFocusDirectionParams" + "$ref": "#/schemas/request/$defs/PaneCopyMotionParams" } }, "required": [ @@ -5320,11 +5730,11 @@ { "properties": { "method": { - "const": "pane.resize", + "const": "pane.copy_search", "type": "string" }, "params": { - "$ref": "#/schemas/request/$defs/PaneResizeParams" + "$ref": "#/schemas/request/$defs/PaneCopySearchParams" } }, "required": [ @@ -5413,6 +5823,22 @@ ], "type": "object" }, + { + "properties": { + "method": { + "const": "pane.link.activate", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/PaneLinkActivateParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, { "properties": { "method": { @@ -5701,6 +6127,22 @@ ], "type": "object" }, + { + "properties": { + "method": { + "const": "integration.list", + "type": "string" + }, + "params": { + "$ref": "#/schemas/request/$defs/EmptyParams" + } + }, + "required": [ + "method", + "params" + ], + "type": "object" + }, { "properties": { "method": { @@ -7171,6 +7613,33 @@ ], "type": "object" }, + "IntegrationInfo": { + "properties": { + "available": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "label": { + "type": "string" + }, + "state": { + "$ref": "#/schemas/success_response/$defs/IntegrationState" + }, + "target": { + "$ref": "#/schemas/success_response/$defs/IntegrationTarget" + } + }, + "required": [ + "target", + "label", + "command", + "available", + "state" + ], + "type": "object" + }, "IntegrationInstallResult": { "properties": { "messages": { @@ -7185,6 +7654,14 @@ ], "type": "object" }, + "IntegrationState": { + "enum": [ + "not_installed", + "current", + "outdated" + ], + "type": "string" + }, "IntegrationTarget": { "enum": [ "pi", @@ -8012,6 +8489,41 @@ ], "type": "object" }, + "PaneTextPoint": { + "properties": { + "col": { + "format": "uint16", + "maximum": 65535, + "minimum": 0, + "type": "integer" + }, + "row": { + "format": "uint32", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "row", + "col" + ], + "type": "object" + }, + "PaneTextRange": { + "properties": { + "end": { + "$ref": "#/schemas/success_response/$defs/PaneTextPoint" + }, + "start": { + "$ref": "#/schemas/success_response/$defs/PaneTextPoint" + } + }, + "required": [ + "start", + "end" + ], + "type": "object" + }, "PaneZoomReason": { "enum": [ "single_pane", @@ -9280,6 +9792,103 @@ ], "type": "object" }, + { + "properties": { + "pane_id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "const": "pane_selection", + "type": "string" + } + }, + "required": [ + "type", + "pane_id", + "text" + ], + "type": "object" + }, + { + "properties": { + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": "integer" + }, + "cursor": { + "$ref": "#/schemas/success_response/$defs/PaneTextPoint" + }, + "pane_id": { + "type": "string" + }, + "type": { + "const": "pane_copy_motion", + "type": "string" + } + }, + "required": [ + "type", + "pane_id", + "cursor", + "content_revision" + ], + "type": "object" + }, + { + "properties": { + "content_revision": { + "format": "uint64", + "minimum": 0, + "type": "integer" + }, + "current": { + "format": "uint32", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "current_global": { + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "matches": { + "items": { + "$ref": "#/schemas/success_response/$defs/PaneTextRange" + }, + "type": "array" + }, + "pane_id": { + "type": "string" + }, + "total": { + "format": "uint64", + "minimum": 0, + "type": "integer" + }, + "type": { + "const": "pane_copy_search", + "type": "string" + } + }, + "required": [ + "type", + "pane_id", + "content_revision", + "matches", + "total" + ], + "type": "object" + }, { "properties": { "revision": { @@ -9496,6 +10105,25 @@ ], "type": "object" }, + { + "properties": { + "integrations": { + "items": { + "$ref": "#/schemas/success_response/$defs/IntegrationInfo" + }, + "type": "array" + }, + "type": { + "const": "integration_list", + "type": "string" + } + }, + "required": [ + "type", + "integrations" + ], + "type": "object" + }, { "properties": { "details": { @@ -9718,6 +10346,28 @@ ], "type": "object" }, + { + "properties": { + "handled": { + "type": "boolean" + }, + "type": { + "const": "pane_link_activated", + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "type", + "handled" + ], + "type": "object" + }, { "properties": { "logs": { -- cgit v1.2.3