makefx 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,62 +1,34 @@
1
- # Make Effects
1
+ # makefx
2
2
 
3
- Make Effects is an AI media production workspace at
4
- [makefx.app](https://makefx.app) where people and agents can generate, refine,
5
- track, and hand off production assets across images, audio, and video.
3
+ Command-line interface for [Make Effects](https://makefx.app), an AI media
4
+ production workspace for game assets, production references, and handoff files.
6
5
 
7
- The hosted app is the source of truth for spaces, assets, variants, prompts,
8
- recipes, lineage, collaboration state, and stored media. The `makefx` CLI lets
9
- local agents, scripts, and developers drive that same production graph from the
10
- command line: start generation jobs, watch progress, download outputs, inspect
11
- results, curate variants, and export production handoff data.
6
+ `makefx` lets local developers, scripts, and coding agents create and manage
7
+ website-backed assets from the terminal: generate images, audio, and video;
8
+ upload local media; inspect variants; download outputs; watch real-time space
9
+ events; and export production records.
12
10
 
13
- ## What You Can Build With It
14
-
15
- - Generate images, audio, and video through website-backed jobs.
16
- - Track every result as an asset variant with prompt, provider metadata, and
17
- lineage.
18
- - Refine an existing variant or derive new assets from references.
19
- - Upload local media into a collaborative space so generated and hand-made
20
- assets live together.
21
- - Let automation agents use the CLI as a stable control surface instead of
22
- touching database or storage internals.
23
- - Export production records for downstream render, game, or editorial tools.
24
-
25
- ## Features
26
-
27
- - **Authentication**: Google OAuth with JWT tokens, OIDC-compliant
28
- - **Dual-Worker Architecture**: Separate workers for HTTP/frontend and media generation
29
- - **React 19 Frontend**: Vite, TanStack Router, Zustand, CSS Modules
30
- - **D1 Database**: SQLite with migrations and Kysely query builder
31
- - **R2 Media Storage**: Durable media artifacts for generated and uploaded files
32
- - **Dependency Injection**: InversifyJS for clean architecture
33
- - **Make Effects CLI**: Command-line access through the `makefx` package and command
34
- - **TypeScript**: End-to-end type safety
35
-
36
- ## CLI Quick Start
37
-
38
- Install the CLI from npm:
11
+ ## Install
39
12
 
40
13
  ```bash
41
14
  npm install -g makefx
15
+ makefx --version
42
16
  ```
43
17
 
44
- Authenticate with the hosted app:
18
+ Requirements:
45
19
 
46
- ```bash
47
- makefx login
48
- ```
20
+ - Node.js 20 or newer
21
+ - A Make Effects account at https://makefx.app
22
+
23
+ The npm package installs a bundled executable and does not declare runtime
24
+ dependencies.
49
25
 
50
- Create a space or bind an existing website space to the current directory:
26
+ ## Quick Start
51
27
 
52
28
  ```bash
29
+ makefx login
53
30
  makefx spaces create "My Game Assets" --init
54
- makefx init --space YOUR_SPACE_ID
55
- ```
56
-
57
- Generate media and download completed outputs:
58
31
 
59
- ```bash
60
32
  makefx generate "A cozy pixel-art market background" \
61
33
  --name "Market Background" \
62
34
  --type scene \
@@ -73,113 +45,133 @@ makefx video generate "A looping idle animation for a tiny robot" \
73
45
  -o video/robot-idle.mp4
74
46
  ```
75
47
 
76
- Inspect and reuse tracked results:
48
+ ## Authentication
77
49
 
78
50
  ```bash
79
- makefx assets
80
- makefx assets show ASSET_ID --json
81
- makefx assets download VARIANT_ID -o references/variant.png
82
- makefx listen --space YOUR_SPACE_ID
83
- makefx rotation --variant VARIANT_ID --config 8-directional
84
- makefx tileset "cohesive grass, path, and stone terrain tiles" --type terrain --grid 3x3
51
+ makefx login
52
+ makefx logout
85
53
  ```
86
54
 
87
- Use run manifests for debugging agent workflows:
55
+ `login` opens a browser-based sign-in flow and stores CLI credentials in the
56
+ user config directory. Credentials are separate from project bindings and are
57
+ not written into your repository.
58
+
59
+ ## Project Binding
60
+
61
+ Bind the current directory to a Make Effects space:
88
62
 
89
63
  ```bash
90
- makefx runs --debug
91
- makefx runs show --latest --debug --json
64
+ makefx init --space YOUR_SPACE_ID
92
65
  ```
93
66
 
67
+ This writes `.inventory/config.json` with the target environment and space ID.
68
+ It does not store assets, prompts, media files, provider keys, or auth tokens.
69
+ Inside an initialized project, commands can omit `--space` and `--env`.
70
+
94
71
  The CLI defaults to production at `https://makefx.app`. Use `--env stage` for
95
- staging or `--local` for a local development server.
96
-
97
- ## CLI Commands
98
-
99
- | Command | Description |
100
- |---------|-------------|
101
- | `makefx login` | Authenticate with makefx.app |
102
- | `makefx spaces` | List, view, or create collaborative spaces |
103
- | `makefx init` | Bind the current directory to a website space |
104
- | `makefx generate` | Generate a new image asset |
105
- | `makefx refine` | Refine an existing image variant |
106
- | `makefx derive` | Create a new image asset from variant IDs or local refs |
107
- | `makefx batch` | Generate multiple images and write a debug run manifest |
108
- | `makefx audio` | Generate speech, dialogue, music, or sound effects |
109
- | `makefx video` | Generate, refine, or derive video assets |
110
- | `makefx upload` | Upload local image, audio, or video files |
111
- | `makefx assets` | List, show, download, rename, delete, and set active assets |
112
- | `makefx variants` | Retry, star, rate, or delete variants |
113
- | `makefx rotation` | Generate and monitor rotation views from a completed image variant |
114
- | `makefx tileset` | Generate and monitor consistent tile sets |
115
- | `makefx listen` | Stream real-time space events |
116
- | `makefx productions` | Place, list, and export production records |
117
- | `makefx runs` | Inspect debug-only local generation manifests |
118
-
119
- See [docs/cli.md](./docs/cli.md) and
120
- [docs/cli-generation.md](./docs/cli-generation.md) for the full command guide.
121
-
122
- ## Local Development
72
+ staging, or `--local` for a local development server.
123
73
 
124
- ```bash
125
- # Install dependencies
126
- pnpm install
74
+ ## Common Workflows
75
+
76
+ Inspect and download tracked assets:
127
77
 
128
- # Set up environment
129
- cp .env.example .env
130
- # Edit .env with your Google OAuth credentials
78
+ ```bash
79
+ makefx assets
80
+ makefx assets show ASSET_ID --json
81
+ makefx assets download VARIANT_ID -o references/variant.png
82
+ ```
131
83
 
132
- # Initialize local database
133
- pnpm run db:migrate
84
+ Upload local media:
134
85
 
135
- # Start development
136
- pnpm run dev
86
+ ```bash
87
+ makefx upload hero.png --name "Hero Character" --type character
88
+ makefx upload theme.mp3 --name "Theme Music" --type audio
89
+ makefx upload cutscene.mp4 --name "Cutscene" --type video
137
90
  ```
138
91
 
139
- Access at http://localhost:3001/
92
+ Refine or derive from references:
140
93
 
141
- ## Developer Commands
94
+ ```bash
95
+ makefx refine --variant VARIANT_ID "make it evening, with warmer lights" \
96
+ -o art/market-evening.png
142
97
 
143
- | Command | Description |
144
- |---------|-------------|
145
- | `pnpm run dev` | Start local development (frontend + worker) |
146
- | `pnpm run build:cli` | Build `dist/cli/makefx.mjs` |
147
- | `pnpm run cli:dev -- --help` | Run the CLI from TypeScript sources |
148
- | `pnpm run db:migrate` | Apply database migrations locally |
149
- | `pnpm test` | Run tests |
150
- | `pnpm run typecheck` | TypeScript type checking |
151
- | `pnpm run lint` | ESLint |
152
- | `pnpm run deploy:stage` | Deploy to stage environment |
153
- | `pnpm run deploy:production` | Deploy to production |
98
+ makefx derive \
99
+ --refs CHARACTER_VARIANT_ID,BACKGROUND_VARIANT_ID \
100
+ --name "Hero In Market" \
101
+ --type scene \
102
+ "Place the hero naturally in the market" \
103
+ -o art/hero-market.png
104
+ ```
154
105
 
155
- ## Project Structure
106
+ Create production helpers:
156
107
 
108
+ ```bash
109
+ makefx rotation --variant VARIANT_ID --config 8-directional
110
+ makefx tileset "grass and stone path tiles" --type terrain --grid 3x3
111
+ makefx productions export --production-id trailer-01 -o handoff/scenes.args
157
112
  ```
158
- src/
159
- ├── backend/ # API routes, services, middleware
160
- ├── frontend/ # React application
161
- ├── dao/ # Data access layer
162
- ├── db/migrations/ # SQL migrations
163
- ├── cli/ # CLI tool
164
- └── worker/ # Cloudflare Worker entry points
113
+
114
+ Watch real-time space activity:
115
+
116
+ ```bash
117
+ makefx listen --space YOUR_SPACE_ID
118
+ makefx listen --space YOUR_SPACE_ID --json
165
119
  ```
166
120
 
167
- ## Documentation
121
+ ## Agent And Script Usage
168
122
 
169
- - [docs/cli.md](./docs/cli.md) - complete CLI reference
170
- - [docs/cli-generation.md](./docs/cli-generation.md) - agent-oriented media generation flows
171
- - [docs/architecture.md](./docs/architecture.md) - system architecture
172
- - [PRD.md](./PRD.md) - product requirements and core concepts
123
+ Many commands support `--json` for stable machine-readable output. Use JSON
124
+ outputs for automation instead of parsing human-readable tables.
173
125
 
174
- ## Tech Stack
126
+ ```bash
127
+ makefx spaces create "Agent Test Space" --init --json
128
+ makefx assets --json
129
+ makefx runs show --latest --debug --json
130
+ ```
175
131
 
176
- - **Runtime**: Cloudflare Workers
177
- - **Database**: Cloudflare D1 (SQLite)
178
- - **Frontend**: React 19, Vite, Zustand
179
- - **Backend**: Hono, InversifyJS, Kysely
180
- - **Auth**: Google OAuth, JWT (jose)
181
- - **Testing**: Node.js test runner
132
+ Debug run manifests are local troubleshooting traces for generation commands:
182
133
 
183
- ## License
134
+ ```bash
135
+ makefx runs --debug
136
+ makefx runs show --latest --debug
137
+ ```
184
138
 
185
- MIT
139
+ The website remains the source of truth for spaces, assets, variants, recipes,
140
+ lineage, and stored media.
141
+
142
+ ## Command Groups
143
+
144
+ | Command | Purpose |
145
+ |---------|---------|
146
+ | `login`, `logout` | Manage CLI authentication |
147
+ | `spaces`, `init` | Create spaces and bind local projects |
148
+ | `generate`, `refine`, `derive`, `batch` | Generate image assets |
149
+ | `audio` | Generate speech, dialogue, music, and sound effects |
150
+ | `video` | Generate, refine, and derive video assets |
151
+ | `upload` | Upload local image, audio, or video files |
152
+ | `assets`, `variants` | Inspect, download, curate, retry, or delete outputs |
153
+ | `rotation`, `tileset` | Generate game-ready reference sets |
154
+ | `productions` | Place and export production handoff records |
155
+ | `listen` | Stream real-time space events |
156
+ | `runs` | Inspect local debug manifests |
157
+ | `billing` | Inspect billing sync and operational status |
158
+
159
+ Run `makefx --help` or `makefx help <command>` for command-specific options.
160
+
161
+ ## Troubleshooting
162
+
163
+ - If a command says you are not authenticated, run `makefx login`.
164
+ - If a command cannot find a space, run `makefx init --space YOUR_SPACE_ID` or
165
+ pass `--space YOUR_SPACE_ID`.
166
+ - If a generation command times out after creating a variant, resume with
167
+ `--follow VARIANT_ID` and the same output path.
168
+ - If automation needs stable output, add `--json` where supported.
169
+
170
+ ## Links
171
+
172
+ - App: https://makefx.app
173
+ - CLI docs: https://makefx.app/docs/cli
174
+ - Media generation guide: https://makefx.app/docs/media-playbooks
175
+ - Source: https://github.com/krasnoperov/inventory
176
+
177
+ Version: 0.1.1
@@ -488,6 +488,9 @@ async function handleBilling(parsed) {
488
488
  case "ops-check":
489
489
  await handleBillingOpsCheck(env);
490
490
  break;
491
+ case "reconcile":
492
+ await handleBillingReconcile(env, parsed);
493
+ break;
491
494
  case "retry":
492
495
  case "retry-failed":
493
496
  await handleBillingRetry(env);
@@ -510,6 +513,7 @@ Usage:
510
513
  Subcommands:
511
514
  status Show sync status (pending, failed, synced events)
512
515
  check Run operational checks for workers, Polar meters, and sync health
516
+ reconcile Compare local billable usage with Polar usage for one user
513
517
  retry-failed Reset failed events for retry (next cron will sync them)
514
518
 
515
519
  Options:
@@ -520,6 +524,7 @@ Examples:
520
524
  makefx billing status Show production sync status
521
525
  makefx billing status --env stage Show stage sync status
522
526
  makefx billing check Run production operational checks
527
+ makefx billing reconcile --user-id 42 Reconcile one customer usage period
523
528
  makefx billing retry-failed Reset failed events for retry
524
529
 
525
530
  Note: Requires login first. Run 'makefx login' to authenticate.
@@ -656,15 +661,35 @@ function secondsSummary(seconds) {
656
661
  }
657
662
  async function handleBillingOpsCheck(env) {
658
663
  console.log(`Running billing operational checks for ${env}...\n`);
659
- const [workerChecks, billingChecks] = await Promise.all([checkWorkerHealth(env), callBillingApi(env, "/api/billing/operational-checks")]);
664
+ const workerChecks = await checkWorkerHealth(env);
660
665
  console.log("=== Billing Operational Checks ===\n");
661
666
  console.log("Workers:");
662
667
  for (const check of workerChecks) console.log(` ${statusLabel(check.status)} ${check.name.padEnd(12)} ${check.message}`);
668
+ let billingChecks;
669
+ try {
670
+ billingChecks = await callBillingApi(env, "/api/billing/operational-checks");
671
+ } catch (error) {
672
+ console.log("\nAuthenticated billing checks:");
673
+ console.log(` ${statusLabel("critical")} ${error instanceof Error ? error.message : String(error)}`);
674
+ console.log("\nResult: CRITICAL - billing checks need an authenticated admin session.");
675
+ process$1.exitCode = 1;
676
+ return;
677
+ }
663
678
  const meterCheck = billingChecks.checks.polarMeters;
664
679
  console.log("\nPolar meters:");
665
680
  console.log(` ${statusLabel(meterCheck.status)} configured=${meterCheck.configured} active=${meterCheck.active.length} expected=${meterCheck.expected.length}`);
666
681
  if (meterCheck.error) console.log(` Error: ${meterCheck.error}`);
667
682
  if (meterCheck.missing.length > 0) console.log(` Missing: ${meterCheck.missing.join(", ")}`);
683
+ if (meterCheck.invalid.length > 0) console.log(` Invalid: ${meterCheck.invalid.map((meter) => meter.name).join(", ")}`);
684
+ const productCheck = billingChecks.checks.paidGenerationProduct;
685
+ if (productCheck) {
686
+ console.log("\nPaid generation product:");
687
+ const product = productCheck.product;
688
+ console.log(` ${statusLabel(productCheck.status)} configured=${product?.configured ?? false} recurring=${product?.isRecurring ?? "n/a"} archived=${product?.isArchived ?? "n/a"}`);
689
+ if (product?.productId) console.log(` Product: ${product.productId}${product.name ? ` (${product.name})` : ""}`);
690
+ console.log(` Metered prices: ${product?.meteredPriceMeters.length ?? 0}/${productCheck.expectedMeteredPriceMeters.length}`);
691
+ if (productCheck.missingMeteredPriceMeters.length > 0) console.log(` Missing metered prices: ${productCheck.missingMeteredPriceMeters.join(", ")}`);
692
+ }
668
693
  const syncCheck = billingChecks.checks.syncHealth;
669
694
  console.log("\nSync health:");
670
695
  console.log(` ${statusLabel(syncCheck.status)} pending=${syncCheck.events.pending} failed=${syncCheck.events.failed} synced=${syncCheck.events.synced}`);
@@ -677,11 +702,38 @@ async function handleBillingOpsCheck(env) {
677
702
  const hasCriticalBilling = billingChecks.status === "critical";
678
703
  const hasWarning = workerChecks.some((check) => check.status === "warning") || billingChecks.status === "warning";
679
704
  if (hasCriticalWorker || hasCriticalBilling) {
680
- console.log("\nResult: CRITICAL - production billing operations need attention.");
705
+ console.log("\nResult: CRITICAL - billing operations need attention.");
681
706
  process$1.exitCode = 1;
682
707
  } else if (hasWarning) console.log("\nResult: WARNING - billing is operational but has lag or cleanup work.");
683
708
  else console.log("\nResult: OK - billing workers, meters, and sync health are ready.");
684
709
  }
710
+ async function handleBillingReconcile(env, parsed) {
711
+ const userId = parsed.options["user-id"] || parsed.options.userId || parsed.positionals[1];
712
+ if (!userId) {
713
+ console.error("Missing user id. Use: makefx billing reconcile --user-id <id>");
714
+ process$1.exitCode = 1;
715
+ return;
716
+ }
717
+ console.log(`Reconciling billing usage for user ${userId} in ${env}...\n`);
718
+ try {
719
+ const data = await callBillingApi(env, `/api/billing/reconcile?user_id=${encodeURIComponent(userId)}`);
720
+ console.log("=== Billing Reconciliation ===\n");
721
+ console.log(`Period: ${data.period.start} → ${data.period.end}`);
722
+ console.log(`Status: ${data.status.toUpperCase()}`);
723
+ console.log("\nMeters:");
724
+ for (const meter of data.meters) {
725
+ const marker = meter.matched ? "OK " : "MISMATCH";
726
+ console.log(` ${marker} ${meter.name.padEnd(22)} local=${meter.local} polar=${meter.polar} delta=${meter.delta}`);
727
+ }
728
+ if (data.mismatches.length > 0) {
729
+ console.log("\nMismatched meters need sync/retry investigation before billing is considered reconciled.");
730
+ process$1.exitCode = 1;
731
+ }
732
+ } catch (error) {
733
+ console.error("Reconciliation failed:", error instanceof Error ? error.message : error);
734
+ process$1.exitCode = 1;
735
+ }
736
+ }
685
737
  async function handleBillingRetry(env) {
686
738
  console.log(`Resetting failed events for ${env}...\n`);
687
739
  try {
@@ -23513,7 +23565,7 @@ Options:
23513
23565
  }
23514
23566
  //#endregion
23515
23567
  //#region src/cli/index.ts
23516
- var CLI_VERSION = "0.1.0+8fe959ed0b7b";
23568
+ var CLI_VERSION = "0.1.1+fe5390f9d193";
23517
23569
  async function main() {
23518
23570
  const [, , command, ...args] = process$1.argv;
23519
23571
  if (command === "--version" || command === "version") {
@@ -23702,6 +23754,8 @@ Project:
23702
23754
  Billing (Polar.sh):
23703
23755
  billing status Show sync status (pending, failed, synced events)
23704
23756
  billing check Run operational checks for workers, meters, and sync health
23757
+ billing reconcile --user-id <id>
23758
+ Compare local billable usage with Polar usage
23705
23759
  billing retry-failed Retry all failed events
23706
23760
 
23707
23761
  Spaces:
@@ -23800,6 +23854,7 @@ Usage:
23800
23854
  Subcommands:
23801
23855
  status Show sync status (pending, failed, synced events)
23802
23856
  check Run operational checks for workers, Polar meters, and sync health
23857
+ reconcile Compare local billable usage with Polar usage for one user
23803
23858
  retry-failed Reset failed events for retry (next cron will sync them)
23804
23859
 
23805
23860
  Options:
package/package.json CHANGED
@@ -1,111 +1,25 @@
1
1
  {
2
2
  "name": "makefx",
3
- "version": "0.1.0",
4
- "description": "Make Effects CLI and Cloudflare app for AI-assisted game asset production.",
3
+ "version": "0.1.1",
4
+ "description": "Command-line interface for AI-assisted game asset production with Make Effects.",
5
+ "license": "MIT",
5
6
  "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/krasnoperov/inventory.git"
10
+ },
6
11
  "bin": {
7
- "makefx": "dist/cli/makefx.mjs"
12
+ "makefx": "./makefx.mjs"
8
13
  },
9
14
  "files": [
10
- "dist/cli/makefx.mjs",
15
+ "makefx.mjs",
11
16
  "README.md"
12
17
  ],
18
+ "engines": {
19
+ "node": ">=20"
20
+ },
21
+ "dependencies": {},
13
22
  "publishConfig": {
14
23
  "access": "public"
15
- },
16
- "packageManager": "pnpm@11.1.1",
17
- "scripts": {
18
- "bootstrap:worktree": "node ./scripts/bootstrap-worktree.mjs",
19
- "dev": "CLOUDFLARE_VITE_CONFIG_PATH=wrangler.dev.toml vite",
20
- "build": "vite build && pnpm run package:frontend-start && pnpm run build:cli",
21
- "package:frontend-start": "node scripts/package-frontend-start.mjs",
22
- "build:cli": "node scripts/build-cli.mjs",
23
- "deploy": "pnpm run build && pnpm exec wrangler deploy",
24
- "deploy:production": "CLOUDFLARE_ENV=production pnpm run build && pnpm exec wrangler deploy --env production",
25
- "deploy:stage": "pnpm run build && pnpm exec wrangler deploy",
26
- "test": "node ./scripts/run-node-tests.mjs",
27
- "test:components": "playwright test --config playwright.component.config.ts",
28
- "test:components:ci": "node ./scripts/run-component-ci.mjs",
29
- "test:e2e:media-foundation": "pnpm run build && node scripts/e2e-media-foundation.mjs",
30
- "test:e2e:cli-forge": "pnpm run build && node scripts/e2e-cli-forge.mjs",
31
- "auth:session-state": "node scripts/auth/mint-session.mjs",
32
- "lint": "oxlint --config .oxlintrc.json src scripts && pnpm d1:guard && pnpm lint:tokens",
33
- "lint:tokens": "pnpm tokens:guard && pnpm tokens:snapshot:check && pnpm tokens:roundtrip",
34
- "tokens:guard": "node scripts/check-design-tokens.mjs",
35
- "tokens:snapshot": "node scripts/snapshot-design-tokens.mjs",
36
- "tokens:snapshot:check": "node scripts/snapshot-design-tokens.mjs --check",
37
- "tokens:roundtrip": "node scripts/generate-css-from-tokens.mjs --check",
38
- "d1:guard": "node scripts/check-no-d1-transactions.mjs",
39
- "typecheck": "tsc --noEmit",
40
- "ci:pre-push": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm test --test-reporter=dot && pnpm run test:components:ci",
41
- "db:migrate": "node --import @swc-node/register/esm-register scripts/db-migrate.ts",
42
- "db:migrate:stage": "node --import @swc-node/register/esm-register scripts/db-migrate.ts stage remote",
43
- "db:migrate:production": "node --import @swc-node/register/esm-register scripts/db-migrate.ts production remote",
44
- "cli": "node dist/cli/makefx.mjs",
45
- "cli:dev": "node --import @swc-node/register/esm-register src/cli/index.ts",
46
- "stories": "LADLE=true ladle serve",
47
- "stories:build": "LADLE=true ladle build",
48
- "style-reference": "node scripts/export-style-reference.mjs",
49
- "style-reference:rebuild": "node scripts/export-style-reference.mjs --rebuild"
50
- },
51
- "dependencies": {
52
- "@anthropic-ai/sdk": "^0.71.0",
53
- "@google/genai": "^1.30.0",
54
- "@hono/zod-openapi": "^1.4.0",
55
- "@openai/agents": "^0.3.3",
56
- "@polar-sh/sdk": "^0.41.5",
57
- "@react-oauth/google": "^0.12.2",
58
- "@tanstack/react-query": "^5.90.11",
59
- "@tanstack/react-router": "^1.170.15",
60
- "@tanstack/react-start": "^1.168.25",
61
- "@types/d3-force": "^3.0.10",
62
- "@types/dagre": "^0.7.53",
63
- "@xyflow/react": "^12.9.3",
64
- "better-sqlite3": "^12.4.6",
65
- "d3-force": "^3.0.0",
66
- "dagre": "^0.8.5",
67
- "dotenv": "^17.2.3",
68
- "fflate": "^0.8.2",
69
- "hono": "^4.10.6",
70
- "inversify": "^7.10.4",
71
- "jose": "^6.1.2",
72
- "kysely": "^0.28.8",
73
- "kysely-d1": "^0.4.0",
74
- "nanoid": "^5.1.11",
75
- "react": "^19.2.0",
76
- "react-dom": "^19.2.0",
77
- "react-markdown": "^10.1.0",
78
- "reflect-metadata": "^0.2.2",
79
- "remark-gfm": "^4.0.1",
80
- "standardwebhooks": "1.0.0",
81
- "uuid": "^13.0.0",
82
- "ws": "^8.21.0",
83
- "zod": "^4.4.3",
84
- "zustand": "^5.0.8"
85
- },
86
- "devDependencies": {
87
- "@cloudflare/ai": "^1.2.2",
88
- "@cloudflare/vite-plugin": "^1.39.0",
89
- "@cloudflare/workers-types": "4.20260317.1",
90
- "@csstools/postcss-light-dark-function": "^3.0.0",
91
- "@ladle/react": "^5.1.1",
92
- "@playwright/test": "^1.59.1",
93
- "@swc-node/register": "^1.11.1",
94
- "@tanstack/router-plugin": "^1.168.18",
95
- "@types/better-sqlite3": "^7.6.13",
96
- "@types/node": "^24.10.1",
97
- "@types/react": "^19.2.7",
98
- "@types/react-dom": "^19.2.3",
99
- "@types/ws": "^8.18.1",
100
- "@vitejs/plugin-react": "^5.1.1",
101
- "express": "^5.1.0",
102
- "oxlint": "1.67.0",
103
- "postcss": "^8.5.6",
104
- "postcss-preset-env": "^10.4.0",
105
- "prettier": "^3.6.2",
106
- "rollup-plugin-visualizer": "^6.0.5",
107
- "typescript": "^5.9.3",
108
- "vite": "^8.0.14",
109
- "wrangler": "4.95.0"
110
24
  }
111
25
  }