Skip to content

Fleet node structured logging: capabilities registered and actions invoked#1237

Merged
willwashburn merged 4 commits into
mainfrom
fleet-node-logging
Jul 13, 2026
Merged

Fleet node structured logging: capabilities registered and actions invoked#1237
willwashburn merged 4 commits into
mainfrom
fleet-node-logging

Conversation

@willwashburn

@willwashburn willwashburn commented Jul 8, 2026

Copy link
Copy Markdown
Member

What

A served fleet node (relay node up [--config node.ts]) now emits structured logs of what it does: each capability it registers and every action that hits it — invoked / completed / failed, each with a duration and structured fields ({ node, capability, kind, action, invocationId, ms, error }).

Turning it on:

relay node up --config ./scout.node.ts --log-file ./node.log   # write to a file
relay node up --config ./scout.node.ts --log-level debug        # include per-capability lines
relay node up --config ./scout.node.ts --log-json               # one JSON object per line

Levels: capability registration → debug, action invoked/completed → info, failures → warn. With no --log-* flag (and no --verbose) the node stays quiet, surfacing only warnings — unchanged from today.

How

  • @agent-relay/fleet (serve-node.ts) — a FleetLogger seam (shape-compatible with @agent-relay/utils createLogger) carries lifecycle and per-invocation events with a structured extra bag. serveNode/startServeNode accept logger?; the existing log/warn callbacks still work, adapted onto it. handleInvoke logs invoked → completed/failed with elapsed ms; registration logs each capability then the summary.
  • CLI (node up)--log-file / --log-level / --log-json map onto the AGENT_RELAY_LOG_* env the shared logger already reads; --verbose raises the floor to debug. When any is set, createLogger('fleet') is injected into the served node instead of the quiet warn-only callback.

The logger is injected (not imported by fleet), so @agent-relay/fleet stays dependency-free at its seam — a host can supply any sink (stdout, file, a JSON collector).

Verification

  • packages/fleet tests (13, +3 new) — assert per-capability, invoked/completed (with ms), and failed (warn + error) events flow through an injected logger against an in-process broker.
  • CLI + fleet typecheck clean; broker-lifecycle (21) and node/core command tests pass (2 pre-existing failures on origin/main, unrelated: a 5s node-delivery timeout and a SIGINT test).
  • End-to-end: injected createLogger('fleet') writes the exact events to a file in both text and --log-json form.

Follow-ups (separate)

🤖 Generated with Claude Code

Review in cubic

serveNode emits per-capability registration (debug) and per-invocation
events — invoked/completed/failed, each with a duration and structured
fields — through an injected FleetLogger whose shape matches
@agent-relay/utils createLogger. A FleetLogger seam replaces the plain
log/warn callbacks (which still work, adapted).

`relay node up` gains --log-file, --log-level, and --log-json, which set
the AGENT_RELAY_LOG_* env the shared logger reads and inject
createLogger('fleet') into the served node. Without a flag the node stays
quiet, surfacing only warnings, as before.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds structured logging controls for up and threads structured logging through fleet node serving. The CLI parses logging flags, maps them into environment variables, and the fleet runtime emits structured events for registration, invocation, completion, failures, and trigger reconciliation. Tests and documentation cover the flow.

Changes

Structured Logging Feature

