Skip to content

feat(imessage): outbound over the HTTP middleware - #186

Open
Andy (invisicat) wants to merge 3 commits into
mainfrom
feat/imessage-fusor-inbound
Open

feat(imessage): outbound over the HTTP middleware#186
Andy (invisicat) wants to merge 3 commits into
mainfrom
feat/imessage-fusor-inbound

Conversation

@invisicat

@invisicat Andy (invisicat) commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

Moves iMessage outbound off the per-instance gRPC hosts and onto the HTTP middleware (imessage-server-v2-http) via advanced-imessage 2.0's fetch transport.

Inbound is not this PR's concern — it stays exactly as on main and moves to Fusor in #195.

What changed

  • Every outbound unary call rides createHttpClient. Both modes dial one middleware host: SPECTRUM_IMESSAGE_HTTP_ADDRESS, default imessage.spectrum.photon.codes:443.
  • Dedicated lines no longer dial {instanceId}.imsg.photon.codes directly — they pass server: instanceId, sent as x-photon-server, and the middleware routes server-side.
  • Outbound retry semantics preserved: autoIdempotency + retry, idempotency-keyed so retries can't double-apply.
  • Explicit (static-token) clients: address keeps its historical meaning. Outbound rides the middleware — per-entry optional httpAddress (falls back to SPECTRUM_IMESSAGE_HTTP_ADDRESS/default) keeps self-hosted configs self-contained, and optional server carries the dedicated instance id for routing.

Dependency / draft blocker

Bumps @photon-ai/advanced-imessage to ^2.0.0 — unpublished; requires advanced-imessage-ts #47 (feat/http-client-combined, pinned locally at a053778). bun.lock is intentionally untouched until 2.0.0 is released; local dev resolves the SDK via symlink.

Validation

  • bun run typecheck (all 13 packages)
  • bun x ultracite check
  • packages/imessage: 142 tests via vitest (node + bun runners)

Note

Medium Risk
Splits transport for all outbound iMessage actions and changes dedicated routing to middleware headers; depends on unpublished SDK 2.0, so regressions in send/retry or streaming are possible until release.

Overview
Outbound iMessage calls now go through the HTTP middleware (imessage-server-v2-http) via @photon-ai/advanced-imessage 2.0 (createHttpClient), instead of unary gRPC on per-instance hosts. Shared and dedicated cloud clients dial one middleware host (SPECTRUM_IMESSAGE_HTTP_ADDRESS, default imessage.spectrum.photon.codes:443); dedicated lines pass server: instanceId for middleware routing instead of calling {instanceId}.imsg.photon.codes for sends. Inbound is unchanged in behavior but wired through a new streams gRPC client on each RemoteClient; catch-up and live subscriptions use streams, while send/edit/react and other outbound paths still use client.

Explicit static-token config keeps address for the gRPC event plane and adds optional httpAddress and server. Teardown closes both HTTP and gRPC clients. Tests and config schema cover the new fields.

Reviewed by Cursor Bugbot for commit be062a9. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Added support for routing outbound iMessage requests via configurable HTTP middleware endpoints.
    • Enabled separate HTTP (outbound/unary) and gRPC (inbound/event streaming) handling.
    • Added optional dedicated server routing and configuration overrides for advanced client setups.
    • Improved event catch-up and live subscription wiring.
  • Bug Fixes

    • Updated iMessage client initialization/teardown to better preserve reliable event streaming and request retry behavior.
  • Tests

    • Adjusted iMessage test mocks to account for the new split HTTP/gRPC remote client shape.
  • Chores

    • Upgraded the advanced iMessage dependency to the latest major version.

@invisicat Andy (invisicat) self-assigned this Jul 12, 2026
@pulumi

pulumi Bot commented Jul 12, 2026

Copy link
Copy Markdown

⚠️ Pulumi could not deploy preview(s) for this pull request because GitHub reports it is not mergeable (mergeable state: dirty). This usually means the branch has merge conflicts with its base branch. Resolve the conflicts and push a new commit to retry.

@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The iMessage package upgrades advanced-imessage, separates HTTP and gRPC clients, routes remote event subscriptions through gRPC streams, supports HTTP address and server routing options, updates cleanup, and adjusts test fixtures.

Changes

iMessage client plane separation

