Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
a8af879
db: extend users for external identity projection
Jul 20, 2026
24a46c2
auth: add trusted external user provisioning
Jul 20, 2026
ada0ab2
conversation: enforce repository-level user scope
Jul 20, 2026
7287c23
team-cron: adapt aggregate adapters to conversation user scope
Jul 20, 2026
6ad4cd7
test: update app checks for scoped conversation repository
Jul 20, 2026
01032c4
test: update app e2e tests for scoped conversation repository
Jul 20, 2026
126f6d3
test: update cron e2e checks for scoped conversation repository
Jul 20, 2026
54fbcd2
test: update conversation e2e checks for scoped repository
Jul 20, 2026
c6f7689
team-cron: enforce aggregate root user scope
Jul 20, 2026
c0336e4
db: scope configuration repositories by user
Jul 20, 2026
5f6a9ae
system: scope user configuration APIs
Jul 20, 2026
40cf766
mcp: scope server state by current user
Jul 20, 2026
ab70abb
ai-agent: resolve runtime config per user
Jul 20, 2026
bdfd8e5
channel: use user scoped assistant settings
Jul 20, 2026
404c19d
db: consolidate user scope migration
Jul 20, 2026
6b876fb
db: add mixed user scope schema
Jul 20, 2026
91a2f6c
db: add user scoped skill repository methods
Jul 20, 2026
00c9dc6
extension: scope skill APIs by current user
Jul 20, 2026
8b83608
db: add user scoped assistant repository methods
Jul 20, 2026
57151b6
assistant: scope APIs by current user
Jul 20, 2026
fbec97b
db: add user scoped agent metadata methods
Jul 20, 2026
50b4ff6
ai-agent: scope agent management APIs by current user
Jul 20, 2026
e90033d
app: pass user scope to remaining service reads
Jul 20, 2026
50c27d8
team: update provider test doubles for user scope
Jul 20, 2026
333999c
channel: scope repository operations by owner user
Jul 20, 2026
a12a1c2
realtime: bind websocket events to user scope
Jul 20, 2026
718eb5b
channel: isolate plugin runtime by owner
Jul 20, 2026
43c79b7
channel: scope pairing websocket events
Jul 20, 2026
8e588a3
app: drop unscoped websocket business events
Jul 20, 2026
8d45033
conversation: include user scope in websocket events
Jul 20, 2026
7c76351
db: use owner-scoped channel constraints
Jul 20, 2026
4e6c615
team: include user scope in websocket events
Jul 20, 2026
6874091
cron: include user scope in websocket events
Jul 20, 2026
4bfffed
app: whitelist global extension websocket events
Jul 20, 2026
0e5079c
file: scope filesystem websocket events by user
Jul 20, 2026
4c5f95b
system: avoid default user keep-awake restore outside local mode
Jul 20, 2026
2fe6fdd
cron: require conversation owner for background execution
Jul 20, 2026
97e5093
channel: require explicit owner in aionpro mode
Jul 20, 2026
f028265
agent: scope availability feedback by conversation user
Jul 20, 2026
eb16f5a
auth: bind sessions to user generation
Jul 20, 2026
ec8b8f3
channel: update integration tests for owner scope
Jul 20, 2026
a7d985b
agent: project user scoped management availability
Jul 20, 2026
8c68df9
test: align team active lease cross-user response
Jul 20, 2026
f8f3093
cron: scope jobs by user
Jul 20, 2026
2bf1396
test: cover user scope migration shape
Jul 20, 2026
ceb869a
cron: resolve assistant metadata by job user
Jul 20, 2026
1e74e10
channel: resolve assistant settings by owner
Jul 20, 2026
decbc73
team: resolve assistant catalog by owner
Jul 20, 2026
12b59b3
conversation: resolve runtime catalog by owner
Jul 20, 2026
a8a73c7
cron: resolve executor registry by job user
Jul 20, 2026
b84849b
agent: resolve acp runtime metadata by user
Jul 20, 2026
598e07b
assistant: project generated agents by user
Jul 20, 2026
fb343f1
extension: scope skill catalog sync by user
Jul 20, 2026
68e96b6
team: distinguish cross-user access from missing teams
Jul 20, 2026
b106c77
team: preserve active lease cross-user hiding
Jul 20, 2026
919e2af
conversation: scope assistant preferences by user
Jul 20, 2026
319be2f
cron: seed assistant fixtures for scoped user
Jul 21, 2026
2f33aed
cron: align owner anchor tests with user scope
Jul 21, 2026
eb908a9
db: align cron repository tests with user scope
Jul 21, 2026
76bc1e9
team: hide cross-user team lookups
Jul 21, 2026
e2a322a
app: expect hidden cross-user team access
Jul 21, 2026
952a4f1
style: apply rustfmt to team service
Jul 21, 2026
1542c01
assistant: reduce generated reconcile arguments
Jul 21, 2026
1d27099
auth: expose user context identity fields
Jul 21, 2026
1c00d71
cron: scope internal job updates by user
Jul 21, 2026
00bdf81
office: scope preview sessions by user
Jul 21, 2026
4009fd0
conversation: guard runtime ops by owner
Jul 21, 2026
96e7dc4
conversation: scope active runtime count
Jul 21, 2026
08b5d89
runtime: scope status events by user
Jul 21, 2026
f965a4b
system: scope runtime prepare events by user
Jul 21, 2026
9362476
realtime: validate websocket user sessions
Jul 21, 2026
193ad41
auth: revoke sessions when disabling users
Jul 21, 2026
e7e4e7d
auth: add external session revocation
Jul 21, 2026
535f67b
file: add user scoped office watch cleanup
Jul 21, 2026
ab21983
realtime: add user websocket disconnect
Jul 21, 2026
92f8f66
auth: disconnect websockets on external revoke
Jul 21, 2026
034658a
conversation: scope runtime skill resolution
Jul 21, 2026
b4f1862
extension: keep managed cron skills global
Jul 21, 2026
02d85bf
team: pass owner to config option lookup
Jul 21, 2026
5a30d94
db: cover cron skill user scope migration
Jul 21, 2026
f780400
app: require bootstrap secret for aionpro mode
Jul 21, 2026
5516bd4
mcp: cover user scoped oauth pending state
Jul 21, 2026
963fd04
cron: validate helper user header
Jul 21, 2026
18ff210
app: fix test clippy warnings
Jul 21, 2026
563a620
db: scope feedback diagnostics agents
Jul 21, 2026
2c7f0d2
agent: scope prompt skill lookup by user
Jul 21, 2026
00cb361
auth: disable qr login in aionpro mode
Jul 21, 2026
9c73cff
auth: reject local sessions in aionpro mode
Jul 21, 2026
5d41afa
realtime: reject local websocket sessions in aionpro mode
Jul 21, 2026
7ae2cc4
conversation: scope acp runtime mode persistence
Jul 21, 2026
45fd436
agent: scope acp factory catalog lookup
Jul 21, 2026
68e0a78
agent: scope acp catalog sync writes
Jul 21, 2026
7291246
conversation: override runtime extra user scope
Jul 21, 2026
e041d8a
config: bind CLI user selector to environment
Jul 21, 2026
3c1bcbe
realtime: avoid unscoped manager broadcasts
Jul 21, 2026
50df71a
cron: use scoped conversation lookup for helpers
Jul 21, 2026
d25ba19
db: scope diagnostics message samples by user
Jul 21, 2026
08284c4
db: scope diagnostics detail child queries
Jul 21, 2026
8515f9d
cron: scope delete hook cleanup by user
Jul 21, 2026
5c7c711
assistant: scope rule skill files by user
Jul 21, 2026
95e3a36
cron: reject cross-user conversation targets
Jul 21, 2026
ceac803
acp: scope session persistence by user
Jul 21, 2026
2fbe3c2
office: scope preview proxy by user
Jul 21, 2026
001c41d
runtime: clear user tasks on session revoke
Jul 21, 2026
39715d2
app: clear file watches on session revoke
Jul 21, 2026
a8160c9
team: clear user sessions on revoke
Jul 21, 2026
6307d81
channel: stop user runtimes on session revoke
Jul 21, 2026
1e079b8
db: validate user scope migration copies
Jul 21, 2026
dc69be5
office: scope preview snapshots by user
Jul 21, 2026
e31dbc2
agent: avoid cross-user registry cache overlay
Jul 21, 2026
fa196c1
db: test channel session owner migration guard
Jul 21, 2026
6a8782b
db: reject cross-user assistant upsert takeover
Jul 21, 2026
8d3362f
db: renumber user scope migration after main
Jul 21, 2026
5a18dab
db: reject cross-user scoped upsert takeovers
Jul 21, 2026
d628eb8
extension: isolate user skill import storage
Jul 21, 2026
401635e
auth: keep external session token cookie-only
Jul 21, 2026
385fbd6
conversation: align user-scoped snapshot calls after rebase
Jul 22, 2026
b6bf9d8
auth: redact internal user route secrets
Jul 22, 2026
04a4551
db: remove unscoped acp session trait methods
Jul 22, 2026
45ae676
team: scope mailbox and task repository access
Jul 22, 2026
afc5174
cron: reject cross-user conversation bindings
Jul 22, 2026
a2b0a5f
assistant: resolve agent bindings within user scope
Jul 22, 2026
b80394a
db: require user-scoped agent metadata methods
Jul 22, 2026
cb4bd70
db: require user-scoped skill repository methods
Jul 22, 2026
d3b906c
db: require user-scoped assistant repository methods
Jul 22, 2026
7f00788
assistant: scope legacy bootstrap to default user
Jul 22, 2026
8894d1c
channel: use structured runtime plugin keys
Jul 22, 2026
c1dd23a
office: use structured preview session keys
Jul 22, 2026
15cde42
office: stop preview sessions on user revoke
Jul 22, 2026
9936ea3
db: require user scope for acp session create
Jul 22, 2026
6b63ce1
test: cover user scope migration integrity
Jul 22, 2026
427a55a
cron: report cross-account conversation links
Jul 22, 2026
61c6aba
channel: report cross-account session links
Jul 22, 2026
37aa082
conversation: report cross-account acp session links
Jul 22, 2026
dbb2821
conversation: ignore forged extra user scope
Jul 22, 2026
bbba3e4
db: validate user scope migration parent links
Jul 22, 2026
19fd4e6
system: cover user-scoped settings and providers
Jul 22, 2026
9fa3fc2
cron: mark unscoped repository paths as system only
Jul 22, 2026
8d8b770
mcp: cover cross-user server isolation
Jul 22, 2026
94b04df
fix: complete multi-account user scoping
Jul 23, 2026
8744f6a
Merge remote-tracking branch 'origin/main' into feat/multi-account-us…
Jul 23, 2026
d62c2f5
cron: scope per-job skills to job owner
Jul 23, 2026
33e94f6
test: authenticate office proxy ssrf e2e coverage
Jul 23, 2026
c55938a
test: seed users for websocket e2e and remove sleep races
Jul 23, 2026
dc84743
assistant: migrate legacy locale-less rules on locale reads
Jul 23, 2026
a556520
Merge remote-tracking branch 'origin/main' into feat/multi-account-us…
Jul 23, 2026
c4890a6
Merge remote-tracking branch 'origin/main' into feat/multi-account-us…
Jul 23, 2026
26c05df
Merge remote-tracking branch 'origin/main' into feat/multi-account-us…
Jul 23, 2026
abe599f
Merge remote-tracking branch 'origin/main' into feat/multi-account-us…
Jul 23, 2026
5644716
feat(auth): adopt system_default_user data into first external user
Jul 23, 2026
c4f8fb3
Merge origin/main (project-bind foundation) into feat/multi-account-u…
Jul 23, 2026
48c5558
Merge origin/main (session-port: direct-CLI SessionAgentTask) into fe…
Jul 23, 2026
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
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 9 additions & 1 deletion crates/aionui-ai-agent/src/capability/first_message_injector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ use crate::capability::skill_manager::{AcpSkillManager, prepare_first_message_wi

/// Configuration for the first-message injector.
pub struct InjectionConfig<'a> {
/// Core user that owns the conversation and its user-scoped skills.
pub user_id: &'a str,
/// Preset context (assistant-level system prompt injection).
pub preset_context: Option<&'a str>,
/// Resolved skill names (snapshot from `conversation.extra.skills`).
Expand Down Expand Up @@ -42,7 +44,7 @@ pub async fn inject_first_message_prefix(
};
}

