toolroll 0.9.63 → 0.9.67

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 (302) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/README.md +33 -5
  3. package/dist/acp-agents.d.ts +43 -0
  4. package/dist/acp-agents.js +62 -0
  5. package/dist/acp-attest.d.ts +44 -0
  6. package/dist/acp-attest.js +269 -0
  7. package/dist/acp-check.d.ts +28 -0
  8. package/dist/acp-check.js +410 -0
  9. package/dist/acp-client.d.ts +163 -0
  10. package/dist/acp-client.js +738 -0
  11. package/dist/acp-inspect.d.ts +23 -0
  12. package/dist/acp-inspect.js +109 -0
  13. package/dist/agent-board.d.ts +19 -6
  14. package/dist/agent-board.js +30 -9
  15. package/dist/agent-fence.d.ts +117 -2
  16. package/dist/agent-fence.js +439 -12
  17. package/dist/agent-pulse.js +9 -2
  18. package/dist/agent-state-words.d.ts +19 -0
  19. package/dist/agent-state-words.js +20 -0
  20. package/dist/agent-state.d.ts +65 -0
  21. package/dist/agent-state.js +229 -0
  22. package/dist/agentconfig.js +39 -13
  23. package/dist/agents-board.d.ts +34 -2
  24. package/dist/agents-board.js +110 -1
  25. package/dist/approval-rules-ui.js +2 -2
  26. package/dist/assignment-delivery.d.ts +14 -0
  27. package/dist/assignment-delivery.js +13 -0
  28. package/dist/assignment.js +13 -0
  29. package/dist/attest.js +7 -0
  30. package/dist/backup-ui.js +2 -2
  31. package/dist/batch-checks.js +3 -2
  32. package/dist/browser/THIRD_PARTY_NOTICES.txt +94 -0
  33. package/dist/browser/terminal.css +37 -0
  34. package/dist/browser/terminal.js +228 -0
  35. package/dist/browser/workspace.css +2 -2
  36. package/dist/browser/workspace.js +42 -38
  37. package/dist/browser-shell.js +6 -3
  38. package/dist/browser-workspace.d.ts +235 -1
  39. package/dist/browser-workspace.js +60 -0
  40. package/dist/builder.d.ts +10 -1
  41. package/dist/builder.js +87 -24
  42. package/dist/chat-actions.d.ts +13 -1
  43. package/dist/chat-actions.js +197 -15
  44. package/dist/chat-ask.d.ts +4 -0
  45. package/dist/chat-ask.js +14 -0
  46. package/dist/chat-channel.js +20 -0
  47. package/dist/chat-continuity.js +5 -4
  48. package/dist/chat-decide.d.ts +0 -14
  49. package/dist/chat-decide.js +4 -1
  50. package/dist/chat-delivery.d.ts +9 -0
  51. package/dist/chat-delivery.js +45 -6
  52. package/dist/chat-messages.d.ts +8 -0
  53. package/dist/chat-messages.js +36 -4
  54. package/dist/check-levels-ui.js +2 -2
  55. package/dist/checkout-proof.d.ts +28 -0
  56. package/dist/checkout-proof.js +62 -0
  57. package/dist/claim.d.ts +12 -0
  58. package/dist/claim.js +19 -0
  59. package/dist/cli-help.d.ts +1 -1
  60. package/dist/cli-help.js +4 -1
  61. package/dist/cli.d.ts +3 -0
  62. package/dist/cli.js +21 -2
  63. package/dist/coding-ui.js +6 -4
  64. package/dist/console-instance.d.ts +124 -0
  65. package/dist/console-instance.js +337 -0
  66. package/dist/contracts/chat-actions.d.ts +16 -0
  67. package/dist/contracts/chat-actions.js +4 -0
  68. package/dist/contracts/chat-content.d.ts +19 -0
  69. package/dist/contracts/chat-content.js +6 -0
  70. package/dist/contracts/console-api.d.ts +13 -4
  71. package/dist/contracts/console-api.js +13 -4
  72. package/dist/contracts/flow-card.d.ts +4 -0
  73. package/dist/contracts/flow-card.js +3 -0
  74. package/dist/contracts/flow.d.ts +46 -0
  75. package/dist/contracts/flow.js +11 -2
  76. package/dist/contracts/lead-tools.d.ts +92 -0
  77. package/dist/contracts/lead-tools.js +13 -0
  78. package/dist/contracts/provider.d.ts +11 -1
  79. package/dist/contracts/provider.js +1 -1
  80. package/dist/contracts/route.d.ts +76 -1
  81. package/dist/contracts/route.js +1 -1
  82. package/dist/contracts/store-json.d.ts +2 -0
  83. package/dist/control-setup.d.ts +1 -1
  84. package/dist/control-ui.js +2 -2
  85. package/dist/converse.d.ts +16 -0
  86. package/dist/converse.js +32 -4
  87. package/dist/demo-chat.js +4 -4
  88. package/dist/demo.js +2 -2
  89. package/dist/desktop-update-gate.js +6 -0
  90. package/dist/desktop-update.d.ts +1 -1
  91. package/dist/discord-chat.js +4 -1
  92. package/dist/doctor.js +1 -1
  93. package/dist/egress-bridge.d.ts +17 -0
  94. package/dist/egress-bridge.js +111 -0
  95. package/dist/egress.d.ts +119 -0
  96. package/dist/egress.js +423 -0
  97. package/dist/exec.d.ts +78 -0
  98. package/dist/exec.js +367 -9
  99. package/dist/export-ui.js +2 -2
  100. package/dist/flow-engine.js +24 -5
  101. package/dist/flow-gallery-ui.js +2 -2
  102. package/dist/flow-gallery.js +27 -8
  103. package/dist/flow-share.js +16 -5
  104. package/dist/flow-triggers.d.ts +77 -8
  105. package/dist/flow-triggers.js +517 -70
  106. package/dist/flows-cli.js +8 -2
  107. package/dist/flows-ui.d.ts +0 -2
  108. package/dist/flows-ui.js +52 -4
  109. package/dist/flows.d.ts +4 -0
  110. package/dist/flows.js +9 -1
  111. package/dist/html.d.ts +9 -0
  112. package/dist/html.js +11 -0
  113. package/dist/invoke.d.ts +35 -0
  114. package/dist/invoke.js +347 -28
  115. package/dist/keys.d.ts +18 -14
  116. package/dist/keys.js +5 -0
  117. package/dist/lead-capabilities.js +3 -2
  118. package/dist/lead-contract.js +2 -0
  119. package/dist/lead-doors.d.ts +2 -0
  120. package/dist/lead-doors.js +7 -0
  121. package/dist/lead-follow.d.ts +2 -0
  122. package/dist/lead-follow.js +58 -2
  123. package/dist/lead-progress.js +1 -0
  124. package/dist/lead-queue-runtime.d.ts +46 -0
  125. package/dist/lead-queue-runtime.js +191 -0
  126. package/dist/lead-queue.d.ts +104 -0
  127. package/dist/lead-queue.js +187 -0
  128. package/dist/lead-sweep.d.ts +67 -0
  129. package/dist/lead-sweep.js +99 -0
  130. package/dist/lead-tools.d.ts +22 -0
  131. package/dist/lead-tools.js +152 -1
  132. package/dist/lead.d.ts +13 -5
  133. package/dist/lead.js +89 -29
  134. package/dist/limits-ui.d.ts +8 -1
  135. package/dist/limits-ui.js +26 -0
  136. package/dist/live-bus.d.ts +8 -0
  137. package/dist/live-bus.js +40 -4
  138. package/dist/live-detail.d.ts +27 -0
  139. package/dist/live-detail.js +57 -0
  140. package/dist/live-notes.d.ts +20 -0
  141. package/dist/live-notes.js +47 -0
  142. package/dist/live-records.d.ts +140 -0
  143. package/dist/live-records.js +935 -0
  144. package/dist/live-terminal.d.ts +269 -0
  145. package/dist/live-terminal.js +686 -0
  146. package/dist/live.d.ts +38 -27
  147. package/dist/live.js +142 -124
  148. package/dist/mcp-oauth.d.ts +6 -3
  149. package/dist/mcp-oauth.js +8 -4
  150. package/dist/memory-pass.js +2 -2
  151. package/dist/mobile-viewport.d.ts +5 -1
  152. package/dist/mobile-viewport.js +18 -2
  153. package/dist/model-catalog.js +4 -0
  154. package/dist/monitoring-ui.js +2 -2
  155. package/dist/needs-you.d.ts +1 -1
  156. package/dist/needs-you.js +11 -4
  157. package/dist/operate.d.ts +4 -0
  158. package/dist/operate.js +335 -19
  159. package/dist/passwordless.d.ts +23 -0
  160. package/dist/passwordless.js +26 -0
  161. package/dist/peek-cli.d.ts +12 -4
  162. package/dist/peek-cli.js +19 -11
  163. package/dist/phase-routing.js +10 -3
  164. package/dist/planner-source.d.ts +3 -0
  165. package/dist/planner-source.js +14 -0
  166. package/dist/planner.d.ts +2 -1
  167. package/dist/planner.js +7 -1
  168. package/dist/policy-ui.js +2 -2
  169. package/dist/policy.d.ts +1 -20
  170. package/dist/policy.js +29 -2
  171. package/dist/project-delete-ui.d.ts +18 -0
  172. package/dist/project-delete-ui.js +60 -9
  173. package/dist/project-delete.js +2 -2
  174. package/dist/project-memory.d.ts +3 -1
  175. package/dist/project-memory.js +57 -25
  176. package/dist/project-tools.d.ts +5 -3
  177. package/dist/project-tools.js +12 -9
  178. package/dist/provider-auth.d.ts +4 -3
  179. package/dist/provider-auth.js +5 -4
  180. package/dist/provider-connection.d.ts +2 -1
  181. package/dist/provider-connection.js +5 -0
  182. package/dist/provider.d.ts +25 -2
  183. package/dist/provider.js +63 -9
  184. package/dist/pull-request-ui.js +2 -2
  185. package/dist/push.js +1 -1
  186. package/dist/quick-start.d.ts +24 -0
  187. package/dist/quick-start.js +127 -0
  188. package/dist/release-adapters.d.ts +6 -0
  189. package/dist/release-adapters.js +70 -3
  190. package/dist/release.d.ts +10 -1
  191. package/dist/release.js +34 -15
  192. package/dist/request-budget-ui.js +2 -2
  193. package/dist/result-follow-ups.js +3 -2
  194. package/dist/result-review.d.ts +1 -1
  195. package/dist/result-review.js +9 -3
  196. package/dist/retention-ui.js +2 -2
  197. package/dist/retention.js +10 -1
  198. package/dist/run-efficiency.d.ts +73 -0
  199. package/dist/run-efficiency.js +228 -0
  200. package/dist/runner.d.ts +5 -1
  201. package/dist/runner.js +22 -1
  202. package/dist/scope.d.ts +183 -5
  203. package/dist/scope.js +256 -31
  204. package/dist/scout-net.d.ts +4 -1
  205. package/dist/scout-net.js +37 -12
  206. package/dist/scout.d.ts +20 -6
  207. package/dist/scout.js +27 -3
  208. package/dist/serve.js +248 -40
  209. package/dist/server/chat.d.ts +1 -1
  210. package/dist/server/chat.js +122 -31
  211. package/dist/server/chrome.d.ts +16 -2
  212. package/dist/server/chrome.js +63 -11
  213. package/dist/server/console.css +107 -42
  214. package/dist/server/flows.js +38 -8
  215. package/dist/server/guards.d.ts +1 -0
  216. package/dist/server/guards.js +23 -9
  217. package/dist/server/http.d.ts +7 -0
  218. package/dist/server/http.js +3 -2
  219. package/dist/server/live.d.ts +34 -1
  220. package/dist/server/live.js +39 -17
  221. package/dist/server/pages-assets.js +5 -0
  222. package/dist/server/pages.js +90 -13
  223. package/dist/server/people-tokens.d.ts +3 -0
  224. package/dist/server/people-tokens.js +55 -17
  225. package/dist/server/remote-hooks.js +12 -6
  226. package/dist/server/remote.d.ts +2 -1
  227. package/dist/server/remote.js +14 -5
  228. package/dist/server/render-chat.d.ts +12 -3
  229. package/dist/server/render-chat.js +47 -16
  230. package/dist/server/render-pages.d.ts +32 -4
  231. package/dist/server/render-pages.js +83 -13
  232. package/dist/server/render-people.d.ts +3 -2
  233. package/dist/server/render-people.js +3 -2
  234. package/dist/server/render-results.d.ts +18 -2
  235. package/dist/server/render-results.js +37 -28
  236. package/dist/server/render-settings.js +6 -5
  237. package/dist/server/render-tasks.d.ts +35 -10
  238. package/dist/server/render-tasks.js +111 -27
  239. package/dist/server/request-context.d.ts +2 -0
  240. package/dist/server/request-context.js +2 -1
  241. package/dist/server/route-table.d.ts +3 -0
  242. package/dist/server/route-table.js +47 -5
  243. package/dist/server/runtime.d.ts +33 -2
  244. package/dist/server/session.d.ts +25 -1
  245. package/dist/server/session.js +18 -4
  246. package/dist/server/settings.js +142 -10
  247. package/dist/server/sweeps.d.ts +4 -0
  248. package/dist/server/sweeps.js +58 -0
  249. package/dist/server/task-views.d.ts +2 -1
  250. package/dist/server/task-views.js +96 -6
  251. package/dist/server/tasks.js +327 -78
  252. package/dist/server/terminals.d.ts +31 -0
  253. package/dist/server/terminals.js +365 -0
  254. package/dist/setup-guide.js +3 -2
  255. package/dist/slack-chat.js +4 -1
  256. package/dist/spend-ui.js +3 -3
  257. package/dist/spend.js +2 -1
  258. package/dist/steer-capabilities.d.ts +32 -0
  259. package/dist/steer-capabilities.js +60 -0
  260. package/dist/steer-controls.d.ts +14 -0
  261. package/dist/steer-controls.js +36 -0
  262. package/dist/steer-status.js +2 -2
  263. package/dist/storage-ui.js +4 -4
  264. package/dist/store-baseline.d.ts +1 -1
  265. package/dist/store-baseline.js +1 -1
  266. package/dist/store.d.ts +440 -15
  267. package/dist/store.js +1072 -52
  268. package/dist/subagent-desk.js +1 -1
  269. package/dist/summary.js +3 -0
  270. package/dist/task-source.d.ts +58 -0
  271. package/dist/task-source.js +93 -0
  272. package/dist/team-leads.js +1 -1
  273. package/dist/teams-chat.js +4 -1
  274. package/dist/teardown-git.d.ts +22 -0
  275. package/dist/teardown-git.js +136 -2
  276. package/dist/telegram-lead.d.ts +3 -0
  277. package/dist/telegram-lead.js +44 -7
  278. package/dist/telegram.d.ts +11 -2
  279. package/dist/telegram.js +51 -17
  280. package/dist/terminal-catalog.d.ts +11 -0
  281. package/dist/terminal-catalog.js +129 -0
  282. package/dist/text-limits.d.ts +2 -0
  283. package/dist/text-limits.js +2 -0
  284. package/dist/tool-broker.d.ts +14 -0
  285. package/dist/tool-broker.js +67 -2
  286. package/dist/toolroll-update-ui.js +2 -2
  287. package/dist/toolroll-update.js +13 -3
  288. package/dist/tools-ui.js +2 -2
  289. package/dist/unfenced-test-support.d.ts +2 -0
  290. package/dist/unfenced-test-support.js +11 -0
  291. package/dist/webhook-limits.d.ts +23 -0
  292. package/dist/webhook-limits.js +30 -0
  293. package/dist/webhook-readers.d.ts +56 -0
  294. package/dist/webhook-readers.js +138 -0
  295. package/dist/webhook-signing.d.ts +27 -0
  296. package/dist/webhook-signing.js +119 -0
  297. package/dist/work-index.d.ts +29 -0
  298. package/dist/work-index.js +16 -2
  299. package/dist/workspace-revision.js +3 -1
  300. package/dist/writes-mode.d.ts +9 -0
  301. package/dist/writes-mode.js +8 -0
  302. package/package.json +15 -2
