@pentoshi/clai 4.11.29 → 4.12.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.
Files changed (237) hide show
  1. package/README.md +5 -4
  2. package/dist/agent/compaction/summary-execution.js +2 -1
  3. package/dist/agent/compaction/summary-execution.js.map +1 -1
  4. package/dist/agent/context/user-credentials.js +36 -7
  5. package/dist/agent/context/user-credentials.js.map +1 -1
  6. package/dist/agent/durable-envelope.d.ts +6 -0
  7. package/dist/agent/durable-envelope.js +50 -11
  8. package/dist/agent/durable-envelope.js.map +1 -1
  9. package/dist/agent/responder-context.d.ts +8 -0
  10. package/dist/agent/responder-context.js +35 -2
  11. package/dist/agent/responder-context.js.map +1 -1
  12. package/dist/agent/subagents/manager.d.ts +1 -1
  13. package/dist/agent/subagents/manager.js +4 -4
  14. package/dist/agent/subagents/manager.js.map +1 -1
  15. package/dist/agent/tool-history.d.ts +2 -2
  16. package/dist/agent/tool-history.js +2 -1
  17. package/dist/agent/tool-history.js.map +1 -1
  18. package/dist/agent/turn/compaction-durable-envelope.d.ts +2 -1
  19. package/dist/agent/turn/compaction-durable-envelope.js +22 -11
  20. package/dist/agent/turn/compaction-durable-envelope.js.map +1 -1
  21. package/dist/agent/turn/history-writer.d.ts +1 -1
  22. package/dist/agent/turn/history-writer.js +1 -0
  23. package/dist/agent/turn/history-writer.js.map +1 -1
  24. package/dist/agent/turn/loop/completion-interpretation.d.ts +1 -1
  25. package/dist/agent/turn/loop/deps.d.ts +1 -1
  26. package/dist/agent/turn/loop/run-rounds.js +1 -1
  27. package/dist/agent/turn/loop/run-rounds.js.map +1 -1
  28. package/dist/agent/turn/responder-read-tool.d.ts +1 -0
  29. package/dist/agent/turn/responder-read-tool.js +13 -6
  30. package/dist/agent/turn/responder-read-tool.js.map +1 -1
  31. package/dist/app/commands/catalog.js +15 -3
  32. package/dist/app/commands/catalog.js.map +1 -1
  33. package/dist/app/controllers/session-controller.d.ts +3 -1
  34. package/dist/app/controllers/session-controller.js +17 -10
  35. package/dist/app/controllers/session-controller.js.map +1 -1
  36. package/dist/app/controllers/session-usage-ledger.d.ts +5 -1
  37. package/dist/app/controllers/session-usage-ledger.js +19 -5
  38. package/dist/app/controllers/session-usage-ledger.js.map +1 -1
  39. package/dist/app/controllers/session-usage-source.d.ts +13 -0
  40. package/dist/app/controllers/session-usage-source.js +37 -0
  41. package/dist/app/controllers/session-usage-source.js.map +1 -0
  42. package/dist/classic/blocks/diff-lines.js +5 -8
  43. package/dist/classic/blocks/diff-lines.js.map +1 -1
  44. package/dist/classic/bootstrap/start-classic.js +3 -0
  45. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  46. package/dist/classic/chrome/subagents-row.js +1 -1
  47. package/dist/classic/chrome/subagents-row.js.map +1 -1
  48. package/dist/classic/input/paste-burst.d.ts +3 -12
  49. package/dist/classic/input/paste-burst.js +18 -110
  50. package/dist/classic/input/paste-burst.js.map +1 -1
  51. package/dist/classic/input/paste-decoder.js +2 -4
  52. package/dist/classic/input/paste-decoder.js.map +1 -1
  53. package/dist/classic/input/terminal-sequences.d.ts +1 -2
  54. package/dist/classic/input/terminal-sequences.js +1 -2
  55. package/dist/classic/input/terminal-sequences.js.map +1 -1
  56. package/dist/classic/panels/pager-diff.js +5 -7
  57. package/dist/classic/panels/pager-diff.js.map +1 -1
  58. package/dist/classic/panels/panel-controller.d.ts +1 -0
  59. package/dist/classic/panels/panel-controller.js +22 -9
  60. package/dist/classic/panels/panel-controller.js.map +1 -1
  61. package/dist/classic/render/ink-theme.js +1 -1
  62. package/dist/classic/render/ink-theme.js.map +1 -1
  63. package/dist/commands/providers.d.ts +5 -0
  64. package/dist/commands/providers.js +57 -0
  65. package/dist/commands/providers.js.map +1 -1
  66. package/dist/index.js +12 -4
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm/capabilities.js +5 -5
  69. package/dist/llm/capabilities.js.map +1 -1
  70. package/dist/llm/capability/state.d.ts +1 -1
  71. package/dist/llm/capability/tool-dialect.js +2 -0
  72. package/dist/llm/capability/tool-dialect.js.map +1 -1
  73. package/dist/llm/capability/vision-patterns.js +12 -0
  74. package/dist/llm/capability/vision-patterns.js.map +1 -1
  75. package/dist/llm/catalog-facts.js +10 -0
  76. package/dist/llm/catalog-facts.js.map +1 -1
  77. package/dist/llm/codex-auth.d.ts +1 -1
  78. package/dist/llm/codex-auth.js +11 -12
  79. package/dist/llm/codex-auth.js.map +1 -1
  80. package/dist/llm/codex-client.d.ts +1 -0
  81. package/dist/llm/codex-client.js +30 -0
  82. package/dist/llm/codex-client.js.map +1 -0
  83. package/dist/llm/codex-config.d.ts +3 -0
  84. package/dist/llm/codex-config.js +78 -0
  85. package/dist/llm/codex-config.js.map +1 -0
  86. package/dist/llm/codex-credential.d.ts +3 -0
  87. package/dist/llm/codex-credential.js +94 -0
  88. package/dist/llm/codex-credential.js.map +1 -0
  89. package/dist/llm/codex-models.d.ts +18 -0
  90. package/dist/llm/codex-models.js +172 -0
  91. package/dist/llm/codex-models.js.map +1 -0
  92. package/dist/llm/codex-request.d.ts +1 -0
  93. package/dist/llm/codex-request.js +61 -0
  94. package/dist/llm/codex-request.js.map +1 -0
  95. package/dist/llm/codex-usage.d.ts +4 -0
  96. package/dist/llm/codex-usage.js +96 -0
  97. package/dist/llm/codex-usage.js.map +1 -0
  98. package/dist/llm/codex.d.ts +1 -2
  99. package/dist/llm/codex.js +30 -217
  100. package/dist/llm/codex.js.map +1 -1
  101. package/dist/llm/context-windows.js +1 -0
  102. package/dist/llm/context-windows.js.map +1 -1
  103. package/dist/llm/model-layers/model-rules.js +6 -0
  104. package/dist/llm/model-layers/model-rules.js.map +1 -1
  105. package/dist/llm/omnirush-auth.d.ts +40 -0
  106. package/dist/llm/omnirush-auth.js +264 -0
  107. package/dist/llm/omnirush-auth.js.map +1 -0
  108. package/dist/llm/omnirush-session-upload.d.ts +63 -0
  109. package/dist/llm/omnirush-session-upload.js +221 -0
  110. package/dist/llm/omnirush-session-upload.js.map +1 -0
  111. package/dist/llm/omnirush.d.ts +4 -0
  112. package/dist/llm/omnirush.js +221 -0
  113. package/dist/llm/omnirush.js.map +1 -0
  114. package/dist/llm/provider-balance.d.ts +10 -0
  115. package/dist/llm/provider-balance.js +22 -2
  116. package/dist/llm/provider-balance.js.map +1 -1
  117. package/dist/llm/provider-identity.js +11 -0
  118. package/dist/llm/provider-identity.js.map +1 -1
  119. package/dist/llm/provider-info-text.js +110 -4
  120. package/dist/llm/provider-info-text.js.map +1 -1
  121. package/dist/llm/provider-profile-layers.js +32 -2
  122. package/dist/llm/provider-profile-layers.js.map +1 -1
  123. package/dist/llm/reasoning-capability.js +16 -0
  124. package/dist/llm/reasoning-capability.js.map +1 -1
  125. package/dist/llm/reasoning-controls.d.ts +1 -0
  126. package/dist/llm/reasoning-controls.js +3 -0
  127. package/dist/llm/reasoning-controls.js.map +1 -1
  128. package/dist/llm/responses/item-events.js +2 -0
  129. package/dist/llm/responses/item-events.js.map +1 -1
  130. package/dist/llm/responses-config.d.ts +4 -1
  131. package/dist/llm/responses-config.js.map +1 -1
  132. package/dist/llm/responses-parse.d.ts +2 -1
  133. package/dist/llm/responses-parse.js +11 -45
  134. package/dist/llm/responses-parse.js.map +1 -1
  135. package/dist/llm/responses-replay.d.ts +3 -0
  136. package/dist/llm/responses-replay.js +48 -0
  137. package/dist/llm/responses-replay.js.map +1 -0
  138. package/dist/llm/responses-request.js +22 -8
  139. package/dist/llm/responses-request.js.map +1 -1
  140. package/dist/llm/responses-stream-accumulator.d.ts +4 -0
  141. package/dist/llm/responses-stream-accumulator.js +12 -1
  142. package/dist/llm/responses-stream-accumulator.js.map +1 -1
  143. package/dist/llm/responses-stream-events.js +14 -25
  144. package/dist/llm/responses-stream-events.js.map +1 -1
  145. package/dist/llm/responses-stream.js +1 -0
  146. package/dist/llm/responses-stream.js.map +1 -1
  147. package/dist/llm/responses-usage.d.ts +12 -0
  148. package/dist/llm/responses-usage.js +66 -0
  149. package/dist/llm/responses-usage.js.map +1 -0
  150. package/dist/llm/router.js +4 -4
  151. package/dist/llm/router.js.map +1 -1
  152. package/dist/llm/routing/error-classification.js +2 -2
  153. package/dist/llm/routing/error-classification.js.map +1 -1
  154. package/dist/llm/routing/provider-selection.js +6 -0
  155. package/dist/llm/routing/provider-selection.js.map +1 -1
  156. package/dist/llm/tokenharbor-cache.d.ts +4 -0
  157. package/dist/llm/tokenharbor-cache.js +10 -0
  158. package/dist/llm/tokenharbor-cache.js.map +1 -0
  159. package/dist/llm/tokenharbor.d.ts +8 -0
  160. package/dist/llm/tokenharbor.js +159 -0
  161. package/dist/llm/tokenharbor.js.map +1 -0
  162. package/dist/llm/wire/chat-body.d.ts +4 -3
  163. package/dist/llm/wire/chat-body.js +13 -5
  164. package/dist/llm/wire/chat-body.js.map +1 -1
  165. package/dist/llm/wire/effort-preflight.js +6 -10
  166. package/dist/llm/wire/effort-preflight.js.map +1 -1
  167. package/dist/llm/wire/openai-complete.d.ts +2 -1
  168. package/dist/llm/wire/openai-complete.js +1 -1
  169. package/dist/llm/wire/openai-complete.js.map +1 -1
  170. package/dist/llm/wire/openai-stream.d.ts +2 -1
  171. package/dist/llm/wire/openai-stream.js +1 -1
  172. package/dist/llm/wire/openai-stream.js.map +1 -1
  173. package/dist/llm/wire/responses-preflight.js +1 -0
  174. package/dist/llm/wire/responses-preflight.js.map +1 -1
  175. package/dist/modes/ask.js +2 -1
  176. package/dist/modes/ask.js.map +1 -1
  177. package/dist/noninteractive/start-noninteractive.js +18 -0
  178. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  179. package/dist/prompts/embedded.js +1 -1
  180. package/dist/prompts/embedded.js.map +1 -1
  181. package/dist/prompts/system.agent.md +1 -1
  182. package/dist/store/config/endpoints.js +1 -0
  183. package/dist/store/config/endpoints.js.map +1 -1
  184. package/dist/store/config.js +3 -0
  185. package/dist/store/config.js.map +1 -1
  186. package/dist/store/history.js +3 -0
  187. package/dist/store/history.js.map +1 -1
  188. package/dist/store/session-model.js +1 -0
  189. package/dist/store/session-model.js.map +1 -1
  190. package/dist/tools/definitions/aggregate.js +5 -1
  191. package/dist/tools/definitions/aggregate.js.map +1 -1
  192. package/dist/tools/jobs/types.d.ts +1 -0
  193. package/dist/tui-v2/bootstrap/start-tui-v2.js +6 -0
  194. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  195. package/dist/tui-v2/components/jobs/subagents-panel.js +1 -1
  196. package/dist/tui-v2/components/jobs/subagents-panel.js.map +1 -1
  197. package/dist/tui-v2/composer/composer-editor.js +2 -1
  198. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  199. package/dist/tui-v2/input/paste-burst-guard.d.ts +22 -0
  200. package/dist/tui-v2/input/paste-burst-guard.js +123 -0
  201. package/dist/tui-v2/input/paste-burst-guard.js.map +1 -0
  202. package/dist/types.d.ts +9 -2
  203. package/dist/types.js +2 -0
  204. package/dist/types.js.map +1 -1
  205. package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
  206. package/dist/ui-core/bootstrap/composition-root.js +8 -0
  207. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  208. package/dist/ui-core/commands/command-handlers.js +2 -2
  209. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  210. package/dist/ui-core/commands/key-commands.d.ts +2 -0
  211. package/dist/ui-core/commands/key-commands.js +173 -0
  212. package/dist/ui-core/commands/key-commands.js.map +1 -1
  213. package/dist/ui-core/commands/picker-commands.js +15 -0
  214. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  215. package/dist/ui-core/commands/pickers/search-reasoning.js +4 -3
  216. package/dist/ui-core/commands/pickers/search-reasoning.js.map +1 -1
  217. package/dist/ui-core/commands/session-commands.d.ts +1 -1
  218. package/dist/ui-core/commands/session-commands.js +60 -32
  219. package/dist/ui-core/commands/session-commands.js.map +1 -1
  220. package/dist/ui-core/commands/subagent-commands.d.ts +1 -1
  221. package/dist/ui-core/commands/subagent-commands.js +4 -4
  222. package/dist/ui-core/commands/subagent-commands.js.map +1 -1
  223. package/dist/ui-core/input/paste-burst.d.ts +45 -0
  224. package/dist/ui-core/input/paste-burst.js +170 -0
  225. package/dist/ui-core/input/paste-burst.js.map +1 -0
  226. package/dist/ui-core/input/paste-text.d.ts +1 -0
  227. package/dist/ui-core/input/paste-text.js +4 -0
  228. package/dist/ui-core/input/paste-text.js.map +1 -0
  229. package/dist/ui-core/rendering/exit-summary/table.js +4 -1
  230. package/dist/ui-core/rendering/exit-summary/table.js.map +1 -1
  231. package/dist/ui-core/rendering/format-usage.js +9 -2
  232. package/dist/ui-core/rendering/format-usage.js.map +1 -1
  233. package/dist/ui-core/rendering/theme.js +4 -4
  234. package/dist/version.generated.d.ts +2 -2
  235. package/dist/version.generated.js +2 -2
  236. package/dist/version.generated.js.map +1 -1
  237. package/package.json +1 -1