Layer / File(s) Summary
CLI logging flags and options
packages/cli/src/cli/commands/core.ts
up gains logging fields and registers --log-file, --log-level, and --log-json, with case-insensitive parse-time validation for log levels.
Environment mapping and logger startup
packages/cli/src/cli/lib/broker-lifecycle.ts, packages/utils/src/logger.ts
Logging options are translated into AGENT_RELAY_LOG_* variables before startup, and unknown environment levels fall back to INFO.
Fleet logger contract and compatibility
packages/fleet/src/serve-node.ts
serveNode exports FleetLogger, accepts logger, adapts legacy callbacks, and resolves one logger for runtime operations.
Registration, action, and trigger logging
packages/fleet/src/serve-node.ts
Structured events cover capability registration, provider errors, action invocation/completion/failure, and trigger reconciliation errors.
Validation and documentation
packages/fleet/src/serve-node.test.ts, packages/fleet/README.md, CHANGELOG.md
Tests verify structured event levels and fields; documentation describes event shapes, CLI controls, defaults, and logger injection.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant UpCommand
  participant BrokerLifecycle
  participant FleetNode
  participant FleetLogger

  UpCommand->>BrokerLifecycle: parse logging options
  BrokerLifecycle->>FleetNode: apply environment and start serveNode
  FleetNode->>FleetLogger: log registration event
  FleetNode->>FleetLogger: log action invoked
  FleetNode->>FleetLogger: log action completed or failed
Loading

Possibly related PRs

  • AgentWorkforce/relay#1228: Extends the serveNode and ServeNodeOptions surfaces used by this structured logging implementation.

Suggested reviewers: khaliqgant

Poem

I’m a rabbit with ears up high,
Sniffing bright logs as they hop by.
JSON carrots, debug springs,
Fleet nodes hum with structured things. 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: fleet node structured logging for registered capabilities and invoked actions.
Description check ✅ Passed The description matches the changeset and describes the structured logging feature, CLI flags, and logger seam.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fleet-node-logging

Warning

Tools execution failed with the following error:

Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error)


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.

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request introduces structured logging to the node runtime and CLI, allowing users to configure log files, levels, and JSON formatting via new command-line options. Feedback on the changes highlights a potential issue where an invalid log level could silently disable all logging, and suggests validating the input and falling back to a default 'INFO' level.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/cli/src/cli/lib/broker-lifecycle.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d6ce447f49

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/cli/src/cli/commands/core.ts
Comment thread packages/cli/src/cli/lib/broker-lifecycle.ts

@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: 2

🧹 Nitpick comments (2)
packages/fleet/src/serve-node.ts (1)

432-434: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add structured context to the handleInvoke catch-path warning.

All other logger.warn call sites include structured extra fields, but this catch only passes errorMessage(error). When sendHandlerResult throws (e.g., socket closed mid-flight), the log loses the action and invocation identity. frame.payload is in scope and provides name and invocation_id.

♻️ Proposed refactor
       void handleInvoke(frame.payload as Extract<BrokerToSdk, { type: 'invoke_handler' }>['payload']).catch(
-        (error) => logger.warn(errorMessage(error))
+        (error) =>
+          logger.warn(errorMessage(error), {
+            action: frame.payload.name,
+            invocationId: frame.payload.invocation_id,
+          })
       );
🤖 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 `@packages/fleet/src/serve-node.ts` around lines 432 - 434, The
`handleInvoke(...).catch` warning in `serve-node` is missing structured context,
so update the `logger.warn` call to include an `extra` payload alongside
`errorMessage(error)`. Use the in-scope `frame.payload` from the
`invoke_handler` path to attach the action name and `invocation_id`, matching
the structured logging style used elsewhere in this file. Keep the fix localized
to the `handleInvoke` catch-path so failures from `sendHandlerResult` can be
traced to a specific invocation.
packages/cli/src/cli/commands/core.ts (1)

293-299: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider adding .choices() to validate --log-level.

The help text advertises debug | info | warn | error, but commander doesn't enforce it. An invalid value like --log-level foo is silently uppercased and passed to AGENT_RELAY_LOG_LEVEL. Adding .choices() gives early, clear feedback at parse time.

♻️ Optional: enforce valid log levels
-    .option('--log-level <level>', 'Node log verbosity: debug | info | warn | error (default: info)')
+    .option(
+      '--log-level <level>',
+      'Node log verbosity: debug | info | warn | error (default: info)',
+      undefined
+    )
+    // Commander 12 supports choices via custom validation:

Alternatively, validate in applyNodeLogEnv before setting the env var.

