Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
237 commits
Select commit Hold shift + click to select a range
f6220d6
feat(slack): Add feature flag for Seer Explorer @mentions
leeandher Feb 6, 2026
a2fe63b
feat(slack): Add Slack API methods for thread history and reactions
leeandher Feb 6, 2026
4bb7df5
fix(slack): Store actual granted scopes from OAuth response
leeandher Feb 6, 2026
e9dec47
Merge branch 'master' into leanderrodrigues/iswf-2017-add-slack-api-m…
alexsohn1126 Feb 23, 2026
fc24539
fix(slack): Use conservative scope fallback when OAuth response lacks…
alexsohn1126 Feb 23, 2026
a96e8f6
feat(seer): Add Explorer methods to SeerEntrypoint protocol
alexsohn1126 Feb 24, 2026
099d6a0
fix(seer): Add stub Explorer implementations to satisfy abstract prot…
alexsohn1126 Feb 24, 2026
c3eb9e3
feat(seer): Add SeerOperatorExplorerCache for completion hook payloads
alexsohn1126 Feb 24, 2026
0377ee7
feat(seer): Add SeerExplorerResponse notification data and Slack rend…
alexsohn1126 Feb 25, 2026
97dec2c
feat(slack): Handle app_mention events for Seer Explorer
alexsohn1126 Feb 25, 2026
cc231b0
ref(slack): Rename process_explorer_mention to process_mention_for_slack
alexsohn1126 Feb 27, 2026
a18ccba
Merge master into iswf-2017
alexsohn1126 Mar 4, 2026
8cb182e
Merge iswf-2017 into iswf-2020
alexsohn1126 Mar 4, 2026
827104e
Merge iswf-2020 into iswf-2024
alexsohn1126 Mar 4, 2026
bd36469
Merge iswf-2024 into iswf-2025
alexsohn1126 Mar 4, 2026
47ed128
Merge iswf-2025 into iswf-2018
alexsohn1126 Mar 4, 2026
08e9591
ref(seer): Simplify _render_explorer_response to use inline link inst…
alexsohn1126 Mar 9, 2026
6138ec0
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 9, 2026
75382c1
ref(slack): Address PR review feedback for extended scope methods
alexsohn1126 Mar 9, 2026
b22a09f
ref(slack): Remove SDK typing note from get_thread_history docstring
alexsohn1126 Mar 9, 2026
e1fba91
fix(slack): Fix mypy errors in requires_scope decorator typing
alexsohn1126 Mar 9, 2026
7285d50
fix(slack): Return copy of mutable default in requires_scope decorator
alexsohn1126 Mar 9, 2026
08c6f73
ref(seer): Split SeerEntrypoint protocol into Autofix + Explorer
alexsohn1126 Mar 9, 2026
b50c851
Revert "ref(seer): Split SeerEntrypoint protocol into Autofix + Explo…
alexsohn1126 Mar 9, 2026
76645d9
ref(seer): Split SeerEntrypoint into core, autofix, and explorer prot…
alexsohn1126 Mar 9, 2026
b5db5bd
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 9, 2026
b5ee290
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 9, 2026
1930e57
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 9, 2026
ca05f75
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 10, 2026
482a470
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 10, 2026
f121c49
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 10, 2026
9058c57
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 10, 2026
731b782
fix(seer): Type entrypoint_registry as autofix_entrypoint_registry to…
alexsohn1126 Mar 10, 2026
0645460
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 10, 2026
cd7b0bc
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 10, 2026
74f6ba9
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 10, 2026
6df0a3d
Merge remote-tracking branch 'origin/master' into leanderrodrigues/is…
alexsohn1126 Mar 10, 2026
218beb7
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 10, 2026
2914861
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 10, 2026
e56416f
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 10, 2026
77932ab
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 10, 2026
41fa7f4
Add halt metric assertion in explorer cache miss test
alexsohn1126 Mar 10, 2026
6776b44
Use MarkdownBlock for explorer response renderer
alexsohn1126 Mar 10, 2026
5702801
Filter active integrations and add debug logging in on_app_mention
alexsohn1126 Mar 10, 2026
ae33249
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 10, 2026
faab9c1
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 10, 2026
ce351a7
feat(slack): Add SlackMentionHandler for parsing @mentions
alexsohn1126 Feb 25, 2026
6b8006d
fix(slack): Remove unused SlackMessageLink and SlackThreadMessage types
alexsohn1126 Feb 26, 2026
3aef4cb
ref(seer): Move mention.py to seer/entrypoints/slack/
alexsohn1126 Mar 2, 2026
e2af363
feat(slack): Add Explorer support to SlackEntrypoint
alexsohn1126 Mar 11, 2026
5cc7997
feat(seer): Add trigger_explorer method to SeerOperator
alexsohn1126 Mar 11, 2026
0b6cdc4
fix(seer): Fix mypy errors in explorer entrypoint registration
alexsohn1126 Mar 11, 2026
5944992
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 11, 2026
227ce61
Rename SeerOperator to SeerAutofixOperator
alexsohn1126 Mar 11, 2026
d27aabc
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 11, 2026
1d99e53
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 11, 2026
d3e3a5f
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 11, 2026
b476812
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 11, 2026
721498d
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 11, 2026
9129a52
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 11, 2026
b8f46bb
ref(seer): Add CacheHaltReason enum for cache halt reasons
alexsohn1126 Mar 11, 2026
6a0562f
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 11, 2026
59c1f1e
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 11, 2026
02cb3e6
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 11, 2026
6f4c144
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 11, 2026
2bbae48
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 11, 2026
0ccd443
ref(seer): Use generic summary in SeerExplorerResponse example data
alexsohn1126 Mar 11, 2026
3111940
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 11, 2026
ea6da55
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 11, 2026
e5b73c0
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 11, 2026
3551c53
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 11, 2026
bc3b4f0
fix(slack): Skip app mention handling for orgs pending deletion
alexsohn1126 Mar 12, 2026
5dd3099
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 12, 2026
27924a4
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 12, 2026
37a92a9
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 12, 2026
2498b8f
ref(slack): Use lifecycle metrics instead of logger in on_app_mention
alexsohn1126 Mar 12, 2026
ebd0942
ref(slack): Extract app mention halt reasons into AppMentionHaltReaso…
alexsohn1126 Mar 12, 2026
c2bb621
feat(seer): Add SeerExplorerError notification data, template, and Sl…
alexsohn1126 Mar 12, 2026
6483e6a
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 12, 2026
97e8202
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 12, 2026
cd36905
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 12, 2026
100117b
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 12, 2026
5f115b8
ref(slack): Split SlackEntrypoint into separate autofix and explorer …
alexsohn1126 Mar 12, 2026
ef0e582
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 12, 2026
740f000
fix(tests): Remove duplicate SeerSlackRendererExplorerErrorTest class
alexsohn1126 Mar 12, 2026
6f096f8
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 12, 2026
fc8e725
add active integration check
alexsohn1126 Mar 13, 2026
850d456
set default error message
alexsohn1126 Mar 13, 2026
2c11301
ref(slack): Use snake_case for AppMentionHaltReason enum values
alexsohn1126 Mar 13, 2026
159fadf
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 13, 2026
d624fc0
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 13, 2026
cd5d7f1
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 13, 2026
90cc7e4
feat(slack): Add streaming message methods to SlackIntegration
alexsohn1126 Mar 13, 2026
0e1873f
refactor(slack): Remove add_reaction and remove_reaction from SlackIn…
alexsohn1126 Mar 13, 2026
3f89d14
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 13, 2026
8d13982
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 13, 2026
23627e4
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 13, 2026
992af50
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 13, 2026
c1c60fa
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 13, 2026
0f900b6
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 13, 2026
e85439b
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 13, 2026
4a34638
add useful descriptions under each permission enum
alexsohn1126 Mar 16, 2026
a651048
remove unused slack methods
alexsohn1126 Mar 16, 2026
358e2e1
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 16, 2026
6aa6f70
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 16, 2026
0a6e20e
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 16, 2026
7b0469c
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 16, 2026
aa0c40e
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 16, 2026
af59ed7
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 16, 2026
e080061
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 16, 2026
400c71f
remove dead tests for deleted streaming methods
alexsohn1126 Mar 16, 2026
63b972d
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 16, 2026
6e93dbe
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 16, 2026
0c5bf93
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 16, 2026
96a243f
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 16, 2026
e3d8d75
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 16, 2026
a6aa4fd
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 16, 2026
ba4ba30
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 16, 2026
a19d89f
ref(slack): Replace requires_scope decorator with has_scope helper
alexsohn1126 Mar 17, 2026
05fb353
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 17, 2026
b592755
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 17, 2026
6dd21cd
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 17, 2026
e55a2b2
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 17, 2026
4d75da4
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 17, 2026
549cce6
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 17, 2026
f40a857
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 17, 2026
c4e9da3
ref(seer): Remove SeerEntrypointCore and inline into child protocols
alexsohn1126 Mar 17, 2026
13610ba
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 17, 2026
aa98cc5
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 17, 2026
30fe216
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 17, 2026
e14f33c
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 17, 2026
2a7c95c
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 17, 2026
582c432
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 17, 2026
d9cfcc5
ref(seer): Remove dead SeerExplorerOperator.has_access method
alexsohn1126 Mar 17, 2026
e46a408
reduce processing deadline
alexsohn1126 Mar 17, 2026
47d079e
move import to the top
alexsohn1126 Mar 17, 2026
701b711
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 17, 2026
d678207
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 17, 2026
abb494b
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 17, 2026
74ed8a1
ref(seer): Replace tuple with IssueLink dataclass in extract_issue_links
alexsohn1126 Mar 17, 2026
9d3fb32
specify type of cache in the completion hook
alexsohn1126 Mar 17, 2026
bb97154
test(seer): Add tests for SeerOperatorCompletionHook
alexsohn1126 Mar 17, 2026
e1a3526
feat(slack): Re-add set_thread_status and clear_thread_status to Slac…
alexsohn1126 Mar 17, 2026
b010fc4
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 17, 2026
012c540
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 17, 2026
b4a784b
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 17, 2026
7951c83
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 17, 2026
7ce7517
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 17, 2026
4b69a3c
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 17, 2026
c6212cd
test(slack): Add tests for SlackExplorerEntrypoint
alexsohn1126 Mar 17, 2026
02961e2
Merge remote-tracking branch 'origin/master' into leanderrodrigues/is…
alexsohn1126 Mar 17, 2026
a319864
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 17, 2026
b5043fc
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 17, 2026
2f2d31f
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 17, 2026
b9ee703
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 17, 2026
369cf4a
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 17, 2026
7e2ec0e
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 17, 2026
327c413
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 17, 2026
53d5f35
ref(seer): Consolidate explorer trigger interaction types into single…
alexsohn1126 Mar 18, 2026
be606f4
fix(seer): Add RpcUser to SeerExplorerClient user type signature
alexsohn1126 Mar 18, 2026
8b8fbc5
fix(seer): Add RpcUser to collect_user_org_context type signature
alexsohn1126 Mar 18, 2026
1dfaa73
Merge remote-tracking branch 'origin/master' into leanderrodrigues/is…
alexsohn1126 Mar 18, 2026
26042e3
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 18, 2026
493a22c
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 18, 2026
9fe7e13
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 18, 2026
cd9edd2
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 18, 2026
0a9b820
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 18, 2026
85ec546
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 18, 2026
7a89817
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 18, 2026
800d95a
fix(seer): Add organization_id to mock cache payload in completion ho…
alexsohn1126 Mar 18, 2026
468e64e
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 18, 2026
a20fa71
ref(slack): Refactor has_scope to use positive variable naming
alexsohn1126 Mar 18, 2026
bd00e6a
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 18, 2026
305f162
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 18, 2026
b3d0522
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 18, 2026
730fc10
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 18, 2026
a4beefe
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 18, 2026
8a32832
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 18, 2026
054c8df
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 18, 2026
a7b499a
ref(slack): Remove redundant clear_thread_status method
alexsohn1126 Mar 18, 2026
f672f8f
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 18, 2026
61309a6
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 18, 2026
d64597e
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 18, 2026
c577ef4
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 18, 2026
9d0c232
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 18, 2026
ee55f9d
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 18, 2026
bdfde1e
ref(slack): Remove clear_thread_status calls from explorer entrypoint
alexsohn1126 Mar 18, 2026
5417904
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 18, 2026
736ae2b
Merge remote-tracking branch 'origin/master' into alexsohn/iswf-2020-…
alexsohn1126 Mar 19, 2026
14d3bb2
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 19, 2026
b3f231b
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 19, 2026
3d0b80f
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 19, 2026
b6f4878
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
46b442f
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
a7e3ecc
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
f52c325
ref(slack): Remove message_ts from app mention processing
alexsohn1126 Mar 19, 2026
b7fdc36
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
9b095b9
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
489c1df
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
7a9e248
Merge remote-tracking branch 'origin/master' into leanderrodrigues/is…
alexsohn1126 Mar 19, 2026
bd97c61
Merge branch 'leanderrodrigues/iswf-2017-add-slack-api-methods-for-th…
alexsohn1126 Mar 19, 2026
116fddb
Merge branch 'alexsohn/iswf-2020-add-explorer-methods-to-seerentrypoi…
alexsohn1126 Mar 19, 2026
1c931de
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 19, 2026
1f76d0b
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 19, 2026
b566ea3
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
1e3bdae
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
6b2112d
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
8196059
make summary mandatory
alexsohn1126 Mar 19, 2026
f8df17c
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 19, 2026
52f26f0
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
c2dd050
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
fdcf826
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
2c04a1d
fix test
alexsohn1126 Mar 19, 2026
0de4d1c
fix explorer renderer tests to match current implementation
alexsohn1126 Mar 19, 2026
22fe20b
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 19, 2026
82e0124
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
e6b262b
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
417d5b6
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
c40b913
fix(seer): Remove unused explorer_link and render error on empty summary
alexsohn1126 Mar 19, 2026
1827083
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
4d3f3b9
Merge branch 'master' into alexsohn/iswf-2024-add-seeroperatorexplore…
alexsohn1126 Mar 19, 2026
45a4d97
Merge branch 'alexsohn/iswf-2024-add-seeroperatorexplorercache-for-co…
alexsohn1126 Mar 19, 2026
15d08b8
Merge branch 'alexsohn/iswf-2025-add-explorer-notification-data-and-s…
alexsohn1126 Mar 19, 2026
b577805
Merge branch 'alexsohn/iswf-2018-handle-app-mention-events-in-slack-w…
alexsohn1126 Mar 19, 2026
d09404c
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 19, 2026
099b744
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 19, 2026
80d62bc
Merge branch 'master' into alexsohn/iswf-2019-create-slackmentionhand…
alexsohn1126 Mar 23, 2026
de29a75
Merge branch 'alexsohn/iswf-2019-create-slackmentionhandler-for-parsi…
alexsohn1126 Mar 23, 2026
f4418cd
Merge branch 'alexsohn/iswf-2021-add-explorer-support-to-slackentrypo…
alexsohn1126 Mar 23, 2026
376fca2
Merge branch 'master' into alexsohn/iswf-2022-add-trigger-explorer-me…
alexsohn1126 Mar 23, 2026
804aa1e
fix(seer): Search all users when finding existing Explorer runs
alexsohn1126 Mar 23, 2026
95c9ae1
fix(seer): Record failure on explorer cache org mismatch instead of s…
alexsohn1126 Mar 25, 2026
df812d8
test(seer): Add test for org mismatch failure in explorer completion …
alexsohn1126 Mar 25, 2026
375650f
fix(seer): Set is_interactive=True and enable_coding=False for SeerEx…
alexsohn1126 Mar 25, 2026
1c563fb
Merge branch 'master' into alexsohn/iswf-2022-add-trigger-explorer-me…
alexsohn1126 Mar 25, 2026
c76aa39
test(seer): Use assert_failure_metric in org mismatch test
alexsohn1126 Mar 25, 2026
1619a7a
docs(seer): Clarify why org mismatch uses return instead of continue
alexsohn1126 Mar 26, 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
4 changes: 4 additions & 0 deletions src/sentry/seer/entrypoints/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

