putSecret/getSecret, `bun run secret:set`, and notify taking its credentials from the store with env as the fallback. this was described two messages ago as a later thing; it is about fifteen lines and it was blocking the honest answer to "where does the .p8 go", so it is done. getKey was the wrong door for anything supplied from outside — it MINTS a random 32-byte value when the purpose is absent, which for a foreign credential means silently authenticating to apple with a fake. getSecret returns null instead, which is what lets the env fallback work. putSecret retires the previous row rather than deleting it: a mistyped paste over a working key should be recoverable, and retiredKeys already exists for that shape. one transaction, because the partial unique index means the retire has to land before the insert. the CLI reads stdin and has deliberately no --value flag: a secret in argv is in shell history, in ps output, and in any audit log that records command lines. offering the flag would make the convenient path the leaky one. it prints a length and the last four characters, never the value. also `bun run notify:test`, which fires officer/core:test at a registered device. the sidecar's port is ephemeral, so it now writes its address to data/notify-server.url on boot and removes it on clean shutdown; the CLI treats an unreachable address as "not running" rather than trusting the file, because a crash leaves one behind. the script says what actually happened, because the day-waster here is that a send with nothing configured returns success and delivers nothing — it refuses up front when channels is empty, and calls out sent:0/failed:0 as "no device registered" rather than letting it read as success. verified end to end with a p-256 key generated locally and then deleted from the store: zero APNS vars in .env, sidecar reported channels: apns, and the send reached the channel. store is back to jwt and offscale only.
194 lines
6.9 KiB
JSON
194 lines
6.9 KiB
JSON
{
|
|
"name": "officer",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"workspaces": [
|
|
"src/databases/*",
|
|
"src/workspaces/*"
|
|
],
|
|
"scripts": {
|
|
"preinstall": "node -e \"var v = +process.versions.node.split('.')[0]; if (v < 22) { console.error('Node 22 or newer required (got ' + process.versions.node + '). Run: nvm use 22'); process.exit(1); }\"",
|
|
"gen:index": "bun run ./scripts/gen-index.ts",
|
|
"fix:env": "bun run ./scripts/fix-env.ts",
|
|
"secret:set": "bun run --env-file=.env ./scripts/secret-set.ts",
|
|
"notify:test": "bun run --env-file=.env ./scripts/notify-test.ts",
|
|
"gen:ecosystem": "bun run --env-file=.env ./scripts/gen-ecosystem.ts",
|
|
"predev": "bun run ./scripts/gen-index.ts",
|
|
"dev": "bun --env-file=.env --watch src/server.tsx",
|
|
"prestart": "bun run ./scripts/gen-index.ts",
|
|
"start": "NODE_ENV=production bun src/server.tsx",
|
|
"prebuild": "bun run ./scripts/prebuild.ts",
|
|
"build:web": "bun run ./scripts/build/web.ts",
|
|
"build:dashboard": "bun run ./scripts/build/dashboard.ts",
|
|
"db:gen": "cd src/databases/officer_db && bun run generate",
|
|
"db:push": "bun run scripts/gen-plugin-schemas.ts && cd src/databases/officer_db && bun run push",
|
|
"postdb:push": "bun run --env-file=.env scripts/backfill-session-models.ts",
|
|
"db:migrate": "cd src/databases/officer_db && bun run migrate",
|
|
"dev:emailer": "cd src/workspaces/emailer && bun run dev",
|
|
"format": "{ git diff --name-only HEAD -- 'src/**/*.ts' 'src/**/*.tsx'; git ls-files --others --exclude-standard -- 'src/**/*.ts' 'src/**/*.tsx'; } | xargs -r prettier --write",
|
|
"format:all": "prettier --write \"src/**/*.{ts,tsx}\"",
|
|
"format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
|
|
"setup": "bash scripts/install.sh",
|
|
"check:theme": "bun scripts/check-theme-tokens.ts"
|
|
},
|
|
"dependencies": {
|
|
"@anthropic-ai/claude-agent-sdk": "^0.2.41",
|
|
"@bitcoinerlab/secp256k1": "1.2.0",
|
|
"@getalby/sdk": "^8.0.3",
|
|
"@hookform/resolvers": "^5.2.2",
|
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"@noble/hashes": "2.2.0",
|
|
"@noble/secp256k1": "^3.1.0",
|
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-collapsible": "^1.1.12",
|
|
"@radix-ui/react-context-menu": "^2.2.16",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-hover-card": "^1.1.15",
|
|
"@radix-ui/react-label": "^2.1.7",
|
|
"@radix-ui/react-menubar": "^1.1.16",
|
|
"@radix-ui/react-navigation-menu": "^1.2.14",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-progress": "^1.1.7",
|
|
"@radix-ui/react-radio-group": "^1.3.8",
|
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-separator": "^1.1.7",
|
|
"@radix-ui/react-slider": "^1.3.6",
|
|
"@radix-ui/react-slot": "^1.2.3",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
"@radix-ui/react-toggle": "^1.1.10",
|
|
"@radix-ui/react-toggle-group": "^1.1.11",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@react-oauth/google": "^0.13.4",
|
|
"@react-three/drei": "^10.7.7",
|
|
"@react-three/fiber": "^9.5.0",
|
|
"@scure/bip32": "^2.2.0",
|
|
"@scure/bip39": "1.6.0",
|
|
"@simplewebauthn/browser": "^13.2.2",
|
|
"@simplewebauthn/server": "^13.2.2",
|
|
"@tabler/icons-react": "^3.36.0",
|
|
"@tanstack/react-query": "^5.90.5",
|
|
"@tanstack/react-virtual": "^3.13.18",
|
|
"@tiptap/extension-text-align": "^3.15.3",
|
|
"@types/mailparser": "^3.4.6",
|
|
"@types/three": "^0.182.0",
|
|
"@typescript/native-preview": "^7.0.0-dev.20260107.1",
|
|
"@uiw/react-textarea-code-editor": "^3.1.1",
|
|
"@visual-json/core": "^0.1.1",
|
|
"@visual-json/react": "^0.1.1",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-search": "^0.16.0",
|
|
"@xterm/addon-serialize": "^0.14.0",
|
|
"@xterm/addon-unicode11": "^0.9.0",
|
|
"@xterm/addon-web-links": "^0.12.0",
|
|
"@xterm/addon-webgl": "^0.19.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"argon2": "^0.44.0",
|
|
"bech32": "2.0.0",
|
|
"bitcoinjs-lib": "6.1.5",
|
|
"bun-plugin-tailwind": "^0.1.2",
|
|
"check-password-strength": "^3.0.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"config": "workspace:*",
|
|
"cron": "^4.3.3",
|
|
"date-fns": "^4.1.0",
|
|
"definitions": "workspace:*",
|
|
"dotenv": "^17.2.3",
|
|
"drizzle-orm": "^0.45.1",
|
|
"ecpair": "3.0.1",
|
|
"emailer": "workspace:*",
|
|
"embla-carousel-react": "^8.6.0",
|
|
"googleapis": "^169.0.0",
|
|
"helpers": "workspace:*",
|
|
"hono": "^4.11.1",
|
|
"hooks": "workspace:*",
|
|
"html-to-image": "^1.11.13",
|
|
"html2canvas": "^1.4.1",
|
|
"i18n": "workspace:*",
|
|
"idb-keyval": "^6.2.2",
|
|
"imapflow": "^1.2.10",
|
|
"injector": "workspace:*",
|
|
"input-otp": "^1.4.2",
|
|
"js-beautify": "^1.15.4",
|
|
"jsqr": "^1.4.0",
|
|
"jwt-decode": "^4.0.0",
|
|
"lucide-react": "^0.562.0",
|
|
"mailparser": "^3.9.3",
|
|
"maplibre-gl": "^5.24.0",
|
|
"markdown-it": "^14.1.0",
|
|
"material-file-icons": "^2.4.0",
|
|
"monaco-editor": "^0.55.1",
|
|
"next-themes": "^0.4.6",
|
|
"node-pty": "^1.1.0",
|
|
"nodemailer": "^7.0.12",
|
|
"officerdb": "workspace:*",
|
|
"officerdev": "workspace:*",
|
|
"pg": "^8.16.3",
|
|
"postgres": "^3.4.5",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19",
|
|
"react-countup": "^6.5.3",
|
|
"react-day-picker": "^9.13.0",
|
|
"react-dom": "^19",
|
|
"react-hook-form": "^7.69.0",
|
|
"react-markdown": "^10.1.0",
|
|
"react-router": "^7.11.0",
|
|
"react-spinners": "^0.17.0",
|
|
"recharts": "3.6.0",
|
|
"redis": "^5.8.3",
|
|
"rehype-raw": "^7.0.0",
|
|
"rehype-sanitize": "^6.0.0",
|
|
"rehype-slug": "^6.0.0",
|
|
"remark-gfm": "^4.0.1",
|
|
"shiki": "^3.22.0",
|
|
"sonner": "^2.0.7",
|
|
"sounds": "workspace:*",
|
|
"state": "workspace:*",
|
|
"tailwind-merge": "^3.3.1",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"theme": "workspace:*",
|
|
"three": "^0.182.0",
|
|
"types": "workspace:*",
|
|
"varuint-bitcoin": "^2.0.0",
|
|
"vaul": "^1.1.2",
|
|
"widgets": "workspace:*",
|
|
"workspaces": "workspace:*",
|
|
"ws": "^8.18.1",
|
|
"zod": "^4.2.1"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.57.0",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/bun": "1.3.5",
|
|
"@types/chrome": "^0.1.36",
|
|
"@types/markdown-it": "^14.1.2",
|
|
"@types/node-telegram-bot-api": "^0.64.14",
|
|
"@types/nodemailer": "^7.0.5",
|
|
"@types/pg": "^8.15.5",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"drizzle-kit": "^0.31.8",
|
|
"happy-dom": "^20.3.7",
|
|
"playwright": "^1.57.0",
|
|
"prettier": "^3.6.2",
|
|
"tailwindcss": "^4.1.11",
|
|
"tsx": "^4.20.6",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.9.3",
|
|
"vite": "^7.3.0",
|
|
"vite-plugin-compression": "^0.5.1"
|
|
}
|
|
}
|