feat: @maple-dev/alchemy — Alchemy provider for Maple resources#240
Merged
Conversation
Publishable Alchemy (v2, Effect-based) provider package so customers can declare Maple resources in their own alchemy.run.ts against the public v2 API: dashboards, alert destinations, alert rules, API keys (one-time secret kept as Redacted in Alchemy state, rotate-prop rolls in place), and the ingest-keys singleton. - lib/alchemy-maple: zero runtime deps (alchemy + effect as peers); thin HTTP client with typed errors and bounded 429/5xx retry; hand-written minimal wire schemas guarded by contract tests against @maple/domain (dev-only dep, never shipped) - integration test drives the real provider lifecycles through the real v2 handlers over PGlite via a custom fetch - examples/alchemy-maple: customer-facing usage example Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
|
Your Pullfrog Router balance is exhausted. You have a card on file but auto-reload is disabled, so runs paused once your balance went past the overdraft buffer. Top up balance → · Enable auto-reload →
|
The package tests import plain vitest; @effect/vitest was never used. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What
A new publishable package,
@maple-dev/alchemy(lib/alchemy-maple), an Alchemy provider that lets Maple customers declare Maple resources in their ownalchemy.run.ts, authenticated with amaple_ak_…key against the public v2 API:Maple.DashboardMaple.AlertDestinationtype; write-only secrets acceptRedacted;typechange ⇒ replaceMaple.AlertRuledestination_idstakes Output refs from destinations; lost state re-adopts by org-unique nameMaple.ApiKeysecretcaptured asRedactedinto Alchemy state;rotateprop bump rolls in place; other prop changes replaceMaple.IngestKeysnuke: { singleton: true }) surfacing keys asRedactedoutputsUsage:
providers: Layer.mergeAll(Cloudflare.providers(), Maple.providers()), credentials fromMAPLE_API_KEY/MAPLE_API_URL.Why
Maple-side resources previously had to be clicked together in the UI or scripted by hand. This makes them declarable IaC next to the infrastructure they observe, dogfooding the v2 public API.
Design notes for review
alchemy(>=2.0.0-beta.61 <3) andeffectare peers so customers get a single Effect/alchemy instance.@maple/domainis a dev-only dependency — the package ships small hand-written wire schemas instead, kept honest by contract tests that decode the provider's request bodies against the realV2*CreateParamsschemas.effect/unstable/httpwith typed errors (404/409/401·403 tags for adopt/recreate flows) and bounded 429/5xx retry (v2 allows 600 req/60s).ApiKey.secretcan never be re-read from the API — it lives only in Alchemy state;list()returns secretless placeholders (enumeration/nuke only).Testing
@maple/domain).apps/api/src/routes/v2/alchemy-provider.integration.test.ts: drives the real provider code through the real v2 handlers over PGlite (customfetchinto the in-process web handler) — create → noop → drift-patch → adopt-by-name → roll → revoke/delete cycles for dashboards, destinations+rules, and API keys.tsdownbuild emits a clean 24 kB ESM dist with onlyeffect/alchemyexternals;npm pack --dry-run= 4 files, no workspace specifiers; rootbun typecheckgreen.Not included (follow-ups): npm publish, manual smoke deploy of
examples/alchemy-mapleagainst a dev deployment.🤖 Generated with Claude Code
Need help on this PR? Tag
/codesmithwith what you need. Autofix is disabled.