agor-live 0.4.2 → 0.4.3

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 (52) hide show
  1. package/dist/cli/commands/daemon/logs.js +1 -1
  2. package/dist/cli/commands/daemon/restart.js +6 -6
  3. package/dist/cli/commands/daemon/start.js +7 -7
  4. package/dist/cli/commands/daemon/status.js +2 -2
  5. package/dist/cli/commands/daemon/stop.js +1 -1
  6. package/dist/cli/commands/init.js +3 -3
  7. package/dist/cli/commands/open.js +4 -4
  8. package/dist/cli/commands/session/load-claude.js +1 -2
  9. package/dist/cli/lib/context.js +1 -1
  10. package/dist/core/agentic-tool-BKO8MCeP.d.ts +70 -0
  11. package/dist/core/agentic-tool-F4yIQb5n.d.cts +70 -0
  12. package/dist/core/api/index.d.cts +2 -2
  13. package/dist/core/api/index.d.ts +2 -2
  14. package/dist/core/{board-comment-gC_-twPx.d.ts → board-comment-BCrDUioT.d.ts} +14 -6
  15. package/dist/core/{board-comment-BUm0fpmD.d.cts → board-comment-CaUiaZB5.d.cts} +14 -6
  16. package/dist/core/db/index.cjs +4 -3
  17. package/dist/core/db/index.d.cts +5 -5
  18. package/dist/core/db/index.d.ts +5 -5
  19. package/dist/core/db/index.js +4 -3
  20. package/dist/core/git/index.cjs +18 -3
  21. package/dist/core/git/index.d.cts +14 -1
  22. package/dist/core/git/index.d.ts +14 -1
  23. package/dist/core/git/index.js +17 -3
  24. package/dist/core/index.cjs +35 -8
  25. package/dist/core/index.d.cts +5 -5
  26. package/dist/core/index.d.ts +5 -5
  27. package/dist/core/index.js +34 -8
  28. package/dist/core/{session-wAzjHatv.d.ts → session-De4TwIM_.d.ts} +13 -9
  29. package/dist/core/{session-BPjJlVdZ.d.cts → session-Dl5E0CV3.d.cts} +13 -9
  30. package/dist/core/tools/index.cjs +461 -161
  31. package/dist/core/tools/index.d.cts +30 -11
  32. package/dist/core/tools/index.d.ts +30 -11
  33. package/dist/core/tools/index.js +463 -162
  34. package/dist/core/types/index.cjs +13 -2
  35. package/dist/core/types/index.d.cts +3 -3
  36. package/dist/core/types/index.d.ts +3 -3
  37. package/dist/core/types/index.js +13 -2
  38. package/dist/core/utils/pricing.d.cts +1 -1
  39. package/dist/core/utils/pricing.d.ts +1 -1
  40. package/dist/core/{worktrees-BK_zQmrd.d.ts → worktrees-Bo5VOy-g.d.ts} +5 -5
  41. package/dist/core/{worktrees-04Oos4ql.d.cts → worktrees-DZ3DkdlA.d.cts} +5 -5
  42. package/dist/daemon/index.js +113 -45
  43. package/dist/daemon/services/mcp-servers.d.ts +2 -7
  44. package/dist/daemon/services/sessions.js +2 -4
  45. package/dist/daemon/services/worktrees.d.ts +2 -13
  46. package/dist/ui/assets/{index-CszvBuh9.js → index-CIlKfG5G.js} +131 -131
  47. package/dist/ui/assets/{index-Dc4ELxry.css → index-CkISoKn2.css} +1 -1
  48. package/dist/ui/index.html +2 -2
  49. package/package.json +1 -1
  50. package/scripts/postinstall.js +4 -4
  51. package/dist/core/agentic-tool-B_gFNpk5.d.ts +0 -33
  52. package/dist/core/agentic-tool-DsyX8diw.d.cts +0 -33
@@ -58,7 +58,7 @@ var DaemonLogs = class _DaemonLogs extends Command {
58
58
  this.log(chalk.yellow("\u26A0 Daemon logs are only available in production mode."));
59
59
  this.log("");
60
60
  this.log(chalk.bold("In development, view daemon output in the terminal where you ran:"));
61
- this.log(" " + chalk.cyan("cd apps/agor-daemon && pnpm dev"));
61
+ this.log(` ${chalk.cyan("cd apps/agor-daemon && pnpm dev")}`);
62
62
  this.log("");
63
63
  this.exit(1);
64
64
  }
@@ -17,7 +17,7 @@ function getDaemonPath() {
17
17
  return null;
18
18
  }
19
19
  const dirname = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
20
- const cliDistIndex = dirname.indexOf(path.sep + "dist" + path.sep + "cli");
20
+ const cliDistIndex = dirname.indexOf(`${path.sep}dist${path.sep}cli`);
21
21
  if (cliDistIndex === -1) {
22
22
  return path.resolve(dirname, "../../daemon/index.js");
23
23
  }
