Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Native/OptChat/optchat-chief/src/workspaces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -513,11 +513,14 @@ fn rename_by_key(daemon: &Path, key: &str, name: &str) -> Result<(), String> {
let result = client
.rename_workspace(RenameWorkspaceRequest {
expected_generation: Optional::Missing,
expected_name_revision: Optional::Missing,
expected_revision: Optional::Missing,
key: Optional::Value(key.to_owned()),
mutation_id: Optional::Missing,
name: name.to_owned(),
origin: Optional::Missing,
release: None,
source: Optional::Missing,
workspace: Optional::Missing,
})
.map(|_| ())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,7 @@ public struct DaemonCapabilities: Sendable {
/// scripts/cmux-next/check-daemon-capabilities.sh fails the build when it
/// does not serve one of these or `required`. The GUI still checks each
/// with `DaemonIdentity.supports`, for remote and older daemons.
public var optional: [String] { [workspaceGroups, workspaceMetadata, tabMetadata, frontendBrowserTabs, tabDrag,
public var optional: [String] { [workspaceGroups, workspaceMetadata, workspaceNameSource, tabMetadata, frontendBrowserTabs, tabDrag,
notificationAck, tabGroups, savedTabGroups, terminalEnv, terminalPlacementEnv,
terminalReap, terminalReaperActive, batchClose, closeReason, closeWorkspaceIfEmpty, browserHostProvider, frontendBrowserActivate, frontendBrowserInsertAfter, loopbackForward, browserRuntime, screenMetadata, screenGroups, profiles, personalRemoteLocalhost,
terminalPendingSequence, personalTerminals, browserProfiles, notificationSource,
Expand All @@ -419,8 +419,8 @@ public struct DaemonCapabilities: Sendable {
/// bundled daemon lacks the capability. The list only shrinks
/// (DaemonCapabilityExportTests): new app features land with their
/// daemon half, and check-daemon-capabilities.sh fails once the bundled
/// daemon serves an entry, so it moves to `optional`. `workspaceNameSource`: daemon half #20710.
public var unservedByBundledDaemon: [String] { [workspaceNameSource] }
/// daemon serves an entry, so it moves to `optional`.
public var unservedByBundledDaemon: [String] { [] }

/// Whether the bundled daemon (this tree's cmux-tui) serves `capability`:
/// a daemon without it is an older build, and restarting cmux updates it.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@ import Testing
struct DaemonCapabilityExportTests {
private let capabilities = DaemonCapabilities.shared

/// Entries allowed in `unservedByBundledDaemon`. The list only shrinks: a
/// new feature lands with its daemon half and goes in `optional`.
/// workspace-name-source-v1 (2026-10-18): the app half landed first (#21445,
/// it falls back when the daemon lacks it); its daemon half is #20710.
private static let unservedCeiling: Set<String> = ["remote-terminal-tabs-v1", "detached-terminals-v1", "workspace-name-source-v1"]
/// Entries in `unservedByBundledDaemon` on 2026-10-02. The list only
/// shrinks: a new feature lands with its daemon half and goes in `optional`.
private static let unservedCeiling: Set<String> = ["remote-terminal-tabs-v1", "detached-terminals-v1"]

/// Every capability string `DaemonCapabilities` names is in exactly one
/// list, so the check cannot miss a capability the app references.
Expand Down
3 changes: 3 additions & 0 deletions cmux-tui/bindings/conformance/raw/adapters/rust/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -429,11 +429,14 @@ fn real_flow(request: &Request) -> Result<Value, CmuxError> {

let renamed_result = client.rename_workspace(RenameWorkspaceRequest {
expected_generation: Optional::Missing,
expected_name_revision: Optional::Missing,
expected_revision: Optional::Missing,
key: Optional::Missing,
mutation_id: Optional::Missing,
name: renamed_name.to_owned(),
origin: Optional::Missing,
release: None,
source: Optional::Missing,
workspace: Optional::Value(workspace),
})?;
let renamed_tree = client.workspace_tree()?;
Expand Down
2 changes: 1 addition & 1 deletion cmux-tui/bindings/cpp/.cmux-resource-api.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"catalog_sha256": "98a9d2053358c89e1050157d73e93dd12753260d29c4a510d371e185ed9c8e85",
"catalog_sha256": "cb465657f30389129bd05468aad572673a19cec43fa94443ad40ee20869b513d",
"operations": {
"agent.list": {
"class": "read"
Expand Down
10 changes: 5 additions & 5 deletions cmux-tui/bindings/cpp/.cmux-sdk-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
},
{
"path": "include/cmux/raw/generated/models.hpp",
"sha256": "4c6ff63dc6211610200cc14c90a5604dbb3d8279883f3a66cbc1f2d1f53a0cf4",
"size": 301204
"sha256": "6a6d602b48c2c4135df548f19d543a4f3c30c865687c2e46166e77c267eebc32",
"size": 301642
},
{
"path": "src/raw/generated/protocol.cpp",
"sha256": "984736009e86172750d392c607550e6b2b9b2341684754e8122170ff4c3ee8ff",
"size": 1918241
"sha256": "6a6438acce13263ced9485d85cfed6862b1cbc9d9cf8b1d612153ca8df3a1396",
"size": 1921859
}
],
"format": 1,
"ir_sha256": "0ffdc025bee91f84dac1a77976dae2216281abe7f3c20aee0d88b7ddcf108cdc",
"ir_sha256": "a17c6a27cd1400e2e053746dfc1bcc952c775f4bb8ea50973e66cf02c537c2f8",
"language": "cpp",
"mux_protocol": 12,
"schema_version": 2
Expand Down
19 changes: 18 additions & 1 deletion cmux-tui/bindings/cpp/include/cmux/raw/generated/models.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
namespace cmux::raw {

inline constexpr std::uint32_t kMuxProtocolVersion = 12U;
inline constexpr std::string_view kProtocolIrSha256 = "0ffdc025bee91f84dac1a77976dae2216281abe7f3c20aee0d88b7ddcf108cdc";
inline constexpr std::string_view kProtocolIrSha256 = "a17c6a27cd1400e2e053746dfc1bcc952c775f4bb8ea50973e66cf02c537c2f8";

struct ActivitySnapshot;
struct ActivitySubscribeResult;
Expand Down Expand Up @@ -109,6 +109,7 @@ struct MachineUsage;
struct MachineUsageResult;
struct MintTerminalRendererResult;
struct MoveTerminalResult;
enum class NameSource;
struct NewRowResult;
struct NoteSizeActivityResult;
enum class NotificationLevel;
Expand Down Expand Up @@ -3730,6 +3731,11 @@ struct MoveWorkspaceToGroupRequest {
friend bool operator==(const MoveWorkspaceToGroupRequest&, const MoveWorkspaceToGroupRequest&) = default;
};

enum class NameSource {
user,
auto_,
};

struct NewBrowserTabRequest {
Field<std::uint16_t> cols{};
Field<Id> pane{};
Expand Down Expand Up @@ -4269,11 +4275,14 @@ struct RenameSurfaceRequest {

struct RenameWorkspaceRequest {
Field<std::string> expected_generation{};
Field<std::string> expected_name_revision{};
Field<std::uint64_t> expected_revision{};
Field<std::string> key{};
Field<std::string> mutation_id{};
std::string name{};
Field<std::string> origin{};
std::optional<bool> release{};
Field<NameSource> source{};
Field<Id> workspace{};
friend bool operator==(const RenameWorkspaceRequest&, const RenameWorkspaceRequest&) = default;
};
Expand Down Expand Up @@ -5430,6 +5439,8 @@ struct Workspace {
Id id{};
std::optional<std::string> key{};
std::string name{};
std::optional<std::string> name_revision{};
std::optional<NameSource> name_source{};
std::vector<Screen> screens{};
std::optional<std::string> short_id{};
friend bool operator==(const Workspace&, const Workspace&) = default;
Expand Down Expand Up @@ -6317,6 +6328,12 @@ struct Codec<MoveTerminalResult> {
static Result<MoveTerminalResult> decode(const Json& value);
};

template <>
struct Codec<NameSource> {
static Result<Json> encode(const NameSource& value);
static Result<NameSource> decode(const Json& value);
};

template <>
struct Codec<NewRowResult> {
static Result<Json> encode(const NewRowResult& value);
Expand Down
82 changes: 81 additions & 1 deletion cmux-tui/bindings/cpp/src/raw/generated/protocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5318,6 +5318,20 @@ Result<MoveTerminalResult> Codec<MoveTerminalResult>::decode(const Json& value)
return result;
}

Result<Json> Codec<NameSource>::encode(const NameSource& value) {
switch (value) {
case NameSource::user: return Json(std::string("user"));
case NameSource::auto_: return Json(std::string("auto"));
}
return make_error(ErrorCode::invalid_argument, "invalid enum value");
}

Result<NameSource> Codec<NameSource>::decode(const Json& value) {
if (value == Json(std::string("user"))) return NameSource::user;
if (value == Json(std::string("auto"))) return NameSource::auto_;
return make_error(ErrorCode::decode, "unknown NameSource value");
}

Result<Json> Codec<NewRowResult>::encode(const NewRowResult& value) {
(void)value;
Json::Object object;
Expand Down Expand Up @@ -13334,6 +13348,16 @@ Result<Json> Codec<Workspace>::encode(const Workspace& value) {
auto encoded_name = encode_value(value.name);
if (!encoded_name) return std::move(encoded_name).error();
object.emplace("name", std::move(encoded_name).value());
if (value.name_revision) {
auto encoded = encode_value(*value.name_revision);
if (!encoded) return std::move(encoded).error();
object.emplace("name_revision", std::move(encoded).value());
}
if (value.name_source) {
auto encoded = encode_value(*value.name_source);
if (!encoded) return std::move(encoded).error();
object.emplace("name_source", std::move(encoded).value());
}
auto encoded_screens = encode_value(value.screens);
if (!encoded_screens) return std::move(encoded_screens).error();
object.emplace("screens", std::move(encoded_screens).value());
Expand Down Expand Up @@ -13382,6 +13406,18 @@ Result<Workspace> Codec<Workspace>::decode(const Json& value) {
if (!decoded) return std::move(decoded).error();
result.name = std::move(decoded).value();
}
const Json* field_name_revision = value.find("name_revision");
if (field_name_revision) {
auto decoded = decode_value<std::string>(*field_name_revision);
if (!decoded) return std::move(decoded).error();
result.name_revision = std::move(decoded).value();
}
const Json* field_name_source = value.find("name_source");
if (field_name_source) {
auto decoded = decode_value<NameSource>(*field_name_source);
if (!decoded) return std::move(decoded).error();
result.name_source = std::move(decoded).value();
}
const Json* field_screens = value.find("screens");
if (!field_screens) {
return make_error(ErrorCode::decode, "missing required field 'screens'");
Expand Down Expand Up @@ -27145,6 +27181,11 @@ Result<Json> Codec<RenameWorkspaceRequest>::encode(const RenameWorkspaceRequest&
if (!encoded) return std::move(encoded).error();
object.emplace("expected_generation", std::move(encoded).value());
}
if (!value.expected_name_revision.is_absent()) {
auto encoded = encode_value(value.expected_name_revision);
if (!encoded) return std::move(encoded).error();
object.emplace("expected_name_revision", std::move(encoded).value());
}
if (!value.expected_revision.is_absent()) {
auto encoded = encode_value(value.expected_revision);
if (!encoded) return std::move(encoded).error();
Expand All @@ -27168,6 +27209,16 @@ Result<Json> Codec<RenameWorkspaceRequest>::encode(const RenameWorkspaceRequest&
if (!encoded) return std::move(encoded).error();
object.emplace("origin", std::move(encoded).value());
}
if (value.release) {
auto encoded = encode_value(*value.release);
if (!encoded) return std::move(encoded).error();
object.emplace("release", std::move(encoded).value());
}
if (!value.source.is_absent()) {
auto encoded = encode_value(value.source);
if (!encoded) return std::move(encoded).error();
object.emplace("source", std::move(encoded).value());
}
if (!value.workspace.is_absent()) {
auto encoded = encode_value(value.workspace);
if (!encoded) return std::move(encoded).error();
Expand All @@ -27190,6 +27241,16 @@ Result<RenameWorkspaceRequest> Codec<RenameWorkspaceRequest>::decode(const Json&
result.expected_generation = Field<std::string>(std::move(decoded).value());
}
}
const Json* field_expected_name_revision = value.find("expected_name_revision");
if (field_expected_name_revision) {
if (field_expected_name_revision->is_null()) {
result.expected_name_revision = Field<std::string>::null();
} else {
auto decoded = decode_value<std::string>(*field_expected_name_revision);
if (!decoded) return std::move(decoded).error();
result.expected_name_revision = Field<std::string>(std::move(decoded).value());
}
}
const Json* field_expected_revision = value.find("expected_revision");
if (!field_expected_revision) {
field_expected_revision = value.find("expected_terminal_revision");
Expand Down Expand Up @@ -27242,6 +27303,22 @@ Result<RenameWorkspaceRequest> Codec<RenameWorkspaceRequest>::decode(const Json&
result.origin = Field<std::string>(std::move(decoded).value());
}
}
const Json* field_release = value.find("release");
if (field_release) {
auto decoded = decode_value<bool>(*field_release);
if (!decoded) return std::move(decoded).error();
result.release = std::move(decoded).value();
}
const Json* field_source = value.find("source");
if (field_source) {
if (field_source->is_null()) {
result.source = Field<NameSource>::null();
} else {
auto decoded = decode_value<NameSource>(*field_source);
if (!decoded) return std::move(decoded).error();
result.source = Field<NameSource>(std::move(decoded).value());
}
}
const Json* field_workspace = value.find("workspace");
if (field_workspace) {
if (field_workspace->is_null()) {
Expand Down Expand Up @@ -40316,12 +40393,15 @@ constexpr std::array<CommandFieldRequirement, 1> kCommand182FieldRequirements{{
constexpr std::array<CommandFieldRequirement, 1> kCommand183FieldRequirements{{
{"view", 12U, "shared-sizing-v1"},
}};
constexpr std::array<CommandFieldRequirement, 5> kCommand193FieldRequirements{{
constexpr std::array<CommandFieldRequirement, 8> kCommand193FieldRequirements{{
{"expected_generation", 7U, ""},
{"expected_name_revision", 12U, "workspace-name-source-v1"},
{"expected_revision", 7U, ""},
{"key", 7U, "workspace-registry-v1"},
{"mutation_id", 7U, ""},
{"origin", 7U, ""},
{"release", 12U, "workspace-name-source-v1"},
{"source", 12U, "workspace-name-source-v1"},
}};
constexpr std::array<CommandFieldRequirement, 2> kCommand198FieldRequirements{{
{"identity", 12U, "shared-sizing-v1"},
Expand Down
2 changes: 1 addition & 1 deletion cmux-tui/bindings/go/.cmux-resource-api.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"catalog_sha256": "98a9d2053358c89e1050157d73e93dd12753260d29c4a510d371e185ed9c8e85",
"catalog_sha256": "cb465657f30389129bd05468aad572673a19cec43fa94443ad40ee20869b513d",
"operations": {
"agent.list": {
"class": "read"
Expand Down
20 changes: 10 additions & 10 deletions cmux-tui/bindings/go/raw/.cmux-sdk-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,32 @@
"files": [
{
"path": "generated_commands.go",
"sha256": "32e1442ae2c3ec2a4cb857bb1acb1124e82bb8453373c4494b7a71c89fef68fa",
"size": 1190892
"sha256": "097c087d215efa7f0773b091303b8934b2326ff8b54776ba0213ba351add80b3",
"size": 1194705
},
{
"path": "generated_events.go",
"sha256": "39d62ee1df53271067447fd56495e1ad92cb8183565eb400b9b742cf9bcaca52",
"sha256": "9f23ee739f7f9bdf564b551197bc8a744665a80231a2ecbd74b2747eb691ba44",
"size": 204720
},
{
"path": "generated_metadata.go",
"sha256": "c5749a6baf73104ca0e5e487300ded98ecc07013059bf3cc0290ce10e7e21f38",
"size": 118653
"sha256": "d4cbe98a24ed087873f4420fc7bb7ea41b6c17c762ae29af8d610ea15e5710e5",
"size": 118843
},
{
"path": "generated_presence_test.go",
"sha256": "4ad69058ffc148eaf5502fc0c93c0b21e4f5bb27ad0ed08d45011cb2b884a5f8",
"size": 2541002
"sha256": "22aced1f06aacdbda6b969fac494e889d320506a623befdeba1bae5c54188c91",
"size": 2550919
},
{
"path": "generated_types.go",
"sha256": "47c705092dd37fc59163ad88a61c6ce15011d19377ad78fc12214ca983c1629b",
"size": 500103
"sha256": "1ac6876f9089e47c0eb01386dab507e091950144feaeb6f23783675c34dcc8d2",
"size": 501607
}
],
"format": 1,
"ir_sha256": "0ffdc025bee91f84dac1a77976dae2216281abe7f3c20aee0d88b7ddcf108cdc",
"ir_sha256": "a17c6a27cd1400e2e053746dfc1bcc952c775f4bb8ea50973e66cf02c537c2f8",
"language": "go",
"mux_protocol": 12,
"schema_version": 2
Expand Down
Loading
Loading