Skip to content

Commit 4acfdd5

Browse files
authored
Merge pull request #1663 from wsp1911/pr/permission
feat(permissions): add unified permission controls across product surfaces
2 parents 61eedaa + 2749514 commit 4acfdd5

223 files changed

Lines changed: 14089 additions & 4443 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

scripts/core-boundaries/rules/crate-rules.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ export const lightweightBoundaryRules = [
8181
'bitfun-services-integrations',
8282
'bitfun-agent-tools',
8383
'bitfun-tool-packs',
84-
'bitfun-product-domains',
8584
'bitfun-transport',
8685
'terminal-core',
8786
'tool-runtime',

scripts/core-boundaries/rules/feature-rules.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
// Boundary rules for feature assembly and optional dependency ownership.
22

33
export const optionalDependencyFeatureOwnerRules = [
4+
{
5+
crateName: 'runtime-ports',
6+
reason:
7+
'runtime-ports may expose product-domain permission ports only through the explicit permission contract slice',
8+
dependencies: [
9+
{ depName: 'bitfun-product-domains', ownerFeatures: ['permission'] },
10+
],
11+
},
412
{
513
crateName: 'core',
614
reason:

scripts/core-boundaries/rules/source/forbidden-rules.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,12 +1770,12 @@ export const forbiddenContentRules = [
17701770
{
17711771
regex: /\bpub enum ConfirmationResponse\b/,
17721772
message:
1773-
'core tool pipeline must not own confirmation channel responses; use bitfun-agent-runtime tool_confirmation',
1773+
'core tool pipeline must not reintroduce legacy confirmation channel responses; use permission requests',
17741774
},
17751775
{
17761776
regex: /\boneshot::Sender<\s*ConfirmationResponse\s*>/,
17771777
message:
1778-
'core tool pipeline must not own confirmation wait-channel storage; use bitfun-agent-runtime tool_confirmation',
1778+
'core tool pipeline must not reintroduce legacy confirmation wait-channel storage; use permission requests',
17791779
},
17801780
{
17811781
regex: /\bArc<DashMap<String,\s*CancellationToken>>\b/,
@@ -2508,7 +2508,7 @@ export const forbiddenContentRules = [
25082508
{
25092509
regex: /ToolConfirmationOutcome::(?:Rejected|ChannelClosed|Timeout)/,
25102510
message:
2511-
'core tool pipeline must not own confirmation wait-result mapping; use bitfun-agent-runtime',
2511+
'core tool pipeline must not reintroduce legacy confirmation wait-result mapping; use permission requests',
25122512
},
25132513
],
25142514
},

scripts/core-boundaries/rules/source/required-rules.mjs

Lines changed: 6 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,69 +1822,6 @@ export const requiredContentRules = [
18221822
},
18231823
],
18241824
},
1825-
{
1826-
path: 'src/crates/execution/agent-runtime/src/tool_confirmation.rs',
1827-
reason:
1828-
'agent-runtime must own portable tool confirmation planning, failure mapping, and wait-channel lifecycle state',
1829-
patterns: [
1830-
{
1831-
regex: /\bpub struct ToolConfirmationRequestFacts\b/,
1832-
message: 'missing tool confirmation request facts',
1833-
},
1834-
{
1835-
regex: /\bpub struct ToolConfirmationGateFacts\b/,
1836-
message: 'missing tool confirmation gate facts',
1837-
},
1838-
{
1839-
regex: /\bpub enum ToolConfirmationGatePlan\b/,
1840-
message: 'missing tool confirmation gate plan',
1841-
},
1842-
{
1843-
regex: /\bpub enum ToolConfirmationPlan\b/,
1844-
message: 'missing tool confirmation plan contract',
1845-
},
1846-
{
1847-
regex: /\bpub enum ToolConfirmationOutcome\b/,
1848-
message: 'missing tool confirmation outcome contract',
1849-
},
1850-
{
1851-
regex: /\bpub enum ToolConfirmationWaitResult\b/,
1852-
message: 'missing tool confirmation wait-result contract',
1853-
},
1854-
{
1855-
regex: /\bpub enum ToolConfirmationResponse\b/,
1856-
message: 'missing tool confirmation channel response',
1857-
},
1858-
{
1859-
regex: /\bpub enum ConfirmationFailureKind\b/,
1860-
message: 'missing tool confirmation failure kind',
1861-
},
1862-
{
1863-
regex: /\bpub struct ToolConfirmationChannelStore\b/,
1864-
message: 'missing tool confirmation channel store',
1865-
},
1866-
{
1867-
regex: /\bpub fn resolve_tool_confirmation_plan\b/,
1868-
message: 'missing tool confirmation plan resolver',
1869-
},
1870-
{
1871-
regex: /\bpub fn resolve_tool_confirmation_gate\b/,
1872-
message: 'missing tool confirmation gate resolver',
1873-
},
1874-
{
1875-
regex: /\bpub fn resolve_confirmation_failure\b/,
1876-
message: 'missing tool confirmation failure resolver',
1877-
},
1878-
{
1879-
regex: /\bpub fn resolve_confirmation_wait_result\b/,
1880-
message: 'missing tool confirmation wait-result resolver',
1881-
},
1882-
{
1883-
regex: /\bconfirmation_channel_store_delivers_confirmation_once\b/,
1884-
message: 'missing confirmation channel delivery regression',
1885-
},
1886-
],
1887-
},
18881825
{
18891826
path: 'src/crates/execution/agent-runtime/src/checkpoint.rs',
18901827
reason:
@@ -1908,37 +1845,6 @@ export const requiredContentRules = [
19081845
},
19091846
],
19101847
},
1911-
{
1912-
path: 'src/crates/execution/agent-runtime/tests/tool_confirmation_contracts.rs',
1913-
reason:
1914-
'agent-runtime tool confirmation owner must keep behavior-equivalence contracts for legacy permission planning and failures',
1915-
patterns: [
1916-
{
1917-
regex: /\bconfirmation_plan_requires_permission_only_when_both_flags_are_true\b/,
1918-
message: 'missing tool confirmation gate regression',
1919-
},
1920-
{
1921-
regex: /\bconfirmation_gate_preserves_skip_policy_precedence\b/,
1922-
message: 'missing tool confirmation skip-policy regression',
1923-
},
1924-
{
1925-
regex: /\bconfirmation_gate_requires_confirmation_only_for_permissioned_tools\b/,
1926-
message: 'missing tool confirmation permissioned-tool regression',
1927-
},
1928-
{
1929-
regex: /\bconfirmation_plan_preserves_legacy_no_timeout_one_year_deadline\b/,
1930-
message: 'missing tool confirmation no-timeout regression',
1931-
},
1932-
{
1933-
regex: /\bconfirmation_failure_mapping_preserves_legacy_reasons_and_errors\b/,
1934-
message: 'missing tool confirmation failure mapping regression',
1935-
},
1936-
{
1937-
regex: /\bconfirmation_wait_result_mapping_preserves_legacy_timeout_and_rejection\b/,
1938-
message: 'missing tool confirmation wait-result mapping regression',
1939-
},
1940-
],
1941-
},
19421848
{
19431849
path: 'src/crates/execution/agent-runtime/src/scheduler.rs',
19441850
reason:
@@ -2791,27 +2697,15 @@ export const requiredContentRules = [
27912697
{
27922698
path: 'src/crates/assembly/core/src/agentic/tools/pipeline/tool_pipeline.rs',
27932699
reason:
2794-
'core tool pipeline must delegate portable confirmation planning, failure mapping, and channel ownership to agent-runtime while retaining state/event/tool execution wiring',
2700+
'core tool pipeline must delegate portable cancellation and retry policy while retaining state/event/tool execution wiring',
27952701
patterns: [
27962702
{
2797-
regex: /\bresolve_tool_confirmation_plan\b/,
2798-
message: 'missing tool confirmation plan delegation',
2799-
},
2800-
{
2801-
regex: /\bresolve_confirmation_failure\b/,
2802-
message: 'missing tool confirmation failure mapping delegation',
2803-
},
2804-
{
2805-
regex: /\bresolve_confirmation_wait_result\b/,
2806-
message: 'missing tool confirmation wait-result mapping delegation',
2703+
regex: /\bremote_workspace_route_root_isolated_from_same_local_path\b/,
2704+
message: 'missing remote workspace permission identity isolation regression',
28072705
},
28082706
{
2809-
regex: /\bToolConfirmationPlan::Await\b/,
2810-
message: 'missing tool confirmation await-plan handling',
2811-
},
2812-
{
2813-
regex: /\bToolConfirmationChannelStore\b/,
2814-
message: 'missing tool confirmation channel owner delegation',
2707+
regex: /\bonce_and_always_replies_control_execution_and_remembered_grants\b/,
2708+
message: 'missing permission project and remote grant isolation regression',
28152709
},
28162710
{
28172711
regex: /\bToolCancellationTokenStore\b/,
@@ -5354,10 +5248,6 @@ export const requiredContentRules = [
53545248
regex: /\bpub fn get_tool_spec_is_concurrency_safe\b/,
53555249
message: 'missing pure GetToolSpec concurrency metadata contract',
53565250
},
5357-
{
5358-
regex: /\bpub fn get_tool_spec_needs_permissions\b/,
5359-
message: 'missing pure GetToolSpec permission metadata contract',
5360-
},
53615251
{
53625252
regex: /\bpub fn validate_get_tool_spec_input\b/,
53635253
message: 'missing pure GetToolSpec input validation contract',
@@ -6627,10 +6517,6 @@ export const requiredContentRules = [
66276517
regex: /\bremote_poll_handler_preserves_missing_workspace_error\b/,
66286518
message: 'missing remote poll missing-workspace regression',
66296519
},
6630-
{
6631-
regex: /\bremote_interaction_handler_preserves_default_reject_reason\b/,
6632-
message: 'missing remote interaction default reject regression',
6633-
},
66346520
],
66356521
},
66366522
{
@@ -6950,12 +6836,8 @@ export const requiredContentRules = [
69506836
{
69516837
path: 'src/crates/assembly/core/src/agentic/coordination/scheduler.rs',
69526838
reason:
6953-
'core scheduler keeps remote queue policy semantics until agent-runtime migration is reviewed',
6839+
'core scheduler must keep dialog lifecycle and requester-aware cancellation adapters',
69546840
patterns: [
6955-
{
6956-
regex: /\bremote_queue_policy_preserves_confirmation_boundary\b/,
6957-
message: 'missing remote queue policy regression',
6958-
},
69596841
{
69606842
regex: /\bimpl AgentDialogTurnPort for DialogScheduler\b/,
69616843
message: 'missing dialog lifecycle port implementation',

scripts/core-boundaries/self-test.mjs

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,25 +1999,6 @@ export function runManifestParserSelfTest({
19991999
path: 'src/crates/execution/agent-runtime/tests/post_call_hook_execution_contracts.rs',
20002000
contracts: ['successful_tool_post_call_executor_runs_deep_review_measurement_route'],
20012001
},
2002-
{
2003-
path: 'src/crates/execution/agent-runtime/src/tool_confirmation.rs',
2004-
contracts: [
2005-
'ToolConfirmationRequestFacts',
2006-
'ToolConfirmationGateFacts',
2007-
'ToolConfirmationGatePlan',
2008-
'ToolConfirmationPlan',
2009-
'ToolConfirmationOutcome',
2010-
'ToolConfirmationWaitResult',
2011-
'ToolConfirmationResponse',
2012-
'ToolConfirmationChannelStore',
2013-
'ConfirmationFailureKind',
2014-
'resolve_tool_confirmation_gate',
2015-
'resolve_tool_confirmation_plan',
2016-
'resolve_confirmation_failure',
2017-
'resolve_confirmation_wait_result',
2018-
'confirmation_channel_store_delivers_confirmation_once',
2019-
],
2020-
},
20212002
{
20222003
path: 'src/crates/execution/agent-runtime/src/user_questions.rs',
20232004
contracts: [
@@ -2154,17 +2135,6 @@ export function runManifestParserSelfTest({
21542135
'ShellType::Custom(name)',
21552136
],
21562137
},
2157-
{
2158-
path: 'src/crates/execution/agent-runtime/tests/tool_confirmation_contracts.rs',
2159-
contracts: [
2160-
'confirmation_gate_preserves_skip_policy_precedence',
2161-
'confirmation_gate_requires_confirmation_only_for_permissioned_tools',
2162-
'confirmation_plan_requires_permission_only_when_both_flags_are_true',
2163-
'confirmation_plan_preserves_legacy_no_timeout_one_year_deadline',
2164-
'confirmation_failure_mapping_preserves_legacy_reasons_and_errors',
2165-
'confirmation_wait_result_mapping_preserves_legacy_timeout_and_rejection',
2166-
],
2167-
},
21682138
{
21692139
path: 'src/crates/execution/agent-runtime/src/checkpoint.rs',
21702140
contracts: [
@@ -2630,10 +2600,8 @@ export function runManifestParserSelfTest({
26302600
{
26312601
path: 'src/crates/assembly/core/src/agentic/tools/pipeline/tool_pipeline.rs',
26322602
contracts: [
2633-
'resolve_tool_confirmation_plan',
2634-
'resolve_confirmation_failure',
2635-
'resolve_confirmation_wait_result',
2636-
'ToolConfirmationPlan::Await',
2603+
'remote_workspace_route_root_isolated_from_same_local_path',
2604+
'once_and_always_replies_control_execution_and_remembered_grants',
26372605
'should_retry_tool_attempt',
26382606
'retry_delay_ms',
26392607
'build_tool_call_truncation_recovery_notice',
@@ -2734,7 +2702,6 @@ export function runManifestParserSelfTest({
27342702
'render_get_tool_spec_tool_use_message',
27352703
'get_tool_spec_is_readonly',
27362704
'get_tool_spec_is_concurrency_safe',
2737-
'get_tool_spec_needs_permissions',
27382705
'validate_get_tool_spec_input',
27392706
'build_get_tool_spec_assistant_detail',
27402707
'build_get_tool_spec_duplicate_load_result',
@@ -3032,7 +2999,6 @@ export function runManifestParserSelfTest({
30322999
'remote_poll_handler_preserves_missing_workspace_error',
30333000
'RemoteInteractionRuntimeHost',
30343001
'handle_remote_interaction_command',
3035-
'remote_interaction_handler_preserves_default_reject_reason',
30363002
'RemoteDefaultModelsConfig',
30373003
'RemoteModelConfig',
30383004
'RemoteModelCatalog',
@@ -3104,7 +3070,6 @@ export function runManifestParserSelfTest({
31043070
{
31053071
path: 'src/crates/assembly/core/src/agentic/coordination/scheduler.rs',
31063072
contracts: [
3107-
'remote_queue_policy_preserves_confirmation_boundary',
31083073
'AgentDialogTurnPort',
31093074
'AgentLifecycleDeliveryPort',
31103075
'AgentTurnCancellationPort',

src/apps/cli/src/actions.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ pub(crate) enum ActionHandler {
7171
Init,
7272
History,
7373
Usage,
74+
ToggleAutoApprove,
7475
Exit,
7576
Login,
7677
Logout,
@@ -444,6 +445,21 @@ static ACTION_SPECS: &[ActionSpec] = &[
444445
shortcut_label: None,
445446
slash_on_startup: true,
446447
},
448+
ActionSpec {
449+
id: "toggle_auto_approve",
450+
name: "Auto mode",
451+
aliases: &["/auto"],
452+
description: "Toggle Auto mode for the current session",
453+
contexts: CHAT,
454+
availability: ActionAvailability::Idle,
455+
handler: ActionHandler::ToggleAutoApprove,
456+
default_bindings: &[],
457+
fallback_bindings: &[],
458+
shortcut_field: None,
459+
palette: palette("Session", false),
460+
shortcut_label: None,
461+
slash_on_startup: false,
462+
},
447463
ActionSpec {
448464
id: "exit",
449465
name: "Exit the app",
@@ -1694,6 +1710,16 @@ mod tests {
16941710
);
16951711
}
16961712

1713+
#[test]
1714+
fn auto_mode_is_chat_only_and_idle_only() {
1715+
assert!(action_for_alias("/auto", ActionContext::Startup).is_none());
1716+
1717+
let action = action_for_alias("/auto", ActionContext::Chat).unwrap();
1718+
assert_eq!(action.handler, ActionHandler::ToggleAutoApprove);
1719+
assert!(action.available(ActionState::chat(false, false)));
1720+
assert!(!action.available(ActionState::chat(true, false)));
1721+
}
1722+
16971723
#[test]
16981724
fn extension_management_uses_capability_entries_instead_of_external_commands() {
16991725
let tools = action_for_alias("/tools", ActionContext::Chat).unwrap();

0 commit comments

Comments
 (0)