@@ -0,0 +1,269 @@
1
+ import { type Git } from "./teardown-git.js";
2
+ export type TerminalProgram = "claude" | "codex" | "shell";
3
+ export declare const TERMINAL_PROGRAMS: readonly TerminalProgram[];
4
+ /** At most this many running sessions per console, and this many kept at all (ended ones count until removed). */
5
+ export declare const MAX_LIVE_TERMINALS = 8;
6
+ export declare const MAX_KEPT_TERMINALS = 16;
7
+ /** At most this many pages attached to one session (a desktop, a phone, a spare tab or two). */
8
+ export declare const MAX_VIEWERS = 4;
9
+ /** After SIGHUP, the terminal's processes have this long before SIGKILL. */
10
+ export declare const CLOSE_GRACE_MS = 2000;
11
+ /** Typed input not yet read by the program, per terminal: past this, more is refused until it reads. */
12
+ export declare const MAX_PENDING_INPUT: number;
13
+ /** How often a running terminal's processes are noted, so ones that outlive their parent are still known. */
14
+ export declare const CUSTODY_REFRESH_MS = 5000;
15
+ export declare const COLS: {
16
+ readonly min: 2;
17
+ readonly max: 500;
18
+ };
19
+ export declare const ROWS: {
20
+ readonly min: 1;
21
+ readonly max: 200;
22
+ };
23
+ /** The slice of node-pty this module uses, so tests can stand a fake in. */
24
+ export type Pty = {
25
+ readonly pid: number;
26
+ /** The terminal device its processes have as their controlling terminal ("ttys012", "pts/3"); null when unknown. */
27
+ readonly tty: string | null;
28
+ /** Typed bytes queued for the program and not yet taken by the kernel; Infinity when it can't be measured. */
29
+ pendingInput(): number;
30
+ onData(listener: (data: string) => void): unknown;
31
+ onExit(listener: (exit: {
32
+ exitCode: number;
33
+ signal?: number;
34
+ }) => void): unknown;
35
+ write(data: string): void;
36
+ resize(cols: number, rows: number): void;
37
+ kill(signal?: string): void;
38
+ };
39
+ export type PtySpawn = (file: string, args: string[], options: {
40
+ cwd: string;
41
+ env: NodeJS.ProcessEnv;
42
+ cols: number;
43
+ rows: number;
44
+ }) => Pty;
45
+ /** A device path as `ps` prints it: /dev/ttys012 → ttys012, /dev/pts/3 → pts/3. */
46
+ export declare const ttyName: (path: unknown) => string | null;
47
+ /**
48
+ * node-pty's write queue (@lydell/node-pty 1.2.0-beta.15, pinned exactly): typed input waits in its
49
+ * `_writeStream._writeQueue` until the kernel takes it. A shape this doesn't recognise is unmeasurable: Infinity, so
50
+ * input is refused rather than queued without bound (a test pins the shape against the installed package).
51
+ */
52
+ export declare function pendingInputOf(pty: unknown): number;
53
+ /** node-pty, if this install has it (an optional dependency with prebuilt binaries); null when it doesn't load. */
54
+ export declare function loadPtySpawn(): PtySpawn | null;
55
+ /** How many lines above the screen a terminal keeps for a page that attaches later. */
56
+ export declare const SCREEN_SCROLLBACK_LINES = 5000;
57
+ /**
58
+ * The terminal as a page would see it now: every byte the program writes is parsed by a headless xterm here, so a page
59
+ * that attaches later gets the screen, its scrollback and its modes (the alternate screen of a full-screen program, the
60
+ * cursor, colours, bracketed paste, mouse reporting) — never a replay of raw output cut at an arbitrary byte, which
61
+ * could split an escape sequence or redraw a full-screen program garbled.
62
+ */
63
+ export declare class ScreenMirror {
64
+ private readonly lines;
65
+ private readonly terminal;
66
+ private readonly serializer;
67
+ constructor(cols: number, rows: number, lines?: number);
68
+ write(data: string): void;
69
+ resize(cols: number, rows: number): void;
70
+ /** The screen as of this call (after everything written before it), handed to `done` once parsed. */
71
+ snapshot(done: (screen: string) => void): void;
72
+ dispose(): void;
73
+ }
74
+ /** One attached page. The host never waits on it. */
75
+ export type TerminalViewer = {
76
+ output(data: Buffer): void;
77
+ control(message: TerminalControl): void;
78
+ };
79
+ export type TerminalControl = {
80
+ t: "hello";
81
+ cols: number;
82
+ rows: number;
83
+ program: TerminalProgram;
84
+ ended: boolean;
85
+ } | {
86
+ t: "exit";
87
+ code: number | null;
88
+ signal: number | null;
89
+ }
90
+ /** The program isn't reading what's typed: input waits until it does. */
91
+ | {
92
+ t: "input-full";
93
+ };
94
+ export type TerminalSummary = {
95
+ id: string;
96
+ owner: string;
97
+ /** The owner's account generation at start: a rotated credential or a re-sign-in elsewhere no longer reaches it. */
98
+ generation: number;
99
+ repo: string;
100
+ program: TerminalProgram;
101
+ branch: string;
102
+ worktree: string;
103
+ startedAt: string;
104
+ endedAt: string | null;
105
+ exit: {
106
+ code: number | null;
107
+ signal: number | null;
108
+ } | null;
109
+ /** Who ended it, when Toolroll did. */
110
+ endedBy: "owner" | "console" | null;
111
+ /**
112
+ * After it ends: "clean" once every process known to be its own is proved gone; "uncertain" when one outlived
113
+ * SIGKILL or the process table couldn't be read. Null while it runs or is being swept.
114
+ */
115
+ cleanup: "clean" | "uncertain" | null;
116
+ };
117
+ /**
118
+ * Where a console's terminals are written down for the updater, which runs as another process (terminal-catalog.ts):
119
+ * a start is reserved before any work and refused while an update owns admission; a program is running until its
120
+ * sweep ends. The default keeps nothing (tests, a console without a database file).
121
+ */
122
+ export type TerminalLedger = {
123
+ /** Throws (with the reason in words) when no terminal may start now. */
124
+ reserve(id: string): void;
125
+ running(id: string): void;
126
+ release(id: string, cleanup: "clean" | "uncertain" | null): void;
127
+ /** The terminal is removed (its worktree went after a clean sweep): nothing of it is left to count. */
128
+ forget(id: string): void;
129
+ };
130
+ export declare class TerminalError extends Error {
131
+ constructor(message: string);
132
+ }
133
+ export type TerminalHostOptions = {
134
+ spawn: PtySpawn;
135
+ worktreeRoot: string;
136
+ /** Git for making and removing worktrees: hardened by default (teardown-git.ts), since a build can write .git/config. */
137
+ git?: Git;
138
+ /** How each program starts; the default looks up `claude`, `codex` and the login shell on PATH. */
139
+ programs?: Partial<Record<TerminalProgram, {
140
+ file: string;
141
+ args: string[];
142
+ }>>;
143
+ env?: () => NodeJS.ProcessEnv;
144
+ clock?: () => Date;
145
+ /** Start, close and remove, for the event log (never input or output). */
146
+ record?: (event: "start" | "close" | "remove" | "exit", session: TerminalSummary) => void;
147
+ maxSessions?: number;
148
+ /** Lines above the screen a terminal keeps for a page that attaches later (SCREEN_SCROLLBACK_LINES). */
149
+ scrollbackLines?: number;
150
+ closeGraceMs?: number;
151
+ ledger?: TerminalLedger;
152
+ /** The process table (tests stand a failing one in); null when it can't be read. */
153
+ processes?: () => ProcessTable | null;
154
+ /** Who else works in a worktree (tests stand theirs in); default worktreeResidents. */
155
+ residents?: (table: ProcessTable, worktreeReal: string, terminalStartedMs: number) => Set<number> | null;
156
+ };
157
+ /** The executable on PATH, or null. */
158
+ export declare function onPath(name: string, env?: NodeJS.ProcessEnv): string | null;
159
+ export declare class TerminalHost {
160
+ private readonly options;
161
+ private readonly sessions;
162
+ private starting;
163
+ private stopped;
164
+ private readonly clock;
165
+ private readonly env;
166
+ private readonly ledger;
167
+ private readonly processes;
168
+ private custodyTimer;
169
+ constructor(options: TerminalHostOptions);
170
+ private summary;
171
+ /** This person's sessions, newest first. */
172
+ list(owner: string): TerminalSummary[];
173
+ get(id: string): TerminalSummary | null;
174
+ private running;
175
+ /**
176
+ * Make the worktree and start the program in it. `admit` is asked again right before the program starts (after the
177
+ * slow git work): a person whose access or project went in between starts nothing.
178
+ */
179
+ start({ name: owner, generation }: {
180
+ name: string;
181
+ generation: number;
182
+ }, repoPath: string, program: TerminalProgram, size?: {
183
+ cols: number;
184
+ rows: number;
185
+ }, admit?: () => string | null): Promise<TerminalSummary>;
186
+ /**
187
+ * Attach a page: it gets the screen as it is now (ScreenMirror), then `hello`, then live output — what the program
188
+ * writes meanwhile is held and sent after the screen, in order. Returns its detach.
189
+ */
190
+ attach(id: string, viewer: TerminalViewer): () => void;
191
+ /** How many pages are attached now. */
192
+ viewerCount(id: string): number;
193
+ /** Type into the program. False (nothing queued) while it has MAX_PENDING_INPUT unread, or can't be measured. */
194
+ input(id: string, data: string): boolean;
195
+ resize(id: string, cols: number, rows: number): void;
196
+ private noteTimer;
197
+ /** Activity (output, typing) usually means a command started: note processes shortly after, at most every 250 ms. */
198
+ private noteSoon;
199
+ /** Note every running terminal's processes now, and keep doing so while any runs. */
200
+ private noteCustody;
201
+ /**
202
+ * End the program and everything that is its own: SIGHUP to every member (an interactive shell gives each job its own
203
+ * process group, so the leader's group is not enough), then SIGKILL, re-reading the process table each time so a
204
+ * child started during the close is caught too. Membership is the leader's descendants, every process with this
205
+ * terminal as its controlling terminal (started before the program ended), and every one noted while it ran, by pid
206
+ * and start time. A process that detached itself from the terminal AND its parents before it was noted is not seen —
207
+ * the same as any terminal. Resolves when the sweep is done; never waits without bound.
208
+ */
209
+ close(id: string, by?: "owner" | "console"): Promise<void>;
210
+ private sweep;
211
+ /** Drop an ended session and its worktree (the branch stays: the work is there). Only after a clean sweep. */
212
+ remove(id: string): Promise<void>;
213
+ /** Whether new sessions may start (false once the console is stopping). */
214
+ get admitting(): boolean;
215
+ /**
216
+ * The console is stopping: admit nothing more, end every program, and wait (each sweep is bounded) for them.
217
+ * `clean` is false when any terminal's processes couldn't be proved gone.
218
+ */
219
+ stop(): Promise<{
220
+ clean: boolean;
221
+ }>;
222
+ }
223
+ /** One process: its parent, owner, controlling terminal and start time. */
224
+ export type ProcessTable = Map<number, {
225
+ ppid: number;
226
+ uid: number;
227
+ tty: string;
228
+ started: string;
229
+ }>;
230
+ /** Every process from `ps` (macOS and Linux take these options); null when it can't be read, never an empty guess. */
231
+ export declare function readProcessTable(): ProcessTable | null;
232
+ /**
233
+ * A terminal's processes in this table, by pid and start time: what was noted while it ran (still the same process),
234
+ * the leader, everything whose controlling terminal is its terminal and that started before it ended (a later process
235
+ * on a reused device is someone else's), and every descendant of those. Never this console itself.
236
+ */
237
+ export declare function membersOf(table: ProcessTable, session: {
238
+ leader: number;
239
+ tty: string | null;
240
+ known: ReadonlyMap<number, string>;
241
+ exitedAt: number | null;
242
+ }): Map<number, string>;
243
+ /**
244
+ * Each listed process's working directory (Linux: /proc; macOS: lsof), and which ones couldn't be read (a setgid
245
+ * helper such as ssh-agent is unreadable even to its own user). Null when the lookup itself failed: a timeout, a signal
246
+ * or partial output is never a smaller answer. A process gone in between is simply absent.
247
+ */
248
+ export declare function cwdsOf(pids: readonly number[]): {
249
+ cwds: Map<number, string>;
250
+ unreadable: number[];
251
+ } | null;
252
+ /**
253
+ * This user's processes working inside a terminal's worktree, whoever started them. They are never signalled (one may
254
+ * be the person's own shell or a server they started from elsewhere); while any remains, the terminal's cleanup is
255
+ * uncertain and its worktree stays. Null when that can't be known: the lookup failed, or a process whose working
256
+ * directory can't be read started after the terminal did (one from before — a login's ssh-agent — can't be its own).
257
+ */
258
+ export declare function worktreeResidents(table: ProcessTable, worktreeReal: string, terminalStartedMs?: number): Set<number> | null;
259
+ /** One client frame, read strictly; null closes the socket. */
260
+ export type TerminalInput = {
261
+ t: "in";
262
+ d: string;
263
+ } | {
264
+ t: "resize";
265
+ cols: number;
266
+ rows: number;
267
+ };
268
+ export declare const MAX_FRAME_BYTES: number;
269
+ export declare function parseTerminalFrame(text: string): TerminalInput | null;