openlimiter 1.3.4 → 2.0.0
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/activity/event.d.ts +19 -0
- package/dist/activity/event.d.ts.map +1 -0
- package/dist/activity/event.js +169 -0
- package/dist/activity/event.js.map +1 -0
- package/dist/bin.js +5 -3
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -50
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/hub-sync.d.ts +1 -1
- package/dist/hub-sync.js +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +16 -1
- package/dist/render.js.map +1 -1
- package/dist/session.d.ts +6 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +1 -1
- package/dist/session.js.map +1 -1
- package/dist/smoke.d.ts +1 -1
- package/dist/smoke.d.ts.map +1 -1
- package/dist/statusline-ingest.d.ts +10 -0
- package/dist/statusline-ingest.d.ts.map +1 -0
- package/dist/statusline-ingest.js +28 -0
- package/dist/statusline-ingest.js.map +1 -0
- package/dist/statusline.d.ts +10 -11
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +144 -126
- package/dist/statusline.js.map +1 -1
- package/dist/terminal-backup.d.ts +2 -0
- package/dist/terminal-backup.d.ts.map +1 -1
- package/dist/terminal-backup.js +10 -1
- package/dist/terminal-backup.js.map +1 -1
- package/dist/terminal-fallback.d.ts +10 -0
- package/dist/terminal-fallback.d.ts.map +1 -0
- package/dist/terminal-fallback.js +176 -0
- package/dist/terminal-fallback.js.map +1 -0
- package/dist/terminal.d.ts +16 -11
- package/dist/terminal.d.ts.map +1 -1
- package/dist/terminal.js +71 -109
- package/dist/terminal.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Readable } from "node:stream";
|
|
2
|
+
import type { ActivityEvent } from "../../../core/dist/activity/contract.js";
|
|
3
|
+
export declare const EVENT_INPUT_MAX_BYTES = 65536;
|
|
4
|
+
export declare const EVENT_DEADLINE_MS = 100;
|
|
5
|
+
/** Every retained value is structural. Never spread, stringify or inspect free text. */
|
|
6
|
+
export declare function mapHookActivity(agentName: string, eventName: string, payload: unknown, now?: number): ActivityEvent | null;
|
|
7
|
+
export interface EventDependencies {
|
|
8
|
+
stateDirectory?: string;
|
|
9
|
+
readStandardInput: (signal?: AbortSignal) => Promise<string | null>;
|
|
10
|
+
protectWindowsDirectory?: (directory: string) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function eventCommand(argumentsList: readonly string[], dependencies: EventDependencies): Promise<{
|
|
13
|
+
exitCode: 0;
|
|
14
|
+
stdout: "";
|
|
15
|
+
stderr: "";
|
|
16
|
+
}>;
|
|
17
|
+
/** A bounded streaming reader for the standalone hook entry, with no retained tail. */
|
|
18
|
+
export declare function readEventInput(signal?: AbortSignal, input?: Readable): Promise<string | null>;
|
|
19
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/activity/event.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,yCAAyC,CAAC;AAO5F,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAYrC,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,aAAa,GAAG,IAAI,CAyC9H;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,wBAAsB,YAAY,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,EAAE,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,CAAC,CA+BtJ;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,GAAE,QAAwB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiC5G"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { resolveStateDirectory } from "@openlimiter/core";
|
|
5
|
+
// Resolve beside the installed core entry, including when tests relocate the CLI.
|
|
6
|
+
// The package export map is frozen outside this unit's write scope.
|
|
7
|
+
const coreEntry = pathToFileURL(createRequire(import.meta.url).resolve("@openlimiter/core"));
|
|
8
|
+
const { isActivityEvent, isContractObject } = await import(new URL("./activity/contract.js", coreEntry).href);
|
|
9
|
+
const { writeActivityEvent } = await import(new URL("./activity/spool.js", coreEntry).href);
|
|
10
|
+
export const EVENT_INPUT_MAX_BYTES = 65_536;
|
|
11
|
+
export const EVENT_DEADLINE_MS = 100;
|
|
12
|
+
const agents = {
|
|
13
|
+
claude: "claude_code", codex: "codex", muse: "muse", gemini: "gemini_cli", cursor: "cursor"
|
|
14
|
+
};
|
|
15
|
+
const events = {
|
|
16
|
+
claude: ["SessionStart", "UserPromptSubmit", "Notification", "Stop", "SessionEnd"],
|
|
17
|
+
codex: ["SessionStart", "UserPromptSubmit", "PermissionRequest", "Stop", "SessionEnd"],
|
|
18
|
+
muse: ["SessionStart", "UserPromptSubmit", "PermissionRequest", "Notification", "Stop", "SessionEnd"],
|
|
19
|
+
gemini: ["SessionStart", "BeforeAgent", "Notification", "AfterAgent", "SessionEnd"],
|
|
20
|
+
cursor: ["sessionStart", "beforeSubmitPrompt", "stop", "sessionEnd"]
|
|
21
|
+
};
|
|
22
|
+
/** Every retained value is structural. Never spread, stringify or inspect free text. */
|
|
23
|
+
export function mapHookActivity(agentName, eventName, payload, now = Date.now()) {
|
|
24
|
+
const agent = agents[agentName];
|
|
25
|
+
if (!agent || !events[agentName]?.includes(eventName) || !isContractObject(payload))
|
|
26
|
+
return null;
|
|
27
|
+
if (payload["hook_event_name"] !== undefined && payload["hook_event_name"] !== eventName)
|
|
28
|
+
return null;
|
|
29
|
+
const sessionId = agent === "cursor" ? payload["conversation_id"] ?? payload["session_id"] : payload["session_id"];
|
|
30
|
+
if (typeof sessionId !== "string" || /[\\/]/u.test(sessionId) || sessionId === "." || sessionId === "..")
|
|
31
|
+
return null;
|
|
32
|
+
const event = {
|
|
33
|
+
version: 1, eventId: randomUUID(), sessionId, sequence: now * 1_000,
|
|
34
|
+
agent, observedAt: new Date(now).toISOString(), state: "unknown", source: "hook",
|
|
35
|
+
confidence: "explicit", process: { ppid: process.ppid }, signal: "observation"
|
|
36
|
+
};
|
|
37
|
+
if (eventName === "SessionStart" || eventName === "sessionStart")
|
|
38
|
+
event.state = "idle";
|
|
39
|
+
else if (["UserPromptSubmit", "BeforeAgent", "beforeSubmitPrompt"].includes(eventName))
|
|
40
|
+
event.state = "busy";
|
|
41
|
+
else if (eventName === "PermissionRequest")
|
|
42
|
+
event.state = "waiting";
|
|
43
|
+
else if (eventName === "Notification") {
|
|
44
|
+
const kind = payload["notification_type"];
|
|
45
|
+
if ((agent === "gemini_cli" && kind === "ToolPermission") ||
|
|
46
|
+
((agent === "claude_code" || agent === "muse") && kind === "permission_prompt"))
|
|
47
|
+
event.state = "waiting";
|
|
48
|
+
else if (agent === "claude_code" && kind === "elicitation_dialog") {
|
|
49
|
+
event.state = "waiting";
|
|
50
|
+
event.signal = "user_question";
|
|
51
|
+
}
|
|
52
|
+
else if (agent === "claude_code" && kind === "idle_prompt") {
|
|
53
|
+
event.state = "idle";
|
|
54
|
+
event.confidence = "inferred";
|
|
55
|
+
}
|
|
56
|
+
else
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
else if (eventName === "SessionEnd" || eventName === "sessionEnd") {
|
|
60
|
+
event.signal = "session_ended";
|
|
61
|
+
if (agent === "cursor" && payload["reason"] === "aborted")
|
|
62
|
+
event.outcome = "cancelled";
|
|
63
|
+
if (agent === "cursor" && payload["reason"] === "error")
|
|
64
|
+
event.outcome = "failed";
|
|
65
|
+
}
|
|
66
|
+
else if (agent === "cursor") {
|
|
67
|
+
if (payload["status"] === "completed")
|
|
68
|
+
event.state = "done";
|
|
69
|
+
else if (payload["status"] === "aborted")
|
|
70
|
+
event.outcome = "cancelled";
|
|
71
|
+
else if (payload["status"] === "error")
|
|
72
|
+
event.outcome = "failed";
|
|
73
|
+
else
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
event.state = payload["stop_hook_active"] === true ? "busy" : "done";
|
|
78
|
+
if (agent === "claude_code" && event.state === "done")
|
|
79
|
+
event.signal = "claude_stop";
|
|
80
|
+
}
|
|
81
|
+
// Codex uses the parent's session_id on child hooks. Suppress those observations.
|
|
82
|
+
if ((agent === "codex" || agent === "claude_code") && typeof payload["agent_id"] === "string")
|
|
83
|
+
event.isSidechain = true;
|
|
84
|
+
return isActivityEvent(event, now) ? event : null;
|
|
85
|
+
}
|
|
86
|
+
export async function eventCommand(argumentsList, dependencies) {
|
|
87
|
+
const deadline = new AbortController();
|
|
88
|
+
const expires = performance.now() + EVENT_DEADLINE_MS;
|
|
89
|
+
let timer = setTimeout(() => deadline.abort(), EVENT_DEADLINE_MS);
|
|
90
|
+
try {
|
|
91
|
+
const flag = (name) => {
|
|
92
|
+
const index = argumentsList.indexOf(name);
|
|
93
|
+
return index < 0 ? "" : argumentsList[index + 1] ?? "";
|
|
94
|
+
};
|
|
95
|
+
const raw = await Promise.race([
|
|
96
|
+
dependencies.readStandardInput(deadline.signal),
|
|
97
|
+
new Promise((resolve) => deadline.signal.addEventListener("abort", () => resolve(null), { once: true }))
|
|
98
|
+
]);
|
|
99
|
+
if (deadline.signal.aborted || raw === null || Buffer.byteLength(raw) > EVENT_INPUT_MAX_BYTES)
|
|
100
|
+
return { exitCode: 0, stdout: "", stderr: "" };
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
const event = mapHookActivity(flag("--agent"), flag("--event"), JSON.parse(raw), now);
|
|
103
|
+
const options = {
|
|
104
|
+
directory: dependencies.stateDirectory ?? resolveStateDirectory(), now, signal: deadline.signal, deadline: expires,
|
|
105
|
+
...(dependencies.protectWindowsDirectory ? { protectWindowsDirectory: async (directory) => {
|
|
106
|
+
// Cold ACL verification is outside the warm hook budget.
|
|
107
|
+
const remaining = Math.max(0, options.deadline - performance.now());
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
await dependencies.protectWindowsDirectory(directory);
|
|
110
|
+
options.deadline = performance.now() + remaining;
|
|
111
|
+
timer = setTimeout(() => deadline.abort(), remaining);
|
|
112
|
+
} } : {})
|
|
113
|
+
};
|
|
114
|
+
if (event !== null)
|
|
115
|
+
await writeActivityEvent(event, options);
|
|
116
|
+
}
|
|
117
|
+
catch { /* Activity must never affect the host, including malformed stdin and disk failures. */ }
|
|
118
|
+
finally {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
deadline.abort();
|
|
121
|
+
}
|
|
122
|
+
return { exitCode: 0, stdout: "", stderr: "" };
|
|
123
|
+
}
|
|
124
|
+
/** A bounded streaming reader for the standalone hook entry, with no retained tail. */
|
|
125
|
+
export function readEventInput(signal, input = process.stdin) {
|
|
126
|
+
return new Promise((resolve) => {
|
|
127
|
+
let chunks = [];
|
|
128
|
+
let size = 0;
|
|
129
|
+
let finished = false;
|
|
130
|
+
const finish = (value) => {
|
|
131
|
+
if (finished)
|
|
132
|
+
return;
|
|
133
|
+
finished = true;
|
|
134
|
+
input.removeListener("data", data);
|
|
135
|
+
input.removeListener("end", end);
|
|
136
|
+
input.removeListener("error", failed);
|
|
137
|
+
input.removeListener("close", failed);
|
|
138
|
+
signal?.removeEventListener("abort", failed);
|
|
139
|
+
input.pause();
|
|
140
|
+
input.destroy();
|
|
141
|
+
chunks = [];
|
|
142
|
+
resolve(value);
|
|
143
|
+
};
|
|
144
|
+
const data = (chunk) => {
|
|
145
|
+
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
146
|
+
size += bytes.length;
|
|
147
|
+
if (size > EVENT_INPUT_MAX_BYTES)
|
|
148
|
+
finish(null);
|
|
149
|
+
else
|
|
150
|
+
chunks.push(bytes);
|
|
151
|
+
};
|
|
152
|
+
const end = () => {
|
|
153
|
+
try {
|
|
154
|
+
finish(new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks)));
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
finish(null);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
const failed = () => finish(null);
|
|
161
|
+
if (signal?.aborted) {
|
|
162
|
+
finish(null);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
input.on("data", data).once("end", end).once("error", failed).once("close", failed);
|
|
166
|
+
signal?.addEventListener("abort", failed, { once: true });
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/activity/event.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -93,9 +93,11 @@ else {
|
|
|
93
93
|
promptForSecret,
|
|
94
94
|
promptChoice,
|
|
95
95
|
...(controller === null ? {} : { interruptSignal: controller.signal }),
|
|
96
|
-
readStandardInput: (signal) => argumentsList[0] === "
|
|
97
|
-
?
|
|
98
|
-
:
|
|
96
|
+
readStandardInput: async (signal) => argumentsList[0] === "event"
|
|
97
|
+
? (await import("./activity/event.js")).readEventInput(signal)
|
|
98
|
+
: argumentsList[0] === "hook"
|
|
99
|
+
? readStandardInputText(process.stdin, HOOK_INPUT_MAX_BYTES, undefined, signal)
|
|
100
|
+
: readStandardInputText()
|
|
99
101
|
});
|
|
100
102
|
if (controller !== null)
|
|
101
103
|
process.off("SIGINT", onInterrupt);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export interface CliDependencies {
|
|
|
32
32
|
nodeExecutable: string;
|
|
33
33
|
platform: NodeJS.Platform;
|
|
34
34
|
detectedAgentInstallations: Readonly<Partial<Record<AgentId, AgentInstallation | null>>>;
|
|
35
|
+
launcherTimeoutMilliseconds?: number;
|
|
35
36
|
hostedContextTrust?: HostedContextTrust;
|
|
36
37
|
hostedContextPublicKeys?: HostedTrustLoadOptions["pinnedPublicKeys"];
|
|
37
38
|
hostedTrustConfigRoot?: string;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { ACQUISITION_OUTCOME_SENTENCE, ACQUISITION_PROVIDERS, registerManagedCodexAccount, CREDENTIAL_FAILURE_SENTENCE, PROVIDER_CODES, acquireRefreshLock, clearRefreshSpawnFailure, mergeAcquiredSnapshots, createFetchTransport, readRefreshSpawnFailure, antigravitySpec, buildAdvice, canonicalJson, claudeSpec, codexSpec, dedupeFailures, desktopHoldsCache, failureFromConnectorReason, freshness, geminiCliSpec, grokSpec, isProviderDue, kimiSpec, mergeSnapshots, normalizeMeters, normalizeMetersReport, openrouterSpec, readAcquisitionCredential, readAcquisitionSchedule, readSnapshotCache, readWindowsCredentialWith, resolveStateDirectory, runAcquisition, spawnDetachedRefresh, writeAcquisitionSchedule, probeAntigravity, resolveAgyExecutablePath } from "@openlimiter/core";
|
|
2
|
-
import { antigravityFixture, claudeFixture, codexFixture, grokFixture, kimiFixture, connectors, manualFixture, opencodeFixture, openrouterFixture, parseAntigravityCodeAssistPayload, parseAntigravityPayload, parseClaudePayload, parseCodexPayload, parseGeminiCliPayload, parseGrokPayload, parseKimiPayload, parseManualPayload, parseOpencodePayload, parseOpenrouterPayload } from "@openlimiter/connectors";
|
|
1
|
+
import { ACQUISITION_OUTCOME_SENTENCE, ACQUISITION_PROVIDERS, registerManagedCodexAccount, CREDENTIAL_FAILURE_SENTENCE, PROVIDER_CODES, acquireRefreshLock, clearRefreshSpawnFailure, mergeAcquiredSnapshots, createFetchTransport, readRefreshSpawnFailure, antigravitySpec, buildAdvice, canonicalJson, claudeSpec, codexSpec, cursorSpec, dedupeFailures, desktopHoldsCache, failureFromConnectorReason, freshness, geminiCliSpec, grokSpec, isProviderDue, kimiSpec, mergeSnapshots, normalizeMeters, normalizeMetersReport, openrouterSpec, readAcquisitionCredential, readAcquisitionSchedule, readSnapshotCache, readWindowsCredentialWith, resolveStateDirectory, runAcquisition, spawnDetachedRefresh, writeAcquisitionSchedule, probeAntigravity, resolveAgyExecutablePath } from "@openlimiter/core";
|
|
2
|
+
import { antigravityFixture, claudeFixture, codexFixture, grokFixture, kimiFixture, connectors, manualFixture, opencodeFixture, openrouterFixture, parseAntigravityCodeAssistPayload, parseAntigravityPayload, parseClaudePayload, parseCodexPayload, parseCursorPayload, parseGeminiCliPayload, parseGrokPayload, parseKimiPayload, parseManualPayload, parseOpencodePayload, parseOpenrouterPayload } from "@openlimiter/connectors";
|
|
3
3
|
import { AGENT_COMPATIBILITY, agentContextFromCache, agentContextSpillFromCache, agentVersionCompatibility, changeAgentHook, detectAgentInstallation, readAgentHookStatus, runAgentHook, validateAgentExecutableStamp, writeAgentContextSnapshot, loadHostedContextTrust, renderClaudeStatusline } from "@openlimiter/adapters";
|
|
4
4
|
import { execFile, spawn } from "node:child_process";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
6
7
|
import { homedir } from "node:os";
|
|
8
|
+
import path from "node:path";
|
|
7
9
|
import { PROVIDER_KEYS, STATUSLINE_KEYS, defaultConfig, initialize, isProviderKey, isStatuslineKey, providerValueText, readConfig, readProvidersConfig, readStatuslineConfig, setProviderValue, setStatuslineValue, statuslineValueText, writeConfig } from "./config.js";
|
|
8
10
|
import { ACQUISITION_PROVENANCE, ANTIGRAVITY_STATUSLINE_PROVENANCE, GROK_STATUSLINE_PROVENANCE, INGEST_PROVENANCE, MANUAL_PROVENANCE, STATUSLINE_PROVENANCE, environmentWithLocalMarkers, STDIN_BYTE_LIMIT, parseAntigravityStatuslinePayload, parseGrokStatuslinePayload, parseJsonText, persistSnapshots, readManualDocument, withProvenance } from "./ingest.js";
|
|
9
11
|
import { UnavailableCredentialStore } from "./credentials.js";
|
|
10
12
|
import { failureLine, failureLines, renderTable, supportsColor } from "./render.js";
|
|
11
|
-
import { isStatuslineHost, renderStatuslineLayout, statuslineColor } from "./statusline.js";
|
|
13
|
+
import { isStatuslineHost, renderStatuslineLayout, statuslineColor, statuslineUnicode } from "./statusline.js";
|
|
14
|
+
import { parseStatuslineSession } from "./statusline-ingest.js";
|
|
12
15
|
import { TERMINAL_HOST_NAMES, installHost, terminalHide, terminalShow, terminalStatusTable, uninstallHost } from "./terminal.js";
|
|
13
16
|
import { createFetchHubTransport, hubConfigured } from "./hub.js";
|
|
14
17
|
import { DELIVERY_UNCONFIRMED_SENTENCE, REVOKED_SENTENCE, ensureFreshSession, isAborted, runDeviceLogin } from "./hub-auth.js";
|
|
15
18
|
import { runSync, syncIsDue, recordSyncAttempt } from "./hub-sync.js";
|
|
16
|
-
import { deleteSession, readSession, StorageDiagnosticError, writeSession, withSessionLock } from "./session.js";
|
|
19
|
+
import { deleteSession, readSession, StorageDiagnosticError, applyWindowsOwnerOnlyAcl, writeSession, withSessionLock } from "./session.js";
|
|
17
20
|
import { DeviceLoginError, LOGIN_TIMEOUT_MILLISECONDS, SystemDeviceLoginRunner, managedCodexHome, startCodexDeviceLogin, versionIsSupported as codexVersionIsSupported } from "./codex-device-login.js";
|
|
18
21
|
/** Exit codes. Enumerated so a script can tell these cases apart. */
|
|
19
22
|
export const EXIT_OK = 0;
|
|
@@ -83,7 +86,26 @@ const NEWLINE = "\n";
|
|
|
83
86
|
* same `execFile` wrapper.
|
|
84
87
|
*/
|
|
85
88
|
const execFileRunner = async (executable, helperArguments, timeoutMilliseconds) => await new Promise((resolve) => {
|
|
86
|
-
execFile(executable, [...helperArguments],
|
|
89
|
+
execFile(executable, [...helperArguments], (() => {
|
|
90
|
+
if (!executable.toLowerCase().endsWith("powershell.exe")) {
|
|
91
|
+
return { timeout: timeoutMilliseconds, maxBuffer: 262_144, windowsHide: true };
|
|
92
|
+
}
|
|
93
|
+
const environment = { ...process.env };
|
|
94
|
+
/* Windows environment names ignore case, but a copied process.env keeps
|
|
95
|
+
the inherited spelling (PSMODULEPATH, Psmodulepath...); drop every
|
|
96
|
+
variant so the child sees exactly one module path. */
|
|
97
|
+
for (const key of Object.keys(environment)) {
|
|
98
|
+
if (key.toLowerCase() === "psmodulepath")
|
|
99
|
+
delete environment[key];
|
|
100
|
+
}
|
|
101
|
+
environment["PSModulePath"] = path.win32.join(process.env["SystemRoot"] ?? "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "Modules");
|
|
102
|
+
return {
|
|
103
|
+
timeout: timeoutMilliseconds,
|
|
104
|
+
maxBuffer: 262_144,
|
|
105
|
+
windowsHide: true,
|
|
106
|
+
env: environment
|
|
107
|
+
};
|
|
108
|
+
})(), (error, stdout) => {
|
|
87
109
|
resolve(error === null ? { ok: true, stdout } : { ok: false });
|
|
88
110
|
});
|
|
89
111
|
});
|
|
@@ -109,7 +131,10 @@ function openBrowserPlatform(url, platform) {
|
|
|
109
131
|
export function runtimeDependencies() {
|
|
110
132
|
return {
|
|
111
133
|
acquisitionTransport: createFetchTransport(),
|
|
112
|
-
probeAntigravity
|
|
134
|
+
probeAntigravity: (options) => probeAntigravity({
|
|
135
|
+
...options,
|
|
136
|
+
runCommand: options?.runCommand ?? execFileRunner
|
|
137
|
+
}),
|
|
113
138
|
resolveExecutablePath: resolveAgyExecutablePath,
|
|
114
139
|
spawnDetached: (executable, argumentsList, options) => {
|
|
115
140
|
const child = spawn(executable, [...argumentsList], {
|
|
@@ -258,6 +283,7 @@ export function acquisitionSpecs(providers) {
|
|
|
258
283
|
return [
|
|
259
284
|
claudeSpec({ parse: parseClaudePayload, enabled: providers.claude.poll }),
|
|
260
285
|
codexSpec(parseCodexPayload),
|
|
286
|
+
cursorSpec(parseCursorPayload),
|
|
261
287
|
geminiCliSpec(parseGeminiCliPayload),
|
|
262
288
|
antigravitySpec(parseAntigravityCodeAssistPayload),
|
|
263
289
|
grokSpec(parseGrokPayload),
|
|
@@ -446,16 +472,12 @@ const ACQUISITION_HEADER = "PROVIDER DETECTED STATUS NEXT NOTE";
|
|
|
446
472
|
/**
|
|
447
473
|
* Run one round of acquisition and fold what it found into the cache.
|
|
448
474
|
*
|
|
449
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
* holds the lock, so this one exits instead of racing it on the same
|
|
453
|
-
* credentials. And a provider inside its own backoff is skipped by the runner
|
|
454
|
-
* without being asked anything.
|
|
475
|
+
* The refresh lock serializes CLI rounds. The runner takes the shared machine
|
|
476
|
+
* lease for each provider before acquisition and persists its retry deadline
|
|
477
|
+
* before releasing ownership.
|
|
455
478
|
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
* through the ordinary freshness rule.
|
|
479
|
+
* Successful reads replace observations. Expiry and rate limits record
|
|
480
|
+
* availability while preserving the original observation time.
|
|
459
481
|
*/
|
|
460
482
|
async function refreshCommand(dependencies, now) {
|
|
461
483
|
const lock = await acquireRefreshLock(dependencies.stateDirectory);
|
|
@@ -468,15 +490,8 @@ async function refreshCommand(dependencies, now) {
|
|
|
468
490
|
].join(NEWLINE));
|
|
469
491
|
}
|
|
470
492
|
try {
|
|
471
|
-
/*
|
|
472
|
-
* Desktop ownership is decided HERE, under the lock, and nowhere else.
|
|
473
|
-
* Checking it before taking the lock read a cache that a desktop could
|
|
474
|
-
* start writing a millisecond later, and this round would then poll every
|
|
475
|
-
* provider a second time for nothing. One check, on the only side of the
|
|
476
|
-
* lock where the answer cannot change underneath it.
|
|
477
|
-
*/
|
|
478
|
-
const settled = await readSnapshotCache(dependencies.stateDirectory);
|
|
479
493
|
const providers = await readProvidersConfig(dependencies.stateDirectory);
|
|
494
|
+
const settled = await readSnapshotCache(dependencies.stateDirectory);
|
|
480
495
|
const specs = acquisitionSpecs(providers).filter((spec) => !desktopHoldsCache(settled.ok ? settled.snapshots.filter((row) => row.provider === spec.provider) : [], now));
|
|
481
496
|
if (specs.length === 0) {
|
|
482
497
|
await triggerSyncAfterRefresh(dependencies, now);
|
|
@@ -489,6 +504,8 @@ async function refreshCommand(dependencies, now) {
|
|
|
489
504
|
await clearRefreshSpawnFailure(dependencies.stateDirectory);
|
|
490
505
|
const schedule = await readAcquisitionSchedule(dependencies.stateDirectory);
|
|
491
506
|
const result = await runAcquisition(specs, {
|
|
507
|
+
stateDirectory: dependencies.stateDirectory ?? resolveStateDirectory(),
|
|
508
|
+
clock: () => Date.parse(dependencies.now()),
|
|
492
509
|
transport: dependencies.acquisitionTransport,
|
|
493
510
|
now,
|
|
494
511
|
schedule,
|
|
@@ -506,10 +523,8 @@ async function refreshCommand(dependencies, now) {
|
|
|
506
523
|
* can outlive its lock if this machine was suspended mid refresh, and a
|
|
507
524
|
* round that lost its lock must not write over the round that took it.
|
|
508
525
|
*
|
|
509
|
-
*
|
|
510
|
-
*
|
|
511
|
-
* itself has to be safe against a desktop row that appeared since this
|
|
512
|
-
* round started reading. `mergeAcquiredSnapshots` decides that per row,
|
|
526
|
+
* Native payloads can arrive during acquisition. `mergeAcquiredSnapshots`
|
|
527
|
+
* arbitrates observations per row,
|
|
513
528
|
* inside the cache lock both processes do share, keeping whichever row is
|
|
514
529
|
* newer and leaving a tie with the row already there.
|
|
515
530
|
*/
|
|
@@ -626,6 +641,7 @@ function doctorRows(snapshots, environment, now) {
|
|
|
626
641
|
}
|
|
627
642
|
const help = [
|
|
628
643
|
"openlimiter",
|
|
644
|
+
"openlimiter --version | -v | version",
|
|
629
645
|
"openlimiter setup",
|
|
630
646
|
"openlimiter login [--open]",
|
|
631
647
|
"openlimiter logout",
|
|
@@ -634,12 +650,12 @@ const help = [
|
|
|
634
650
|
"openlimiter init",
|
|
635
651
|
"openlimiter snapshot [--refresh]",
|
|
636
652
|
"openlimiter statusline [--host claude|antigravity|grok|codex|shell]",
|
|
637
|
-
"openlimiter terminal [--yes] [--host <id>]",
|
|
653
|
+
"openlimiter terminal [--yes] [--host <id>] [--wrap]",
|
|
638
654
|
"openlimiter terminal status",
|
|
639
|
-
"openlimiter terminal install <host>",
|
|
640
|
-
"openlimiter terminal uninstall <host>",
|
|
641
|
-
"openlimiter terminal show <provider ...>",
|
|
642
|
-
"openlimiter terminal hide <provider ...>",
|
|
655
|
+
"openlimiter terminal install <host> [--wrap]",
|
|
656
|
+
"openlimiter terminal uninstall <host|all>",
|
|
657
|
+
"openlimiter terminal show <segment|provider|window ...>",
|
|
658
|
+
"openlimiter terminal hide <segment|provider|window ...>",
|
|
643
659
|
"openlimiter refresh",
|
|
644
660
|
"openlimiter hook [--dry-run]",
|
|
645
661
|
"openlimiter hooks install <agent>",
|
|
@@ -674,8 +690,8 @@ const help = [
|
|
|
674
690
|
*
|
|
675
691
|
* This is the path that gives the tool something to meter. It performs no
|
|
676
692
|
* network access at all: it validates the JSON the host already wrote to this
|
|
677
|
-
* process.
|
|
678
|
-
* cache
|
|
693
|
+
* process. Unusable quota readings leave snapshots null so the caller can
|
|
694
|
+
* fall back to the cache while retaining display metadata from valid JSON.
|
|
679
695
|
*
|
|
680
696
|
* Which parser runs, and which provenance the reading is stamped with, are
|
|
681
697
|
* decided by the host. Codex names no scripting interface at all (its status
|
|
@@ -695,7 +711,7 @@ async function ingestStandardInput(dependencies, now, host = "claude") {
|
|
|
695
711
|
? parseGrokStatuslinePayload(document.value, now)
|
|
696
712
|
: parseClaudePayload(document.value, now);
|
|
697
713
|
if (meters === null)
|
|
698
|
-
return null;
|
|
714
|
+
return { snapshots: null, payload: document.value };
|
|
699
715
|
const provenance = host === "antigravity"
|
|
700
716
|
? ANTIGRAVITY_STATUSLINE_PROVENANCE
|
|
701
717
|
: host === "grok"
|
|
@@ -705,13 +721,14 @@ async function ingestStandardInput(dependencies, now, host = "claude") {
|
|
|
705
721
|
reading, and it says so. */
|
|
706
722
|
const incoming = normalizeMeters(withProvenance(meters, provenance));
|
|
707
723
|
if (incoming.length === 0)
|
|
708
|
-
return null;
|
|
724
|
+
return { snapshots: null, payload: document.value };
|
|
709
725
|
try {
|
|
710
|
-
|
|
726
|
+
const { merged } = await persistSnapshots(incoming, dependencies.stateDirectory, now);
|
|
727
|
+
return { snapshots: merged, payload: document.value };
|
|
711
728
|
}
|
|
712
729
|
catch {
|
|
713
730
|
const existing = await cachedSnapshots(dependencies.stateDirectory);
|
|
714
|
-
return mergeSnapshots(existing, incoming);
|
|
731
|
+
return { snapshots: mergeSnapshots(existing, incoming), payload: document.value };
|
|
715
732
|
}
|
|
716
733
|
}
|
|
717
734
|
catch {
|
|
@@ -918,7 +935,7 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
918
935
|
? hostFlag.toLowerCase()
|
|
919
936
|
: "claude";
|
|
920
937
|
const ingested = await ingestStandardInput(dependencies, now, host);
|
|
921
|
-
const snapshots = ingested ?? await cachedSnapshots(dependencies.stateDirectory);
|
|
938
|
+
const snapshots = ingested?.snapshots ?? await cachedSnapshots(dependencies.stateDirectory);
|
|
922
939
|
/*
|
|
923
940
|
* The refresh that keeps the other providers current starts here and is never
|
|
924
941
|
* waited for. This render draws whatever the cache already holds, the child
|
|
@@ -926,7 +943,7 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
926
943
|
* whole reason a terminal person needs no background service.
|
|
927
944
|
*/
|
|
928
945
|
await startRefreshBehind(dependencies, snapshots, now);
|
|
929
|
-
if (ingested
|
|
946
|
+
if (ingested?.snapshots == null) {
|
|
930
947
|
await writeAgentContextSnapshot(snapshots, dependencies.stateDirectory, now, PROVIDER_CODES).catch(() => undefined);
|
|
931
948
|
}
|
|
932
949
|
const advice = buildAdvice(snapshots, now, PROVIDER_CODES);
|
|
@@ -938,7 +955,9 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
938
955
|
snapshots,
|
|
939
956
|
now,
|
|
940
957
|
config,
|
|
941
|
-
|
|
958
|
+
session: parseStatuslineSession(ingested?.payload),
|
|
959
|
+
color: statuslineColor(config.color, dependencies.environment, dependencies.colorOutput, host),
|
|
960
|
+
unicode: statuslineUnicode(dependencies.environment),
|
|
942
961
|
host
|
|
943
962
|
}));
|
|
944
963
|
}
|
|
@@ -947,10 +966,12 @@ const agentAliases = {
|
|
|
947
966
|
antigravity: "antigravity",
|
|
948
967
|
claude: "claude",
|
|
949
968
|
codex: "codex",
|
|
969
|
+
cursor: "cursor",
|
|
950
970
|
gemini: "gemini",
|
|
951
971
|
grok: "grok",
|
|
952
972
|
"grok-build": "grok",
|
|
953
973
|
kimi: "kimi",
|
|
974
|
+
muse: "muse",
|
|
954
975
|
opencode: "opencode"
|
|
955
976
|
};
|
|
956
977
|
function agentArgument(value) {
|
|
@@ -1237,12 +1258,12 @@ async function configCommand(dependencies, argumentsList) {
|
|
|
1237
1258
|
return succeed(configGet([target.key], update.statusline));
|
|
1238
1259
|
}
|
|
1239
1260
|
const terminalUsage = [
|
|
1240
|
-
"openlimiter terminal [--yes] [--host <id>]",
|
|
1261
|
+
"openlimiter terminal [--yes] [--host <id>] [--wrap]",
|
|
1241
1262
|
"openlimiter terminal status",
|
|
1242
|
-
"openlimiter terminal install <host>",
|
|
1243
|
-
"openlimiter terminal uninstall <host>",
|
|
1244
|
-
"openlimiter terminal show <provider ...>",
|
|
1245
|
-
"openlimiter terminal hide <provider ...>",
|
|
1263
|
+
"openlimiter terminal install <host> [--wrap]",
|
|
1264
|
+
"openlimiter terminal uninstall <host|all>",
|
|
1265
|
+
"openlimiter terminal show <segment|provider|window ...>",
|
|
1266
|
+
"openlimiter terminal hide <segment|provider|window ...>",
|
|
1246
1267
|
"",
|
|
1247
1268
|
"hosts: " + TERMINAL_HOST_NAMES.join(", ") + "."
|
|
1248
1269
|
].join("\n");
|
|
@@ -1268,6 +1289,9 @@ function terminalContext(dependencies, detected) {
|
|
|
1268
1289
|
: { stateDirectory: dependencies.stateDirectory }),
|
|
1269
1290
|
platform: dependencies.platform,
|
|
1270
1291
|
detectedProviders: detected,
|
|
1292
|
+
...(dependencies.launcherTimeoutMilliseconds === undefined
|
|
1293
|
+
? {}
|
|
1294
|
+
: { launcherTimeoutMilliseconds: dependencies.launcherTimeoutMilliseconds }),
|
|
1271
1295
|
...(dependencies.windowsCredentialRunner === undefined
|
|
1272
1296
|
? {}
|
|
1273
1297
|
: { shellRunner: dependencies.windowsCredentialRunner })
|
|
@@ -1287,13 +1311,22 @@ function terminalContext(dependencies, detected) {
|
|
|
1287
1311
|
async function terminalCommand(dependencies, argumentsList) {
|
|
1288
1312
|
const action = argumentsList[1];
|
|
1289
1313
|
const detected = await detectedProviderIds(dependencies);
|
|
1290
|
-
const context = terminalContext(dependencies, detected);
|
|
1314
|
+
const context = { ...terminalContext(dependencies, detected), wrap: argumentsList.includes("--wrap") };
|
|
1291
1315
|
const knownHost = (value) => value !== undefined && TERMINAL_HOST_NAMES.includes(value.toLowerCase());
|
|
1292
1316
|
if (action === "status") {
|
|
1293
1317
|
return succeed(await terminalStatusTable(context));
|
|
1294
1318
|
}
|
|
1295
1319
|
if (action === "install" || action === "uninstall") {
|
|
1296
1320
|
const host = argumentsList[2];
|
|
1321
|
+
if (action === "uninstall" && (host === "all" || host === "--yes")) {
|
|
1322
|
+
const results = [];
|
|
1323
|
+
for (const target of TERMINAL_HOST_NAMES) {
|
|
1324
|
+
const result = await uninstallHost(target, context);
|
|
1325
|
+
results.push({ ...result, message: `${target}: ${result.message}` });
|
|
1326
|
+
}
|
|
1327
|
+
const message = results.map(result => result.message).join("\n");
|
|
1328
|
+
return results.every(result => result.ok) ? succeed(message) : fail(EXIT_FAILURE, message);
|
|
1329
|
+
}
|
|
1297
1330
|
if (!knownHost(host)) {
|
|
1298
1331
|
return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs a known host. hosts: " +
|
|
1299
1332
|
TERMINAL_HOST_NAMES.join(", ") + ".");
|
|
@@ -1306,14 +1339,14 @@ async function terminalCommand(dependencies, argumentsList) {
|
|
|
1306
1339
|
if (action === "show" || action === "hide") {
|
|
1307
1340
|
const providerIds = argumentsList.slice(2);
|
|
1308
1341
|
if (providerIds.length === 0) {
|
|
1309
|
-
return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one provider
|
|
1342
|
+
return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one segment, provider or window.");
|
|
1310
1343
|
}
|
|
1311
1344
|
const result = action === "show"
|
|
1312
1345
|
? await terminalShow(providerIds, context)
|
|
1313
1346
|
: await terminalHide(providerIds, context);
|
|
1314
1347
|
return result.ok ? succeed(result.message) : fail(EXIT_USAGE, result.message);
|
|
1315
1348
|
}
|
|
1316
|
-
if (action === undefined || action === "--yes" || action === "--host") {
|
|
1349
|
+
if (action === undefined || action === "--yes" || action === "--host" || action === "--wrap") {
|
|
1317
1350
|
const hostFlag = flagValue(argumentsList, "--host");
|
|
1318
1351
|
if (argumentsList.includes("--host") && !knownHost(hostFlag)) {
|
|
1319
1352
|
return fail(EXIT_USAGE, "openlimiter terminal: --host needs a known host. hosts: " +
|
|
@@ -1552,6 +1585,7 @@ async function setupSignInStep(dependencies) {
|
|
|
1552
1585
|
const AGENT_CREDENTIAL_PROVIDER = {
|
|
1553
1586
|
claude: "CLAUDE",
|
|
1554
1587
|
codex: "CODEX",
|
|
1588
|
+
cursor: "CURSOR",
|
|
1555
1589
|
gemini: "GEMINI_CLI",
|
|
1556
1590
|
antigravity: "ANTIGRAVITY",
|
|
1557
1591
|
grok: "GROK",
|
|
@@ -1732,6 +1766,9 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1732
1766
|
const command = argumentsList[0] ?? "setup";
|
|
1733
1767
|
const now = dependencies.now();
|
|
1734
1768
|
try {
|
|
1769
|
+
if (command === "--version" || command === "-v" || command === "version") {
|
|
1770
|
+
return succeed(packageJson.version);
|
|
1771
|
+
}
|
|
1735
1772
|
if (command === "setup") {
|
|
1736
1773
|
const result = await setupCommand(dependencies, now);
|
|
1737
1774
|
if (hasOutputSink || setupOutput.length === 0)
|
|
@@ -1763,6 +1800,13 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1763
1800
|
if (command === "hook") {
|
|
1764
1801
|
return await hookProtocolCommand(dependencies, argumentsList, now);
|
|
1765
1802
|
}
|
|
1803
|
+
if (command === "event") {
|
|
1804
|
+
const { eventCommand } = await import("./activity/event.js");
|
|
1805
|
+
return await eventCommand(argumentsList, {
|
|
1806
|
+
...dependencies,
|
|
1807
|
+
protectWindowsDirectory: (directory) => applyWindowsOwnerOnlyAcl(directory, dependencies.windowsAclRunner)
|
|
1808
|
+
});
|
|
1809
|
+
}
|
|
1766
1810
|
if (command === "hooks")
|
|
1767
1811
|
return await hooksCommand(dependencies, argumentsList);
|
|
1768
1812
|
if (command === "status") {
|
|
@@ -1791,7 +1835,7 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1791
1835
|
* nothing rather than breaking their host. Every other command surfaces the
|
|
1792
1836
|
* failure with a redacted message so a script can react to it.
|
|
1793
1837
|
*/
|
|
1794
|
-
if (command === "hook")
|
|
1838
|
+
if (command === "hook" || command === "event")
|
|
1795
1839
|
return { exitCode: EXIT_OK, stdout: "", stderr: "" };
|
|
1796
1840
|
/* A detached refresh writes to a discarded stream and has nobody to tell,
|
|
1797
1841
|
so it fails quietly rather than leaving an exit code nothing reads. */
|