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.
- package/README.md +3 -4
- package/build/client/assets/app-layout-d99dmiup.js +1 -0
- package/build/client/assets/app-shell-Dl69tJhv.js +1 -0
- package/build/client/assets/chat-B5FboIxH.js +1 -0
- package/build/client/assets/{connect-0oYrfAJT.js → connect-CHSFTXwk.js} +1 -1
- package/build/client/assets/{document-title-Dn4sU16M.js → document-title-B6Yxyaur.js} +1 -1
- package/build/client/assets/{entry.client-CM3vH2bv.js → entry.client-BlQXdBHx.js} +1 -1
- package/build/client/assets/home-Bahc85Gk.js +1 -0
- package/build/client/assets/{label-FUU4pCWu.js → label-C7i5Qt-O.js} +1 -1
- package/build/client/assets/manifest-fe1036ff.js +1 -0
- package/build/client/assets/{react-dom-KYDDPtOx.js → react-dom-CMuFyqmq.js} +1 -1
- package/build/client/assets/{root-DKEnPIjJ.js → root-feKzGV0p.js} +1 -1
- package/build/client/assets/{session-provider-FKGj36EG.js → session-provider-2Ozr-CuV.js} +1 -1
- package/build/server/index.js +1 -1
- package/package.json +2 -2
- package/prisma/schema.prisma +2 -18
- package/server/sqlite-setup.mjs +137 -28
- package/build/client/assets/api.workspaces.directories-B0tllRDq.js +0 -0
- package/build/client/assets/app-layout-Bb7v-3GP.js +0 -1
- package/build/client/assets/app-shell-Bn5JIK3M.js +0 -1
- package/build/client/assets/chat-BoNZJwBl.js +0 -1
- package/build/client/assets/home-DUuienY0.js +0 -1
- package/build/client/assets/manifest-9a2680ac.js +0 -1
- /package/build/client/assets/{api.accounts-CHoT6sYP.js → api.accounts-x_2c5-qG.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId-BixDYyx8.js → api.accounts._accountId-BksU0sQ7.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId.authenticate-CLzgv3py.js → api.accounts._accountId.authenticate-Bp51NHGy.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId.authenticate.callback-Bqhz8sDl.js → api.accounts._accountId.authenticate.callback-DLgNMRyd.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId.models-VIVpVZrj.js → api.accounts._accountId.models-DGbCmT_9.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId.rate-limits-C9iUvNFt.js → api.accounts._accountId.rate-limits-DZh4HPLO.js} +0 -0
- /package/build/client/assets/{api.accounts._accountId.runtime-settings-6XNKTx--.js → api.accounts._accountId.runtime-settings-ChGZGvfx.js} +0 -0
- /package/build/client/assets/{api.accounts.export-romutOT6.js → api.accounts.export-CwjXUcyG.js} +0 -0
- /package/build/client/assets/{api.accounts.import-BiWq2jPz.js → api.accounts.import-Km-76sRE.js} +0 -0
- /package/build/client/assets/{api.chats-C6-gVaXw.js → api.chats-DZ_6Q7rY.js} +0 -0
- /package/build/client/assets/{api.chats._chatId-DaXHa-ln.js → api.chats._chatId-BEX87qHo.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.context-DlBgjpCD.js → api.chats._chatId.context-v4G0lNKq.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.files-DVZKcoNV.js → api.chats._chatId.files-BrN7O-wM.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.git._operation-8Xtyz4hF.js → api.chats._chatId.git._operation-CiUW8Knm.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.interrupt-B71lrxkc.js → api.chats._chatId.interrupt-2DlVPDlX.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.messages-iVzJcgvw.js → api.chats._chatId.messages-cDawTuvN.js} +0 -0
- /package/build/client/assets/{api.chats._chatId.server-requests._requestId.respond-BLhOUK8A.js → api.chats._chatId.server-requests._requestId.respond-CTlCffOk.js} +0 -0
- /package/build/client/assets/{api.users-BLvMDkJE.js → api.workspaces.directories-nVoleT74.js} +0 -0
- /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.
|
|
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())\""
|
package/prisma/schema.prisma
CHANGED
|
@@ -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([
|
|
120
|
-
@@index([
|
|
103
|
+
@@index([updatedAt])
|
|
104
|
+
@@index([lastActivityAt])
|
|
121
105
|
@@index([accountId])
|
|
122
106
|
}
|
|
123
107
|
|
package/server/sqlite-setup.mjs
CHANGED
|
@@ -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
|
-
|
|
61
|
-
`CREATE TABLE IF NOT EXISTS "
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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 "
|
|
110
|
-
|
|
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 "
|
|
153
|
-
'CREATE INDEX IF NOT EXISTS "
|
|
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")',
|
|
File without changes
|
|
@@ -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};
|