Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,7 @@ Install: `bb plugin install git:https://github.com/brsbl/bb-plugins.git@plugin/i

Answer everything agents need from you in Waiting on you, a drawer above the prompt box that collects decisions, email replies and plain questions from every thread, urgent first. Track past choices and results in the Decision log.

![Minimal cards](https://github.com/user-attachments/assets/692e0678-252d-47cf-8e1f-01e2b5c3fa7e)

![Action table and results](https://github.com/user-attachments/assets/ec63ecfe-86ad-4a46-8f6e-06a72e8923f0)

![Mixed table with one reply expanded](https://github.com/user-attachments/assets/4eef8810-5a99-40af-8fa4-974d25f6937f)
![A sample decision open in Waiting on you, with its context, both options, Recommended and Submit](plugins/inline-action-cards/docs/decision-in-thread.png)

[Source](plugins/inline-action-cards) · [README](plugins/inline-action-cards/README.md)

Expand Down
10 changes: 8 additions & 2 deletions plugins/inline-action-cards/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# Inline Decisions

Answer everything agents need from you in one place: **Waiting on you**, a drawer above the prompt box that collects decisions, email replies and plain questions from every thread.
Answer everything agents need from you in one place: **Waiting on you**, a drawer above the prompt box that collects decisions, email replies and plain questions from the active thread.

![Minimal cards](https://github.com/user-attachments/assets/692e0678-252d-47cf-8e1f-01e2b5c3fa7e)
![A sample Workshop plan thread with the decision "Use the garden room for the workshop?" open in Waiting on you, showing its context, both options, Recommended and Submit](docs/decision-in-thread.png)

![The answered decision settled in the thread: Decision: Use garden room, with the agent's reply](docs/decision-result.png)

![Waiting on you expanded with two sample asks, the urgent packing checklist question first](docs/waiting-drawer.png)

![The Decision log with the checklist ask still waiting and the room result plus two dismissed asks in Done](docs/decision-log.png)

## Install

Expand Down
2 changes: 1 addition & 1 deletion plugins/inline-action-cards/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ it("dismisses a waiting item from the Decision log with a reason, telling its th
const reason = screen.getByRole("textbox", { name: "Reason (optional)" });
fireEvent.change(reason, { target: { value: "Paused the campaign" } });
fireEvent.keyDown(reason, { key: "Enter" });
await waitFor(() => expect(submittedMessages).toEqual(["brsbl dismissed: Raise the ads budget · Paused the campaign"]));
await waitFor(() => expect(submittedMessages).toEqual(["Dismissed: Raise the ads budget · Paused the campaign"]));
const saved = JSON.parse((await host.harness.behavior.runCli(["get", "budget", "--thread", "thr_test"])).stdout!);
expect(saved).toMatchObject({ state: "succeeded", attempt: null, result: { message: "Dismissed · Paused the campaign" }, dismissed: { reason: "Paused the campaign" } });
const context = JSON.parse((await host.harness.registrations.mentionProviders[0]!.resolve(submittedMentions[0]!.id)).context);
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions plugins/inline-action-cards/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"files": [
"assets",
"dist",
"docs",
"README.md",
"skills"
],
Expand Down
4 changes: 2 additions & 2 deletions plugins/inline-action-cards/server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ describe("dismissing", () => {
const item = await host.harness.behavior.callRpc("dismiss", { threadId: ref.threadId, id: "channel", revision: 1, reason: "Not needed" }) as Item;
expect(item).toMatchObject({ state: "succeeded", attempt: null, result: { message: "Dismissed · Not needed", retryable: false }, dismissed: { reason: "Not needed" } });
expect(host.harness.sdk.callsTo("threads.send")).toHaveLength(1);
expect(host.harness.sdk.callsTo("threads.send")[0]![0]).toMatchObject({ threadId: ref.threadId, input: [{ text: "brsbl dismissed: Which channel · Not needed" }] });
expect(host.harness.sdk.callsTo("threads.send")[0]![0]).toMatchObject({ threadId: ref.threadId, input: [{ text: "Dismissed: Which channel · Not needed" }] });
expect(await host.harness.behavior.callRpc("waiting", { threadId: ref.threadId })).toEqual([]);
const context = JSON.parse((await host.harness.registrations.mentionProviders[0]!.resolve(`${ref.threadId}:channel:dismissed`)).context);
expect(context).toMatchObject({ intent: "dismissed", question: "Which channel?", reason: "Not needed" });
Expand Down Expand Up @@ -749,7 +749,7 @@ describe("dismissing", () => {
await Promise.all(retries);
const sends = host.harness.sdk.callsTo("threads.send");
expect(sends).toHaveLength(2);
expect(sends[1]![0]).toMatchObject({ input: [{ text: "brsbl dismissed: Which channel" }] });
expect(sends[1]![0]).toMatchObject({ input: [{ text: "Dismissed: Which channel" }] });
const settled = await callRpc("notifyDismissed", { threadId: ref.threadId, id: "notice" }) as Item;
expect(settled).toMatchObject({ state: "succeeded", attempt: null, dismissed: { notice: "sent" } });
expect(settled.dismissed).not.toHaveProperty("noticeError");
Expand Down
2 changes: 1 addition & 1 deletion plugins/inline-action-cards/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ export default function plugin(bb: BbPluginApi): void {
const item = store.claimNotice(threadId, id);
if (!item) return store.get(threadId, id);
const label = title(item).replace(/[?\s]+$/, "");
const prefix = "brsbl dismissed: ";
const prefix = "Dismissed: ";
const reason = item.dismissed?.reason;
try {
await bb.sdk.threads.send({ threadId, mode: "queue-if-active", input: [{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@ If a card needs more than that, the decision is too big: split it, or, when the

Bad cards:

- “Run the code review on the Live Markdown stack?” A routine step; just do it.
- “Run the code review on the sample change?” A routine step; just do it.
- “Approve the claim lines on the comparison page?” It needs a careful read, so ask for a review instead.
- “Cancel the stray trial yourself, then reply done.” An agent with browser access can do it.
- “Unlist the theme after the takedown request?” when the user has never heard of the request.
- “Which type direction should we use?” with four names and no images of them.
- “Move the trip two days later?” with no fares for either option and the wrong number of travelers.
- “Approve?” with a five-bullet What/Why now/Options/Recommendation/Next brief: busy, and the user doesn't read it.

**Good:** “Merge the Live Markdown stack?” once its required checks pass; labels “Merge both PRs” / “Keep them open”; `recommended: "yes"`; context “[Checks and review](https://example.com/checks) passed on the final heads.”
**Good (fictional example):** question “Use the Moonbase Garden Club’s draft as the planting plan?”; labels “Use this plan” / “Revise it first”; `recommended: "yes"`; context “The club needs the plan by Friday.”

Every example in this skill is illustrative. Use verified facts, include the exact head when approval depends on a revision, and never claim a gate passed because an example says so.

Expand Down
Loading