@@ -125,8 +125,8 @@ var DaemonRestart = class extends Command {
125
125
  this.log(chalk.red("\u2717 Daemon lifecycle commands only work in production mode."));
126
126
  this.log("");
127
127
  this.log(chalk.bold("In development, restart the daemon with:"));
128
- this.log(" 1. " + chalk.cyan("Use Ctrl+C in the daemon terminal"));
129
- this.log(" 2. " + chalk.cyan("cd apps/agor-daemon && pnpm dev"));
128
+ this.log(` 1. ${chalk.cyan("Use Ctrl+C in the daemon terminal")}`);
129
+ this.log(` 2. ${chalk.cyan("cd apps/agor-daemon && pnpm dev")}`);
130
130
  this.log("");
131
131
  this.exit(1);
132
132
  }
@@ -135,7 +135,7 @@ var DaemonRestart = class extends Command {
135
135
  this.log(chalk.red("\u2717 Daemon binary not found"));
136
136
  this.log("");
137
137
  this.log("Your installation may be corrupted. Try reinstalling:");
138
- this.log(" " + chalk.cyan("npm install -g agor-live"));
138
+ this.log(` ${chalk.cyan("npm install -g agor-live")}`);
139
139
  this.log("");
140
140
  this.exit(1);
141
141
  }
@@ -151,7 +151,7 @@ var DaemonRestart = class extends Command {
151
151
  this.log(` PID: ${chalk.cyan(String(pid))}`);
152
152
  this.log("");
153
153
  this.log("View logs with:");
154
- this.log(" " + chalk.cyan("agor daemon logs"));
154
+ this.log(` ${chalk.cyan("agor daemon logs")}`);
155
155
  this.log("");
156
156
  await new Promise((resolve) => setTimeout(resolve, 1e3));
157
157
  const daemonUrl = await getDaemonUrl();
@@ -160,7 +160,7 @@ var DaemonRestart = class extends Command {
160
160
  this.log(chalk.yellow("\u26A0 Daemon started but not responding"));
161
161
  this.log("");
162
162
  this.log("Check logs for errors:");
163
- this.log(" " + chalk.cyan("agor daemon logs"));
163
+ this.log(` ${chalk.cyan("agor daemon logs")}`);
164
164
  this.log("");
165
165
  }
166
166
  } catch (error) {
@@ -17,7 +17,7 @@ function getDaemonPath() {
17
17
  return null;
18
18
  }
19
19
  const dirname = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
20
- const cliDistIndex = dirname.indexOf(path.sep + "dist" + path.sep + "cli");
20
+ const cliDistIndex = dirname.indexOf(`${path.sep}dist${path.sep}cli`);
21
21
  if (cliDistIndex === -1) {
22
22
  return path.resolve(dirname, "../../daemon/index.js");
23
23
  }
@@ -101,7 +101,7 @@ var DaemonStart = class _DaemonStart extends Command {
101
101
  this.log(chalk.red("\u2717 Daemon lifecycle commands only work in production mode."));
102
102
  this.log("");
103
103
  this.log(chalk.bold("In development, start the daemon with:"));
104
- this.log(" " + chalk.cyan("cd apps/agor-daemon && pnpm dev"));
104
+ this.log(` ${chalk.cyan("cd apps/agor-daemon && pnpm dev")}`);
105
105
  this.log("");
106
106
  this.exit(1);
107
107
  }
@@ -110,7 +110,7 @@ var DaemonStart = class _DaemonStart extends Command {
110
110
  this.log(chalk.red("\u2717 Daemon binary not found"));
111
111
  this.log("");
112
112
  this.log("Your installation may be corrupted. Try reinstalling:");
113
- this.log(" " + chalk.cyan("npm install -g agor-live"));
113
+ this.log(` ${chalk.cyan("npm install -g agor-live")}`);
114
114
  this.log("");
115
115
  this.exit(1);
116
116
  }
@@ -121,7 +121,7 @@ var DaemonStart = class _DaemonStart extends Command {
121
121
  this.log(`Expected location: ${chalk.dim(daemonPath)}`);
122
122
  this.log("");
123
123
  this.log("Your installation may be corrupted. Try reinstalling:");
124
- this.log(" " + chalk.cyan("npm install -g agor-live"));
124
+ this.log(` ${chalk.cyan("npm install -g agor-live")}`);
125
125
  this.log("");
126
126
  this.exit(1);
127
127
  }
@@ -131,7 +131,7 @@ var DaemonStart = class _DaemonStart extends Command {
131
131
  this.log(chalk.yellow("\u26A0 Daemon is already running"));
132
132
  this.log("");
133
133
  this.log("Check status with:");
134
- this.log(" " + chalk.cyan("agor daemon status"));
134
+ this.log(` ${chalk.cyan("agor daemon status")}`);
135
135
  this.log("");
136
136
  this.exit(0);
137
137
  }
@@ -167,7 +167,7 @@ var DaemonStart = class _DaemonStart extends Command {
167
167
  this.log(` URL: ${chalk.cyan(daemonUrl)}`);
168
168
  this.log("");
169
169
  this.log("View logs with:");
170
- this.log(" " + chalk.cyan("agor daemon logs"));
170
+ this.log(` ${chalk.cyan("agor daemon logs")}`);
171
171
  this.log("");
172
172
  await new Promise((resolve) => setTimeout(resolve, 1e3));
173
173
  const nowRunning = await isDaemonRunning(daemonUrl);
@@ -175,7 +175,7 @@ var DaemonStart = class _DaemonStart extends Command {
175
175
  this.log(chalk.yellow("\u26A0 Daemon started but not responding"));
176
176
  this.log("");
177
177
  this.log("Check logs for errors:");
178
- this.log(" " + chalk.cyan("agor daemon logs"));
178
+ this.log(` ${chalk.cyan("agor daemon logs")}`);
179
179
  this.log("");
180
180
  }
181
181
  }
@@ -79,10 +79,10 @@ var DaemonStatus = class extends Command {
79
79
  if (!running) {
80
80
  if (isInstalledPackage()) {
81
81
  this.log(chalk.bold("To start the daemon:"));
82
- this.log(" " + chalk.cyan("agor daemon start"));
82
+ this.log(` ${chalk.cyan("agor daemon start")}`);
83
83
  } else {
84
84
  this.log(chalk.bold("To start the daemon:"));
85
- this.log(" " + chalk.cyan("cd apps/agor-daemon && pnpm dev"));
85
+ this.log(` ${chalk.cyan("cd apps/agor-daemon && pnpm dev")}`);
86
86
  }
87
87
  this.log("");
88
88
  }
@@ -81,7 +81,7 @@ var DaemonStop = class extends Command {
81
81
  this.log(chalk.red("\u2717 Daemon lifecycle commands only work in production mode."));
82
82
  this.log("");
83
83
  this.log(chalk.bold("In development, stop the daemon with:"));
84
- this.log(" " + chalk.cyan("Use Ctrl+C in the daemon terminal"));
84
+ this.log(` ${chalk.cyan("Use Ctrl+C in the daemon terminal")}`);
85
85
  this.log("");
86
86
  this.exit(1);
87
87
  }
@@ -414,7 +414,7 @@ var Init = class _Init extends Command {
414
414
  }
415
415
  ]);
