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.
Files changed (47) hide show
  1. package/dist/activity/event.d.ts +19 -0
  2. package/dist/activity/event.d.ts.map +1 -0
  3. package/dist/activity/event.js +169 -0
  4. package/dist/activity/event.js.map +1 -0
  5. package/dist/bin.js +5 -3
  6. package/dist/bin.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +82 -44
  9. package/dist/cli.js.map +1 -1
  10. package/dist/codex-device-login.d.ts.map +1 -1
  11. package/dist/codex-device-login.js +3 -1
  12. package/dist/codex-device-login.js.map +1 -1
  13. package/dist/config.d.ts +5 -11
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +6 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/hub-sync.d.ts +1 -1
  18. package/dist/hub-sync.js +1 -1
  19. package/dist/ingest.d.ts.map +1 -1
  20. package/dist/ingest.js +1 -1
  21. package/dist/ingest.js.map +1 -1
  22. package/dist/render.d.ts.map +1 -1
  23. package/dist/render.js +16 -1
  24. package/dist/render.js.map +1 -1
  25. package/dist/session.d.ts +6 -0
  26. package/dist/session.d.ts.map +1 -1
  27. package/dist/session.js +1 -1
  28. package/dist/session.js.map +1 -1
  29. package/dist/smoke.d.ts +1 -1
  30. package/dist/smoke.d.ts.map +1 -1
  31. package/dist/statusline-ingest.d.ts +10 -0
  32. package/dist/statusline-ingest.d.ts.map +1 -0
  33. package/dist/statusline-ingest.js +28 -0
  34. package/dist/statusline-ingest.js.map +1 -0
  35. package/dist/statusline.d.ts +10 -11
  36. package/dist/statusline.d.ts.map +1 -1
  37. package/dist/statusline.js +143 -129
  38. package/dist/statusline.js.map +1 -1
  39. package/dist/terminal-fallback.d.ts +1 -0
  40. package/dist/terminal-fallback.d.ts.map +1 -1
  41. package/dist/terminal-fallback.js +15 -3
  42. package/dist/terminal-fallback.js.map +1 -1
  43. package/dist/terminal.d.ts +10 -8
  44. package/dist/terminal.d.ts.map +1 -1
  45. package/dist/terminal.js +38 -88
  46. package/dist/terminal.js.map +1 -1
  47. 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] === "hook"
97
- ? readStandardInputText(process.stdin, HOOK_INPUT_MAX_BYTES, undefined, signal)
98
- : readStandardInputText()
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":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAyCL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAI3B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAGzB,KAAK,uBAAuB,EAE5B,KAAK,aAAa,EAGlB,KAAK,eAAe,EAEpB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAuB3B,OAAO,EAWL,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAG5B,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAgBL,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAC;AAiBrB,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAwB1B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAkBlB,OAAO,EAQL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE;;;;;;OAMG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,0BAA0B,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,uBAAuB,CAAC,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IACrE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,0BAA0B,CAAC,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IACvE;;;;;;OAMG;IACH,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C;;;;;OAKG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,uBAAuB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC1F;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChE;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD;;;;;;;OAOG;IACH,YAAY,EAAE,YAAY,CAAC;IAC3B;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gFAAgF;IAChF,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE;;;;;;;;OAQG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C;;;;;;;OAOG;IACH,6BAA6B,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,iBAAiB,CAAC;CAC1E;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,IAAI,CAAC;AA4H9B,wBAAgB,mBAAmB,IAAI,IAAI,CACzC,eAAe,EACb,sBAAsB,GACtB,eAAe,GACf,yBAAyB,GACzB,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,GACd,aAAa,GACb,MAAM,GACN,kBAAkB,GAClB,+BAA+B,CAClC,CAoCA;AA0DD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,qEAAqE;IACrE,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CACtC;AAqED;;;;;;;;GAQG;AAEH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,eAAe,GAAG,eAAe,EAAE,CAW9E;AAqsDD,wBAAsB,MAAM,CAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GACvC,OAAO,CAAC,SAAS,CAAC,CAsFpB"}
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], { timeout: timeoutMilliseconds, maxBuffer: 262_144, windowsHide: true }, (error, stdout) => {
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() + (row.accountId === undefined ? "" : "/" + row.accountId),
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
- * Three refusals come before any request. A desktop that wrote inside the last
450
- * interval already owns this machine's refreshing, so this command stands down
451
- * rather than doubling the traffic a provider sees. A refresh already running
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
- * Only a successful read writes. A refusal, a rate limit or a shape this build
457
- * did not understand leaves every cached row exactly where it was, to age out
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
- * The refresh lock only coordinates other copies of THIS tool. The desktop
510
- * tray is a separate process that knows nothing about it, so the write
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. Every failure returns null so the caller can fall back to the
678
- * cache instead of breaking the host tool.
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
- return (await persistSnapshots(incoming, dependencies.stateDirectory, now)).merged;
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 === null) {
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
- color: statuslineColor(config.color, dependencies.environment, dependencies.colorOutput),
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 id.");
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. */