@theruansilva/omp-web 2.2.1 → 2.3.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 (107) hide show
  1. package/dist/client/assets/{CodeViewer-B61IQaP0.js → CodeViewer-DHlYSlFA.js} +2 -2
  2. package/dist/client/assets/TerminalPanel-B7ErBads.js +126 -0
  3. package/dist/client/assets/{UnifiedDiffViewer-BnFQlZDg.js → UnifiedDiffViewer-Bsxe8vEO.js} +1 -1
  4. package/dist/client/assets/{abnfDiagram-O67JEVCF-BCWHgm_-.js → abnfDiagram-O67JEVCF-Bd6-T6CG.js} +1 -1
  5. package/dist/client/assets/{arc-BUpZciy9.js → arc-Cx4UzFEe.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-NJMV4G6O-CVWCwiqh.js → architectureDiagram-NJMV4G6O-DNZZOJHJ.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-BEXU5L5S-W5WSJa_J.js → blockDiagram-BEXU5L5S-DLGMX1ky.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YGBWAQC7-BWpacECA.js → c4Diagram-YGBWAQC7-ZicrYBFE.js} +1 -1
  9. package/dist/client/assets/channel-Cy0oVDAk.js +1 -0
  10. package/dist/client/assets/{chunk-2Q5K7J3B-D0TV4T28.js → chunk-2Q5K7J3B-BTdneniS.js} +1 -1
  11. package/dist/client/assets/{chunk-3FUC2YCW-BlkJ2B9v.js → chunk-3FUC2YCW-DClqbl7t.js} +2 -2
  12. package/dist/client/assets/{chunk-5VM5RSS4-LRh3HbZr.js → chunk-5VM5RSS4-xVtxN_Sa.js} +1 -1
  13. package/dist/client/assets/{chunk-GTNCS2PH-CBiTovUf.js → chunk-GTNCS2PH-Da56Sthk.js} +1 -1
  14. package/dist/client/assets/{chunk-GWA4HPMP-Dnu3R9yI.js → chunk-GWA4HPMP-D40kcLEo.js} +1 -1
  15. package/dist/client/assets/{chunk-JWPE2WC7-C2yjQs6c.js → chunk-JWPE2WC7-CVgZV6Wp.js} +1 -1
  16. package/dist/client/assets/{chunk-NETBCI7D-Dxos4L3P.js → chunk-NETBCI7D-DNI4Nu1k.js} +1 -1
  17. package/dist/client/assets/{chunk-WEXAMYUT-DrLvxPom.js → chunk-WEXAMYUT-IVsvOCJJ.js} +1 -1
  18. package/dist/client/assets/{chunk-XXDRQBXY-Cub_nego.js → chunk-XXDRQBXY-ByZI65OQ.js} +1 -1
  19. package/dist/client/assets/{classDiagram-v2-NBCMYWYE-CIe2lhk7.js → classDiagram-v2-NBCMYWYE-CT9N6_lF.js} +1 -1
  20. package/dist/client/assets/{cose-bilkent-JH36ORCC-DOGZoTZg.js → cose-bilkent-JH36ORCC-CBJJYOd5.js} +1 -1
  21. package/dist/client/assets/{cynefin-OW5HDTMX-DXF0a63d.js → cynefin-OW5HDTMX-BUpMG_46.js} +1 -1
  22. package/dist/client/assets/{cynefinDiagram-VND7K2PF-C_Qmhc8V.js → cynefinDiagram-VND7K2PF-otEJqM7K.js} +1 -1
  23. package/dist/client/assets/{dagre-6A5THRUB-CEhDrD4X.js → dagre-6A5THRUB-qquzH4Ev.js} +1 -1
  24. package/dist/client/assets/{diagram-22UHCM2B-CgN81sDZ.js → diagram-22UHCM2B-HDLtgJRK.js} +1 -1
  25. package/dist/client/assets/{diagram-3UASUU5V-Dk1gOSew.js → diagram-3UASUU5V-Bc2_UO5k.js} +1 -1
  26. package/dist/client/assets/{diagram-ATOU4E4O-C_tcqhr3.js → diagram-ATOU4E4O-DR72H135.js} +1 -1
  27. package/dist/client/assets/{diagram-CDSNMT55-Dj-WM3vk.js → diagram-CDSNMT55-hNm66Cr9.js} +1 -1
  28. package/dist/client/assets/{diagram-MLGK6HIB-CDowox_d.js → diagram-MLGK6HIB-ChaEhVd4.js} +1 -1
  29. package/dist/client/assets/{diagram-MPIPVDR6-CaThzNCZ.js → diagram-MPIPVDR6-gYxYar4V.js} +1 -1
  30. package/dist/client/assets/{ebnfDiagram-ZINNZB2B-BZbLdwcz.js → ebnfDiagram-ZINNZB2B-CRQjE5YW.js} +1 -1
  31. package/dist/client/assets/{elk-276RUBZZ-DGku1nk-.js → elk-276RUBZZ-OZ3Zw5zt.js} +1 -1
  32. package/dist/client/assets/{erDiagram-OPXOYQCR-D0nJ53i7.js → erDiagram-OPXOYQCR-CB71jEyA.js} +1 -1
  33. package/dist/client/assets/{flowDiagram-KWPJA3E3-DeB8-O7Y.js → flowDiagram-KWPJA3E3-CYfjFu_3.js} +1 -1
  34. package/dist/client/assets/{ganttDiagram-FUAMR5RP-CBcW8sXy.js → ganttDiagram-FUAMR5RP-BE7B_UzV.js} +1 -1
  35. package/dist/client/assets/{gitGraphDiagram-X574FWY7-CC-b8FLq.js → gitGraphDiagram-X574FWY7-HBid3FDo.js} +1 -1
  36. package/dist/client/assets/{index-CyN73uMY.js → index-C-cQEbCY.js} +358 -333
  37. package/dist/client/assets/{infoDiagram-VRGFBTTK-DL3QMN01.js → infoDiagram-VRGFBTTK-4JprhzHA.js} +1 -1
  38. package/dist/client/assets/{ishikawaDiagram-OU5B5YK6-Brt56LtP.js → ishikawaDiagram-OU5B5YK6-UAP9bqUn.js} +1 -1
  39. package/dist/client/assets/{journeyDiagram-ZHPQQLJL-Df8VwbDr.js → journeyDiagram-ZHPQQLJL-j9c9R8jU.js} +1 -1
  40. package/dist/client/assets/{kanban-definition-PNTS6WVX-cVbdWfVg.js → kanban-definition-PNTS6WVX-DWQBxist.js} +1 -1
  41. package/dist/client/assets/{linear-DugbH7BO.js → linear-T6d_7ZeJ.js} +1 -1
  42. package/dist/client/assets/{mindmap-definition-NLK3R4M7-BDqwqJMJ.js → mindmap-definition-NLK3R4M7-CvMFAKuS.js} +1 -1
  43. package/dist/client/assets/{pegDiagram-GJSIUBJH-w6CrSKt0.js → pegDiagram-GJSIUBJH-hvF632kF.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-5QR66LMP-D0utByOI.js → pieDiagram-5QR66LMP-BXICkLn_.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-O4NWA36T-DIAIplx2.js → quadrantDiagram-O4NWA36T-CnFY0fxq.js} +1 -1
  46. package/dist/client/assets/{railroadDiagram-XR7U4H2S-BX9P-jy7.js → railroadDiagram-XR7U4H2S-BeRVo7yu.js} +1 -1
  47. package/dist/client/assets/{requirementDiagram-PLB6GJNP-C55JlmRI.js → requirementDiagram-PLB6GJNP-DmnKxfFp.js} +1 -1
  48. package/dist/client/assets/{sankeyDiagram-IPEJSGJF-VeHnKI-a.js → sankeyDiagram-IPEJSGJF-Bz1YIaMr.js} +1 -1
  49. package/dist/client/assets/{sequenceDiagram-PO4LG4MO-CTUoXviF.js → sequenceDiagram-PO4LG4MO-4cmBIYSV.js} +1 -1
  50. package/dist/client/assets/{sizeCapture-INFHLROL-DBKjJDUZ.js → sizeCapture-INFHLROL-B6mTYfgL.js} +1 -1
  51. package/dist/client/assets/{stateDiagram-v2-GCMORJYK-DzonJh3D.js → stateDiagram-v2-GCMORJYK-BKkiHc4R.js} +1 -1
  52. package/dist/client/assets/{swimlanes-2SLR337P-Cnsd5mvJ.js → swimlanes-2SLR337P-CBONvDhF.js} +1 -1
  53. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-DUA_t92u.js +8 -0
  54. package/dist/client/assets/{timeline-definition-EJHVYXUP-C9nhaxck.js → timeline-definition-EJHVYXUP-BG9z7YWj.js} +1 -1
  55. package/dist/client/assets/{usecaseDiagram-POWQR4AR-jfXBWSzR.js → usecaseDiagram-POWQR4AR--yXc6tgF.js} +1 -1
  56. package/dist/client/assets/{vendor-editor-core-D-5q2tVX.js → vendor-editor-core-DbsheCh1.js} +30 -29
  57. package/dist/client/assets/vendor-editor-languages-B1l-thbw.js +26 -0
  58. package/dist/client/assets/{vennDiagram-UO4OBE2U-BigR6haV.js → vennDiagram-UO4OBE2U-DYr42cwJ.js} +1 -1
  59. package/dist/client/assets/{wardleyDiagram-VNRHLVJA-BXJexKTM.js → wardleyDiagram-VNRHLVJA-DksCy2aR.js} +1 -1
  60. package/dist/client/assets/{xychartDiagram-PMCCYNJV-HL5cuxsZ.js → xychartDiagram-PMCCYNJV-DPxnNxcI.js} +1 -1
  61. package/dist/client/index.html +3 -3
  62. package/dist/config.js +10 -0
  63. package/dist/config.js.map +1 -1
  64. package/dist/omp-web-plugins/updates/updatesLogic.js +2 -2
  65. package/dist/omp-web-plugins/usage/omp-web-plugin.js +41 -0
  66. package/dist/omp-web-plugins/usage/package.json +9 -0
  67. package/dist/omp-web-plugins/usage/types.js +2 -0
  68. package/dist/omp-web-plugins/usage/usageLogic.js +162 -0
  69. package/dist/omp-web-plugins/usage/usagePanelElement.js +442 -0
  70. package/dist/server/app.js +36 -1
  71. package/dist/server/app.js.map +1 -1
  72. package/dist/server/index.js +11 -3
  73. package/dist/server/index.js.map +1 -1
  74. package/dist/server/machines/machineProxyRoutes.js +16 -1
  75. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  76. package/dist/server/machines/machineService.js +5 -5
  77. package/dist/server/machines/machineService.js.map +1 -1
  78. package/dist/server/mcpRoutes.js +11 -1
  79. package/dist/server/mcpRoutes.js.map +1 -1
  80. package/dist/server/projects/projectService.js +23 -0
  81. package/dist/server/projects/projectService.js.map +1 -1
  82. package/dist/server/security.js +110 -7
  83. package/dist/server/security.js.map +1 -1
  84. package/dist/server/sessions/authService.js +23 -3
  85. package/dist/server/sessions/authService.js.map +1 -1
  86. package/dist/server/sessions/generativeUiPrompt.js +44 -0
  87. package/dist/server/sessions/generativeUiPrompt.js.map +1 -0
  88. package/dist/server/sessions/piAgentSession.js +46 -1
  89. package/dist/server/sessions/piAgentSession.js.map +1 -1
  90. package/dist/server/sessions/piSessionService.js +3 -1
  91. package/dist/server/sessions/piSessionService.js.map +1 -1
  92. package/dist/server/sessions/sessionCommandService.js +20 -9
  93. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  94. package/dist/server/terminalProxyRoutes.js +16 -1
  95. package/dist/server/terminalProxyRoutes.js.map +1 -1
  96. package/dist/server/usageRoutes.js +202 -0
  97. package/dist/server/usageRoutes.js.map +1 -0
  98. package/dist/server/webSocketBridge.js +15 -0
  99. package/dist/server/webSocketBridge.js.map +1 -1
  100. package/dist/shared/apiTypes.d.ts +2 -0
  101. package/dist/shared/federatedRoutes.js +2 -0
  102. package/dist/shared/federatedRoutes.js.map +1 -1
  103. package/package.json +1 -1
  104. package/dist/client/assets/TerminalPanel-BcxMZQKk.js +0 -126
  105. package/dist/client/assets/channel-ChkqWR3Z.js +0 -1
  106. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-iyBCc4Xc.js +0 -8
  107. package/dist/client/assets/vendor-editor-languages-B6WRt0aC.js +0 -26
