From 1b92c8faf73951f05cb25d639852593351ab9689 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Mon, 5 Jan 2026 22:48:49 -0700 Subject: [PATCH 1/7] fix: clear tool output and attachments when pruning to prevent memory leak When compaction prunes old tool outputs, only the compacted timestamp was being set - the actual output string and attachments array remained in storage indefinitely. This caused storage files to grow unbounded with large tool outputs (file contents, base64 images/PDFs, etc.). Now prune() clears both output and attachments when marking parts as compacted. The toModelMessage function already replaces compacted outputs with placeholder text, so this is safe. Fixes part of #4315 --- packages/opencode/src/session/compaction.ts | 4 + .../opencode/test/session/compaction.test.ts | 147 ++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 42bab2eb975..39a2f12a7f0 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -82,6 +82,10 @@ export namespace SessionCompaction { for (const part of toPrune) { if (part.state.status === "completed") { part.state.time.compacted = Date.now() + // Clear output and attachments to free memory - these are replaced with + // placeholder text in toModelMessage when compacted flag is set + part.state.output = "" + part.state.attachments = undefined await Session.updatePart(part) } } diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts index 9070428ea54..84c7187be9d 100644 --- a/packages/opencode/test/session/compaction.test.ts +++ b/packages/opencode/test/session/compaction.test.ts @@ -6,6 +6,8 @@ import { Instance } from "../../src/project/instance" import { Log } from "../../src/util/log" import { tmpdir } from "../fixture/fixture" import { Session } from "../../src/session" +import { MessageV2 } from "../../src/session/message-v2" +import { Identifier } from "../../src/id/id" import type { Provider } from "../../src/provider/provider" Log.init({ print: false }) @@ -249,3 +251,148 @@ describe("session.getUsage", () => { expect(result.cost).toBe(3 + 1.5) }) }) + +describe("session.compaction.prune", () => { + test("clears output and attachments when pruning tool parts", async () => { + await using tmp = await tmpdir({ git: true }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + // Create a session + const session = await Session.create({}) + + // Create user messages with turns to get past the initial protection + const userMsg1 = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() - 10000 }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + + // Create an assistant message with a completed tool part containing large output + const assistantMsg1 = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "assistant", + parentID: userMsg1.id, + sessionID: session.id, + mode: "normal", + agent: "coder", + path: { cwd: tmp.path, root: tmp.path }, + cost: 0, + tokens: { output: 0, input: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: "test-model", + providerID: "test", + time: { created: Date.now() - 9000 }, + }) + + // Create large output to exceed PRUNE_PROTECT (40,000 tokens = 160,000 chars) + const largeOutput = "x".repeat(200_000) + const toolPart = await Session.updatePart({ + id: Identifier.ascending("part"), + messageID: assistantMsg1.id, + sessionID: session.id, + type: "tool", + callID: "call-1", + tool: "read", + state: { + status: "completed", + input: { path: "/test/file.ts" }, + output: largeOutput, + title: "Read file", + metadata: {}, + time: { start: Date.now() - 8000, end: Date.now() - 7000 }, + attachments: [ + { + id: Identifier.ascending("part"), + messageID: assistantMsg1.id, + sessionID: session.id, + type: "file", + mime: "image/png", + filename: "screenshot.png", + url: "data:image/png;base64," + "A".repeat(50000), + }, + ], + }, + } as MessageV2.ToolPart) + + // Create a second user message (turn 2) + const userMsg2 = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() - 5000 }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + + // Create a third user message (turn 3) to get past the turn protection + const userMsg3 = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + + // Verify initial state - output and attachments exist + const initialParts = await MessageV2.parts(assistantMsg1.id) + const initialToolPart = initialParts.find((p) => p.type === "tool") as MessageV2.ToolPart + expect(initialToolPart.state.status).toBe("completed") + if (initialToolPart.state.status === "completed") { + expect(initialToolPart.state.output.length).toBe(200_000) + expect(initialToolPart.state.attachments?.length).toBe(1) + } + + // Run prune + await SessionCompaction.prune({ sessionID: session.id }) + + // Verify output and attachments are cleared + const prunedParts = await MessageV2.parts(assistantMsg1.id) + const prunedToolPart = prunedParts.find((p) => p.type === "tool") as MessageV2.ToolPart + expect(prunedToolPart.state.status).toBe("completed") + if (prunedToolPart.state.status === "completed") { + expect(prunedToolPart.state.output).toBe("") + expect(prunedToolPart.state.attachments).toBeUndefined() + expect(prunedToolPart.state.time.compacted).toBeDefined() + } + + // Cleanup + await Session.remove(session.id) + }, + }) + }) + + test("does not prune when prune config is disabled", async () => { + await using tmp = await tmpdir({ + git: true, + init: async (dir) => { + await Bun.write(path.join(dir, "opencode.json"), JSON.stringify({ compaction: { prune: false } })) + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const session = await Session.create({}) + + // Create minimal messages to run prune + const userMsg = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + + // Run prune - should return early due to config + await SessionCompaction.prune({ sessionID: session.id }) + + // Cleanup + await Session.remove(session.id) + }, + }) + }) +}) From 718df0864dccec874e125658c4a26d875bf7b8ba Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Mon, 5 Jan 2026 23:07:42 -0700 Subject: [PATCH 2/7] address PR review comments: remove unused variables and add assertions to pruning disabled test --- .../opencode/test/session/compaction.test.ts | 84 +++++++++++++++++-- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts index 84c7187be9d..3ca8b2e0844 100644 --- a/packages/opencode/test/session/compaction.test.ts +++ b/packages/opencode/test/session/compaction.test.ts @@ -289,7 +289,7 @@ describe("session.compaction.prune", () => { // Create large output to exceed PRUNE_PROTECT (40,000 tokens = 160,000 chars) const largeOutput = "x".repeat(200_000) - const toolPart = await Session.updatePart({ + await Session.updatePart({ id: Identifier.ascending("part"), messageID: assistantMsg1.id, sessionID: session.id, @@ -318,7 +318,7 @@ describe("session.compaction.prune", () => { } as MessageV2.ToolPart) // Create a second user message (turn 2) - const userMsg2 = await Session.updateMessage({ + await Session.updateMessage({ id: Identifier.ascending("message"), role: "user", sessionID: session.id, @@ -328,7 +328,7 @@ describe("session.compaction.prune", () => { }) // Create a third user message (turn 3) to get past the turn protection - const userMsg3 = await Session.updateMessage({ + await Session.updateMessage({ id: Identifier.ascending("message"), role: "user", sessionID: session.id, @@ -377,8 +377,72 @@ describe("session.compaction.prune", () => { fn: async () => { const session = await Session.create({}) - // Create minimal messages to run prune - const userMsg = await Session.updateMessage({ + // Create user message + const userMsg1 = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() - 10000 }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + + // Create an assistant message with a tool part containing large output + const assistantMsg = await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "assistant", + parentID: userMsg1.id, + sessionID: session.id, + mode: "normal", + agent: "coder", + path: { cwd: tmp.path, root: tmp.path }, + cost: 0, + tokens: { output: 0, input: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: "test-model", + providerID: "test", + time: { created: Date.now() - 9000 }, + }) + + // Create large output + const largeOutput = "x".repeat(200_000) + await Session.updatePart({ + id: Identifier.ascending("part"), + messageID: assistantMsg.id, + sessionID: session.id, + type: "tool", + callID: "call-1", + tool: "read", + state: { + status: "completed", + input: { path: "/test/file.ts" }, + output: largeOutput, + title: "Read file", + metadata: {}, + time: { start: Date.now() - 8000, end: Date.now() - 7000 }, + attachments: [ + { + id: Identifier.ascending("part"), + messageID: assistantMsg.id, + sessionID: session.id, + type: "file", + mime: "image/png", + filename: "screenshot.png", + url: "data:image/png;base64," + "A".repeat(50000), + }, + ], + }, + } as MessageV2.ToolPart) + + // Create additional user messages to get past turn protection + await Session.updateMessage({ + id: Identifier.ascending("message"), + role: "user", + sessionID: session.id, + time: { created: Date.now() - 5000 }, + agent: "coder", + model: { providerID: "test", modelID: "test-model" }, + }) + await Session.updateMessage({ id: Identifier.ascending("message"), role: "user", sessionID: session.id, @@ -390,6 +454,16 @@ describe("session.compaction.prune", () => { // Run prune - should return early due to config await SessionCompaction.prune({ sessionID: session.id }) + // Verify output and attachments remain unchanged (not compacted) + const parts = await MessageV2.parts(assistantMsg.id) + const toolPart = parts.find((p) => p.type === "tool") as MessageV2.ToolPart + expect(toolPart.state.status).toBe("completed") + if (toolPart.state.status === "completed") { + expect(toolPart.state.output.length).toBe(200_000) + expect(toolPart.state.attachments?.length).toBe(1) + expect(toolPart.state.time.compacted).toBeUndefined() + } + // Cleanup await Session.remove(session.id) }, From b302472617e7024bc07273600d8e0186eb2ca3e9 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 8 Jan 2026 19:24:20 -0500 Subject: [PATCH 3/7] wip: zen --- packages/console/core/script/batch-onboard.ts | 91 +++++++++++++++++++ packages/console/core/script/lookup-user.ts | 74 +++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 packages/console/core/script/batch-onboard.ts diff --git a/packages/console/core/script/batch-onboard.ts b/packages/console/core/script/batch-onboard.ts new file mode 100644 index 00000000000..a1a2cf50f31 --- /dev/null +++ b/packages/console/core/script/batch-onboard.ts @@ -0,0 +1,91 @@ +#!/usr/bin/env bun +import { $ } from "bun" + +async function done() { + await $`bun script/onboard-zen-black.ts wrk_01KBDW4XQQA03M9WRVG13WC4KV johnnymiranda@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KB09PA9KRGNWQC6SAPDK72FC chris@nuwavecommerce.com` + await $`bun script/onboard-zen-black.ts wrk_01KD47Y1TV6H25TH4FE8J9Z96C coniferconcepts@protonmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K5PBX9DTMVWYWSQN825PX5JD ccptmd@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJ5W695YB7QXYBF17JGE3K synhex@proton.me` + await $`bun script/onboard-zen-black.ts wrk_01KDQ5A7D4E1XZ67NKTWX6PQQY joel97montano@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K6VZ9R6Q85G86KP99WJJFNCS gpstrucha@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KD75TGR57YJPSFWDBZ4WVTMW velazcod@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KDRG9HBMQCXPPV5TTMPKMKR2 scott@scopestar.com` + await $`bun script/onboard-zen-black.ts wrk_01K6KZNC7FHJ3RF989Y22EFFK2 andrew.rentschler@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K59FHPX0GR51YQG2CT9DAF5M rtorresware@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJAFSJ3SA52EENSGGWY7K3 connorksmith@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K5M7F0S3G93MJNBG6DG8THAE williamtracyadams@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K4CPKRNP4CWK2D5BYKMMKTXQ christoph@schmatzler.com` + await $`bun script/onboard-zen-black.ts wrk_01K5GYKMHJG6G172D944MCDJ70 fabian.rodrez@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KD4Q2FAT1465AYQPY03R82JG kylep91@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K5HFPPJ67MZSEE8AAMHECR1Q michael@mabbott.dev` + await $`bun script/onboard-zen-black.ts wrk_01KAE92ACV5AEQ2QJ173W26CTF sam_roehrich@icloud.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJ4BZKCFKWDTJN95X8BBSN roee@bellum.dev` + await $`bun script/onboard-zen-black.ts wrk_01KEAFNZA1T20QY91FZPBWM2ED hendrik@mans.de` + await $`bun script/onboard-zen-black.ts wrk_01KD85CQXVH5G390J8Z69NQ01G rob@anchorwatch.com` + await $`bun script/onboard-zen-black.ts wrk_01KE7XH09S7KJ5F6SW9QQ4YZQ3 seangherardi@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KDGJQSKFXMW9YWWB2SDW4D2C magimetal@pm.me` + await $`bun script/onboard-zen-black.ts wrk_01KCCP5C49JZS4HSRBX7XJX25P matthijswolting@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K4DHK0YHZ40B7QWA5T9QD5CM faisal@hulayyil.com` + await $`bun script/onboard-zen-black.ts wrk_01K59KJHXBJYJ5D7NMKVEBQK12 redwood.cogent5b@icloud.com` + await $`bun script/onboard-zen-black.ts wrk_01K58NJXNDYCMN6MZAH5GBA2V9 mail@wobbat.com` + await $`bun script/onboard-zen-black.ts wrk_01K6AR1ZET89H8NB691FQ2C2VB anthony.kroe@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K6ZMFSTFYWPACV2QNFAVBBVC torbjon@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K5HX50C744YRF5MFJVCQ5784 rishabh@getgale.app` + await $`bun script/onboard-zen-black.ts wrk_01K5AXKDXK6P705ZE1RGJ54DJG skastr052@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJ5PXJDMAW7VDB223J6VED jason.larsen@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KC2QDEGSR07GZ18A5FHV68K4 jeremy@thegollys.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAE40B947397VKVY9JZPQZZ micah@waldste.in` + await $`bun script/onboard-zen-black.ts wrk_01KEAHWCP8710GEAVF8NGY2B8S sid@finchlegal.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAHW437Q6SQZBVXS480SVAX soma.eas@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAE1HJ37GY9K8YTHHE0WBDS steve@seguin.email` + await $`bun script/onboard-zen-black.ts wrk_01K48XKJA60YH8YNSHR1TAV8JB zainxwania@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KDP0E4FG325PFK0HTC9BBPNK peter.houghton@outlook.com` + await $`bun script/onboard-zen-black.ts wrk_01K7ARJD3S9DS84RXKGK7RNJ1G leventyuksel93@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEBZKFKGMXWDYHYQPE5HV2DK james@corbettonline.co.uk` + await $`bun script/onboard-zen-black.ts wrk_01K4PNZCG496059QVVN2W8BKH5 gdiaz@qswarm.com` + await $`bun script/onboard-zen-black.ts wrk_01K4CH29P0HKTRPNWFX6V3K4ZK artmore@protonmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K971RFTA2H8A181F7GV0M2KG nikita@frolov.fi` + await $`bun script/onboard-zen-black.ts wrk_01KAWXVSWGT7M0FZKRK7J96C40 jakob@endform.dev` + await $`bun script/onboard-zen-black.ts wrk_01KEBAHA1C5MD5W2N8RYEVH8B8 richlyelks@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K57NR05JNBV9FYWN8V4PE74X shahmurtaza5@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAEDXMYF8FFDRJS3129BHXZ me@tophergroenink.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJN0Q972162MCAKN5MYXV0 ajcwebdev@pm.me` + await $`bun script/onboard-zen-black.ts wrk_01KDWKNN6JVH49CNQF7Y6T77TS d.camata@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEANMCW8H8MX7NXN9QRBC2JY andrew.ds.choi@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K9DJ10EJ1JQ8QE83G2BZTCAT max@marze.dev` + await $`bun script/onboard-zen-black.ts wrk_01KEB67HYXGHSA19KKYQWANWYC ervin@canigur.com` + await $`bun script/onboard-zen-black.ts wrk_01KBMQ66RB7RYY4MBE69MYQY0J sakhnyukmikhail@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KECJH7FG2GHFK1J1MF73W63R isaac.dobbins@icloud.com` + await $`bun script/onboard-zen-black.ts wrk_01KAFPM94SV343J8SS8ESEHMYG mrkordell@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KBDKY5JHT84Y3K8G9Q4MGAX7 pirnay@deveytan.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAKBCAKKR33T3F0A33EP9W6 1mrtemeck1@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEANHV7AEMFP5RY6KWXCA1T6 github@emilebangma.com` + await $`bun script/onboard-zen-black.ts wrk_01KEARQYY8JRY2HSYX7BR5ATMY hi@henryzoo.com` + await $`bun script/onboard-zen-black.ts wrk_01K9BT5FEF19STHX5HBQGDXAD4 cameron@harderhutton.dev` + await $`bun script/onboard-zen-black.ts wrk_01K5814NN9C8MCQ3W9269GQPX1 niccholaspage@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KBR4P09M7524ME1Z250WM2XT stephen.patrick.murray@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K6JVB4J0QG979YD790XPZSSX jcummings5@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KA94MDGKNTAKB6P0B3RRCVR0 matt@eatsleeprepeat.net` + await $`bun script/onboard-zen-black.ts wrk_01KEB55FEX2ZTK13PYK3YEJSBE hello@trmcnvn.dev` + await $`bun script/onboard-zen-black.ts wrk_01K58YHW99X2T2EDPM2ZNAWM97 ashakdwipeea@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAJKB8BSAF3FQJH1MD6J1WV ben@cinematicsoftware.com` + await $`bun script/onboard-zen-black.ts wrk_01KCS98AJ0SJG6SQY845D0A7XQ ndejesus1227@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KDC8ZCR2021GEMP4G0AA4D4M cmz1023@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K59G802MEFN7AWRPM2QMP4PC chrhicks@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K4EVHWGY50JXFEAM8FT12B17 fahimanwer.08@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEA9RZT7A5K55G8EQQ2V1EWF sandro@scorp.dev` + await $`bun script/onboard-zen-black.ts wrk_01K63V94DSDX76Y21PG98M0GV1 franklin-in-mars@pm.me` + await $`bun script/onboard-zen-black.ts wrk_01KDNXT802CFWR10XSK35PWVG9 alexander.vikman@informationsgruppen.se` + await $`bun script/onboard-zen-black.ts wrk_01K7M79KFFD63S177YPY7Z1QTF me@lozanojoseph.com` + await $`bun script/onboard-zen-black.ts wrk_01KEC9ARJZ12X6CW23HKHNMTVP charlieirish@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K4M9Q5NXP6MT29W1186V0HPK foldvarszki@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K6JKWYXB7KNKWFWXFAV0PD3S johnlindquist@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K4GEQTAHZR28B76DG6F2QX2G mail@justin-vogt.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAK4F15VVPHQH8MSY0GR7XP felix@trulsson.co` + await $`bun script/onboard-zen-black.ts wrk_01K6DSE6F44YNE7AFA4PTF8JA0 jorge.villalobos2809@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAK10BVRFVN1WSXYMR3DQJM jaskyle4@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01KEAE0JEXTVCWEKKB7MAGP37W themindoverall@gmail.com` + await $`bun script/onboard-zen-black.ts wrk_01K7Q7J930ZS4P8088NBW0QTRY dpshadey22@gmail.com` // dylan.shade@hey.com + await $`bun script/onboard-zen-black.ts wrk_01KC22GWVQXVJ15B2K88YNVGJJ maxstevens2708@gmail.com` // mail@maxstevens.nl +} diff --git a/packages/console/core/script/lookup-user.ts b/packages/console/core/script/lookup-user.ts index b06fb5654c3..d671befbcf7 100644 --- a/packages/console/core/script/lookup-user.ts +++ b/packages/console/core/script/lookup-user.ts @@ -254,6 +254,80 @@ function getSubscriptionStatus(row: { } } +function formatMicroCents(value: number | null | undefined) { + if (value === null || value === undefined) return null + return `$${(value / 100000000).toFixed(2)}` +} + +function formatDate(value: Date | null | undefined) { + if (!value) return null + return value.toISOString().split("T")[0] +} + +function formatMonthlyUsage(usage: number | null | undefined, limit: number | null | undefined) { + const usageText = formatMicroCents(usage) ?? "$0.00" + if (limit === null || limit === undefined) return `${usageText} / no limit` + return `${usageText} / $${limit.toFixed(2)}` +} + +function formatRetryTime(seconds: number) { + const days = Math.floor(seconds / 86400) + if (days >= 1) return `${days} day${days > 1 ? "s" : ""}` + const hours = Math.floor(seconds / 3600) + const minutes = Math.ceil((seconds % 3600) / 60) + if (hours >= 1) return `${hours}hr ${minutes}min` + return `${minutes}min` +} + +function getSubscriptionStatus(row: { + timeSubscriptionCreated: Date | null + fixedUsage: number | null + rollingUsage: number | null + timeFixedUpdated: Date | null + timeRollingUpdated: Date | null +}) { + if (!row.timeSubscriptionCreated) { + return { weekly: null, rolling: null, rateLimited: null, retryIn: null } + } + + const black = BlackData.get() + const now = new Date() + const week = getWeekBounds(now) + + const fixedLimit = black.fixedLimit ? centsToMicroCents(black.fixedLimit * 100) : null + const rollingLimit = black.rollingLimit ? centsToMicroCents(black.rollingLimit * 100) : null + const rollingWindowMs = (black.rollingWindow ?? 5) * 3600 * 1000 + + // Calculate current weekly usage (reset if outside current week) + const currentWeekly = + row.fixedUsage && row.timeFixedUpdated && row.timeFixedUpdated >= week.start ? row.fixedUsage : 0 + + // Calculate current rolling usage + const windowStart = new Date(now.getTime() - rollingWindowMs) + const currentRolling = + row.rollingUsage && row.timeRollingUpdated && row.timeRollingUpdated >= windowStart ? row.rollingUsage : 0 + + // Check rate limiting + const isWeeklyLimited = fixedLimit !== null && currentWeekly >= fixedLimit + const isRollingLimited = rollingLimit !== null && currentRolling >= rollingLimit + + let retryIn: string | null = null + if (isWeeklyLimited) { + const retryAfter = Math.ceil((week.end.getTime() - now.getTime()) / 1000) + retryIn = formatRetryTime(retryAfter) + } else if (isRollingLimited && row.timeRollingUpdated) { + const retryAfter = Math.ceil((row.timeRollingUpdated.getTime() + rollingWindowMs - now.getTime()) / 1000) + retryIn = formatRetryTime(retryAfter) + } + + return { + weekly: fixedLimit !== null ? `${formatMicroCents(currentWeekly)} / $${black.fixedLimit}` : null, + rolling: rollingLimit !== null ? `${formatMicroCents(currentRolling)} / $${black.rollingLimit}` : null, + rateLimited: isWeeklyLimited || isRollingLimited ? "yes" : "no", + retryIn, + } +} + function printHeader(title: string) { console.log() console.log("─".repeat(title.length)) From 1b3aec7d3efecf3ea1a8ca36018e45ea5ae24c23 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 10 Jan 2026 14:15:05 -0500 Subject: [PATCH 4/7] Revert "wip: zen" This reverts commit b302472617e7024bc07273600d8e0186eb2ca3e9. --- packages/console/core/script/batch-onboard.ts | 91 ------------------- packages/console/core/script/lookup-user.ts | 74 --------------- 2 files changed, 165 deletions(-) delete mode 100644 packages/console/core/script/batch-onboard.ts diff --git a/packages/console/core/script/batch-onboard.ts b/packages/console/core/script/batch-onboard.ts deleted file mode 100644 index a1a2cf50f31..00000000000 --- a/packages/console/core/script/batch-onboard.ts +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env bun -import { $ } from "bun" - -async function done() { - await $`bun script/onboard-zen-black.ts wrk_01KBDW4XQQA03M9WRVG13WC4KV johnnymiranda@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KB09PA9KRGNWQC6SAPDK72FC chris@nuwavecommerce.com` - await $`bun script/onboard-zen-black.ts wrk_01KD47Y1TV6H25TH4FE8J9Z96C coniferconcepts@protonmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K5PBX9DTMVWYWSQN825PX5JD ccptmd@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJ5W695YB7QXYBF17JGE3K synhex@proton.me` - await $`bun script/onboard-zen-black.ts wrk_01KDQ5A7D4E1XZ67NKTWX6PQQY joel97montano@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K6VZ9R6Q85G86KP99WJJFNCS gpstrucha@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KD75TGR57YJPSFWDBZ4WVTMW velazcod@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KDRG9HBMQCXPPV5TTMPKMKR2 scott@scopestar.com` - await $`bun script/onboard-zen-black.ts wrk_01K6KZNC7FHJ3RF989Y22EFFK2 andrew.rentschler@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K59FHPX0GR51YQG2CT9DAF5M rtorresware@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJAFSJ3SA52EENSGGWY7K3 connorksmith@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K5M7F0S3G93MJNBG6DG8THAE williamtracyadams@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K4CPKRNP4CWK2D5BYKMMKTXQ christoph@schmatzler.com` - await $`bun script/onboard-zen-black.ts wrk_01K5GYKMHJG6G172D944MCDJ70 fabian.rodrez@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KD4Q2FAT1465AYQPY03R82JG kylep91@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K5HFPPJ67MZSEE8AAMHECR1Q michael@mabbott.dev` - await $`bun script/onboard-zen-black.ts wrk_01KAE92ACV5AEQ2QJ173W26CTF sam_roehrich@icloud.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJ4BZKCFKWDTJN95X8BBSN roee@bellum.dev` - await $`bun script/onboard-zen-black.ts wrk_01KEAFNZA1T20QY91FZPBWM2ED hendrik@mans.de` - await $`bun script/onboard-zen-black.ts wrk_01KD85CQXVH5G390J8Z69NQ01G rob@anchorwatch.com` - await $`bun script/onboard-zen-black.ts wrk_01KE7XH09S7KJ5F6SW9QQ4YZQ3 seangherardi@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KDGJQSKFXMW9YWWB2SDW4D2C magimetal@pm.me` - await $`bun script/onboard-zen-black.ts wrk_01KCCP5C49JZS4HSRBX7XJX25P matthijswolting@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K4DHK0YHZ40B7QWA5T9QD5CM faisal@hulayyil.com` - await $`bun script/onboard-zen-black.ts wrk_01K59KJHXBJYJ5D7NMKVEBQK12 redwood.cogent5b@icloud.com` - await $`bun script/onboard-zen-black.ts wrk_01K58NJXNDYCMN6MZAH5GBA2V9 mail@wobbat.com` - await $`bun script/onboard-zen-black.ts wrk_01K6AR1ZET89H8NB691FQ2C2VB anthony.kroe@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K6ZMFSTFYWPACV2QNFAVBBVC torbjon@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K5HX50C744YRF5MFJVCQ5784 rishabh@getgale.app` - await $`bun script/onboard-zen-black.ts wrk_01K5AXKDXK6P705ZE1RGJ54DJG skastr052@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJ5PXJDMAW7VDB223J6VED jason.larsen@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KC2QDEGSR07GZ18A5FHV68K4 jeremy@thegollys.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAE40B947397VKVY9JZPQZZ micah@waldste.in` - await $`bun script/onboard-zen-black.ts wrk_01KEAHWCP8710GEAVF8NGY2B8S sid@finchlegal.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAHW437Q6SQZBVXS480SVAX soma.eas@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAE1HJ37GY9K8YTHHE0WBDS steve@seguin.email` - await $`bun script/onboard-zen-black.ts wrk_01K48XKJA60YH8YNSHR1TAV8JB zainxwania@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KDP0E4FG325PFK0HTC9BBPNK peter.houghton@outlook.com` - await $`bun script/onboard-zen-black.ts wrk_01K7ARJD3S9DS84RXKGK7RNJ1G leventyuksel93@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEBZKFKGMXWDYHYQPE5HV2DK james@corbettonline.co.uk` - await $`bun script/onboard-zen-black.ts wrk_01K4PNZCG496059QVVN2W8BKH5 gdiaz@qswarm.com` - await $`bun script/onboard-zen-black.ts wrk_01K4CH29P0HKTRPNWFX6V3K4ZK artmore@protonmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K971RFTA2H8A181F7GV0M2KG nikita@frolov.fi` - await $`bun script/onboard-zen-black.ts wrk_01KAWXVSWGT7M0FZKRK7J96C40 jakob@endform.dev` - await $`bun script/onboard-zen-black.ts wrk_01KEBAHA1C5MD5W2N8RYEVH8B8 richlyelks@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K57NR05JNBV9FYWN8V4PE74X shahmurtaza5@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAEDXMYF8FFDRJS3129BHXZ me@tophergroenink.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJN0Q972162MCAKN5MYXV0 ajcwebdev@pm.me` - await $`bun script/onboard-zen-black.ts wrk_01KDWKNN6JVH49CNQF7Y6T77TS d.camata@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEANMCW8H8MX7NXN9QRBC2JY andrew.ds.choi@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K9DJ10EJ1JQ8QE83G2BZTCAT max@marze.dev` - await $`bun script/onboard-zen-black.ts wrk_01KEB67HYXGHSA19KKYQWANWYC ervin@canigur.com` - await $`bun script/onboard-zen-black.ts wrk_01KBMQ66RB7RYY4MBE69MYQY0J sakhnyukmikhail@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KECJH7FG2GHFK1J1MF73W63R isaac.dobbins@icloud.com` - await $`bun script/onboard-zen-black.ts wrk_01KAFPM94SV343J8SS8ESEHMYG mrkordell@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KBDKY5JHT84Y3K8G9Q4MGAX7 pirnay@deveytan.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAKBCAKKR33T3F0A33EP9W6 1mrtemeck1@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEANHV7AEMFP5RY6KWXCA1T6 github@emilebangma.com` - await $`bun script/onboard-zen-black.ts wrk_01KEARQYY8JRY2HSYX7BR5ATMY hi@henryzoo.com` - await $`bun script/onboard-zen-black.ts wrk_01K9BT5FEF19STHX5HBQGDXAD4 cameron@harderhutton.dev` - await $`bun script/onboard-zen-black.ts wrk_01K5814NN9C8MCQ3W9269GQPX1 niccholaspage@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KBR4P09M7524ME1Z250WM2XT stephen.patrick.murray@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K6JVB4J0QG979YD790XPZSSX jcummings5@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KA94MDGKNTAKB6P0B3RRCVR0 matt@eatsleeprepeat.net` - await $`bun script/onboard-zen-black.ts wrk_01KEB55FEX2ZTK13PYK3YEJSBE hello@trmcnvn.dev` - await $`bun script/onboard-zen-black.ts wrk_01K58YHW99X2T2EDPM2ZNAWM97 ashakdwipeea@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAJKB8BSAF3FQJH1MD6J1WV ben@cinematicsoftware.com` - await $`bun script/onboard-zen-black.ts wrk_01KCS98AJ0SJG6SQY845D0A7XQ ndejesus1227@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KDC8ZCR2021GEMP4G0AA4D4M cmz1023@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K59G802MEFN7AWRPM2QMP4PC chrhicks@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K4EVHWGY50JXFEAM8FT12B17 fahimanwer.08@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEA9RZT7A5K55G8EQQ2V1EWF sandro@scorp.dev` - await $`bun script/onboard-zen-black.ts wrk_01K63V94DSDX76Y21PG98M0GV1 franklin-in-mars@pm.me` - await $`bun script/onboard-zen-black.ts wrk_01KDNXT802CFWR10XSK35PWVG9 alexander.vikman@informationsgruppen.se` - await $`bun script/onboard-zen-black.ts wrk_01K7M79KFFD63S177YPY7Z1QTF me@lozanojoseph.com` - await $`bun script/onboard-zen-black.ts wrk_01KEC9ARJZ12X6CW23HKHNMTVP charlieirish@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K4M9Q5NXP6MT29W1186V0HPK foldvarszki@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K6JKWYXB7KNKWFWXFAV0PD3S johnlindquist@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K4GEQTAHZR28B76DG6F2QX2G mail@justin-vogt.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAK4F15VVPHQH8MSY0GR7XP felix@trulsson.co` - await $`bun script/onboard-zen-black.ts wrk_01K6DSE6F44YNE7AFA4PTF8JA0 jorge.villalobos2809@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAK10BVRFVN1WSXYMR3DQJM jaskyle4@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01KEAE0JEXTVCWEKKB7MAGP37W themindoverall@gmail.com` - await $`bun script/onboard-zen-black.ts wrk_01K7Q7J930ZS4P8088NBW0QTRY dpshadey22@gmail.com` // dylan.shade@hey.com - await $`bun script/onboard-zen-black.ts wrk_01KC22GWVQXVJ15B2K88YNVGJJ maxstevens2708@gmail.com` // mail@maxstevens.nl -} diff --git a/packages/console/core/script/lookup-user.ts b/packages/console/core/script/lookup-user.ts index d671befbcf7..b06fb5654c3 100644 --- a/packages/console/core/script/lookup-user.ts +++ b/packages/console/core/script/lookup-user.ts @@ -254,80 +254,6 @@ function getSubscriptionStatus(row: { } } -function formatMicroCents(value: number | null | undefined) { - if (value === null || value === undefined) return null - return `$${(value / 100000000).toFixed(2)}` -} - -function formatDate(value: Date | null | undefined) { - if (!value) return null - return value.toISOString().split("T")[0] -} - -function formatMonthlyUsage(usage: number | null | undefined, limit: number | null | undefined) { - const usageText = formatMicroCents(usage) ?? "$0.00" - if (limit === null || limit === undefined) return `${usageText} / no limit` - return `${usageText} / $${limit.toFixed(2)}` -} - -function formatRetryTime(seconds: number) { - const days = Math.floor(seconds / 86400) - if (days >= 1) return `${days} day${days > 1 ? "s" : ""}` - const hours = Math.floor(seconds / 3600) - const minutes = Math.ceil((seconds % 3600) / 60) - if (hours >= 1) return `${hours}hr ${minutes}min` - return `${minutes}min` -} - -function getSubscriptionStatus(row: { - timeSubscriptionCreated: Date | null - fixedUsage: number | null - rollingUsage: number | null - timeFixedUpdated: Date | null - timeRollingUpdated: Date | null -}) { - if (!row.timeSubscriptionCreated) { - return { weekly: null, rolling: null, rateLimited: null, retryIn: null } - } - - const black = BlackData.get() - const now = new Date() - const week = getWeekBounds(now) - - const fixedLimit = black.fixedLimit ? centsToMicroCents(black.fixedLimit * 100) : null - const rollingLimit = black.rollingLimit ? centsToMicroCents(black.rollingLimit * 100) : null - const rollingWindowMs = (black.rollingWindow ?? 5) * 3600 * 1000 - - // Calculate current weekly usage (reset if outside current week) - const currentWeekly = - row.fixedUsage && row.timeFixedUpdated && row.timeFixedUpdated >= week.start ? row.fixedUsage : 0 - - // Calculate current rolling usage - const windowStart = new Date(now.getTime() - rollingWindowMs) - const currentRolling = - row.rollingUsage && row.timeRollingUpdated && row.timeRollingUpdated >= windowStart ? row.rollingUsage : 0 - - // Check rate limiting - const isWeeklyLimited = fixedLimit !== null && currentWeekly >= fixedLimit - const isRollingLimited = rollingLimit !== null && currentRolling >= rollingLimit - - let retryIn: string | null = null - if (isWeeklyLimited) { - const retryAfter = Math.ceil((week.end.getTime() - now.getTime()) / 1000) - retryIn = formatRetryTime(retryAfter) - } else if (isRollingLimited && row.timeRollingUpdated) { - const retryAfter = Math.ceil((row.timeRollingUpdated.getTime() + rollingWindowMs - now.getTime()) / 1000) - retryIn = formatRetryTime(retryAfter) - } - - return { - weekly: fixedLimit !== null ? `${formatMicroCents(currentWeekly)} / $${black.fixedLimit}` : null, - rolling: rollingLimit !== null ? `${formatMicroCents(currentRolling)} / $${black.rollingLimit}` : null, - rateLimited: isWeeklyLimited || isRollingLimited ? "yes" : "no", - retryIn, - } -} - function printHeader(title: string) { console.log() console.log("─".repeat(title.length)) From 62d4b5131f43da43fc10945c3020549da9157ab9 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 8 Jan 2026 23:44:11 -0500 Subject: [PATCH 5/7] wip: black --- .../core/migrations/meta/0049_snapshot.json | 134 ++++++++++++++---- .../core/migrations/meta/0050_snapshot.json | 134 ++++++++++++++---- .../core/migrations/meta/_journal.json | 2 +- .../console/core/script/onboard-zen-black.ts | 5 +- 4 files changed, 210 insertions(+), 65 deletions(-) diff --git a/packages/console/core/migrations/meta/0049_snapshot.json b/packages/console/core/migrations/meta/0049_snapshot.json index 58679382e52..5c77033fa15 100644 --- a/packages/console/core/migrations/meta/0049_snapshot.json +++ b/packages/console/core/migrations/meta/0049_snapshot.json @@ -43,7 +43,9 @@ "compositePrimaryKeys": { "account_id_pk": { "name": "account_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -107,12 +109,17 @@ "indexes": { "provider": { "name": "provider", - "columns": ["provider", "subject"], + "columns": [ + "provider", + "subject" + ], "isUnique": true }, "account_id": { "name": "account_id", - "columns": ["account_id"], + "columns": [ + "account_id" + ], "isUnique": false } }, @@ -120,7 +127,9 @@ "compositePrimaryKeys": { "auth_id_pk": { "name": "auth_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -184,7 +193,9 @@ "indexes": { "time_created": { "name": "time_created", - "columns": ["time_created"], + "columns": [ + "time_created" + ], "isUnique": false } }, @@ -192,7 +203,9 @@ "compositePrimaryKeys": { "benchmark_id_pk": { "name": "benchmark_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -354,12 +367,16 @@ "indexes": { "global_customer_id": { "name": "global_customer_id", - "columns": ["customer_id"], + "columns": [ + "customer_id" + ], "isUnique": true }, "global_subscription_id": { "name": "global_subscription_id", - "columns": ["subscription_id"], + "columns": [ + "subscription_id" + ], "isUnique": true } }, @@ -367,7 +384,10 @@ "compositePrimaryKeys": { "billing_workspace_id_id_pk": { "name": "billing_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -454,7 +474,10 @@ "compositePrimaryKeys": { "payment_workspace_id_id_pk": { "name": "payment_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -539,7 +562,10 @@ "indexes": { "workspace_user_id": { "name": "workspace_user_id", - "columns": ["workspace_id", "user_id"], + "columns": [ + "workspace_id", + "user_id" + ], "isUnique": true } }, @@ -547,7 +573,10 @@ "compositePrimaryKeys": { "subscription_workspace_id_id_pk": { "name": "subscription_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -674,7 +703,10 @@ "indexes": { "usage_time_created": { "name": "usage_time_created", - "columns": ["workspace_id", "time_created"], + "columns": [ + "workspace_id", + "time_created" + ], "isUnique": false } }, @@ -682,7 +714,10 @@ "compositePrimaryKeys": { "usage_workspace_id_id_pk": { "name": "usage_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -718,7 +753,10 @@ "compositePrimaryKeys": { "ip_rate_limit_ip_interval_pk": { "name": "ip_rate_limit_ip_interval_pk", - "columns": ["ip", "interval"] + "columns": [ + "ip", + "interval" + ] } }, "uniqueConstraints": {}, @@ -770,7 +808,9 @@ "compositePrimaryKeys": { "ip_ip_pk": { "name": "ip_ip_pk", - "columns": ["ip"] + "columns": [ + "ip" + ] } }, "uniqueConstraints": {}, @@ -848,7 +888,9 @@ "indexes": { "global_key": { "name": "global_key", - "columns": ["key"], + "columns": [ + "key" + ], "isUnique": true } }, @@ -856,7 +898,10 @@ "compositePrimaryKeys": { "key_workspace_id_id_pk": { "name": "key_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -913,7 +958,10 @@ "indexes": { "model_workspace_model": { "name": "model_workspace_model", - "columns": ["workspace_id", "model"], + "columns": [ + "workspace_id", + "model" + ], "isUnique": true } }, @@ -921,7 +969,10 @@ "compositePrimaryKeys": { "model_workspace_id_id_pk": { "name": "model_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -985,7 +1036,10 @@ "indexes": { "workspace_provider": { "name": "workspace_provider", - "columns": ["workspace_id", "provider"], + "columns": [ + "workspace_id", + "provider" + ], "isUnique": true } }, @@ -993,7 +1047,10 @@ "compositePrimaryKeys": { "provider_workspace_id_id_pk": { "name": "provider_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -1106,22 +1163,32 @@ "indexes": { "user_account_id": { "name": "user_account_id", - "columns": ["workspace_id", "account_id"], + "columns": [ + "workspace_id", + "account_id" + ], "isUnique": true }, "user_email": { "name": "user_email", - "columns": ["workspace_id", "email"], + "columns": [ + "workspace_id", + "email" + ], "isUnique": true }, "global_account_id": { "name": "global_account_id", - "columns": ["account_id"], + "columns": [ + "account_id" + ], "isUnique": false }, "global_email": { "name": "global_email", - "columns": ["email"], + "columns": [ + "email" + ], "isUnique": false } }, @@ -1129,7 +1196,10 @@ "compositePrimaryKeys": { "user_workspace_id_id_pk": { "name": "user_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -1186,7 +1256,9 @@ "indexes": { "slug": { "name": "slug", - "columns": ["slug"], + "columns": [ + "slug" + ], "isUnique": true } }, @@ -1194,7 +1266,9 @@ "compositePrimaryKeys": { "workspace_id": { "name": "workspace_id", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -1211,4 +1285,4 @@ "tables": {}, "indexes": {} } -} +} \ No newline at end of file diff --git a/packages/console/core/migrations/meta/0050_snapshot.json b/packages/console/core/migrations/meta/0050_snapshot.json index 75289bc262d..d3050f36e5d 100644 --- a/packages/console/core/migrations/meta/0050_snapshot.json +++ b/packages/console/core/migrations/meta/0050_snapshot.json @@ -43,7 +43,9 @@ "compositePrimaryKeys": { "account_id_pk": { "name": "account_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -107,12 +109,17 @@ "indexes": { "provider": { "name": "provider", - "columns": ["provider", "subject"], + "columns": [ + "provider", + "subject" + ], "isUnique": true }, "account_id": { "name": "account_id", - "columns": ["account_id"], + "columns": [ + "account_id" + ], "isUnique": false } }, @@ -120,7 +127,9 @@ "compositePrimaryKeys": { "auth_id_pk": { "name": "auth_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -184,7 +193,9 @@ "indexes": { "time_created": { "name": "time_created", - "columns": ["time_created"], + "columns": [ + "time_created" + ], "isUnique": false } }, @@ -192,7 +203,9 @@ "compositePrimaryKeys": { "benchmark_id_pk": { "name": "benchmark_id_pk", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -354,12 +367,16 @@ "indexes": { "global_customer_id": { "name": "global_customer_id", - "columns": ["customer_id"], + "columns": [ + "customer_id" + ], "isUnique": true }, "global_subscription_id": { "name": "global_subscription_id", - "columns": ["subscription_id"], + "columns": [ + "subscription_id" + ], "isUnique": true } }, @@ -367,7 +384,10 @@ "compositePrimaryKeys": { "billing_workspace_id_id_pk": { "name": "billing_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -461,7 +481,10 @@ "compositePrimaryKeys": { "payment_workspace_id_id_pk": { "name": "payment_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -546,7 +569,10 @@ "indexes": { "workspace_user_id": { "name": "workspace_user_id", - "columns": ["workspace_id", "user_id"], + "columns": [ + "workspace_id", + "user_id" + ], "isUnique": true } }, @@ -554,7 +580,10 @@ "compositePrimaryKeys": { "subscription_workspace_id_id_pk": { "name": "subscription_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -681,7 +710,10 @@ "indexes": { "usage_time_created": { "name": "usage_time_created", - "columns": ["workspace_id", "time_created"], + "columns": [ + "workspace_id", + "time_created" + ], "isUnique": false } }, @@ -689,7 +721,10 @@ "compositePrimaryKeys": { "usage_workspace_id_id_pk": { "name": "usage_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -725,7 +760,10 @@ "compositePrimaryKeys": { "ip_rate_limit_ip_interval_pk": { "name": "ip_rate_limit_ip_interval_pk", - "columns": ["ip", "interval"] + "columns": [ + "ip", + "interval" + ] } }, "uniqueConstraints": {}, @@ -777,7 +815,9 @@ "compositePrimaryKeys": { "ip_ip_pk": { "name": "ip_ip_pk", - "columns": ["ip"] + "columns": [ + "ip" + ] } }, "uniqueConstraints": {}, @@ -855,7 +895,9 @@ "indexes": { "global_key": { "name": "global_key", - "columns": ["key"], + "columns": [ + "key" + ], "isUnique": true } }, @@ -863,7 +905,10 @@ "compositePrimaryKeys": { "key_workspace_id_id_pk": { "name": "key_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -920,7 +965,10 @@ "indexes": { "model_workspace_model": { "name": "model_workspace_model", - "columns": ["workspace_id", "model"], + "columns": [ + "workspace_id", + "model" + ], "isUnique": true } }, @@ -928,7 +976,10 @@ "compositePrimaryKeys": { "model_workspace_id_id_pk": { "name": "model_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -992,7 +1043,10 @@ "indexes": { "workspace_provider": { "name": "workspace_provider", - "columns": ["workspace_id", "provider"], + "columns": [ + "workspace_id", + "provider" + ], "isUnique": true } }, @@ -1000,7 +1054,10 @@ "compositePrimaryKeys": { "provider_workspace_id_id_pk": { "name": "provider_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -1113,22 +1170,32 @@ "indexes": { "user_account_id": { "name": "user_account_id", - "columns": ["workspace_id", "account_id"], + "columns": [ + "workspace_id", + "account_id" + ], "isUnique": true }, "user_email": { "name": "user_email", - "columns": ["workspace_id", "email"], + "columns": [ + "workspace_id", + "email" + ], "isUnique": true }, "global_account_id": { "name": "global_account_id", - "columns": ["account_id"], + "columns": [ + "account_id" + ], "isUnique": false }, "global_email": { "name": "global_email", - "columns": ["email"], + "columns": [ + "email" + ], "isUnique": false } }, @@ -1136,7 +1203,10 @@ "compositePrimaryKeys": { "user_workspace_id_id_pk": { "name": "user_workspace_id_id_pk", - "columns": ["workspace_id", "id"] + "columns": [ + "workspace_id", + "id" + ] } }, "uniqueConstraints": {}, @@ -1193,7 +1263,9 @@ "indexes": { "slug": { "name": "slug", - "columns": ["slug"], + "columns": [ + "slug" + ], "isUnique": true } }, @@ -1201,7 +1273,9 @@ "compositePrimaryKeys": { "workspace_id": { "name": "workspace_id", - "columns": ["id"] + "columns": [ + "id" + ] } }, "uniqueConstraints": {}, @@ -1218,4 +1292,4 @@ "tables": {}, "indexes": {} } -} +} \ No newline at end of file diff --git a/packages/console/core/migrations/meta/_journal.json b/packages/console/core/migrations/meta/_journal.json index 9982daef5ea..46d2db82130 100644 --- a/packages/console/core/migrations/meta/_journal.json +++ b/packages/console/core/migrations/meta/_journal.json @@ -360,4 +360,4 @@ "breakpoints": true } ] -} +} \ No newline at end of file diff --git a/packages/console/core/script/onboard-zen-black.ts b/packages/console/core/script/onboard-zen-black.ts index 3ee8809739d..6ae4f2a2a40 100644 --- a/packages/console/core/script/onboard-zen-black.ts +++ b/packages/console/core/script/onboard-zen-black.ts @@ -40,10 +40,7 @@ if (amountInCents !== 20000) { } const subscriptionData = await Billing.stripe().subscriptions.retrieve(subscription.id, { expand: ["discounts"] }) -const couponID = - typeof subscriptionData.discounts[0] === "string" - ? subscriptionData.discounts[0] - : subscriptionData.discounts[0]?.coupon?.id +const couponID = subscriptionData.discounts[0]?.coupon?.id // Check if subscription is already tied to another workspace const existingSubscription = await Database.use((tx) => From d6fca7698f27111becbd3d41d256c36ffaa1ab38 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 8 Jan 2026 23:45:46 -0500 Subject: [PATCH 6/7] wip: black --- packages/console/core/script/onboard-zen-black.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/console/core/script/onboard-zen-black.ts b/packages/console/core/script/onboard-zen-black.ts index 6ae4f2a2a40..3ee8809739d 100644 --- a/packages/console/core/script/onboard-zen-black.ts +++ b/packages/console/core/script/onboard-zen-black.ts @@ -40,7 +40,10 @@ if (amountInCents !== 20000) { } const subscriptionData = await Billing.stripe().subscriptions.retrieve(subscription.id, { expand: ["discounts"] }) -const couponID = subscriptionData.discounts[0]?.coupon?.id +const couponID = + typeof subscriptionData.discounts[0] === "string" + ? subscriptionData.discounts[0] + : subscriptionData.discounts[0]?.coupon?.id // Check if subscription is already tied to another workspace const existingSubscription = await Database.use((tx) => From 141c413e360ba6104d6a4b5acfe53740d1e9e7d3 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 9 Jan 2026 04:46:26 +0000 Subject: [PATCH 7/7] chore: generate --- .../core/migrations/meta/0049_snapshot.json | 134 ++++-------------- .../core/migrations/meta/0050_snapshot.json | 134 ++++-------------- .../core/migrations/meta/_journal.json | 2 +- 3 files changed, 61 insertions(+), 209 deletions(-) diff --git a/packages/console/core/migrations/meta/0049_snapshot.json b/packages/console/core/migrations/meta/0049_snapshot.json index 5c77033fa15..58679382e52 100644 --- a/packages/console/core/migrations/meta/0049_snapshot.json +++ b/packages/console/core/migrations/meta/0049_snapshot.json @@ -43,9 +43,7 @@ "compositePrimaryKeys": { "account_id_pk": { "name": "account_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -109,17 +107,12 @@ "indexes": { "provider": { "name": "provider", - "columns": [ - "provider", - "subject" - ], + "columns": ["provider", "subject"], "isUnique": true }, "account_id": { "name": "account_id", - "columns": [ - "account_id" - ], + "columns": ["account_id"], "isUnique": false } }, @@ -127,9 +120,7 @@ "compositePrimaryKeys": { "auth_id_pk": { "name": "auth_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -193,9 +184,7 @@ "indexes": { "time_created": { "name": "time_created", - "columns": [ - "time_created" - ], + "columns": ["time_created"], "isUnique": false } }, @@ -203,9 +192,7 @@ "compositePrimaryKeys": { "benchmark_id_pk": { "name": "benchmark_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -367,16 +354,12 @@ "indexes": { "global_customer_id": { "name": "global_customer_id", - "columns": [ - "customer_id" - ], + "columns": ["customer_id"], "isUnique": true }, "global_subscription_id": { "name": "global_subscription_id", - "columns": [ - "subscription_id" - ], + "columns": ["subscription_id"], "isUnique": true } }, @@ -384,10 +367,7 @@ "compositePrimaryKeys": { "billing_workspace_id_id_pk": { "name": "billing_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -474,10 +454,7 @@ "compositePrimaryKeys": { "payment_workspace_id_id_pk": { "name": "payment_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -562,10 +539,7 @@ "indexes": { "workspace_user_id": { "name": "workspace_user_id", - "columns": [ - "workspace_id", - "user_id" - ], + "columns": ["workspace_id", "user_id"], "isUnique": true } }, @@ -573,10 +547,7 @@ "compositePrimaryKeys": { "subscription_workspace_id_id_pk": { "name": "subscription_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -703,10 +674,7 @@ "indexes": { "usage_time_created": { "name": "usage_time_created", - "columns": [ - "workspace_id", - "time_created" - ], + "columns": ["workspace_id", "time_created"], "isUnique": false } }, @@ -714,10 +682,7 @@ "compositePrimaryKeys": { "usage_workspace_id_id_pk": { "name": "usage_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -753,10 +718,7 @@ "compositePrimaryKeys": { "ip_rate_limit_ip_interval_pk": { "name": "ip_rate_limit_ip_interval_pk", - "columns": [ - "ip", - "interval" - ] + "columns": ["ip", "interval"] } }, "uniqueConstraints": {}, @@ -808,9 +770,7 @@ "compositePrimaryKeys": { "ip_ip_pk": { "name": "ip_ip_pk", - "columns": [ - "ip" - ] + "columns": ["ip"] } }, "uniqueConstraints": {}, @@ -888,9 +848,7 @@ "indexes": { "global_key": { "name": "global_key", - "columns": [ - "key" - ], + "columns": ["key"], "isUnique": true } }, @@ -898,10 +856,7 @@ "compositePrimaryKeys": { "key_workspace_id_id_pk": { "name": "key_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -958,10 +913,7 @@ "indexes": { "model_workspace_model": { "name": "model_workspace_model", - "columns": [ - "workspace_id", - "model" - ], + "columns": ["workspace_id", "model"], "isUnique": true } }, @@ -969,10 +921,7 @@ "compositePrimaryKeys": { "model_workspace_id_id_pk": { "name": "model_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1036,10 +985,7 @@ "indexes": { "workspace_provider": { "name": "workspace_provider", - "columns": [ - "workspace_id", - "provider" - ], + "columns": ["workspace_id", "provider"], "isUnique": true } }, @@ -1047,10 +993,7 @@ "compositePrimaryKeys": { "provider_workspace_id_id_pk": { "name": "provider_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1163,32 +1106,22 @@ "indexes": { "user_account_id": { "name": "user_account_id", - "columns": [ - "workspace_id", - "account_id" - ], + "columns": ["workspace_id", "account_id"], "isUnique": true }, "user_email": { "name": "user_email", - "columns": [ - "workspace_id", - "email" - ], + "columns": ["workspace_id", "email"], "isUnique": true }, "global_account_id": { "name": "global_account_id", - "columns": [ - "account_id" - ], + "columns": ["account_id"], "isUnique": false }, "global_email": { "name": "global_email", - "columns": [ - "email" - ], + "columns": ["email"], "isUnique": false } }, @@ -1196,10 +1129,7 @@ "compositePrimaryKeys": { "user_workspace_id_id_pk": { "name": "user_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1256,9 +1186,7 @@ "indexes": { "slug": { "name": "slug", - "columns": [ - "slug" - ], + "columns": ["slug"], "isUnique": true } }, @@ -1266,9 +1194,7 @@ "compositePrimaryKeys": { "workspace_id": { "name": "workspace_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1285,4 +1211,4 @@ "tables": {}, "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/console/core/migrations/meta/0050_snapshot.json b/packages/console/core/migrations/meta/0050_snapshot.json index d3050f36e5d..75289bc262d 100644 --- a/packages/console/core/migrations/meta/0050_snapshot.json +++ b/packages/console/core/migrations/meta/0050_snapshot.json @@ -43,9 +43,7 @@ "compositePrimaryKeys": { "account_id_pk": { "name": "account_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -109,17 +107,12 @@ "indexes": { "provider": { "name": "provider", - "columns": [ - "provider", - "subject" - ], + "columns": ["provider", "subject"], "isUnique": true }, "account_id": { "name": "account_id", - "columns": [ - "account_id" - ], + "columns": ["account_id"], "isUnique": false } }, @@ -127,9 +120,7 @@ "compositePrimaryKeys": { "auth_id_pk": { "name": "auth_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -193,9 +184,7 @@ "indexes": { "time_created": { "name": "time_created", - "columns": [ - "time_created" - ], + "columns": ["time_created"], "isUnique": false } }, @@ -203,9 +192,7 @@ "compositePrimaryKeys": { "benchmark_id_pk": { "name": "benchmark_id_pk", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -367,16 +354,12 @@ "indexes": { "global_customer_id": { "name": "global_customer_id", - "columns": [ - "customer_id" - ], + "columns": ["customer_id"], "isUnique": true }, "global_subscription_id": { "name": "global_subscription_id", - "columns": [ - "subscription_id" - ], + "columns": ["subscription_id"], "isUnique": true } }, @@ -384,10 +367,7 @@ "compositePrimaryKeys": { "billing_workspace_id_id_pk": { "name": "billing_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -481,10 +461,7 @@ "compositePrimaryKeys": { "payment_workspace_id_id_pk": { "name": "payment_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -569,10 +546,7 @@ "indexes": { "workspace_user_id": { "name": "workspace_user_id", - "columns": [ - "workspace_id", - "user_id" - ], + "columns": ["workspace_id", "user_id"], "isUnique": true } }, @@ -580,10 +554,7 @@ "compositePrimaryKeys": { "subscription_workspace_id_id_pk": { "name": "subscription_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -710,10 +681,7 @@ "indexes": { "usage_time_created": { "name": "usage_time_created", - "columns": [ - "workspace_id", - "time_created" - ], + "columns": ["workspace_id", "time_created"], "isUnique": false } }, @@ -721,10 +689,7 @@ "compositePrimaryKeys": { "usage_workspace_id_id_pk": { "name": "usage_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -760,10 +725,7 @@ "compositePrimaryKeys": { "ip_rate_limit_ip_interval_pk": { "name": "ip_rate_limit_ip_interval_pk", - "columns": [ - "ip", - "interval" - ] + "columns": ["ip", "interval"] } }, "uniqueConstraints": {}, @@ -815,9 +777,7 @@ "compositePrimaryKeys": { "ip_ip_pk": { "name": "ip_ip_pk", - "columns": [ - "ip" - ] + "columns": ["ip"] } }, "uniqueConstraints": {}, @@ -895,9 +855,7 @@ "indexes": { "global_key": { "name": "global_key", - "columns": [ - "key" - ], + "columns": ["key"], "isUnique": true } }, @@ -905,10 +863,7 @@ "compositePrimaryKeys": { "key_workspace_id_id_pk": { "name": "key_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -965,10 +920,7 @@ "indexes": { "model_workspace_model": { "name": "model_workspace_model", - "columns": [ - "workspace_id", - "model" - ], + "columns": ["workspace_id", "model"], "isUnique": true } }, @@ -976,10 +928,7 @@ "compositePrimaryKeys": { "model_workspace_id_id_pk": { "name": "model_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1043,10 +992,7 @@ "indexes": { "workspace_provider": { "name": "workspace_provider", - "columns": [ - "workspace_id", - "provider" - ], + "columns": ["workspace_id", "provider"], "isUnique": true } }, @@ -1054,10 +1000,7 @@ "compositePrimaryKeys": { "provider_workspace_id_id_pk": { "name": "provider_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1170,32 +1113,22 @@ "indexes": { "user_account_id": { "name": "user_account_id", - "columns": [ - "workspace_id", - "account_id" - ], + "columns": ["workspace_id", "account_id"], "isUnique": true }, "user_email": { "name": "user_email", - "columns": [ - "workspace_id", - "email" - ], + "columns": ["workspace_id", "email"], "isUnique": true }, "global_account_id": { "name": "global_account_id", - "columns": [ - "account_id" - ], + "columns": ["account_id"], "isUnique": false }, "global_email": { "name": "global_email", - "columns": [ - "email" - ], + "columns": ["email"], "isUnique": false } }, @@ -1203,10 +1136,7 @@ "compositePrimaryKeys": { "user_workspace_id_id_pk": { "name": "user_workspace_id_id_pk", - "columns": [ - "workspace_id", - "id" - ] + "columns": ["workspace_id", "id"] } }, "uniqueConstraints": {}, @@ -1263,9 +1193,7 @@ "indexes": { "slug": { "name": "slug", - "columns": [ - "slug" - ], + "columns": ["slug"], "isUnique": true } }, @@ -1273,9 +1201,7 @@ "compositePrimaryKeys": { "workspace_id": { "name": "workspace_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1292,4 +1218,4 @@ "tables": {}, "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/console/core/migrations/meta/_journal.json b/packages/console/core/migrations/meta/_journal.json index 46d2db82130..9982daef5ea 100644 --- a/packages/console/core/migrations/meta/_journal.json +++ b/packages/console/core/migrations/meta/_journal.json @@ -360,4 +360,4 @@ "breakpoints": true } ] -} \ No newline at end of file +}