managarten/services/mana-research
Till JS 7d120225dc feat(research): Phase 3b openai-deep-research async + BYO-keys CRUD & UI
Two backlog items landed in one commit because an earlier amend in a
parallel terminal dropped the initial Phase 3b commit and the BYO-keys
work was blocked on the same wiring.

openai-deep-research (async):
- New research.async_jobs table persists the OpenAI response.id, query,
  reservation, and cached result/error.
- POST /v1/research/async reserves credits, submits to the Responses API
  with background=true, returns a taskId. Submit failure refunds.
- GET /v1/research/async/:taskId polls upstream, commits the reservation
  on completion, refunds on failure, short-circuits for terminal states.
- GET /v1/research/async lists the user's async tasks.

BYO-keys:
- research.provider_configs CRUD at /v1/provider-configs. Keys are masked
  (••••last4) on read so the raw secret never re-transits to the browser.
  Currently stored plaintext with a TODO for AES-GCM-256 via the shared
  KEK — single call site in storage/configs.ts.decryptKey().
- New frontend route /research-lab/keys lets the user paste a key per
  provider, toggle enabled, and set daily/monthly credit budgets.
- ListView grew a 🔑 link in the header.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 15:43:12 +02:00
..
src feat(research): Phase 3b openai-deep-research async + BYO-keys CRUD & UI 2026-04-17 15:43:12 +02:00
CLAUDE.md feat(research): Phase 3a — 4 sync research agents 2026-04-17 15:06:12 +02:00
Dockerfile feat(research): add mana-research service — Phase 1 + 2 2026-04-17 14:42:25 +02:00
drizzle.config.ts feat(research): add mana-research service — Phase 1 + 2 2026-04-17 14:42:25 +02:00
package.json feat(research): add mana-research service — Phase 1 + 2 2026-04-17 14:42:25 +02:00
tsconfig.json feat(research): add mana-research service — Phase 1 + 2 2026-04-17 14:42:25 +02:00