@@ -0,0 +1,442 @@
1
+ // Generated from omp-web-plugins/usage/usagePanelElement.ts. Do not edit directly.
2
+ import { aggregateProviderStatus, countActiveProviders, countWarningOrExhausted, formatCapacityWindow, formatProviderName, formatTimeAgo, getLimitProgress, } from "./usageLogic.js";
3
+ export const usagePanelTagName = "omp-web-usage-panel";
4
+ const panelCache = new Map();
5
+ export function defineUsagePanelElement() {
6
+ if (!customElements.get(usagePanelTagName)) {
7
+ customElements.define(usagePanelTagName, OmpWebUsagePanel);
8
+ }
9
+ }
10
+ export function usageBadge(_context) {
11
+ return undefined;
12
+ }
13
+ class OmpWebUsagePanel extends HTMLElement {
14
+ contextValue;
15
+ root;
16
+ pollTimer;
17
+ currentKey;
18
+ isRefreshing = false;
19
+ constructor() {
20
+ super();
21
+ this.root = this.attachShadow({ mode: "open" });
22
+ }
23
+ set context(value) {
24
+ const prevKey = this.currentKey;
25
+ const newKey = value ? cacheKeyForContext(value) : undefined;
26
+ this.contextValue = value;
27
+ this.currentKey = newKey;
28
+ if (value && newKey !== prevKey) {
29
+ void this.loadUsage(value, false);
30
+ }
31
+ else {
32
+ this.render();
33
+ }
34
+ }
35
+ connectedCallback() {
36
+ this.render();
37
+ this.pollTimer = setInterval(() => {
38
+ if (this.contextValue && !this.isRefreshing) {
39
+ void this.loadUsage(this.contextValue, false);
40
+ }
41
+ }, 60000);
42
+ }
43
+ disconnectedCallback() {
44
+ if (this.pollTimer !== undefined) {
45
+ clearInterval(this.pollTimer);
46
+ this.pollTimer = undefined;
47
+ }
48
+ }
49
+ async loadUsage(context, refresh = false) {
50
+ const key = cacheKeyForContext(context);
51
+ this.isRefreshing = true;
52
+ const cached = panelCache.get(key);
53
+ if (!cached || cached.kind !== "loaded") {
54
+ panelCache.set(key, { kind: "loading" });
55
+ this.render();
56
+ }
57
+ else {
58
+ panelCache.set(key, { ...cached, isRefreshing: true });
59
+ this.render();
60
+ }
61
+ try {
62
+ const endpoint = refresh ? "/usage?refresh=true" : "/usage";
63
+ const response = await context.apiFetch(endpoint);
64
+ if (!response.ok) {
65
+ throw new Error(`Failed to load usage (HTTP ${response.status})`);
66
+ }
67
+ const data = (await response.json());
68
+ panelCache.set(key, { kind: "loaded", data, isRefreshing: false });
69
+ }
70
+ catch (err) {
71
+ const message = err instanceof Error ? err.message : String(err);
72
+ if (cached && cached.kind === "loaded") {
73
+ panelCache.set(key, {
74
+ ...cached,
75
+ isRefreshing: false,
76
+ data: { ...cached.data, error: message },
77
+ });
78
+ }
79
+ else {
80
+ panelCache.set(key, { kind: "error", message });
81
+ }
82
+ }
83
+ finally {
84
+ this.isRefreshing = false;
85
+ this.render();
86
+ }
87
+ }
88
+ render() {
89
+ const context = this.contextValue;
90
+ if (context === undefined) {
91
+ this.root.innerHTML = `${panelStyles()}<section class="empty">Select a workspace.</section>`;
92
+ return;
93
+ }
94
+ const key = cacheKeyForContext(context);
95
+ const state = panelCache.get(key) ?? { kind: "loading" };
96
+ const isLoading = state.kind === "loading";
97
+ const isRefreshing = state.kind === "loaded" && state.isRefreshing === true;
98
+ let activeCount = 0;
99
+ let warningsCount = 0;
100
+ let exhaustedCount = 0;
101
+ let fetchedAgo = "";
102
+ if (state.kind === "loaded") {
103
+ activeCount = countActiveProviders(state.data);
104
+ const counts = countWarningOrExhausted(state.data);
105
+ warningsCount = counts.warnings;
106
+ exhaustedCount = counts.exhausted;
107
+ fetchedAgo = formatTimeAgo(state.data.generatedAt);
108
+ }
109
+ this.root.innerHTML = `
110
+ ${panelStyles()}
111
+ <section class="toolbar">
112
+ <div class="toolbar-title">
113
+ <strong>Provider Usage</strong>
114
+ ${state.kind === "loaded" ? `
115
+ <span class="badge ${activeCount > 0 ? "active" : ""}">
116
+ ${activeCount} provider${activeCount === 1 ? "" : "s"}
117
+ ${exhaustedCount > 0 ? `<span class="badge-exhausted">· ${exhaustedCount} exhausted</span>` : ""}
118
+ ${warningsCount > 0 ? `<span class="badge-warning">· ${warningsCount} warning</span>` : ""}
119
+ </span>
120
+ ` : ""}
121
+ </div>
122
+ <div class="toolbar-actions">
123
+ ${fetchedAgo ? `<span class="last-fetched">${escapeHtml(fetchedAgo)}</span>` : ""}
124
+ <button class="secondary btn-refresh" data-refresh ${isLoading || isRefreshing ? "disabled" : ""}>
125
+ ${isRefreshing ? "Refreshing…" : "Refresh"}
126
+ </button>
127
+ </div>
128
+ </section>
129
+ <section class="viewer">
130
+ ${this.renderContent(state)}
131
+ </section>
132
+ `;
133
+ this.attachEventListeners(context);
134
+ }
135
+ renderContent(state) {
136
+ if (state.kind === "loading") {
137
+ return `<p class="muted">Loading provider usage data…</p>`;
138
+ }
139
+ if (state.kind === "error") {
140
+ return `<div class="status error">${escapeHtml(state.message)}</div>`;
141
+ }
142
+ const { data } = state;
143
+ let html = "";
144
+ if (data.error) {
145
+ html += `<div class="status warning banner-warning">⚠️ ${escapeHtml(data.error)}</div>`;
146
+ }
147
+ // Capacity Overview (if available)
148
+ if (data.capacity && Object.keys(data.capacity).length > 0) {
149
+ html += this.renderCapacitySection(data.capacity);
150
+ }
151
+ // Reports Section (Provider Cards)
152
+ if (data.reports.length === 0) {
153
+ html += `
154
+ <div class="empty-box">
155
+ <p class="muted">No provider usage reports found.</p>
156
+ <p class="muted-small">Make sure you have logged in to at least one provider using <code>/login</code> or configured API keys.</p>
157
+ </div>
158
+ `;
159
+ }
160
+ else {
161
+ html += `<div class="providers-list">`;
162
+ // Sort reports: exhausted first, then warning, then ok, then by name
163
+ const sorted = [...data.reports].sort((a, b) => {
164
+ const order = { exhausted: 0, warning: 1, ok: 2, unknown: 3 };
165
+ const statusA = aggregateProviderStatus(a);
166
+ const statusB = aggregateProviderStatus(b);
167
+ if (order[statusA] !== order[statusB]) {
168
+ return order[statusA] - order[statusB];
169
+ }
170
+ return a.provider.localeCompare(b.provider);
171
+ });
172
+ for (const report of sorted) {
173
+ html += this.renderProviderCard(report);
174
+ }
175
+ html += `</div>`;
176
+ }
177
+ // Accounts Without Usage API (if any)
178
+ if (data.accountsWithoutUsage && data.accountsWithoutUsage.length > 0) {
179
+ html += `
180
+ <details class="collapsible-section">
181
+ <summary class="section-summary">
182
+ Accounts without quota API (${data.accountsWithoutUsage.length})
183
+ </summary>
184
+ <div class="accounts-without-usage-list">
185
+ ${data.accountsWithoutUsage
186
+ .map((acc) => `
187
+ <div class="unsupported-row">
188
+ <span class="unsupported-provider">${escapeHtml(formatProviderName(acc.provider))}</span>
189
+ <span class="unsupported-email">${escapeHtml(acc.email ?? acc.accountId ?? "account")}</span>
190
+ </div>
191
+ `)
192
+ .join("")}
193
+ </div>
194
+ </details>
195
+ `;
196
+ }
197
+ // Disabled Credentials (if any)
198
+ if (data.disabledCredentials && data.disabledCredentials.length > 0) {
199
+ html += `
200
+ <div class="status error banner-disabled">
201
+ <strong>Disabled Credentials (${data.disabledCredentials.length})</strong>
202
+ ${data.disabledCredentials
203
+ .map((d) => `
204
+ <div class="disabled-row">
205
+ <span>${escapeHtml(formatProviderName(d.provider))}: ${escapeHtml(d.email ?? d.accountId ?? "account")}</span>
206
+ ${d.reason ? `<span class="muted-small">${escapeHtml(d.reason)}</span>` : ""}
207
+ </div>
208
+ `)
209
+ .join("")}
210
+ </div>
211
+ `;
212
+ }
213
+ // Quick Command Shortcuts
214
+ html += `
215
+ <section class="shortcuts-group">
216
+ <span class="group-title">Oh My Pi Commands</span>
217
+ <div class="shortcut-buttons">
218
+ <button data-prompt="/usage" class="secondary">/usage</button>
219
+ <button data-prompt="/usage reset" class="secondary">/usage reset</button>
220
+ <button data-prompt="/login" class="secondary">/login</button>
221
+ </div>
222
+ </section>
223
+ `;
224
+ return html;
225
+ }
226
+ renderCapacitySection(capacity) {
227
+ let cardsHtml = "";
228
+ for (const [provider, stats] of Object.entries(capacity)) {
229
+ for (const stat of stats) {
230
+ const title = `${formatProviderName(provider)} (${stat.window})`;
231
+ const summary = formatCapacityWindow(stat);
232
+ const percent = Math.min(100, Math.round((stat.usedAccounts / Math.max(1, stat.accounts)) * 100));
233
+ cardsHtml += `
234
+ <div class="capacity-card">
235
+ <div class="capacity-header">
236
+ <span class="capacity-title">${escapeHtml(title)}</span>
237
+ <span class="capacity-percent">${percent}%</span>
238
+ </div>
239
+ <div class="progress-track small">
240
+ <div class="progress-bar ${percent >= 90 ? "ex" : percent >= 75 ? "warn" : "ok"}" style="width: ${percent}%"></div>
241
+ </div>
242
+ <div class="capacity-sub">${escapeHtml(summary)}</div>
243
+ </div>
244
+ `;
245
+ }
246
+ }
247
+ if (!cardsHtml)
248
+ return "";
249
+ return `
250
+ <section class="capacity-section">
251
+ <span class="group-title">Capacity Overview</span>
252
+ <div class="capacity-grid">
253
+ ${cardsHtml}
254
+ </div>
255
+ </section>
256
+ `;
257
+ }
258
+ renderProviderCard(report) {
259
+ const status = aggregateProviderStatus(report);
260
+ const providerName = formatProviderName(report.provider);
261
+ const accountEmail = report.metadata?.email ?? report.metadata?.accountId;
262
+ const plan = report.metadata?.planType;
263
+ const resetCredits = report.resetCredits?.availableCount ?? 0;
264
+ let html = `
265
+ <div class="provider-card status-${status}">
266
+ <div class="card-header">
267
+ <div class="header-left">
268
+ <span class="status-dot ${status}"></span>
269
+ <strong class="provider-title">${escapeHtml(providerName)}</strong>
270
+ ${plan ? `<span class="tag plan">${escapeHtml(plan)}</span>` : ""}
271
+ </div>
272
+ ${accountEmail ? `<span class="account-email" title="${escapeAttr(accountEmail)}">${escapeHtml(accountEmail)}</span>` : ""}
273
+ </div>
274
+ `;
275
+ if (resetCredits > 0) {
276
+ html += `
277
+ <div class="reset-credits-banner">
278
+ <span>✨ <strong>${resetCredits}</strong> saved rate-limit reset${resetCredits === 1 ? "" : "s"} available</span>
279
+ <button class="secondary xs" data-prompt="/usage reset">Redeem</button>
280
+ </div>
281
+ `;
282
+ }
283
+ // Limits
284
+ if (report.limits.length > 0) {
285
+ html += `<div class="limits-list">`;
286
+ for (const limit of report.limits) {
287
+ html += this.renderLimitRow(limit);
288
+ }
289
+ html += `</div>`;
290
+ }
291
+ else if (report.notes && report.notes.length > 0) {
292
+ html += `
293
+ <div class="notes-box">
294
+ ${report.notes.map((n) => `<p class="muted-note">${escapeHtml(n)}</p>`).join("")}
295
+ </div>
296
+ `;
297
+ }
298
+ else {
299
+ html += `<p class="muted no-limits">No specific quota limits reported</p>`;
300
+ }
301
+ html += `</div>`;
302
+ return html;
303
+ }
304
+ renderLimitRow(limit) {
305
+ const progress = getLimitProgress(limit);
306
+ const windowLabel = limit.window?.label ?? limit.scope?.windowId;
307
+ const labelWithWindow = windowLabel ? `${limit.label} · ${windowLabel}` : limit.label;
308
+ return `
309
+ <div class="limit-row">
310
+ <div class="limit-header">
311
+ <span class="limit-name">${escapeHtml(labelWithWindow)}</span>
312
+ <div class="limit-figures">
313
+ <span class="limit-percent" style="color: ${progress.statusColor}">${progress.percentUsed}% used</span>
314
+ ${progress.resetsInText ? `<span class="limit-reset">${escapeHtml(progress.resetsInText)}</span>` : ""}
315
+ </div>
316
+ </div>
317
+ <div class="progress-track">
318
+ <div class="progress-bar ${progress.status === "exhausted" ? "ex" : progress.status === "warning" ? "warn" : "ok"}" style="width: ${progress.percentUsed}%; background-color: ${progress.statusColor}"></div>
319
+ </div>
320
+ </div>
321
+ `;
322
+ }
323
+ attachEventListeners(context) {
324
+ const refreshBtn = this.root.querySelector("button[data-refresh]");
325
+ if (refreshBtn) {
326
+ refreshBtn.addEventListener("click", () => {
327
+ void this.loadUsage(context, true);
328
+ });
329
+ }
330
+ this.root.querySelectorAll("button[data-prompt]").forEach((btn) => {
331
+ btn.addEventListener("click", () => {
332
+ const promptText = btn.getAttribute("data-prompt");
333
+ if (promptText) {
334
+ context.prompt.insertText(promptText);
335
+ }
336
+ });
337
+ });
338
+ }
339
+ }
340
+ function cacheKeyForContext(context) {
341
+ return context.machine.id || "local";
342
+ }
343
+ function escapeHtml(value) {
344
+ return String(value).replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
345
+ }
346
+ function escapeAttr(value) {
347
+ return escapeHtml(value).replaceAll('"', "&quot;");
348
+ }
349
+ function panelStyles() {
350
+ return `
351
+ <style>
352
+ :host { display: contents; }
353
+ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--pi-border-muted); }
354
+ .toolbar-title { display: flex; align-items: center; gap: 8px; }
355
+ .toolbar-actions { display: flex; align-items: center; gap: 8px; }
356
+ .last-fetched { font-size: 11px; color: var(--pi-muted); }
357
+ .viewer { box-sizing: border-box; min-height: 0; overflow: auto; padding: 12px; display: flex; flex-direction: column; gap: 14px; }
358
+
359
+ .group-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--pi-muted); }
360
+
361
+ .capacity-section { display: flex; flex-direction: column; gap: 8px; }
362
+ .capacity-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
363
+ .capacity-card { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border-radius: 6px; background: var(--pi-surface); border: 1px solid var(--pi-border); }
364
+ .capacity-header { display: flex; justify-content: space-between; align-items: center; font-size: 11px; }
365
+ .capacity-title { font-weight: 500; color: var(--pi-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
366
+ .capacity-percent { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; color: var(--pi-text); }
367
+ .capacity-sub { font-size: 10px; color: var(--pi-muted); }
368
+
369
+ .providers-list { display: flex; flex-direction: column; gap: 10px; }
370
+ .provider-card { display: flex; flex-direction: column; gap: 8px; border: 1px solid var(--pi-border); border-radius: 8px; background: var(--pi-surface); padding: 10px 12px; }
371
+ .provider-card.status-exhausted { border-color: rgba(239, 68, 68, 0.4); background: rgba(239, 68, 68, 0.03); }
372
+ .provider-card.status-warning { border-color: rgba(234, 179, 8, 0.35); }
373
+
374
+ .card-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
375
+ .header-left { display: flex; align-items: center; gap: 6px; }
376
+ .provider-title { font-size: 13px; color: var(--pi-text); font-weight: 600; }
377
+ .account-email { font-size: 11px; color: var(--pi-muted); max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
378
+
379
+ .status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--pi-muted); flex-shrink: 0; }
380
+ .status-dot.ok { background: #22c55e; }
381
+ .status-dot.warning { background: #eab308; }
382
+ .status-dot.exhausted { background: #ef4444; }
383
+ .status-dot.unknown { background: var(--pi-muted); }
384
+
385
+ .tag { font-size: 10px; padding: 1px 5px; border-radius: 4px; border: 1px solid var(--pi-border-muted); color: var(--pi-muted); text-transform: uppercase; }
386
+ .tag.plan { color: var(--pi-accent); border-color: var(--pi-accent-border); }
387
+
388
+ .reset-credits-banner { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 8px; border-radius: 6px; background: rgba(34, 197, 94, 0.08); border: 1px solid rgba(34, 197, 94, 0.25); font-size: 11px; color: var(--pi-text); }
389
+
390
+ .limits-list { display: flex; flex-direction: column; gap: 8px; padding-top: 4px; }
391
+ .limit-row { display: flex; flex-direction: column; gap: 4px; }
392
+ .limit-header { display: flex; justify-content: space-between; align-items: baseline; gap: 6px; font-size: 11px; }
393
+ .limit-name { color: var(--pi-text); font-weight: 500; }
394
+ .limit-figures { display: flex; align-items: baseline; gap: 8px; flex-shrink: 0; }
395
+ .limit-percent { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; }
396
+ .limit-reset { color: var(--pi-muted); font-size: 10px; }
397
+
398
+ .progress-track { width: 100%; height: 6px; border-radius: 3px; background: var(--pi-border-muted); overflow: hidden; }
399
+ .progress-track.small { height: 4px; }
400
+ .progress-bar { height: 100%; border-radius: 3px; transition: width 0.3s ease; }
401
+ .progress-bar.ok { background: #22c55e; }
402
+ .progress-bar.warn { background: #eab308; }
403
+ .progress-bar.ex { background: #ef4444; }
404
+
405
+ .badge { font-size: 11px; padding: 2px 7px; border-radius: 10px; background: var(--pi-surface); border: 1px solid var(--pi-border); color: var(--pi-muted); }
406
+ .badge.active { border-color: #22c55e44; color: #22c55e; }
407
+ .badge-warning { color: #eab308; font-weight: 600; }
408
+ .badge-exhausted { color: #ef4444; font-weight: 600; }
409
+
410
+ .notes-box { padding: 6px 8px; border-radius: 6px; background: var(--pi-bg); border: 1px solid var(--pi-border-muted); font-size: 11px; color: var(--pi-muted); }
411
+ .muted-note { margin: 0; line-height: 1.4; }
412
+ .no-limits { font-size: 11px; color: var(--pi-muted); font-style: italic; }
413
+
414
+ .collapsible-section { border: 1px solid var(--pi-border-muted); border-radius: 6px; padding: 6px 10px; }
415
+ .section-summary { font-size: 11px; font-weight: 600; color: var(--pi-muted); cursor: pointer; user-select: none; }
416
+ .accounts-without-usage-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
417
+ .unsupported-row { display: flex; justify-content: space-between; font-size: 11px; padding: 3px 0; border-bottom: 1px solid var(--pi-border-muted); }
418
+ .unsupported-provider { font-weight: 500; color: var(--pi-text); }
419
+ .unsupported-email { color: var(--pi-muted); }
420
+
421
+ .banner-disabled { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border-radius: 6px; font-size: 11px; }
422
+ .disabled-row { display: flex; flex-direction: column; gap: 2px; }
423
+
424
+ .shortcuts-group { display: flex; flex-direction: column; gap: 8px; padding-top: 8px; border-top: 1px solid var(--pi-border-muted); }
425
+ .shortcut-buttons { display: flex; flex-wrap: wrap; gap: 6px; }
426
+
427
+ button { border: 1px solid var(--pi-accent-border); border-radius: 6px; background: var(--pi-accent); color: var(--pi-bg); cursor: pointer; padding: 5px 9px; font: inherit; font-size: 12px; }
428
+ button.secondary { border-color: var(--pi-border); background: var(--pi-surface); color: var(--pi-text); }
429
+ button.xs { padding: 2px 6px; font-size: 10px; border-radius: 4px; }
430
+ button:disabled { cursor: wait; opacity: 0.65; }
431
+
432
+ .muted { color: var(--pi-muted); font-size: 12px; margin: 0; }
433
+ .muted-small { color: var(--pi-muted); font-size: 11px; margin: 0; }
434
+ .status { border: 1px solid var(--pi-border); border-radius: 8px; padding: 10px; color: var(--pi-muted); font-size: 12px; }
435
+ .status.error { border-color: var(--pi-danger); color: var(--pi-danger); }
436
+ .status.warning { border-color: rgba(234, 179, 8, 0.4); color: var(--pi-text); }
437
+ .empty { padding: 16px; color: var(--pi-muted); font-size: 12px; }
438
+ .empty-box { display: flex; flex-direction: column; gap: 6px; padding: 14px; border: 1px dashed var(--pi-border); border-radius: 8px; text-align: center; }
439
+ code { border: 1px solid var(--pi-border-muted); border-radius: 4px; background: var(--pi-bg); color: var(--pi-text-secondary); font: 11px ui-monospace, SFMono-Regular, Menlo, monospace; padding: 1px 4px; }
440
+ </style>
441
+ `;
442
+ }
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { Hono } from "hono";
5
- import { createSecurityMiddleware } from "./security.js";
5
+ import { createSecurityMiddleware, getOrGenerateAuthToken, parseCookie, safeTokenCompare } from "./security.js";
6
6
  import { createBunWebSocket } from "hono/bun";
