mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-08-13 22:37:29 +00:00
Adds a `team` credential provider + team/member management so teammates can share secrets by email instead of passing .env files over chat. Fully E2E: the server only ever stores ciphertext, per-member sealed vault keys, and public keys — it never sees a plaintext value or the vault DEK. Plugin (@logicsrc/plugin-credential-sharing) - crypto.ts: X25519 identity keys, per-vault DEK (secretbox), DEK sealed to each member's pubkey (crypto_box_seal), value encrypt/decrypt (libsodium) - identity.ts: local ~/.logicsrc/identity.json (0600) holding the device key + API token; never uploads the secret key - client.ts: typed /api/credshare client - providers/team.ts: `team:<slug>/<vault>` CredentialProvider (inspect, readValues=decrypt, write=encrypt, rollback); fingerprints match env so env<->team diffs line up - fixes latent libsodium-wrappers ESM load bug (createRequire) here + in github-secrets Server (commandboard-api /api/credshare) - zero-knowledge router: email-code auth, keys, teams, members, invites, vaults, sealed grants, ciphertext secrets, audit; membership authz in app - CredShareStore abstraction: in-memory (dev/tests) + Supabase (prod) - Resend email transport for login codes + invites (no-op -> echoes locally) - supabase migration: credshare_* tables, deny-by-default RLS CLI - real `logicsrc login` (email code -> token + key upload) - `logicsrc teams create/list/invite/accept/members/vaults/grant/push/pull` Web (logicsrc.com/teams + /teams/accept) - management surface only (browser holds no private key, never decrypts): login, view teams/members/vaults, invite, accept Tests: crypto round-trip, server contract (invite->accept->push->grant->pull + authz boundaries), and a real HTTP+client+crypto E2E asserting the server never holds plaintext. Full workspace build + tests green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
47 lines
1.5 KiB
Text
47 lines
1.5 KiB
Text
# Canonical public site URL (used for CoinPay redirect/webhook URLs and secure cookies)
|
|
PUBLIC_URL=https://logicsrc.com
|
|
COMMANDBOARD_API_URL=http://localhost:4010
|
|
COMMANDBOARD_TOKEN=
|
|
COMMANDBOARD_DID=
|
|
COMMANDBOARD_AGENT_KEY=
|
|
LOGICSRC_SCHEMA_VERSION=0.1
|
|
|
|
COINPAY_API_URL=
|
|
COINPAY_API_KEY=
|
|
COINPAY_MERCHANT_ID=
|
|
COINPAY_BUSINESS_ID=
|
|
COINPAY_ELIGIBILITY_MERCHANT_ID=
|
|
COINPAY_ELIGIBILITY_API_KEY=
|
|
COINPAY_HIRE_US_BLOCKCHAIN=USDC_POL
|
|
COINPAY_WEBHOOK_SECRET=
|
|
COINPAY_OAUTH_ISSUER=https://coinpayportal.com
|
|
COINPAY_OAUTH_CLIENT_ID=
|
|
COINPAY_OAUTH_CLIENT_SECRET=
|
|
COINPAY_OAUTH_REDIRECT_URI=https://logicsrc.com/api/oauth/coinpay/callback
|
|
COINPAY_OAUTH_SCOPES=openid profile email
|
|
LOGICSRC_SESSION_SECRET=
|
|
|
|
UGIG_API_URL=
|
|
UGIG_API_KEY=
|
|
UGIG_WEBHOOK_SECRET=
|
|
|
|
SH1PT_API_URL=
|
|
SH1PT_API_KEY=
|
|
SH1PT_WEBHOOK_SECRET=
|
|
|
|
# Shared secret for the blog-post ingestion webhook (no admin user; the
|
|
# webhook authenticates callers by this secret instead). Generate with:
|
|
# openssl rand -hex 32
|
|
BLOG_WEBHOOK_SECRET=
|
|
|
|
# --- Team credential sharing (commandboard-api /api/credshare) ---
|
|
# Production storage. Without these, the API uses an in-memory store (dev/tests).
|
|
SUPABASE_URL=
|
|
SUPABASE_SERVICE_ROLE_KEY=
|
|
# Email transport for login codes + team invites. Without RESEND_API_KEY the API
|
|
# returns codes/tokens in its responses (local dev only — never in production).
|
|
RESEND_API_KEY=
|
|
CREDSHARE_EMAIL_FROM=LogicSRC <noreply@logicsrc.com>
|
|
LOGICSRC_WEB_URL=https://logicsrc.com
|
|
# Web page → API base (public). Falls back to https://commandboard.run.
|
|
NEXT_PUBLIC_COMMANDBOARD_API_URL=
|