refactor: replace canvas.show with canvas.present

This commit is contained in:
Peter Steinberger
2025-12-19 03:35:33 +01:00
parent 74cdc1cf3e
commit beefda7f60
19 changed files with 96 additions and 45 deletions

View File

@@ -95,8 +95,8 @@ enum ControlRequestHandler {
deliver: deliver,
to: to)
case let .canvasShow(session, path, placement):
return await self.handleCanvasShow(session: session, path: path, placement: placement)
case let .canvasPresent(session, path, placement):
return await self.handleCanvasPresent(session: session, path: path, placement: placement)
case let .canvasHide(session):
return await self.handleCanvasHide(session: session)
@@ -235,7 +235,7 @@ enum ControlRequestHandler {
UserDefaults.standard.object(forKey: cameraEnabledKey) as? Bool ?? false
}
private static func handleCanvasShow(
private static func handleCanvasPresent(
session: String,
path: String?,
placement: CanvasPlacement?) async -> Response
@@ -243,20 +243,24 @@ enum ControlRequestHandler {
guard self.canvasEnabled() else { return Response(ok: false, message: "Canvas disabled by user") }
_ = session
do {
var params: [String: Any] = [:]
if let path, !path.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
_ = try await self.invokeLocalNode(
command: ClawdisCanvasCommand.navigate.rawValue,
params: ["url": path],
timeoutMs: 20000)
} else {
_ = try await self.invokeLocalNode(
command: ClawdisCanvasCommand.show.rawValue,
params: nil,
timeoutMs: 20000)
params["url"] = path
}
if placement != nil {
return Response(ok: true, message: "Canvas placement ignored (node mode)")
if let placement {
var placementPayload: [String: Any] = [:]
if let x = placement.x { placementPayload["x"] = x }
if let y = placement.y { placementPayload["y"] = y }
if let width = placement.width { placementPayload["width"] = width }
if let height = placement.height { placementPayload["height"] = height }
if !placementPayload.isEmpty {
params["placement"] = placementPayload
}
}
_ = try await self.invokeLocalNode(
command: ClawdisCanvasCommand.present.rawValue,
params: params.isEmpty ? nil : params,
timeoutMs: 20000)
return Response(ok: true)
} catch {
return Response(ok: false, message: error.localizedDescription)

View File

@@ -489,7 +489,7 @@ struct DebugSettings: View {
.font(.caption.monospaced())
.frame(width: 160)
Button("Show panel") {
Task { await self.canvasShow() }
Task { await self.canvasPresent() }
}
.buttonStyle(.borderedProminent)
Button("Hide panel") {
@@ -750,7 +750,7 @@ extension DebugSettings {
// MARK: - Canvas debug actions
@MainActor
private func canvasShow() async {
private func canvasPresent() async {
self.canvasError = nil
let session = self.canvasSessionKey.trimmingCharacters(in: .whitespacesAndNewlines)
do {

View File

@@ -107,7 +107,7 @@ final class MacNodeModeCoordinator {
private func currentCommands(caps: [String]) -> [String] {
var commands: [String] = [
ClawdisCanvasCommand.show.rawValue,
ClawdisCanvasCommand.present.rawValue,
ClawdisCanvasCommand.hide.rawValue,
ClawdisCanvasCommand.navigate.rawValue,
ClawdisCanvasCommand.evalJS.rawValue,

View File

@@ -19,9 +19,19 @@ actor MacNodeRuntime {
}
do {
switch command {
case ClawdisCanvasCommand.show.rawValue:
case ClawdisCanvasCommand.present.rawValue:
let params = (try? Self.decodeParams(ClawdisCanvasPresentParams.self, from: req.paramsJSON)) ??
ClawdisCanvasPresentParams()
let urlTrimmed = params.url?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
let url = urlTrimmed.isEmpty ? nil : urlTrimmed
let placement = params.placement.map {
CanvasPlacement(x: $0.x, y: $0.y, width: $0.width, height: $0.height)
}
try await MainActor.run {
_ = try CanvasManager.shared.show(sessionKey: "main", path: nil)
_ = try CanvasManager.shared.showDetailed(
sessionKey: "main",
target: url,
placement: placement)
}
return BridgeInvokeResponse(id: req.id, ok: true)

View File

@@ -319,12 +319,12 @@ struct ClawdisCLI {
private static func parseCanvas(args: inout [String]) throws -> ParsedCLIRequest {
guard let sub = args.popFirst() else { throw CLIError.help }
switch sub {
case "show":
case "present":
var session = "main"
var target: String?
let placement = self.parseCanvasPlacement(args: &args, session: &session, target: &target)
return ParsedCLIRequest(
request: .canvasShow(session: session, path: target, placement: placement),
request: .canvasPresent(session: session, path: target, placement: placement),
kind: .generic)
case "a2ui":
return try self.parseCanvasA2UI(args: &args)
@@ -542,7 +542,7 @@ struct ClawdisCLI {
return
}
if case .canvasShow = parsed.request {
if case .canvasPresent = parsed.request {
if let message = response.message, !message.isEmpty {
FileHandle.standardOutput.write(Data((message + "\n").utf8))
}
@@ -759,7 +759,7 @@ struct ClawdisCLI {
clawdis-mac node invoke --node <id> --command <name> [--params-json <json>]
Canvas:
clawdis-mac canvas show [--session <key>] [--target </...|https://...|file://...>]
clawdis-mac canvas present [--session <key>] [--target </...|https://...|file://...>]
[--x <screenX> --y <screenY>] [--width <w> --height <h>]
clawdis-mac canvas a2ui push --jsonl <path> [--session <key>] # A2UI v0.8 JSONL
clawdis-mac canvas a2ui reset [--session <key>]

View File

@@ -122,7 +122,7 @@ public enum Request: Sendable {
case status
case agent(message: String, thinking: String?, session: String?, deliver: Bool, to: String?)
case rpcStatus
case canvasShow(session: String, path: String?, placement: CanvasPlacement?)
case canvasPresent(session: String, path: String?, placement: CanvasPlacement?)
case canvasHide(session: String)
case canvasEval(session: String, javaScript: String)
case canvasSnapshot(session: String, outPath: String?)
@@ -185,7 +185,7 @@ extension Request: Codable {
case status
case agent
case rpcStatus
case canvasShow
case canvasPresent
case canvasHide
case canvasEval
case canvasSnapshot
@@ -236,8 +236,8 @@ extension Request: Codable {
case .rpcStatus:
try container.encode(Kind.rpcStatus, forKey: .type)
case let .canvasShow(session, path, placement):
try container.encode(Kind.canvasShow, forKey: .type)
case let .canvasPresent(session, path, placement):
try container.encode(Kind.canvasPresent, forKey: .type)
try container.encode(session, forKey: .session)
try container.encodeIfPresent(path, forKey: .path)
try container.encodeIfPresent(placement, forKey: .placement)
@@ -338,11 +338,11 @@ extension Request: Codable {
case .rpcStatus:
self = .rpcStatus
case .canvasShow:
case .canvasPresent:
let session = try container.decode(String.self, forKey: .session)
let path = try container.decodeIfPresent(String.self, forKey: .path)
let placement = try container.decodeIfPresent(CanvasPlacement.self, forKey: .placement)
self = .canvasShow(session: session, path: path, placement: placement)
self = .canvasPresent(session: session, path: path, placement: placement)
case .canvasHide:
let session = try container.decode(String.self, forKey: .session)