7
7
  import { serveStatic } from "hono/bun";
8
8
  import { ProjectStore } from "./storage/projectStore.js";
@@ -32,6 +32,7 @@ import { proxyMachinePluginAsset, registerMachinePluginProxyRoutes } from "./mac
32
32
  import { PushNotificationService } from "./push/PushNotificationService.js";
33
33
  import { registerPushRoutes } from "./push/pushRoutes.js";
34
34
  import { registerMcpRoutes } from "./mcpRoutes.js";
35
+ import { registerUsageRoutes } from "./usageRoutes.js";
35
36
  function registerLocalProjectRoutes(app, projects, workspaces, prefix, options = {}) {
36
37
  app.get(`${prefix}/projects`, async (c) => c.json(await projects.list()));
37
38
  app.post(`${prefix}/projects`, async (c) => {
@@ -124,8 +125,12 @@ export async function buildApp(deps = {}) {
124
125
  }
125
126
  return cachedAllowedHosts;
126
127
  };
128
+ const authRequired = deps.authRequired ?? (effectiveConfig.authRequired ?? (process.env["OMP_WEB_AUTH_REQUIRED"] === "1" || process.env["OMP_WEB_AUTH_REQUIRED"] === "true"));
129
+ const authToken = deps.authToken ?? effectiveConfig.authToken ?? getOrGenerateAuthToken();
127
130
  app.use("*", createSecurityMiddleware({
128
131
  allowedHosts: getAllowedHosts,
132
+ authRequired,
133
+ authToken,
129
134
  }));
130
135
  const { upgradeWebSocket, websocket } = createBunWebSocket();
131
136
  const projects = deps.projects ?? new ProjectService(new ProjectStore());
@@ -153,6 +158,33 @@ export async function buildApp(deps = {}) {
153
158
  headers: { "Content-Type": asset.contentType },
154
159
  });
155
160
  });