class SeerOperatorInteractionType(StrEnum):
OPERATOR_TRIGGER_AUTOFIX = "trigger_autofix"
OPERATOR_TRIGGER_EXPLORER = "trigger_explorer"
OPERATOR_PROCESS_AUTOFIX_UPDATE = "process_autofix_update"
OPERATOR_CACHE_POPULATE_PRE_AUTOFIX = "cache_populate_pre_autofix"
OPERATOR_CACHE_POPULATE_POST_AUTOFIX = "cache_populate_post_autofix"
Expand All @@ -19,6 +20,9 @@ class SeerOperatorInteractionType(StrEnum):
ENTRYPOINT_ON_TRIGGER_AUTOFIX_ALREADY_EXISTS = "entrypoint_on_trigger_autofix_already_exists"
ENTRYPOINT_CREATE_AUTOFIX_CACHE_PAYLOAD = "entrypoint_create_autofix_cache_payload"
ENTRYPOINT_ON_AUTOFIX_UPDATE = "entrypoint_on_autofix_update"
ENTRYPOINT_ON_TRIGGER_EXPLORER = "entrypoint_on_trigger_explorer"
ENTRYPOINT_CREATE_EXPLORER_CACHE_PAYLOAD = "entrypoint_create_explorer_cache_payload"
ENTRYPOINT_ON_EXPLORER_UPDATE = "entrypoint_on_explorer_update"
OPERATOR_PROCESS_EXPLORER_COMPLETION = "process_explorer_completion"
OPERATOR_CACHE_SET_EXPLORER = "cache_set_explorer"
OPERATOR_CACHE_GET_EXPLORER = "cache_get_explorer"
Expand Down
142 changes: 136 additions & 6 deletions src/sentry/seer/entrypoints/operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@
autofix_entrypoint_registry,
explorer_entrypoint_registry,
)
from sentry.seer.entrypoints.types import SeerAutofixEntrypoint, SeerEntrypointKey
from sentry.seer.entrypoints.types import (
SeerAutofixEntrypoint,
SeerEntrypointKey,
SeerExplorerEntrypoint,
)
from sentry.seer.explorer.client import SeerExplorerClient
from sentry.seer.explorer.client_models import SeerRunState
from sentry.seer.explorer.on_completion_hook import ExplorerOnCompletionHook
from sentry.seer.models import SeerPermissionError
from sentry.seer.seer_setup import has_seer_access
from sentry.sentry_apps.metrics import SentryAppEventType
from sentry.tasks.base import instrumented_task
Expand Down Expand Up @@ -438,6 +444,116 @@ def trigger_autofix_legacy(
)


