@berthdev/berth 0.3.5 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/src/agents/capabilities.d.ts +13 -0
- package/dist/src/agents/capabilities.js +52 -0
- package/dist/src/agents/capabilities.js.map +1 -0
- package/dist/src/agents/codex-binding.d.ts +10 -0
- package/dist/src/agents/codex-binding.js +105 -0
- package/dist/src/agents/codex-binding.js.map +1 -0
- package/dist/src/agents/commands.d.ts +4 -2
- package/dist/src/agents/commands.js +41 -9
- package/dist/src/agents/commands.js.map +1 -1
- package/dist/src/agents/copilot-state.d.ts +3 -0
- package/dist/src/agents/copilot-state.js +94 -0
- package/dist/src/agents/copilot-state.js.map +1 -0
- package/dist/src/agents/gemini-state.d.ts +3 -0
- package/dist/src/agents/gemini-state.js +41 -0
- package/dist/src/agents/gemini-state.js.map +1 -0
- package/dist/src/agents/hook-files.d.ts +1 -3
- package/dist/src/agents/hook-files.js +69 -53
- package/dist/src/agents/hook-files.js.map +1 -1
- package/dist/src/agents/hook-health.d.ts +4 -0
- package/dist/src/agents/hook-health.js +95 -0
- package/dist/src/agents/hook-health.js.map +1 -0
- package/dist/src/agents/hooks.d.ts +4 -1
- package/dist/src/agents/hooks.js +155 -22
- package/dist/src/agents/hooks.js.map +1 -1
- package/dist/src/agents/jsonl-titles.d.ts +8 -0
- package/dist/src/agents/jsonl-titles.js +124 -0
- package/dist/src/agents/jsonl-titles.js.map +1 -0
- package/dist/src/agents/late-binding.d.ts +2 -0
- package/dist/src/agents/late-binding.js +25 -0
- package/dist/src/agents/late-binding.js.map +1 -0
- package/dist/src/agents/profile.d.ts +14 -0
- package/dist/src/agents/profile.js +75 -0
- package/dist/src/agents/profile.js.map +1 -0
- package/dist/src/agents/registry.d.ts +12 -3
- package/dist/src/agents/registry.js +52 -19
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/roots.d.ts +2 -0
- package/dist/src/agents/roots.js +21 -0
- package/dist/src/agents/roots.js.map +1 -0
- package/dist/src/agents/titles.d.ts +14 -0
- package/dist/src/agents/titles.js +82 -0
- package/dist/src/agents/titles.js.map +1 -0
- package/dist/src/agents/transcript-cursor.d.ts +9 -0
- package/dist/src/agents/transcript-cursor.js +86 -0
- package/dist/src/agents/transcript-cursor.js.map +1 -0
- package/dist/src/cli/main.js +40 -7
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/config/index.d.ts +6 -0
- package/dist/src/config/index.js +37 -6
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/write.d.ts +2 -0
- package/dist/src/config/write.js +41 -0
- package/dist/src/config/write.js.map +1 -0
- package/dist/src/context.js +1 -1
- package/dist/src/context.js.map +1 -1
- package/dist/src/index.d.ts +11 -5
- package/dist/src/index.js +10 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/iterm2/install.d.ts +2 -0
- package/dist/src/iterm2/install.js +37 -12
- package/dist/src/iterm2/install.js.map +1 -1
- package/dist/src/present/attach.js +17 -5
- package/dist/src/present/attach.js.map +1 -1
- package/dist/src/present/state.d.ts +3 -0
- package/dist/src/present/state.js +12 -8
- package/dist/src/present/state.js.map +1 -1
- package/dist/src/process-arguments.d.ts +2 -0
- package/dist/src/process-arguments.js +59 -0
- package/dist/src/process-arguments.js.map +1 -0
- package/dist/src/process-directory.d.ts +2 -0
- package/dist/src/process-directory.js +37 -0
- package/dist/src/process-directory.js.map +1 -0
- package/dist/src/process-owner.d.ts +7 -0
- package/dist/src/process-owner.js +51 -0
- package/dist/src/process-owner.js.map +1 -0
- package/dist/src/registry/directory.d.ts +2 -0
- package/dist/src/registry/directory.js +19 -0
- package/dist/src/registry/directory.js.map +1 -0
- package/dist/src/registry/discover.d.ts +15 -5
- package/dist/src/registry/discover.js +135 -38
- package/dist/src/registry/discover.js.map +1 -1
- package/dist/src/registry/doctor.d.ts +5 -1
- package/dist/src/registry/doctor.js +53 -12
- package/dist/src/registry/doctor.js.map +1 -1
- package/dist/src/registry/hosts.d.ts +28 -0
- package/dist/src/registry/hosts.js +73 -0
- package/dist/src/registry/hosts.js.map +1 -0
- package/dist/src/registry/launch.d.ts +3 -0
- package/dist/src/registry/launch.js +29 -0
- package/dist/src/registry/launch.js.map +1 -0
- package/dist/src/registry/native-state.d.ts +20 -0
- package/dist/src/registry/native-state.js +127 -0
- package/dist/src/registry/native-state.js.map +1 -0
- package/dist/src/registry/sessions.d.ts +21 -3
- package/dist/src/registry/sessions.js +178 -37
- package/dist/src/registry/sessions.js.map +1 -1
- package/dist/src/restore/ensure.d.ts +12 -2
- package/dist/src/restore/ensure.js +171 -37
- package/dist/src/restore/ensure.js.map +1 -1
- package/dist/src/restore/lock.d.ts +3 -5
- package/dist/src/restore/lock.js +82 -52
- package/dist/src/restore/lock.js.map +1 -1
- package/dist/src/restore/status.d.ts +9 -0
- package/dist/src/restore/status.js +16 -0
- package/dist/src/restore/status.js.map +1 -0
- package/dist/src/snapshot/identity.d.ts +7 -0
- package/dist/src/snapshot/identity.js +20 -0
- package/dist/src/snapshot/identity.js.map +1 -0
- package/dist/src/snapshot/lifecycle.d.ts +9 -0
- package/dist/src/snapshot/lifecycle.js +37 -0
- package/dist/src/snapshot/lifecycle.js.map +1 -0
- package/dist/src/snapshot/store.d.ts +11 -1
- package/dist/src/snapshot/store.js +28 -9
- package/dist/src/snapshot/store.js.map +1 -1
- package/dist/src/snapshot/take.d.ts +2 -1
- package/dist/src/snapshot/take.js +29 -25
- package/dist/src/snapshot/take.js.map +1 -1
- package/dist/src/tmux/client.d.ts +6 -2
- package/dist/src/tmux/client.js +49 -25
- package/dist/src/tmux/client.js.map +1 -1
- package/dist/src/tmux/connections.d.ts +22 -0
- package/dist/src/tmux/connections.js +70 -0
- package/dist/src/tmux/connections.js.map +1 -0
- package/dist/src/tmux/fields.d.ts +7 -0
- package/dist/src/tmux/fields.js +23 -0
- package/dist/src/tmux/fields.js.map +1 -0
- package/dist/src/tmux/install.js +31 -18
- package/dist/src/tmux/install.js.map +1 -1
- package/dist/src/tools.d.ts +3 -1
- package/dist/src/tools.js +23 -11
- package/dist/src/tools.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/agents/name-key.d.ts +0 -1
- package/dist/src/agents/name-key.js +0 -66
- package/dist/src/agents/name-key.js.map +0 -1
package/dist/src/tmux/install.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { existsSync, readFileSync
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { shellQuote } from '../shell.js';
|
|
5
|
+
import { formatLiteral } from './fields.js';
|
|
6
|
+
import { writeConfigFile } from '../config/write.js';
|
|
5
7
|
/**
|
|
6
8
|
* `berth tmux install` (spec §5.3): a managed block in the user's tmux config
|
|
7
9
|
* that snapshots on session create / rename / close. Hooks use a fixed array
|
|
@@ -16,7 +18,7 @@ function hookArgs(cliPath) {
|
|
|
16
18
|
// Hooks are global in the user's tmux config and run in whichever server
|
|
17
19
|
// fires them: pass that server's socket so state stays per server. #{q:}
|
|
18
20
|
// quotes values for the shell (session names may contain quotes).
|
|
19
|
-
const berth = `${shellQuote(process.execPath)} ${shellQuote(cliPath)} --socket-path #{q:socket_path}`;
|
|
21
|
+
const berth = `${formatLiteral(shellQuote(process.execPath))} ${formatLiteral(shellQuote(cliPath))} --socket-path #{q:socket_path}`;
|
|
20
22
|
// `|| true`: tmux prints a failed run-shell into the pane; a hook must never disturb it.
|
|
21
23
|
const quiet = '>/dev/null 2>&1 || true';
|
|
22
24
|
const snapshot = `${berth} snapshot ${quiet}`;
|
|
@@ -34,34 +36,45 @@ function hookArgs(cliPath) {
|
|
|
34
36
|
export function tmuxConfPath(env = process.env) {
|
|
35
37
|
return join(env.HOME || homedir(), '.tmux.conf');
|
|
36
38
|
}
|
|
37
|
-
function
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
return text
|
|
42
|
-
|
|
39
|
+
function replaceBlock(text, replacement) {
|
|
40
|
+
const starts = [...text.matchAll(/^[\t ]*# >>> berth >>>[\t ]*\r?$/gm)];
|
|
41
|
+
const ends = [...text.matchAll(/^[\t ]*# <<< berth <<<[\t ]*\r?$/gm)];
|
|
42
|
+
if (!starts.length && !ends.length)
|
|
43
|
+
return `${text}${replacement && text && !text.endsWith('\n') ? '\n' : ''}${replacement}`;
|
|
44
|
+
if (starts.length !== 1 || ends.length !== 1 || starts[0].index >= ends[0].index) {
|
|
45
|
+
throw new Error('Invalid Berth managed block in tmux configuration; repair its markers before retrying.');
|
|
46
|
+
}
|
|
47
|
+
const end = ends[0].index + ends[0][0].length;
|
|
48
|
+
return text.slice(0, starts[0].index) + replacement + text.slice(text[end] === '\n' ? end + 1 : end);
|
|
49
|
+
}
|
|
50
|
+
function applyHooks(tmux, commands, file) {
|
|
51
|
+
try {
|
|
52
|
+
if (tmux.serverRunning())
|
|
53
|
+
for (const args of commands)
|
|
54
|
+
tmux.run(args);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Configuration-file changes are complete (${file}), but running tmux hooks could not be updated: ${error instanceof Error ? error.message : String(error)}. Retry the command to finish the live update.`);
|
|
58
|
+
}
|
|
43
59
|
}
|
|
44
60
|
export function installTmux(tmux, cliPath, env = process.env) {
|
|
45
61
|
const file = tmuxConfPath(env);
|
|
46
62
|
const current = existsSync(file) ? readFileSync(file, 'utf8') : '';
|
|
47
63
|
const lines = hookArgs(cliPath).map((args) => args.map((a, i) => (i === 3 ? `'${a.replace(/'/g, `'\\''`)}'` : a)).join(' '));
|
|
48
64
|
const block = [BEGIN, '# Managed by berth; remove with `berth tmux uninstall`.', ...lines, END].join('\n');
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (tmux.serverRunning())
|
|
52
|
-
for (const args of hookArgs(cliPath))
|
|
53
|
-
tmux.run(args, true);
|
|
65
|
+
writeConfigFile(file, replaceBlock(current, `${block}\n`));
|
|
66
|
+
applyHooks(tmux, hookArgs(cliPath), file);
|
|
54
67
|
return file;
|
|
55
68
|
}
|
|
56
69
|
export function uninstallTmux(tmux, env = process.env) {
|
|
57
70
|
const file = tmuxConfPath(env);
|
|
58
71
|
if (existsSync(file)) {
|
|
59
|
-
const
|
|
60
|
-
|
|
72
|
+
const current = readFileSync(file, 'utf8');
|
|
73
|
+
const rest = replaceBlock(current, '');
|
|
74
|
+
if (rest !== current)
|
|
75
|
+
writeConfigFile(file, rest);
|
|
61
76
|
}
|
|
62
|
-
|
|
63
|
-
for (const event of [...EVENTS, 'alert-bell', ...ATTACH_EVENTS])
|
|
64
|
-
tmux.run(['set-hook', '-gu', `${event}[${INDEX}]`], true);
|
|
77
|
+
applyHooks(tmux, [...EVENTS, 'alert-bell', ...ATTACH_EVENTS].map((event) => ['set-hook', '-gu', `${event}[${INDEX}]`]), file);
|
|
65
78
|
return file;
|
|
66
79
|
}
|
|
67
80
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/tmux/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/tmux/install.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tools.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Context } from './context.js';
|
|
2
2
|
import type { Tools } from './iterm2/install.js';
|
|
3
|
-
/**
|
|
3
|
+
/** Match executable-file PATH search; explicit paths never search PATH. */
|
|
4
|
+
export declare function executableOnPath(name: string, env?: NodeJS.ProcessEnv, cwd?: string): string | undefined;
|
|
5
|
+
/** Absolute executable path, or the original command when unavailable. */
|
|
4
6
|
export declare function resolveBinary(name: string, env?: NodeJS.ProcessEnv): string;
|
|
5
7
|
export declare function toolsFor(ctx: Context, cliPath: string): Tools;
|
package/dist/src/tools.js
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { socketPathFor } from './config/index.js';
|
|
2
|
+
import { accessSync, constants, statSync } from 'node:fs';
|
|
3
|
+
import { delimiter, resolve } from 'node:path';
|
|
4
|
+
/** Match executable-file PATH search; explicit paths never search PATH. */
|
|
5
|
+
export function executableOnPath(name, env = process.env, cwd = process.cwd()) {
|
|
6
|
+
if (!name)
|
|
7
|
+
return undefined;
|
|
8
|
+
const candidates = name.includes('/') ? [resolve(cwd, name)]
|
|
9
|
+
: (env.PATH === undefined ? ['/usr/bin', '/bin'] : env.PATH.split(delimiter)).map((dir) => resolve(cwd, dir || '.', name));
|
|
10
|
+
return candidates.find((file) => {
|
|
11
|
+
try {
|
|
12
|
+
accessSync(file, constants.X_OK);
|
|
13
|
+
return statSync(file).isFile();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Absolute executable path, or the original command when unavailable. */
|
|
4
21
|
export function resolveBinary(name, env = process.env) {
|
|
5
|
-
|
|
6
|
-
return name;
|
|
7
|
-
for (const dir of (env.PATH ?? '').split(delimiter)) {
|
|
8
|
-
if (dir && existsSync(join(dir, name)))
|
|
9
|
-
return join(dir, name);
|
|
10
|
-
}
|
|
11
|
-
return name;
|
|
22
|
+
return executableOnPath(name, env) ?? name;
|
|
12
23
|
}
|
|
13
24
|
export function toolsFor(ctx, cliPath) {
|
|
14
|
-
|
|
25
|
+
const env = Object.fromEntries(['HOME', 'XDG_CONFIG_HOME', 'XDG_STATE_HOME', 'BERTH_CONFIG', 'BERTH_STATE_DIR'].flatMap((key) => ctx.env[key] ? [[key, ctx.env[key]]] : []));
|
|
26
|
+
return { node: process.execPath, cli: cliPath, tmux: resolveBinary(ctx.config.tmuxBin, ctx.env), socketPath: socketPathFor(ctx.config.tmuxSocket, ctx.config.tmuxSocketPath, ctx.env), path: ctx.env.PATH, env };
|
|
15
27
|
}
|
|
16
28
|
//# sourceMappingURL=tools.js.map
|
package/dist/src/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI/C,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACnF,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7H,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC;YAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QACzE,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG;IAC3D,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAY,EAAE,OAAe;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9K,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACnN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function conversationByName(agent: string, cwd: string, name: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { closeSync, existsSync, openSync, readdirSync, readSync, realpathSync, statSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
* Name key (spec §4.2): an agent started with `--name X` records X as a
|
|
6
|
-
* `custom-title` entry near the top of its transcript. The newest transcript
|
|
7
|
-
* in the session's directory carrying that title is the session's
|
|
8
|
-
* conversation. Claude Code and Qoder CLI keep a directory's transcripts as
|
|
9
|
-
* <root>/projects/<encoded cwd>/<id>.jsonl; Claude encodes every
|
|
10
|
-
* non-alphanumeric character as '-', Qoder documents '/' as '-'.
|
|
11
|
-
*/
|
|
12
|
-
const HEADER_LINES = 40;
|
|
13
|
-
const ROOTS = {
|
|
14
|
-
claude: (env) => join(env.HOME || homedir(), '.claude'),
|
|
15
|
-
qoder: (env) => env.QODER_CONFIG_DIR || join(env.HOME || homedir(), '.qoder'),
|
|
16
|
-
};
|
|
17
|
-
const ENCODINGS = [(p) => p.replace(/[^A-Za-z0-9]/g, '-'), (p) => p.replace(/\//g, '-')];
|
|
18
|
-
function projectDirs(root, cwd) {
|
|
19
|
-
const paths = [cwd];
|
|
20
|
-
try {
|
|
21
|
-
const real = realpathSync(cwd);
|
|
22
|
-
if (real !== cwd)
|
|
23
|
-
paths.push(real);
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// The directory may be gone; the recorded path still names its transcripts.
|
|
27
|
-
}
|
|
28
|
-
const dirs = paths.flatMap((p) => ENCODINGS.map((encode) => join(root, 'projects', encode(p))));
|
|
29
|
-
return [...new Set(dirs)].filter((d) => existsSync(d));
|
|
30
|
-
}
|
|
31
|
-
function titleOf(file) {
|
|
32
|
-
const fd = openSync(file, 'r');
|
|
33
|
-
try {
|
|
34
|
-
const buffer = Buffer.alloc(64 * 1024);
|
|
35
|
-
const read = readSync(fd, buffer, 0, buffer.length, 0);
|
|
36
|
-
for (const line of buffer.subarray(0, read).toString('utf8').split('\n').slice(0, HEADER_LINES)) {
|
|
37
|
-
try {
|
|
38
|
-
const entry = JSON.parse(line);
|
|
39
|
-
if (entry.type === 'custom-title' && entry.customTitle)
|
|
40
|
-
return entry.customTitle;
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// Partial or non-JSON line.
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
closeSync(fd);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export function conversationByName(agent, cwd, name, env = process.env) {
|
|
53
|
-
const root = ROOTS[agent];
|
|
54
|
-
if (!root)
|
|
55
|
-
return undefined;
|
|
56
|
-
const files = projectDirs(root(env), cwd)
|
|
57
|
-
.flatMap((dir) => readdirSync(dir).filter((f) => f.endsWith('.jsonl')).map((f) => join(dir, f)))
|
|
58
|
-
.map((file) => ({ file, mtime: statSync(file).mtimeMs }))
|
|
59
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
60
|
-
for (const { file } of files) {
|
|
61
|
-
if (titleOf(file) === name)
|
|
62
|
-
return file.replace(/^.*\//, '').replace(/\.jsonl$/, '');
|
|
63
|
-
}
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=name-key.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"name-key.js","sourceRoot":"","sources":["../../../src/agents/name-key.ts"],"names":[],"mappings":"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"}
|