@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.
Files changed (136) hide show
  1. package/README.md +7 -1
  2. package/dist/src/agents/capabilities.d.ts +13 -0
  3. package/dist/src/agents/capabilities.js +52 -0
  4. package/dist/src/agents/capabilities.js.map +1 -0
  5. package/dist/src/agents/codex-binding.d.ts +10 -0
  6. package/dist/src/agents/codex-binding.js +105 -0
  7. package/dist/src/agents/codex-binding.js.map +1 -0
  8. package/dist/src/agents/commands.d.ts +4 -2
  9. package/dist/src/agents/commands.js +41 -9
  10. package/dist/src/agents/commands.js.map +1 -1
  11. package/dist/src/agents/copilot-state.d.ts +3 -0
  12. package/dist/src/agents/copilot-state.js +94 -0
  13. package/dist/src/agents/copilot-state.js.map +1 -0
  14. package/dist/src/agents/gemini-state.d.ts +3 -0
  15. package/dist/src/agents/gemini-state.js +41 -0
  16. package/dist/src/agents/gemini-state.js.map +1 -0
  17. package/dist/src/agents/hook-files.d.ts +1 -3
  18. package/dist/src/agents/hook-files.js +69 -53
  19. package/dist/src/agents/hook-files.js.map +1 -1
  20. package/dist/src/agents/hook-health.d.ts +4 -0
  21. package/dist/src/agents/hook-health.js +95 -0
  22. package/dist/src/agents/hook-health.js.map +1 -0
  23. package/dist/src/agents/hooks.d.ts +4 -1
  24. package/dist/src/agents/hooks.js +155 -22
  25. package/dist/src/agents/hooks.js.map +1 -1
  26. package/dist/src/agents/jsonl-titles.d.ts +8 -0
  27. package/dist/src/agents/jsonl-titles.js +124 -0
  28. package/dist/src/agents/jsonl-titles.js.map +1 -0
  29. package/dist/src/agents/late-binding.d.ts +2 -0
  30. package/dist/src/agents/late-binding.js +25 -0
  31. package/dist/src/agents/late-binding.js.map +1 -0
  32. package/dist/src/agents/profile.d.ts +14 -0
  33. package/dist/src/agents/profile.js +75 -0
  34. package/dist/src/agents/profile.js.map +1 -0
  35. package/dist/src/agents/registry.d.ts +12 -3
  36. package/dist/src/agents/registry.js +52 -19
  37. package/dist/src/agents/registry.js.map +1 -1
  38. package/dist/src/agents/roots.d.ts +2 -0
  39. package/dist/src/agents/roots.js +21 -0
  40. package/dist/src/agents/roots.js.map +1 -0
  41. package/dist/src/agents/titles.d.ts +14 -0
  42. package/dist/src/agents/titles.js +82 -0
  43. package/dist/src/agents/titles.js.map +1 -0
  44. package/dist/src/agents/transcript-cursor.d.ts +9 -0
  45. package/dist/src/agents/transcript-cursor.js +86 -0
  46. package/dist/src/agents/transcript-cursor.js.map +1 -0
  47. package/dist/src/cli/main.js +40 -7
  48. package/dist/src/cli/main.js.map +1 -1
  49. package/dist/src/config/index.d.ts +6 -0
  50. package/dist/src/config/index.js +37 -6
  51. package/dist/src/config/index.js.map +1 -1
  52. package/dist/src/config/write.d.ts +2 -0
  53. package/dist/src/config/write.js +41 -0
  54. package/dist/src/config/write.js.map +1 -0
  55. package/dist/src/context.js +1 -1
  56. package/dist/src/context.js.map +1 -1
  57. package/dist/src/index.d.ts +11 -5
  58. package/dist/src/index.js +10 -4
  59. package/dist/src/index.js.map +1 -1
  60. package/dist/src/iterm2/install.d.ts +2 -0
  61. package/dist/src/iterm2/install.js +37 -12
  62. package/dist/src/iterm2/install.js.map +1 -1
  63. package/dist/src/present/attach.js +17 -5
  64. package/dist/src/present/attach.js.map +1 -1
  65. package/dist/src/present/state.d.ts +3 -0
  66. package/dist/src/present/state.js +12 -8
  67. package/dist/src/present/state.js.map +1 -1
  68. package/dist/src/process-arguments.d.ts +2 -0
  69. package/dist/src/process-arguments.js +59 -0
  70. package/dist/src/process-arguments.js.map +1 -0
  71. package/dist/src/process-directory.d.ts +2 -0
  72. package/dist/src/process-directory.js +37 -0
  73. package/dist/src/process-directory.js.map +1 -0
  74. package/dist/src/process-owner.d.ts +7 -0
  75. package/dist/src/process-owner.js +51 -0
  76. package/dist/src/process-owner.js.map +1 -0
  77. package/dist/src/registry/directory.d.ts +2 -0
  78. package/dist/src/registry/directory.js +19 -0
  79. package/dist/src/registry/directory.js.map +1 -0
  80. package/dist/src/registry/discover.d.ts +15 -5
  81. package/dist/src/registry/discover.js +135 -38
  82. package/dist/src/registry/discover.js.map +1 -1
  83. package/dist/src/registry/doctor.d.ts +5 -1
  84. package/dist/src/registry/doctor.js +53 -12
  85. package/dist/src/registry/doctor.js.map +1 -1
  86. package/dist/src/registry/hosts.d.ts +28 -0
  87. package/dist/src/registry/hosts.js +73 -0
  88. package/dist/src/registry/hosts.js.map +1 -0
  89. package/dist/src/registry/launch.d.ts +3 -0
  90. package/dist/src/registry/launch.js +29 -0
  91. package/dist/src/registry/launch.js.map +1 -0
  92. package/dist/src/registry/native-state.d.ts +20 -0
  93. package/dist/src/registry/native-state.js +127 -0
  94. package/dist/src/registry/native-state.js.map +1 -0
  95. package/dist/src/registry/sessions.d.ts +21 -3
  96. package/dist/src/registry/sessions.js +178 -37
  97. package/dist/src/registry/sessions.js.map +1 -1
  98. package/dist/src/restore/ensure.d.ts +12 -2
  99. package/dist/src/restore/ensure.js +171 -37
  100. package/dist/src/restore/ensure.js.map +1 -1
  101. package/dist/src/restore/lock.d.ts +3 -5
  102. package/dist/src/restore/lock.js +82 -52
  103. package/dist/src/restore/lock.js.map +1 -1
  104. package/dist/src/restore/status.d.ts +9 -0
  105. package/dist/src/restore/status.js +16 -0
  106. package/dist/src/restore/status.js.map +1 -0
  107. package/dist/src/snapshot/identity.d.ts +7 -0
  108. package/dist/src/snapshot/identity.js +20 -0
  109. package/dist/src/snapshot/identity.js.map +1 -0
  110. package/dist/src/snapshot/lifecycle.d.ts +9 -0
  111. package/dist/src/snapshot/lifecycle.js +37 -0
  112. package/dist/src/snapshot/lifecycle.js.map +1 -0
  113. package/dist/src/snapshot/store.d.ts +11 -1
  114. package/dist/src/snapshot/store.js +28 -9
  115. package/dist/src/snapshot/store.js.map +1 -1
  116. package/dist/src/snapshot/take.d.ts +2 -1
  117. package/dist/src/snapshot/take.js +29 -25
  118. package/dist/src/snapshot/take.js.map +1 -1
  119. package/dist/src/tmux/client.d.ts +6 -2
  120. package/dist/src/tmux/client.js +49 -25
  121. package/dist/src/tmux/client.js.map +1 -1
  122. package/dist/src/tmux/connections.d.ts +22 -0
  123. package/dist/src/tmux/connections.js +70 -0
  124. package/dist/src/tmux/connections.js.map +1 -0
  125. package/dist/src/tmux/fields.d.ts +7 -0
  126. package/dist/src/tmux/fields.js +23 -0
  127. package/dist/src/tmux/fields.js.map +1 -0
  128. package/dist/src/tmux/install.js +31 -18
  129. package/dist/src/tmux/install.js.map +1 -1
  130. package/dist/src/tools.d.ts +3 -1
  131. package/dist/src/tools.js +23 -11
  132. package/dist/src/tools.js.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/src/agents/name-key.d.ts +0 -1
  135. package/dist/src/agents/name-key.js +0 -66
  136. package/dist/src/agents/name-key.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ import { copilotState } from '../agents/copilot-state.js';
2
+ import { geminiInactive } from '../agents/gemini-state.js';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { readProfile, profileEnvironment, profileKey } from '../agents/profile.js';
5
+ import { processLifetime } from '../process-owner.js';
6
+ import { presentState } from '../present/state.js';
7
+ import { nameCollision } from '../snapshot/identity.js';
8
+ import { resolveBinary } from '../tools.js';
9
+ import { processes, sessionProducers } from './discover.js';
10
+ function eligible(session) {
11
+ const m = session.meta;
12
+ return (m.agent === 'claude' || (['gemini', 'copilot'].includes(m.agent || '') && !!m.nativeTranscript)) && !!m.conversation && !m.bindingIssue
13
+ && !!m.producerPane && !!m.producerLifetime
14
+ && (m.state === 'working' || m.state === 'waiting' || (m.agent === 'gemini' && m.state === 'done'));
15
+ }
16
+ /** Called under the state lock; one least-recently attempted profile per pass. */
17
+ export function prepareNativeState(ctx) {
18
+ const live = ctx.tmux.listSessions().filter(eligible);
19
+ const saved = ctx.store.newest()?.sessions ?? [];
20
+ const groups = new Map();
21
+ for (const session of live) {
22
+ const profile = readProfile(session.meta.agent, session.meta.profile);
23
+ if (!profile || nameCollision(ctx, session, saved))
24
+ continue;
25
+ const key = profileKey(session.meta.agent, profile);
26
+ groups.set(key, [...(groups.get(key) ?? []), session]);
27
+ }
28
+ const attempted = (rows) => Math.max(0, ...rows.map((s) => Number(s.meta.nativeCheckedAt) || 0));
29
+ const selected = [...groups.values()].sort((a, b) => attempted(a) - attempted(b))[0];
30
+ if (!selected)
31
+ return [];
32
+ const now = String(Date.now());
33
+ const procs = processes();
34
+ return selected.flatMap((session) => {
35
+ ctx.tmux.setMeta(session.name, { nativeCheckedAt: now });
36
+ const updated = { ...session, meta: { ...session.meta, nativeCheckedAt: now } };
37
+ try {
38
+ const producers = sessionProducers(ctx, session.name, procs);
39
+ const producer = producers.length === 1 ? producers[0] : undefined;
40
+ const lifetime = producer && processLifetime(producer.pid);
41
+ if (!producer || producer.agent !== session.meta.agent || producer.argvIssue
42
+ || producer.pane !== session.meta.producerPane || !lifetime
43
+ || lifetime.key !== session.meta.producerLifetime)
44
+ return [];
45
+ return [{ session: updated, pid: producer.pid, bornAt: lifetime.bornAt }];
46
+ }
47
+ catch {
48
+ return [];
49
+ } // Unverifiable ownership is not an idle observation.
50
+ });
51
+ }
52
+ /** Native schemas are versioned externally; unknown or ambiguous data is inert. */
53
+ export function nativeIdle(data, candidate) {
54
+ if (!Array.isArray(data))
55
+ return false;
56
+ const records = data.filter((row) => row && typeof row === 'object'
57
+ && (row.pid === candidate.pid || row.sessionId === candidate.session.meta.conversation));
58
+ if (records.length !== 1)
59
+ return false;
60
+ const row = records[0];
61
+ return row.pid === candidate.pid && row.sessionId === candidate.session.meta.conversation
62
+ && row.kind === 'interactive' && row.status === 'idle'
63
+ && typeof row.startedAt === 'number' && Number.isFinite(row.startedAt)
64
+ && row.startedAt >= candidate.bornAt && row.startedAt <= Date.now();
65
+ }
66
+ /** No shared state lock may be held while invoking the native CLI. */
67
+ export function observeNativeState(ctx, candidates) {
68
+ const first = candidates[0];
69
+ const agent = first?.session.meta.agent;
70
+ const profile = first && agent && readProfile(agent, first.session.meta.profile);
71
+ if (!profile)
72
+ return [];
73
+ const env = profileEnvironment(agent, profile, ctx.env);
74
+ if (agent === 'copilot')
75
+ return candidates.flatMap((candidate) => {
76
+ const { session } = candidate;
77
+ const state = copilotState(session.meta.nativeTranscript, session.meta.conversation, env);
78
+ if (state === undefined || state === session.meta.state)
79
+ return [];
80
+ return [{ ...candidate, ...(state === 'working' ? { state } : {}) }];
81
+ });
82
+ if (agent === 'gemini')
83
+ return candidates.filter(({ session }) => geminiInactive(session.meta.nativeTranscript, session.meta.conversation, env, session.meta.state === 'done'));
84
+ try {
85
+ const result = spawnSync(resolveBinary('claude', env), ['agents', '--json'], {
86
+ env, encoding: 'utf8', timeout: 1500, killSignal: 'SIGKILL', maxBuffer: 1024 * 1024,
87
+ stdio: ['ignore', 'pipe', 'pipe'],
88
+ });
89
+ if (result.error || result.status !== 0)
90
+ return [];
91
+ const data = JSON.parse(result.stdout);
92
+ return candidates.filter((candidate) => nativeIdle(data, candidate));
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ }
98
+ export function sameNativeCandidate(before, after) {
99
+ return before.name === after.name && before.serverStart === after.serverStart
100
+ && before.sessionId === after.sessionId
101
+ && Object.keys({ ...before.meta, ...after.meta }).filter((key) => key !== 'nativeCheckedAt').every((key) => before.meta[key] === after.meta[key]);
102
+ }
103
+ /** Called under the state lock; observations never establish session identity. */
104
+ export function applyNativeState(ctx, observations) {
105
+ if (!observations.length)
106
+ return;
107
+ const live = ctx.tmux.listSessions();
108
+ const saved = ctx.store.newest()?.sessions ?? [];
109
+ const procs = processes();
110
+ for (const observation of observations) {
111
+ const current = live.find((s) => sameNativeCandidate(observation.session, s));
112
+ if (!current || !eligible(current) || nameCollision(ctx, current, saved))
113
+ continue;
114
+ try {
115
+ const producers = sessionProducers(ctx, current.name, procs);
116
+ const producer = producers.length === 1 ? producers[0] : undefined;
117
+ if (!producer || producer.pid !== observation.pid || producer.agent !== current.meta.agent
118
+ || producer.argvIssue || producer.pane !== current.meta.producerPane
119
+ || processLifetime(producer.pid)?.key !== current.meta.producerLifetime)
120
+ continue;
121
+ ctx.tmux.setMeta(current.name, { state: observation.state ?? '', note: '' });
122
+ presentState(ctx.tmux, current.name, observation.state ?? '');
123
+ }
124
+ catch { /* A disappearing or unverifiable producer leaves hooks authoritative. */ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=native-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-state.js","sourceRoot":"","sources":["../../../src/registry/native-state.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
+ import { type AgentProfile } from '../agents/profile.js';
2
+ import { type RecoveryStatus } from '../restore/status.js';
3
+ import { type ConnectionInfo } from '../tmux/connections.js';
1
4
  import type { Context } from '../context.js';
2
5
  import { type HookStatus } from '../agents/hooks.js';
3
6
  /** One row of `berth ls` (implementation §2.2). */
4
- export interface SessionRow {
7
+ export interface SessionRow extends RecoveryStatus {
5
8
  name: string;
6
9
  managed: boolean;
7
10
  agent: string;
@@ -10,13 +13,24 @@ export interface SessionRow {
10
13
  origin: string;
11
14
  state: string;
12
15
  note: string;
16
+ /** First line of the user's latest prompt (spec §4.2). */
17
+ topic: string;
13
18
  attachedClients: number;
19
+ connections?: ConnectionInfo[];
20
+ conversationTitle?: string;
21
+ bindingIssue?: string;
22
+ ownerWorkspace?: string;
14
23
  live: boolean;
15
24
  /** Whether the agent's Berth hooks are installed (spec §4.2). */
16
25
  hooks: HookStatus;
26
+ hookSetup?: string;
27
+ profile?: AgentProfile;
28
+ recoveryOptionsRequired?: boolean;
17
29
  }
18
30
  export declare const ORIGINS: readonly ["vscode", "iterm2", "none"];
19
31
  export declare function list(ctx: Context): SessionRow[];
32
+ /** Reconcile discovery and externally renamed live sessions before presenting inventory. */
33
+ export declare function inventory(ctx: Context): SessionRow[];
20
34
  export declare function sanitizeName(raw: string): string;
21
35
  /** Default name from the cwd's basename; suffix -2, -3, … on collision with any live session. */
22
36
  export declare function uniqueName(ctx: Context, base: string): string;
@@ -36,6 +50,10 @@ export declare function requireLive(ctx: Context, name: string): void;
36
50
  * project), else the session's start directory.
37
51
  */
38
52
  export declare function adopt(ctx: Context, name: string, agent: string, origin?: string): void;
53
+ /** Rename live identity and its recovery record before hosts update their references. */
54
+ export declare function rename(ctx: Context, from: string, to: string): void;
55
+ /** Intentional end must not be mistaken for the last server disappearing. */
56
+ export declare function end(ctx: Context, name: string): void;
39
57
  /** Give up a stopped session: it is no longer restored or listed (spec §5.3). */
40
58
  export declare function forget(ctx: Context, name: string): void;
41
59
  export declare function stamp(ctx: Context, name: string, values: Record<string, string>): void;
@@ -44,8 +62,8 @@ export declare const BELL_NOTE = "bell";
44
62
  /**
45
63
  * A terminal bell from a managed session (tmux alert-bell). Agents without
46
64
  * Berth hooks get state `waiting`, so every agent can ask for attention; for
47
- * agents whose installed hooks report waiting the hooks are more precise and
48
- * the bell is ignored. Returns whether the state changed.
65
+ * agents with complete waiting hooks and no independent hook trust gate,
66
+ * the bell is ignored. Existing explicit waiting information is preserved. Returns whether the state changed.
49
67
  */
50
68
  export declare function bellRang(ctx: Context, name: string, env?: NodeJS.ProcessEnv): boolean;
51
69
  /** Seeing a session answers its bell: clear a bell-raised waiting state. */
@@ -1,41 +1,86 @@
1
- import { basename } from 'node:path';
1
+ import { prepareNativeState, observeNativeState, applyNativeState } from './native-state.js';
2
+ import { processLifetime } from '../process-owner.js';
3
+ import { applyLaunchEnvironment, captureProfile, profileEnvironment, profileKey, readProfile } from '../agents/profile.js';
4
+ import { withLock } from '../restore/lock.js';
5
+ import { nameCollision, COLLISION_HINT } from '../snapshot/identity.js';
6
+ import { withPlaceholder } from './launch.js';
7
+ import { usableDirectory } from './directory.js';
8
+ import { wasClosed } from '../snapshot/lifecycle.js';
9
+ import { recoveryStatus } from '../restore/status.js';
10
+ import { profiledTitleLookup } from '../agents/titles.js';
11
+ import { connections } from '../tmux/connections.js';
12
+ import { basename, join } from 'node:path';
2
13
  import { BerthError, ExitCode } from '../errors.js';
3
- import { launchCommand, requireAdapter } from '../agents/commands.js';
4
- import { hooksInstalled, hookStatus } from '../agents/hooks.js';
14
+ import { launchCommand, recoveryOptionsRequired, requireAdapter } from '../agents/commands.js';
15
+ import { hooksInstalled, hookStatus, hookSetupGuidance } from '../agents/hooks.js';
16
+ import { registeredHosts } from './hosts.js';
17
+ import { discover, sessionProducers } from './discover.js';
5
18
  import { getAdapter } from '../agents/registry.js';
6
19
  import { snapshotQuietly, takeSnapshot } from '../snapshot/take.js';
7
20
  import { presentState } from '../present/state.js';
8
21
  export const ORIGINS = ['vscode', 'iterm2', 'none'];
9
22
  export function list(ctx) {
10
23
  const live = ctx.tmux.listSessions();
24
+ const saved = ctx.store.newest()?.sessions ?? [];
25
+ const title = profiledTitleLookup([...live.map((row) => ({ agent: row.meta.agent ?? '', conversation: row.meta.conversation ?? '', profile: readProfile(row.meta.agent ?? '', row.meta.profile) })), ...saved], ctx.env, join(ctx.config.stateDir, 'title-cache'));
26
+ const clients = connections(ctx.tmux, registeredHosts(ctx.config.stateDir));
11
27
  const statuses = new Map();
12
- const hooks = (agent) => {
13
- if (!agent)
28
+ const hooks = (agent, profile) => {
29
+ if (!agent || agent === 'shell')
14
30
  return 'none';
15
- if (!statuses.has(agent))
16
- statuses.set(agent, hookStatus(agent, ctx.env));
17
- return statuses.get(agent);
31
+ if (!profile)
32
+ return 'unknown';
33
+ const key = profileKey(agent, profile);
34
+ if (!statuses.has(key))
35
+ statuses.set(key, hookStatus(agent, profileEnvironment(agent, profile, ctx.env)));
36
+ return statuses.get(key);
18
37
  };
19
38
  const rows = live.map((s) => ({
20
39
  name: s.name,
40
+ profile: readProfile(s.meta.agent ?? '', s.meta.profile),
41
+ ...recoveryStatus(ctx.tmux, s.name, s.meta),
21
42
  managed: Boolean(s.meta.agent),
22
43
  agent: s.meta.agent ?? '',
23
44
  cwd: s.meta.cwd ?? s.path,
45
+ bindingIssue: nameCollision(ctx, s, saved) ? COLLISION_HINT : s.meta.bindingIssue,
46
+ ownerWorkspace: s.meta.ownerWorkspace,
24
47
  conversation: s.meta.conversation ?? '',
48
+ conversationTitle: title(s.meta.agent ?? '', s.meta.cwd ?? s.path, s.meta.conversation ?? '', readProfile(s.meta.agent ?? '', s.meta.profile)),
25
49
  origin: s.meta.origin ?? (s.meta.agent ? 'none' : ''),
26
50
  state: s.meta.state ?? '',
27
51
  note: s.meta.note ?? '',
52
+ topic: s.meta.topic ?? '',
28
53
  attachedClients: s.attachedClients,
54
+ connections: clients.get(s.name) ?? [],
29
55
  live: true,
30
- hooks: hooks(s.meta.agent ?? ''),
56
+ hooks: hooks(s.meta.agent ?? '', readProfile(s.meta.agent ?? '', s.meta.profile)),
31
57
  }));
32
58
  const liveNames = new Set(live.map((s) => s.name));
33
- for (const s of ctx.store.newest()?.sessions ?? []) {
34
- if (liveNames.has(s.name))
59
+ for (const s of saved) {
60
+ if (liveNames.has(s.name) || wasClosed(ctx, s))
35
61
  continue;
36
- rows.push({ ...s, managed: true, state: '', note: '', attachedClients: 0, live: false, hooks: hooks(s.agent) });
62
+ rows.push({ ...s, recoveryOptionsRequired: recoveryOptionsRequired(s.agent, s.argv, s.argvVerified), conversationTitle: title(s.agent, s.cwd, s.conversation, readProfile(s.agent, s.profile)), managed: true, state: '', note: '', topic: '', attachedClients: 0, live: false, hooks: hooks(s.agent, readProfile(s.agent, s.profile)) });
37
63
  }
38
- return rows;
64
+ return rows.map((row) => row.hooks === 'installed' ? { ...row, hookSetup: hookSetupGuidance(row.agent) } : row);
65
+ }
66
+ /** Reconcile discovery and externally renamed live sessions before presenting inventory. */
67
+ export function inventory(ctx) {
68
+ const candidates = withLock(ctx.config.stateDir, () => prepareNativeState(ctx));
69
+ const observations = observeNativeState(ctx, candidates);
70
+ return withLock(ctx.config.stateDir, () => {
71
+ applyNativeState(ctx, observations);
72
+ return inventoryLocked(ctx);
73
+ });
74
+ }
75
+ function inventoryLocked(ctx) {
76
+ const adopted = discover(ctx);
77
+ const live = ctx.tmux.listSessions();
78
+ const server = live[0]?.serverStart;
79
+ const current = live.filter((session) => session.meta.agent).map((session) => session.name).sort();
80
+ const saved = (ctx.store.newest()?.sessions ?? []).filter((session) => session.serverStart === server).map((session) => session.name).sort();
81
+ if (adopted.length || (server && current.some((name) => !saved.includes(name))))
82
+ takeSnapshot(ctx);
83
+ return list(ctx);
39
84
  }
40
85
  export function sanitizeName(raw) {
41
86
  const cleaned = raw.replace(/[^A-Za-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');
@@ -43,7 +88,7 @@ export function sanitizeName(raw) {
43
88
  }
44
89
  /** Default name from the cwd's basename; suffix -2, -3, … on collision with any live session. */
45
90
  export function uniqueName(ctx, base) {
46
- const taken = new Set(ctx.tmux.listSessions().map((s) => s.name));
91
+ const taken = new Set([...ctx.tmux.listSessions(), ...(ctx.store.newest()?.sessions ?? [])].map((s) => s.name));
47
92
  const name = sanitizeName(base);
48
93
  if (!taken.has(name))
49
94
  return name;
@@ -58,21 +103,34 @@ export function checkOrigin(origin) {
58
103
  return origin;
59
104
  }
60
105
  export function create(ctx, options) {
106
+ return withLock(ctx.config.stateDir, () => createLocked(ctx, options));
107
+ }
108
+ function createLocked(ctx, options) {
61
109
  const adapter = requireAdapter(options.agent);
62
110
  const name = options.name ? sanitizeName(options.name) : uniqueName(ctx, basename(options.cwd));
63
- if (ctx.tmux.hasSession(name))
64
- throw new BerthError(`session already exists: ${name}`, ExitCode.usage);
111
+ if (ctx.tmux.hasSession(name) || ctx.store.newest()?.sessions.some((saved) => saved.name === name && !wasClosed(ctx, saved))) {
112
+ throw new BerthError(`session name is already reserved: ${name}; resume or forget the stopped conversation first`, ExitCode.usage);
113
+ }
65
114
  const command = launchCommand({ adapter, name, cwd: options.cwd, extraArgs: options.extraArgs, overrides: ctx.config.agents });
66
- ctx.tmux.newSession(name, options.cwd, command);
67
- ctx.tmux.setMeta(name, {
68
- agent: adapter.id,
69
- cwd: options.cwd,
70
- argv: command,
71
- origin: checkOrigin(options.origin ?? 'none'),
115
+ const origin = checkOrigin(options.origin ?? 'none');
116
+ if (!usableDirectory(options.cwd))
117
+ throw new BerthError('Choose an existing accessible folder.', ExitCode.usage);
118
+ const profile = adapter.id === 'shell' ? undefined : captureProfile(adapter.id, ctx.env);
119
+ return withPlaceholder(ctx, name, options.cwd, () => {
120
+ if (profile)
121
+ applyLaunchEnvironment(ctx, name, adapter.id, profile);
122
+ ctx.tmux.setMeta(name, {
123
+ agent: adapter.id,
124
+ profile: profile ? JSON.stringify(profile) : undefined,
125
+ cwd: options.cwd,
126
+ argv: command, argvVerified: '1',
127
+ origin,
128
+ });
129
+ ctx.tmux.setTitle(name);
130
+ ctx.tmux.run(['respawn-pane', '-k', '-t', `=${name}:`, ...(command ? [command] : [])]);
131
+ snapshotQuietly(ctx);
132
+ return name;
72
133
  });
73
- ctx.tmux.setTitle(name);
74
- snapshotQuietly(ctx);
75
- return name;
76
134
  }
77
135
  export function requireLive(ctx, name) {
78
136
  if (!ctx.tmux.hasSession(name))
@@ -84,30 +142,89 @@ export function requireLive(ctx, name) {
84
142
  * project), else the session's start directory.
85
143
  */
86
144
  export function adopt(ctx, name, agent, origin) {
145
+ return withLock(ctx.config.stateDir, () => adoptLocked(ctx, name, agent, origin));
146
+ }
147
+ function adoptLocked(ctx, name, agent, origin) {
87
148
  requireLive(ctx, name);
88
149
  const adapter = requireAdapter(agent);
89
150
  const live = ctx.tmux.listSessions().find((s) => s.name === name);
151
+ const changingAgent = Boolean(live?.meta.agent && live.meta.agent !== agent);
152
+ const producers = sessionProducers(ctx, name);
153
+ if (producers.some((producer) => producer.argvIssue))
154
+ throw new BerthError(producers.find((producer) => producer.argvIssue).argvIssue);
155
+ const lifetime = producers[0] ? processLifetime(producers[0].pid)?.key : undefined;
156
+ const resetBinding = Boolean(live?.meta.bindingIssue || changingAgent || (lifetime && live?.meta.conversation && live.meta.producerLifetime !== lifetime));
157
+ if (producers.length > 1 || (producers.length === 1 && producers[0].agent !== agent)) {
158
+ throw new BerthError('Selected agent does not match the independent producer in this session.', ExitCode.usage);
159
+ }
160
+ if (live?.meta.bindingIssue && (producers.length !== 1 || producers[0].agent !== agent)) {
161
+ throw new BerthError('Separate independent agents into their own sessions before adopting again.', ExitCode.usage);
162
+ }
90
163
  ctx.tmux.setMeta(name, {
164
+ ...(resetBinding ? { bindingIssue: '', producerPane: producers[0]?.pane ?? '', producerLifetime: lifetime ?? '', restoreSource: '', profile: '', conversation: '', state: '', topic: '', note: '', recovery: '', recoveryAt: '', recoveryDetail: '' } : {}),
165
+ argvVerified: producers[0] ? '1' : (changingAgent ? '' : live?.meta.argvVerified),
91
166
  agent: adapter.id,
92
- cwd: live?.meta.cwd ?? ctx.tmux.paneCurrentPath(name) ?? live?.path ?? '',
93
- argv: live?.meta.argv ?? adapter.launch.replace(/\{\w+\}/g, '').trim(),
167
+ cwd: producers[0]?.cwd ?? live?.meta.cwd ?? ctx.tmux.paneCurrentPath(name) ?? live?.path ?? '',
168
+ argv: producers[0]?.argv ?? (changingAgent ? undefined : live?.meta.argv) ?? adapter.launch.replace(/\{\w+\}/g, '').trim(),
94
169
  origin: checkOrigin(origin ?? live?.meta.origin ?? 'none'),
95
170
  });
96
171
  ctx.tmux.setTitle(name);
97
172
  snapshotQuietly(ctx);
98
173
  }
174
+ /** Rename live identity and its recovery record before hosts update their references. */
175
+ export function rename(ctx, from, to) {
176
+ return withLock(ctx.config.stateDir, () => renameLocked(ctx, from, to));
177
+ }
178
+ function renameLocked(ctx, from, to) {
179
+ requireLive(ctx, from);
180
+ if (!to || sanitizeName(to) !== to)
181
+ throw new BerthError('invalid session name', ExitCode.usage);
182
+ if (from === to)
183
+ return;
184
+ if (ctx.tmux.hasSession(to) || ctx.store.newest()?.sessions.some((s) => s.name === to)) {
185
+ throw new BerthError(`session already exists: ${to}`, ExitCode.usage);
186
+ }
187
+ const live = ctx.tmux.listSessions().find((session) => session.name === from);
188
+ const collision = nameCollision(ctx, live, ctx.store.newest()?.sessions ?? []);
189
+ ctx.tmux.renameSession(from, to);
190
+ try {
191
+ takeSnapshot(ctx, new Date(), collision ? [] : [from], collision ? [collision] : []);
192
+ }
193
+ catch (error) {
194
+ ctx.tmux.renameSession(to, from);
195
+ snapshotQuietly(ctx);
196
+ throw error;
197
+ }
198
+ }
199
+ /** Intentional end must not be mistaken for the last server disappearing. */
200
+ export function end(ctx, name) {
201
+ return withLock(ctx.config.stateDir, () => endLocked(ctx, name));
202
+ }
203
+ function endLocked(ctx, name) {
204
+ requireLive(ctx, name);
205
+ const live = ctx.tmux.listSessions().find((session) => session.name === name);
206
+ const collision = nameCollision(ctx, live, ctx.store.newest()?.sessions ?? []);
207
+ ctx.tmux.killSession(name);
208
+ takeSnapshot(ctx, new Date(), collision ? [] : [name], collision ? [collision] : []);
209
+ }
99
210
  /** Give up a stopped session: it is no longer restored or listed (spec §5.3). */
100
211
  export function forget(ctx, name) {
212
+ return withLock(ctx.config.stateDir, () => forgetLocked(ctx, name));
213
+ }
214
+ function forgetLocked(ctx, name) {
101
215
  if (ctx.tmux.hasSession(name))
102
216
  throw new BerthError(`${name} is running; end it instead`, ExitCode.usage);
103
217
  if (!ctx.store.newest()?.sessions.some((s) => s.name === name))
104
218
  throw new BerthError(`no stopped session ${name}`, ExitCode.notFound);
105
219
  takeSnapshot(ctx, new Date(), [name]);
106
220
  }
107
- const STAMPABLE = new Set(['agent', 'cwd', 'argv', 'conversation', 'origin', 'state', 'note']);
221
+ const STAMPABLE = new Set(['agent', 'cwd', 'argv', 'conversation', 'origin', 'state', 'note', 'topic', 'ownerWorkspace']);
108
222
  export function stamp(ctx, name, values) {
223
+ return withLock(ctx.config.stateDir, () => stampLocked(ctx, name, values));
224
+ }
225
+ function stampLocked(ctx, name, values) {
109
226
  requireLive(ctx, name);
110
- const meta = {};
227
+ let meta = {};
111
228
  for (const [key, value] of Object.entries(values)) {
112
229
  if (!STAMPABLE.has(key))
113
230
  throw new BerthError(`cannot stamp ${key}`, ExitCode.usage);
@@ -115,7 +232,26 @@ export function stamp(ctx, name, values) {
115
232
  checkOrigin(value);
116
233
  if (key === 'agent')
117
234
  requireAdapter(value);
118
- meta[key] = value;
235
+ meta = { ...meta, [key]: value };
236
+ }
237
+ if (meta.argv !== undefined)
238
+ meta = { ...meta, argvVerified: '1' };
239
+ const prior = ctx.tmux.listSessions().find((session) => session.name === name)?.meta;
240
+ if (meta.agent && prior?.agent && meta.agent !== prior.agent)
241
+ adoptLocked(ctx, name, meta.agent, meta.origin);
242
+ if (meta.conversation !== undefined && meta.conversation !== prior?.conversation) {
243
+ meta = { ...meta, recovery: '', recoveryAt: '', recoveryDetail: '', state: meta.state ?? '', note: meta.note ?? '', topic: meta.topic ?? '' };
244
+ }
245
+ if (meta.conversation) {
246
+ const agent = meta.agent ?? prior?.agent;
247
+ if (agent && agent !== 'shell') {
248
+ const producers = sessionProducers(ctx, name);
249
+ if (producers.length > 1 || (producers[0] && producers[0].agent !== agent))
250
+ throw new BerthError('Cannot bind a conversation to an incompatible producer.');
251
+ meta = { ...meta, profile: JSON.stringify(captureProfile(agent, ctx.env)), ...(producers[0] ? {
252
+ producerPane: producers[0].pane, producerLifetime: processLifetime(producers[0].pid)?.key,
253
+ } : {}) };
254
+ }
119
255
  }
120
256
  ctx.tmux.setMeta(name, meta);
121
257
  // A state change shows on attached terminals whoever reports it (spec §6, §7).
@@ -124,7 +260,7 @@ export function stamp(ctx, name, values) {
124
260
  presentState(ctx.tmux, name, meta.state, { note });
125
261
  }
126
262
  // What a restore needs changed: record it now, not at the next session event.
127
- if (['agent', 'cwd', 'argv', 'conversation', 'origin'].some((k) => k in meta))
263
+ if (['agent', 'cwd', 'argv', 'conversation', 'origin', 'ownerWorkspace'].some((k) => k in meta))
128
264
  snapshotQuietly(ctx);
129
265
  }
130
266
  /** Note that marks a waiting state raised by a terminal bell rather than a hook. */
@@ -132,8 +268,8 @@ export const BELL_NOTE = 'bell';
132
268
  /**
133
269
  * A terminal bell from a managed session (tmux alert-bell). Agents without
134
270
  * Berth hooks get state `waiting`, so every agent can ask for attention; for
135
- * agents whose installed hooks report waiting the hooks are more precise and
136
- * the bell is ignored. Returns whether the state changed.
271
+ * agents with complete waiting hooks and no independent hook trust gate,
272
+ * the bell is ignored. Existing explicit waiting information is preserved. Returns whether the state changed.
137
273
  */
138
274
  export function bellRang(ctx, name, env = process.env) {
139
275
  const live = ctx.tmux.listSessions().find((s) => s.name === name);
@@ -141,15 +277,20 @@ export function bellRang(ctx, name, env = process.env) {
141
277
  if (!agent)
142
278
  return false;
143
279
  const adapter = getAdapter(agent);
144
- if (adapter?.events.waiting.length && hooksInstalled(agent, env))
280
+ const profile = readProfile(agent, live?.meta.profile);
281
+ if (live?.meta.state === 'waiting' && live.meta.note !== BELL_NOTE)
282
+ return false;
283
+ if (!adapter?.requiresHookTrust && adapter?.events.waiting.length && profile && hooksInstalled(agent, profileEnvironment(agent, profile, env)))
145
284
  return false;
146
285
  stamp(ctx, name, { state: 'waiting', note: BELL_NOTE });
147
286
  return true;
148
287
  }
149
288
  /** Seeing a session answers its bell: clear a bell-raised waiting state. */
150
289
  export function clearBell(ctx, name) {
151
- const live = ctx.tmux.listSessions().find((s) => s.name === name);
152
- if (live?.meta.state === 'waiting' && live.meta.note === BELL_NOTE)
153
- stamp(ctx, name, { state: '', note: '' });
290
+ withLock(ctx.config.stateDir, () => {
291
+ const live = ctx.tmux.listSessions().find((s) => s.name === name);
292
+ if (live?.meta.state === 'waiting' && live.meta.note === BELL_NOTE)
293
+ stamp(ctx, name, { state: '', note: '' });
294
+ }, 3000);
154
295
  }
155
296
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/registry/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/registry/sessions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { type AgentProfile } from '../agents/profile.js';
1
2
  import type { Context } from '../context.js';
2
3
  import type { StoredSnapshot } from '../snapshot/store.js';
3
- export type RestoreOutcome = 'resumed' | 'launched' | 'shell' | 'skipped-live' | 'skipped-missing-cwd';
4
+ export type RestoreOutcome = 'resume-requested' | 'launched' | 'skipped-live' | 'skipped-missing-cwd' | 'skipped-binding-conflict' | 'skipped-unbound' | 'skipped-missing-binary' | 'skipped-unsupported-resume' | 'failed' | 'skipped-name-conflict' | 'skipped-unknown-profile' | 'skipped-unverified-arguments';
4
5
  export interface RestoreResult {
5
6
  name: string;
6
7
  outcome: RestoreOutcome;
@@ -8,10 +9,19 @@ export interface RestoreResult {
8
9
  }
9
10
  export interface RestoreOptions {
10
11
  origin?: string;
12
+ ownerWorkspace?: string;
11
13
  session?: string;
12
14
  /** How long to wait for another restore to finish; editors pass a short one so they never freeze. */
13
15
  lockTimeoutMs?: number;
14
16
  }
15
- /** Rebuild missing managed sessions from a snapshot; live ones are left alone. */
17
+ /** Explicit restore uses its chosen snapshot; ensure reads latest inside the lock. */
16
18
  export declare function restoreFrom(ctx: Context, snapshot: StoredSnapshot | undefined, options?: RestoreOptions): RestoreResult[];
17
19
  export declare function ensure(ctx: Context, options?: RestoreOptions): RestoreResult[];
20
+ /** Replace only an explicitly failed/unconfirmed attempt, keeping its exact target. */
21
+ export declare function retryRecovery(ctx: Context, name: string): RestoreResult;
22
+ /** Relocate one stopped recovery record without changing its conversation identity. */
23
+ export declare function relocateRecovery(ctx: Context, name: string, cwd: string): void;
24
+ /** Explicitly choose a stopped conversation's profile; never infer it from the host. */
25
+ export declare function setRecoveryProfile(ctx: Context, name: string, root?: string): AgentProfile;
26
+ /** Explicitly replace only the options an adapter can preserve on resume. */
27
+ export declare function setRecoveryOptions(ctx: Context, name: string, options: readonly string[]): void;