416
416
  await setConfigValue("credentials.ANTHROPIC_API_KEY", anthropicKey);
417
- this.log(chalk.green(" \u2713") + " Anthropic API key saved");
417
+ this.log(`${chalk.green(" \u2713")} Anthropic API key saved`);
418
418
  }
419
419
  const { setupOpenAI } = await inquirer.prompt([
420
420
  {
@@ -440,7 +440,7 @@ var Init = class _Init extends Command {
440
440
  }
441
441
  ]);
442
442
  await setConfigValue("credentials.OPENAI_API_KEY", openaiKey);
443
- this.log(chalk.green(" \u2713") + " OpenAI API key saved");
443
+ this.log(`${chalk.green(" \u2713")} OpenAI API key saved`);
444
444
  }
445
445
  const { setupGemini } = await inquirer.prompt([
446
446
  {
@@ -466,7 +466,7 @@ var Init = class _Init extends Command {
466
466
  }
467
467
  ]);
468
468
  await setConfigValue("credentials.GEMINI_API_KEY", geminiKey);
469
- this.log(chalk.green(" \u2713") + " Gemini API key saved");
469
+ this.log(`${chalk.green(" \u2713")} Gemini API key saved`);
470
470
  }
471
471
  this.log("");
472
472
  this.log(
@@ -46,7 +46,7 @@ var Open = class extends Command {
46
46
  this.log(chalk.red("\u2717 Daemon is not running"));
47
47
  this.log("");
48
48
  this.log("Start the daemon first:");
49
- this.log(" " + chalk.cyan("agor daemon start"));
49
+ this.log(` ${chalk.cyan("agor daemon start")}`);
50
50
  this.log("");
51
51
  this.exit(1);
52
52
  }
@@ -55,7 +55,7 @@ var Open = class extends Command {
55
55
  this.log(chalk.green("\u2713 Agor UI is ready"));
56
56
  this.log("");
57
57
  this.log("Open this URL in your browser:");
58
- this.log(" " + chalk.cyan(uiUrl));
58
+ this.log(` ${chalk.cyan(uiUrl)}`);
59
59
  this.log("");
60
60
  this.log(chalk.dim("(GitHub Codespaces will automatically forward the port)"));
61
61
  this.log("");
@@ -76,11 +76,11 @@ var Open = class extends Command {
76
76
  }
77
77
  await execAsync(command);
78
78
  this.log(chalk.green("\u2713 Browser opened"));
79
- } catch (error) {
79
+ } catch (_error) {
80
80
  this.log(chalk.yellow("\u26A0 Could not open browser automatically"));
81
81
  this.log("");
82
82
  this.log("Visit this URL manually:");
83
- this.log(" " + chalk.cyan(uiUrl));
83
+ this.log(` ${chalk.cyan(uiUrl)}`);
84
84
  this.log("");
85
85
  }
86
86
  }
@@ -116,8 +116,7 @@ ${chalk.blue("\u25CF")} Loading Claude Code session: ${chalk.cyan(sessionId)}
116
116
  children: []
117
117
  },
118
118
  tasks: [],
119
- message_count: conversation.length,
120
- tool_use_count: 0
119
+ message_count: conversation.length
121
120
  };
122
121
  const sessionsService = client.service("sessions");
123
122
  const created = await sessionsService.create(agorSession);
@@ -11,7 +11,7 @@ function getDaemonPath() {
11
11
  return null;
12
12
  }
13
13
  const dirname = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
14
- const cliDistIndex = dirname.indexOf(path.sep + "dist" + path.sep + "cli");
14
+ const cliDistIndex = dirname.indexOf(`${path.sep}dist${path.sep}cli`);
15
15
  if (cliDistIndex === -1) {
16
16
  return path.resolve(dirname, "../../daemon/index.js");
17
17
  }
@@ -0,0 +1,70 @@
1
+ import { A as AgenticToolID } from './id-DMqyogFB.js';
2
+
3
+ /**
4
+ * Agentic coding tool names
5
+ *
6
+ * These are the external agentic CLI/IDE tools that connect to Agor:
7
+ * - claude-code: Anthropic's Claude Code CLI
8
+ * - cursor: Cursor IDE
9
+ * - codex: OpenAI's Codex CLI
10
+ * - gemini: Google's Gemini Code Assist
11
+ *
12
+ * Not to be confused with "execution tools" (Bash, Write, Read, etc.)
13
+ * which are the primitives that agentic tools use to perform work.
14
+ */
15
+ type AgenticToolName = 'claude-code' | 'cursor' | 'codex' | 'gemini';
16
+ /**
17
+ * Agentic tool metadata for UI display
18
+ *
19
+ * Represents a configured agentic coding tool with installation status,
20
+ * version info, and UI metadata (icon, description).
21
+ */
22
+ interface AgenticTool {
23
+ /** Unique agentic tool configuration identifier (UUIDv7) */
24
+ id: AgenticToolID;
25
+ name: AgenticToolName;
26
+ icon: string;
27
+ installed: boolean;
28
+ version?: string;
29
+ description?: string;
30
+ installable: boolean;
31
+ }
32
+ /**
33
+ * Claude Code permission modes (via Claude Agent SDK)
34
+ *
35
+ * Unified permission model - single mode controls tool approval behavior.
36
+ */
37
+ type ClaudeCodePermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';
38
+ /**
39
+ * Gemini permission modes (via Gemini CLI SDK)
40
+ *
41
+ * Unified permission model - single mode controls tool approval behavior.
42
+ */
43
+ type GeminiPermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions';
44
+ /**
45
+ * Codex permission modes (legacy - now split into sandboxMode + approvalPolicy)
46
+ *
47
+ * Codex uses a DUAL permission model with two independent settings:
48
+ * 1. sandboxMode - WHERE the agent can write (filesystem boundaries)
49
+ * 2. approvalPolicy - WHETHER the agent asks before executing
50
+ */
51
+ type CodexPermissionMode = 'ask' | 'auto' | 'on-failure' | 'allow-all';
52
+ /**
53
+ * Codex sandbox mode - controls WHERE agent can write (filesystem boundaries)
54
+ *
55
+ * - read-only: No filesystem writes allowed
56
+ * - workspace-write: Write to workspace files only, blocks .git/ and system paths
57
+ * - danger-full-access: Full filesystem access including .git/ and system paths
58
+ */
59
+ type CodexSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
60
+ /**
61
+ * Codex approval policy - controls WHETHER agent asks before executing
62
+ *
63
+ * - untrusted: Ask for every operation
64
+ * - on-request: Model decides when to ask (recommended)
65
+ * - on-failure: Only ask when operations fail
66
+ * - never: Auto-approve everything
67
+ */
68
+ type CodexApprovalPolicy = 'untrusted' | 'on-request' | 'on-failure' | 'never';
69
+
70
+ export type { AgenticToolName as A, ClaudeCodePermissionMode as C, GeminiPermissionMode as G, CodexPermissionMode as a, AgenticTool as b, CodexSandboxMode as c, CodexApprovalPolicy as d };
@@ -0,0 +1,70 @@
1
+ import { A as AgenticToolID } from './id-DMqyogFB.cjs';
2
+
3
+ /**
4
+ * Agentic coding tool names
5
+ *
6
+ * These are the external agentic CLI/IDE tools that connect to Agor:
7
+ * - claude-code: Anthropic's Claude Code CLI
8
+ * - cursor: Cursor IDE
9
+ * - codex: OpenAI's Codex CLI
10
+ * - gemini: Google's Gemini Code Assist
11
+ *
12
+ * Not to be confused with "execution tools" (Bash, Write, Read, etc.)
13
+ * which are the primitives that agentic tools use to perform work.
14
+ */
15
+ type AgenticToolName = 'claude-code' | 'cursor' | 'codex' | 'gemini';
16
+ /**
17
+ * Agentic tool metadata for UI display
18
+ *
19
+ * Represents a configured agentic coding tool with installation status,
20
+ * version info, and UI metadata (icon, description).
21
+ */
22
+ interface AgenticTool {
23
+ /** Unique agentic tool configuration identifier (UUIDv7) */
24
+ id: AgenticToolID;
25
+ name: AgenticToolName;
26
+ icon: string;
27
+ installed: boolean;
28
+ version?: string;
29
+ description?: string;
30
+ installable: boolean;
31
+ }
32
+ /**
33
+ * Claude Code permission modes (via Claude Agent SDK)
34
+ *
35
+ * Unified permission model - single mode controls tool approval behavior.
36
+ */
37
+ type ClaudeCodePermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan';
38
+ /**
39
+ * Gemini permission modes (via Gemini CLI SDK)
40
+ *
41
+ * Unified permission model - single mode controls tool approval behavior.
42
+ */
43
+ type GeminiPermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions';
44
+ /**
45
+ * Codex permission modes (legacy - now split into sandboxMode + approvalPolicy)
46
+ *
47
+ * Codex uses a DUAL permission model with two independent settings:
48
+ * 1. sandboxMode - WHERE the agent can write (filesystem boundaries)
49
+ * 2. approvalPolicy - WHETHER the agent asks before executing
50
+ */
51
+ type CodexPermissionMode = 'ask' | 'auto' | 'on-failure' | 'allow-all';
52
+ /**
53
+ * Codex sandbox mode - controls WHERE agent can write (filesystem boundaries)
54
+ *
55
+ * - read-only: No filesystem writes allowed
56
+ * - workspace-write: Write to workspace files only, blocks .git/ and system paths
57
+ * - danger-full-access: Full filesystem access including .git/ and system paths
58
+ */
59
+ type CodexSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
60
+ /**
61
+ * Codex approval policy - controls WHETHER agent asks before executing
62
+ *
63
+ * - untrusted: Ask for every operation
64
+ * - on-request: Model decides when to ask (recommended)
65
+ * - on-failure: Only ask when operations fail
66
+ * - never: Auto-approve everything
67
+ */
68
+ type CodexApprovalPolicy = 'untrusted' | 'on-request' | 'on-failure' | 'never';
69
+
70
+ export type { AgenticToolName as A, ClaudeCodePermissionMode as C, GeminiPermissionMode as G, CodexPermissionMode as a, AgenticTool as b, CodexSandboxMode as c, CodexApprovalPolicy as d };
@@ -1,5 +1,5 @@
1
1
  import { d as Message } from '../message-BoxZISHg.cjs';
2
- import { x as Session, f as Board, p as MCPServer } from '../session-BPjJlVdZ.cjs';
2
+ import { v as Session, e as Board, o as MCPServer } from '../session-Dl5E0CV3.cjs';
3
3
  import { e as Task, a as ContextFileListItem, b as ContextFileDetail } from '../task-BIEgT1DK.cjs';
4
4
  import { b as AuthenticationResult } from '../feathers-BzHEPnpl.cjs';
5
5
  import { a as User } from '../user-eUuKj7yM.cjs';
@@ -7,7 +7,7 @@ import { a as Repo, c as Worktree } from '../repo-Dr--T0wp.cjs';
7
7
  import { Params, Paginated, Application } from '@feathersjs/feathers';
8
8
  import { Socket } from 'socket.io-client';
9
9
  import '../id-DMqyogFB.cjs';
10
- import '../agentic-tool-DsyX8diw.cjs';
10
+ import '../agentic-tool-F4yIQb5n.cjs';
11
11
 
12
12
  /**
13
13
  * Feathers Client for Agor
@@ -1,5 +1,5 @@
1
1
  import { d as Message } from '../message-DvBzHu7V.js';
2
- import { x as Session, f as Board, p as MCPServer } from '../session-wAzjHatv.js';
2
+ import { v as Session, e as Board, o as MCPServer } from '../session-De4TwIM_.js';
3
3
  import { e as Task, a as ContextFileListItem, b as ContextFileDetail } from '../task-DuIfiUbW.js';
4
4
  import { b as AuthenticationResult } from '../feathers-BzHEPnpl.js';
5
5
  import { a as User } from '../user-BmL3kFol.js';
@@ -7,7 +7,7 @@ import { a as Repo, c as Worktree } from '../repo-BoA8D6Uf.js';
7
7
  import { Params, Paginated, Application } from '@feathersjs/feathers';
8
8
  import { Socket } from 'socket.io-client';
9
9
  import '../id-DMqyogFB.js';
10
- import '../agentic-tool-B_gFNpk5.js';
10
+ import '../agentic-tool-BKO8MCeP.js';
11
11
 
12
12
  /**
13
13
  * Feathers Client for Agor
@@ -61,9 +61,13 @@ interface BoardComment {
61
61
  x: number;
62
62
  y: number;
63
63
  };
64
- /** OR relative to session (follows session when it moves) */
64
+ /** OR relative to session/zone/worktree (follows parent when it moves) */
65
65
  relative?: {
66
- session_id: string;
66
+ /** Parent object ID - can be session_id, zone object ID, or worktree_id */
67
+ parent_id: string;
68
+ /** Type of parent for proper lookup */
69
+ parent_type: 'session' | 'zone' | 'worktree';
70
+ /** Offset from parent's top-left corner */
67
71
  offset_x: number;
68
72
  offset_y: number;
69
73
  };