🤖 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 `@packages/cli/src/cli/commands/core.ts` around lines 293 - 299, The
`--log-level` option in `core.ts` is advertised as a fixed set of values but is
not being validated by commander. Add `.choices()` to the existing
`option('--log-level <level>', ...)` definition so invalid values are rejected
during parsing, and keep `applyNodeLogEnv` aligned with the same accepted levels
if you also want a defensive check there.
🤖 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 `@packages/cli/src/cli/lib/broker-lifecycle.ts`:
- Around line 1026-1029: The detached startup path is missing the log-related
CLI flags, so background broker launches do not inherit file, level, or JSON
logging settings. Update childUpArgsForDetachedStart() in broker-lifecycle.ts to
forward --log-file, --log-level, and --log-json alongside the existing detached
args, using the same option values that applyNodeLogEnv() consumes so the
spawned child gets the intended logger configuration.

In `@packages/fleet/README.md`:
- Around line 98-100: The README’s description of “quiet” behavior is inaccurate
because resolveLogger can fall back to no-op handlers for every level, not just
non-warning levels. Reword the note near the logger behavior summary to say
that, without a logger or legacy warn callback, the node remains silent unless a
compatible warn handler is provided; reference resolveLogger and the logger
level summary wording so the behavior is described conditionally and does not
imply warnings always surface.

---

Nitpick comments:
In `@packages/cli/src/cli/commands/core.ts`:
- Around line 293-299: The `--log-level` option in `core.ts` is advertised as a
fixed set of values but is not being validated by commander. Add `.choices()` to
the existing `option('--log-level <level>', ...)` definition so invalid values
are rejected during parsing, and keep `applyNodeLogEnv` aligned with the same
accepted levels if you also want a defensive check there.

In `@packages/fleet/src/serve-node.ts`:
- Around line 432-434: The `handleInvoke(...).catch` warning in `serve-node` is
missing structured context, so update the `logger.warn` call to include an
`extra` payload alongside `errorMessage(error)`. Use the in-scope
`frame.payload` from the `invoke_handler` path to attach the action name and
`invocation_id`, matching the structured logging style used elsewhere in this
file. Keep the fix localized to the `handleInvoke` catch-path so failures from
`sendHandlerResult` can be traced to a specific invocation.
🪄 Autofix (Beta)

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: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e6ef8edf-d137-4837-9f69-59f78b47af26

📥 Commits

Reviewing files that changed from the base of the PR and between a5fcfed and d6ce447.

📒 Files selected for processing (5)
  • packages/cli/src/cli/commands/core.ts
  • packages/cli/src/cli/lib/broker-lifecycle.ts
  • packages/fleet/README.md
  • packages/fleet/src/serve-node.test.ts
  • packages/fleet/src/serve-node.ts

Comment thread packages/cli/src/cli/lib/broker-lifecycle.ts
Comment thread packages/fleet/README.md Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 5 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread packages/cli/src/cli/commands/core.ts Outdated
Comment thread packages/cli/src/cli/commands/core.ts Outdated
Comment thread packages/fleet/src/serve-node.ts Outdated
Comment thread packages/fleet/README.md Outdated
- Reject an invalid --log-level at parse time (case-insensitive) and fall
  back to INFO in createLogger for an unrecognized AGENT_RELAY_LOG_LEVEL,
  instead of silently dropping every log line.
- Carry node + capability kind on each action-invocation log line so a
  file/JSON sink can group by node and kind.
- Correct the fleet README: with no logger the node is silent; the CLI
  wires a warn-only sink when no --log-* flag is given.
- Add the CHANGELOG [Unreleased] entry for the new node up log flags.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 6 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/fleet/src/serve-node.test.ts">

