mirror of
https://github.com/openprose/prose.git
synced 2026-09-19 05:55:05 +08:00
0061ca35f1
Reactor was hard-wired to OpenRouter on the CLI (only OPENROUTER_API_KEY was ever read), stranding users holding OpenAI / Anthropic / Google keys. The SDK already supported a scoped provider; this makes it real and elegant at the CLI. reactor-cli (0.2.0 -> 0.2.1): - reactor.yml model.provider now switches the live provider; built-ins openrouter|openai|anthropic|google resolve their endpoint + key env, and any OpenAI-compatible vendor works via model.base_url + model.api_key_env. - A keyless ProviderPlan resolver + a model-bearing OpenAIProvider factory (reached only past the dynamic-import offline boundary), threaded into compile sessions and the run/serve render (incl. the configured render_model, which the run phase previously ignored). - doctor reports the configured provider's key (not only OPENROUTER_API_KEY) and doctor --live smokes the configured endpoint; a missing key fails non-zero with the exact env var (never misdirects to OpenRouter, never exits 0). - Tests: ProviderPlan resolver + a hermetic missing-key compile. reactor (0.3.0 -> 0.3.1): - Receipt Cost now reports the real provider + model instead of a hardcoded openrouter / gemini-3.5-flash (cost-only labels, never fingerprinted). New optional RunProjectRender.providerLabel + CostLabels. - Tests: cost-labels + a key-gated bring-your-own-provider live smoke. Build: each reactor package cleans its output dir before tsc, so local incremental builds cannot accumulate orphaned dist test artifacts. Known limitation: Anthropic's direct OpenAI-compat endpoint rejects our structured-output response_format unless strict:true; route Anthropic models through OpenRouter today (documented).
65 lines
2.1 KiB
JSON
65 lines
2.1 KiB
JSON
{
|
|
"name": "@openprose/reactor-devtools",
|
|
"version": "0.2.0",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/openprose/prose.git",
|
|
"directory": "packages/reactor-devtools"
|
|
},
|
|
"license": "MIT",
|
|
"description": "DevTools / visualization for the @openprose/reactor harness: replays a saved receipt ledger and animates the DAG (flashes on render, dim pulses on memo-skip, per-facet edge lights, a fresh-vs-reused token/$ meter).",
|
|
"type": "commonjs",
|
|
"main": "./dist/index.js",
|
|
"types": "./dist/index.d.ts",
|
|
"sideEffects": false,
|
|
"bin": {
|
|
"reactor-devtools": "./dist/cli.js"
|
|
},
|
|
"files": [
|
|
"dist",
|
|
"src/public",
|
|
"fixtures/masked-relay",
|
|
"fixtures/surprise-cost",
|
|
"fixtures/agent-observatory",
|
|
"fixtures/inbox-triage",
|
|
"fixtures/monorepo-ci",
|
|
"fixtures/research-tree"
|
|
],
|
|
"engines": {
|
|
"node": ">=20"
|
|
},
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"default": "./dist/index.js"
|
|
},
|
|
"./server": {
|
|
"types": "./dist/server/index.d.ts",
|
|
"default": "./dist/server/index.js"
|
|
},
|
|
"./data": {
|
|
"types": "./dist/data/index.d.ts",
|
|
"default": "./dist/data/index.js"
|
|
},
|
|
"./package.json": "./package.json"
|
|
},
|
|
"scripts": {
|
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && pnpm run copy:public",
|
|
"prepack": "pnpm build",
|
|
"copy:public": "node -e \"const fs=require('fs'),p=require('path');const s=p.join('src','public'),d=p.join('dist','public');fs.mkdirSync(d,{recursive:true});for(const f of fs.readdirSync(s))fs.copyFileSync(p.join(s,f),p.join(d,f));\"",
|
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
"fixtures:gen": "pnpm build && node dist/fixtures/generate.js",
|
|
"record": "pnpm build && node scripts/record-demo.mjs",
|
|
"test:runtime": "pnpm build && node --test $(find dist -name '*.test.js' -type f | sort)",
|
|
"test": "pnpm typecheck && pnpm test:runtime"
|
|
},
|
|
"dependencies": {
|
|
"@openprose/reactor": "workspace:*"
|
|
},
|
|
"devDependencies": {
|
|
"@types/node": "^20.11.0",
|
|
"playwright": "1.60.0",
|
|
"typescript": "^5.6.3"
|
|
}
|
|
}
|