class SeerExplorerOperator[CachePayloadT]:
"""
A class that connects to entrypoint implementations and runs Explorer operations for Seer.
It does this to ensure all entrypoints have consistent behavior and responses.
"""

def __init__(self, entrypoint: SeerExplorerEntrypoint[CachePayloadT]):
self.entrypoint = entrypoint

def trigger_explorer(
self,
*,
organization: Organization,
user: User | RpcUser | None,
prompt: str,
on_page_context: str | None = None,
category_key: str,
category_value: str,
) -> int | None:
"""
Start or continue an Explorer run and return the run_id.
If a run exists for this category (e.g. slack thread), continues it; otherwise starts new.
Uses the entrypoint's Explorer callbacks for success/error handling.
"""
event_lifecycle = SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.OPERATOR_TRIGGER_EXPLORER,
entrypoint_key=self.entrypoint.key,
)

with event_lifecycle.capture() as lifecycle:
lifecycle.add_extras(
{
"category_key": category_key,
"category_value": category_value,
}
)

try:
# RpcUser is not in SeerExplorerClient's type signature but works at runtime
client = SeerExplorerClient(
organization=organization,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We really should not be using type-ignores unless the spaghetti is really bad. Can we add RpcUser to the SeerExplorerClient signature?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in be606f4

user=user,
category_key=category_key,
category_value=category_value,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
category_value=category_value,
category_value=category_value,
is_interactive=True,

You can add this flag as a reminder to the agent there's a user to chat with/get feedback from

Nit can also explicitly set enable_coding=False (already the default) as it's considered experimental

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! I've changed to include both of your suggestions:

client = SeerExplorerClient(
organization=organization,
user=user,
category_key=category_key,
category_value=category_value,
on_completion_hook=SeerOperatorCompletionHook,
is_interactive=True,
enable_coding=False,
)

on_completion_hook=SeerOperatorCompletionHook,
is_interactive=True,
enable_coding=False,
)
except SeerPermissionError as e:
with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_EXPLORER,
entrypoint_key=self.entrypoint.key,
).capture(assume_success=False):
self.entrypoint.on_trigger_explorer_error(error=str(e))
lifecycle.record_failure(failure_reason=e)
return None
Comment on lines +496 to +502
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh interesting. What is this entrypoint call doing on failure? I wonder if it needs to be contained to a task if we expect to propagate this to users reliably.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The entrypoint will send an error message to the thread, with a generic error message.

