feat(v0.8.671): Phase 696 OAuth grant CSV and install token mesh parity

Signed OAuth grant CSV (guild bots as application grants) and install
token export CSV follow the bot/slash CSV mesh pattern: oauth-csv-ui,
oauth-csv-mixin, delivery-receipts collections, guild gossip, ui-flow IPC,
deep link ?oauth-csv=1, oauth-errors dev filter, and agentctl journeys.

Adds test:ci-phase696 (static + boot + agentctl) and bumps app to 0.8.671.
Documents OAUTH_GRANT_CSV.md, RELEASE_v0.8.671, and opens Phase 697 on the roadmap.
This commit is contained in:
Raven Scott
2026-06-03 02:03:14 -04:00
parent 8bc6a8f096
commit 8857d805c4
+35
View File
@@ -3647,6 +3647,41 @@ class HeadlessSession {
}
}
async runOAuthGrantCsvJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'og696', displayName: 'OAuth CSV 696' })
await this.createGuild({ name: 'OAuth CSV 696', publicListing: false })
await this.wait({ mode: 'guild' }, 45000)
await this.createGuildBotInstallToken({ name: 'Phase696 OAuth App' })
const pushed = await this.platform.pushOAuthGrantCsvToMesh()
const v = await this.refreshView()
if (!pushed?.signature && !v.oauthGrantCsvMeta?.signature) {
throw new Error('expected signed OAuth grant CSV after mesh push')
}
return {
guildOAuthGrantCount: (v.oauthGrantCsvRows || []).length,
hasMeta: v.oauthGrantCsvMeta != null
}
}
async runOAuthInstallTokenExportJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'oi696', displayName: 'OAuth Install 696' })
await this.createGuild({ name: 'OAuth Install 696', publicListing: false })
await this.wait({ mode: 'guild' }, 45000)
await this.createGuildBotInstallToken({ name: 'Phase696 Install' })
const pushed = await this.platform.pushOAuthInstallTokenExportToMesh()
const v = await this.refreshView()
if (!pushed?.signature) {
throw new Error('expected signed OAuth install token CSV export')
}
return {
guildOAuthGrantCount: (v.oauthInstallTokenExportCsvRows || []).length,
hasInstallExport:
v.lastOAuthInstallTokenExport != null || (v.oauthInstallTokenExportCsvRows || []).length > 0
}
}
async runForumPostSearchJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'fm672', displayName: 'Forum 672' })