Watch: show subagent requests on the parent's card, and settle threads by swipe, Settle all and the thread screen
This commit is contained in:
1 parent
a4754b65b0
commit
cf8995e63f
16 files changed
+347
-31
No files matched your search
@@ -60,6 +60,20 @@ private let feedItemJSON = """
|
||||
#expect(request.summary == "bun test --filter ocr")
|
||||
}
|
||||
|
||||
@Test func subagentRequest() throws {
|
||||
let item = try decode(FeedItem.self, feedItemJSON.replacingOccurrences(
|
||||
of: "\"request\": {",
|
||||
with: #""via": { "hostId": "mac", "threadId": "sub", "title": "Check Panama PATH" }, "request": {"#))
|
||||
#expect(item.via == FeedItem.Via(hostId: "mac", threadId: "sub", title: "Check Panama PATH"))
|
||||
#expect(item.requestThread == ("mac", "sub"))
|
||||
#expect(item.route == .thread(hostId: "...", threadId: "..."))
|
||||
|
||||
// A gateway older than `via` leaves it out, and the request belongs to the thread itself.
|
||||
let plain = try decode(FeedItem.self, feedItemJSON)
|
||||
#expect(plain.via == nil)
|
||||
#expect(plain.requestThread == ("...", "..."))
|
||||
}
|
||||
|
||||
@Test func questionRequest() throws {
|
||||
let request = try decode(PendingRequest.self, """
|
||||
{ "id": "r1", "kind": "user_input", "prompt": null, "reason": null, "options": [],
|
||||
@@ -391,7 +405,7 @@ private let feedItemJSON = """
|
||||
@Test func allowMovesThreadToWorking() async throws {
|
||||
let gateway = DemoGateway()
|
||||
let before = try await gateway.feed()
|
||||
let item = try #require(before.needsYou.first { $0.request?.quickOptions != nil })
|
||||
let item = try #require(before.needsYou.first { $0.request?.quickOptions != nil && $0.via == nil })
|
||||
try await gateway.respond(
|
||||
hostId: item.hostId, threadId: item.threadId,
|
||||
request: .decision(requestId: item.request!.id, decision: .accept))
|
||||
@@ -405,6 +419,31 @@ private let feedItemJSON = """
|
||||
}
|
||||
}
|
||||
|
||||
@Test func subagentApprovalGoesToTheSubagent() async throws {
|
||||
let gateway = DemoGateway()
|
||||
let item = try #require(try await gateway.feed().needsYou.first { $0.via != nil })
|
||||
let via = try #require(item.via)
|
||||
let decision = RespondRequest.decision(requestId: item.request!.id, decision: .accept)
|
||||
// The parent has no request of its own to answer.
|
||||
await #expect(throws: GatewayError.http(status: 409, message: "Already answered.")) {
|
||||
try await gateway.respond(hostId: item.hostId, threadId: item.threadId, request: decision)
|
||||
}
|
||||
try await gateway.respond(hostId: via.hostId, threadId: via.threadId, request: decision)
|
||||
let after = try await gateway.feed()
|
||||
#expect(!after.needsYou.contains { $0.id == item.id })
|
||||
#expect(after.working.first { $0.id == item.id }?.via == nil)
|
||||
}
|
||||
|
||||
@Test func settleLeavesTheFeed() async throws {
|
||||
let gateway = DemoGateway()
|
||||
let item = try #require(try await gateway.feed().recent.first)
|
||||
try await gateway.settle(hostId: item.hostId, threadId: item.threadId)
|
||||
#expect(!(try await gateway.feed().recent.contains { $0.id == item.id }))
|
||||
// A reply brings it back.
|
||||
try await gateway.sendMessage(hostId: item.hostId, threadId: item.threadId, text: "One more thing")
|
||||
#expect(try await gateway.feed().working.contains { $0.id == item.id })
|
||||
}
|
||||
|
||||
@Test func multiSelectAnswerMovesThreadToWorking() async throws {
|
||||
let gateway = DemoGateway()
|
||||
let item = try #require(try await gateway.feed().needsYou.first { $0.request?.questions.first?.multiSelect == true })
|
||||
|
||||
Reference in new issue
Block a user