@monotykamary/localterm-server 2.66.8 → 2.66.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-git-status.d.ts +3 -0
- package/dist/agent-git-status.d.ts.map +1 -0
- package/dist/agent-git-status.js +46 -0
- package/dist/agent-git-status.js.map +1 -0
- package/dist/agent-log-utils.d.ts +18 -0
- package/dist/agent-log-utils.d.ts.map +1 -0
- package/dist/agent-log-utils.js +123 -0
- package/dist/agent-log-utils.js.map +1 -0
- package/dist/agent-models.d.ts +4 -0
- package/dist/agent-models.d.ts.map +1 -0
- package/dist/agent-models.js +100 -0
- package/dist/agent-models.js.map +1 -0
- package/dist/agent-runner.d.ts +3 -5
- package/dist/agent-runner.d.ts.map +1 -1
- package/dist/agent-runner.js +8 -522
- package/dist/agent-runner.js.map +1 -1
- package/dist/agent-session-reader.d.ts +3 -0
- package/dist/agent-session-reader.d.ts.map +1 -0
- package/dist/agent-session-reader.js +113 -0
- package/dist/agent-session-reader.js.map +1 -0
- package/dist/build-pty-environment.d.ts +8 -0
- package/dist/build-pty-environment.d.ts.map +1 -0
- package/dist/build-pty-environment.js +44 -0
- package/dist/build-pty-environment.js.map +1 -0
- package/dist/caffeinate-automatic-detector.d.ts +57 -0
- package/dist/caffeinate-automatic-detector.d.ts.map +1 -0
- package/dist/caffeinate-automatic-detector.js +275 -0
- package/dist/caffeinate-automatic-detector.js.map +1 -0
- package/dist/caffeinate-battery-guard.d.ts +35 -0
- package/dist/caffeinate-battery-guard.d.ts.map +1 -0
- package/dist/caffeinate-battery-guard.js +190 -0
- package/dist/caffeinate-battery-guard.js.map +1 -0
- package/dist/caffeinate-manager.d.ts +5 -31
- package/dist/caffeinate-manager.d.ts.map +1 -1
- package/dist/caffeinate-manager.js +55 -400
- package/dist/caffeinate-manager.js.map +1 -1
- package/dist/cdp/cdp-client.d.ts +4 -70
- package/dist/cdp/cdp-client.d.ts.map +1 -1
- package/dist/cdp/cdp-client.js +58 -418
- package/dist/cdp/cdp-client.js.map +1 -1
- package/dist/cdp/cdp-connection.d.ts +72 -0
- package/dist/cdp/cdp-connection.d.ts.map +1 -0
- package/dist/cdp/cdp-connection.js +272 -0
- package/dist/cdp/cdp-connection.js.map +1 -0
- package/dist/cdp/constants.d.ts +6 -0
- package/dist/cdp/constants.d.ts.map +1 -0
- package/dist/cdp/constants.js +9 -0
- package/dist/cdp/constants.js.map +1 -0
- package/dist/cdp/target-registry.d.ts +41 -0
- package/dist/cdp/target-registry.d.ts.map +1 -0
- package/dist/cdp/target-registry.js +118 -0
- package/dist/cdp/target-registry.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/git-branch-metadata.d.ts +11 -0
- package/dist/git-branch-metadata.d.ts.map +1 -0
- package/dist/git-branch-metadata.js +85 -0
- package/dist/git-branch-metadata.js.map +1 -0
- package/dist/git-diff-cache.d.ts +13 -0
- package/dist/git-diff-cache.d.ts.map +1 -0
- package/dist/git-diff-cache.js +32 -0
- package/dist/git-diff-cache.js.map +1 -0
- package/dist/git-diff-parser.d.ts +15 -0
- package/dist/git-diff-parser.d.ts.map +1 -0
- package/dist/git-diff-parser.js +196 -0
- package/dist/git-diff-parser.js.map +1 -0
- package/dist/git-diff-service.d.ts +10 -0
- package/dist/git-diff-service.d.ts.map +1 -0
- package/dist/git-diff-service.js +395 -0
- package/dist/git-diff-service.js.map +1 -0
- package/dist/git-diff.d.ts +8 -41
- package/dist/git-diff.d.ts.map +1 -1
- package/dist/git-diff.js +5 -944
- package/dist/git-diff.js.map +1 -1
- package/dist/github-pr.d.ts +32 -0
- package/dist/github-pr.d.ts.map +1 -0
- package/dist/github-pr.js +266 -0
- package/dist/github-pr.js.map +1 -0
- package/dist/pi-binary-resolver.d.ts +6 -0
- package/dist/pi-binary-resolver.d.ts.map +1 -0
- package/dist/pi-binary-resolver.js +70 -0
- package/dist/pi-binary-resolver.js.map +1 -0
- package/dist/pi-rpc-client.d.ts +14 -0
- package/dist/pi-rpc-client.d.ts.map +1 -0
- package/dist/pi-rpc-client.js +87 -0
- package/dist/pi-rpc-client.js.map +1 -0
- package/dist/session-client-hub.d.ts +57 -0
- package/dist/session-client-hub.d.ts.map +1 -0
- package/dist/session-client-hub.js +435 -0
- package/dist/session-client-hub.js.map +1 -0
- package/dist/session-command-executor.d.ts +14 -0
- package/dist/session-command-executor.d.ts.map +1 -0
- package/dist/session-command-executor.js +207 -0
- package/dist/session-command-executor.js.map +1 -0
- package/dist/session-git-event-bridge.d.ts +16 -0
- package/dist/session-git-event-bridge.d.ts.map +1 -0
- package/dist/session-git-event-bridge.js +56 -0
- package/dist/session-git-event-bridge.js.map +1 -0
- package/dist/session-lifecycle-policy.d.ts +15 -0
- package/dist/session-lifecycle-policy.d.ts.map +1 -0
- package/dist/session-lifecycle-policy.js +105 -0
- package/dist/session-lifecycle-policy.js.map +1 -0
- package/dist/session-manager.d.ts +11 -42
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +72 -987
- package/dist/session-manager.js.map +1 -1
- package/dist/session-output-coordinator.d.ts +21 -0
- package/dist/session-output-coordinator.d.ts.map +1 -0
- package/dist/session-output-coordinator.js +134 -0
- package/dist/session-output-coordinator.js.map +1 -0
- package/dist/session-output-transport.d.ts +22 -0
- package/dist/session-output-transport.d.ts.map +1 -0
- package/dist/session-output-transport.js +160 -0
- package/dist/session-output-transport.js.map +1 -0
- package/dist/session.d.ts +0 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +11 -258
- package/dist/session.js.map +1 -1
- package/dist/shell-hook-builder.d.ts +16 -0
- package/dist/shell-hook-builder.d.ts.map +1 -0
- package/dist/shell-hook-builder.js +230 -0
- package/dist/shell-hook-builder.js.map +1 -0
- 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"}
|