Layer / File(s) Summary
Split authenticated client construction
packages/imessage/package.json, packages/imessage/src/auth.ts, packages/imessage/src/index.ts
The package upgrades @photon-ai/advanced-imessage; shared, dedicated, and explicit-client modes construct separate HTTP and gRPC clients with refreshed token callbacks and close both clients during teardown.
Route remote events through gRPC streams
packages/imessage/src/types.ts, packages/imessage/src/remote/stream.ts
RemoteClient gains a typed streams field, and catch-up/live message, poll, and group subscriptions use the gRPC streams client.
Align configuration and test clients
packages/imessage/src/types.ts, packages/imessage/test/*.test.ts, packages/imessage/test/remote/*.test.ts
Client configuration accepts optional httpAddress and server fields, configuration tests cover these forms, outbound tests add inert stream stubs, and stream tests move subscription mocks onto streams.

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

Sequence Diagram(s)

sequenceDiagram
  participant RemoteMessages as messages
  participant ClientStream as clientStream
  participant GrpcStreams as gRPC streams
  participant EventSource as iMessage event source
  RemoteMessages->>ClientStream: pass RemoteClient entry
  ClientStream->>GrpcStreams: subscribeEvents()
  GrpcStreams->>EventSource: receive inbound events
  EventSource-->>GrpcStreams: deliver events
  GrpcStreams-->>ClientStream: emit mapped events
Loading

Possibly related PRs

Suggested labels: release

Suggested reviewers: underthestars-zhy

Poem

I’m a rabbit with clients split in two,
HTTP hops and gRPC streams come through.
Tokens refresh as events run,
Tests grow ears for every one.
Hop, hop—both close when done!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly captures the main change: moving iMessage outbound traffic to the HTTP middleware.
✨ 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 feat/imessage-fusor-inbound

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.

… gRPC streams

Outbound unary calls move off the per-instance gRPC hosts onto the HTTP
middleware (imessage-server-v2-http) via advanced-imessage 2.0's fetch
transport. Each RemoteClient now carries two clients:

- client: createHttpClient dialing SPECTRUM_IMESSAGE_HTTP_ADDRESS
  (default imessage.spectrum.photon.codes:443); dedicated lines pass
  server: instanceId so the middleware routes via x-photon-server
  instead of dialing {instanceId}.imsg.photon.codes directly.
- streams: createGrpcClient, unchanged addresses — serves only
  subscribeEvents/events.catchUp until Fusor inbound (#195) lands.

Mapper RPCs inside the stream path (message/attachment rebuilds) ride
the HTTP client too, so the gRPC plane is subscription-only. Explicit
clients reuse their single configured address for both transports.

bun.lock intentionally untouched: 2.0.0 is unpublished, resolved via a
local symlink to advanced-imessage-ts#47 (feat/http-client-combined,
a053778).

Entire-Checkpoint: ac48d1a2d0c6
@invisicat
Andy (invisicat) force-pushed the feat/imessage-fusor-inbound branch from 56f2ab8 to 7805ad6 Compare July 17, 2026 04:56
@invisicat Andy (invisicat) changed the title feat(imessage) - move from gRPC to Fusor inbound feat(imessage): outbound over the HTTP middleware Jul 17, 2026
@invisicat
Andy (invisicat) marked this pull request as ready for review July 17, 2026 05:02
Copilot AI review requested due to automatic review settings July 17, 2026 05:02

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

"dependencies": {
"@photon-ai/advanced-imessage": "^1.0.0",
"@photon-ai/advanced-imessage": "^2.0.0",
"@photon-ai/otel": "^3.1.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

SDK 2.0 makes nice-grpc, nice-grpc-common, and @grpc/grpc-js optional peers, and createGrpcClient fails fast if they are missing. This package still creates a gRPC streams client for every RemoteClient, but only bumps @photon-ai/advanced-imessage to ^2.0.0 — it never declares those gRPC packages.

For the dual-client transition to actually work for consumers (not just a local symlink), @spectrum-ts/imessage likely needs to depend on / peer-depend on those three packages until #195 removes the gRPC stream plane.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

worry about this in #195 if grpc there is still needed.

Comment thread packages/imessage/src/index.ts Outdated
Comment on lines +480 to +495
@@ -488,6 +492,11 @@ export const imessage = definePlatform("iMessage", {
tls: true,
token: e.token,
}),
streams: createGrpcClient({

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cloud mode correctly splits HTTP vs gRPC addresses. Explicit clients do not: both createHttpClient and createGrpcClient reuse e.address.

That is workable during the transition only if the configured host really serves both planes. If someone points this at a pure HTTP middleware host (or a pure gRPC host), one side will break while the other looks fine. Consider either documenting this as a hard config requirement in the public API docs, or temporarily allowing separate outbound/stream addresses here the same way cloud env vars do.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

this is only b/c we are transitioning, #195 will fix this.

Comment thread packages/imessage/src/index.ts

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

🧹 Nitpick comments (1)
packages/imessage/src/index.ts (1)

514-516: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Prefer Promise.allSettled for resource cleanup.

Using Promise.all for mass disposal can lead to unhandled promise rejections if one close() call rejects while others are still pending. Promise.allSettled ensures all clients and streams attempt to close gracefully without short-circuiting on the first failure.

♻️ Proposed refactor
-      await Promise.all(
+      await Promise.allSettled(
         client.flatMap((entry) => [entry.client.close(), entry.streams.close()])
       );
🤖 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/imessage/src/index.ts` around lines 514 - 516, Update the resource
cleanup call in the client shutdown flow to use Promise.allSettled instead of
Promise.all, while preserving the existing entry.client.close() and
entry.streams.close() operations so every client and stream close attempt
completes.
🤖 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/imessage/src/index.ts`:
- Around line 514-516: Update the resource cleanup call in the client shutdown
flow to use Promise.allSettled instead of Promise.all, while preserving the
existing entry.client.close() and entry.streams.close() operations so every
client and stream close attempt completes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4fcf8669-526e-4cd3-97fc-1c7cecee573d

📥 Commits

Reviewing files that changed from the base of the PR and between 11ded02 and 7805ad6.

📒 Files selected for processing (11)
  • packages/imessage/package.json
  • packages/imessage/src/auth.ts
  • packages/imessage/src/index.ts
  • packages/imessage/src/remote/stream.ts
  • packages/imessage/src/types.ts
  • packages/imessage/test/contact-card.test.ts
  • packages/imessage/test/membership.test.ts
  • packages/imessage/test/read-actions.test.ts
  • packages/imessage/test/remote/app.test.ts
  • packages/imessage/test/remote/stream.test.ts
  • packages/imessage/test/space.test.ts
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Cursor Bugbot
⚠️ CI failures not shown inline (8)

GitHub Actions: Preview / preview: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: Preview / 0_preview.txt: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / 0_test (node).txt: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / test (node): feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / test (bun): feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / check: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / 1_check.txt: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.

GitHub Actions: CI / 2_test (bun).txt: feat(imessage): outbound over the HTTP middleware

Conclusion: failure

View job details

##[group]Run bun install --frozen-lockfile
 �[36;1mbun install --frozen-lockfile�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 bun install v1.3.14 (0d9b296a)
 Resolving dependencies
 Resolved, downloaded and extracted [60]
 error: No version matching "^2.0.0" found for specifier "`@photon-ai/advanced-imessage`" (but package exists)
 error: `@photon-ai/advanced-imessage`@^2.0.0 failed to resolve
 ##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use explicit function parameter and return types when they improve clarity; prefer unknown over any; use as const for immutable literal values; and rely on TypeScript narrowing instead of assertions.

Files:

  • packages/imessage/test/contact-card.test.ts
  • packages/imessage/test/space.test.ts
  • packages/imessage/test/membership.test.ts
  • packages/imessage/test/remote/app.test.ts
  • packages/imessage/test/remote/stream.test.ts
  • packages/imessage/test/read-actions.test.ts
  • packages/imessage/src/auth.ts
  • packages/imessage/src/index.ts
  • packages/imessage/src/types.ts
  • packages/imessage/src/remote/stream.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use meaningful variable names and extract magic numbers into descriptively named constants.
Use arrow functions for callbacks and short functions.
Prefer for...of loops over .forEach() and indexed for loops.
Use optional chaining and nullish coalescing for safer property access.
Prefer template literals over string concatenation and use destructuring for object and array assignments.
Use const by default, let only when reassignment is needed, and never use var.
Always await promises in async functions and use the returned value; prefer async/await over promise chains.
Handle async errors appropriately with try-catch blocks and do not use async functions as Promise executors.
Remove console.log, debugger, and alert statements from production code.
Throw Error objects with descriptive messages rather than strings or other values.
Use try-catch blocks meaningfully and do not catch errors solely to rethrow them.
Prefer early returns for error cases and to reduce nesting; use simple conditionals instead of nested ternaries.
Keep functions focused and within reasonable cognitive-complexity limits, extract complex conditions into named booleans, and group related code while separating concerns.
Avoid dangerouslySetInnerHTML unless absolutely necessary; do not use eval() or assign directly to document.cookie; validate and sanitize user input.
Avoid spread syntax in accumulators within loops, use top-level regex literals instead of creating them in loops, prefer specific imports over namespace imports, and avoid barrel files that re-export everything.

Files:

  • packages/imessage/test/contact-card.test.ts
  • packages/imessage/test/space.test.ts
  • packages/imessage/test/membership.test.ts
  • packages/imessage/test/remote/app.test.ts
  • packages/imessage/test/remote/stream.test.ts
  • packages/imessage/test/read-actions.test.ts
  • packages/imessage/src/auth.ts
  • packages/imessage/src/index.ts
  • packages/imessage/src/types.ts
  • packages/imessage/src/remote/stream.ts
**/*.{tsx,ts}

📄 CodeRabbit inference engine (AGENTS.md)

In Next.js, use Server Components for async data fetching instead of async Client Components.

Files:

  • packages/imessage/test/contact-card.test.ts
  • packages/imessage/test/space.test.ts
  • packages/imessage/test/membership.test.ts
  • packages/imessage/test/remote/app.test.ts
  • packages/imessage/test/remote/stream.test.ts
  • packages/imessage/test/read-actions.test.ts
  • packages/imessage/src/auth.ts
  • packages/imessage/src/index.ts
  • packages/imessage/src/types.ts
  • packages/imessage/src/remote/stream.ts
**/*.{test,spec}.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{test,spec}.{js,jsx,ts,tsx}: Write assertions inside it() or test() blocks, avoid done callbacks in async tests, and do not commit tests containing .only or .skip.
Keep test suites reasonably flat and avoid excessive describe nesting.

Files:

  • packages/imessage/test/contact-card.test.ts
  • packages/imessage/test/space.test.ts
  • packages/imessage/test/membership.test.ts
  • packages/imessage/test/remote/app.test.ts
  • packages/imessage/test/remote/stream.test.ts
  • packages/imessage/test/read-actions.test.ts
🔇 Additional comments (11)
packages/imessage/package.json (1)

48-48: LGTM!

packages/imessage/src/auth.ts (1)

1-4: LGTM!

Also applies to: 166-199, 211-230

packages/imessage/src/index.ts (1)

3-4: LGTM!

Also applies to: 480-485, 495-499

packages/imessage/src/remote/stream.ts (1)

5-5: LGTM!

Also applies to: 228-237, 285-291, 318-329, 353-363, 380-400, 425-426

packages/imessage/src/types.ts (1)

1-16: LGTM!

packages/imessage/test/contact-card.test.ts (1)

1-14: LGTM!

Also applies to: 34-34

packages/imessage/test/membership.test.ts (1)

1-4: LGTM!

Also applies to: 15-17, 37-41

packages/imessage/test/read-actions.test.ts (1)

2-4: LGTM!

Also applies to: 17-19, 82-86

packages/imessage/test/remote/app.test.ts (1)

3-3: LGTM!

Also applies to: 14-16, 58-58

packages/imessage/test/remote/stream.test.ts (1)

1-4: LGTM!

Also applies to: 49-54, 140-146, 215-220

packages/imessage/test/space.test.ts (1)

1-12: LGTM!

Also applies to: 47-51

…with an optional server id

Explicit config.clients kept feeding their single gRPC address to the
HTTP client, but per-instance hosts speak only gRPC (grpc-swift) — the
middleware is the sole HTTP front door. Outbound now dials the same
SPECTRUM_IMESSAGE_HTTP_ADDRESS middleware as the cloud path, `address`
keeps its historical meaning (the gRPC stream plane), and a new
optional `server` config field carries the dedicated instance id
(x-photon-server) so static-token dedicated setups can route.

Flagged by Cursor Bugbot on #186.

Entire-Checkpoint: a5d9ae664be9
Copilot AI review requested due to automatic review settings July 17, 2026 05:14

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

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

Added 1 comment

Comment thread packages/imessage/src/index.ts Outdated
…ay self-contained

Explicit clients could only reach the middleware via the env default,
which silently pointed self-hosted setups at the production host.
`httpAddress` overrides SPECTRUM_IMESSAGE_HTTP_ADDRESS per entry;
`address` stays the gRPC plane and `server` the routing id.

Flagged by capy-ai on #186.
Copilot AI review requested due to automatic review settings July 17, 2026 05:22

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai coderabbitai Bot added the release Just as it is label Jul 17, 2026

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit be062a9. Configure here.

Comment thread packages/imessage/src/index.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release Just as it is

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants