codedeck 0.2.0 → 0.4.0

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 (125) hide show
  1. package/README.md +45 -16
  2. package/dist/cli/charts/bar-chart.js +104 -0
  3. package/dist/cli/charts/bar-chart.js.map +1 -0
  4. package/dist/cli/charts/sparkline.js +18 -0
  5. package/dist/cli/charts/sparkline.js.map +1 -0
  6. package/dist/cli/charts/stacked-bar.js +59 -0
  7. package/dist/cli/charts/stacked-bar.js.map +1 -0
  8. package/dist/cli/cli-name.js +20 -0
  9. package/dist/cli/cli-name.js.map +1 -0
  10. package/dist/cli/commands/claims.js +170 -0
  11. package/dist/cli/commands/claims.js.map +1 -0
  12. package/dist/cli/commands/doctor.js +22 -1
  13. package/dist/cli/commands/doctor.js.map +1 -1
  14. package/dist/cli/commands/models.js +5 -5
  15. package/dist/cli/commands/models.js.map +1 -1
  16. package/dist/cli/commands/open.js +309 -315
  17. package/dist/cli/commands/open.js.map +1 -1
  18. package/dist/cli/commands/ps.js +226 -23
  19. package/dist/cli/commands/ps.js.map +1 -1
  20. package/dist/cli/commands/rename.js +29 -0
  21. package/dist/cli/commands/rename.js.map +1 -0
  22. package/dist/cli/commands/run.js +50 -18
  23. package/dist/cli/commands/run.js.map +1 -1
  24. package/dist/cli/commands/setup.js +989 -72
  25. package/dist/cli/commands/setup.js.map +1 -1
  26. package/dist/cli/commands/usage.js +192 -0
  27. package/dist/cli/commands/usage.js.map +1 -0
  28. package/dist/cli/commands/wait.js +3 -2
  29. package/dist/cli/commands/wait.js.map +1 -1
  30. package/dist/cli/commands/web.js +224 -0
  31. package/dist/cli/commands/web.js.map +1 -0
  32. package/dist/cli/index.js +36 -21
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/picker-state.js +75 -8
  35. package/dist/cli/picker-state.js.map +1 -1
  36. package/dist/cli/picker.js +13 -3
  37. package/dist/cli/picker.js.map +1 -1
  38. package/dist/cli/ui.js +54 -4
  39. package/dist/cli/ui.js.map +1 -1
  40. package/dist/cli/usage/dashboard.js +330 -0
  41. package/dist/cli/usage/dashboard.js.map +1 -0
  42. package/dist/cli/usage/snapshot.js +112 -0
  43. package/dist/cli/usage/snapshot.js.map +1 -0
  44. package/dist/config/config.js +326 -5
  45. package/dist/config/config.js.map +1 -1
  46. package/dist/config/orchestrator-mode.js +72 -0
  47. package/dist/config/orchestrator-mode.js.map +1 -0
  48. package/dist/config/paths.js +28 -9
  49. package/dist/config/paths.js.map +1 -1
  50. package/dist/core/autocompact.js +77 -0
  51. package/dist/core/autocompact.js.map +1 -0
  52. package/dist/core/driver.js.map +1 -1
  53. package/dist/core/models.js +166 -3
  54. package/dist/core/models.js.map +1 -1
  55. package/dist/core/pricing.js +83 -0
  56. package/dist/core/pricing.js.map +1 -0
  57. package/dist/core/roles.js +14 -3
  58. package/dist/core/roles.js.map +1 -1
  59. package/dist/core/run-usage.js +46 -0
  60. package/dist/core/run-usage.js.map +1 -0
  61. package/dist/core/session.js +18 -0
  62. package/dist/core/session.js.map +1 -1
  63. package/dist/daemon/daemon.js +286 -8
  64. package/dist/daemon/daemon.js.map +1 -1
  65. package/dist/daemon/ipc.js +10 -3
  66. package/dist/daemon/ipc.js.map +1 -1
  67. package/dist/drivers/antigravity/driver.js +158 -0
  68. package/dist/drivers/antigravity/driver.js.map +1 -0
  69. package/dist/drivers/antigravity/parser.js +168 -0
  70. package/dist/drivers/antigravity/parser.js.map +1 -0
  71. package/dist/drivers/claude/driver.js +13 -3
  72. package/dist/drivers/claude/driver.js.map +1 -1
  73. package/dist/drivers/opencode/driver.js +1 -114
  74. package/dist/drivers/opencode/driver.js.map +1 -1
  75. package/dist/drivers/opencode/parser.js +86 -0
  76. package/dist/drivers/opencode/parser.js.map +1 -0
  77. package/dist/drivers/registry.js +2 -0
  78. package/dist/drivers/registry.js.map +1 -1
  79. package/dist/drivers/session-driver.js +6 -4
  80. package/dist/drivers/session-driver.js.map +1 -1
  81. package/dist/drivers/session-runtime.js +1 -0
  82. package/dist/drivers/session-runtime.js.map +1 -1
  83. package/dist/git/worktree.js +1 -1
  84. package/dist/git/worktree.js.map +1 -1
  85. package/dist/open/contract.js +116 -0
  86. package/dist/open/contract.js.map +1 -0
  87. package/dist/open/injection.js +60 -0
  88. package/dist/open/injection.js.map +1 -0
  89. package/dist/open/launchers/claude.js +215 -0
  90. package/dist/open/launchers/claude.js.map +1 -0
  91. package/dist/open/launchers/opencode.js +213 -0
  92. package/dist/open/launchers/opencode.js.map +1 -0
  93. package/dist/open/orchestrator-prose.js +12 -0
  94. package/dist/open/orchestrator-prose.js.map +1 -0
  95. package/dist/open/pty.js +281 -0
  96. package/dist/open/pty.js.map +1 -0
  97. package/dist/open/runtime.js +632 -0
  98. package/dist/open/runtime.js.map +1 -0
  99. package/dist/plugin/agents/auditor.md +7 -1
  100. package/dist/plugin/agents/general.md +12 -1
  101. package/dist/plugin/agents/orchestrator-edit.md +67 -0
  102. package/dist/plugin/agents/orchestrator-read.md +67 -0
  103. package/dist/plugin/agents/orchestrator.md +74 -17
  104. package/dist/plugin/agents/reviewer.md +3 -0
  105. package/dist/plugin/commands/autonomous.md +58 -0
  106. package/dist/plugin/hooks/hooks.json +24 -0
  107. package/dist/plugin/hooks/session-id.sh +23 -0
  108. package/dist/plugin/hooks/session-name-lib.mjs +40 -0
  109. package/dist/plugin/hooks/session-name-worker.mjs +124 -0
  110. package/dist/plugin/hooks/session-name.mjs +66 -0
  111. package/dist/plugin/hooks/session-name.sh +7 -0
  112. package/dist/plugin/pty-shim.mjs +114 -0
  113. package/dist/plugin/statusline.sh +214 -22
  114. package/dist/plugin/themes/codedeck-rage.json +74 -0
  115. package/dist/plugin/themes/codedeck-ultra.json +52 -44
  116. package/dist/store/claims.js +152 -0
  117. package/dist/store/claims.js.map +1 -0
  118. package/dist/store/database.js +50 -15
  119. package/dist/store/database.js.map +1 -1
  120. package/dist/store/sessions.js +234 -3
  121. package/dist/store/sessions.js.map +1 -1
  122. package/dist/web/canvas-page.js +921 -0
  123. package/dist/web/canvas-page.js.map +1 -0
  124. package/package.json +3 -2
  125. package/dist/plugin/settings.json +0 -7
@@ -1,6 +1,29 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import { getPaths } from "./paths.js";
3
+ import { getLegacyConfigFile, getPaths, hasConfigOverride } from "./paths.js";
4
+ import { isAgentId } from "../core/session.js";
5
+ import { parseSandbox } from "../core/driver.js";
6
+ export { BALANCED_PRESET, DISPATCHER_PRESET, EXPLORER_PRESET, ORCHESTRATOR_PRESETS, isOrchestratorMode, orchestratorModeLabel, resolveOrchestratorMode, } from "./orchestrator-mode.js";
7
+ /**
8
+ * A saved binding is only usable whole. A half-written entry (a harness with
9
+ * no model, or the reverse) resolves to nothing rather than to a guess, so the
10
+ * caller falls back the same way it would for a role nobody configured.
11
+ *
12
+ * The file is JSON someone can edit, and the cast in `loadConfig` believes
13
+ * whatever it finds, so the harness is checked against the four CodeDeck
14
+ * drives. Without that, `{"harness":"wat"}` reached the daemon as an agent id
15
+ * and died there instead of falling back here.
16
+ */
17
+ export function resolveRoleBinding(role, config = {}) {
18
+ if (role === undefined)
19
+ return undefined;
20
+ const binding = config.agents?.[role];
21
+ if (!binding || !isAgentId(binding.harness))
22
+ return undefined;
23
+ if (typeof binding.model !== "string" || binding.model.trim() === "")
24
+ return undefined;
25
+ return { harness: binding.harness, model: binding.model };
26
+ }
4
27
  /**
5
28
  * Resolve the model passed to a driver without making driver defaults part of
6
29
  * CodeDeck's config. An undefined result lets the selected driver choose its
@@ -9,10 +32,303 @@ import { getPaths } from "./paths.js";
9
32
  export function resolveModel(agent, explicit, config = {}) {
10
33
  return explicit ?? config.models?.[agent] ?? config.defaultModel;
11
34
  }
12
- const DEFAULT_CONFIG = {
35
+ /**
36
+ * Resolve a hand-edited sandbox value without allowing an invalid value to
37
+ * reach a driver. An invalid value is treated as absent, so the driver keeps
38
+ * its own fallback.
39
+ */
40
+ export function resolveDefaultSandbox(config = {}) {
41
+ try {
42
+ const value = config?.defaultSandbox;
43
+ return typeof value === "string" ? parseSandbox(value) : undefined;
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ }
49
+ // Native auto-compaction is intentionally not materialized in the default
50
+ // object. Existing config and open-argument contracts compare exact vectors;
51
+ // enable it explicitly with `autocompact: { enabled: true }`.
52
+ export const DEFAULT_CONFIG = {
13
53
  defaultAgent: "claude",
14
54
  worktree: false,
55
+ remoteControl: true,
56
+ pty: true,
15
57
  };
58
+ export function defaultConfig() {
59
+ return { ...DEFAULT_CONFIG };
60
+ }
61
+ function isJsonObject(value) {
62
+ return typeof value === "object" && value !== null && !Array.isArray(value);
63
+ }
64
+ export function serializeConfig(config) {
65
+ const sortJson = (value) => {
66
+ if (Array.isArray(value))
67
+ return value.map(sortJson);
68
+ if (!isJsonObject(value))
69
+ return value;
70
+ return Object.fromEntries(Object.keys(value)
71
+ .sort((left, right) => left.localeCompare(right))
72
+ .map((key) => [key, sortJson(value[key])]));
73
+ };
74
+ return `${JSON.stringify(sortJson(config), null, 2)}\n`;
75
+ }
76
+ function isMissing(error) {
77
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
78
+ }
79
+ function configInvalidMessage(file) {
80
+ return `Config file "${file}" contains invalid JSON; no changes were written. Repair or move it and retry.`;
81
+ }
82
+ function assertSecureDirectoryPath(directory) {
83
+ const absolute = path.resolve(directory);
84
+ const parsed = path.parse(absolute);
85
+ let current = parsed.root;
86
+ const parts = absolute.slice(parsed.root.length).split(path.sep).filter(Boolean);
87
+ for (const part of parts) {
88
+ current = path.join(current, part);
89
+ let stat;
90
+ try {
91
+ stat = fs.lstatSync(current);
92
+ }
93
+ catch (error) {
94
+ if (isMissing(error))
95
+ return;
96
+ throw error;
97
+ }
98
+ if (stat.isSymbolicLink())
99
+ throw new Error(`configuration directory component is a symbolic link: ${current}`);
100
+ if (!stat.isDirectory())
101
+ throw new Error(`configuration path component is not a directory: ${current}`);
102
+ }
103
+ }
104
+ function readConfigFile(file) {
105
+ try {
106
+ assertSecureDirectoryPath(path.dirname(file));
107
+ }
108
+ catch (error) {
109
+ return { kind: "error", error: error instanceof Error ? error : new Error(String(error)) };
110
+ }
111
+ let stat;
112
+ try {
113
+ stat = fs.lstatSync(file);
114
+ }
115
+ catch (error) {
116
+ if (isMissing(error))
117
+ return { kind: "missing" };
118
+ return { kind: "error", error: error instanceof Error ? error : new Error(String(error)) };
119
+ }
120
+ if (stat.isSymbolicLink()) {
121
+ return { kind: "error", error: new Error("configuration path is a symbolic link") };
122
+ }
123
+ if (!stat.isFile()) {
124
+ return { kind: "error", error: new Error("configuration path is not a regular file") };
125
+ }
126
+ let raw;
127
+ try {
128
+ raw = fs.readFileSync(file, "utf8");
129
+ }
130
+ catch (error) {
131
+ return { kind: "error", error: error instanceof Error ? error : new Error(String(error)) };
132
+ }
133
+ try {
134
+ const parsed = JSON.parse(raw);
135
+ if (!isJsonObject(parsed))
136
+ return { kind: "invalid", raw };
137
+ return { kind: "ok", raw, config: { ...DEFAULT_CONFIG, ...parsed } };
138
+ }
139
+ catch {
140
+ return { kind: "invalid", raw };
141
+ }
142
+ }
143
+ function setupConfigResult(file, source, result) {
144
+ if (result.kind === "missing") {
145
+ return {
146
+ status: "missing",
147
+ source: "none",
148
+ path: file,
149
+ config: defaultConfig(),
150
+ raw: null,
151
+ message: null,
152
+ };
153
+ }
154
+ if (result.kind === "error") {
155
+ return {
156
+ status: "invalid",
157
+ source,
158
+ path: file,
159
+ config: null,
160
+ raw: result.raw ?? null,
161
+ message: result.error?.message ?? "Unable to read configuration.",
162
+ readError: result.error,
163
+ };
164
+ }
165
+ if (result.config === undefined) {
166
+ return {
167
+ status: "invalid",
168
+ source,
169
+ path: file,
170
+ config: null,
171
+ raw: result.raw ?? null,
172
+ message: configInvalidMessage(file),
173
+ };
174
+ }
175
+ return {
176
+ status: "ok",
177
+ source,
178
+ path: file,
179
+ config: result.config,
180
+ raw: result.raw ?? null,
181
+ message: null,
182
+ };
183
+ }
184
+ /** Reads setup config without replacing malformed JSON with defaults. */
185
+ export function readConfigForSetup() {
186
+ const paths = getPaths();
187
+ const canonical = readConfigFile(paths.configFile);
188
+ if (canonical.kind !== "missing") {
189
+ return setupConfigResult(paths.configFile, "canonical", canonical);
190
+ }
191
+ if (!hasConfigOverride()) {
192
+ const legacyPath = getLegacyConfigFile();
193
+ const legacy = readConfigFile(legacyPath);
194
+ if (legacy.kind !== "missing")
195
+ return setupConfigResult(legacyPath, "legacy", legacy);
196
+ }
197
+ return {
198
+ status: "missing",
199
+ source: "none",
200
+ path: paths.configFile,
201
+ config: defaultConfig(),
202
+ raw: null,
203
+ message: null,
204
+ };
205
+ }
206
+ function ensureSecureDirectory(directory) {
207
+ const absolute = path.resolve(directory);
208
+ const parsed = path.parse(absolute);
209
+ let current = parsed.root;
210
+ const parts = absolute.slice(parsed.root.length).split(path.sep).filter(Boolean);
211
+ for (const part of parts) {
212
+ current = path.join(current, part);
213
+ try {
214
+ const stat = fs.lstatSync(current);
215
+ if (stat.isSymbolicLink())
216
+ throw new Error(`configuration directory component is a symbolic link: ${current}`);
217
+ if (!stat.isDirectory())
218
+ throw new Error(`configuration path component is not a directory: ${current}`);
219
+ }
220
+ catch (error) {
221
+ if (!isMissing(error))
222
+ throw error;
223
+ try {
224
+ fs.mkdirSync(current, { mode: 0o700 });
225
+ }
226
+ catch (mkdirError) {
227
+ if (!isMissing(mkdirError) && mkdirError.code !== "EEXIST")
228
+ throw mkdirError;
229
+ }
230
+ const stat = fs.lstatSync(current);
231
+ if (stat.isSymbolicLink())
232
+ throw new Error(`configuration directory component is a symbolic link: ${current}`);
233
+ if (!stat.isDirectory())
234
+ throw new Error(`configuration path component is not a directory: ${current}`);
235
+ }
236
+ }
237
+ }
238
+ function existingConfigBytes(file) {
239
+ try {
240
+ const stat = fs.lstatSync(file);
241
+ if (stat.isSymbolicLink())
242
+ throw new Error("configuration target is a symbolic link");
243
+ if (!stat.isFile())
244
+ throw new Error("configuration target is not a regular file");
245
+ return fs.readFileSync(file, "utf8");
246
+ }
247
+ catch (error) {
248
+ if (isMissing(error))
249
+ return undefined;
250
+ throw error;
251
+ }
252
+ }
253
+ let tempSequence = 0;
254
+ /** Writes a complete config document without following a symlink. */
255
+ export function writeConfigAtomically(file, contents) {
256
+ const absoluteFile = path.resolve(file);
257
+ const parent = path.dirname(absoluteFile);
258
+ ensureSecureDirectory(parent);
259
+ const noFollow = fs.constants.O_NOFOLLOW;
260
+ if (noFollow === undefined)
261
+ throw new Error("O_NOFOLLOW is not supported on this platform");
262
+ if (existingConfigBytes(absoluteFile) === contents)
263
+ return false;
264
+ let temporary;
265
+ let fd;
266
+ let renamed = false;
267
+ for (let attempt = 0; attempt < 20; attempt += 1) {
268
+ const name = `${path.basename(absoluteFile)}.${process.pid}.${Date.now()}.${tempSequence++}.${attempt}.tmp`;
269
+ const candidate = path.join(parent, name);
270
+ try {
271
+ fd = fs.openSync(candidate, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY | noFollow, 0o600);
272
+ temporary = candidate;
273
+ break;
274
+ }
275
+ catch (error) {
276
+ if (error.code === "EEXIST")
277
+ continue;
278
+ throw error;
279
+ }
280
+ }
281
+ if (fd === undefined || temporary === undefined)
282
+ throw new Error("could not create a unique config temporary file");
283
+ try {
284
+ fs.fchmodSync(fd, 0o600);
285
+ const bytes = Buffer.from(contents, "utf8");
286
+ let offset = 0;
287
+ while (offset < bytes.length) {
288
+ const written = fs.writeSync(fd, bytes, offset, bytes.length - offset);
289
+ if (written <= 0)
290
+ throw new Error("config write made no progress");
291
+ offset += written;
292
+ }
293
+ fs.fsyncSync(fd);
294
+ fs.closeSync(fd);
295
+ fd = undefined;
296
+ try {
297
+ const target = fs.lstatSync(absoluteFile);
298
+ if (target.isSymbolicLink())
299
+ throw new Error("configuration target is a symbolic link");
300
+ }
301
+ catch (error) {
302
+ if (!isMissing(error))
303
+ throw error;
304
+ }
305
+ fs.renameSync(temporary, absoluteFile);
306
+ renamed = true;
307
+ const directoryFlag = fs.constants.O_DIRECTORY ?? 0;
308
+ const directoryFd = fs.openSync(parent, fs.constants.O_RDONLY | directoryFlag | noFollow);
309
+ try {
310
+ fs.fsyncSync(directoryFd);
311
+ }
312
+ finally {
313
+ fs.closeSync(directoryFd);
314
+ }
315
+ return true;
316
+ }
317
+ finally {
318
+ if (fd !== undefined) {
319
+ try {
320
+ fs.closeSync(fd);
321
+ }
322
+ catch { }
323
+ }
324
+ if (!renamed && temporary !== undefined) {
325
+ try {
326
+ fs.unlinkSync(temporary);
327
+ }
328
+ catch { }
329
+ }
330
+ }
331
+ }
16
332
  export function loadConfig() {
17
333
  const { configFile } = getPaths();
18
334
  try {
@@ -20,7 +336,7 @@ export function loadConfig() {
20
336
  return { ...DEFAULT_CONFIG };
21
337
  const raw = fs.readFileSync(configFile, "utf-8");
22
338
  const parsed = JSON.parse(raw);
23
- return { ...DEFAULT_CONFIG, ...parsed };
339
+ return isJsonObject(parsed) ? { ...DEFAULT_CONFIG, ...parsed } : { ...DEFAULT_CONFIG };
24
340
  }
25
341
  catch {
26
342
  return { ...DEFAULT_CONFIG };
@@ -28,7 +344,12 @@ export function loadConfig() {
28
344
  }
29
345
  export function saveConfig(cfg) {
30
346
  const { configFile } = getPaths();
31
- fs.mkdirSync(path.dirname(configFile), { recursive: true });
32
- fs.writeFileSync(configFile, JSON.stringify(cfg, null, 2), "utf-8");
347
+ return writeConfigAtomically(configFile, serializeConfig(cfg));
348
+ }
349
+ export function createSetupConfigStore() {
350
+ return {
351
+ read: readConfigForSetup,
352
+ save: saveConfig,
353
+ };
33
354
  }
34
355
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUtC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAc,EACd,QAAiB,EACjB,SAAyB,EAAE;IAE3B,OAAO,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC;AACnE,CAAC;AAED,MAAM,cAAc,GAAmB;IACrC,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QACjD,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAmB;IAC5C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export const DISPATCHER_PRESET = Object.freeze({
2
+ investigate: "none",
3
+ selfWork: "none",
4
+ tools: "dispatch",
5
+ });
6
+ export const BALANCED_PRESET = Object.freeze({
7
+ investigate: "read",
8
+ selfWork: "trivial",
9
+ tools: "edit",
10
+ });
11
+ export const EXPLORER_PRESET = Object.freeze({
12
+ investigate: "free",
13
+ selfWork: "small",
14
+ tools: "edit",
15
+ });
16
+ export const ORCHESTRATOR_PRESETS = Object.freeze({
17
+ dispatcher: DISPATCHER_PRESET,
18
+ balanced: BALANCED_PRESET,
19
+ explorer: EXPLORER_PRESET,
20
+ });
21
+ const INVESTIGATE_MODES = ["none", "read", "free"];
22
+ const SELF_WORK_MODES = ["none", "trivial", "small"];
23
+ const ORCHESTRATOR_TOOLS = ["dispatch", "read", "edit"];
24
+ function hasOwn(value, property) {
25
+ return Object.prototype.hasOwnProperty.call(value, property);
26
+ }
27
+ export function isOrchestratorMode(value) {
28
+ if (typeof value !== "object" || value === null || Array.isArray(value))
29
+ return false;
30
+ const candidate = value;
31
+ if (!INVESTIGATE_MODES.includes(candidate.investigate))
32
+ return false;
33
+ if (!SELF_WORK_MODES.includes(candidate.selfWork))
34
+ return false;
35
+ if (!ORCHESTRATOR_TOOLS.includes(candidate.tools))
36
+ return false;
37
+ if (!hasOwn(candidate, "parallelism"))
38
+ return true;
39
+ return typeof candidate.parallelism === "number" && Number.isFinite(candidate.parallelism) && candidate.parallelism > 0;
40
+ }
41
+ function copyMode(mode) {
42
+ return {
43
+ investigate: mode.investigate,
44
+ selfWork: mode.selfWork,
45
+ tools: mode.tools,
46
+ ...(hasOwn(mode, "parallelism") ? { parallelism: mode.parallelism } : {}),
47
+ };
48
+ }
49
+ export function resolveOrchestratorMode(config = {}) {
50
+ const configured = config.orchestrator;
51
+ if (!isOrchestratorMode(configured))
52
+ return copyMode(DISPATCHER_PRESET);
53
+ return copyMode(configured);
54
+ }
55
+ function matchesPreset(mode, preset) {
56
+ const sameParallelism = hasOwn(mode, "parallelism") === hasOwn(preset, "parallelism") &&
57
+ (!hasOwn(mode, "parallelism") || mode.parallelism === preset.parallelism);
58
+ return (mode.investigate === preset.investigate &&
59
+ mode.selfWork === preset.selfWork &&
60
+ mode.tools === preset.tools &&
61
+ sameParallelism);
62
+ }
63
+ export function orchestratorModeLabel(mode) {
64
+ if (matchesPreset(mode, DISPATCHER_PRESET))
65
+ return "dispatcher";
66
+ if (matchesPreset(mode, BALANCED_PRESET))
67
+ return "balanced";
68
+ if (matchesPreset(mode, EXPLORER_PRESET))
69
+ return "explorer";
70
+ return "custom";
71
+ }
72
+ //# sourceMappingURL=orchestrator-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-mode.js","sourceRoot":"","sources":["../../src/config/orchestrator-mode.ts"],"names":[],"mappings":"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"}
@@ -4,21 +4,31 @@ import fs from "node:fs";
4
4
  export function getHomeDir() {
5
5
  return os.homedir();
6
6
  }
7
+ function nonEmpty(value) {
8
+ return value !== undefined && value.trim() !== "";
9
+ }
7
10
  export function getRunAgentDir() {
8
11
  // Allow override via env for testing
9
- if (process.env.RUN_AGENT_DIR)
10
- return process.env.RUN_AGENT_DIR;
12
+ if (nonEmpty(process.env.RUN_AGENT_DIR))
13
+ return path.resolve(process.env.RUN_AGENT_DIR);
11
14
  // Respect XDG_DATA_HOME if set, otherwise ~/.run-agent as per spec
12
15
  // Spec says ~/.run-agent, we honor that
13
- return path.join(getHomeDir(), ".run-agent");
16
+ return path.resolve(getHomeDir(), ".run-agent");
14
17
  }
15
18
  export function getConfigDir() {
16
- if (process.env.RUN_AGENT_CONFIG_DIR)
17
- return process.env.RUN_AGENT_CONFIG_DIR;
19
+ if (nonEmpty(process.env.RUN_AGENT_CONFIG_DIR)) {
20
+ return path.resolve(process.env.RUN_AGENT_CONFIG_DIR);
21
+ }
18
22
  const xdg = process.env.XDG_CONFIG_HOME;
19
- if (xdg)
20
- return path.join(xdg, "run-agent");
21
- return path.join(getHomeDir(), ".config", "run-agent");
23
+ if (nonEmpty(xdg))
24
+ return path.resolve(xdg, "run-agent");
25
+ return path.resolve(getHomeDir(), ".config", "run-agent");
26
+ }
27
+ export function hasConfigOverride(env = process.env) {
28
+ return nonEmpty(env.RUN_AGENT_CONFIG_DIR) || nonEmpty(env.XDG_CONFIG_HOME);
29
+ }
30
+ export function getLegacyConfigFile() {
31
+ return path.resolve(getHomeDir(), ".run-agent", "config.json");
22
32
  }
23
33
  export function getPaths() {
24
34
  const base = getRunAgentDir();
@@ -32,8 +42,14 @@ export function getPaths() {
32
42
  logsDir: path.join(base, "logs"),
33
43
  worktreesDir: path.join(base, "worktrees"),
34
44
  cacheDir: path.join(base, "cache"),
45
+ // Per-session scratch: the session id a hook reports, and the name it
46
+ // derives from the first prompt. It lives here rather than in the shared
47
+ // temp directory because `open` types what it finds there into a live
48
+ // session, and on Linux anyone on the box can write to /tmp.
49
+ sessionsDir: path.join(base, "sessions"),
35
50
  modelsCache: path.join(base, "cache", "models.json"),
36
- configFile: path.join(configBase, "config.json"),
51
+ configFile: path.resolve(configBase, "config.json"),
52
+ legacyConfigFile: getLegacyConfigFile(),
37
53
  };
38
54
  }
39
55
  export function ensureDirs() {
@@ -41,5 +57,8 @@ export function ensureDirs() {
41
57
  for (const dir of [p.base, p.logsDir, p.worktreesDir, p.cacheDir, path.dirname(p.configFile)]) {
42
58
  fs.mkdirSync(dir, { recursive: true });
43
59
  }
60
+ // Narrower than the rest on purpose: what lands here is typed into a
61
+ // session, so only its owner may put anything in it.
62
+ fs.mkdirSync(p.sessionsDir, { recursive: true, mode: 0o700 });
44
63
  }
45
64
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,qCAAqC;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAChE,mEAAmE;IACnE,wCAAwC;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACxC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAChC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAC1C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QACpD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC9F,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export const AUTOCOMPACT_MIN_TOKENS = 100_000;
2
+ export const AUTOCOMPACT_MAX_TOKENS = 1_000_000;
3
+ export const AUTOCOMPACT_DEFAULT_CAP = 260_000;
4
+ export const AUTOCOMPACT_DEFAULT_PERCENT = 0.8;
5
+ export function parseAutocompact(value) {
6
+ if (value === undefined)
7
+ return undefined;
8
+ if (value === true || value === false)
9
+ return value;
10
+ if (typeof value !== "string") {
11
+ throw invalidAutocompactValue(value);
12
+ }
13
+ if (value === "auto")
14
+ return value;
15
+ if (/^\d+$/.test(value)) {
16
+ const tokens = Number(value);
17
+ if (Number.isSafeInteger(tokens) && tokens >= AUTOCOMPACT_MIN_TOKENS && tokens <= AUTOCOMPACT_MAX_TOKENS) {
18
+ return tokens;
19
+ }
20
+ }
21
+ throw invalidAutocompactValue(value);
22
+ }
23
+ function invalidAutocompactValue(value) {
24
+ return new Error(`Invalid --autocompact value "${String(value)}". Expected "auto" or an integer from ${AUTOCOMPACT_MIN_TOKENS} to ${AUTOCOMPACT_MAX_TOKENS}.`);
25
+ }
26
+ function clampTokens(tokens) {
27
+ return Math.min(AUTOCOMPACT_MAX_TOKENS, Math.max(AUTOCOMPACT_MIN_TOKENS, Math.floor(tokens)));
28
+ }
29
+ function hasPassthroughOverride(passthrough) {
30
+ return passthrough?.some((token) => token === "--autocompact" || token.startsWith("--autocompact=") || token === "--no-autocompact") ?? false;
31
+ }
32
+ function explicitTokens(explicit) {
33
+ if (explicit === undefined || explicit === true || explicit === false)
34
+ return explicit;
35
+ if (explicit === "--no-autocompact")
36
+ return false;
37
+ if (explicit === "auto")
38
+ return "auto";
39
+ if (typeof explicit === "number")
40
+ return Number.isFinite(explicit) ? clampTokens(explicit) : undefined;
41
+ const parsed = parseAutocompact(explicit);
42
+ if (parsed === undefined || parsed === true || parsed === false)
43
+ return parsed;
44
+ return parsed === "auto" ? parsed : clampTokens(parsed);
45
+ }
46
+ export function resolveAutocompactTokens(options = {}) {
47
+ const explicit = explicitTokens(options.explicit);
48
+ if (explicit === false)
49
+ return undefined;
50
+ if (hasPassthroughOverride(options.passthrough))
51
+ return undefined;
52
+ if (explicit !== undefined && explicit !== true)
53
+ return explicit;
54
+ const config = options.config?.autocompact;
55
+ if (config?.enabled === false && explicit !== true)
56
+ return undefined;
57
+ if (typeof config?.tokens === "number" && Number.isFinite(config.tokens)) {
58
+ return clampTokens(config.tokens);
59
+ }
60
+ if (config?.mode === "auto")
61
+ return "auto";
62
+ const cap = typeof config?.cap === "number" && Number.isFinite(config.cap)
63
+ ? config.cap
64
+ : AUTOCOMPACT_DEFAULT_CAP;
65
+ const percent = typeof config?.percent === "number" && Number.isFinite(config.percent)
66
+ ? config.percent
67
+ : AUTOCOMPACT_DEFAULT_PERCENT;
68
+ const requested = typeof options.contextWindow === "number" && Number.isFinite(options.contextWindow)
69
+ ? Math.min(cap, Math.floor(percent * options.contextWindow))
70
+ : cap;
71
+ return clampTokens(requested);
72
+ }
73
+ export function autocompactArgs(options = {}) {
74
+ const tokens = resolveAutocompactTokens(options);
75
+ return tokens === undefined ? [] : ["--autocompact", String(tokens)];
76
+ }
77
+ //# sourceMappingURL=autocompact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocompact.js","sourceRoot":"","sources":["../../src/core/autocompact.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvG,8EAA8E;AAC9E,8EAA8E;AAC9E,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAK,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAwB,CAAC;IAC9F,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC;AAOD,MAAM,CAAC,MAAM,eAAe,GAA4B,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAE/G,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAqB,CAAC;IACzF,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5F,CAAC"}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvG,8EAA8E;AAC9E,8EAA8E;AAC9E,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAK,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAwB,CAAC;IAC9F,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC;AAOD,MAAM,CAAC,MAAM,eAAe,GAA4B,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAE/G,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAqB,CAAC;IACzF,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5F,CAAC"}