Maybe we should make this into a task, but at the same time, spinning up a task will require a lot more overhead, so I don't know if it's worth it 🤔


try:
existing_runs = client.get_runs(
category_key=category_key,
category_value=category_value,
limit=1,
only_current_user=False,
)
Comment thread
sentry[bot] marked this conversation as resolved.
Comment thread
cursor[bot] marked this conversation as resolved.

if existing_runs:
run_id = client.continue_run(
run_id=existing_runs[0].run_id,
prompt=prompt,
on_page_context=on_page_context,
)
Comment thread
alexsohn1126 marked this conversation as resolved.
lifecycle.add_extra("continued", "true")
else:
run_id = client.start_run(
prompt=prompt,
on_page_context=on_page_context,
)
lifecycle.add_extra("continued", "false")
except Exception as e:
with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_EXPLORER,
entrypoint_key=self.entrypoint.key,
).capture(assume_success=False):
self.entrypoint.on_trigger_explorer_error(error="An unexpected error occurred")
lifecycle.record_failure(failure_reason=e)
return None

lifecycle.add_extra("run_id", str(run_id))

with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_TRIGGER_EXPLORER,
entrypoint_key=self.entrypoint.key,
).capture():
self.entrypoint.on_trigger_explorer_success(run_id=run_id)