@@ -79,18 +83,22 @@ interface BoardComment {
79
83
  * Hierarchy (most specific → least specific):
80
84
  * 1. MESSAGE - Attached to specific message
81
85
  * 2. TASK - Attached to task
82
- * 3. SESSION_SPATIAL - Spatial pin on session
86
+ * 3. SESSION_SPATIAL - Spatial pin on session (relative positioning)
83
87
  * 4. SESSION - Attached to session
84
- * 5. WORKTREE - Attached to worktree
85
- * 6. BOARD_SPATIAL - Spatial pin on board
86
- * 7. BOARD - General board conversation
88
+ * 5. WORKTREE_SPATIAL - Spatial pin on worktree (relative positioning)
89
+ * 6. WORKTREE - Attached to worktree
90
+ * 7. ZONE_SPATIAL - Spatial pin on zone (relative positioning)
91
+ * 8. BOARD_SPATIAL - Spatial pin on board (absolute positioning)
92
+ * 9. BOARD - General board conversation
87
93
  */
88
94
  declare const CommentAttachmentType: {
89
95
  readonly MESSAGE: "message";
90
96
  readonly TASK: "task";
91
97
  readonly SESSION_SPATIAL: "session-spatial";
92
98
  readonly SESSION: "session";
99
+ readonly WORKTREE_SPATIAL: "worktree-spatial";
93
100
  readonly WORKTREE: "worktree";
101
+ readonly ZONE_SPATIAL: "zone-spatial";
94
102
  readonly BOARD_SPATIAL: "board-spatial";
95
103
  readonly BOARD: "board";
96
104
  };
@@ -61,9 +61,13 @@ interface BoardComment {
61
61
  x: number;
62
62
  y: number;
63
63
  };
64
- /** OR relative to session (follows session when it moves) */
64
+ /** OR relative to session/zone/worktree (follows parent when it moves) */
65
65
  relative?: {
66
- session_id: string;
66
+ /** Parent object ID - can be session_id, zone object ID, or worktree_id */
67
+ parent_id: string;
68
+ /** Type of parent for proper lookup */
69
+ parent_type: 'session' | 'zone' | 'worktree';
70
+ /** Offset from parent's top-left corner */
67
71
  offset_x: number;
68
72
  offset_y: number;
69
73
  };
@@ -79,18 +83,22 @@ interface BoardComment {
79
83
  * Hierarchy (most specific → least specific):
80
84
  * 1. MESSAGE - Attached to specific message
81
85
  * 2. TASK - Attached to task
82
- * 3. SESSION_SPATIAL - Spatial pin on session
86
+ * 3. SESSION_SPATIAL - Spatial pin on session (relative positioning)
83
87
  * 4. SESSION - Attached to session
84
- * 5. WORKTREE - Attached to worktree
85
- * 6. BOARD_SPATIAL - Spatial pin on board
86
- * 7. BOARD - General board conversation
88
+ * 5. WORKTREE_SPATIAL - Spatial pin on worktree (relative positioning)
89
+ * 6. WORKTREE - Attached to worktree
90
+ * 7. ZONE_SPATIAL - Spatial pin on zone (relative positioning)
91
+ * 8. BOARD_SPATIAL - Spatial pin on board (absolute positioning)
92
+ * 9. BOARD - General board conversation
87
93
  */
88
94
  declare const CommentAttachmentType: {
89
95
  readonly MESSAGE: "message";
90
96
  readonly TASK: "task";
91
97
  readonly SESSION_SPATIAL: "session-spatial";
92
98
  readonly SESSION: "session";
99
+ readonly WORKTREE_SPATIAL: "worktree-spatial";
93
100
  readonly WORKTREE: "worktree";
101
+ readonly ZONE_SPATIAL: "zone-spatial";
94
102
  readonly BOARD_SPATIAL: "board-spatial";
95
103
  readonly BOARD: "board";
96
104
  };
@@ -1157,7 +1157,7 @@ var AmbiguousIdError = class extends RepositoryError {
1157
1157
  var import_drizzle_orm3 = require("drizzle-orm");
1158
1158
  init_ids();
1159
1159
  function generatePreview(content) {
1160
- return content.length > 200 ? content.slice(0, 200) + "..." : content;
1160
+ return content.length > 200 ? `${content.slice(0, 200)}...` : content;
1161
1161
  }
1162
1162
  var BoardCommentsRepository = class {
1163
1163
  constructor(db) {
@@ -2726,7 +2726,6 @@ var SessionRepository = class {
2726
2726
  contextFiles: session.contextFiles ?? [],
2727
2727
  tasks: session.tasks ?? [],
2728
2728
  message_count: session.message_count ?? 0,
2729
- tool_use_count: session.tool_use_count ?? 0,
2730
2729
  permission_config: session.permission_config,
2731
2730
  model_config: session.model_config,
2732
2731
  custom_context: session.custom_context
@@ -3281,7 +3280,9 @@ var TaskRepository = class {
3281
3280
  const inserts = taskList.map((task) => this.taskToInsert(task));
3282
3281
  await this.db.insert(tasks).values(inserts);
3283
3282
  const taskIds = inserts.map((t) => t.task_id);
3284
- const rows = await this.db.select().from(tasks).where(import_drizzle_orm11.sql`${tasks.task_id} IN ${import_drizzle_orm11.sql.raw(`(${taskIds.map((id) => `'${id}'`).join(",")})`)}`);
3283
+ const rows = await this.db.select().from(tasks).where(
3284
+ import_drizzle_orm11.sql`${tasks.task_id} IN ${import_drizzle_orm11.sql.raw(`(${taskIds.map((id) => `'${id}'`).join(",")})`)}`
3285
+ );
3285
3286
  return rows.map((row) => this.rowToTask(row));
3286
3287
  } catch (error) {
3287
3288
  throw new RepositoryError(
@@ -1,17 +1,17 @@
1
1
  export { and, desc, eq, inArray, like, or, sql } from 'drizzle-orm';
2
2
  import bcryptjs from 'bcryptjs';
3
- import { b as Database, B as BaseRepository } from '../worktrees-04Oos4ql.cjs';
4
- export { A as AmbiguousIdError, Q as BoardCommentInsert, P as BoardCommentRow, y as BoardInsert, O as BoardObjectInsert, N as BoardObjectRow, x as BoardRow, d as DEFAULT_DB_PATH, a as DatabaseConnectionError, D as DbConfig, E as EntityNotFoundError, J as MCPServerInsert, M as MCPServerRepository, I as MCPServerRow, v as MessageInsert, q as MessageRow, f as MessagesRepository, C as RepoInsert, z as RepoRow, R as RepositoryError, o as SessionInsert, L as SessionMCPServerInsert, S as SessionMCPServerRepository, K as SessionMCPServerRow, g as SessionRepository, n as SessionRow, p as TaskInsert, T as TaskRow, H as UserInsert, U as UserRow, G as WorktreeInsert, W as WorktreeRepository, F as WorktreeRow, l as boardComments, j as boardObjects, h as boards, c as createDatabase, e as createLocalDatabase, i as mcpServers, m as messages, r as repos, k as sessionMcpServers, s as sessions, t as tasks, u as users, w as worktrees } from '../worktrees-04Oos4ql.cjs';
5
- import { B as BoardComment } from '../board-comment-BUm0fpmD.cjs';
3
+ import { b as Database, B as BaseRepository } from '../worktrees-DZ3DkdlA.cjs';
4
+ export { A as AmbiguousIdError, Q as BoardCommentInsert, P as BoardCommentRow, y as BoardInsert, O as BoardObjectInsert, N as BoardObjectRow, x as BoardRow, d as DEFAULT_DB_PATH, a as DatabaseConnectionError, D as DbConfig, E as EntityNotFoundError, J as MCPServerInsert, M as MCPServerRepository, I as MCPServerRow, v as MessageInsert, q as MessageRow, f as MessagesRepository, C as RepoInsert, z as RepoRow, R as RepositoryError, o as SessionInsert, L as SessionMCPServerInsert, S as SessionMCPServerRepository, K as SessionMCPServerRow, g as SessionRepository, n as SessionRow, p as TaskInsert, T as TaskRow, H as UserInsert, U as UserRow, G as WorktreeInsert, W as WorktreeRepository, F as WorktreeRow, l as boardComments, j as boardObjects, h as boards, c as createDatabase, e as createLocalDatabase, i as mcpServers, m as messages, r as repos, k as sessionMcpServers, s as sessions, t as tasks, u as users, w as worktrees } from '../worktrees-DZ3DkdlA.cjs';
5
+ import { B as BoardComment } from '../board-comment-CaUiaZB5.cjs';
6
6
  import { B as BoardID, W as WorktreeID } from '../id-DMqyogFB.cjs';
7
- import { b as BoardEntityObject, f as Board, e as BoardObject } from '../session-BPjJlVdZ.cjs';
7
+ import { a as BoardEntityObject, e as Board, d as BoardObject } from '../session-Dl5E0CV3.cjs';
8
8
  import { a as Repo } from '../repo-Dr--T0wp.cjs';
9
9
  import { e as Task } from '../task-BIEgT1DK.cjs';
10
10
  import { a as User } from '../user-eUuKj7yM.cjs';
11
11
  import '../message-BoxZISHg.cjs';
12
12
  import 'drizzle-orm/libsql';
13
13
  import 'drizzle-orm/sqlite-core';
14
- import '../agentic-tool-DsyX8diw.cjs';
14
+ import '../agentic-tool-F4yIQb5n.cjs';
15
15
 
16
16
  /**
17
17
  * ID Management Utilities
@@ -1,17 +1,17 @@
1
1
  export { and, desc, eq, inArray, like, or, sql } from 'drizzle-orm';
2
2
  import bcryptjs from 'bcryptjs';
3
- import { b as Database, B as BaseRepository } from '../worktrees-BK_zQmrd.js';
4
- export { A as AmbiguousIdError, Q as BoardCommentInsert, P as BoardCommentRow, y as BoardInsert, O as BoardObjectInsert, N as BoardObjectRow, x as BoardRow, d as DEFAULT_DB_PATH, a as DatabaseConnectionError, D as DbConfig, E as EntityNotFoundError, J as MCPServerInsert, M as MCPServerRepository, I as MCPServerRow, v as MessageInsert, q as MessageRow, f as MessagesRepository, C as RepoInsert, z as RepoRow, R as RepositoryError, o as SessionInsert, L as SessionMCPServerInsert, S as SessionMCPServerRepository, K as SessionMCPServerRow, g as SessionRepository, n as SessionRow, p as TaskInsert, T as TaskRow, H as UserInsert, U as UserRow, G as WorktreeInsert, W as WorktreeRepository, F as WorktreeRow, l as boardComments, j as boardObjects, h as boards, c as createDatabase, e as createLocalDatabase, i as mcpServers, m as messages, r as repos, k as sessionMcpServers, s as sessions, t as tasks, u as users, w as worktrees } from '../worktrees-BK_zQmrd.js';
5
- import { B as BoardComment } from '../board-comment-gC_-twPx.js';
3
+ import { b as Database, B as BaseRepository } from '../worktrees-Bo5VOy-g.js';
4
+ export { A as AmbiguousIdError, Q as BoardCommentInsert, P as BoardCommentRow, y as BoardInsert, O as BoardObjectInsert, N as BoardObjectRow, x as BoardRow, d as DEFAULT_DB_PATH, a as DatabaseConnectionError, D as DbConfig, E as EntityNotFoundError, J as MCPServerInsert, M as MCPServerRepository, I as MCPServerRow, v as MessageInsert, q as MessageRow, f as MessagesRepository, C as RepoInsert, z as RepoRow, R as RepositoryError, o as SessionInsert, L as SessionMCPServerInsert, S as SessionMCPServerRepository, K as SessionMCPServerRow, g as SessionRepository, n as SessionRow, p as TaskInsert, T as TaskRow, H as UserInsert, U as UserRow, G as WorktreeInsert, W as WorktreeRepository, F as WorktreeRow, l as boardComments, j as boardObjects, h as boards, c as createDatabase, e as createLocalDatabase, i as mcpServers, m as messages, r as repos, k as sessionMcpServers, s as sessions, t as tasks, u as users, w as worktrees } from '../worktrees-Bo5VOy-g.js';
5
+ import { B as BoardComment } from '../board-comment-BCrDUioT.js';
6
6
  import { B as BoardID, W as WorktreeID } from '../id-DMqyogFB.js';
7
- import { b as BoardEntityObject, f as Board, e as BoardObject } from '../session-wAzjHatv.js';
7
+ import { a as BoardEntityObject, e as Board, d as BoardObject } from '../session-De4TwIM_.js';
8
8
  import { a as Repo } from '../repo-BoA8D6Uf.js';
9
9
  import { e as Task } from '../task-DuIfiUbW.js';
10
10
  import { a as User } from '../user-BmL3kFol.js';
11
11
  import '../message-DvBzHu7V.js';
12
12
  import 'drizzle-orm/libsql';
13
13
  import 'drizzle-orm/sqlite-core';
14
- import '../agentic-tool-B_gFNpk5.js';
14
+ import '../agentic-tool-BKO8MCeP.js';
15
15
 
16
16
  /**
17
17
  * ID Management Utilities
@@ -1081,7 +1081,7 @@ var AmbiguousIdError = class extends RepositoryError {
1081
1081
  init_ids();
1082
1082
  import { and, eq, isNull, like } from "drizzle-orm";
1083
1083
  function generatePreview(content) {
1084
- return content.length > 200 ? content.slice(0, 200) + "..." : content;
1084
+ return content.length > 200 ? `${content.slice(0, 200)}...` : content;
1085
1085
  }
1086
1086
  var BoardCommentsRepository = class {
1087
1087
  constructor(db) {
@@ -2650,7 +2650,6 @@ var SessionRepository = class {
2650
2650
  contextFiles: session.contextFiles ?? [],
2651
2651
  tasks: session.tasks ?? [],
2652
2652
  message_count: session.message_count ?? 0,
2653
- tool_use_count: session.tool_use_count ?? 0,
2654
2653
  permission_config: session.permission_config,
2655
2654
  model_config: session.model_config,
2656
2655
  custom_context: session.custom_context
@@ -3205,7 +3204,9 @@ var TaskRepository = class {
3205
3204
  const inserts = taskList.map((task) => this.taskToInsert(task));
3206
3205
  await this.db.insert(tasks).values(inserts);
3207
3206
  const taskIds = inserts.map((t) => t.task_id);
3208
- const rows = await this.db.select().from(tasks).where(sql5`${tasks.task_id} IN ${sql5.raw(`(${taskIds.map((id) => `'${id}'`).join(",")})`)}`);
3207
+ const rows = await this.db.select().from(tasks).where(
3208
+ sql5`${tasks.task_id} IN ${sql5.raw(`(${taskIds.map((id) => `'${id}'`).join(",")})`)}`
3209
+ );
3209
3210
  return rows.map((row) => this.rowToTask(row));
3210
3211
  } catch (error) {
3211
3212
  throw new RepositoryError(