Skip to content

feat: add session-aware slash skill commands - #311

Merged
pedronauck merged 3 commits into
mainfrom
session-composer
Aug 5, 2026
Merged

pedronauck merged 3 commits into
mainfrom
session-composer

Conversation

@pedronauck

@pedronauck pedronauck commented Aug 5, 2026 •

Copy link
Copy Markdown
Member

Summary

Implements the deferred session command specification and replaces the hand-built slash UI with assistant-ui's native Composer Trigger Popover and Directive Text primitives.

Slash commands now work at the start of a prompt or after whitespace anywhere in the draft. Built-in and ACP control commands remain standalone, while session-effective skill commands can be inserted inline and repeated without losing authored text.

User behavior

  • Opens the native assistant-ui command popover for / at the start or in the middle of a prompt.
  • Shows Built-in, Agent, and Skills at prompt start; inline triggers show only effective skills.
  • Replaces only the active slash query and preserves surrounding Unicode and repeated whitespace.
  • Allows multiple skill markers while deduplicating repeated skill execution by exact source identity.
  • Keeps /goal and ACP commands standalone; /run remains reserved and hidden.
  • Renders sent and restored skill markers through assistant-ui directives backed by transcript metadata.
  • Refreshes the Web catalog on session command revision events.

Runtime and public surfaces

  • Adds one daemon-owned command catalog and parser shared by session admission, Web, HTTP, UDS, CLI, and native tools.
  • Projects only commands effective for the concrete session, including enabled global/workspace/agent skills, enabled extension resources, and current ACP advertisements.
  • Persists source-qualified SkillInvocationRef values and UTF-16 authored offsets through admission, busy-input queueing, replay, transcript storage, and UI projection.
  • Revalidates queued references against the exact source before dispatch.
  • Injects verified full skill instructions into the same ACP turn while preserving authored history; limits are 24 KB per skill and 64 KB per turn.
  • Adds GET /api/workspaces/{workspace_id}/sessions/{session_id}/commands, compozy session commands, compozy__command_list, and exact-source compozy__skill_view behavior.
  • Emits session-scoped command revision SSE frames and invalidates only the matching Web cache key.
  • Adds append-only migration 00053 and regenerated SQLC, OpenAPI, CLI reference, and TypeScript contracts.

Skill lifecycle semantics

The effective catalog respects:

  • global versus workspace scope;
  • agent activation and disabled lists;
  • global/workspace runtime disable overlays;
  • enabled and disabled extension resources;
  • marketplace and extension source qualification;
  • workspace and session ownership;
  • live resource revisions.

Slash activation is limited to human operator ingress. Hooks may remove admitted invocations but cannot add new ones, and internal/agent-generated prompts do not activate slash text.

Validation

  • make gate-full: pass on fingerprint 3f645d11291888f60fe730323e0a262373a3118f.
  • Bun: 535 files / 4,325 tests passed; lint, typecheck, and Web build passed.
  • Go: 20,640 tests passed, 2 intentional skips; lint, build, race-sensitive focused tests, and package boundaries passed.
  • React Doctor: 100/100.
  • CodeRabbit: all 16 actionable findings fixed; every inline thread answered and resolved; final review has no open thread.

QA evidence

Two fresh isolated daemon/Web labs cover catalog parity, wrong-workspace fencing, native assistant-ui insertion, adjacent repeated skills, exact Unicode/spacing preservation, live provider injection, cold reload, and the 320 px menu.

  • Durable report: docs/qa/reports/2026-08-05-session-slash-commands.md
  • Reviewed-head audit: PASS, zero blockers and zero warnings
  • Teardown: clean: true, zero survivors

Compozy Impact Audit

  • Native tools: adds compozy__command_list, its sessions toolset descriptor, schemas, dispatch binding, availability coverage, catalog snapshot, and presentation metadata. Exact command IDs can drive compozy__skill_view; no existing tool ID changed.
  • Extensibility and hooks: the canonical effective registry supplies extension/resource authority, marketplace provenance, agent activation, disabled overlays, and ACP advertisements. Prompt hooks can only reconcile already-admitted refs. No config key or hook family was added.
  • Workspace data isolation: catalogs and invocation refs are workspace/session scoped across HTTP, UDS, CLI, native resolution, queues, transcripts, SSE, and Web caches. Wrong-workspace reads return 404 without catalog data.
  • Official Compozy skill: updates skills/compozy/references/native-tools.md and tools-and-skills.md for command discovery and exact-source skill behavior.

Spec and references

Implements the accepted follow-up plan for .compozy/tasks/_archived/20260712-004812-d49e8375-goal, using the explicit Synara and Hermes reference paths captured in the archived analysis. The archived spec remains historical and was not modified.

Summary by CodeRabbit

  • New Features
    • Added a searchable session command menu for built-in, agent, and skill commands.
    • Added CLI support for listing available session commands.
    • Added command catalog access through HTTP and Unix socket APIs.
    • Added command-listing tools and support for resolving skills by command ID.
    • Added slash-command parsing, validation, and skill content expansion.
  • Bug Fixes
    • Preserved verified command metadata through queued, replayed, streamed, and displayed messages.
    • Session command catalogs now refresh when available commands change.
    • Improved composer draft synchronization and command-menu behavior.

@vercel

vercel Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
compozy-site Ready Ready Preview Aug 5, 2026 3:15pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This change adds unified session command catalogs, slash-command parsing and skill expansion, durable invocation metadata, command-list APIs and tools, stream invalidation events, CLI support, and composer rendering for admitted skill invocations.

