lex-microsoft_teams 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01446eb9c4949be87da72534f700b4df999d654c479807e10afe77d2c8d5f584
4
- data.tar.gz: 6d749b6ee7d420fedfa517dbeb73ac321c2fef90333a6b4aaca65f1df6195aed
3
+ metadata.gz: 8ee034940a848fac4dc628b0eff49ba9f3ab6e82c369736de927d1e3fa7cbf3f
4
+ data.tar.gz: 9719c108cbadf8c7a28d716f449e1bfe156fe091997782eeb1f7c5b28f9ba761
5
5
  SHA512:
6
- metadata.gz: 8ed0d0cf1be02569570bcf7d415f6bd490358466f88f2b908166f4a3756c116073ce24959c01d43608a3d9bb3783a1fd9002394410692b07b70e574ae34b9967
7
- data.tar.gz: 18ba3b8cbcdc980e871fae2824a5c24ce5752d6aa1b7c836c3c94351d68c05e94927ae9d995f3f0f3465e601b711f563fd243df743b1c15a1045332150725527
6
+ metadata.gz: 908feae5f588ce0a92f8f0dae87174f24334348b893ba437379cb6e549af20ee7d0fe68de9053670be1a8dc2e01f4ca22cf76a0f659a249f681861b4b465b9f1
7
+ data.tar.gz: 8750195ca3966d196769d5c4228b09aeb974c6ee19b052ab7ac6c07ccc5a9d757cbdb8c7bbd67ef29992b37008d80b0dd63e7a96d3bbbf7ee3cb6f311b6bf480
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.1] - 2026-03-21
4
+
5
+ ### Fixed
6
+ - Guard nil settings in IncrementalSync actor `args` and `delay` methods — `Legion::Settings[:microsoft_teams]` can return nil without raising
7
+
3
8
  ## [0.6.0] - 2026-03-20
4
9
 
5
10
  ### Added
data/CLAUDE.md CHANGED
@@ -10,7 +10,7 @@ Legion Extension that connects LegionIO to Microsoft Teams via Graph API and Bot
10
10
 
11
11
  **GitHub**: https://github.com/LegionIO/lex-microsoft_teams
12
12
  **License**: MIT
13
- **Version**: 0.6.0
13
+ **Version**: 0.6.2
14
14
 
15
15
  ## Architecture
16
16
 
@@ -65,7 +65,7 @@ Legion::Extensions::MicrosoftTeams
65
65
  ├── Hooks/
66
66
  │ └── Auth # OAuth callback hook (mount '/callback') → /api/hooks/lex/microsoft_teams/auth/callback
67
67
  ├── CLI/
68
- │ └── Auth # CLI module for `legion lex teams auth login/status`
68
+ │ └── Auth # CLI module for `legion lex exec teams auth login/status`
69
69
  └── Client # Standalone client (includes all runners)