@@ -0,0 +1,264 @@
1
+ import { arch, homedir, hostname, platform, release } from "node:os";
2
+ import { join } from "node:path";
3
+ import { readFile } from "node:fs/promises";
4
+ export const OMNIRUSH_DEFAULT_ORIGIN = "https://omnirush.ai/omnirush";
5
+ export const OMNIRUSH_CONSOLE_URL = "https://omnirush.ai/console";
6
+ export const OMNIRUSH_CLI_VERSION = "1.0.5";
7
+ export const OMNIRUSH_DEFAULT_MODEL = "gpt-6-astra";
8
+ export function omnirushOrigin() {
9
+ const direct = (process.env.OMNIRUSH_ORIGIN ?? "").trim().replace(/\/+$/, "");
10
+ if (direct)
11
+ return direct;
12
+ const viaGateway = (process.env.OMNIRUSH_GATEWAY_URL ?? "")
13
+ .trim()
14
+ .replace(/\/+$/, "")
15
+ .replace(/\/v1$/, "");
16
+ if (viaGateway)
17
+ return viaGateway;
18
+ return OMNIRUSH_DEFAULT_ORIGIN;
19
+ }
20
+ export function omnirushGatewayUrl() {
21
+ const override = (process.env.OMNIRUSH_GATEWAY_URL ?? "").trim().replace(/\/+$/, "");
22
+ if (override)
23
+ return /\/v1$/i.test(override) ? override : `${override}/v1`;
24
+ return `${omnirushOrigin()}/v1`;
25
+ }
26
+ export function omnirushManagerUserAgent() {
27
+ return `omnirush/${OMNIRUSH_CLI_VERSION} (${process.platform}; ${process.arch})`;
28
+ }
29
+ export function omnirushGatewayUserAgent() {
30
+ return `omnirush (${platform()} ${release()}; ${arch()})`;
31
+ }
32
+ export function omnirushDeviceName() {
33
+ const name = (hostname() || "omnirush-cli").split(/[.\s]/)[0] ?? "";
34
+ return name.slice(0, 64) || "omnirush-cli";
35
+ }
36
+ export function omnirushAuthFilePath() {
37
+ const dir = (process.env.OMNIRUSH_DIR ?? "").trim();
38
+ return join(dir || join(homedir(), ".omnirush"), "auth.json");
39
+ }
40
+ export class OmnirushAuthError extends Error {
41
+ status;
42
+ detail;
43
+ constructor(message, status, detail) {
44
+ super(message);
45
+ this.status = status;
46
+ this.detail = detail;
47
+ this.name = "OmnirushAuthError";
48
+ }
49
+ isLikelyInvalidGrant() {
50
+ if (/refresh_token_invalid_or_expired|expired_token|revoked|account_inactive|account_pending|account_rejected/i.test(this.detail ?? "")) {
51
+ return true;
52
+ }
53
+ return ([400, 401, 403, 409].includes(this.status ?? 0) &&
54
+ /invalid|expired|revoked|denied/i.test(this.message));
55
+ }
56
+ }
57
+ function asRecord(value) {
58
+ return value !== null && typeof value === "object" && !Array.isArray(value)
59
+ ? value
60
+ : undefined;
61
+ }
62
+ async function readPayload(response) {
63
+ const text = await response.text().catch(() => "");
64
+ if (!text)
65
+ return undefined;
66
+ try {
67
+ return asRecord(JSON.parse(text));
68
+ }
69
+ catch {
70
+ return undefined;
71
+ }
72
+ }
73
+ function detailOf(payload, fallback) {
74
+ const detail = payload?.detail;
75
+ if (typeof detail === "string" && detail)
76
+ return detail;
77
+ if (detail != null)
78
+ return "invalid request";
79
+ return fallback;
80
+ }
81
+ function managerHeaders(extra = {}) {
82
+ return { "User-Agent": omnirushManagerUserAgent(), ...extra };
83
+ }
84
+ export async function startOmnirushDeviceAuth(fetchImpl = globalThis.fetch) {
85
+ let response;
86
+ try {
87
+ response = await fetchImpl(`${omnirushOrigin()}/device/authorize`, {
88
+ method: "POST",
89
+ headers: managerHeaders({ "Content-Type": "application/json" }),
90
+ body: JSON.stringify({
91
+ device_name: omnirushDeviceName(),
92
+ platform: process.platform,
93
+ }),
94
+ signal: AbortSignal.timeout(30_000),
95
+ });
96
+ }
97
+ catch (error) {
98
+ throw new OmnirushAuthError(`omnirush device authorization request failed: ${error instanceof Error ? error.message : "network error"}`);
99
+ }
100
+ const payload = await readPayload(response);
101
+ if (!response.ok) {
102
+ throw new OmnirushAuthError(`omnirush device authorization failed (${response.status}): ${detailOf(payload, "request failed")}`, response.status, detailOf(payload, ""));
103
+ }
104
+ const deviceCode = typeof payload?.device_code === "string" ? payload.device_code : "";
105
+ const userCode = typeof payload?.user_code === "string" ? payload.user_code : "";
106
+ const verificationUriComplete = typeof payload?.verification_uri_complete === "string"
107
+ ? payload.verification_uri_complete
108
+ : "";
109
+ if (!deviceCode || !userCode || !verificationUriComplete) {
110
+ throw new OmnirushAuthError("omnirush device authorization returned an incomplete response");
111
+ }
112
+ const expiresIn = typeof payload?.expires_in === "number" && payload.expires_in > 0 ? payload.expires_in : 600;
113
+ const interval = typeof payload?.interval === "number" && payload.interval > 0 ? payload.interval : 5;
114
+ return {
115
+ deviceCode,
116
+ userCode,
117
+ verificationUrl: typeof payload?.verification_uri === "string" ? payload.verification_uri : verificationUriComplete,
118
+ verificationUrlComplete: verificationUriComplete,
119
+ expiresInSeconds: expiresIn,
120
+ pollIntervalSeconds: interval,
121
+ };
122
+ }
123
+ async function requestDeviceToken(start, fetchImpl) {
124
+ return fetchImpl(`${omnirushOrigin()}/device/token`, {
125
+ method: "POST",
126
+ headers: managerHeaders({ "Content-Type": "application/json" }),
127
+ body: JSON.stringify({ device_code: start.deviceCode }),
128
+ signal: AbortSignal.timeout(30_000),
129
+ });
130
+ }
131
+ async function consumeDevicePoll(response) {
132
+ const payload = await readPayload(response);
133
+ const detail = detailOf(payload, "");
134
+ if (response.ok) {
135
+ const accessToken = typeof payload?.access_token === "string" ? payload.access_token : "";
136
+ const refreshToken = typeof payload?.refresh_token === "string" ? payload.refresh_token : "";
137
+ if (!accessToken || !refreshToken) {
138
+ throw new OmnirushAuthError("omnirush device authorization returned incomplete credentials");
139
+ }
140
+ const gatewayUrl = typeof payload?.gateway_url === "string" && payload.gateway_url
141
+ ? payload.gateway_url.replace(/\/+$/, "").replace(/\/v1$/, "")
142
+ : undefined;
143
+ return {
144
+ state: "complete",
145
+ tokens: { accessToken, refreshToken, ...(gatewayUrl ? { gatewayUrl } : {}) },
146
+ };
147
+ }
148
+ if (response.status === 428 || detail === "authorization_pending") {
149
+ return { state: "pending" };
150
+ }
151
+ if (response.status === 429 || detail === "slow_down")
152
+ return { state: "slow-down" };
153
+ if (response.status === 400 || detail === "expired_token")
154
+ return { state: "expired" };
155
+ throw new OmnirushAuthError(`omnirush device token poll failed (${response.status}): ${detail || "request failed"}`, response.status, detail);
156
+ }
157
+ function sleep(ms, signal) {
158
+ return new Promise((resolve, reject) => {
159
+ if (signal?.aborted) {
160
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
161
+ return;
162
+ }
163
+ const timer = setTimeout(resolve, ms);
164
+ signal?.addEventListener("abort", () => {
165
+ clearTimeout(timer);
166
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
167
+ }, { once: true });
168
+ });
169
+ }
170
+ export async function pollOmnirushDeviceAuth(start, options = {}) {
171
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
172
+ const deadline = Date.now() + start.expiresInSeconds * 1000;
173
+ let interval = Math.max(1, start.pollIntervalSeconds) * 1000;
174
+ for (;;) {
175
+ if (options.signal?.aborted) {
176
+ throw new OmnirushAuthError("omnirush authentication cancelled");
177
+ }
178
+ const remaining = Math.ceil((deadline - Date.now()) / 1000);
179
+ if (remaining <= 0) {
180
+ throw new OmnirushAuthError("omnirush authentication code expired — run `clai auth omnirush` again");
181
+ }
182
+ options.onPending?.(remaining);
183
+ const result = await consumeDevicePoll(await requestDeviceToken(start, fetchImpl));
184
+ if (result.state === "complete")
185
+ return result.tokens;
186
+ if (result.state === "expired") {
187
+ throw new OmnirushAuthError("omnirush authentication code expired — run `clai auth omnirush` again");
188
+ }
189
+ if (result.state === "slow-down")
190
+ interval = Math.min(interval + 5_000, 30_000);
191
+ await sleep(interval, options.signal);
192
+ }
193
+ }
194
+ export async function refreshOmnirushToken(refreshToken, fetchImpl = globalThis.fetch) {
195
+ let response;
196
+ try {
197
+ response = await fetchImpl(`${omnirushOrigin()}/device/refresh`, {
198
+ method: "POST",
199
+ headers: managerHeaders({ "Content-Type": "application/json" }),
200
+ body: JSON.stringify({ refresh_token: refreshToken }),
201
+ signal: AbortSignal.timeout(30_000),
202
+ });
203
+ }
204
+ catch (error) {
205
+ throw new OmnirushAuthError(`omnirush token refresh request failed: ${error instanceof Error ? error.message : "network error"}`);
206
+ }
207
+ const payload = await readPayload(response);
208
+ const detail = detailOf(payload, "");
209
+ if (!response.ok) {
210
+ throw new OmnirushAuthError(`omnirush token refresh failed (${response.status}): ${detail || "request failed"}`, response.status, detail);
211
+ }
212
+ const accessToken = typeof payload?.access_token === "string" ? payload.access_token : "";
213
+ const nextRefreshToken = typeof payload?.refresh_token === "string" ? payload.refresh_token : "";
214
+ if (!accessToken || !nextRefreshToken) {
215
+ throw new OmnirushAuthError("omnirush token refresh returned incomplete credentials");
216
+ }
217
+ const gatewayUrl = typeof payload?.gateway_url === "string" && payload.gateway_url
218
+ ? payload.gateway_url.replace(/\/+$/, "").replace(/\/v1$/, "")
219
+ : undefined;
220
+ return { accessToken, refreshToken: nextRefreshToken, ...(gatewayUrl ? { gatewayUrl } : {}) };
221
+ }
222
+ export async function omnirushDeviceMe(accessToken, fetchImpl = globalThis.fetch) {
223
+ try {
224
+ const response = await fetchImpl(`${omnirushOrigin()}/device/me`, {
225
+ headers: managerHeaders({ Authorization: `Bearer ${accessToken}` }),
226
+ signal: AbortSignal.timeout(15_000),
227
+ });
228
+ if (response.status === 401)
229
+ return null;
230
+ if (!response.ok)
231
+ return null;
232
+ return asRecord(await response.json().catch(() => null)) ?? null;
233
+ }
234
+ catch {
235
+ return null;
236
+ }
237
+ }
238
+ export async function verifyOmnirushToken(token, fetchImpl = globalThis.fetch) {
239
+ return (await omnirushDeviceMe(token, fetchImpl)) !== null;
240
+ }
241
+ export async function validateOmnirushToken(token, fetchImpl = globalThis.fetch) {
242
+ if (!(await omnirushDeviceMe(token, fetchImpl))) {
243
+ throw new OmnirushAuthError("omnirush token is invalid or expired");
244
+ }
245
+ }
246
+ export async function importExistingOmnirushAuth() {
247
+ let parsed;
248
+ try {
249
+ parsed = JSON.parse(await readFile(omnirushAuthFilePath(), "utf8"));
250
+ }
251
+ catch {
252
+ return undefined;
253
+ }
254
+ const record = asRecord(parsed);
255
+ const accessToken = typeof record?.accessToken === "string" ? record.accessToken : "";
256
+ const refreshToken = typeof record?.refreshToken === "string" ? record.refreshToken : "";
257
+ if (!accessToken || !refreshToken)
258
+ return undefined;
259
+ const gatewayUrl = typeof record?.gatewayUrl === "string" && record.gatewayUrl
260
+ ? record.gatewayUrl.replace(/\/+$/, "").replace(/\/v1$/, "")
261
+ : undefined;
262
+ return { accessToken, refreshToken, ...(gatewayUrl ? { gatewayUrl } : {}) };
263
+ }
264
+ //# sourceMappingURL=omnirush-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnirush-auth.js","sourceRoot":"","sources":["../../src/llm/omnirush-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { ProviderId } from "../types.js";
2
+ export interface OmnirushSessionState {
3
+ readonly sessionId: string;
4
+ readonly provider: ProviderId | undefined;
5
+ readonly model: string | undefined;
6
+ }
7
+ export interface OmnirushTurnResult {
8
+ readonly status: string;
9
+ }
10
+ export interface OmnirushSessionSource {
11
+ getState(): OmnirushSessionState;
12
+ onTurnEnd(listener: (result: OmnirushTurnResult) => void): () => void;
13
+ subscribe(listener: () => void): () => void;
14
+ }
15
+ export interface OmnirushUploadResult {
16
+ readonly exitCode: number;
17
+ readonly output?: string | undefined;
18
+ }
19
+ export type OmnirushUploadRunner = (command: string, args: readonly string[], options: {
20
+ readonly cwd: string;
21
+ }) => Promise<OmnirushUploadResult>;
22
+ export interface OmnirushCliSessionUploaderOptions {
23
+ readonly sessionId: string;
24
+ readonly workspaceDir?: string | undefined;
25
+ readonly command?: string | undefined;
26
+ readonly runner?: OmnirushUploadRunner | undefined;
27
+ readonly now?: (() => Date) | undefined;
28
+ readonly report?: ((message: string) => void) | undefined;
29
+ readonly enabled?: (() => boolean) | undefined;
30
+ }
31
+ export interface BindOmnirushSessionUploadOptions {
32
+ readonly source: OmnirushSessionSource;
33
+ readonly noHistory?: boolean | undefined;
34
+ readonly command?: string | undefined;
35
+ readonly runner?: OmnirushUploadRunner | undefined;
36
+ readonly workspaceDir?: ((sessionId: string) => string) | undefined;
37
+ readonly now?: (() => Date) | undefined;
38
+ readonly report?: ((message: string) => void) | undefined;
39
+ }
40
+ export interface OmnirushSessionUploadBinding {
41
+ close(): Promise<void>;
42
+ dispose(): void;
43
+ }
44
+ export declare function isOmnirushSessionUploadEnabled(state: OmnirushSessionState, noHistory?: boolean): boolean;
45
+ export declare class OmnirushCliSessionUploader {
46
+ private readonly options;
47
+ private sequence;
48
+ private started;
49
+ private closed;
50
+ private unavailable;
51
+ private tail;
52
+ private readonly workspaceDir;
53
+ private readonly command;
54
+ private readonly runner;
55
+ private readonly now;
56
+ private readonly report;
57
+ private readonly enabled;
58
+ constructor(options: OmnirushCliSessionUploaderOptions);
59
+ recordTurn(status: string): Promise<void>;
60
+ close(): Promise<void>;
61
+ private enqueue;
62
+ }
63
+ export declare function bindOmnirushSessionUpload(options: BindOmnirushSessionUploadOptions): OmnirushSessionUploadBinding;
@@ -0,0 +1,221 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { execa } from "execa";
5
+ import { getConfig } from "../store/config.js";
6
+ import { getDataDir } from "../store/paths.js";
7
+ import { getActiveSessionWorkspace } from "../store/session-workspace.js";
8
+ function sessionWorkspaceDir(sessionId) {
9
+ const active = getActiveSessionWorkspace();
10
+ if (active)
11
+ return join(active.rootDir, "omnirush-cli-session");
12
+ const digest = createHash("sha256").update(sessionId).digest("hex").slice(0, 24);
13
+ return join(getDataDir(), "omnirush-cli-sessions", digest);
14
+ }
15
+ function uploadCommand() {
16
+ return process.env.OMNIRUSH_CLI_PATH?.trim() || "omnirush";
17
+ }
18
+ async function defaultRunner(command, args, options) {
19
+ const result = await execa(command, args, {
20
+ all: true,
21
+ cwd: options.cwd,
22
+ reject: false,
23
+ timeout: 120_000,
24
+ windowsHide: true,
25
+ });
26
+ return {
27
+ exitCode: result.exitCode ?? 1,
28
+ ...(result.all ? { output: result.all } : {}),
29
+ };
30
+ }
31
+ function disabledByEnvironment() {
32
+ return /^(0|false|off|no)$/i.test(process.env.CLAI_OMNIRUSH_SESSION_UPLOAD?.trim() ?? "");
33
+ }
34
+ function uploadAllowed(noHistory = false) {
35
+ return !noHistory && !getConfig().privateMode && !disabledByEnvironment();
36
+ }
37
+ export function isOmnirushSessionUploadEnabled(state, noHistory = false) {
38
+ return state.provider === "omnirush" && uploadAllowed(noHistory);
39
+ }
40
+ function sourceText(sessionId, sequence, phase, status, capturedAt) {
41
+ const state = JSON.stringify({
42
+ session_id: sessionId,
43
+ sequence,
44
+ phase,
45
+ status,
46
+ captured_at: capturedAt.toISOString(),
47
+ });
48
+ return [
49
+ `export const claiSession = ${state} as const;`,
50
+ "",
51
+ "export function advanceClaiSession(value: number): number {",
52
+ ` return value + ${sequence};`,
53
+ "}",
54
+ "",
55
+ ].join("\n");
56
+ }
57
+ async function writeWorkspace(workspaceDir, sessionId, sequence, phase, status, capturedAt) {
58
+ const sourceDir = join(workspaceDir, "src");
59
+ await mkdir(sourceDir, { recursive: true, mode: 0o700 });
60
+ const manifest = JSON.stringify({
61
+ name: "clai-omnirush-session",
62
+ version: "1.0.0",
63
+ private: true,
64
+ type: "module",
65
+ }, null, 2);
66
+ await Promise.all([
67
+ writeFile(join(workspaceDir, "package.json"), `${manifest}\n`, {
68
+ encoding: "utf8",
69
+ mode: 0o600,
70
+ }),
71
+ writeFile(join(sourceDir, "clai-session.ts"), sourceText(sessionId, sequence, phase, status, capturedAt), { encoding: "utf8", mode: 0o600 }),
72
+ ]);
73
+ }
74
+ function errorText(error) {
75
+ return error instanceof Error ? error.message : String(error);
76
+ }
77
+ function uploadFailureMessage(result) {
78
+ const output = result.output ?? "";
79
+ if (/unauthorized|no access token|account[_\s-]*required|status[^0-9]{0,8}401/i.test(output)) {
80
+ return "OmniRush session upload needs a fresh OmniRush CLI login; run `omnirush login`";
81
+ }
82
+ return `OmniRush session upload exited with code ${result.exitCode}`;
83
+ }
84
+ function commandMissing(error) {
85
+ if (error === null || typeof error !== "object")
86
+ return false;
87
+ const code = "code" in error ? error.code : undefined;
88
+ return code === "ENOENT";
89
+ }
90
+ export class OmnirushCliSessionUploader {
91
+ options;
92
+ sequence = 0;
93
+ started = false;
94
+ closed = false;
95
+ unavailable = false;
96
+ tail = Promise.resolve();
97
+ workspaceDir;
98
+ command;
99
+ runner;
100
+ now;
101
+ report;
102
+ enabled;
103
+ constructor(options) {
104
+ this.options = options;
105
+ this.workspaceDir = options.workspaceDir ?? sessionWorkspaceDir(options.sessionId);
106
+ this.command = options.command?.trim() || uploadCommand();
107
+ this.runner = options.runner ?? defaultRunner;
108
+ this.now = options.now ?? (() => new Date());
109
+ this.report = options.report ?? (() => undefined);
110
+ this.enabled = options.enabled ?? (() => true);
111
+ }
112
+ recordTurn(status) {
113
+ if (this.closed || this.unavailable || !this.enabled())
114
+ return this.tail;
115
+ this.started = true;
116
+ return this.enqueue("turn_completed", status);
117
+ }
118
+ close() {
119
+ if (this.closed)
120
+ return this.tail;
121
+ this.closed = true;
122
+ if (!this.started || this.unavailable || !this.enabled())
123
+ return this.tail;
124
+ return this.enqueue("session_end", "closed");
125
+ }
126
+ enqueue(phase, status) {
127
+ const sequence = ++this.sequence;
128
+ const capturedAt = this.now();
129
+ const run = async () => {
130
+ if (!this.enabled())
131
+ return;
132
+ await writeWorkspace(this.workspaceDir, this.options.sessionId, sequence, phase, status, capturedAt);
133
+ if (this.unavailable)
134
+ return;
135
+ try {
136
+ const result = await this.runner(this.command, ["upload", "--dir", this.workspaceDir, "--yes"], { cwd: this.workspaceDir });
137
+ if (result.exitCode !== 0)
138
+ this.report(uploadFailureMessage(result));
139
+ }
140
+ catch (error) {
141
+ if (commandMissing(error))
142
+ this.unavailable = true;
143
+ this.report(commandMissing(error)
144
+ ? "OmniRush session upload is unavailable because the OmniRush CLI was not found"
145
+ : `OmniRush session upload failed: ${errorText(error)}`);
146
+ }
147
+ };
148
+ const next = this.tail.then(run, run);
149
+ this.tail = next.catch(() => undefined);
150
+ return next;
151
+ }
152
+ }
153
+ export function bindOmnirushSessionUpload(options) {
154
+ let active;
155
+ let activeSessionId;
156
+ let disposed = false;
157
+ const closeActive = () => {
158
+ const uploader = active;
159
+ active = undefined;
160
+ activeSessionId = undefined;
161
+ return uploader?.close() ?? Promise.resolve();
162
+ };
163
+ const reconcile = () => {
164
+ const state = options.source.getState();
165
+ if (active &&
166
+ (activeSessionId !== state.sessionId ||
167
+ !isOmnirushSessionUploadEnabled(state, options.noHistory))) {
168
+ void closeActive();
169
+ }
170
+ };
171
+ const uploaderFor = (state) => {
172
+ if (!isOmnirushSessionUploadEnabled(state, options.noHistory))
173
+ return undefined;
174
+ if (active && activeSessionId === state.sessionId)
175
+ return active;
176
+ const prior = active;
177
+ active = new OmnirushCliSessionUploader({
178
+ sessionId: state.sessionId,
179
+ workspaceDir: options.workspaceDir?.(state.sessionId),
180
+ command: options.command,
181
+ runner: options.runner,
182
+ now: options.now,
183
+ report: options.report,
184
+ enabled: () => uploadAllowed(options.noHistory),
185
+ });
186
+ activeSessionId = state.sessionId;
187
+ if (prior)
188
+ void prior.close();
189
+ return active;
190
+ };
191
+ const disposeTurn = options.source.onTurnEnd((result) => {
192
+ if (disposed)
193
+ return;
194
+ reconcile();
195
+ const state = options.source.getState();
196
+ void uploaderFor(state)?.recordTurn(result.status);
197
+ });
198
+ const disposeState = options.source.subscribe(() => {
199
+ if (!disposed)
200
+ reconcile();
201
+ });
202
+ return {
203
+ async close() {
204
+ if (disposed)
205
+ return;
206
+ disposed = true;
207
+ disposeTurn();
208
+ disposeState();
209
+ await closeActive();
210
+ },
211
+ dispose() {
212
+ if (disposed)
213
+ return;
214
+ disposed = true;
215
+ disposeTurn();
216
+ disposeState();
217
+ void closeActive();
218
+ },
219
+ };
220
+ }
221
+ //# sourceMappingURL=omnirush-session-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omnirush-session-upload.js","sourceRoot":"","sources":["../../src/llm/omnirush-session-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type LlmProvider } from "./provider.js";
2
+ export declare const omnirushFallbackModels: readonly string[];
3
+ export declare function resetOmnirushModelCache(): void;
4
+ export declare const omnirushProvider: LlmProvider;