let skills = manager.discover_by_names(config.skills).await;
let skills = manager.discover_by_names_for_user(config.user_id, config.skills).await;
let has_context = config.preset_context.is_some_and(|s| !s.is_empty());
if skills.is_empty() && !has_context {
return content.to_string();
Expand Down Expand Up @@ -89,6 +91,7 @@ mod tests {
"Hello",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: Some("Be concise."),
skills: &[],
native_skill_support: true,
Expand All @@ -110,6 +113,7 @@ mod tests {
"Hello",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: None,
skills: &[],
native_skill_support: true,
Expand All @@ -129,6 +133,7 @@ mod tests {
"Hello",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: None,
skills: &[],
native_skill_support: false,
Expand All @@ -148,6 +153,7 @@ mod tests {
"Go.",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: Some("Rule 1."),
skills: &[],
native_skill_support: false,
Expand Down Expand Up @@ -184,6 +190,7 @@ mod tests {
"Hello",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: None,
skills: &["cron".to_owned()],
native_skill_support: false,
Expand All @@ -205,6 +212,7 @@ mod tests {
"Do stuff",
&mgr,
InjectionConfig {
user_id: "system_default_user",
preset_context: Some("Custom rule"),
skills: &["cron".to_owned()],
native_skill_support: true,
Expand Down
23 changes: 19 additions & 4 deletions crates/aionui-ai-agent/src/capability/skill_manager/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,17 @@ impl AcpSkillManager {
enabled_skills: Option<&[String]>,
exclude_builtin_skills: Option<&[String]>,
) -> Vec<SkillIndex> {
let items = match self.list_available_skills().await {
self.discover_skills_for_user("system_default_user", enabled_skills, exclude_builtin_skills)
.await
}

pub async fn discover_skills_for_user(
&self,
user_id: &str,
enabled_skills: Option<&[String]>,
exclude_builtin_skills: Option<&[String]>,
) -> Vec<SkillIndex> {
let items = match self.list_available_skills_for_user(user_id).await {
Ok(v) => v,
Err(e) => {
warn!(error = %e, "Failed to list skills via extension service");
Expand Down Expand Up @@ -159,6 +169,10 @@ impl AcpSkillManager {
/// auto-inject/opt-in). Returns the resulting index. Used by the
/// snapshot-driven first-message injector.
pub async fn discover_by_names(&self, names: &[String]) -> Vec<SkillIndex> {
self.discover_by_names_for_user("system_default_user", names).await
}

pub async fn discover_by_names_for_user(&self, user_id: &str, names: &[String]) -> Vec<SkillIndex> {
// Always reset state so repeated calls produce a deterministic cache.
if names.is_empty() {
let mut cache = self.cache.write().await;
Expand All @@ -167,7 +181,7 @@ impl AcpSkillManager {
*discovered = true;
return Vec::new();
}
let items = match self.list_available_skills().await {
let items = match self.list_available_skills_for_user(user_id).await {
Ok(v) => v,
Err(e) => {
warn!(error = %e, "discover_by_names: list_available_skills failed");
Expand Down Expand Up @@ -205,11 +219,12 @@ impl AcpSkillManager {
.collect()
}

async fn list_available_skills(
async fn list_available_skills_for_user(
&self,
user_id: &str,
) -> Result<Vec<aionui_extension::SkillListItem>, aionui_extension::ExtensionError> {
if let Some(repo) = &self.skill_repo {
aionui_extension::list_available_skills_with_repo(&self.paths, repo.as_ref()).await
aionui_extension::list_available_skills_with_repo_for_user(&self.paths, repo.as_ref(), user_id).await
} else {
aionui_extension::list_available_skills(&self.paths).await
}
Expand Down
Loading
Loading