161
+ app.post("/api/omp-web/auth", async (c) => {
162
+ try {
163
+ const body = await c.req.json().catch(() => ({}));
164
+ const candidate = body.token?.trim();
165
+ if (!candidate || !safeTokenCompare(candidate, authToken)) {
166
+ return c.json({ error: "Invalid auth token" }, 401);
167
+ }
168
+ c.header("Set-Cookie", `omp_web_token=${encodeURIComponent(candidate)}; Path=/; HttpOnly; SameSite=Lax`);
169
+ return c.json({ ok: true });
170
+ }
171
+ catch (error) {
172
+ return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
173
+ }
174
+ });
175
+ app.delete("/api/omp-web/auth", async (c) => {
176
+ c.header("Set-Cookie", "omp_web_token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; SameSite=Lax");
177
+ return c.json({ ok: true });
178
+ });
179
+ app.get("/api/omp-web/auth", async (c) => {
180
+ const authHeader = c.req.header("authorization");
181
+ const bearerToken = authHeader?.startsWith("Bearer ") ? authHeader.slice(7).trim() : undefined;
182
+ const cookieToken = parseCookie(c.req.header("cookie"), "omp_web_token");
183
+ const queryToken = c.req.query("token");
184
+ const token = bearerToken ?? cookieToken ?? queryToken;
185
+ const authenticated = !authRequired || safeTokenCompare(token, authToken);
186
+ return c.json({ authenticated, authRequired });
187
+ });
156
188
  app.get("/api/omp-web/status", async (c) => c.json(await ompWebStatusCache.get()));
