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,451 @@
|
|
|
1
|
+
// src/config/config-manager.ts
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import yaml from "js-yaml";
|
|
6
|
+
function getAgorHome() {
|
|
7
|
+
return path.join(os.homedir(), ".agor");
|
|
8
|
+
}
|
|
9
|
+
function getConfigPath() {
|
|
10
|
+
return path.join(getAgorHome(), "config.yaml");
|
|
11
|
+
}
|
|
12
|
+
async function ensureAgorHome() {
|
|
13
|
+
const agorHome = getAgorHome();
|
|
14
|
+
try {
|
|
15
|
+
await fs.access(agorHome);
|
|
16
|
+
} catch {
|
|
17
|
+
await fs.mkdir(agorHome, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function loadConfig() {
|
|
21
|
+
const configPath = getConfigPath();
|
|
22
|
+
try {
|
|
23
|
+
const content = await fs.readFile(configPath, "utf-8");
|
|
24
|
+
const config = yaml.load(content);
|
|
25
|
+
return config || {};
|
|
26
|
+
} catch (error) {
|
|
27
|
+
if (error.code === "ENOENT") {
|
|
28
|
+
return getDefaultConfig();
|
|
29
|
+
}
|
|
30
|
+
throw new Error(
|
|
31
|
+
`Failed to load config: ${error instanceof Error ? error.message : String(error)}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function saveConfig(config) {
|
|
36
|
+
await ensureAgorHome();
|
|
37
|
+
const configPath = getConfigPath();
|
|
38
|
+
const content = yaml.dump(config, {
|
|
39
|
+
indent: 2,
|
|
40
|
+
lineWidth: 120,
|
|
41
|
+
noRefs: true
|
|
42
|
+
});
|
|
43
|
+
await fs.writeFile(configPath, content, "utf-8");
|
|
44
|
+
}
|
|
45
|
+
function getDefaultConfig() {
|
|
46
|
+
return {
|
|
47
|
+
context: {},
|
|
48
|
+
defaults: {
|
|
49
|
+
board: "main",
|
|
50
|
+
agent: "claude-code"
|
|
51
|
+
},
|
|
52
|
+
display: {
|
|
53
|
+
tableStyle: "unicode",
|
|
54
|
+
colorOutput: true,
|
|
55
|
+
shortIdLength: 8
|
|
56
|
+
},
|
|
57
|
+
daemon: {
|
|
58
|
+
port: 3030,
|
|
59
|
+
host: "localhost",
|
|
60
|
+
allowAnonymous: true,
|
|
61
|
+
// Default: Allow anonymous access (local mode)
|
|
62
|
+
requireAuth: false
|
|
63
|
+
// Default: Do not require authentication
|
|
64
|
+
},
|
|
65
|
+
ui: {
|
|
66
|
+
port: 5173,
|
|
67
|
+
host: "localhost"
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function getContext(key) {
|
|
72
|
+
const config = await loadConfig();
|
|
73
|
+
return config.context?.[key];
|
|
74
|
+
}
|
|
75
|
+
async function setContext(key, value) {
|
|
76
|
+
const config = await loadConfig();
|
|
77
|
+
if (!config.context) {
|
|
78
|
+
config.context = {};
|
|
79
|
+
}
|
|
80
|
+
config.context[key] = value;
|
|
81
|
+
await saveConfig(config);
|
|
82
|
+
}
|
|
83
|
+
async function unsetContext(key) {
|
|
84
|
+
const config = await loadConfig();
|
|
85
|
+
if (config.context && key in config.context) {
|
|
86
|
+
delete config.context[key];
|
|
87
|
+
await saveConfig(config);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function clearContext() {
|
|
91
|
+
const config = await loadConfig();
|
|
92
|
+
config.context = {};
|
|
93
|
+
await saveConfig(config);
|
|
94
|
+
}
|
|
95
|
+
async function getAllContext() {
|
|
96
|
+
const config = await loadConfig();
|
|
97
|
+
return config.context || {};
|
|
98
|
+
}
|
|
99
|
+
async function initConfig() {
|
|
100
|
+
const configPath = getConfigPath();
|
|
101
|
+
try {
|
|
102
|
+
await fs.access(configPath);
|
|
103
|
+
} catch {
|
|
104
|
+
await saveConfig(getDefaultConfig());
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function getConfigValue(key) {
|
|
108
|
+
const config = await loadConfig();
|
|
109
|
+
const defaults = getDefaultConfig();
|
|
110
|
+
const merged = {
|
|
111
|
+
...defaults,
|
|
112
|
+
...config,
|
|
113
|
+
defaults: { ...defaults.defaults, ...config.defaults },
|
|
114
|
+
display: { ...defaults.display, ...config.display },
|
|
115
|
+
daemon: { ...defaults.daemon, ...config.daemon },
|
|
116
|
+
ui: { ...defaults.ui, ...config.ui }
|
|
117
|
+
};
|
|
118
|
+
const parts = key.split(".");
|
|
119
|
+
let value = merged;
|
|
120
|
+
for (const part of parts) {
|
|
121
|
+
if (value && typeof value === "object" && part in value) {
|
|
122
|
+
value = value[part];
|
|
123
|
+
} else {
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
async function setConfigValue(key, value) {
|
|
130
|
+
const config = await loadConfig();
|
|
131
|
+
const parts = key.split(".");
|
|
132
|
+
if (parts.length === 1) {
|
|
133
|
+
if (!config.context) {
|
|
134
|
+
config.context = {};
|
|
135
|
+
}
|
|
136
|
+
config.context[parts[0]] = value;
|
|
137
|
+
} else {
|
|
138
|
+
const section = parts[0];
|
|
139
|
+
const _subKey = parts.slice(1).join(".");
|
|
140
|
+
if (!config[section]) {
|
|
141
|
+
config[section] = {};
|
|
142
|
+
}
|
|
143
|
+
if (parts.length === 2) {
|
|
144
|
+
config[section][parts[1]] = value;
|
|
145
|
+
} else {
|
|
146
|
+
throw new Error(`Nested keys beyond one level not supported: ${key}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
await saveConfig(config);
|
|
150
|
+
}
|
|
151
|
+
async function unsetConfigValue(key) {
|
|
152
|
+
const config = await loadConfig();
|
|
153
|
+
const parts = key.split(".");
|
|
154
|
+
if (parts.length === 1) {
|
|
155
|
+
if (config.context && parts[0] in config.context) {
|
|
156
|
+
delete config.context[parts[0]];
|
|
157
|
+
}
|
|
158
|
+
} else if (parts.length === 2) {
|
|
159
|
+
const section = parts[0];
|
|
160
|
+
const subKey = parts[1];
|
|
161
|
+
if (config[section] && subKey in config[section]) {
|
|
162
|
+
delete config[section][subKey];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
await saveConfig(config);
|
|
166
|
+
}
|
|
167
|
+
async function getDaemonUrl() {
|
|
168
|
+
const config = await loadConfig();
|
|
169
|
+
const defaults = getDefaultConfig();
|
|
170
|
+
const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
|
|
171
|
+
const port = envPort || config.daemon?.port || defaults.daemon?.port || 3030;
|
|
172
|
+
const host = config.daemon?.host || defaults.daemon?.host || "localhost";
|
|
173
|
+
return `http://${host}:${port}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/config/constants.ts
|
|
177
|
+
var ENVIRONMENT = {
|
|
178
|
+
/**
|
|
179
|
+
* Health check interval in milliseconds
|
|
180
|
+
* How often to poll environment health when status is 'running'
|
|
181
|
+
*/
|
|
182
|
+
HEALTH_CHECK_INTERVAL_MS: 5e3,
|
|
183
|
+
// 5 seconds
|
|
184
|
+
/**
|
|
185
|
+
* Health check timeout in milliseconds
|
|
186
|
+
* How long to wait for health check response before considering it failed
|
|
187
|
+
*/
|
|
188
|
+
HEALTH_CHECK_TIMEOUT_MS: 1e3,
|
|
189
|
+
// 1 second
|
|
190
|
+
/**
|
|
191
|
+
* Maximum number of log lines to store per worktree
|
|
192
|
+
* (Not stored in DB - reference for future log file implementation)
|
|
193
|
+
*/
|
|
194
|
+
MAX_LOG_LINES: 100,
|
|
195
|
+
/**
|
|
196
|
+
* Process startup grace period in milliseconds
|
|
197
|
+
* How long to wait after starting before running health checks
|
|
198
|
+
*/
|
|
199
|
+
STARTUP_GRACE_PERIOD_MS: 3e3,
|
|
200
|
+
// 3 seconds
|
|
201
|
+
/**
|
|
202
|
+
* Maximum consecutive health check failures before marking as 'error'
|
|
203
|
+
*/
|
|
204
|
+
MAX_HEALTH_CHECK_FAILURES: 3
|
|
205
|
+
};
|
|
206
|
+
var WEBSOCKET = {
|
|
207
|
+
/**
|
|
208
|
+
* Cursor position broadcast throttle in milliseconds
|
|
209
|
+
*/
|
|
210
|
+
CURSOR_THROTTLE_MS: 100,
|
|
211
|
+
/**
|
|
212
|
+
* Presence timeout in milliseconds (when to mark user as stale)
|
|
213
|
+
*/
|
|
214
|
+
PRESENCE_TIMEOUT_MS: 1e4
|
|
215
|
+
// 10 seconds
|
|
216
|
+
};
|
|
217
|
+
var DATABASE = {
|
|
218
|
+
/**
|
|
219
|
+
* Batch size for bulk message inserts
|
|
220
|
+
*/
|
|
221
|
+
MESSAGE_BATCH_SIZE: 100,
|
|
222
|
+
/**
|
|
223
|
+
* Batch size for bulk task inserts
|
|
224
|
+
*/
|
|
225
|
+
TASK_BATCH_SIZE: 100,
|
|
226
|
+
/**
|
|
227
|
+
* Default pagination limit
|
|
228
|
+
*/
|
|
229
|
+
DEFAULT_PAGE_SIZE: 50,
|
|
230
|
+
/**
|
|
231
|
+
* Maximum pagination limit
|
|
232
|
+
*/
|
|
233
|
+
MAX_PAGE_SIZE: 100
|
|
234
|
+
};
|
|
235
|
+
var GIT = {
|
|
236
|
+
/**
|
|
237
|
+
* Default worktree base path (relative to ~/.agor)
|
|
238
|
+
*/
|
|
239
|
+
WORKTREE_BASE_PATH: "worktrees",
|
|
240
|
+
/**
|
|
241
|
+
* Default repo clone path (relative to ~/.agor)
|
|
242
|
+
*/
|
|
243
|
+
REPO_BASE_PATH: "repos"
|
|
244
|
+
};
|
|
245
|
+
var SESSION = {
|
|
246
|
+
/**
|
|
247
|
+
* Maximum number of messages to load initially
|
|
248
|
+
*/
|
|
249
|
+
INITIAL_MESSAGE_LOAD: 100,
|
|
250
|
+
/**
|
|
251
|
+
* Message streaming chunk size
|
|
252
|
+
*/
|
|
253
|
+
STREAMING_CHUNK_SIZE: 1
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
// src/config/context-resolver.ts
|
|
257
|
+
async function resolveValue(key, flagValue, config) {
|
|
258
|
+
if (flagValue !== void 0 && flagValue !== null && flagValue !== "") {
|
|
259
|
+
return flagValue;
|
|
260
|
+
}
|
|
261
|
+
const cfg = config || await loadConfig();
|
|
262
|
+
const contextValue = cfg.context?.[key];
|
|
263
|
+
if (contextValue !== void 0 && contextValue !== null && contextValue !== "") {
|
|
264
|
+
return contextValue;
|
|
265
|
+
}
|
|
266
|
+
const defaultValue = cfg.defaults?.[key];
|
|
267
|
+
if (defaultValue !== void 0 && defaultValue !== null && defaultValue !== "") {
|
|
268
|
+
return defaultValue;
|
|
269
|
+
}
|
|
270
|
+
return void 0;
|
|
271
|
+
}
|
|
272
|
+
async function resolveValues(keys, flagValues, config) {
|
|
273
|
+
const cfg = config || await loadConfig();
|
|
274
|
+
const resolved = {};
|
|
275
|
+
for (const key of keys) {
|
|
276
|
+
const value = await resolveValue(key, flagValues?.[key], cfg);
|
|
277
|
+
if (value !== void 0) {
|
|
278
|
+
resolved[key] = value;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return resolved;
|
|
282
|
+
}
|
|
283
|
+
async function getEffectiveConfig(config) {
|
|
284
|
+
const cfg = config || await loadConfig();
|
|
285
|
+
return {
|
|
286
|
+
// Context values
|
|
287
|
+
board: await resolveValue("board", void 0, cfg),
|
|
288
|
+
session: await resolveValue("session", void 0, cfg),
|
|
289
|
+
repo: await resolveValue("repo", void 0, cfg),
|
|
290
|
+
agent: await resolveValue("agent", void 0, cfg),
|
|
291
|
+
// Display settings
|
|
292
|
+
tableStyle: cfg.display?.tableStyle,
|
|
293
|
+
colorOutput: cfg.display?.colorOutput !== void 0 ? String(cfg.display.colorOutput) : void 0,
|
|
294
|
+
shortIdLength: cfg.display?.shortIdLength !== void 0 ? String(cfg.display.shortIdLength) : void 0
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// src/config/repo-list.ts
|
|
299
|
+
function getRepoReferenceOptions(repos, worktrees = []) {
|
|
300
|
+
const options = [];
|
|
301
|
+
const repoMap = new Map(repos.map((repo) => [repo.repo_id, repo]));
|
|
302
|
+
for (const repo of repos) {
|
|
303
|
+
options.push({
|
|
304
|
+
label: repo.slug,
|
|
305
|
+
value: repo.repo_id,
|
|
306
|
+
// Use repo_id as value
|
|
307
|
+
type: "managed",
|
|
308
|
+
slug: repo.slug,
|
|
309
|
+
description: `${repo.name} (bare repo)`
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
for (const worktree of worktrees) {
|
|
313
|
+
const repo = repoMap.get(worktree.repo_id);
|
|
314
|
+
if (!repo) continue;
|
|
315
|
+
const reference = `${repo.slug}:${worktree.name}`;
|
|
316
|
+
options.push({
|
|
317
|
+
label: reference,
|
|
318
|
+
value: worktree.worktree_id,
|
|
319
|
+
// Use worktree_id as value
|
|
320
|
+
type: "managed-worktree",
|
|
321
|
+
slug: repo.slug,
|
|
322
|
+
worktree: worktree.name,
|
|
323
|
+
description: `${repo.name} - ${worktree.name} (${worktree.ref})`
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return options;
|
|
327
|
+
}
|
|
328
|
+
function getGroupedRepoReferenceOptions(repos, worktrees = []) {
|
|
329
|
+
const grouped = {};
|
|
330
|
+
const repoMap = new Map(repos.map((repo) => [repo.repo_id, repo]));
|
|
331
|
+
for (const repo of repos) {
|
|
332
|
+
const options = [];
|
|
333
|
+
options.push({
|
|
334
|
+
label: repo.slug,
|
|
335
|
+
value: repo.repo_id,
|
|
336
|
+
// Use repo_id as value
|
|
337
|
+
type: "managed",
|
|
338
|
+
slug: repo.slug,
|
|
339
|
+
description: `${repo.name} (bare repo)`
|
|
340
|
+
});
|
|
341
|
+
grouped[repo.slug] = options;
|
|
342
|
+
}
|
|
343
|
+
for (const worktree of worktrees) {
|
|
344
|
+
const repo = repoMap.get(worktree.repo_id);
|
|
345
|
+
if (!repo) continue;
|
|
346
|
+
const reference = `${repo.slug}:${worktree.name}`;
|
|
347
|
+
if (!grouped[repo.slug]) {
|
|
348
|
+
grouped[repo.slug] = [];
|
|
349
|
+
}
|
|
350
|
+
grouped[repo.slug].push({
|
|
351
|
+
label: reference,
|
|
352
|
+
value: worktree.worktree_id,
|
|
353
|
+
// Use worktree_id as value
|
|
354
|
+
type: "managed-worktree",
|
|
355
|
+
slug: repo.slug,
|
|
356
|
+
worktree: worktree.name,
|
|
357
|
+
description: `${repo.name} - ${worktree.name} (${worktree.ref})`
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
return grouped;
|
|
361
|
+
}
|
|
362
|
+
function getDefaultRepoReference(repos) {
|
|
363
|
+
if (repos.length === 0) return void 0;
|
|
364
|
+
const firstRepo = repos[0];
|
|
365
|
+
return firstRepo.slug;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// src/config/repo-reference.ts
|
|
369
|
+
function parseRepoReference(ref) {
|
|
370
|
+
if (ref.startsWith("/") || /^[A-Z]:\\/.test(ref)) {
|
|
371
|
+
return { type: "path", path: ref };
|
|
372
|
+
}
|
|
373
|
+
if (ref.includes(":")) {
|
|
374
|
+
const [slug, worktree] = ref.split(":", 2);
|
|
375
|
+
return { type: "managed-worktree", slug, worktree };
|
|
376
|
+
}
|
|
377
|
+
return { type: "managed", slug: ref };
|
|
378
|
+
}
|
|
379
|
+
function extractSlugFromUrl(url) {
|
|
380
|
+
const cleanUrl = url.endsWith(".git") ? url.slice(0, -4) : url;
|
|
381
|
+
if (cleanUrl.includes("@")) {
|
|
382
|
+
const match2 = cleanUrl.match(/:([^/]+\/[^/]+)$/);
|
|
383
|
+
if (match2) {
|
|
384
|
+
return match2[1];
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const match = cleanUrl.match(/[:/]([^/]+\/[^/]+)$/);
|
|
388
|
+
if (match) {
|
|
389
|
+
return match[1];
|
|
390
|
+
}
|
|
391
|
+
const segments = cleanUrl.split("/").filter(Boolean);
|
|
392
|
+
if (segments.length >= 2) {
|
|
393
|
+
return `${segments[segments.length - 2]}/${segments[segments.length - 1]}`;
|
|
394
|
+
}
|
|
395
|
+
throw new Error(`Could not extract slug from URL: ${url}`);
|
|
396
|
+
}
|
|
397
|
+
function isValidSlug(slug) {
|
|
398
|
+
const slugPattern = /^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/;
|
|
399
|
+
return slugPattern.test(slug);
|
|
400
|
+
}
|
|
401
|
+
async function resolveRepoReference(ref) {
|
|
402
|
+
const parsed = parseRepoReference(ref);
|
|
403
|
+
if (parsed.type === "path") {
|
|
404
|
+
return {
|
|
405
|
+
cwd: parsed.path,
|
|
406
|
+
managed_worktree: false
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
throw new Error(
|
|
410
|
+
`Repository lookup not implemented in this context. Parsed reference: ${JSON.stringify(parsed)}`
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
function formatRepoReference(slug, worktreeName) {
|
|
414
|
+
if (worktreeName) {
|
|
415
|
+
return `${slug}:${worktreeName}`;
|
|
416
|
+
}
|
|
417
|
+
return slug;
|
|
418
|
+
}
|
|
419
|
+
export {
|
|
420
|
+
DATABASE,
|
|
421
|
+
ENVIRONMENT,
|
|
422
|
+
GIT,
|
|
423
|
+
SESSION,
|
|
424
|
+
WEBSOCKET,
|
|
425
|
+
clearContext,
|
|
426
|
+
extractSlugFromUrl,
|
|
427
|
+
formatRepoReference,
|
|
428
|
+
getAgorHome,
|
|
429
|
+
getAllContext,
|
|
430
|
+
getConfigPath,
|
|
431
|
+
getConfigValue,
|
|
432
|
+
getContext,
|
|
433
|
+
getDaemonUrl,
|
|
434
|
+
getDefaultConfig,
|
|
435
|
+
getDefaultRepoReference,
|
|
436
|
+
getEffectiveConfig,
|
|
437
|
+
getGroupedRepoReferenceOptions,
|
|
438
|
+
getRepoReferenceOptions,
|
|
439
|
+
initConfig,
|
|
440
|
+
isValidSlug,
|
|
441
|
+
loadConfig,
|
|
442
|
+
parseRepoReference,
|
|
443
|
+
resolveRepoReference,
|
|
444
|
+
resolveValue,
|
|
445
|
+
resolveValues,
|
|
446
|
+
saveConfig,
|
|
447
|
+
setConfigValue,
|
|
448
|
+
setContext,
|
|
449
|
+
unsetConfigValue,
|
|
450
|
+
unsetContext
|
|
451
|
+
};
|