<violation number="1" location="packages/fleet/src/serve-node.test.ts:315">
P3: The completed-event assertion omits `kind` while the invoked-event assertion validates it. Since `base` in serve-node.ts carries `kind` into both logs via spread, the completed assertion should also check `kind: 'action'` for consistency.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread packages/fleet/src/serve-node.test.ts Outdated
});
const completed = entries.find((entry) => entry.message === 'Action "echo" completed');
expect(completed?.level).toBe('info');
expect(completed?.extra).toMatchObject({ node: 'test-node', action: 'echo', invocationId: 'inv-1' });

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: The completed-event assertion omits kind while the invoked-event assertion validates it. Since base in serve-node.ts carries kind into both logs via spread, the completed assertion should also check kind: 'action' for consistency.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/fleet/src/serve-node.test.ts, line 315:

<comment>The completed-event assertion omits `kind` while the invoked-event assertion validates it. Since `base` in serve-node.ts carries `kind` into both logs via spread, the completed assertion should also check `kind: 'action'` for consistency.</comment>

<file context>
@@ -304,10 +304,15 @@ describe('serveNode logging', () => {
     const completed = entries.find((entry) => entry.message === 'Action "echo" completed');
     expect(completed?.level).toBe('info');
-    expect(completed?.extra).toMatchObject({ action: 'echo', invocationId: 'inv-1' });
+    expect(completed?.extra).toMatchObject({ node: 'test-node', action: 'echo', invocationId: 'inv-1' });
     expect(typeof completed?.extra?.ms).toBe('number');
 
</file context>
Suggested change
expect(completed?.extra).toMatchObject({ node: 'test-node', action: 'echo', invocationId: 'inv-1' });
expect(completed?.extra).toMatchObject({ node: 'test-node', action: 'echo', kind: 'action', invocationId: 'inv-1' });

claude and others added 2 commits July 13, 2026 02:50
Re-apply the structured node-logging feature (#1237) onto main's
node-provider refactor (#1239):

- serve-node.ts: port the FleetLogger seam, resolveLogger, per-capability
  debug logs, invoked/completed/failed logs (with ms + node/kind/
  invocationId) onto the NodeProviderClient-based serveNode, replacing the
  removed WebSocket runNodeConnection path.
- serve-node.test.ts: rewrite the 3 logging tests against main's
  node-socket mock harness.
- broker-lifecycle.ts: inject createLogger('fleet') into the served TS node
  provider when a --log-* flag (or --verbose) is set; keep log/warn
  callbacks otherwise.
- CHANGELOG.md: keep main's node-provider bullets plus the new node up
  --log-* entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsDJ2SkR6gJG6SFBi79XW3

@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.

🧹 Nitpick comments (2)
packages/fleet/src/serve-node.ts (2)

270-296: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Per-invocation "invoked" log at info doubles log volume vs. registration events at debug.

Every single action call emits an info-level "invoked" line in addition to "completed"/"failed", while the far less frequent capability-registration event (Line 213) is logged at debug. On a busy node this makes "invoked" the dominant log line at the default visible level, while "completed" already carries the same fields plus ms. Consider dropping "invoked" to debug (mirroring registration) and keeping info reserved for completion/failure summaries.

♻️ Suggested tweak
-    logger.info(`Action "${name}" invoked`, context);
+    logger.debug(`Action "${name}" invoked`, context);
🤖 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 `@packages/fleet/src/serve-node.ts` around lines 270 - 296, Change the
per-invocation log in adaptHandler from info to debug, leaving the existing
message and context unchanged. Keep completion and failure logs at info/warn so
default-level output retains the action outcome summaries.

68-84: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

FleetLogger.error() is defined but never invoked.

The interface exposes debug/info/warn/error, but every failure site in this file (onError at Line 200, action failures at Line 288, and presumably trigger-sync failures) calls logger.warn — never logger.error. Consumers that filter/alert on error level (e.g. a JSON sink feeding an alerting pipeline) would silently miss real node/action failures.

♻️ Suggested severity mapping
-        logger.warn(`Fleet node error: ${errorMessage(error)}`, {
+        logger.error(`Fleet node error: ${errorMessage(error)}`, {
           node: nodeName,
           error: errorMessage(error),
         });
-      logger.warn(`Action "${name}" failed`, {
+      logger.error(`Action "${name}" failed`, {
         ...context,
         ms: Date.now() - startedAt,
         error: errorMessage(error),
       });
🤖 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 `@packages/fleet/src/serve-node.ts` around lines 68 - 84, Update the
failure-handling paths in serve-node.ts to use logger.error for genuine node and
action failures, including onError, action failure handling, and trigger-sync
failures, while retaining logger.warn only for non-failure conditions. Preserve
the existing messages and structured extra fields when changing the severity
calls.
🤖 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.

Nitpick comments:
In `@packages/fleet/src/serve-node.ts`:
- Around line 270-296: Change the per-invocation log in adaptHandler from info
to debug, leaving the existing message and context unchanged. Keep completion
and failure logs at info/warn so default-level output retains the action outcome
summaries.
- Around line 68-84: Update the failure-handling paths in serve-node.ts to use
logger.error for genuine node and action failures, including onError, action
failure handling, and trigger-sync failures, while retaining logger.warn only
for non-failure conditions. Preserve the existing messages and structured extra
fields when changing the severity calls.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 91ab5168-0afd-4d47-b82f-431d1aa9cfa5

📥 Commits

Reviewing files that changed from the base of the PR and between ac2343f and 8c4b99f.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • packages/cli/src/cli/lib/broker-lifecycle.ts
  • packages/fleet/src/serve-node.test.ts
  • packages/fleet/src/serve-node.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • CHANGELOG.md
  • packages/fleet/src/serve-node.test.ts
  • packages/cli/src/cli/lib/broker-lifecycle.ts

@willwashburn willwashburn merged commit 6de0d79 into main Jul 13, 2026
2 checks passed
@willwashburn willwashburn deleted the fleet-node-logging branch July 13, 2026 10:33
willwashburn added a commit that referenced this pull request Jul 13, 2026
…1256)

* docs(changelog): reconcile [Unreleased] with what actually shipped

The release automation appends raw commit subjects under each new version
heading but never clears [Unreleased], so curated entries accumulated in
[Unreleased] for features that shipped across 8.5.0–10.0.0, while each release
section got a thin auto-generated stub. The section had also grown two full
sets of ### headers and an internal contradiction about the default base URL.

- Reduce [Unreleased] to the only genuinely unreleased change (node up
  structured logging, #1237), verified against git commit ranges.
- Rewrite [10.0.0] as the node-providers / broker-demotion release it is,
  including the breaking removal of the /api/fleet/ws sidecar protocol.
- Harvest the stranded rich descriptions down into their real shipped
  releases (9.0.1–9.2.4 and 8.5.0–8.9.2), replacing thin stubs and
  consolidating the 9.2.4 journal-lock churn into impact bullets.
- Remove duplicate section headers and the superseded gateway.relaycast.dev
  plugin-default entry that contradicted the cast.agentrelay.com migration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFxLB2bdCMHffkrLPFdhEx

* chore(trajectories): record changelog reconciliation

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFxLB2bdCMHffkrLPFdhEx

* style: auto-format with Prettier

* docs(changelog): address PR review — restore two entries, fix section order, complete trajectory

- Restore the sdk-swift AgentRelayBrokerSDK split entry (git-attributed to
  9.1.3, the hosted-transport release) and the @agent-relay/cloud typed-error /
  legacy cloud-auth.json migration entry (git-attributed to 9.1.2) — both were
  dropped in the first pass.
- Reorder the 9.0.1 section so Fixed precedes Breaking Changes / Migration
  Guidance per Keep a Changelog.
- Complete the leaked active trajectory so the durable record lives under
  completed/ with populated commits instead of a status:active stub.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFxLB2bdCMHffkrLPFdhEx

* style: auto-format with Prettier

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
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.

2 participants