Files
paseo/packages/server/src/server/authorization/operation-permissions.ts
T

450 lines
22 KiB
TypeScript

import type { SessionInboundMessage, SessionOutboundMessage } from "../messages.js";
import type { DaemonPermission } from "./index.js";
type InboundOperation = SessionInboundMessage["type"];
type OutboundOperation = SessionOutboundMessage["type"];
export type PermissionRequirement = DaemonPermission | readonly DaemonPermission[] | null;
const INBOUND_PERMISSION = {
abort_request: "workspace.write",
"agent.config.apply.request": ["workspace.write", "hub.execute"],
"agent.detach.request": "workspace.write",
"agent.fork_context.request": "workspace.read",
"agent.provider_subagents.list.request": "workspace.read",
"agent.provider_subagents.timeline.get.request": "workspace.read",
"agent.rewind.request": "workspace.write",
"agent.skills.get_status.request": "daemon.read",
"agent.skills.import_legacy_selection.request": "daemon.manage",
"agent.skills.reconcile.request": "daemon.manage",
"agent.skills.save_selection.request": "daemon.manage",
"agent.skills.uninstall.request": "daemon.manage",
"agent.timeline.list_prompts.request": "workspace.read",
"agent.timeline.append.request": "workspace.write",
"browser.host.register.request": ["workspace.write"],
"subscription.release.request": null,
"session.events.set_subscription.request": ["workspace.read", "daemon.read", "hub.execute"],
"agent.timeline.set_subscription.request": ["workspace.read", "hub.execute"],
agent_permission_response: "workspace.write",
archive_agent_request: ["workspace.write", "hub.execute"],
archive_workspace_request: ["workspace.manage", "hub.execute"],
audio_played: "workspace.write",
branch_suggestions_request: "workspace.read",
"browser.automation.execute.response": "workspace.write",
cancel_agent_request: ["workspace.write", "hub.execute"],
capture_terminal_request: "workspace.read",
"chat/create": "workspace.write",
"chat/delete": "workspace.write",
"chat/inspect": "workspace.read",
"chat/list": "workspace.read",
"chat/post": "workspace.write",
"chat/read": "workspace.read",
"chat/wait": "workspace.read",
"checkout.commits.file_diff.request": "workspace.read",
"checkout.commits.list.request": "workspace.read",
"checkout.discard_changes.request": "workspace.write",
"checkout.forge.get_check_details.request": "workspace.read",
"checkout.forge.set_auto_merge.request": "workspace.write",
"checkout.github.get_check_details.request": "workspace.read",
"checkout.github.set_auto_merge.request": "workspace.write",
"checkout.refresh.request": "workspace.read",
"checkout.rename_branch.request": "workspace.write",
checkout_commit_request: "workspace.write",
checkout_merge_from_base_request: "workspace.write",
checkout_merge_request: "workspace.write",
checkout_pr_create_request: "workspace.write",
checkout_pr_merge_request: "workspace.write",
checkout_pr_status_request: "workspace.read",
checkout_pull_request: "workspace.write",
checkout_push_request: "workspace.write",
checkout_status_request: "workspace.read",
checkout_switch_branch_request: "workspace.write",
clear_agent_attention: "workspace.write",
client_heartbeat: "workspace.read",
close_items_request: "workspace.manage",
create_agent_request: ["workspace.write", "hub.execute"],
"agent.create.request": ["workspace.write", "hub.execute"],
"creation.subscribe.request": "workspace.read",
create_paseo_worktree_request: "workspace.manage",
create_terminal_request: "workspace.write",
"daemon.config.reload.request": "daemon.manage",
"daemon.get_pairing_offer.request": "access.manage",
"daemon.get_status.request": "daemon.read",
"daemon.update.request": "daemon.manage",
delete_agent_request: "workspace.write",
"diagnostics.request": "daemon.read",
dictation_stream_cancel: "workspace.write",
dictation_stream_chunk: "workspace.write",
dictation_stream_finish: "workspace.write",
dictation_stream_start: "workspace.write",
directory_suggestions_request: "workspace.read",
fetch_agent_history_request: "workspace.read",
fetch_agent_request: ["workspace.read", "hub.execute"],
fetch_agent_timeline_request: ["workspace.read", "hub.execute"],
fetch_agents_request: ["workspace.read", "hub.execute"],
fetch_recent_provider_sessions_request: "workspace.read",
fetch_workspaces_request: ["workspace.read", "hub.execute"],
"file.upload.request": "workspace.write",
file_download_token_request: "workspace.read",
file_explorer_request: "workspace.read",
"forge.search.request": "workspace.read",
"fs.entry.create.request": "workspace.write",
"fs.entry.delete.request": "workspace.write",
"fs.entry.duplicate.request": "workspace.write",
"fs.entry.rename.request": "workspace.write",
"fs.file.subscribe.request": "workspace.read",
"fs.file.unsubscribe.request": "workspace.read",
"fs.file.write.request": "workspace.write",
get_daemon_config_request: "daemon.read",
get_providers_snapshot_request: ["daemon.read", "hub.execute"],
github_search_request: "workspace.read",
"hub.execution.agent.create.request": "hub.execute",
"hub.execution.agent.validate.request": "hub.execute",
"hub.execution.control.request": "hub.execute",
"hub.management.daemon.connect.request": "tunnel.manage",
"hub.management.daemon.disconnect.request": "tunnel.manage",
"hub.management.daemon.get_status.request": "tunnel.manage",
"hub.management.daemon.permissions.update.request": "access.manage",
import_agent_request: "workspace.write",
kill_terminal_request: "workspace.write",
list_available_editors_request: "workspace.read",
list_available_providers_request: "daemon.read",
list_commands_request: "daemon.read",
list_provider_features_request: "daemon.read",
list_provider_models_request: "daemon.read",
list_provider_modes_request: "daemon.read",
list_terminals_request: "workspace.read",
"loop/inspect": "automation.manage",
"loop/list": "automation.manage",
"loop/logs": "automation.manage",
"loop/run": "automation.manage",
"loop/stop": "automation.manage",
open_in_editor_request: "workspace.write",
open_project_request: "workspace.manage",
paseo_worktree_archive_request: "workspace.manage",
paseo_worktree_list_request: "workspace.read",
ping: "daemon.read",
"plugin.catalog.get.request": "daemon.manage",
"plugin.directory.inspect.request": "daemon.manage",
"plugin.directory.install.request": "daemon.manage",
"plugin.disable.request": "daemon.manage",
"plugin.enable.request": "daemon.manage",
"plugin.list.request": "daemon.manage",
"plugin.logs.get.request": "daemon.manage",
"plugin.reload.request": "daemon.manage",
"plugin.remove.request": "daemon.manage",
"plugin.rpc.invoke.request": "daemon.manage",
"plugin.source.install.request": "daemon.manage",
"plugin.source.status.request": "daemon.manage",
"plugin.source.update.request": "daemon.manage",
"project.add.request": "workspace.manage",
"project.create_directory.request": "workspace.manage",
"project.github.clone.request": "workspace.manage",
"project.icon.get.request": "workspace.read",
"project.icon.set.request": "workspace.manage",
"project.list.request": "workspace.read",
"project.remove.request": "workspace.manage",
"project.rename.request": "workspace.manage",
project_icon_request: "workspace.read",
"provider.usage.list.request": "daemon.read",
provider_diagnostic_request: "daemon.read",
pull_request_timeline_request: "workspace.read",
"push.unregister.request": "workspace.read",
read_project_config_request: "workspace.read",
refresh_agent_request: "workspace.write",
refresh_providers_snapshot_request: ["daemon.read", "hub.execute"],
register_push_token: "workspace.read",
restart_server_request: "daemon.manage",
resume_agent_request: "workspace.write",
"schedule/create": "automation.manage",
"schedule/delete": "automation.manage",
"schedule/inspect": "automation.manage",
"schedule/list": "automation.manage",
"schedule/logs": "automation.manage",
"schedule/pause": "automation.manage",
"schedule/resume": "automation.manage",
"schedule/run-once": "automation.manage",
"schedule/update": "automation.manage",
send_agent_message_request: ["workspace.write", "hub.execute"],
set_agent_feature_request: "workspace.write",
set_agent_mode_request: "workspace.write",
set_agent_model_request: "workspace.write",
set_agent_thinking_request: "workspace.write",
set_daemon_config_request: "daemon.manage",
set_voice_mode: "workspace.write",
shutdown_server_request: "daemon.manage",
start_workspace_script_request: "workspace.write",
stash_list_request: "workspace.read",
stash_pop_request: "workspace.write",
stash_save_request: "workspace.write",
"checkout.diff.get.request": "workspace.read",
subscribe_checkout_diff_request: "workspace.read",
subscribe_terminal_request: "workspace.read",
subscribe_terminals_request: "workspace.read",
"terminal.rename.request": "workspace.write",
terminal_input: "workspace.write",
unsubscribe_checkout_diff_request: "workspace.read",
unsubscribe_terminal_request: "workspace.read",
unsubscribe_terminals_request: "workspace.read",
update_agent_request: "workspace.write",
validate_branch_request: "workspace.read",
voice_audio_chunk: "workspace.write",
wait_for_finish_request: "workspace.read",
"workspace.clear_attention.request": "workspace.write",
"workspace.mark_unread.request": "workspace.write",
"workspace.create.request": "workspace.manage",
"workspace.github.search_repositories.request": "workspace.read",
"workspace.label.assignment.set.request": "workspace.manage",
"workspace.label.delete.inspect.request": "workspace.read",
"workspace.label.delete.request": "workspace.manage",
"workspace.label.list.request": "workspace.read",
"workspace.label.update.request": "workspace.manage",
"workspace.pin.set.request": "workspace.manage",
"workspace.recovery.inspect.request": ["workspace.read", "hub.execute"],
"workspace.recovery.restore.request": ["workspace.manage", "hub.execute"],
"workspace.script.list.request": "workspace.read",
"workspace.script.start.request": "workspace.write",
"workspace.script.stop.request": "workspace.write",
"workspace.title.set.request": "workspace.manage",
workspace_setup_status_request: "workspace.read",
"workspace.setup.run.request": "workspace.write",
write_project_config_request: "workspace.write",
} as const satisfies Record<InboundOperation, PermissionRequirement>;
const OUTBOUND_PERMISSION = {
"agent.create.response": ["workspace.write", "hub.execute"],
"agent.create.update": ["workspace.write", "hub.execute"],
"workspace.create.update": "workspace.manage",
"creation.subscribe.response": "workspace.read",
activity_log: "workspace.read",
"agent.config.apply.response": ["workspace.write", "hub.execute"],
"agent.detach.response": "workspace.write",
"agent.fork_context.response": "workspace.read",
"agent.provider_subagents.list.response": "workspace.read",
"agent.provider_subagents.timeline.get.response": "workspace.read",
"agent.provider_subagents.update": "workspace.read",
"agent.rewind.response": "workspace.write",
"agent.skills.get_status.response": "daemon.read",
"agent.skills.import_legacy_selection.response": "daemon.manage",
"agent.skills.reconcile.response": "daemon.manage",
"agent.skills.save_selection.response": "daemon.manage",
"agent.skills.uninstall.response": "daemon.manage",
"agent.timeline.list_prompts.response": "workspace.read",
"agent.timeline.append.response": "workspace.write",
"agent.timeline.replacement": ["workspace.read", "hub.execute"],
"browser.host.register.response": ["workspace.write"],
"subscription.release.response": null,
"session.events.set_subscription.response": ["workspace.read", "daemon.read", "hub.execute"],
"agent.timeline.set_subscription.response": ["workspace.read", "hub.execute"],
agent_archived: ["workspace.read", "hub.execute"],
agent_attention_required: ["workspace.read", "hub.execute"],
agent_deleted: ["workspace.read", "hub.execute"],
agent_permission_request: ["workspace.read", "hub.execute"],
agent_permission_resolved: ["workspace.write", "hub.execute"],
agent_status: ["workspace.read", "hub.execute"],
agent_stream: ["workspace.read", "hub.execute"],
agent_update: ["workspace.read", "hub.execute"],
archive_workspace_response: ["workspace.manage", "hub.execute"],
artifact: "workspace.read",
assistant_chunk: "workspace.read",
audio_output: "workspace.write",
branch_suggestions_response: "workspace.read",
"browser.automation.execute.request": "workspace.write",
cancel_agent_response: ["workspace.write", "hub.execute"],
capture_terminal_response: "workspace.read",
"chat/create/response": "workspace.write",
"chat/delete/response": "workspace.write",
"chat/inspect/response": "workspace.read",
"chat/list/response": "workspace.read",
"chat/post/response": "workspace.write",
"chat/read/response": "workspace.read",
"chat/wait/response": "workspace.read",
"checkout.commits.file_diff.response": "workspace.read",
"checkout.commits.list.response": "workspace.read",
"checkout.discard_changes.response": "workspace.write",
"checkout.forge.get_check_details.response": "workspace.read",
"checkout.forge.set_auto_merge.response": "workspace.write",
"checkout.github.get_check_details.response": "workspace.read",
"checkout.github.set_auto_merge.response": "workspace.write",
"checkout.refresh.response": "workspace.read",
"checkout.rename_branch.response": "workspace.write",
checkout_commit_response: "workspace.write",
checkout_diff_update: "workspace.read",
checkout_merge_from_base_response: "workspace.write",
checkout_merge_response: "workspace.write",
checkout_pr_create_response: "workspace.write",
checkout_pr_merge_response: "workspace.write",
checkout_pr_status_response: "workspace.read",
checkout_pull_response: "workspace.write",
checkout_push_response: "workspace.write",
checkout_status_response: "workspace.read",
checkout_status_update: "workspace.read",
checkout_switch_branch_response: "workspace.write",
clear_agent_attention_response: "workspace.write",
close_items_response: "workspace.manage",
create_paseo_worktree_response: "workspace.manage",
create_terminal_response: "workspace.write",
"daemon.config.reload.response": "daemon.manage",
"daemon.get_pairing_offer.response": "access.manage",
"daemon.get_status.response": "daemon.read",
"daemon.update.progress": "daemon.manage",
"daemon.update.response": "daemon.manage",
"diagnostics.response": "daemon.read",
dictation_stream_ack: "workspace.write",
dictation_stream_error: "workspace.write",
dictation_stream_final: "workspace.write",
dictation_stream_finish_accepted: "workspace.write",
dictation_stream_partial: "workspace.write",
directory_suggestions_response: "workspace.read",
fetch_agent_history_response: "workspace.read",
fetch_agent_response: ["workspace.read", "hub.execute"],
fetch_agent_timeline_response: ["workspace.read", "hub.execute"],
fetch_agents_response: ["workspace.read", "hub.execute"],
fetch_recent_provider_sessions_response: "workspace.read",
fetch_workspaces_response: ["workspace.read", "hub.execute"],
"file.upload.response": "workspace.write",
file_download_token_response: "workspace.read",
file_explorer_response: "workspace.read",
"forge.search.response": "workspace.read",
"fs.entry.create.response": "workspace.write",
"fs.entry.delete.response": "workspace.write",
"fs.entry.duplicate.response": "workspace.write",
"fs.entry.rename.response": "workspace.write",
"fs.file.subscribe.response": "workspace.read",
"fs.file.unsubscribe.response": "workspace.read",
"fs.file.update": "workspace.read",
"fs.file.write.response": "workspace.write",
get_daemon_config_response: "daemon.read",
get_providers_snapshot_response: ["daemon.read", "hub.execute"],
github_search_response: "workspace.read",
"hub.execution.agent.create.response": "hub.execute",
"hub.execution.agent.stream": "hub.execute",
"hub.execution.agent.update": "hub.execute",
"hub.execution.agent.validate.response": "hub.execute",
"hub.execution.control.response": "hub.execute",
"hub.management.daemon.connect.response": "tunnel.manage",
"hub.management.daemon.disconnect.response": "tunnel.manage",
"hub.management.daemon.get_status.response": "tunnel.manage",
"hub.management.daemon.permissions.update.response": "access.manage",
kill_terminal_response: "workspace.write",
list_available_editors_response: "workspace.read",
list_available_providers_response: "daemon.read",
list_commands_response: "daemon.read",
list_provider_features_response: "daemon.read",
list_provider_models_response: "daemon.read",
list_provider_modes_response: "daemon.read",
list_terminals_response: "workspace.read",
"loop/inspect/response": "automation.manage",
"loop/list/response": "automation.manage",
"loop/logs/response": "automation.manage",
"loop/run/response": "automation.manage",
"loop/stop/response": "automation.manage",
open_in_editor_response: "workspace.read",
open_project_response: "workspace.manage",
paseo_worktree_archive_response: "workspace.manage",
paseo_worktree_list_response: "workspace.read",
"plugin.catalog.get.response": "daemon.manage",
"plugin.directory.inspect.response": "daemon.manage",
"plugin.directory.install.response": "daemon.manage",
"plugin.disable.response": "daemon.manage",
"plugin.enable.response": "daemon.manage",
"plugin.list.response": "daemon.manage",
"plugin.logs.get.response": "daemon.manage",
"plugin.reload.response": "daemon.manage",
"plugin.remove.response": "daemon.manage",
"plugin.rpc.invoke.response": "daemon.manage",
"plugin.source.install.response": "daemon.manage",
"plugin.source.status.response": "daemon.manage",
"plugin.source.update.response": "daemon.manage",
pong: "daemon.read",
"project.add.response": "workspace.manage",
"project.create_directory.response": "workspace.manage",
"project.github.clone.response": "workspace.manage",
"project.icon.get.response": "workspace.read",
"project.icon.set.response": "workspace.manage",
"project.list.response": "workspace.read",
"project.remove.response": "workspace.manage",
"project.rename.response": "workspace.manage",
"project.update": "workspace.read",
project_icon_response: "workspace.read",
"provider.usage.list.response": "daemon.read",
provider_diagnostic_response: "daemon.read",
providers_snapshot_update: ["daemon.read", "hub.execute"],
pull_request_timeline_response: "workspace.read",
"push.unregister.response": "workspace.read",
read_project_config_response: "workspace.read",
refresh_providers_snapshot_response: ["daemon.read", "hub.execute"],
rpc_error: null,
"schedule/create/response": "automation.manage",
"schedule/delete/response": "automation.manage",
"schedule/inspect/response": "automation.manage",
"schedule/list/response": "automation.manage",
"schedule/logs/response": "automation.manage",
"schedule/pause/response": "automation.manage",
"schedule/resume/response": "automation.manage",
"schedule/run-once/response": "automation.manage",
"schedule/update/response": "automation.manage",
script_status_update: "workspace.read",
send_agent_message_response: ["workspace.write", "hub.execute"],
set_agent_feature_response: "workspace.write",
set_agent_mode_response: "workspace.write",
set_agent_model_response: "workspace.write",
set_agent_thinking_response: "workspace.write",
set_daemon_config_response: "daemon.manage",
set_voice_mode_response: "workspace.write",
start_workspace_script_response: "workspace.write",
stash_list_response: "workspace.read",
stash_pop_response: "workspace.read",
stash_save_response: "workspace.read",
status: "daemon.read",
"checkout.diff.get.response": "workspace.read",
subscribe_checkout_diff_response: "workspace.read",
subscribe_terminal_response: "workspace.read",
"terminal.rename.response": "workspace.write",
terminal_attention_required: "workspace.read",
terminal_stream_exit: "workspace.read",
terminals_changed: "workspace.read",
transcription_result: "workspace.write",
update_agent_response: "workspace.write",
validate_branch_response: "workspace.read",
voice_input_state: "workspace.write",
wait_for_finish_response: "workspace.read",
"workspace.clear_attention.response": "workspace.write",
"workspace.mark_unread.response": "workspace.write",
"workspace.create.response": "workspace.manage",
"workspace.github.search_repositories.response": "workspace.read",
"workspace.label.assignment.set.response": "workspace.manage",
"workspace.label.delete.inspect.response": "workspace.read",
"workspace.label.delete.response": "workspace.manage",
"workspace.label.list.response": "workspace.read",
"workspace.label.update": "workspace.read",
"workspace.label.update.response": "workspace.manage",
"workspace.pin.set.response": "workspace.manage",
"workspace.recovery.inspect.response": ["workspace.read", "hub.execute"],
"workspace.recovery.restore.response": ["workspace.manage", "hub.execute"],
"workspace.script.list.response": "workspace.read",
"workspace.script.start.response": "workspace.write",
"workspace.script.stop.response": "workspace.write",
"workspace.title.set.response": "workspace.manage",
workspace_setup_progress: "workspace.read",
workspace_setup_status_response: "workspace.read",
"workspace.setup.run.response": "workspace.write",
workspace_update: ["workspace.read", "hub.execute"],
write_project_config_response: "workspace.write",
} as const satisfies Record<OutboundOperation, PermissionRequirement>;
export function requiredPermissionForInbound(operation: InboundOperation): PermissionRequirement {
return INBOUND_PERMISSION[operation];
}
export function requiredPermissionForOutbound(
message: SessionOutboundMessage,
): PermissionRequirement {
// The legacy status envelope carries both agent RPC results and daemon configuration.
if (
message.type === "status" &&
(message.payload.status === "agent_created" || message.payload.status === "agent_create_failed")
)
return ["workspace.write", "hub.execute"];
return OUTBOUND_PERMISSION[message.type];
}