with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_CREATE_EXPLORER_CACHE_PAYLOAD,
entrypoint_key=self.entrypoint.key,
).capture():
cache_payload = self.entrypoint.create_explorer_cache_payload()

SeerOperatorExplorerCache.set(
entrypoint_key=str(self.entrypoint.key),
run_id=run_id,
cache_payload=cache_payload,
)
Comment on lines +542 to +552
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: In trigger_explorer, an unhandled exception after the success notification can cause a silent failure, preventing the user from receiving explorer results.
Severity: HIGH

Suggested Fix

Wrap the calls to create_explorer_cache_payload() and SeerOperatorExplorerCache.set() within a try...except block. This will handle potential exceptions after the success notification has been sent, preventing the process from silently failing and ensuring state consistency. This approach aligns with the exception handling already present earlier in the method.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.

Location: src/sentry/seer/entrypoints/operator.py#L542-L552

Potential issue: In the `trigger_explorer` method, the success callback
`on_trigger_explorer_success()` is invoked before the explorer payload is cached. If a
subsequent operation, such as `create_explorer_cache_payload()` or
`SeerOperatorExplorerCache.set()`, fails and raises an exception (e.g., due to a Redis
error), the exception is not handled. This causes the method to fail after the user has
already been notified of success. As a result, the completion hook will later find no
cache entry and will silently fail to deliver the explorer results to the user, creating
a state inconsistency and a broken user experience.


