const std = @import("std"); pub const Profile = struct { cooperative_agent: bool, durable_sessions: bool, profile_usage: bool, native_auth: bool, file_index: bool, mcp: bool, subagents: bool, auto_upgrade: bool, skills: bool, clipboard: bool, url_opening: bool, web_search: bool, generation_usage: bool, tools: bool, js_host_config: bool, js_host_prompt_history: bool, js_host_sessions: bool, js_host_auth: bool, js_host_url_open: bool, js_host_workspace: bool,}; pub const Capability = std.meta.FieldEnum(Profile); pub fn allows(comptime App: type, comptime capability: Capability) bool { if (!@hasDecl(App, "host_profile")) return @field(native, @tagName(capability)); return @field(App.host_profile, @tagName(capability));} pub const native = Profile{ .cooperative_agent = false, .durable_sessions = true, .profile_usage = true, .native_auth = true, .file_index = true, .mcp = true, .subagents = true, .auto_upgrade = true, .skills = true, .clipboard = true, .url_opening = true, .web_search = true, .generation_usage = true, .tools = true, .js_host_config = false, .js_host_prompt_history = false, .js_host_sessions = false, .js_host_auth = false, .js_host_url_open = false, .js_host_workspace = false,}; pub const wasm = Profile{ .cooperative_agent = true, .durable_sessions = false, .profile_usage = false, .native_auth = false, .file_index = false, .mcp = false, .subagents = false, .auto_upgrade = false, .skills = false, .clipboard = false, .url_opening = false, .web_search = false, .generation_usage = false, .tools = false, .js_host_config = true, .js_host_prompt_history = true, .js_host_sessions = true, .js_host_auth = true, .js_host_url_open = true, .js_host_workspace = true,}; test "apps without a host profile retain native capabilities" { const App = struct {}; try std.testing.expect(allows(App, .durable_sessions)); try std.testing.expect(!allows(App, .js_host_sessions));} test "host profile capabilities are selected by field" { const App = struct { pub const host_profile = wasm; }; try std.testing.expect(!allows(App, .durable_sessions)); try std.testing.expect(allows(App, .js_host_config)); try std.testing.expect(allows(App, .js_host_sessions));} test "native and wasm profiles select distinct auth host effects" { try std.testing.expect(native.native_auth); try std.testing.expect(native.url_opening); try std.testing.expect(!native.js_host_auth); try std.testing.expect(!native.js_host_url_open); try std.testing.expect(!wasm.native_auth); try std.testing.expect(!wasm.url_opening); try std.testing.expect(wasm.js_host_auth); try std.testing.expect(wasm.js_host_url_open);} test "workspace host capability is wasm only without enabling native tools" { try std.testing.expect(@hasField(Profile, "js_host_workspace")); try std.testing.expect(!native.js_host_workspace); try std.testing.expect(wasm.js_host_workspace); try std.testing.expect(!wasm.tools);}
const std = @import("std");
pub const Profile = struct {
cooperative_agent: bool,
durable_sessions: bool,
profile_usage: bool,
native_auth: bool,
file_index: bool,
mcp: bool,
subagents: bool,
auto_upgrade: bool,
skills: bool,
clipboard: bool,
url_opening: bool,
web_search: bool,
generation_usage: bool,
tools: bool,
js_host_config: bool,
js_host_prompt_history: bool,
js_host_sessions: bool,
js_host_auth: bool,
js_host_url_open: bool,
js_host_workspace: bool,
};
pub const Capability = std.meta.FieldEnum(Profile);
pub fn allows(comptime App: type, comptime capability: Capability) bool {
if (!@hasDecl(App, "host_profile")) return @field(native, @tagName(capability));
return @field(App.host_profile, @tagName(capability));
}
pub const native = Profile{
.cooperative_agent = false,
.durable_sessions = true,
.profile_usage = true,
.native_auth = true,
.file_index = true,
.mcp = true,
.subagents = true,
.auto_upgrade = true,
.skills = true,
.clipboard = true,
.url_opening = true,
.web_search = true,
.generation_usage = true,
.tools = true,
.js_host_config = false,
.js_host_prompt_history = false,
.js_host_sessions = false,
.js_host_auth = false,
.js_host_url_open = false,
.js_host_workspace = false,
};
pub const wasm = Profile{
.cooperative_agent = true,
.durable_sessions = false,
.profile_usage = false,
.native_auth = false,
.file_index = false,
.mcp = false,
.subagents = false,
.auto_upgrade = false,
.skills = false,
.clipboard = false,
.url_opening = false,
.web_search = false,
.generation_usage = false,
.tools = false,
.js_host_config = true,
.js_host_prompt_history = true,
.js_host_sessions = true,
.js_host_auth = true,
.js_host_url_open = true,
.js_host_workspace = true,
};
test "apps without a host profile retain native capabilities" {
const App = struct {};
try std.testing.expect(allows(App, .durable_sessions));
try std.testing.expect(!allows(App, .js_host_sessions));
}
test "host profile capabilities are selected by field" {
const App = struct {
pub const host_profile = wasm;
};
try std.testing.expect(!allows(App, .durable_sessions));
try std.testing.expect(allows(App, .js_host_config));
try std.testing.expect(allows(App, .js_host_sessions));
}
test "native and wasm profiles select distinct auth host effects" {
try std.testing.expect(native.native_auth);
try std.testing.expect(native.url_opening);
try std.testing.expect(!native.js_host_auth);
try std.testing.expect(!native.js_host_url_open);
try std.testing.expect(!wasm.native_auth);
try std.testing.expect(!wasm.url_opening);
try std.testing.expect(wasm.js_host_auth);
try std.testing.expect(wasm.js_host_url_open);
}
test "workspace host capability is wasm only without enabling native tools" {
try std.testing.expect(@hasField(Profile, "js_host_workspace"));
try std.testing.expect(!native.js_host_workspace);
try std.testing.expect(wasm.js_host_workspace);
try std.testing.expect(!wasm.tools);
}