@monotykamary/localterm-server 2.66.8 → 2.66.10

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/dist/agent-git-status.d.ts +3 -0
  2. package/dist/agent-git-status.d.ts.map +1 -0
  3. package/dist/agent-git-status.js +46 -0
  4. package/dist/agent-git-status.js.map +1 -0
  5. package/dist/agent-log-utils.d.ts +18 -0
  6. package/dist/agent-log-utils.d.ts.map +1 -0
  7. package/dist/agent-log-utils.js +123 -0
  8. package/dist/agent-log-utils.js.map +1 -0
  9. package/dist/agent-models.d.ts +4 -0
  10. package/dist/agent-models.d.ts.map +1 -0
  11. package/dist/agent-models.js +100 -0
  12. package/dist/agent-models.js.map +1 -0
  13. package/dist/agent-runner.d.ts +3 -5
  14. package/dist/agent-runner.d.ts.map +1 -1
  15. package/dist/agent-runner.js +8 -522
  16. package/dist/agent-runner.js.map +1 -1
  17. package/dist/agent-session-reader.d.ts +3 -0
  18. package/dist/agent-session-reader.d.ts.map +1 -0
  19. package/dist/agent-session-reader.js +113 -0
  20. package/dist/agent-session-reader.js.map +1 -0
  21. package/dist/build-pty-environment.d.ts +8 -0
  22. package/dist/build-pty-environment.d.ts.map +1 -0
  23. package/dist/build-pty-environment.js +44 -0
  24. package/dist/build-pty-environment.js.map +1 -0
  25. package/dist/caffeinate-automatic-detector.d.ts +57 -0
  26. package/dist/caffeinate-automatic-detector.d.ts.map +1 -0
  27. package/dist/caffeinate-automatic-detector.js +275 -0
  28. package/dist/caffeinate-automatic-detector.js.map +1 -0
  29. package/dist/caffeinate-battery-guard.d.ts +35 -0
  30. package/dist/caffeinate-battery-guard.d.ts.map +1 -0
  31. package/dist/caffeinate-battery-guard.js +190 -0
  32. package/dist/caffeinate-battery-guard.js.map +1 -0
  33. package/dist/caffeinate-manager.d.ts +5 -31
  34. package/dist/caffeinate-manager.d.ts.map +1 -1
  35. package/dist/caffeinate-manager.js +55 -400
  36. package/dist/caffeinate-manager.js.map +1 -1
  37. package/dist/cdp/cdp-client.d.ts +4 -70
  38. package/dist/cdp/cdp-client.d.ts.map +1 -1
  39. package/dist/cdp/cdp-client.js +58 -418
  40. package/dist/cdp/cdp-client.js.map +1 -1
  41. package/dist/cdp/cdp-connection.d.ts +72 -0
  42. package/dist/cdp/cdp-connection.d.ts.map +1 -0
  43. package/dist/cdp/cdp-connection.js +272 -0
  44. package/dist/cdp/cdp-connection.js.map +1 -0
  45. package/dist/cdp/constants.d.ts +6 -0
  46. package/dist/cdp/constants.d.ts.map +1 -0
  47. package/dist/cdp/constants.js +9 -0
  48. package/dist/cdp/constants.js.map +1 -0
  49. package/dist/cdp/target-registry.d.ts +41 -0
  50. package/dist/cdp/target-registry.d.ts.map +1 -0
  51. package/dist/cdp/target-registry.js +118 -0
  52. package/dist/cdp/target-registry.js.map +1 -0
  53. package/dist/constants.d.ts +2 -0
  54. package/dist/constants.d.ts.map +1 -1
  55. package/dist/constants.js +2 -0
  56. package/dist/constants.js.map +1 -1
  57. package/dist/git-branch-metadata.d.ts +11 -0
  58. package/dist/git-branch-metadata.d.ts.map +1 -0
  59. package/dist/git-branch-metadata.js +85 -0
  60. package/dist/git-branch-metadata.js.map +1 -0
  61. package/dist/git-diff-cache.d.ts +13 -0
  62. package/dist/git-diff-cache.d.ts.map +1 -0
  63. package/dist/git-diff-cache.js +32 -0
  64. package/dist/git-diff-cache.js.map +1 -0
  65. package/dist/git-diff-parser.d.ts +15 -0
  66. package/dist/git-diff-parser.d.ts.map +1 -0
  67. package/dist/git-diff-parser.js +196 -0
  68. package/dist/git-diff-parser.js.map +1 -0
  69. package/dist/git-diff-service.d.ts +10 -0
  70. package/dist/git-diff-service.d.ts.map +1 -0
  71. package/dist/git-diff-service.js +395 -0
  72. package/dist/git-diff-service.js.map +1 -0
  73. package/dist/git-diff.d.ts +8 -41
  74. package/dist/git-diff.d.ts.map +1 -1
  75. package/dist/git-diff.js +5 -944
  76. package/dist/git-diff.js.map +1 -1
  77. package/dist/github-pr.d.ts +32 -0
  78. package/dist/github-pr.d.ts.map +1 -0
  79. package/dist/github-pr.js +266 -0
  80. package/dist/github-pr.js.map +1 -0
  81. package/dist/pi-binary-resolver.d.ts +6 -0
  82. package/dist/pi-binary-resolver.d.ts.map +1 -0
  83. package/dist/pi-binary-resolver.js +70 -0
  84. package/dist/pi-binary-resolver.js.map +1 -0
  85. package/dist/pi-rpc-client.d.ts +14 -0
  86. package/dist/pi-rpc-client.d.ts.map +1 -0
  87. package/dist/pi-rpc-client.js +87 -0
  88. package/dist/pi-rpc-client.js.map +1 -0
  89. package/dist/session-client-hub.d.ts +57 -0
  90. package/dist/session-client-hub.d.ts.map +1 -0
  91. package/dist/session-client-hub.js +435 -0
  92. package/dist/session-client-hub.js.map +1 -0
  93. package/dist/session-command-executor.d.ts +14 -0
  94. package/dist/session-command-executor.d.ts.map +1 -0
  95. package/dist/session-command-executor.js +207 -0
  96. package/dist/session-command-executor.js.map +1 -0
  97. package/dist/session-git-event-bridge.d.ts +16 -0
  98. package/dist/session-git-event-bridge.d.ts.map +1 -0
  99. package/dist/session-git-event-bridge.js +56 -0
  100. package/dist/session-git-event-bridge.js.map +1 -0
  101. package/dist/session-lifecycle-policy.d.ts +15 -0
  102. package/dist/session-lifecycle-policy.d.ts.map +1 -0
  103. package/dist/session-lifecycle-policy.js +105 -0
  104. package/dist/session-lifecycle-policy.js.map +1 -0
  105. package/dist/session-manager.d.ts +11 -42
  106. package/dist/session-manager.d.ts.map +1 -1
  107. package/dist/session-manager.js +72 -987
  108. package/dist/session-manager.js.map +1 -1
  109. package/dist/session-output-coordinator.d.ts +21 -0
  110. package/dist/session-output-coordinator.d.ts.map +1 -0
  111. package/dist/session-output-coordinator.js +134 -0
  112. package/dist/session-output-coordinator.js.map +1 -0
  113. package/dist/session-output-transport.d.ts +22 -0
  114. package/dist/session-output-transport.d.ts.map +1 -0
  115. package/dist/session-output-transport.js +160 -0
  116. package/dist/session-output-transport.js.map +1 -0
  117. package/dist/session.d.ts +0 -4
  118. package/dist/session.d.ts.map +1 -1
  119. package/dist/session.js +11 -258
  120. package/dist/session.js.map +1 -1
  121. package/dist/shell-hook-builder.d.ts +16 -0
  122. package/dist/shell-hook-builder.d.ts.map +1 -0
  123. package/dist/shell-hook-builder.js +230 -0
  124. package/dist/shell-hook-builder.js.map +1 -0
  125. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ import fs from "node:fs";
2
+ import { capSessionToolResult, extractToolResultText, formatToolInput, truncateToolInput, } from "./agent-log-utils.js";
3
+ // Read a thread-mode pi session file (JSONL) and flatten it into the same
4
+ // user/assistant/tool entry shape as a run log, plus a `compaction` entry for
5
+ // each compaction the branch went through. Tool calls are tracked by id so a
6
+ // tool result's name + input (the path/command) can be recovered from the
7
+ // preceding call. Session-transcript tool results are capped at pi core's
8
+ // limits (2000 lines / 50 KB), not the stored-log preview cap. `untilMs`
9
+ // truncates the transcript at a point in time (a run's finishedAt) so an older
10
+ // run shows the branch as it was then, not the latest state. Returns [] if the
11
+ // file is missing (fresh mode, or no runs yet).
12
+ export const readAgentSession = async (sessionFile, untilMs) => {
13
+ let raw;
14
+ try {
15
+ raw = await fs.promises.readFile(sessionFile, "utf8");
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ const toolNameById = new Map();
21
+ const toolInputById = new Map();
22
+ const entries = [];
23
+ for (const line of raw.split("\n")) {
24
+ const trimmed = line.trim();
25
+ if (trimmed.length === 0)
26
+ continue;
27
+ let event;
28
+ try {
29
+ event = JSON.parse(trimmed);
30
+ }
31
+ catch {
32
+ continue;
33
+ }
34
+ if (untilMs !== undefined &&
35
+ typeof event.timestamp === "string" &&
36
+ Date.parse(event.timestamp) > untilMs) {
37
+ continue;
38
+ }
39
+ if (event.type === "message") {
40
+ const message = event.message;
41
+ if (!message)
42
+ continue;
43
+ const role = message.role;
44
+ const content = Array.isArray(message.content) ? message.content : [];
45
+ if (role === "user") {
46
+ for (const part of content) {
47
+ const block = part;
48
+ if (block.type === "text" && typeof block.text === "string") {
49
+ entries.push({ type: "user", text: block.text });
50
+ }
51
+ else if (block.type === "tool_result") {
52
+ const id = String(block.tool_use_id ?? "");
53
+ const name = toolNameById.get(id) ?? "tool";
54
+ const input = toolInputById.get(id);
55
+ entries.push({
56
+ type: "tool",
57
+ name,
58
+ ...(input !== undefined ? { input } : {}),
59
+ text: capSessionToolResult(extractToolResultText(block)),
60
+ });
61
+ }
62
+ }
63
+ }
64
+ else if (role === "toolResult") {
65
+ const message2 = event.message;
66
+ const id = String(message2?.toolCallId ?? "");
67
+ const name = (typeof message2?.toolName === "string" && message2.toolName) ||
68
+ toolNameById.get(id) ||
69
+ "tool";
70
+ const input = toolInputById.get(id);
71
+ entries.push({
72
+ type: "tool",
73
+ name,
74
+ ...(input !== undefined ? { input } : {}),
75
+ text: capSessionToolResult(extractToolResultText(message2 ?? {})),
76
+ });
77
+ }
78
+ else if (role === "assistant") {
79
+ let text = "";
80
+ let thinking = "";
81
+ for (const part of content) {
82
+ const block = part;
83
+ if (block.type === "text" && typeof block.text === "string")
84
+ text += block.text;
85
+ else if (block.type === "thinking" && typeof block.thinking === "string")
86
+ thinking += block.thinking;
87
+ else if (block.type === "tool_use" || block.type === "toolCall") {
88
+ const callId = String(block.id ?? "");
89
+ const callName = String(block.name ?? "tool");
90
+ toolNameById.set(callId, callName);
91
+ const formatted = truncateToolInput(formatToolInput(block.arguments ?? block.input));
92
+ if (formatted)
93
+ toolInputById.set(callId, formatted);
94
+ }
95
+ }
96
+ if (text.length > 0 || thinking.length > 0) {
97
+ entries.push(thinking.length > 0
98
+ ? { type: "assistant", text, thinking }
99
+ : { type: "assistant", text });
100
+ }
101
+ }
102
+ }
103
+ else if (event.type === "compaction") {
104
+ const summary = String(event.summary ?? "");
105
+ const tokensBefore = typeof event.tokensBefore === "number" ? event.tokensBefore : undefined;
106
+ entries.push(tokensBefore !== undefined
107
+ ? { type: "compaction", summary, tokensBefore }
108
+ : { type: "compaction", summary });
109
+ }
110
+ }
111
+ return entries;
112
+ };
113
+ //# sourceMappingURL=agent-session-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-reader.js","sourceRoot":"","sources":["../src/agent-session-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SpawnPtyInput } from "./types.js";
2
+ interface BuildPtyEnvironmentOptions {
3
+ input: SpawnPtyInput;
4
+ sessionId: string;
5
+ }
6
+ export declare const buildPtyEnvironment: ({ input, sessionId, }: BuildPtyEnvironmentOptions) => Record<string, string>;
7
+ export {};
8
+ //# sourceMappingURL=build-pty-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-pty-environment.d.ts","sourceRoot":"","sources":["../src/build-pty-environment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,UAAU,0BAA0B;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,0BAG7B,0BAA0B,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAsCpD,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { COLORTERM_VALUE, LOCALTERM_VALUE, PTY_ENV_DENYLIST, TERM_TYPE } from "./constants.js";
2
+ import { shellPathForUserShell } from "./utils/shell-path.js";
3
+ export const buildPtyEnvironment = ({ input, sessionId, }) => {
4
+ const env = {};
5
+ const denied = new Set(PTY_ENV_DENYLIST);
6
+ const isLocaltermPath = (value) => /localterm-(?:zdot|bash)-/.test(value);
7
+ // The daemon may inherit a stale ZDOTDIR / __LOCALTERM_ORIG_ZDOTDIR from
8
+ // its login-shell wrapper — the previous session set ZDOTDIR to a temp
9
+ // hook dir and the plist's `zsh -l -c` re-sources that hook .zshrc. Strip
10
+ // any value that points to a localterm temp dir; pass through a legitimate
11
+ // user-set ZDOTDIR (e.g. dotfiles managed via custom ZDOTDIR). ZDOTDIR
12
+ // takes priority over __LOCALTERM_ORIG_ZDOTDIR because it reflects the
13
+ // user's current environment.
14
+ const inheritedZdotdir = process.env.ZDOTDIR;
15
+ const inheritedOrigZdotdir = process.env.__LOCALTERM_ORIG_ZDOTDIR;
16
+ const userZdotdirFromEnv = inheritedZdotdir && !isLocaltermPath(inheritedZdotdir)
17
+ ? inheritedZdotdir
18
+ : inheritedOrigZdotdir && !isLocaltermPath(inheritedOrigZdotdir)
19
+ ? inheritedOrigZdotdir
20
+ : undefined;
21
+ for (const [key, value] of Object.entries(process.env)) {
22
+ if (denied.has(key))
23
+ continue;
24
+ if (typeof value === "string")
25
+ env[key] = value;
26
+ }
27
+ if (userZdotdirFromEnv)
28
+ env.__LOCALTERM_ORIG_ZDOTDIR = userZdotdirFromEnv;
29
+ else
30
+ delete env.__LOCALTERM_ORIG_ZDOTDIR;
31
+ // User shells bootstrap their own PATH via rc files; don't leak the daemon's.
32
+ env.PATH = shellPathForUserShell();
33
+ if (input.env) {
34
+ for (const [key, value] of Object.entries(input.env)) {
35
+ env[key] = value;
36
+ }
37
+ }
38
+ env.TERM = TERM_TYPE;
39
+ env.COLORTERM = COLORTERM_VALUE;
40
+ env.LOCALTERM = LOCALTERM_VALUE;
41
+ env.LOCALTERM_SESSION_ID = sessionId;
42
+ return env;
43
+ };
44
+ //# sourceMappingURL=build-pty-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-pty-environment.js","sourceRoot":"","sources":["../src/build-pty-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,KAAK,EACL,SAAS,GACkB,EAA0B,EAAE;IACvD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,yEAAyE;IACzE,uEAAuE;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,uEAAuE;IACvE,uEAAuE;IACvE,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAClE,MAAM,kBAAkB,GACtB,gBAAgB,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;QACpD,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,oBAAoB,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC;YAC9D,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,SAAS,CAAC;IAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,IAAI,kBAAkB;QAAE,GAAG,CAAC,wBAAwB,GAAG,kBAAkB,CAAC;;QACrE,OAAO,GAAG,CAAC,wBAAwB,CAAC;IACzC,8EAA8E;IAC9E,GAAG,CAAC,IAAI,GAAG,qBAAqB,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;IACrB,GAAG,CAAC,SAAS,GAAG,eAAe,CAAC;IAChC,GAAG,CAAC,SAAS,GAAG,eAAe,CAAC;IAChC,GAAG,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAErC,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { type SnapshotProcesses } from "./caffeinate-process-match.js";
2
+ import type { CaffeinateMode } from "./types.js";
3
+ interface CaffeinateAutomaticDetectorOptions {
4
+ listSessionPids: () => number[];
5
+ snapshotProcesses: SnapshotProcesses;
6
+ defaultCommands: readonly string[];
7
+ getCommands: () => string[];
8
+ getMode: () => CaffeinateMode;
9
+ getActivityGate: () => boolean;
10
+ getPeerKeepAwake: () => boolean;
11
+ isSupported: () => boolean;
12
+ hasRecentOutput: ((pids: readonly number[], withinMs: number) => boolean) | undefined;
13
+ hasPeerClient: () => boolean;
14
+ foregroundNames: (() => Map<number, string>) | undefined;
15
+ emitChange: () => void;
16
+ recompute: () => void;
17
+ }
18
+ export declare class CaffeinateAutomaticDetector {
19
+ private readonly listSessionPids;
20
+ private readonly snapshotProcesses;
21
+ private readonly defaultCommands;
22
+ private readonly getCommands;
23
+ private readonly getMode;
24
+ private readonly getActivityGate;
25
+ private readonly getPeerKeepAwake;
26
+ private readonly isSupported;
27
+ private readonly checkRecentOutput;
28
+ private readonly hasPeerClient;
29
+ private readonly foregroundNames;
30
+ private readonly emitChange;
31
+ private readonly recompute;
32
+ private autoActive;
33
+ private autoTrigger;
34
+ private autoPeerActive;
35
+ private pokeTimer;
36
+ private activityGateTimer;
37
+ private polling;
38
+ private pollQueued;
39
+ private disposed;
40
+ constructor(options: CaffeinateAutomaticDetectorOptions);
41
+ get active(): boolean;
42
+ get activeTrigger(): string | null;
43
+ get peerActive(): boolean;
44
+ modeChanged(mode: CaffeinateMode): void;
45
+ activityGateChanged(enabled: boolean): void;
46
+ poke(): void;
47
+ noteOutputActivity(): void;
48
+ poll(): Promise<void>;
49
+ dispose(): void;
50
+ private triggerSet;
51
+ private hookTriggerFor;
52
+ private pollAuto;
53
+ private armActivityGateTimerIfNeeded;
54
+ private clearActivityGateTimer;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=caffeinate-automatic-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-automatic-detector.d.ts","sourceRoot":"","sources":["../src/caffeinate-automatic-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,UAAU,kCAAkC;IAC1C,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,WAAW,EAAE,MAAM,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,cAAc,CAAC;IAC9B,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IACtF,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IACzD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEpB;IACd,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAuB;IAK1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,OAAO,EAAE,kCAAkC,EActD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,GAAG,IAAI,CAEjC;IAMD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAStC;IAED,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAW1C;IAMD,IAAI,IAAI,IAAI,CAQX;IAMD,kBAAkB,IAAI,IAAI,CA4BzB;IAID,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpB;IAED,OAAO,IAAI,IAAI,CAOd;IAID,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,cAAc;YAYR,QAAQ;IA0FtB,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,sBAAsB;CAM/B"}
@@ -0,0 +1,275 @@
1
+ import { anySessionRunsTrigger, commandMatchesTriggers, } from "./caffeinate-process-match.js";
2
+ import { CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS, } from "./constants.js";
3
+ const EMPTY_FOREGROUND_NAMES = new Map();
4
+ export class CaffeinateAutomaticDetector {
5
+ listSessionPids;
6
+ snapshotProcesses;
7
+ defaultCommands;
8
+ getCommands;
9
+ getMode;
10
+ getActivityGate;
11
+ getPeerKeepAwake;
12
+ isSupported;
13
+ checkRecentOutput;
14
+ hasPeerClient;
15
+ foregroundNames;
16
+ emitChange;
17
+ recompute;
18
+ autoActive = false;
19
+ autoTrigger = null;
20
+ // Whether the most recent poll held caffeinate because a peer was attached
21
+ // (vs. a recognized program). Drives the activity-gate timer arming: a peer
22
+ // holds until it disconnects (an event that pokes its own re-check), so the
23
+ // silence-release timer must not arm while one is present.
24
+ autoPeerActive = false;
25
+ pokeTimer = null;
26
+ activityGateTimer = null;
27
+ polling = false;
28
+ pollQueued = false;
29
+ disposed = false;
30
+ constructor(options) {
31
+ this.listSessionPids = options.listSessionPids;
32
+ this.snapshotProcesses = options.snapshotProcesses;
33
+ this.defaultCommands = options.defaultCommands;
34
+ this.getCommands = options.getCommands;
35
+ this.getMode = options.getMode;
36
+ this.getActivityGate = options.getActivityGate;
37
+ this.getPeerKeepAwake = options.getPeerKeepAwake;
38
+ this.isSupported = options.isSupported;
39
+ this.checkRecentOutput = options.hasRecentOutput;
40
+ this.hasPeerClient = options.hasPeerClient;
41
+ this.foregroundNames = options.foregroundNames;
42
+ this.emitChange = options.emitChange;
43
+ this.recompute = options.recompute;
44
+ }
45
+ get active() {
46
+ return this.autoActive;
47
+ }
48
+ get activeTrigger() {
49
+ return this.autoActive ? this.autoTrigger : null;
50
+ }
51
+ // Whether automatic mode is currently holding caffeinate because a peer (a
52
+ // second client on a session) is attached — independent of the program
53
+ // trigger, so the UI can highlight the peer setting row even when a program
54
+ // is also active (in which case `activeTrigger` carries the program name).
55
+ get peerActive() {
56
+ return this.autoPeerActive;
57
+ }
58
+ modeChanged(mode) {
59
+ // Leaving automatic clears the cached detection so a later return to
60
+ // automatic re-derives it from scratch rather than trusting a stale flag.
61
+ if (mode !== "automatic") {
62
+ this.autoActive = false;
63
+ this.autoTrigger = null;
64
+ this.autoPeerActive = false;
65
+ this.clearActivityGateTimer();
66
+ }
67
+ }
68
+ activityGateChanged(enabled) {
69
+ if (enabled) {
70
+ // Gate just turned on — re-check whether caffeinate should still be
71
+ // active given current output activity.
72
+ if (this.getMode() === "automatic" && this.isSupported())
73
+ void this.poll();
74
+ }
75
+ else {
76
+ // Gate turned off — no need to re-snapshot; just recompute (which will
77
+ // drop the output check from the condition).
78
+ this.clearActivityGateTimer();
79
+ this.recompute();
80
+ }
81
+ }
82
+ // Cheap, debounced nudge to re-check automatic detection in response to an
83
+ // event (a session's foreground process changing, or a session
84
+ // connecting/disconnecting). The debounce coalesces a burst of simultaneous
85
+ // events into a single `ps` snapshot — it fires once and does not repeat.
86
+ poke() {
87
+ if (this.disposed || this.getMode() !== "automatic" || !this.isSupported())
88
+ return;
89
+ if (this.pokeTimer !== null)
90
+ return;
91
+ this.pokeTimer = setTimeout(() => {
92
+ this.pokeTimer = null;
93
+ void this.poll();
94
+ }, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS);
95
+ this.pokeTimer.unref?.();
96
+ }
97
+ // Record that output just arrived from a session. When the activity gate is
98
+ // on, this resets the trailing-edge timer that checks whether caffeinate
99
+ // should stay active. Output arriving while caffeinate is inactive is a
100
+ // no-op (the foreground-change poke already handles the transition).
101
+ noteOutputActivity() {
102
+ if (this.disposed ||
103
+ this.getMode() !== "automatic" ||
104
+ !this.getActivityGate() ||
105
+ !this.isSupported()) {
106
+ return;
107
+ }
108
+ if (!this.autoActive) {
109
+ // Caffeinate is off but output just arrived — nudge a re-check
110
+ // (the registry already recorded the fresh output timestamp).
111
+ this.poke();
112
+ return;
113
+ }
114
+ // A peer is holding caffeinate; output is irrelevant to it. The peer
115
+ // releases on disconnect (an event that pokes its own re-check), so the
116
+ // silence timer must not arm while one is present — otherwise the trailing
117
+ // edge would poll on a timer and defeat the event-driven design.
118
+ if (this.autoPeerActive)
119
+ return;
120
+ this.clearActivityGateTimer();
121
+ // Schedule a re-check after the debounce window. If more output arrives
122
+ // before this fires, the timer resets (trailing-edge).
123
+ this.activityGateTimer = setTimeout(() => {
124
+ this.activityGateTimer = null;
125
+ void this.poll();
126
+ }, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
127
+ this.activityGateTimer.unref?.();
128
+ }
129
+ // Force an immediate automatic re-check and resolve when it settles. Used by
130
+ // tests; production code re-checks via the event-driven debounced pokeAuto.
131
+ poll() {
132
+ return this.pollAuto();
133
+ }
134
+ dispose() {
135
+ this.disposed = true;
136
+ if (this.pokeTimer !== null) {
137
+ clearTimeout(this.pokeTimer);
138
+ this.pokeTimer = null;
139
+ }
140
+ this.clearActivityGateTimer();
141
+ }
142
+ // The effective keep-awake triggers: fixed defaults plus the user's customs,
143
+ // lowercased for case-insensitive matching.
144
+ triggerSet() {
145
+ const triggers = new Set();
146
+ for (const command of this.defaultCommands)
147
+ triggers.add(command.toLowerCase());
148
+ for (const command of this.getCommands())
149
+ triggers.add(command.toLowerCase());
150
+ return triggers;
151
+ }
152
+ // Whether any live session's shell-hook foreground name (OSC 7777 fg;<token>)
153
+ // is itself a keep-awake trigger — the cheap, walk-free path used before
154
+ // falling back to the `ps` process-tree snapshot. Returns the matching
155
+ // trigger (lowercased) or null when no session's name matches.
156
+ hookTriggerFor(pids, triggers) {
157
+ const names = this.foregroundNames?.() ?? EMPTY_FOREGROUND_NAMES;
158
+ for (const pid of pids) {
159
+ const name = names.get(pid);
160
+ if (name) {
161
+ const match = commandMatchesTriggers(name, triggers);
162
+ if (match)
163
+ return match;
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ async pollAuto() {
169
+ if (this.disposed || this.getMode() !== "automatic" || !this.isSupported())
170
+ return;
171
+ // Serialize: if a snapshot is already running, run exactly one more after it
172
+ // so the latest state always wins without piling up `ps` calls.
173
+ if (this.polling) {
174
+ this.pollQueued = true;
175
+ return;
176
+ }
177
+ this.polling = true;
178
+ try {
179
+ const pids = this.listSessionPids();
180
+ let programActive = false;
181
+ let programTrigger = null;
182
+ if (pids.length > 0) {
183
+ const triggers = this.triggerSet();
184
+ // Short-circuit: if any live session's hook-reported foreground name is
185
+ // itself a trigger, engage without a `ps` snapshot (the common case —
186
+ // the user runs vim/ffmpeg/etc. directly). Only fall back to the
187
+ // process-tree walk when no hook name matches, which still catches
188
+ // triggers that are children of the foreground command (make -> ffmpeg)
189
+ // or running in an unhooked shell (sh/dash).
190
+ programTrigger = this.hookTriggerFor(pids, triggers);
191
+ if (programTrigger === null) {
192
+ const snapshot = await this.snapshotProcesses();
193
+ programTrigger = anySessionRunsTrigger(pids, snapshot, triggers);
194
+ }
195
+ if (programTrigger) {
196
+ if (!this.getActivityGate()) {
197
+ programActive = true;
198
+ }
199
+ else if (this.checkRecentOutput) {
200
+ programActive = this.checkRecentOutput(pids, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
201
+ }
202
+ }
203
+ }
204
+ if (this.disposed || this.getMode() !== "automatic")
205
+ return;
206
+ // A peer (a second client on a session) holds caffeinate independently of
207
+ // the program detection and bypasses the activity gate: an idle-but-
208
+ // attached phone must not release the machine to sleep. The peer's hold is
209
+ // surfaced via `peerActive` (independent of `activeTrigger`, which carries
210
+ // the program name) so the UI can highlight each setting row on its own
211
+ // when both are active.
212
+ const peerActive = this.getPeerKeepAwake() && this.hasPeerClient();
213
+ const next = programActive || peerActive;
214
+ const prevAutoActive = this.autoActive;
215
+ const prevAutoTrigger = this.autoTrigger;
216
+ const prevAutoPeerActive = this.autoPeerActive;
217
+ this.autoActive = next;
218
+ // `autoTrigger` carries only the program trigger (a command name or null);
219
+ // the peer trigger is surfaced separately via `peerActive` so the UI can
220
+ // highlight each setting row independently when both are active.
221
+ this.autoTrigger = next ? programTrigger : null;
222
+ this.autoPeerActive = peerActive;
223
+ // Broadcast on any change to the broadcastable derived state, not just
224
+ // when caffeinate turns on/off: the trigger identity (which program, or
225
+ // whether a peer is holding) can flip while caffeinate stays continuously
226
+ // active (a program starting while a peer is attached, a peer leaving
227
+ // while a program runs). Without these the UI keeps a stale `activeTrigger`
228
+ // / `peerActive` and the wrong row (or none) highlights.
229
+ if (next !== prevAutoActive ||
230
+ this.autoTrigger !== prevAutoTrigger ||
231
+ this.autoPeerActive !== prevAutoPeerActive) {
232
+ this.emitChange();
233
+ }
234
+ this.recompute();
235
+ if (peerActive) {
236
+ // A peer now holds caffeinate; any program-silence timer armed before
237
+ // the peer joined is obsolete (the peer releases on disconnect, not
238
+ // on silence). Clear it so a stale trailing edge can't fire a spurious
239
+ // poll and re-arm into a timer-driven loop.
240
+ this.clearActivityGateTimer();
241
+ }
242
+ // Arm the silence-release timer only when a gated program is the SOLE
243
+ // reason caffeinate is active. A peer holds until it disconnects (which
244
+ // pokes its own re-check via onSessionActivity), so silence must not
245
+ // release while one is present — and a program active alongside a peer is
246
+ // also covered by the peer's hold.
247
+ if (this.getActivityGate() && programActive && !peerActive) {
248
+ this.armActivityGateTimerIfNeeded();
249
+ }
250
+ }
251
+ finally {
252
+ this.polling = false;
253
+ if (this.pollQueued && !this.disposed) {
254
+ this.pollQueued = false;
255
+ void this.pollAuto();
256
+ }
257
+ }
258
+ }
259
+ armActivityGateTimerIfNeeded() {
260
+ if (this.activityGateTimer !== null)
261
+ return;
262
+ this.activityGateTimer = setTimeout(() => {
263
+ this.activityGateTimer = null;
264
+ void this.pollAuto();
265
+ }, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
266
+ this.activityGateTimer.unref?.();
267
+ }
268
+ clearActivityGateTimer() {
269
+ if (this.activityGateTimer !== null) {
270
+ clearTimeout(this.activityGateTimer);
271
+ this.activityGateTimer = null;
272
+ }
273
+ }
274
+ }
275
+ //# sourceMappingURL=caffeinate-automatic-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-automatic-detector.js","sourceRoot":"","sources":["../src/caffeinate-automatic-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { BatteryProbe } from "./caffeinate-battery.js";
2
+ interface CaffeinateBatteryGuardOptions {
3
+ batteryProbe: BatteryProbe;
4
+ getBatteryThreshold: () => number | null;
5
+ isSupported: () => boolean;
6
+ wantsActive: () => boolean;
7
+ emitChange: () => void;
8
+ recompute: () => void;
9
+ }
10
+ export declare class CaffeinateBatteryGuard {
11
+ private readonly batteryProbe;
12
+ private readonly getBatteryThreshold;
13
+ private readonly isSupported;
14
+ private readonly wantsActive;
15
+ private readonly emitChange;
16
+ private readonly recompute;
17
+ private batteryLow;
18
+ private lastBatteryStatus;
19
+ private hasProbedBattery;
20
+ private batteryTimer;
21
+ private batteryCheckInFlight;
22
+ private disposed;
23
+ constructor(options: CaffeinateBatteryGuardOptions);
24
+ shouldActivate(wantActive: boolean): boolean;
25
+ pollNow(): Promise<void>;
26
+ thresholdChanged(percent: number | null): void;
27
+ dispose(): void;
28
+ private runBatteryCheck;
29
+ private performBatteryCheck;
30
+ private scheduleBatteryCheck;
31
+ private computeBatteryDelay;
32
+ private clearBatteryTimer;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=caffeinate-battery-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caffeinate-battery-guard.d.ts","sourceRoot":"","sources":["../src/caffeinate-battery-guard.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,yBAAyB,CAAC;AAE3E,UAAU,6BAA6B;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IAIvC,OAAO,CAAC,UAAU,CAAS;IAI3B,OAAO,CAAC,iBAAiB,CAA8B;IAOvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAA+B;IAKnD,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,OAAO,EAAE,6BAA6B,EAOjD;IAED,cAAc,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAiB3C;IAMD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvB;IAMD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAiB7C;IAED,OAAO,IAAI,IAAI,CAGd;IAKD,OAAO,CAAC,eAAe;YAST,mBAAmB;IA2BjC,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,iBAAiB;CAM1B"}