70
70
  ```
71
71
 
@@ -115,7 +115,7 @@ Four-phase data ingestion that runs after delegated auth to build the agent's so
115
115
 
116
116
  ### CLI
117
117
 
118
- `CLI::Auth` provides `legion lex teams auth login` and `legion lex teams auth status` via the LEX CLI manifest system. Uses `cli_alias: 'teams'` for short-form dispatch.
118
+ `CLI::Auth` provides `legion lex exec teams auth login` and `legion lex exec teams auth status` via the LEX CLI manifest system. Uses `cli_alias: 'teams'` for short-form dispatch. The Thor command is `invoke_ext` with `exec` as an alias (`run` is a Thor reserved word).
119
119
 
120
120
  Design doc: `docs/plans/2026-03-20-teams-cognitive-pipeline-implementation.md`
121
121
 
@@ -14,7 +14,7 @@ module Legion
14
14
 
15
15
  def delay
16
16
  settings = begin
17
- Legion::Settings[:microsoft_teams]
17
+ Legion::Settings[:microsoft_teams] || {}
18
18
  rescue StandardError
19
19
  {}
20
20
  end
@@ -31,7 +31,7 @@ module Legion
31
31
  def args
32
32
  token = resolve_token
33
33
  settings = begin
34
- Legion::Settings[:microsoft_teams]
34
+ Legion::Settings[:microsoft_teams] || {}
35
35
  rescue StandardError
36
36
  {}
37
37
  end
@@ -14,6 +14,7 @@ require 'legion/extensions/microsoft_teams/runners/presence'
14
14
  require 'legion/extensions/microsoft_teams/runners/meetings'
15
15
  require 'legion/extensions/microsoft_teams/runners/transcripts'
16
16
  require 'legion/extensions/microsoft_teams/runners/people'
17
+ require 'legion/extensions/microsoft_teams/runners/ownership'
17
18
 
18
19
  module Legion
19
20
  module Extensions
@@ -35,6 +36,7 @@ module Legion
35
36
  include Runners::LocalCache
36
37
  include Runners::CacheIngest
37
38
  include Runners::People
39
+ include Runners::Ownership
38
40
 
39
41
  attr_reader :opts
40
42
 
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/microsoft_teams/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module MicrosoftTeams
8
+ module Runners
9
+ module Ownership
10
+ include Legion::Extensions::MicrosoftTeams::Helpers::Client
11
+
12
+ TEAMS_FILTER = "resourceProvisioningOptions/Any(x:x eq 'Team')"
13
+ TEAMS_SELECT = 'id,displayName,mail'
14
+ OWNERS_SELECT = 'id,displayName,mail'
15
+
16
+ def sync_owners(team_id: nil, **)
17
+ conn = graph_connection(**)
18
+ if team_id
19
+ owners = fetch_owners(conn: conn, team_id: team_id)
20
+ { owners: owners, team_count: 1, synced_at: Time.now.utc.iso8601 }
21
+ else
22
+ teams = fetch_all_teams(conn: conn)
23
+ all_owners = teams.flat_map do |team|
24
+ fetch_owners(conn: conn, team_id: team['id']).map { |o| o.merge('team_id' => team['id']) }
25
+ end
26
+ { owners: all_owners, team_count: teams.length, synced_at: Time.now.utc.iso8601 }
27
+ end
28
+ rescue StandardError => e
29
+ { error: e.message }
30
+ end
31
+
32
+ def detect_orphans(**)
33
+ conn = graph_connection(**)
34
+ teams = fetch_all_teams(conn: conn)
35
+ orphaned = []
36
+
37
+ teams.each do |team|
38
+ owners = fetch_owners(conn: conn, team_id: team['id'])
39
+ orphaned << { id: team['id'], display_name: team['displayName'], mail: team['mail'] } if owners.empty?
40
+ end
41
+
42
+ { orphaned_teams: orphaned, total_scanned: teams.length, orphan_count: orphaned.length }
43
+ rescue StandardError => e
44
+ { error: e.message }
45
+ end
46
+
47
+ def get_team_owners(team_id:, **)
48
+ conn = graph_connection(**)
49
+ owners = fetch_owners(conn: conn, team_id: team_id)
50
+ { team_id: team_id, owners: owners }
51
+ rescue StandardError => e
52
+ { error: e.message }
53
+ end
54
+
55
+ private
56
+
57
+ def fetch_all_teams(conn:)
58
+ params = { '$filter' => TEAMS_FILTER, '$select' => TEAMS_SELECT }
59
+ resp = conn.get('groups', params)
60
+ (resp.body || {}).fetch('value', [])
61
+ end
62
+
63
+ def fetch_owners(conn:, team_id:)
64
+ params = { '$select' => OWNERS_SELECT }
65
+ resp = conn.get("groups/#{team_id}/owners", params)
66
+ (resp.body || {}).fetch('value', [])
67
+ end
68
+
69
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
70
+ Legion::Extensions::Helpers.const_defined?(:Lex)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module MicrosoftTeams
6
- VERSION = '0.6.0'
6
+ VERSION = '0.6.2'
7
7
  end
8
8
  end
9
9
  end
@@ -18,6 +18,7 @@ require 'legion/extensions/microsoft_teams/runners/local_cache'
18
18
  require 'legion/extensions/microsoft_teams/runners/cache_ingest'
19
19
  require 'legion/extensions/microsoft_teams/runners/people'
20
20
  require 'legion/extensions/microsoft_teams/runners/profile_ingest'
21
+ require 'legion/extensions/microsoft_teams/runners/ownership'
21
22
 
22
23
  # Helpers (bot)
23
24
  require 'legion/extensions/microsoft_teams/helpers/high_water_mark'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-microsoft_teams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -110,6 +110,7 @@ files:
110
110
  - lib/legion/extensions/microsoft_teams/runners/local_cache.rb
111
111
  - lib/legion/extensions/microsoft_teams/runners/meetings.rb
112
112
  - lib/legion/extensions/microsoft_teams/runners/messages.rb
113
+ - lib/legion/extensions/microsoft_teams/runners/ownership.rb
113
114
  - lib/legion/extensions/microsoft_teams/runners/people.rb
114
115
  - lib/legion/extensions/microsoft_teams/runners/presence.rb
115
116
  - lib/legion/extensions/microsoft_teams/runners/profile_ingest.rb