Changes

Session command catalog and transport

Layer / File(s) Summary
Catalog construction and APIs
internal/command/*, internal/skills/*, internal/session/command_catalog.go, internal/api/*
Builds deterministic catalogs from built-ins, agents, and scoped skills. Exposes catalog revisions through HTTP, UDS, and session stream events.
Prompt and persistence flow
internal/session/*, internal/store/*
Parses, validates, reconciles, expands, queues, fingerprints, and persists skill invocations.
CLI, tools, transcript, and web UI
internal/cli/*, internal/tools/*, internal/transcript/*, web/src/*
Adds command listing to CLI and native tools. Preserves invocation metadata in transcripts. Adds command menus, directive rendering, query refresh, and stream-driven invalidation.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Composer
  participant SessionAPI
  participant SessionManager
  participant CommandCatalog
  participant TranscriptStream
  Composer->>SessionAPI: Request session command catalog
  SessionAPI->>SessionManager: Resolve session commands
  SessionManager->>CommandCatalog: Build catalog and revision
  CommandCatalog-->>SessionManager: Return commands and revision
  SessionManager-->>SessionAPI: Return path-free command projection
  SessionAPI-->>Composer: Render command menu
  TranscriptStream-->>Composer: Emit session_commands_changed
  Composer->>SessionAPI: Refresh command catalog
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: adding session-aware slash skill commands.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch session-composer

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

React Doctor found 3 new issues in 2 files · 2 errors & 1 warning · score 84 / 100 (Needs work) · 0 fixed · vs main

Errors

1 warning

src/components/assistant-ui/__tests__/session-thread.test.tsx

  • ⚠️ L605 React Compiler can't optimize this set-state-in-effect

Reviewed by React Doctor for commit 81bec87. See inline comments for fixes.

@pedronauck

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

🧹 Nitpick comments (13)
web/src/components/assistant-ui/session-composer.tsx (1)

158-159: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Replace the arbitrary type and spacing values with design tokens.

gap-[7px], pt-[11px], text-[10.5px], and text-[9px] are invented design values. The coding guidelines require type and spacing values to come from packages/ui/src/tokens.css and DESIGN.md.

If these values are unchanged code that this diff only re-indented under the new popover root, treat this as a follow-up rather than a blocker for this PR.

Also applies to: 191-193

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/assistant-ui/session-composer.tsx` around lines 158 - 159,
Replace the arbitrary Tailwind spacing and typography values in the session
composer, including gap-[7px], pt-[11px], text-[10.5px], and text-[9px], with
the closest approved design tokens defined in tokens.css and DESIGN.md; preserve
the existing layout and styling behavior.

Source: Coding guidelines

web/src/components/assistant-ui/session-composer-command-menu.tsx (1)

224-226: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reuse COMMAND_TRIGGER_CHARACTER for the char prop.

Line 40 defines COMMAND_TRIGGER_CHARACTER = "/" and Line 146 uses it for offset math. Line 225 hardcodes "/" again. If the trigger character changes, the two values can diverge.

♻️ Proposed change
-      char="/"
+      char={COMMAND_TRIGGER_CHARACTER}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/assistant-ui/session-composer-command-menu.tsx` around
lines 224 - 226, Update the char prop on
ComposerPrimitive.Unstable_TriggerPopover to use the existing
COMMAND_TRIGGER_CHARACTER constant instead of a hardcoded slash, keeping the
trigger configuration and offset calculations consistent.
internal/transcript/ui_input_messages.go (1)

36-46: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Log the marshal failure instead of dropping metadata silently.

If json.Marshal fails, the function returns nil and the message loses its turn ID, message ID, goal, and skill invocations. No signal reaches an operator. The struct holds only strings, ints, and *acp.GoalPromptMeta, so failure is unlikely, but the guidelines require handling every error or documenting a justification.

Add a slog warning or a short comment that states why the error is safe to ignore.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/transcript/ui_input_messages.go` around lines 36 - 46, Update the
JSON marshaling error branch in the surrounding metadata helper to log a concise
slog warning before returning nil, preserving the existing return behavior while
exposing marshal failures to operators.

Source: Coding guidelines

web/src/components/assistant-ui/__tests__/session-thread.test.tsx (1)

1516-1522: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Assert menu closure by test ID instead of by label text.

screen.queryByText("Frontend QA") matches any node with that exact text. The assertion passes for the wrong reason if the label moves outside the menu, and it fails if the inserted token ever renders the label elsewhere. Query the menu container instead.

♻️ Proposed change
-    expect(screen.queryByText("Frontend QA")).not.toBeInTheDocument();
+    await waitFor(() => {
+      expect(screen.queryByTestId("composer-command-menu")).not.toBeInTheDocument();
+    });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/assistant-ui/__tests__/session-thread.test.tsx` around
lines 1516 - 1522, Update the menu-closure assertion in the session thread test
near the existing textarea and draft expectations to query the menu container by
its test ID, asserting that this container is absent from the document instead
of relying on the “Frontend QA” label text.
internal/command/slug.go (1)

16-27: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Simplify the always-true separator condition.

The allowed branch ends with continue. Execution reaches line 21 only when isAllowed is false. The condition unicode.IsSpace(character) || character > unicode.MaxASCII || !isAllowed is therefore always true, and the unicode import exists only for it. The current form suggests three distinct cases that do not exist.

♻️ Proposed simplification
-		if unicode.IsSpace(character) || character > unicode.MaxASCII || !isAllowed {
-			if builder.Len() > 0 && !wroteSeparator {
-				builder.WriteByte('-')
-				wroteSeparator = true
-			}
-		}
+		if builder.Len() > 0 && !wroteSeparator {
+			builder.WriteByte('-')
+			wroteSeparator = true
+		}

Remove the now-unused unicode import.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/command/slug.go` around lines 16 - 27, In the slug-building loop,
simplify the condition guarding separator insertion after the isAllowed branch
continues, since this path only handles disallowed characters. Remove the
redundant condition and delete the now-unused unicode import, while preserving
the existing separator behavior.
internal/command/command_test.go (1)

16-90: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a case for an unqualified skill that collides with a claimed bare name.

BuildCatalog drops an unqualified skill when its bare name is already claimed by a builtin or an agent (internal/command/catalog.go lines 66-72). That precedence branch has no coverage. The current cases only prove builtin-over-agent precedence and qualified-skill duplicates.

A regression that removed the continue would produce a second /goal or /review descriptor and no existing case would fail.

💚 Proposed added case
+	t.Run("Should drop an unqualified skill that collides with a claimed bare name", func(t *testing.T) {
+		t.Parallel()
+		catalog, err := commandpkg.BuildCatalog(
+			commandpkg.DefaultBuiltins(),
+			[]commandpkg.AgentSpec{{Name: "review", SourceID: "codex"}},
+			[]commandpkg.SkillSpec{{
+				Name: "review", Available: true,
+				Source: commandpkg.Source{Kind: "workspace", Scope: "workspace"},
+			}},
+		)
+		if err != nil {
+			t.Fatalf("BuildCatalog() error = %v", err)
+		}
+		got := make([]string, 0, len(catalog.Commands))
+		for _, descriptor := range catalog.Commands {
+			got = append(got, descriptor.CanonicalToken)
+		}
+		want := []string{"/goal", "/review"}
+		if strings.Join(got, ",") != strings.Join(want, ",") {
+			t.Fatalf("BuildCatalog() tokens = %#v, want %#v", got, want)
+		}
+		if catalog.Commands[1].Lane != commandpkg.LaneAgent {
+			t.Fatalf("/review lane = %q, want the agent to win the bare name", catalog.Commands[1].Lane)
+		}
+	})
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/command/command_test.go` around lines 16 - 90, Add a BuildCatalog
test case covering an unqualified available skill whose bare name matches an
existing builtin or agent, such as “goal” or “review”; assert the catalog
succeeds with only the claimed command descriptor and does not include a
duplicate skill token. Place the coverage alongside the existing ordering and
collision cases, preserving builtin/agent precedence.

Source: Path instructions

internal/session/manager_prompt_contract_test.go (1)

1112-1191: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

New test functions assert inline instead of using Should … subtests. Both new tests place all assertions directly in the test function body. The repository test conventions require t.Run("Should …") for every test case. The practical cost is that the first t.Fatalf aborts the whole function, so later independent assertions never run and never report.

  • internal/session/manager_prompt_contract_test.go#L1112-L1191: split the four scenarios (operator expansion, authored-text preservation, untrusted-caller rejection, internal-prompt literal handling) into separate t.Run("Should …") blocks, so a failure in the first scenario does not hide the untrusted-ingress checks at lines 1148-1158. Also replace the err == nil check at line 1155 with errors.Is against the sentinel that validateCommandIngress returns.
  • internal/api/core/session_stream_internal_test.go#L617-L667: wrap the body in t.Run("Should emit a revision-only wake frame when the catalog changes", …), and add a second subtest asserting that an unchanged catalog stays silent and returns the same revision.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/session/manager_prompt_contract_test.go` around lines 1112 - 1191,
The test in internal/session/manager_prompt_contract_test.go lines 1112-1191
needs four separate t.Run("Should …") subtests for operator
expansion/authored-text preservation, untrusted-caller rejection, and
internal-prompt literal handling; use errors.Is with the validateCommandIngress
sentinel for rejection checks. In
internal/api/core/session_stream_internal_test.go lines 617-667, wrap the
existing revision-only wake-frame assertions in the named subtest and add a
second subtest verifying unchanged catalogs emit no frame and retain the same
revision.

Sources: Coding guidelines, Path instructions

internal/cli/client_test.go (1)

2408-2412: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use a named subtest for the command-catalog assertion.

Place this check in t.Run("Should return the session command catalog", ...). This gives the command-catalog invariant a stable failure name.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/client_test.go` around lines 2408 - 2412, Wrap the
ListSessionCommands assertion in a named subtest using t.Run("Should return the
session command catalog", ...), keeping the existing command-catalog validation
and failure behavior unchanged.

Source: Path instructions

internal/cli/client_session_commands.go (1)

15-21: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Wrap CLI errors with operation context.

Both paths return raw errors. Add operation-specific context with %w so callers can identify the failed CLI step while preserving errors.Is and errors.As.

  • internal/cli/client_session_commands.go#L15-L21: wrap the sessionScopedPath and doJSON errors.
  • internal/cli/session_commands.go#L22-L32: wrap the clientFromDeps and ListSessionCommands errors.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/client_session_commands.go` around lines 15 - 21, Wrap errors
from sessionScopedPath and doJSON in
internal/cli/client_session_commands.go#L15-L21 with operation-specific context
using %w, preserving errors.Is and errors.As. Also wrap errors from
clientFromDeps and ListSessionCommands in
internal/cli/session_commands.go#L22-L32 with context identifying each failed
CLI operation.

Source: Coding guidelines

internal/daemon/native_tool_registry_skills.go (1)

142-149: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Build the skill payload once.

Line 143 calls core.SkillPayloadFromSkill(skill), and Line 148 replaces that value when a command ID is present. Select the payload before building the map.

♻️ Proposed refactor
+	commandID := strings.TrimSpace(input.CommandID)
+	skillPayload := any(core.SkillPayloadFromSkill(skill))
+	if commandID != "" {
+		skillPayload = sourceQualifiedSkillViewPayload(skill)
+	}
 	payload := map[string]any{
-		"skill":   core.SkillPayloadFromSkill(skill),
+		"skill":   skillPayload,
 		"content": content,
 	}
-	if commandID := strings.TrimSpace(input.CommandID); commandID != "" {
+	if commandID != "" {
 		payload["command_id"] = commandID
-		payload["skill"] = sourceQualifiedSkillViewPayload(skill)
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/native_tool_registry_skills.go` around lines 142 - 149, In
the payload construction flow, select the skill payload once before creating the
map: use core.SkillPayloadFromSkill(skill) by default and
sourceQualifiedSkillViewPayload(skill) when CommandID is non-empty. Then build
the map with the selected payload and only add command_id conditionally,
avoiding the current assignment and replacement in native tool registration.
internal/api/core/session_stream_transcript.go (1)

136-143: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consolidate the command-refresh cadence into one path and one constant.

Three call sites now hardcode time.Second. Both streaming loops own a commandRefresh ticker, and refreshTranscriptStream repeats the same elapsed-time gate. Because the ticker updates state.commandCheckedAt, the gate inside refreshTranscriptStream almost never fires, so the logic is duplicated without effect.

Define a named interval constant next to sessionStreamKeepAliveInterval, and keep the refresh in a single place.

Also applies to: 231-232, 283-284

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/core/session_stream_transcript.go` around lines 136 - 143,
Consolidate command-refresh timing around a single named interval constant
defined beside sessionStreamKeepAliveInterval. Replace the hardcoded time.Second
values at the streaming-loop ticker sites and in refreshTranscriptStream, then
remove the redundant elapsed-time gate from refreshTranscriptStream so command
refresh is performed only by the existing commandRefresh ticker path.
internal/session/command_parser.go (1)

21-28: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Consider skipping catalog resolution when the message contains no command token.

preparePromptSkillInvocations resolves the full command catalog for every non-goal prompt. If catalog resolution fails, the prompt fails, even when the message contains no slash token at all. Catalog resolution depends on workspace resolution and the skills registry, so an unrelated registry error blocks ordinary prompts.

A cheap pre-check for a slash token at a whitespace boundary would keep plain prompts working when the catalog is unavailable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/session/command_parser.go` around lines 21 - 28, Update
preparePromptSkillInvocations to detect a slash command token at a whitespace
boundary before calling CommandCatalog; return no invocations immediately when
the authored message contains no such token. Preserve the existing catalog
resolution and ParseSkillInvocations flow for messages that may contain command
tokens.
internal/session/manager_prompt_submit.go (1)

218-233: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a test for the composed expansion and augmentation order.

promptDispatchMessage now expands skill invocations before augmentation, so the augmenter receives the expanded prompt instead of the authored prompt. The final dispatched text becomes the augmenter block, then the invoked-skills block, then the authored text.

The existing tests cover each stage alone. internal/daemon/prompt_skills_test.go asserts the augmenter preserves the trailing prompt, and the new command service test asserts Expand preserves the trailing authored text. Neither test covers the two stages together.

Add a case to the canonical prompt dispatch suite that runs both stages and asserts the final ordering and the preserved authored suffix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/session/manager_prompt_submit.go` around lines 218 - 233, Add an
integration case to the canonical prompt dispatch test suite that configures
both skill expansion and input augmentation, then assert the augmenter receives
expanded content and the final dispatched text orders the augmenter block before
the invoked-skills block and authored prompt suffix. Preserve the existing
standalone stage tests and verify the authored trailing text remains intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/api/core/handlers_test.go`:
- Around line 62-133: Wrap the test body in internal/api/core/handlers_test.go
lines 62-133 in a t.Run subtest named “Should return a workspace-fenced command
catalog,” preserving all existing setup and assertions inside it. Also wrap the
CLI output test body in internal/cli/session_test.go lines 1253-1287 in a t.Run
subtest named “Should render the unified command catalog,” preserving its
current behavior.

In `@internal/api/core/session_stream_transcript.go`:
- Around line 245-254: Update the command-refresh error handling in the shown
transcript stream flow, plus pushAndStreamSessionTranscript and
refreshTranscriptStream, so writeSessionCommandsChanged failures are logged
without terminating a healthy transcript stream and state.commandRevision
remains unchanged. Apply the same nonfatal or bounded-retry behavior
consistently across all three paths.

In `@internal/daemon/native_tool_session_calls.go`:
- Around line 72-79: Replace untyped failures in
internal/daemon/native_tool_session_calls.go lines 72-79 and
internal/daemon/native_tool_registry_skills.go lines 175-227 with the package’s
typed tool errors: in the session manager path, use ErrToolUnavailable with
ReasonDependencyMissing and wrap CommandCatalog failures with tool context; in
the registry skills path, use ErrToolInvalidInput with ReasonSchemaInvalid for
exclusive-argument and missing-session-scope validation, ErrToolUnavailable with
ReasonDependencyMissing for missing agent or registry dependencies, and
ErrToolNotFound for unknown command_id values.

In `@internal/daemon/prompt_skills_test.go`:
- Around line 282-283: Wrap the assertion body of
TestSessionCommandServiceProjectsAndRevalidatesExactSkillSources in a t.Run
subtest named with the required “Should …” convention. Move the existing test
logic inside that subtest, retain the test’s parallel configuration, and close
the subtest before the outer test function ends.

In `@internal/session/manager_hooks_events_test.go`:
- Around line 71-72: Wrap the scenario in
TestPromptInputHookReconcilesSkillInvocations with a named t.Run subtest
beginning with “Should”, and move t.Parallel() into that subtest. Keep the test
behavior unchanged and follow the required pattern for this test case.

In `@internal/session/manager_managed_input_submit.go`:
- Around line 97-133: Keep stateOwned true through dispatchTurnStart and until
submitPromptInReservedSlot completes successfully, so the deferred cleanup
remains responsible for failed reservation failover. Move stateOwned = false to
immediately after the successful submitPromptInReservedSlot call, preserving
cleanup of currentTurnID, currentPromptMessage, currentPromptMeta, and
currentSkillInvocations on any earlier failure.

In `@internal/session/manager_prompt_contract_test.go`:
- Around line 1210-1219: Update promptCommandServiceStub.Expand to append
invocations to s.expanded without replacing previously recorded entries, so
repeated expansions accumulate. Add and use an expandCalls counter in the stub,
increment it on every Expand call, and assert service.expandCalls equals one
alongside the existing invocation assertion.

In `@internal/skills/registry_command.go`:
- Around line 73-80: Update CommandCandidatesForAgentDefSession around
externalSnapshot and applyDisabledSkillList to use the same effective disabled
list as ForAgentDefSession, including registry- and workspace-level entries,
after merging the resource snapshot and before projectAgentSkillActivation. Do
not limit this step to agent.Skills.Disabled, so external candidates retain
their effective disabled state.

In `@internal/skills/registry_test.go`:
- Around line 2027-2133: Wrap the body of
TestRegistryCommandCandidatesRespectScopeSourceAndActivation in a named t.Run
subtest using the required “Should ...” naming convention. Move t.Parallel()
inside that subtest, preserving the existing test setup and assertions
unchanged.

In `@internal/tools/builtin/skills.go`:
- Around line 85-89: Update the root schema containing the name and command_id
properties to add a oneOf constraint requiring exactly one selector: name or
command_id. Preserve both property definitions and ensure requests with neither
or both fields are rejected.

In `@web/src/components/assistant-ui/session-composer-command-menu.tsx`:
- Around line 170-171: Remove the render-time catalogRef assignment and ref
usage in the adapter definition. Update the categories, categoryItems, and
search closures to read catalog directly; preserve their existing scope-state
behavior. Only memoize the adapter with catalog and scope if
Unstable_TriggerPopover requires stable identity.
- Around line 143-149: Update syncScope in session-composer-command.tsx to guard
triggerOffset before calling input.value.slice; when the offset is negative,
handle the scope consistently as having no valid trigger prefix and return
without deriving scope from unrelated text. Preserve the existing prefix-based
standalone/inline behavior for non-negative offsets.

In `@web/src/components/assistant-ui/session-directive-text.tsx`:
- Line 80: Update the DirectiveToken key in the directive-rendering loop to use
the directive’s offset, ensuring separate occurrences of the same command
receive distinct keys; preserve the existing directive and filtering behavior.
- Around line 23-35: Fix MessageTextFragment so whitespace-only text is emitted
exactly once instead of being rendered as both leading and trailing whitespace;
preserve the existing separation of surrounding whitespace and content for
non-whitespace fragments. Add a canonical session-thread.test.tsx case rendering
adjacent directives and assert that the rendered text exactly matches the
authored spacing.

In `@web/src/systems/session/hooks/session-stream-source.ts`:
- Around line 38-45: Update the EventSource setup in the session stream
initialization to register the recovery handler only once: keep either the
source.onerror assignment or the STREAM_ERROR_EVENT listener registration, and
remove the other so a single error event cannot trigger handleError twice.

---

Nitpick comments:
In `@internal/api/core/session_stream_transcript.go`:
- Around line 136-143: Consolidate command-refresh timing around a single named
interval constant defined beside sessionStreamKeepAliveInterval. Replace the
hardcoded time.Second values at the streaming-loop ticker sites and in
refreshTranscriptStream, then remove the redundant elapsed-time gate from
refreshTranscriptStream so command refresh is performed only by the existing
commandRefresh ticker path.

In `@internal/cli/client_session_commands.go`:
- Around line 15-21: Wrap errors from sessionScopedPath and doJSON in
internal/cli/client_session_commands.go#L15-L21 with operation-specific context
using %w, preserving errors.Is and errors.As. Also wrap errors from
clientFromDeps and ListSessionCommands in
internal/cli/session_commands.go#L22-L32 with context identifying each failed
CLI operation.

In `@internal/cli/client_test.go`:
- Around line 2408-2412: Wrap the ListSessionCommands assertion in a named
subtest using t.Run("Should return the session command catalog", ...), keeping
the existing command-catalog validation and failure behavior unchanged.

In `@internal/command/command_test.go`:
- Around line 16-90: Add a BuildCatalog test case covering an unqualified
available skill whose bare name matches an existing builtin or agent, such as
“goal” or “review”; assert the catalog succeeds with only the claimed command
descriptor and does not include a duplicate skill token. Place the coverage
alongside the existing ordering and collision cases, preserving builtin/agent
precedence.

In `@internal/command/slug.go`:
- Around line 16-27: In the slug-building loop, simplify the condition guarding
separator insertion after the isAllowed branch continues, since this path only
handles disallowed characters. Remove the redundant condition and delete the
now-unused unicode import, while preserving the existing separator behavior.

In `@internal/daemon/native_tool_registry_skills.go`:
- Around line 142-149: In the payload construction flow, select the skill
payload once before creating the map: use core.SkillPayloadFromSkill(skill) by
default and sourceQualifiedSkillViewPayload(skill) when CommandID is non-empty.
Then build the map with the selected payload and only add command_id
conditionally, avoiding the current assignment and replacement in native tool
registration.

In `@internal/session/command_parser.go`:
- Around line 21-28: Update preparePromptSkillInvocations to detect a slash
command token at a whitespace boundary before calling CommandCatalog; return no
invocations immediately when the authored message contains no such token.
Preserve the existing catalog resolution and ParseSkillInvocations flow for
messages that may contain command tokens.

In `@internal/session/manager_prompt_contract_test.go`:
- Around line 1112-1191: The test in
internal/session/manager_prompt_contract_test.go lines 1112-1191 needs four
separate t.Run("Should …") subtests for operator expansion/authored-text
preservation, untrusted-caller rejection, and internal-prompt literal handling;
use errors.Is with the validateCommandIngress sentinel for rejection checks. In
internal/api/core/session_stream_internal_test.go lines 617-667, wrap the
existing revision-only wake-frame assertions in the named subtest and add a
second subtest verifying unchanged catalogs emit no frame and retain the same
revision.

In `@internal/session/manager_prompt_submit.go`:
- Around line 218-233: Add an integration case to the canonical prompt dispatch
test suite that configures both skill expansion and input augmentation, then
assert the augmenter receives expanded content and the final dispatched text
orders the augmenter block before the invoked-skills block and authored prompt
suffix. Preserve the existing standalone stage tests and verify the authored
trailing text remains intact.

In `@internal/transcript/ui_input_messages.go`:
- Around line 36-46: Update the JSON marshaling error branch in the surrounding
metadata helper to log a concise slog warning before returning nil, preserving
the existing return behavior while exposing marshal failures to operators.

In `@web/src/components/assistant-ui/__tests__/session-thread.test.tsx`:
- Around line 1516-1522: Update the menu-closure assertion in the session thread
test near the existing textarea and draft expectations to query the menu
container by its test ID, asserting that this container is absent from the
document instead of relying on the “Frontend QA” label text.

In `@web/src/components/assistant-ui/session-composer-command-menu.tsx`:
- Around line 224-226: Update the char prop on
ComposerPrimitive.Unstable_TriggerPopover to use the existing
COMMAND_TRIGGER_CHARACTER constant instead of a hardcoded slash, keeping the
trigger configuration and offset calculations consistent.

In `@web/src/components/assistant-ui/session-composer.tsx`:
- Around line 158-159: Replace the arbitrary Tailwind spacing and typography
values in the session composer, including gap-[7px], pt-[11px], text-[10.5px],
and text-[9px], with the closest approved design tokens defined in tokens.css
and DESIGN.md; preserve the existing layout and styling behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: af916c73-97e6-4e6f-a11a-f33f9c6fe529

📥 Commits

Reviewing files that changed from the base of the PR and between 7e630c6 and a1d6877.

⛔ Files ignored due to path filters (10)
  • internal/store/globaldb/schema/migrations/atlas.sum is excluded by !**/*.sum, !**/*.sum
  • internal/tools/builtin/testdata/native-tool-catalog.json is excluded by !**/*.json
  • openapi/compozy.json is excluded by !**/*.json
  • packages/site/content/docs/cli/session/commands.mdx is excluded by !**/*.mdx
  • packages/site/content/docs/cli/session/index.mdx is excluded by !**/*.mdx
  • packages/site/content/docs/cli/session/meta.json is excluded by !**/*.json
  • skills/compozy/references/native-tools.md is excluded by !**/*.md
  • skills/compozy/references/tools-and-skills.md is excluded by !**/*.md
  • web/src/generated/compozy-openapi.d.ts is excluded by !**/generated/**, !**/generated/**, !**/*.d.ts
  • web/src/systems/session/components/assistant-ui/stories/session-thread.stories.tsx is excluded by !**/*.stories.tsx
📒 Files selected for processing (132)
  • internal/acp/agent_event_tool.go
  • internal/api/contract/prompt.go
  • internal/api/contract/session_commands.go
  • internal/api/contract/session_transcript.go
  • internal/api/core/handler_edge_cases_test.go
  • internal/api/core/handlers_test.go
  • internal/api/core/session_commands.go
  • internal/api/core/session_input.go
  • internal/api/core/session_prompt_dispatch.go
  • internal/api/core/session_stream_frames.go
  • internal/api/core/session_stream_internal_test.go
  • internal/api/core/session_stream_transcript.go
  • internal/api/core/test_helpers_test.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/session_routes.go
  • internal/api/spec/registry_session_runtime.go
  • internal/api/spec/registry_sessions.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/session_routes.go
  • internal/api/udsapi/transport_parity_integration_test.go
  • internal/cli/automation.go
  • internal/cli/client_session_commands.go
  • internal/cli/client_session_types.go
  • internal/cli/client_test.go
  • internal/cli/helpers_test.go
  • internal/cli/resource.go
  • internal/cli/roles.go
  • internal/cli/session_command.go
  • internal/cli/session_commands.go
  • internal/cli/session_test.go
  • internal/cli/tool_operator_output.go
  • internal/command/catalog.go
  • internal/command/command_test.go
  • internal/command/instructions.go
  • internal/command/parser.go
  • internal/command/slug.go
  • internal/command/types.go
  • internal/daemon/boot.go
  • internal/daemon/hooks_declaration_providers.go
  • internal/daemon/native_hook_helpers.go
  • internal/daemon/native_tool_binding_groups.go
  • internal/daemon/native_tool_network_session_input.go
  • internal/daemon/native_tool_registry_skills.go
  • internal/daemon/native_tool_session_calls.go
  • internal/daemon/native_tools_test.go
  • internal/daemon/prompt_skills_test.go
  • internal/daemon/session_commands.go
  • internal/daemon/session_manager_deps.go
  • internal/daemon/session_manager_factory.go
  • internal/session/command_catalog.go
  • internal/session/command_parser.go
  • internal/session/inputqueue/mutation.go
  • internal/session/inputqueue/queue.go
  • internal/session/interfaces.go
  • internal/session/manager_busy_input.go
  • internal/session/manager_busy_input_test.go
  • internal/session/manager_busy_input_types.go
  • internal/session/manager_goal_commands.go
  • internal/session/manager_hooks_events_test.go
  • internal/session/manager_input_dispatch.go
  • internal/session/manager_managed_input_submit.go
  • internal/session/manager_options.go
  • internal/session/manager_pending_input.go
  • internal/session/manager_prompt_admission_identity.go
  • internal/session/manager_prompt_contract_test.go
  • internal/session/manager_prompt_input_event.go
  • internal/session/manager_prompt_pump.go
  • internal/session/manager_prompt_submit.go
  • internal/session/manager_types.go
  • internal/session/session.go
  • internal/session/session_skill_invocations.go
  • internal/skills/registry.go
  • internal/skills/registry_command.go
  • internal/skills/registry_discovery.go
  • internal/skills/registry_source.go
  • internal/skills/registry_test.go
  • internal/skills/types.go
  • internal/store/globaldb/global_db_session_input_queue.go
  • internal/store/globaldb/global_db_session_input_queue_mutation.go
  • internal/store/globaldb/global_db_session_input_queue_scan.go
  • internal/store/globaldb/global_db_session_input_queue_test.go
  • internal/store/globaldb/global_db_session_prompt_admission.go
  • internal/store/globaldb/global_db_session_prompt_admission_queue.go
  • internal/store/globaldb/global_db_session_prompt_admission_scan.go
  • internal/store/globaldb/queries/session_input.sql
  • internal/store/globaldb/queries/session_prompt_admission.sql
  • internal/store/globaldb/schema/definitions/20_sessions.sql
  • internal/store/globaldb/schema/migrations/00053_schema.sql
  • internal/store/globaldb/sqlcgen/models.go
  • internal/store/globaldb/sqlcgen/session_input.sql.go
  • internal/store/globaldb/sqlcgen/session_prompt_admission.sql.go
  • internal/store/session_input_queue.go
  • internal/store/session_prompt_admission.go
  • internal/toolmeta/native_entries.go
  • internal/toolmeta/registry_test.go
  • internal/tools/builtin/builtin_test.go
  • internal/tools/builtin/session_commands.go
  • internal/tools/builtin/sessions.go
  • internal/tools/builtin/skills.go
  • internal/tools/builtin_ids.go
  • internal/tools/dispatch_test.go
  • internal/tools/result_limit.go
  • internal/transcript/agent_event_codec.go
  • internal/transcript/canonical_payload.go
  • internal/transcript/transcript_codec_contract_test.go
  • internal/transcript/transcript_ui_projection_test.go
  • internal/transcript/ui_input_messages.go
  • web/src/components/assistant-ui/__tests__/session-thread.test.tsx
  • web/src/components/assistant-ui/session-composer-command-menu.tsx
  • web/src/components/assistant-ui/session-composer.tsx
  • web/src/components/assistant-ui/session-directive-registry.ts
  • web/src/components/assistant-ui/session-directive-text.tsx
  • web/src/components/assistant-ui/session-thread.tsx
  • web/src/components/assistant-ui/session-user-message.tsx
  • web/src/integrations/tanstack-query/reconcile-installed-extension.ts
  • web/src/systems/marketplace/hooks/use-marketplace-actions.ts
  • web/src/systems/os/apps/session/session-window-content.tsx
  • web/src/systems/os/apps/session/use-session-window-controller.tsx
  • web/src/systems/session/adapters/__tests__/session-api.test.ts
  • web/src/systems/session/adapters/session-api.ts
  • web/src/systems/session/adapters/session-command-api.ts
  • web/src/systems/session/hooks/__tests__/use-session-commands.test.ts
  • web/src/systems/session/hooks/__tests__/use-session-live-tail.test.tsx
  • web/src/systems/session/hooks/session-stream-source.ts
  • web/src/systems/session/hooks/use-session-commands.ts
  • web/src/systems/session/hooks/use-session-live-tail.ts
  • web/src/systems/session/index.ts
  • web/src/systems/session/lib/__tests__/query-options.test.ts
  • web/src/systems/session/lib/query-keys.ts
  • web/src/systems/session/lib/query-options.ts
  • web/src/systems/session/types.ts
  • web/src/systems/skill/hooks/use-skill-actions.ts

Comment thread internal/api/core/handlers_test.go
Comment thread internal/api/core/session_stream_transcript.go
Comment thread internal/daemon/native_tool_session_calls.go
Comment thread internal/daemon/prompt_skills_test.go
Comment thread internal/session/manager_hooks_events_test.go
Comment thread web/src/components/assistant-ui/session-composer-command-menu.tsx Outdated
Comment thread web/src/components/assistant-ui/session-composer-command-menu.tsx Outdated
Comment thread web/src/components/assistant-ui/session-directive-text.tsx
Comment thread web/src/components/assistant-ui/session-directive-text.tsx Outdated
Comment thread web/src/systems/session/hooks/session-stream-source.ts Outdated
@pedronauck

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/daemon/native_tools_test.go (1)

1635-1635: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use the required Should subtest name.

The new command_list case runs as compozy__command_list because the loop uses t.Run(tc.id.String(), ...). Name each generated case with a Should ... prefix.

As per coding guidelines and path instructions, **/*_test.go requires t.Run("Should...") for all test cases.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/native_tools_test.go` at line 1635, Update the test case
naming in the loop that calls t.Run(tc.id.String(), ...) so each generated
subtest uses a “Should ...” prefix, including the command_list case currently
named from tc.id.String(). Keep the existing table-driven structure and adjust
only the subtest name generation in the native_tools_test.go test helper.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/api/core/session_stream_internal_test.go`:
- Around line 704-724: Extend the session stream test around
writeSessionCommandsChanged to cover an unchanged nonempty revision by invoking
it again with second.Revision while manager.catalog stays unchanged. Use the
existing writer, revision, and second.Revision symbols in the test to verify the
call does not emit a new session_commands_changed frame and preserves the
current revision when the catalog has not changed.

