You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three Slack-side entry points into a mentor DM thread, all routing through the same SlackChannelAdapter from #1256 and the same orchestrator the web mentor uses:
App Home resume state. When the user opens App Home and an in-flight SLACK_DMmentor_session exists for their (user_id, workspace_id), the tab renders a resume card with the session's last summary; clicking it deep-links the DM thread.
All three entry points require the user to have a linked Slack identity (identity_link row with provider=SLACK, team_id=<team>, external_id=<slack_user_id> from #1238). Unlinked users see the nag flow from #1263 instead.
Why
A single, predictable entry surface is what makes the Slack mentor land. Three entries cover the three muscle memories: power users hit a slash command, light users open App Home, and the resume state catches anyone who lost their DM thread.
Acceptance criteria
App Home "Open mentor" CTA renders for linked users; clicking it opens a DM via conversations.open and triggers the orchestrator with surface=SLACK_DM
/hephaestus mentor is registered on the per-workspace Slack app; invocation in any channel returns an ephemeral 200 within 3 s and the DM thread arrives within 5 s
An in-flight SLACK_DMmentor_session for the viewing user renders a resume card on App Home with the session's last summary; clicking deep-links the DM thread
An integration test installs the Slack app for two workspaces, opens App Home as a linked user in each, and asserts the DMs route to independent Bolt App instances (no cross-workspace leakage)
App Home rendering is per-view; the App Home tab from feat(server): Slack App Home tab as primary onboarding surface #1248 is the host, and this sub-issue adds the mentor card to it. The card's data fetch reads mentor_session directly via the SPI, not via a webapp endpoint.
The resume card surfaces the session's last summary field (already populated by the orchestrator on each turn boundary). No new schema.
Slash command argument parsing is out of scope; /hephaestus mentor is the only sub-command this epic ships. Future sub-commands extend the same router.
Part of #1204.
What ships
Three Slack-side entry points into a mentor DM thread, all routing through the same
SlackChannelAdapterfrom #1256 and the same orchestrator the web mentor uses:mentor_sessionof surfaceSLACK_DM(via feat(server): mentor_session surface discriminant + shared user memory #1242) and either resumes or starts fresh./hephaestus mentor. Registered on the per-workspace Slack app from refactor(server): per-workspace Bolt App factory replacing the singleton #1244. Invocation in any channel responds ephemerally with a "opening a DM" acknowledgement and triggers the same mentor session as the App Home CTA.SLACK_DMmentor_sessionexists for their(user_id, workspace_id), the tab renders a resume card with the session's last summary; clicking it deep-links the DM thread.All three entry points require the user to have a linked Slack identity (
identity_linkrow withprovider=SLACK,team_id=<team>,external_id=<slack_user_id>from #1238). Unlinked users see the nag flow from #1263 instead.Why
A single, predictable entry surface is what makes the Slack mentor land. Three entries cover the three muscle memories: power users hit a slash command, light users open App Home, and the resume state catches anyone who lost their DM thread.
Acceptance criteria
conversations.openand triggers the orchestrator withsurface=SLACK_DM/hephaestus mentoris registered on the per-workspace Slack app; invocation in any channel returns an ephemeral 200 within 3 s and the DM thread arrives within 5 sSLACK_DMmentor_sessionfor the viewing user renders a resume card on App Home with the session's last summary; clicking deep-links the DM threadAppinstances (no cross-workspace leakage)Tests to write
SlackMentorEntryPointsIT— three test scenarios, one per entry, asserting the DM is opened and the orchestrator is triggered with the right surface.Implementation notes
mentor_sessiondirectly via the SPI, not via a webapp endpoint.summaryfield (already populated by the orchestrator on each turn boundary). No new schema./hephaestus mentoris the only sub-command this epic ships. Future sub-commands extend the same router.Dependencies
Depends on #1256. Depends on #1242. Depends on #1244. Depends on #1248. Depends on #1238. Blocks #1258.