xedoc-cli 0.1.1 → 0.1.4

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.
Files changed (42) hide show
  1. package/README.md +3 -4
  2. package/build/client/assets/app-layout-d99dmiup.js +1 -0
  3. package/build/client/assets/app-shell-Dl69tJhv.js +1 -0
  4. package/build/client/assets/chat-B5FboIxH.js +1 -0
  5. package/build/client/assets/{connect-0oYrfAJT.js → connect-CHSFTXwk.js} +1 -1
  6. package/build/client/assets/{document-title-Dn4sU16M.js → document-title-B6Yxyaur.js} +1 -1
  7. package/build/client/assets/{entry.client-CM3vH2bv.js → entry.client-BlQXdBHx.js} +1 -1
  8. package/build/client/assets/home-Bahc85Gk.js +1 -0
  9. package/build/client/assets/{label-FUU4pCWu.js → label-C7i5Qt-O.js} +1 -1
  10. package/build/client/assets/manifest-fe1036ff.js +1 -0
  11. package/build/client/assets/{react-dom-KYDDPtOx.js → react-dom-CMuFyqmq.js} +1 -1
  12. package/build/client/assets/{root-DKEnPIjJ.js → root-feKzGV0p.js} +1 -1
  13. package/build/client/assets/{session-provider-FKGj36EG.js → session-provider-2Ozr-CuV.js} +1 -1
  14. package/build/server/index.js +1 -1
  15. package/package.json +2 -2
  16. package/prisma/schema.prisma +2 -18
  17. package/server/sqlite-setup.mjs +137 -28
  18. package/build/client/assets/api.workspaces.directories-B0tllRDq.js +0 -0
  19. package/build/client/assets/app-layout-Bb7v-3GP.js +0 -1
  20. package/build/client/assets/app-shell-Bn5JIK3M.js +0 -1
  21. package/build/client/assets/chat-BoNZJwBl.js +0 -1
  22. package/build/client/assets/home-DUuienY0.js +0 -1
  23. package/build/client/assets/manifest-9a2680ac.js +0 -1
  24. /package/build/client/assets/{api.accounts-CHoT6sYP.js → api.accounts-x_2c5-qG.js} +0 -0
  25. /package/build/client/assets/{api.accounts._accountId-BixDYyx8.js → api.accounts._accountId-BksU0sQ7.js} +0 -0
  26. /package/build/client/assets/{api.accounts._accountId.authenticate-CLzgv3py.js → api.accounts._accountId.authenticate-Bp51NHGy.js} +0 -0
  27. /package/build/client/assets/{api.accounts._accountId.authenticate.callback-Bqhz8sDl.js → api.accounts._accountId.authenticate.callback-DLgNMRyd.js} +0 -0
  28. /package/build/client/assets/{api.accounts._accountId.models-VIVpVZrj.js → api.accounts._accountId.models-DGbCmT_9.js} +0 -0
  29. /package/build/client/assets/{api.accounts._accountId.rate-limits-C9iUvNFt.js → api.accounts._accountId.rate-limits-DZh4HPLO.js} +0 -0
  30. /package/build/client/assets/{api.accounts._accountId.runtime-settings-6XNKTx--.js → api.accounts._accountId.runtime-settings-ChGZGvfx.js} +0 -0
  31. /package/build/client/assets/{api.accounts.export-romutOT6.js → api.accounts.export-CwjXUcyG.js} +0 -0
  32. /package/build/client/assets/{api.accounts.import-BiWq2jPz.js → api.accounts.import-Km-76sRE.js} +0 -0
  33. /package/build/client/assets/{api.chats-C6-gVaXw.js → api.chats-DZ_6Q7rY.js} +0 -0
  34. /package/build/client/assets/{api.chats._chatId-DaXHa-ln.js → api.chats._chatId-BEX87qHo.js} +0 -0
  35. /package/build/client/assets/{api.chats._chatId.context-DlBgjpCD.js → api.chats._chatId.context-v4G0lNKq.js} +0 -0
  36. /package/build/client/assets/{api.chats._chatId.files-DVZKcoNV.js → api.chats._chatId.files-BrN7O-wM.js} +0 -0
  37. /package/build/client/assets/{api.chats._chatId.git._operation-8Xtyz4hF.js → api.chats._chatId.git._operation-CiUW8Knm.js} +0 -0
  38. /package/build/client/assets/{api.chats._chatId.interrupt-B71lrxkc.js → api.chats._chatId.interrupt-2DlVPDlX.js} +0 -0
  39. /package/build/client/assets/{api.chats._chatId.messages-iVzJcgvw.js → api.chats._chatId.messages-cDawTuvN.js} +0 -0
  40. /package/build/client/assets/{api.chats._chatId.server-requests._requestId.respond-BLhOUK8A.js → api.chats._chatId.server-requests._requestId.respond-CTlCffOk.js} +0 -0
  41. /package/build/client/assets/{api.users-BLvMDkJE.js → api.workspaces.directories-nVoleT74.js} +0 -0
  42. /package/build/client/assets/{jsx-runtime-B9QlDcuB.js → jsx-runtime-Dafdqr5g.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xedoc-cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.4",
4
4
  "description": "Local web UI for Codex account, chat, execution, and workspace management.",
5
5
  "author": "Edward Nguyen <monokaijs@gmail.com>",
6
6
  "type": "module",
@@ -36,7 +36,7 @@
36
36
  "clean:build": "node -e \"import('node:fs/promises').then(({ rm }) => rm('build', { recursive: true, force: true }))\"",
37
37
  "prepublishOnly": "pnpm typecheck",
38
38
  "prepack": "pnpm clean:build && pnpm build",
39
- "publish": "npm publish --access public",
39
+ "publish:npm": "npm publish --access public",
40
40
  "publish:dry-run": "npm publish --access public --dry-run",
41
41
  "prisma:generate": "prisma generate --schema prisma/schema.prisma",
42
42
  "db:setup": "node -e \"import('./server/sqlite-setup.mjs').then((m)=>m.setupSqliteDatabase())\""
@@ -54,16 +54,6 @@ enum RunStatus {
54
54
  CANCELLED
55
55
  }
56
56
 
57
- model User {
58
- id String @id @default(uuid())
59
- externalId String? @unique
60
- name String?
61
- createdAt DateTime @default(now())
62
- updatedAt DateTime @updatedAt
63
- accounts CodexAccount[]
64
- chats Chat[]
65
- }
66
-
67
57
  model ServerAuth {
68
58
  id String @id @default("server")
69
59
  passwordHash String
@@ -74,7 +64,6 @@ model ServerAuth {
74
64
 
75
65
  model CodexAccount {
76
66
  id String @id @default(uuid())
77
- userId String
78
67
  displayName String
79
68
  status AccountStatus @default(DISCONNECTED)
80
69
  command String @default("codex")
@@ -88,16 +77,12 @@ model CodexAccount {
88
77
  lastError String?
89
78
  createdAt DateTime @default(now())
90
79
  updatedAt DateTime @updatedAt
91
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
92
80
  chats Chat[]
93
81
  runs ChatRun[]
94
-
95
- @@index([userId])
96
82
  }
97
83
 
98
84
  model Chat {
99
85
  id String @id @default(uuid())
100
- userId String
101
86
  accountId String?
102
87
  title String
103
88
  workingDirectory String?
@@ -111,13 +96,12 @@ model Chat {
111
96
  lastActivityAt DateTime @default(now())
112
97
  createdAt DateTime @default(now())
113
98
  updatedAt DateTime @updatedAt
114
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
115
99
  account CodexAccount? @relation(fields: [accountId], references: [id], onDelete: SetNull)
116
100
  messages ChatMessage[]
117
101
  runs ChatRun[]
118
102
 
119
- @@index([userId, updatedAt])
120
- @@index([userId, lastActivityAt])
103
+ @@index([updatedAt])
104
+ @@index([lastActivityAt])
121
105
  @@index([accountId])
122
106
  }
123
107
 
@@ -13,6 +13,7 @@ export async function setupSqliteDatabase() {
13
13
  datasources: { db: { url: databaseUrl } },
14
14
  })
15
15
  try {
16
+ await migrateLegacyUserScopedTables(prisma)
16
17
  await prisma.$executeRawUnsafe("PRAGMA foreign_keys = ON")
17
18
  await prisma.$queryRawUnsafe("PRAGMA journal_mode = WAL")
18
19
  await prisma.$queryRawUnsafe("PRAGMA busy_timeout = 30000")
@@ -30,6 +31,119 @@ export async function setupSqliteDatabase() {
30
31
  }
31
32
  }
32
33
 
34
+ async function migrateLegacyUserScopedTables(prisma) {
35
+ await prisma.$executeRawUnsafe("PRAGMA foreign_keys = OFF")
36
+ try {
37
+ if (await tableHasColumn(prisma, "CodexAccount", "userId")) {
38
+ await rebuildCodexAccountTable(prisma)
39
+ }
40
+ if (await tableHasColumn(prisma, "Chat", "userId")) {
41
+ await rebuildChatTable(prisma)
42
+ }
43
+ } finally {
44
+ await prisma.$executeRawUnsafe("PRAGMA foreign_keys = ON")
45
+ }
46
+ }
47
+
48
+ async function tableHasColumn(prisma, tableName, columnName) {
49
+ try {
50
+ const columns = await prisma.$queryRawUnsafe(`PRAGMA table_info("${tableName}")`)
51
+ return columns.some((column) => column.name === columnName)
52
+ } catch {
53
+ return false
54
+ }
55
+ }
56
+
57
+ async function rebuildCodexAccountTable(prisma) {
58
+ await prisma.$executeRawUnsafe('DROP TABLE IF EXISTS "CodexAccount_new"')
59
+ await prisma.$executeRawUnsafe(createCodexAccountTable("CodexAccount_new"))
60
+ await prisma.$executeRawUnsafe(`
61
+ INSERT INTO "CodexAccount_new" (
62
+ "id",
63
+ "displayName",
64
+ "status",
65
+ "command",
66
+ "args",
67
+ "environment",
68
+ "defaultModel",
69
+ "defaultPermissionMode",
70
+ "defaultReasoningEffort",
71
+ "defaultServiceTier",
72
+ "lastAuthUrl",
73
+ "lastError",
74
+ "createdAt",
75
+ "updatedAt"
76
+ )
77
+ SELECT
78
+ "id",
79
+ "displayName",
80
+ "status",
81
+ "command",
82
+ "args",
83
+ "environment",
84
+ ${await selectColumnOrNull(prisma, "CodexAccount", "defaultModel")},
85
+ ${await selectColumnOrNull(prisma, "CodexAccount", "defaultPermissionMode")},
86
+ ${await selectColumnOrNull(prisma, "CodexAccount", "defaultReasoningEffort")},
87
+ ${await selectColumnOrNull(prisma, "CodexAccount", "defaultServiceTier")},
88
+ "lastAuthUrl",
89
+ "lastError",
90
+ "createdAt",
91
+ "updatedAt"
92
+ FROM "CodexAccount"
93
+ `)
94
+ await prisma.$executeRawUnsafe('DROP TABLE "CodexAccount"')
95
+ await prisma.$executeRawUnsafe(
96
+ 'ALTER TABLE "CodexAccount_new" RENAME TO "CodexAccount"',
97
+ )
98
+ }
99
+
100
+ async function rebuildChatTable(prisma) {
101
+ await prisma.$executeRawUnsafe('DROP TABLE IF EXISTS "Chat_new"')
102
+ await prisma.$executeRawUnsafe(createChatTable("Chat_new"))
103
+ await prisma.$executeRawUnsafe(`
104
+ INSERT INTO "Chat_new" (
105
+ "id",
106
+ "accountId",
107
+ "title",
108
+ "workingDirectory",
109
+ "model",
110
+ "reasoningEffort",
111
+ "serviceTier",
112
+ "collaborationMode",
113
+ "permissionMode",
114
+ "status",
115
+ "externalThreadId",
116
+ "lastActivityAt",
117
+ "createdAt",
118
+ "updatedAt"
119
+ )
120
+ SELECT
121
+ "id",
122
+ "accountId",
123
+ "title",
124
+ "workingDirectory",
125
+ "model",
126
+ "reasoningEffort",
127
+ "serviceTier",
128
+ "collaborationMode",
129
+ "permissionMode",
130
+ "status",
131
+ "externalThreadId",
132
+ "lastActivityAt",
133
+ "createdAt",
134
+ "updatedAt"
135
+ FROM "Chat"
136
+ `)
137
+ await prisma.$executeRawUnsafe('DROP TABLE "Chat"')
138
+ await prisma.$executeRawUnsafe('ALTER TABLE "Chat_new" RENAME TO "Chat"')
139
+ }
140
+
141
+ async function selectColumnOrNull(prisma, tableName, columnName) {
142
+ return (await tableHasColumn(prisma, tableName, columnName))
143
+ ? `"${columnName}"`
144
+ : "NULL"
145
+ }
146
+
33
147
  function isDuplicateColumnError(error) {
34
148
  const message = error instanceof Error ? error.message : String(error)
35
149
  return message.toLowerCase().includes("duplicate column name")
@@ -57,24 +171,9 @@ function sqliteDatabaseUrl(path) {
57
171
  return `file:${path}?connection_limit=1&pool_timeout=30`
58
172
  }
59
173
 
60
- const schemaStatements = [
61
- `CREATE TABLE IF NOT EXISTS "User" (
174
+ function createCodexAccountTable(tableName) {
175
+ return `CREATE TABLE IF NOT EXISTS "${tableName}" (
62
176
  "id" TEXT NOT NULL PRIMARY KEY,
63
- "externalId" TEXT,
64
- "name" TEXT,
65
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
66
- "updatedAt" DATETIME NOT NULL
67
- )`,
68
- `CREATE TABLE IF NOT EXISTS "ServerAuth" (
69
- "id" TEXT NOT NULL PRIMARY KEY DEFAULT 'server',
70
- "passwordHash" TEXT NOT NULL,
71
- "tokenSecret" TEXT NOT NULL,
72
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
73
- "updatedAt" DATETIME NOT NULL
74
- )`,
75
- `CREATE TABLE IF NOT EXISTS "CodexAccount" (
76
- "id" TEXT NOT NULL PRIMARY KEY,
77
- "userId" TEXT NOT NULL,
78
177
  "displayName" TEXT NOT NULL,
79
178
  "status" TEXT NOT NULL DEFAULT 'DISCONNECTED',
80
179
  "command" TEXT NOT NULL DEFAULT 'codex',
@@ -87,12 +186,13 @@ const schemaStatements = [
87
186
  "lastAuthUrl" TEXT,
88
187
  "lastError" TEXT,
89
188
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
90
- "updatedAt" DATETIME NOT NULL,
91
- CONSTRAINT "CodexAccount_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
92
- )`,
93
- `CREATE TABLE IF NOT EXISTS "Chat" (
189
+ "updatedAt" DATETIME NOT NULL
190
+ )`
191
+ }
192
+
193
+ function createChatTable(tableName) {
194
+ return `CREATE TABLE IF NOT EXISTS "${tableName}" (
94
195
  "id" TEXT NOT NULL PRIMARY KEY,
95
- "userId" TEXT NOT NULL,
96
196
  "accountId" TEXT,
97
197
  "title" TEXT NOT NULL,
98
198
  "workingDirectory" TEXT,
@@ -106,9 +206,20 @@ const schemaStatements = [
106
206
  "lastActivityAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
107
207
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
108
208
  "updatedAt" DATETIME NOT NULL,
109
- CONSTRAINT "Chat_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
110
- CONSTRAINT "Chat_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "CodexAccount" ("id") ON DELETE SET NULL ON UPDATE CASCADE
209
+ CONSTRAINT "${tableName}_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "CodexAccount" ("id") ON DELETE SET NULL ON UPDATE CASCADE
210
+ )`
211
+ }
212
+
213
+ const schemaStatements = [
214
+ `CREATE TABLE IF NOT EXISTS "ServerAuth" (
215
+ "id" TEXT NOT NULL PRIMARY KEY DEFAULT 'server',
216
+ "passwordHash" TEXT NOT NULL,
217
+ "tokenSecret" TEXT NOT NULL,
218
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
219
+ "updatedAt" DATETIME NOT NULL
111
220
  )`,
221
+ createCodexAccountTable("CodexAccount"),
222
+ createChatTable("Chat"),
112
223
  `CREATE TABLE IF NOT EXISTS "ChatMessage" (
113
224
  "id" TEXT NOT NULL PRIMARY KEY,
114
225
  "chatId" TEXT NOT NULL,
@@ -144,14 +255,12 @@ const schemaStatements = [
144
255
  CONSTRAINT "ChatRun_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
145
256
  CONSTRAINT "ChatRun_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "CodexAccount" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
146
257
  )`,
147
- 'CREATE UNIQUE INDEX IF NOT EXISTS "User_externalId_key" ON "User"("externalId")',
148
258
  'ALTER TABLE "CodexAccount" ADD COLUMN "defaultModel" TEXT',
149
259
  'ALTER TABLE "CodexAccount" ADD COLUMN "defaultPermissionMode" TEXT',
150
260
  'ALTER TABLE "CodexAccount" ADD COLUMN "defaultReasoningEffort" TEXT',
151
261
  'ALTER TABLE "CodexAccount" ADD COLUMN "defaultServiceTier" TEXT',
152
- 'CREATE INDEX IF NOT EXISTS "CodexAccount_userId_idx" ON "CodexAccount"("userId")',
153
- 'CREATE INDEX IF NOT EXISTS "Chat_userId_updatedAt_idx" ON "Chat"("userId", "updatedAt")',
154
- 'CREATE INDEX IF NOT EXISTS "Chat_userId_lastActivityAt_idx" ON "Chat"("userId", "lastActivityAt")',
262
+ 'CREATE INDEX IF NOT EXISTS "Chat_updatedAt_idx" ON "Chat"("updatedAt")',
263
+ 'CREATE INDEX IF NOT EXISTS "Chat_lastActivityAt_idx" ON "Chat"("lastActivityAt")',
155
264
  'CREATE INDEX IF NOT EXISTS "Chat_accountId_idx" ON "Chat"("accountId")',
156
265
  'CREATE INDEX IF NOT EXISTS "ChatMessage_chatId_sequence_idx" ON "ChatMessage"("chatId", "sequence")',
157
266
  'CREATE INDEX IF NOT EXISTS "ChatMessage_chatId_turnId_idx" ON "ChatMessage"("chatId", "turnId")',
@@ -1 +0,0 @@
1
- import{j as r,t as s}from"./jsx-runtime-B9QlDcuB.js";import{t}from"./app-shell-Bn5JIK3M.js";var a=s(),o=r(function(){return(0,a.jsx)(t,{})});export{o as default};