Skip to content

feat(cloud): add managed control-plane funnel - #562

Open
dviejokfs wants to merge 11 commits into
mainfrom
feat/cloud-funnel
Open

feat(cloud): add managed control-plane funnel#562
dviejokfs wants to merge 11 commits into
mainfrom
feat/cloud-funnel

Conversation

@dviejokfs

@dviejokfs dviejokfs commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the two-step Temps Cloud enrollment, status, disconnect, and reconnect lifecycle
  • expose the Cloud account and managed AI entry in the OSS console
  • route the single OSS Temps Cloud notification provider through managed Slack and email sinks
  • make provider Test send a real notification instead of only checking health
  • regenerate CLI and web clients from the merged 674-route OpenAPI document
  • make shutdown's final Cloud flush observable and prove it remains timeout-bounded

Evidence

  • cargo fmt --all -- --check: passed
  • cargo check --lib: passed (existing warnings only)
  • cargo test --lib -p temps-notifications: 121 passed
  • cargo test -p temps-cloud-client --lib flusher::tests: 7 passed, including successful delivery, backend rejection retention, and timeout preservation
  • cargo test -p temps-cloud-client --tests: 59 passed across 3 suites
  • bun run typecheck in apps/temps-cli: passed
  • bun run build in web: passed (existing CSS import warnings)
  • Playwright Cloud/AI flows: 4 passed
  • real local browser flow: OSS test alert reached Cloud, Slack #alerts, and SMTP capture in one run

Follow-up

  • security review is intentionally deferred at the product owner's request until the functionality pass is complete; do not merge this PR as production-ready before that review.

Adds the temps-cloud crate (plugin, handler, service), extends the cloud
client's link lifecycle and status, exposes a Cloud settings page in the
console, and grows the CLI's cloud commands.

Committed as-is from the worktree so main can be merged in with a real
three-way merge rather than a stash replay.
Conflicts, all in the console:
- App.tsx: main reindented the settings routes under a new wrapper; took
  main's structure and re-added the cloud route.
- api/client/{index,sdk.gen,@tanstack/react-query.gen}.ts: both sides added
  generated exports. Resolved by replaying each side's insertions onto the
  base list rather than re-sorting, so the generator's own ordering is kept.
  Regenerating against a live server is still the authority if these drift.
The sidebar entry existed but the palette did not, so ⌘K -- the way most
people navigate the console -- could not reach managed cloud at all.

Keywords cover what someone actually types when they are shopping for it
(retention, backup, managed) rather than only the product name, and the e2e
spec asserts both routes to it.
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

📓 Changelog preview

This is what your commits will add to the generated CHANGELOG.md at release time (via git-cliff). Do not edit CHANGELOG.md by hand — it is generated from your Conventional Commit messages.

## [Unreleased]

### Added

- **cloud:** Add secure managed telemetry client
- **cloud:** Add managed cloud link lifecycle and console settings
- **console:** Find Temps Cloud from the command palette
- **cloud:** Integrate managed alert routing
- **cloud:** Declare backup restore artifacts

### Fixed

- **openapi:** Preserve canonical cloud schema diff

### Miscellaneous

- **merge:** Sync cloud funnel with main

### Refactor

- **cloud:** Require backup checksums

### Testing

- **cloud:** Prove bounded shutdown flush

Resolve seven conflicts, six of which were artefacts rather than real
disagreements.

main canonicalised `apps/temps-cli/openapi.json` (recursively sorted keys)
while this branch added the `/cloud*` endpoints against the old key order.
Git's line-based merge therefore reported ~1,800 conflicting regions in a
93k-line generated file. Merging the parsed structure instead shows the true
change set is additive on both sides and disjoint: this branch adds 4 paths,
4 schemas and `AppSettings.cloud`; main adds 4 paths, 15 schemas and
`AppSettings.self_update`. Zero keys diverge. The resolved spec is main's
canonical file plus exactly those additions - 210 inserted lines, no
deletions.

The TypeScript clients are regenerated rather than hand-merged, since the
conflicts were single-line `import type {...}` / `export {...}` statements
listing every symbol in the API.

One trap worth recording: `web/`'s client could not simply be regenerated
from `openapi.json`. main's committed spec is stale - the ADR-036 sandbox
work landed `lifecycle`, `project_id` and `source_repo_url` in
`web/src/api/client/` (generated from a live server) without refreshing the
file. Regenerating from the file would have silently reverted those fields.
`web/` therefore keeps main's client with only the cloud delta applied, and
its diff against main is now purely additive.

Verified: cargo check --workspace --all-targets, cargo clippy -D warnings,
tsc --noEmit and eslint all clean.
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