openlimiter 1.3.5 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.map +1 -1
- package/dist/cli.js +82 -44
- package/dist/cli.js.map +1 -1
- package/dist/codex-device-login.d.ts.map +1 -1
- package/dist/codex-device-login.js +3 -1
- package/dist/codex-device-login.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/ingest.d.ts.map +1 -1
- package/dist/ingest.js +1 -1
- package/dist/ingest.js.map +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 +143 -129
- package/dist/statusline.js.map +1 -1
- package/dist/terminal-fallback.d.ts +1 -0
- package/dist/terminal-fallback.d.ts.map +1 -1
- package/dist/terminal-fallback.js +15 -3
- package/dist/terminal-fallback.js.map +1 -1
- package/dist/terminal.d.ts +10 -8
- package/dist/terminal.d.ts.map +1 -1
- package/dist/terminal.js +38 -88
- 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.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, captureStatuslineAccount, pruneSnapshotCache, 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),
|
|
@@ -435,7 +461,7 @@ function acquisitionLine(row, snapshots = []) {
|
|
|
435
461
|
.filter((part) => part !== "")
|
|
436
462
|
.join(", ");
|
|
437
463
|
return [
|
|
438
|
-
row.provider.toLowerCase()
|
|
464
|
+
row.provider.toLowerCase(),
|
|
439
465
|
row.detected ? "yes" : "no",
|
|
440
466
|
row.status,
|
|
441
467
|
row.nextAttemptAt ?? "NONE",
|
|
@@ -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",
|
|
@@ -638,8 +654,8 @@ const help = [
|
|
|
638
654
|
"openlimiter terminal status",
|
|
639
655
|
"openlimiter terminal install <host> [--wrap]",
|
|
640
656
|
"openlimiter terminal uninstall <host|all>",
|
|
641
|
-
"openlimiter terminal show <provider ...>",
|
|
642
|
-
"openlimiter terminal hide <provider ...>",
|
|
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
|
|
@@ -686,6 +702,9 @@ async function ingestStandardInput(dependencies, now, host = "claude") {
|
|
|
686
702
|
if (host === "codex" || host === "shell")
|
|
687
703
|
return null;
|
|
688
704
|
try {
|
|
705
|
+
const accountId = await captureStatuslineAccount(host === "antigravity" ? "ANTIGRAVITY" : host === "grok" ? "GROK" : "CLAUDE", {
|
|
706
|
+
environment: dependencies.environment, homeDirectory: dependencies.homeDirectory, platform: dependencies.platform, ...(dependencies.stateDirectory ? { stateDirectory: dependencies.stateDirectory } : {}), now
|
|
707
|
+
});
|
|
689
708
|
const document = parseJsonText(await dependencies.readStandardInput());
|
|
690
709
|
if (!document.ok)
|
|
691
710
|
return null;
|
|
@@ -695,7 +714,7 @@ async function ingestStandardInput(dependencies, now, host = "claude") {
|
|
|
695
714
|
? parseGrokStatuslinePayload(document.value, now)
|
|
696
715
|
: parseClaudePayload(document.value, now);
|
|
697
716
|
if (meters === null)
|
|
698
|
-
return null;
|
|
717
|
+
return { snapshots: null, payload: document.value };
|
|
699
718
|
const provenance = host === "antigravity"
|
|
700
719
|
? ANTIGRAVITY_STATUSLINE_PROVENANCE
|
|
701
720
|
: host === "grok"
|
|
@@ -703,15 +722,16 @@ async function ingestStandardInput(dependencies, now, host = "claude") {
|
|
|
703
722
|
: STATUSLINE_PROVENANCE;
|
|
704
723
|
/* The host wrote this to our standard input in this session. It is a live
|
|
705
724
|
reading, and it says so. */
|
|
706
|
-
const incoming = normalizeMeters(withProvenance(meters, provenance));
|
|
725
|
+
const incoming = normalizeMeters(withProvenance(meters, provenance).map(meter => ({ ...meter, ...(accountId ? { accountId } : {}) })));
|
|
707
726
|
if (incoming.length === 0)
|
|
708
|
-
return null;
|
|
727
|
+
return { snapshots: null, payload: document.value };
|
|
709
728
|
try {
|
|
710
|
-
|
|
729
|
+
const { merged } = await persistSnapshots(incoming, dependencies.stateDirectory, now);
|
|
730
|
+
return { snapshots: merged, payload: document.value };
|
|
711
731
|
}
|
|
712
732
|
catch {
|
|
713
733
|
const existing = await cachedSnapshots(dependencies.stateDirectory);
|
|
714
|
-
return mergeSnapshots(existing, incoming);
|
|
734
|
+
return { snapshots: mergeSnapshots(existing, incoming), payload: document.value };
|
|
715
735
|
}
|
|
716
736
|
}
|
|
717
737
|
catch {
|
|
@@ -918,7 +938,7 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
918
938
|
? hostFlag.toLowerCase()
|
|
919
939
|
: "claude";
|
|
920
940
|
const ingested = await ingestStandardInput(dependencies, now, host);
|
|
921
|
-
const snapshots = ingested ?? await cachedSnapshots(dependencies.stateDirectory);
|
|
941
|
+
const snapshots = ingested?.snapshots ?? await cachedSnapshots(dependencies.stateDirectory);
|
|
922
942
|
/*
|
|
923
943
|
* The refresh that keeps the other providers current starts here and is never
|
|
924
944
|
* waited for. This render draws whatever the cache already holds, the child
|
|
@@ -926,7 +946,7 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
926
946
|
* whole reason a terminal person needs no background service.
|
|
927
947
|
*/
|
|
928
948
|
await startRefreshBehind(dependencies, snapshots, now);
|
|
929
|
-
if (ingested
|
|
949
|
+
if (ingested?.snapshots == null) {
|
|
930
950
|
await writeAgentContextSnapshot(snapshots, dependencies.stateDirectory, now, PROVIDER_CODES).catch(() => undefined);
|
|
931
951
|
}
|
|
932
952
|
const advice = buildAdvice(snapshots, now, PROVIDER_CODES);
|
|
@@ -938,7 +958,9 @@ async function statuslineCommand(dependencies, argumentsList, now) {
|
|
|
938
958
|
snapshots,
|
|
939
959
|
now,
|
|
940
960
|
config,
|
|
941
|
-
|
|
961
|
+
session: parseStatuslineSession(ingested?.payload),
|
|
962
|
+
color: statuslineColor(config.color, dependencies.environment, dependencies.colorOutput, host),
|
|
963
|
+
unicode: statuslineUnicode(dependencies.environment),
|
|
942
964
|
host
|
|
943
965
|
}));
|
|
944
966
|
}
|
|
@@ -947,10 +969,12 @@ const agentAliases = {
|
|
|
947
969
|
antigravity: "antigravity",
|
|
948
970
|
claude: "claude",
|
|
949
971
|
codex: "codex",
|
|
972
|
+
cursor: "cursor",
|
|
950
973
|
gemini: "gemini",
|
|
951
974
|
grok: "grok",
|
|
952
975
|
"grok-build": "grok",
|
|
953
976
|
kimi: "kimi",
|
|
977
|
+
muse: "muse",
|
|
954
978
|
opencode: "opencode"
|
|
955
979
|
};
|
|
956
980
|
function agentArgument(value) {
|
|
@@ -1241,8 +1265,8 @@ const terminalUsage = [
|
|
|
1241
1265
|
"openlimiter terminal status",
|
|
1242
1266
|
"openlimiter terminal install <host> [--wrap]",
|
|
1243
1267
|
"openlimiter terminal uninstall <host|all>",
|
|
1244
|
-
"openlimiter terminal show <provider ...>",
|
|
1245
|
-
"openlimiter terminal hide <provider ...>",
|
|
1268
|
+
"openlimiter terminal show <segment|provider|window ...>",
|
|
1269
|
+
"openlimiter terminal hide <segment|provider|window ...>",
|
|
1246
1270
|
"",
|
|
1247
1271
|
"hosts: " + TERMINAL_HOST_NAMES.join(", ") + "."
|
|
1248
1272
|
].join("\n");
|
|
@@ -1318,7 +1342,7 @@ async function terminalCommand(dependencies, argumentsList) {
|
|
|
1318
1342
|
if (action === "show" || action === "hide") {
|
|
1319
1343
|
const providerIds = argumentsList.slice(2);
|
|
1320
1344
|
if (providerIds.length === 0) {
|
|
1321
|
-
return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one provider
|
|
1345
|
+
return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one segment, provider or window.");
|
|
1322
1346
|
}
|
|
1323
1347
|
const result = action === "show"
|
|
1324
1348
|
? await terminalShow(providerIds, context)
|
|
@@ -1564,6 +1588,7 @@ async function setupSignInStep(dependencies) {
|
|
|
1564
1588
|
const AGENT_CREDENTIAL_PROVIDER = {
|
|
1565
1589
|
claude: "CLAUDE",
|
|
1566
1590
|
codex: "CODEX",
|
|
1591
|
+
cursor: "CURSOR",
|
|
1567
1592
|
gemini: "GEMINI_CLI",
|
|
1568
1593
|
antigravity: "ANTIGRAVITY",
|
|
1569
1594
|
grok: "GROK",
|
|
@@ -1744,6 +1769,12 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1744
1769
|
const command = argumentsList[0] ?? "setup";
|
|
1745
1770
|
const now = dependencies.now();
|
|
1746
1771
|
try {
|
|
1772
|
+
if (["snapshot", "statusline", "refresh", "status"].includes(command)) {
|
|
1773
|
+
await pruneSnapshotCache(dependencies.stateDirectory, Date.parse(now)).catch(() => 0);
|
|
1774
|
+
}
|
|
1775
|
+
if (command === "--version" || command === "-v" || command === "version") {
|
|
1776
|
+
return succeed(packageJson.version);
|
|
1777
|
+
}
|
|
1747
1778
|
if (command === "setup") {
|
|
1748
1779
|
const result = await setupCommand(dependencies, now);
|
|
1749
1780
|
if (hasOutputSink || setupOutput.length === 0)
|
|
@@ -1775,6 +1806,13 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1775
1806
|
if (command === "hook") {
|
|
1776
1807
|
return await hookProtocolCommand(dependencies, argumentsList, now);
|
|
1777
1808
|
}
|
|
1809
|
+
if (command === "event") {
|
|
1810
|
+
const { eventCommand } = await import("./activity/event.js");
|
|
1811
|
+
return await eventCommand(argumentsList, {
|
|
1812
|
+
...dependencies,
|
|
1813
|
+
protectWindowsDirectory: (directory) => applyWindowsOwnerOnlyAcl(directory, dependencies.windowsAclRunner)
|
|
1814
|
+
});
|
|
1815
|
+
}
|
|
1778
1816
|
if (command === "hooks")
|
|
1779
1817
|
return await hooksCommand(dependencies, argumentsList);
|
|
1780
1818
|
if (command === "status") {
|
|
@@ -1803,7 +1841,7 @@ export async function runCli(argumentsList, overrides = {}) {
|
|
|
1803
1841
|
* nothing rather than breaking their host. Every other command surfaces the
|
|
1804
1842
|
* failure with a redacted message so a script can react to it.
|
|
1805
1843
|
*/
|
|
1806
|
-
if (command === "hook")
|
|
1844
|
+
if (command === "hook" || command === "event")
|
|
1807
1845
|
return { exitCode: EXIT_OK, stdout: "", stderr: "" };
|
|
1808
1846
|
/* A detached refresh writes to a discarded stream and has nobody to tell,
|
|
1809
1847
|
so it fails quietly rather than leaving an exit code nothing reads. */
|