---

Outside diff comments:
In `@internal/daemon/native_tools_test.go`:
- Line 1635: Update the test case naming in the loop that calls
t.Run(tc.id.String(), ...) so each generated subtest uses a “Should ...” prefix,
including the command_list case currently named from tc.id.String(). Keep the
existing table-driven structure and adjust only the subtest name generation in
the native_tools_test.go test helper.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 286f36d0-80a9-4fed-bc4d-52e22dcdf025

📥 Commits

Reviewing files that changed from the base of the PR and between a1d6877 and acbbb25.

⛔ Files ignored due to path filters (1)
  • internal/tools/builtin/testdata/native-tool-catalog.json is excluded by !**/*.json
📒 Files selected for processing (23)
  • internal/api/core/handlers_test.go
  • internal/api/core/session_stream_frames.go
  • internal/api/core/session_stream_internal_test.go
  • internal/cli/session_test.go
  • internal/daemon/native_tool_command_errors.go
  • internal/daemon/native_tool_registry_skills.go
  • internal/daemon/native_tool_session_calls.go
  • internal/daemon/native_tools_test.go
  • internal/daemon/prompt_skills_test.go
  • internal/session/manager_hooks_events_test.go
  • internal/session/manager_managed_input_submit.go
  • internal/session/manager_prompt_contract_test.go
  • internal/skills/registry_command.go
  • internal/skills/registry_test.go
  • internal/tools/builtin/skills.go
  • web/src/components/assistant-ui/__tests__/session-thread.test.tsx
  • web/src/components/assistant-ui/hooks/use-session-composer-state.ts
  • web/src/components/assistant-ui/session-composer-command-menu.tsx
  • web/src/components/assistant-ui/session-composer.tsx
  • web/src/components/assistant-ui/session-directive-text.tsx
  • web/src/systems/session/hooks/__tests__/use-session-live-tail.test.tsx
  • web/src/systems/session/hooks/session-stream-source.ts
  • web/src/systems/session/hooks/use-session-live-tail.ts
💤 Files with no reviewable changes (2)
  • web/src/systems/session/hooks/use-session-live-tail.ts
  • web/src/systems/session/hooks/session-stream-source.ts
🚧 Files skipped from review as they are similar to previous changes (14)
  • internal/api/core/session_stream_frames.go
  • internal/daemon/native_tool_registry_skills.go
  • internal/cli/session_test.go
  • internal/session/manager_hooks_events_test.go
  • internal/api/core/handlers_test.go
  • internal/daemon/native_tool_session_calls.go
  • internal/tools/builtin/skills.go
  • internal/session/manager_prompt_contract_test.go
  • web/src/components/assistant-ui/tests/session-thread.test.tsx
  • web/src/components/assistant-ui/session-directive-text.tsx
  • web/src/systems/session/hooks/tests/use-session-live-tail.test.tsx
  • internal/session/manager_managed_input_submit.go
  • internal/daemon/prompt_skills_test.go
  • internal/skills/registry_command.go

Comment thread internal/api/core/session_stream_internal_test.go
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 5, 2026
@pedronauck

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@greptile-apps

greptile-apps Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

Too many files changed for review (172 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 5, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 5, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/daemon/daemon_automation_task_integration_test.go`:
- Around line 321-323: In TestDaemonE2EAutomationTaskBackedJobDelegatesTaskRun,
move the startedRun.SessionID assertion and the related session-type assertion
into separate focused t.Run subtests named with the “Should ...” pattern, while
preserving each assertion’s existing validation and failure message.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5c30e5bb-2274-4f3d-b487-aed2a15cc19e

📥 Commits

Reviewing files that changed from the base of the PR and between 505d0b1 and dc3a8fe.

📒 Files selected for processing (1)
  • internal/daemon/daemon_automation_task_integration_test.go

Comment thread internal/daemon/daemon_automation_task_integration_test.go
This was referenced Aug 27, 2026
This was referenced Sep 15, 2026
This was referenced Sep 27, 2026

This branch was successfully deployed

1 active deployment
Preview — 81bec87b Deployed Aug 5, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant