openlimiter 1.3.5 → 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.
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,kFAAkF;AAClF,oEAAoE;AACpE,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC7F,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC,IAAI,CAA6D,CAAC;AAC1K,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,IAAI,CAA0D,CAAC;AAErJ,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,MAAM,GAA4C;IACtD,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ;CAC5F,CAAC;AACF,MAAM,MAAM,GAAgD;IAC1D,MAAM,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC;IAClF,KAAK,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,CAAC;IACtF,IAAI,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC;IACrG,MAAM,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,CAAC;IACnF,MAAM,EAAE,CAAC,cAAc,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY,CAAC;CACrE,CAAC;AAEF,wFAAwF;AACxF,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACtG,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjG,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtG,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACnH,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtH,MAAM,KAAK,GAAkB;QAC3B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,GAAG,KAAK;QACnE,KAAK,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;QAChF,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa;KAC/E,CAAC;IACF,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc;QAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;SAClF,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;SACxG,IAAI,SAAS,KAAK,mBAAmB;QAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;SAC/D,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,KAAK,gBAAgB,CAAC;YACvD,CAAC,CAAC,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,mBAAmB,CAAC;YAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;aACtG,IAAI,KAAK,KAAK,aAAa,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAClE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;YACxB,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,KAAK,aAAa,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC7D,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;YACrB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAChC,CAAC;;YAAM,OAAO,IAAI,CAAC;IACrB,CAAC;SAAM,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QACpE,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC;QAC/B,IAAI,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;QACvF,IAAI,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO;YAAE,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;IACpF,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,WAAW;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;aACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;aACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO;YAAE,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;;YAC5D,OAAO,IAAI,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC;IACtF,CAAC;IACD,kFAAkF;IAClF,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,aAAa,CAAC,IAAI,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IACxH,OAAO,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,aAAgC,EAAE,YAA+B;IAClG,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC;IACtD,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;YACpC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SAC/G,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,qBAAqB;YAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC9I,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,EAAE,GAAG,CAAC,CAAC;QACjG,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,YAAY,CAAC,cAAc,IAAI,qBAAqB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YAClH,GAAG,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAiB,EAAE,EAAE;oBAChG,yDAAyD;oBACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;oBACpE,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,YAAY,CAAC,uBAAwB,CAAC,SAAS,CAAC,CAAC;oBACvD,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;gBACxD,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACV,CAAC;QACF,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC,CAAC,uFAAuF,CAAC,CAAC;YAC3F,CAAC;QAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IAClD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,QAAkB,OAAO,CAAC,KAAK;IAClF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAa,EAAE,CAAC;QAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC5C,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACnC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACjC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,GAAG,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAsB,EAAQ,EAAE;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,IAAI,GAAG,qBAAqB;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC;;gBAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,GAAS,EAAE;YACrB,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YACxF,MAAM,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QACzB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
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":"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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], { 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),
@@ -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
@@ -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
- return (await persistSnapshots(incoming, dependencies.stateDirectory, now)).merged;
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 === null) {
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
- color: statuslineColor(config.color, dependencies.environment, dependencies.colorOutput),
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) {
@@ -1241,8 +1262,8 @@ const terminalUsage = [
1241
1262
  "openlimiter terminal status",
1242
1263
  "openlimiter terminal install <host> [--wrap]",
1243
1264
  "openlimiter terminal uninstall <host|all>",
1244
- "openlimiter terminal show <provider ...>",
1245
- "openlimiter terminal hide <provider ...>",
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");
@@ -1318,7 +1339,7 @@ async function terminalCommand(dependencies, argumentsList) {
1318
1339
  if (action === "show" || action === "hide") {
1319
1340
  const providerIds = argumentsList.slice(2);
1320
1341
  if (providerIds.length === 0) {
1321
- return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one provider id.");
1342
+ return fail(EXIT_USAGE, "openlimiter terminal: " + action + " needs at least one segment, provider or window.");
1322
1343
  }
1323
1344
  const result = action === "show"
1324
1345
  ? await terminalShow(providerIds, context)
@@ -1564,6 +1585,7 @@ async function setupSignInStep(dependencies) {
1564
1585
  const AGENT_CREDENTIAL_PROVIDER = {
1565
1586
  claude: "CLAUDE",
1566
1587
  codex: "CODEX",
1588
+ cursor: "CURSOR",
1567
1589
  gemini: "GEMINI_CLI",
1568
1590
  antigravity: "ANTIGRAVITY",
1569
1591
  grok: "GROK",
@@ -1744,6 +1766,9 @@ export async function runCli(argumentsList, overrides = {}) {
1744
1766
  const command = argumentsList[0] ?? "setup";
1745
1767
  const now = dependencies.now();
1746
1768
  try {
1769
+ if (command === "--version" || command === "-v" || command === "version") {
1770
+ return succeed(packageJson.version);
1771
+ }
1747
1772
  if (command === "setup") {
1748
1773
  const result = await setupCommand(dependencies, now);
1749
1774
  if (hasOutputSink || setupOutput.length === 0)
@@ -1775,6 +1800,13 @@ export async function runCli(argumentsList, overrides = {}) {
1775
1800
  if (command === "hook") {
1776
1801
  return await hookProtocolCommand(dependencies, argumentsList, now);
1777
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
+ }
1778
1810
  if (command === "hooks")
1779
1811
  return await hooksCommand(dependencies, argumentsList);
1780
1812
  if (command === "status") {
@@ -1803,7 +1835,7 @@ export async function runCli(argumentsList, overrides = {}) {
1803
1835
  * nothing rather than breaking their host. Every other command surfaces the
1804
1836
  * failure with a redacted message so a script can react to it.
1805
1837
  */
1806
- if (command === "hook")
1838
+ if (command === "hook" || command === "event")
1807
1839
  return { exitCode: EXIT_OK, stdout: "", stderr: "" };
1808
1840
  /* A detached refresh writes to a discarded stream and has nobody to tell,
1809
1841
  so it fails quietly rather than leaving an exit code nothing reads. */