agor-live 0.3.7
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/LICENSE +94 -0
- package/README.md +163 -0
- package/bin/agor-daemon.js +20 -0
- package/bin/agor.js +14 -0
- package/dist/cli/base-command.d.ts +29 -0
- package/dist/cli/base-command.js +41 -0
- package/dist/cli/commands/board/add-session.d.ts +15 -0
- package/dist/cli/commands/board/add-session.js +102 -0
- package/dist/cli/commands/board/list.d.ts +14 -0
- package/dist/cli/commands/board/list.js +74 -0
- package/dist/cli/commands/config/clear.d.ts +13 -0
- package/dist/cli/commands/config/clear.js +21 -0
- package/dist/cli/commands/config/get.d.ts +13 -0
- package/dist/cli/commands/config/get.js +41 -0
- package/dist/cli/commands/config/index.d.ts +13 -0
- package/dist/cli/commands/config/index.js +118 -0
- package/dist/cli/commands/config/set.d.ts +14 -0
- package/dist/cli/commands/config/set.js +50 -0
- package/dist/cli/commands/config/unset.d.ts +13 -0
- package/dist/cli/commands/config/unset.js +35 -0
- package/dist/cli/commands/daemon/index.d.ts +13 -0
- package/dist/cli/commands/daemon/index.js +65 -0
- package/dist/cli/commands/daemon/logs.d.ts +13 -0
- package/dist/cli/commands/daemon/logs.js +78 -0
- package/dist/cli/commands/daemon/restart.d.ts +13 -0
- package/dist/cli/commands/daemon/restart.js +177 -0
- package/dist/cli/commands/daemon/start.d.ts +13 -0
- package/dist/cli/commands/daemon/start.js +193 -0
- package/dist/cli/commands/daemon/status.d.ts +13 -0
- package/dist/cli/commands/daemon/status.js +93 -0
- package/dist/cli/commands/daemon/stop.d.ts +13 -0
- package/dist/cli/commands/daemon/stop.js +108 -0
- package/dist/cli/commands/init.d.ts +44 -0
- package/dist/cli/commands/init.js +459 -0
- package/dist/cli/commands/mcp/add.d.ts +26 -0
- package/dist/cli/commands/mcp/add.js +162 -0
- package/dist/cli/commands/mcp/list.d.ts +16 -0
- package/dist/cli/commands/mcp/list.js +89 -0
- package/dist/cli/commands/mcp/remove.d.ts +17 -0
- package/dist/cli/commands/mcp/remove.js +86 -0
- package/dist/cli/commands/mcp/show.d.ts +14 -0
- package/dist/cli/commands/mcp/show.js +131 -0
- package/dist/cli/commands/repo/add.d.ts +16 -0
- package/dist/cli/commands/repo/add.js +105 -0
- package/dist/cli/commands/repo/list.d.ts +17 -0
- package/dist/cli/commands/repo/list.js +99 -0
- package/dist/cli/commands/repo/rm.d.ts +17 -0
- package/dist/cli/commands/repo/rm.js +126 -0
- package/dist/cli/commands/repo/worktree/add.d.ts +21 -0
- package/dist/cli/commands/repo/worktree/add.js +145 -0
- package/dist/cli/commands/repo/worktree/list.d.ts +21 -0
- package/dist/cli/commands/repo/worktree/list.js +136 -0
- package/dist/cli/commands/session/list.d.ts +30 -0
- package/dist/cli/commands/session/list.js +204 -0
- package/dist/cli/commands/session/load-claude.d.ts +16 -0
- package/dist/cli/commands/session/load-claude.js +211 -0
- package/dist/cli/commands/user/create-admin.d.ts +13 -0
- package/dist/cli/commands/user/create-admin.js +65 -0
- package/dist/cli/commands/user/create.d.ts +16 -0
- package/dist/cli/commands/user/create.js +126 -0
- package/dist/cli/commands/user/delete.d.ts +16 -0
- package/dist/cli/commands/user/delete.js +77 -0
- package/dist/cli/commands/user/list.d.ts +13 -0
- package/dist/cli/commands/user/list.js +78 -0
- package/dist/cli/commands/user/update.d.ts +19 -0
- package/dist/cli/commands/user/update.js +149 -0
- package/dist/cli/hooks/command-not-found.d.ts +9 -0
- package/dist/cli/hooks/command-not-found.js +14 -0
- package/dist/cli/lib/banner.d.ts +25 -0
- package/dist/cli/lib/banner.js +25 -0
- package/dist/cli/lib/context.d.ts +27 -0
- package/dist/cli/lib/context.js +32 -0
- package/dist/cli/lib/daemon-manager.d.ts +48 -0
- package/dist/cli/lib/daemon-manager.js +109 -0
- package/dist/cli/lib/help.d.ts +13 -0
- package/dist/cli/lib/help.js +46 -0
- package/dist/core/agentic-tool-B_gFNpk5.d.ts +33 -0
- package/dist/core/agentic-tool-DsyX8diw.d.cts +33 -0
- package/dist/core/api/index.cjs +98 -0
- package/dist/core/api/index.d.cts +174 -0
- package/dist/core/api/index.d.ts +174 -0
- package/dist/core/api/index.js +62 -0
- package/dist/core/board-comment-BUm0fpmD.d.cts +134 -0
- package/dist/core/board-comment-gC_-twPx.d.ts +134 -0
- package/dist/core/claude/index.cjs +673 -0
- package/dist/core/claude/index.d.cts +124 -0
- package/dist/core/claude/index.d.ts +124 -0
- package/dist/core/claude/index.js +629 -0
- package/dist/core/config/browser.cjs +165 -0
- package/dist/core/config/browser.d.cts +289 -0
- package/dist/core/config/browser.d.ts +289 -0
- package/dist/core/config/browser.js +131 -0
- package/dist/core/config/index.cjs +518 -0
- package/dist/core/config/index.d.cts +246 -0
- package/dist/core/config/index.d.ts +246 -0
- package/dist/core/config/index.js +451 -0
- package/dist/core/db/index.cjs +3726 -0
- package/dist/core/db/index.d.cts +631 -0
- package/dist/core/db/index.d.ts +631 -0
- package/dist/core/db/index.js +3649 -0
- package/dist/core/dist/agentic-tool-B_gFNpk5.d.ts +33 -0
- package/dist/core/dist/agentic-tool-DsyX8diw.d.cts +33 -0
- package/dist/core/dist/api/index.cjs +98 -0
- package/dist/core/dist/api/index.d.cts +174 -0
- package/dist/core/dist/api/index.d.ts +174 -0
- package/dist/core/dist/api/index.js +62 -0
- package/dist/core/dist/board-comment-BUm0fpmD.d.cts +134 -0
- package/dist/core/dist/board-comment-gC_-twPx.d.ts +134 -0
- package/dist/core/dist/claude/index.cjs +673 -0
- package/dist/core/dist/claude/index.d.cts +124 -0
- package/dist/core/dist/claude/index.d.ts +124 -0
- package/dist/core/dist/claude/index.js +629 -0
- package/dist/core/dist/config/browser.cjs +165 -0
- package/dist/core/dist/config/browser.d.cts +289 -0
- package/dist/core/dist/config/browser.d.ts +289 -0
- package/dist/core/dist/config/browser.js +131 -0
- package/dist/core/dist/config/index.cjs +518 -0
- package/dist/core/dist/config/index.d.cts +246 -0
- package/dist/core/dist/config/index.d.ts +246 -0
- package/dist/core/dist/config/index.js +451 -0
- package/dist/core/dist/db/index.cjs +3726 -0
- package/dist/core/dist/db/index.d.cts +631 -0
- package/dist/core/dist/db/index.d.ts +631 -0
- package/dist/core/dist/db/index.js +3649 -0
- package/dist/core/dist/environment/variable-resolver.cjs +92 -0
- package/dist/core/dist/environment/variable-resolver.d.cts +52 -0
- package/dist/core/dist/environment/variable-resolver.d.ts +52 -0
- package/dist/core/dist/environment/variable-resolver.js +53 -0
- package/dist/core/dist/feathers/index.cjs +66 -0
- package/dist/core/dist/feathers/index.d.cts +7 -0
- package/dist/core/dist/feathers/index.d.ts +7 -0
- package/dist/core/dist/feathers/index.js +25 -0
- package/dist/core/dist/feathers-BzHEPnpl.d.cts +228 -0
- package/dist/core/dist/feathers-BzHEPnpl.d.ts +228 -0
- package/dist/core/dist/git/index.cjs +302 -0
- package/dist/core/dist/git/index.d.cts +137 -0
- package/dist/core/dist/git/index.d.ts +137 -0
- package/dist/core/dist/git/index.js +260 -0
- package/dist/core/dist/id-DMqyogFB.d.cts +131 -0
- package/dist/core/dist/id-DMqyogFB.d.ts +131 -0
- package/dist/core/dist/index.cjs +4653 -0
- package/dist/core/dist/index.d.cts +23 -0
- package/dist/core/dist/index.d.ts +23 -0
- package/dist/core/dist/index.js +4509 -0
- package/dist/core/dist/message-BoxZISHg.d.cts +120 -0
- package/dist/core/dist/message-DvBzHu7V.d.ts +120 -0
- package/dist/core/dist/permissions/index.cjs +112 -0
- package/dist/core/dist/permissions/index.d.cts +81 -0
- package/dist/core/dist/permissions/index.d.ts +81 -0
- package/dist/core/dist/permissions/index.js +85 -0
- package/dist/core/dist/repo-3CUrCRbq.d.cts +405 -0
- package/dist/core/dist/repo-CnvJ0B6-.d.ts +405 -0
- package/dist/core/dist/session-BPjJlVdZ.d.cts +429 -0
- package/dist/core/dist/session-wAzjHatv.d.ts +429 -0
- package/dist/core/dist/task-BIEgT1DK.d.cts +163 -0
- package/dist/core/dist/task-DuIfiUbW.d.ts +163 -0
- package/dist/core/dist/templates/handlebars-helpers.cjs +156 -0
- package/dist/core/dist/templates/handlebars-helpers.d.cts +45 -0
- package/dist/core/dist/templates/handlebars-helpers.d.ts +45 -0
- package/dist/core/dist/templates/handlebars-helpers.js +119 -0
- package/dist/core/dist/tools/claude/models.cjs +70 -0
- package/dist/core/dist/tools/claude/models.d.cts +27 -0
- package/dist/core/dist/tools/claude/models.d.ts +27 -0
- package/dist/core/dist/tools/claude/models.js +44 -0
- package/dist/core/dist/tools/index.cjs +3367 -0
- package/dist/core/dist/tools/index.d.cts +967 -0
- package/dist/core/dist/tools/index.d.ts +967 -0
- package/dist/core/dist/tools/index.js +3314 -0
- package/dist/core/dist/tools/models.cjs +119 -0
- package/dist/core/dist/tools/models.d.cts +47 -0
- package/dist/core/dist/tools/models.d.ts +47 -0
- package/dist/core/dist/tools/models.js +86 -0
- package/dist/core/dist/types/index.cjs +152 -0
- package/dist/core/dist/types/index.d.cts +214 -0
- package/dist/core/dist/types/index.d.ts +214 -0
- package/dist/core/dist/types/index.js +112 -0
- package/dist/core/dist/user-BmL3kFol.d.ts +50 -0
- package/dist/core/dist/user-eUuKj7yM.d.cts +50 -0
- package/dist/core/dist/utils/pricing.cjs +102 -0
- package/dist/core/dist/utils/pricing.d.cts +43 -0
- package/dist/core/dist/utils/pricing.d.ts +43 -0
- package/dist/core/dist/utils/pricing.js +75 -0
- package/dist/core/dist/worktrees-BzIxB1U6.d.cts +2745 -0
- package/dist/core/dist/worktrees-CYem1ya2.d.ts +2745 -0
- package/dist/core/environment/variable-resolver.cjs +92 -0
- package/dist/core/environment/variable-resolver.d.cts +52 -0
- package/dist/core/environment/variable-resolver.d.ts +52 -0
- package/dist/core/environment/variable-resolver.js +53 -0
- package/dist/core/feathers/index.cjs +66 -0
- package/dist/core/feathers/index.d.cts +7 -0
- package/dist/core/feathers/index.d.ts +7 -0
- package/dist/core/feathers/index.js +25 -0
- package/dist/core/feathers-BzHEPnpl.d.cts +228 -0
- package/dist/core/feathers-BzHEPnpl.d.ts +228 -0
- package/dist/core/git/index.cjs +302 -0
- package/dist/core/git/index.d.cts +137 -0
- package/dist/core/git/index.d.ts +137 -0
- package/dist/core/git/index.js +260 -0
- package/dist/core/id-DMqyogFB.d.cts +131 -0
- package/dist/core/id-DMqyogFB.d.ts +131 -0
- package/dist/core/index.cjs +4653 -0
- package/dist/core/index.d.cts +23 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.js +4509 -0
- package/dist/core/message-BoxZISHg.d.cts +120 -0
- package/dist/core/message-DvBzHu7V.d.ts +120 -0
- package/dist/core/package.json +133 -0
- package/dist/core/permissions/index.cjs +112 -0
- package/dist/core/permissions/index.d.cts +81 -0
- package/dist/core/permissions/index.d.ts +81 -0
- package/dist/core/permissions/index.js +85 -0
- package/dist/core/repo-3CUrCRbq.d.cts +405 -0
- package/dist/core/repo-CnvJ0B6-.d.ts +405 -0
- package/dist/core/session-BPjJlVdZ.d.cts +429 -0
- package/dist/core/session-wAzjHatv.d.ts +429 -0
- package/dist/core/task-BIEgT1DK.d.cts +163 -0
- package/dist/core/task-DuIfiUbW.d.ts +163 -0
- package/dist/core/templates/handlebars-helpers.cjs +156 -0
- package/dist/core/templates/handlebars-helpers.d.cts +45 -0
- package/dist/core/templates/handlebars-helpers.d.ts +45 -0
- package/dist/core/templates/handlebars-helpers.js +119 -0
- package/dist/core/tools/claude/models.cjs +70 -0
- package/dist/core/tools/claude/models.d.cts +27 -0
- package/dist/core/tools/claude/models.d.ts +27 -0
- package/dist/core/tools/claude/models.js +44 -0
- package/dist/core/tools/index.cjs +3367 -0
- package/dist/core/tools/index.d.cts +967 -0
- package/dist/core/tools/index.d.ts +967 -0
- package/dist/core/tools/index.js +3314 -0
- package/dist/core/tools/models.cjs +119 -0
- package/dist/core/tools/models.d.cts +47 -0
- package/dist/core/tools/models.d.ts +47 -0
- package/dist/core/tools/models.js +86 -0
- package/dist/core/types/index.cjs +152 -0
- package/dist/core/types/index.d.cts +214 -0
- package/dist/core/types/index.d.ts +214 -0
- package/dist/core/types/index.js +112 -0
- package/dist/core/user-BmL3kFol.d.ts +50 -0
- package/dist/core/user-eUuKj7yM.d.cts +50 -0
- package/dist/core/utils/pricing.cjs +102 -0
- package/dist/core/utils/pricing.d.cts +43 -0
- package/dist/core/utils/pricing.d.ts +43 -0
- package/dist/core/utils/pricing.js +75 -0
- package/dist/core/worktrees-BzIxB1U6.d.cts +2745 -0
- package/dist/core/worktrees-CYem1ya2.d.ts +2745 -0
- package/dist/daemon/adapters/drizzle.d.ts +114 -0
- package/dist/daemon/adapters/drizzle.js +219 -0
- package/dist/daemon/declarations.d.ts +101 -0
- package/dist/daemon/declarations.js +0 -0
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.js +4093 -0
- package/dist/daemon/mcp/routes.d.ts +15 -0
- package/dist/daemon/mcp/routes.js +641 -0
- package/dist/daemon/mcp/tokens.d.ts +50 -0
- package/dist/daemon/mcp/tokens.js +85 -0
- package/dist/daemon/services/board-comments.d.ts +97 -0
- package/dist/daemon/services/board-comments.js +326 -0
- package/dist/daemon/services/board-objects.d.ts +71 -0
- package/dist/daemon/services/board-objects.js +117 -0
- package/dist/daemon/services/boards.d.ts +64 -0
- package/dist/daemon/services/boards.js +286 -0
- package/dist/daemon/services/config.d.ts +35 -0
- package/dist/daemon/services/config.js +68 -0
- package/dist/daemon/services/context.d.ts +55 -0
- package/dist/daemon/services/context.js +113 -0
- package/dist/daemon/services/health-monitor.d.ts +58 -0
- package/dist/daemon/services/health-monitor.js +158 -0
- package/dist/daemon/services/mcp-servers.d.ts +42 -0
- package/dist/daemon/services/mcp-servers.js +275 -0
- package/dist/daemon/services/messages.d.ts +49 -0
- package/dist/daemon/services/messages.js +269 -0
- package/dist/daemon/services/repos.d.ts +61 -0
- package/dist/daemon/services/repos.js +350 -0
- package/dist/daemon/services/session-mcp-servers.d.ts +56 -0
- package/dist/daemon/services/session-mcp-servers.js +51 -0
- package/dist/daemon/services/sessions.d.ts +64 -0
- package/dist/daemon/services/sessions.js +398 -0
- package/dist/daemon/services/tasks.d.ts +55 -0
- package/dist/daemon/services/tasks.js +318 -0
- package/dist/daemon/services/terminals.d.ts +75 -0
- package/dist/daemon/services/terminals.js +110 -0
- package/dist/daemon/services/users.d.ts +98 -0
- package/dist/daemon/services/users.js +177 -0
- package/dist/daemon/services/worktrees.d.ts +98 -0
- package/dist/daemon/services/worktrees.js +719 -0
- package/dist/daemon/strategies/anonymous.d.ts +20 -0
- package/dist/daemon/strategies/anonymous.js +32 -0
- package/dist/ui/assets/cc-CYmbalCD.png +0 -0
- package/dist/ui/assets/codex-4sLD1mVS.png +0 -0
- package/dist/ui/assets/cursor-BUy5pFVL.png +0 -0
- package/dist/ui/assets/gemini-ajOb7iAl.png +0 -0
- package/dist/ui/assets/index-Dc4ELxry.css +32 -0
- package/dist/ui/assets/index-KfIu8v4V.js +578 -0
- package/dist/ui/favicon.png +0 -0
- package/dist/ui/index.html +26 -0
- package/dist/ui/vite.svg +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// src/services/users.ts
|
|
2
|
+
import { generateId } from "@agor/core";
|
|
3
|
+
import { compare, eq, hash, users } from "@agor/core/db";
|
|
4
|
+
var UsersService = class {
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Find all users (supports filtering by email for authentication)
|
|
10
|
+
*/
|
|
11
|
+
async find(params) {
|
|
12
|
+
const email = params?.query?.email;
|
|
13
|
+
const includePassword = !!email;
|
|
14
|
+
let rows;
|
|
15
|
+
if (email) {
|
|
16
|
+
const row = await this.db.select().from(users).where(eq(users.email, email)).get();
|
|
17
|
+
rows = row ? [row] : [];
|
|
18
|
+
} else {
|
|
19
|
+
rows = await this.db.select().from(users).all();
|
|
20
|
+
}
|
|
21
|
+
const results = rows.map((row) => this.rowToUser(row, includePassword));
|
|
22
|
+
return {
|
|
23
|
+
total: results.length,
|
|
24
|
+
limit: results.length,
|
|
25
|
+
skip: 0,
|
|
26
|
+
data: results
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get user by ID
|
|
31
|
+
*/
|
|
32
|
+
async get(id, _params) {
|
|
33
|
+
const row = await this.db.select().from(users).where(eq(users.user_id, id)).get();
|
|
34
|
+
if (!row) {
|
|
35
|
+
throw new Error(`User not found: ${id}`);
|
|
36
|
+
}
|
|
37
|
+
return this.rowToUser(row);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create new user
|
|
41
|
+
*/
|
|
42
|
+
async create(data, _params) {
|
|
43
|
+
const existing = await this.db.select().from(users).where(eq(users.email, data.email)).get();
|
|
44
|
+
if (existing) {
|
|
45
|
+
throw new Error(`User with email ${data.email} already exists`);
|
|
46
|
+
}
|
|
47
|
+
const hashedPassword = await hash(data.password, 10);
|
|
48
|
+
const now = /* @__PURE__ */ new Date();
|
|
49
|
+
const user_id = generateId();
|
|
50
|
+
const role = data.role || "member";
|
|
51
|
+
const defaultEmoji = role === "admin" ? "\u2B50" : "\u{1F464}";
|
|
52
|
+
const row = await this.db.insert(users).values({
|
|
53
|
+
user_id,
|
|
54
|
+
email: data.email,
|
|
55
|
+
password: hashedPassword,
|
|
56
|
+
name: data.name,
|
|
57
|
+
emoji: data.emoji || defaultEmoji,
|
|
58
|
+
role,
|
|
59
|
+
created_at: now,
|
|
60
|
+
updated_at: now,
|
|
61
|
+
data: {
|
|
62
|
+
preferences: {}
|
|
63
|
+
}
|
|
64
|
+
}).returning().get();
|
|
65
|
+
return this.rowToUser(row);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Update user
|
|
69
|
+
*/
|
|
70
|
+
async patch(id, data, _params) {
|
|
71
|
+
const now = /* @__PURE__ */ new Date();
|
|
72
|
+
const updates = { updated_at: now };
|
|
73
|
+
if (data.password) {
|
|
74
|
+
updates.password = await hash(data.password, 10);
|
|
75
|
+
}
|
|
76
|
+
if (data.email) updates.email = data.email;
|
|
77
|
+
if (data.name) updates.name = data.name;
|
|
78
|
+
if (data.emoji !== void 0) updates.emoji = data.emoji;
|
|
79
|
+
if (data.role) updates.role = data.role;
|
|
80
|
+
if (data.onboarding_completed !== void 0)
|
|
81
|
+
updates.onboarding_completed = data.onboarding_completed;
|
|
82
|
+
if (data.avatar || data.preferences) {
|
|
83
|
+
const current = await this.get(id);
|
|
84
|
+
updates.data = {
|
|
85
|
+
avatar: data.avatar ?? current.avatar,
|
|
86
|
+
preferences: data.preferences ?? current.preferences
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const row = await this.db.update(users).set(updates).where(eq(users.user_id, id)).returning().get();
|
|
90
|
+
if (!row) {
|
|
91
|
+
throw new Error(`User not found: ${id}`);
|
|
92
|
+
}
|
|
93
|
+
return this.rowToUser(row);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Delete user
|
|
97
|
+
*/
|
|
98
|
+
async remove(id, _params) {
|
|
99
|
+
const user = await this.get(id);
|
|
100
|
+
await this.db.delete(users).where(eq(users.user_id, id)).run();
|
|
101
|
+
return user;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Find user by email (for authentication)
|
|
105
|
+
*/
|
|
106
|
+
async findByEmail(email) {
|
|
107
|
+
const row = await this.db.select().from(users).where(eq(users.email, email)).get();
|
|
108
|
+
return row ? this.rowToUser(row) : null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Verify password
|
|
112
|
+
*/
|
|
113
|
+
async verifyPassword(user, password) {
|
|
114
|
+
const row = await this.db.select().from(users).where(eq(users.user_id, user.user_id)).get();
|
|
115
|
+
if (!row) return false;
|
|
116
|
+
return compare(password, row.password);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert database row to User type
|
|
120
|
+
*
|
|
121
|
+
* @param row - Database row
|
|
122
|
+
* @param includePassword - Include password field (for authentication only)
|
|
123
|
+
*/
|
|
124
|
+
rowToUser(row, includePassword = false) {
|
|
125
|
+
const data = row.data;
|
|
126
|
+
const user = {
|
|
127
|
+
user_id: row.user_id,
|
|
128
|
+
email: row.email,
|
|
129
|
+
name: row.name ?? void 0,
|
|
130
|
+
emoji: row.emoji ?? void 0,
|
|
131
|
+
role: row.role,
|
|
132
|
+
avatar: data.avatar,
|
|
133
|
+
preferences: data.preferences,
|
|
134
|
+
onboarding_completed: !!row.onboarding_completed,
|
|
135
|
+
created_at: row.created_at,
|
|
136
|
+
updated_at: row.updated_at ?? void 0
|
|
137
|
+
};
|
|
138
|
+
if (includePassword) {
|
|
139
|
+
user.password = row.password;
|
|
140
|
+
}
|
|
141
|
+
return user;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
var UsersServiceWithAuth = class extends UsersService {
|
|
145
|
+
/**
|
|
146
|
+
* Override get to include password for authentication
|
|
147
|
+
* (FeathersJS LocalStrategy needs this)
|
|
148
|
+
*/
|
|
149
|
+
async getWithPassword(id) {
|
|
150
|
+
const row = await this.db.select().from(users).where(eq(users.user_id, id)).get();
|
|
151
|
+
if (!row) {
|
|
152
|
+
throw new Error(`User not found: ${id}`);
|
|
153
|
+
}
|
|
154
|
+
const data = row.data;
|
|
155
|
+
return {
|
|
156
|
+
user_id: row.user_id,
|
|
157
|
+
email: row.email,
|
|
158
|
+
password: row.password,
|
|
159
|
+
// Include for authentication
|
|
160
|
+
name: row.name ?? void 0,
|
|
161
|
+
emoji: row.emoji ?? void 0,
|
|
162
|
+
role: row.role,
|
|
163
|
+
avatar: data.avatar,
|
|
164
|
+
preferences: data.preferences,
|
|
165
|
+
onboarding_completed: !!row.onboarding_completed,
|
|
166
|
+
created_at: row.created_at,
|
|
167
|
+
updated_at: row.updated_at ?? void 0
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
function createUsersService(db) {
|
|
172
|
+
return new UsersServiceWithAuth(db);
|
|
173
|
+
}
|
|
174
|
+
export {
|
|
175
|
+
UsersService,
|
|
176
|
+
createUsersService
|
|
177
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as _agor_core from '@agor/core';
|
|
2
|
+
import { Database } from '@agor/core/db';
|
|
3
|
+
import { Application } from '@agor/core/feathers';
|
|
4
|
+
import { QueryParams, UUID, Worktree, WorktreeID } from '@agor/core/types';
|
|
5
|
+
import { DrizzleService } from '../adapters/drizzle.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Worktree service params
|
|
9
|
+
*/
|
|
10
|
+
type WorktreeParams = QueryParams<{
|
|
11
|
+
repo_id?: UUID;
|
|
12
|
+
name?: string;
|
|
13
|
+
ref?: string;
|
|
14
|
+
deleteFromFilesystem?: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Extended worktrees service with custom methods
|
|
18
|
+
*/
|
|
19
|
+
declare class WorktreesService extends DrizzleService<Worktree, Partial<Worktree>, WorktreeParams> {
|
|
20
|
+
private worktreeRepo;
|
|
21
|
+
private app;
|
|
22
|
+
private processes;
|
|
23
|
+
constructor(db: Database, app: Application);
|
|
24
|
+
/**
|
|
25
|
+
* Override patch to handle board_objects when board_id changes
|
|
26
|
+
*/
|
|
27
|
+
patch(id: WorktreeID, data: Partial<Worktree>, params?: WorktreeParams): Promise<Worktree>;
|
|
28
|
+
/**
|
|
29
|
+
* Override find to support repo_id filter
|
|
30
|
+
*/
|
|
31
|
+
find(params?: WorktreeParams): Promise<Worktree[] | _agor_core.Paginated<Worktree>>;
|
|
32
|
+
/**
|
|
33
|
+
* Override remove to support filesystem deletion
|
|
34
|
+
*/
|
|
35
|
+
remove(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
36
|
+
/**
|
|
37
|
+
* Custom method: Find worktree by repo_id and name
|
|
38
|
+
*/
|
|
39
|
+
findByRepoAndName(repoId: UUID, name: string, _params?: WorktreeParams): Promise<Worktree | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Custom method: Add session to worktree
|
|
42
|
+
*/
|
|
43
|
+
addSession(id: WorktreeID, sessionId: UUID, params?: WorktreeParams): Promise<Worktree>;
|
|
44
|
+
/**
|
|
45
|
+
* Custom method: Remove session from worktree
|
|
46
|
+
*/
|
|
47
|
+
removeSession(id: WorktreeID, sessionId: UUID, params?: WorktreeParams): Promise<Worktree>;
|
|
48
|
+
/**
|
|
49
|
+
* Custom method: Add worktree to board
|
|
50
|
+
*
|
|
51
|
+
* Phase 0: Sets board_id on worktree
|
|
52
|
+
* Phase 1: Will also create board_object entry for positioning
|
|
53
|
+
*/
|
|
54
|
+
addToBoard(id: WorktreeID, boardId: UUID, params?: WorktreeParams): Promise<Worktree>;
|
|
55
|
+
/**
|
|
56
|
+
* Custom method: Remove worktree from board
|
|
57
|
+
*
|
|
58
|
+
* Phase 0: Clears board_id on worktree
|
|
59
|
+
* Phase 1: Will also remove board_object entry
|
|
60
|
+
*/
|
|
61
|
+
removeFromBoard(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
62
|
+
/**
|
|
63
|
+
* Custom method: Update environment status
|
|
64
|
+
*/
|
|
65
|
+
updateEnvironment(id: WorktreeID, environmentUpdate: Partial<Worktree['environment_instance']>, params?: WorktreeParams): Promise<Worktree>;
|
|
66
|
+
/**
|
|
67
|
+
* Custom method: Start environment
|
|
68
|
+
*/
|
|
69
|
+
startEnvironment(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
70
|
+
/**
|
|
71
|
+
* Custom method: Stop environment
|
|
72
|
+
*/
|
|
73
|
+
stopEnvironment(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
74
|
+
/**
|
|
75
|
+
* Custom method: Restart environment
|
|
76
|
+
*/
|
|
77
|
+
restartEnvironment(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
78
|
+
/**
|
|
79
|
+
* Custom method: Check health
|
|
80
|
+
*/
|
|
81
|
+
checkHealth(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
82
|
+
/**
|
|
83
|
+
* Custom method: Recompute access URLs for a running environment
|
|
84
|
+
*
|
|
85
|
+
* Called when repo environment_config is updated to refresh URLs without restart
|
|
86
|
+
*/
|
|
87
|
+
recomputeAccessUrls(id: WorktreeID, params?: WorktreeParams): Promise<Worktree>;
|
|
88
|
+
/**
|
|
89
|
+
* Build template context for Handlebars rendering
|
|
90
|
+
*/
|
|
91
|
+
private buildTemplateContext;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Service factory function
|
|
95
|
+
*/
|
|
96
|
+
declare function createWorktreesService(db: Database, app: Application): WorktreesService;
|
|
97
|
+
|
|
98
|
+
export { type WorktreeParams, WorktreesService, createWorktreesService };
|