feat(agentctl): forum cache and thread parent perms scenarios (v0.8.265)

Add selectSecondForumChannel step plus agentctl-forum-channel-cache and
agentctl-thread-parent-perms scenarios for cache invalidation and perms.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-23 07:33:58 -04:00
co-authored by Cursor
parent 7ce437a14d
commit 95b54a9972
2 changed files with 10 additions and 1 deletions
+3 -1
View File
@@ -152,10 +152,12 @@ Bundled scenarios under `apps/pearcord/scenarios/`:
| `agentctl-guild-load-supersede.json` | Second `create-guild` + beta search not served from cache (v0.8.263) |
| `agentctl-channel-search.json` | Channel-scoped `update-search` hit (v0.8.264) |
| `agentctl-mark-read-mention-alerts.json` | Seed mention alert + `markActiveChannelRead` clears `mentionAlerts` (v0.8.264) |
| `agentctl-forum-channel-cache.json` | Forum search then switch forum → empty hits (v0.8.265) |
| `agentctl-thread-parent-perms.json` | Thread exposes `parentChannelPermissions` in view (v0.8.265) |
`mesh.connectGuildMeshThread(scenarioPath)` — host steps + invite + `create-thread` + reply; guest must receive `threadReply` token.
Scenario step extras (headless + attached `run`): `joinFirstVoice`, `openDmPeer`, `selectFirstForumChannel`, `markActiveChannelRead`, `seedMentionAlertForActiveChannel`, `createThreadFromLastMessage`, `markThreadAndParentRead`, `messagesMin`, `messageContentIncludes`, `searchResultsMin`, `searchResultsMax`, `mentionAlertCountMax` on `wait`.
Scenario step extras (headless + attached `run`): `joinFirstVoice`, `openDmPeer`, `selectFirstForumChannel`, `selectSecondForumChannel`, `markActiveChannelRead`, `seedMentionAlertForActiveChannel`, `createThreadFromLastMessage`, `markThreadAndParentRead`, `messagesMin`, `messageContentIncludes`, `searchResultsMin`, `searchResultsMax`, `mentionAlertCountMax`, `parentChannelPermissions` on `wait`.
## Dependencies
+7
View File
@@ -126,6 +126,13 @@ class HeadlessSession {
const view = await this.ipc({ type: 'select-channel', channelId: ch.id })
results.push({ selectFirstForumChannel: true, channelId: ch.id, view })
}
if (step.selectSecondForumChannel) {
const forums = (this._lastView?.channels || []).filter((c) => c.type === 'forum')
if (forums.length < 2) throw new Error('need at least two forum channels')
const ch = forums[1]
const view = await this.ipc({ type: 'select-channel', channelId: ch.id })
results.push({ selectSecondForumChannel: true, channelId: ch.id, view })
}
if (step.markActiveChannelRead) {
const chId = this._lastView?.activeChannelId
if (!chId) throw new Error('no active channel for mark-channel-read')