feat(v0.8.679): Phase 704 thread archive CSV & forum tag export mesh parity

Complete signed guild thread archive CSV mesh export and forum tag palette
export (RPC 126/127): thread-csv-ui.js, thread-csv-mixin.js, delivery-receipts
store, guild gossip handlers, ui-flow IPC, deep link ?thread-csv=1, agentctl
journeys, smokes, and docs. Fix pushForumTagExportToMesh naming from pin clone.

Bundle: npm run test:ci-phase704 (50/50). Roadmap Phase 704 complete; Phase 705 slot opened.
This commit is contained in:
Raven Scott
2026-06-03 03:44:57 -04:00
parent 7bf15c8398
commit 66aab1c769
+41
View File
@@ -3946,6 +3946,47 @@ class HeadlessSession {
}
}
async runThreadArchiveCsvJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'th704', displayName: 'Thread CSV 704' })
await this.createGuild({ name: 'Thread CSV 704', publicListing: false })
await this.wait({ mode: 'guild' }, 45000)
const row = await this.sendGuildMessage('Phase704 thread archive export seed')
await this.ipc({ type: 'create-thread', messageId: row.id, name: 'Archive export thread' })
await this.refreshView()
const threadId = this._lastView?.activeChannelId
if (threadId) await this.platform.archiveThread(threadId, true).catch(() => {})
const pushed = await this.platform.pushThreadArchiveCsvToMesh()
const v = await this.refreshView()
if (!pushed?.signature && !v.threadArchiveCsvMeta?.signature) {
throw new Error('expected signed thread archive CSV after mesh push')
}
return {
guildThreadCsvCount: (v.threadArchiveCsvRows || []).length + (v.guildThreads || []).length,
hasMeta: v.threadArchiveCsvMeta != null,
threadCount: (v.guildThreads || []).length
}
}
async runForumTagExportJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'ft704', displayName: 'Forum Tag 704' })
await this.createGuild({ name: 'Forum Tag 704', publicListing: false })
await this.wait({ mode: 'guild' }, 45000)
await this.createGuildChannel('Forum Tags', { type: 'forum' })
await this.refreshView()
const pushed = await this.platform.pushForumTagExportToMesh()
const v = await this.refreshView()
if (!pushed?.signature) {
throw new Error('expected signed forum tag CSV export')
}
return {
guildThreadCsvCount: (v.forumTagExportCsvRows || []).length,
hasForumExport:
v.lastForumTagExport != null || (v.forumTagExportCsvRows || []).length > 0
}
}
async runForumPostSearchJourney () {
if (!this.platform) throw new Error('headless not started')
await this.registerUser({ username: 'fm672', displayName: 'Forum 672' })