return run_id
Comment thread
alexsohn1126 marked this conversation as resolved.


@instrumented_task(
name="sentry.seer.entrypoints.operator.process_autofix_updates",
namespace=seer_tasks,
Expand Down Expand Up @@ -693,8 +809,22 @@ def execute(cls, organization: Organization, run_id: int) -> None:
if not cache_payload:
continue

entrypoint_cls.on_explorer_update(
cache_payload=cache_payload,
summary=summary,
run_id=run_id,
)
if cache_payload.get("organization_id") != organization.id:
# run_id is globally unique in Seer, so only one entrypoint will
# have a cache entry per run. An org mismatch here is anomalous;
# return rather than continue to abort the entire method.
lifecycle.record_failure(failure_reason="org_mismatch")
return
Comment thread
alexsohn1126 marked this conversation as resolved.
Comment thread
alexsohn1126 marked this conversation as resolved.

with SeerOperatorEventLifecycleMetric(
interaction_type=SeerOperatorInteractionType.ENTRYPOINT_ON_EXPLORER_UPDATE,
entrypoint_key=str(entrypoint_key),
).capture() as ept_lifecycle:
try:
entrypoint_cls.on_explorer_update(
cache_payload=cache_payload,
summary=summary,
run_id=run_id,
)
except Exception as e:
ept_lifecycle.record_failure(failure_reason=e)
5 changes: 3 additions & 2 deletions src/sentry/seer/explorer/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from sentry.seer.seer_setup import has_seer_access_with_detail
from sentry.seer.signed_seer_api import SeerViewerContext
from sentry.users.models.user import User
from sentry.users.services.user import RpcUser

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -170,7 +171,7 @@ def execute(cls, organization: Organization, run_id: int) -> None:

Args:
organization: Sentry organization
user: User for permission checks and user-specific context (can be User, AnonymousUser, or None)
user: User for permission checks and user-specific context (can be User, RpcUser, AnonymousUser, or None)
project: Optional project for project-scoped runs (e.g. autofix for an issue)
category_key: Optional category key for filtering/grouping runs (e.g., "bug-fixer", "trace-analyzer"). Must be provided together with category_value. Makes it easy to retrieve runs for your feature later.
category_value: Optional category value for filtering/grouping runs (e.g., issue ID, trace ID). Must be provided together with category_key. Makes it easy to retrieve a specific run for your feature later.
Expand All @@ -185,7 +186,7 @@ def execute(cls, organization: Organization, run_id: int) -> None:
def __init__(
self,
organization: Organization,
user: User | AnonymousUser | None = None,
user: User | RpcUser | AnonymousUser | None = None,
project: Project | None = None,
category_key: str | None = None,
category_value: str | None = None,
Expand Down
4 changes: 2 additions & 2 deletions src/sentry/seer/explorer/client_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ def has_seer_explorer_access_with_detail(


def collect_user_org_context(
user: SentryUser | AnonymousUser | None,
user: SentryUser | RpcUser | AnonymousUser | None,
organization: Organization,
request: Request | None = None,
) -> dict[str, Any]:
Expand Down Expand Up @@ -235,7 +235,7 @@ def collect_user_org_context(

# Handle name attribute - SentryUser has name
user_name: str | None = None
if isinstance(user, SentryUser):
if isinstance(user, (SentryUser, RpcUser)):
user_name = user.name

# Get user's timezone setting (IANA timezone name, e.g., "America/Los_Angeles")
Expand Down
25 changes: 24 additions & 1 deletion tests/sentry/seer/entrypoints/test_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
)
from sentry.seer.explorer.client_models import MemoryBlock, Message, RepoPRState, SeerRunState
from sentry.sentry_apps.metrics import SentryAppEventType
from sentry.testutils.asserts import assert_failure_metric
from sentry.testutils.cases import TestCase


Expand Down Expand Up @@ -774,7 +775,7 @@ def test_execute_skips_entrypoint_without_access(self, mock_fetch):
mock_no_access.has_access.return_value = False
mock_has_access = Mock(spec=SeerExplorerEntrypoint)
mock_has_access.has_access.return_value = True
cache_payload = {"thread_id": "abc"}
cache_payload = {"thread_id": "abc", "organization_id": self.organization.id}

with (
patch.dict(
Expand Down Expand Up @@ -816,6 +817,28 @@ def test_execute_skips_entrypoint_without_cache(self, mock_fetch):

mock_entrypoint_cls.on_explorer_update.assert_not_called()

@patch("sentry.integrations.utils.metrics.EventLifecycle.record_event")
@patch("sentry.seer.explorer.client_utils.fetch_run_status")
def test_execute_records_failure_on_org_mismatch(self, mock_fetch, mock_record):
state = self._make_state(
blocks=[
MemoryBlock(
id="1",
message=Message(role="assistant", content="summary"),
timestamp="2024-01-01T00:00:00Z",
),
]
)
other_org = self.create_organization()
mock_entrypoint_cls = self._execute_with_mock_entrypoint(
mock_fetch,
state,
cache_return_value={"thread_id": "abc", "organization_id": other_org.id},
)

mock_entrypoint_cls.on_explorer_update.assert_not_called()
assert_failure_metric(mock_record, "org_mismatch")

@patch("sentry.seer.explorer.client_utils.fetch_run_status")
def test_execute_with_empty_blocks(self, mock_fetch):
state = self._make_state(blocks=[])
Expand Down
Loading