Parent: #296
Goal
Build the Aevatar-side provisioning flow for Lark under the Nyx-backed topology, while ensuring Aevatar does not persist Lark credentials or long-lived Nyx credentials for this path.
In Scope
- Accept Lark
app_id / app_secret as provisioning input
- Call Nyx to create or update the agent API key with
callback_url=/api/webhooks/nyxid-relay
- Call Nyx to register the Lark channel bot
- Call Nyx to create the default route for that bot + agent key
- Persist only non-secret Nyx handles needed later, such as:
nyx_channel_bot_id
nyx_agent_api_key_id
route_id if Aevatar creates and stores it during provisioning
- status flags / timestamps
- Document the current manual Lark console step: webhook URL still points to Nyx
Constraints
- Do not persist
app_id, app_secret, verification_token, encrypt_key, Nyx API keys, Nyx user session tokens, or Nyx refresh tokens in actor state/readmodels/local secret stores for this flow
- Do not assume Nyx callbacks downlink
route_id; if Aevatar stores it, treat it as provisioning-time state only
Likely Touchpoints
agents/Aevatar.GAgents.ChannelRuntime/*registration*
agents/Aevatar.GAgents.NyxidChat/*
- any Nyx provisioning port / tool / script layer used by channel setup
Acceptance
Parent: #296
Goal
Build the Aevatar-side provisioning flow for Lark under the Nyx-backed topology, while ensuring Aevatar does not persist Lark credentials or long-lived Nyx credentials for this path.
In Scope
app_id/app_secretas provisioning inputcallback_url=/api/webhooks/nyxid-relaynyx_channel_bot_idnyx_agent_api_key_idroute_idif Aevatar creates and stores it during provisioningConstraints
app_id,app_secret,verification_token,encrypt_key, Nyx API keys, Nyx user session tokens, or Nyx refresh tokens in actor state/readmodels/local secret stores for this flowroute_id; if Aevatar stores it, treat it as provisioning-time state onlyLikely Touchpoints
agents/Aevatar.GAgents.ChannelRuntime/*registration*agents/Aevatar.GAgents.NyxidChat/*Acceptance
app_id/app_secret