157
189
  app.get("/api/omp-web/version", async (c) => c.json(await getOmpWebVersionStatus(sessionDaemon)));
158
190
  app.get("/api/omp-web/runtime", async (c) => c.json(await getOmpWebRuntime(sessionDaemon)));
@@ -180,6 +212,8 @@ export async function buildApp(deps = {}) {
180
212
  registerLocalFileSuggestionRoutes(app, projects, workspaces, "/api/machines/local", { config: configService });
181
213
  registerMcpRoutes(app, "/api");
182
214
  registerMcpRoutes(app, "/api/machines/local");
215
+ registerUsageRoutes(app, "/api");
216
+ registerUsageRoutes(app, "/api/machines/local");
183
217
  registerMachineProxyRoutes(app, machines, upgradeWebSocket);
184
218
  const pushService = new PushNotificationService((msg) => { console.warn("[push]", msg); });
185
219
  registerPushRoutes(app, pushService);
@@ -204,6 +238,7 @@ export async function buildApp(deps = {}) {
204
238
  const isBuffer = Buffer.isBuffer(options.payload) || options.payload instanceof Uint8Array;
205
239
  const isJsonPayload = options.payload !== undefined && !isBuffer && typeof options.payload !== "string";
206
240
  const headers = {
241
+ host: "localhost",
207
242
  ...(isJsonPayload ? { "content-type": "application/json" } : {}),
208
243
  ...options.headers,
209
244
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
1
  #!/usr/bin/env bun
2
- import { effectiveOmpWebConfig, maxUploadBytes } from "../config.js";
2
+ import { effectiveOmpWebConfig, maxUploadBytes, ompWebDataDir } from "../config.js";
3
3
  import { buildApp } from "./app.js";
4
+ import { getOrGenerateAuthToken } from "./security.js";
4
5
  const { config } = effectiveOmpWebConfig();
5
- const app = await buildApp({ bodyLimit: maxUploadBytes(process.env, config) });
6
+ const authToken = getOrGenerateAuthToken(ompWebDataDir(process.env));
7
+ const authRequired = config.authRequired !== false && process.env["OMP_WEB_AUTH_REQUIRED"] !== "0" && process.env["OMP_WEB_AUTH_REQUIRED"] !== "false";
8
+ const app = await buildApp({
9
+ bodyLimit: maxUploadBytes(process.env, config),
10
+ authRequired,
11
+ authToken,
12
+ });
6
13
  const port = config.port ?? 8504;
7
14
  const host = config.host ?? "127.0.0.1";
8
15
  Bun.serve({
@@ -12,5 +19,6 @@ Bun.serve({
12
19
  websocket: app.websocket,
13
20
  maxRequestBodySize: maxUploadBytes(process.env, config),
14
21
  });
15
- console.info(`PI WEB server listening on http://${host}:${String(port)}`);
22
+ const authSuffix = authRequired ? `?token=${authToken}` : "";
23
+ console.info(`PI WEB server listening on http://${host}:${String(port)}${authSuffix}`);
16
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC3C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;AACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAExC,GAAG,CAAC,KAAK,CAAC;IACR,IAAI;IACJ,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;IACrB,SAAS,EAAE,GAAG,CAAC,SAAS;IACxB,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;CACxD,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,EAAE,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC3C,MAAM,SAAS,GAAG,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,OAAO,CAAC;AAEvJ,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC;IACzB,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;IAC9C,YAAY;IACZ,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;AACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAExC,GAAG,CAAC,KAAK,CAAC;IACR,IAAI;IACJ,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;IACrB,SAAS,EAAE,GAAG,CAAC,SAAS;IACxB,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7D,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,CAAC"}
@@ -38,6 +38,8 @@ export function registerMachineProxyRoutes(app, machines = new MachineService(),
38
38
  app.get(`/api/machines/:machineId${path}`, upgradeWebSocket((c) => {
39
39
  const machineId = c.req.param("machineId") ?? "";
40
40
  let upstream;
41
+ let bridge;
42
+ const clientMessageQueue = [];
41
43
  return {
42
44
  async onOpen(_evt, ws) {
43
45
  if (machineId === "local") {
@@ -51,12 +53,25 @@ export function registerMachineProxyRoutes(app, machines = new MachineService(),
51
53
  }
52
54
  try {
53
55
  upstream = client.connectWebSocket(remoteApiPath(machineId, c.req.url));
54
- bridgeHonoSocketToUpstream(ws, upstream);
56
+ bridge = bridgeHonoSocketToUpstream(ws, upstream);
57
+ while (clientMessageQueue.length > 0) {
58
+ const queued = clientMessageQueue.shift();
59
+ if (queued !== undefined)
60
+ bridge.sendToUpstream(queued);
61
+ }
55
62
  }
56
63
  catch {
57
64
  ws.close(1011, "Remote machine unavailable");
58
65
  }
59
66
  },
67
+ onMessage(evt) {
68
+ if (bridge !== undefined) {
69
+ bridge.sendToUpstream(evt.data);
70
+ }
71
+ else {
72
+ clientMessageQueue.push(evt.data);
73
+ }
74
+ },
60
75
  onClose() {
61
76
  upstream?.close();
62
77
  },