aicodeman 1.42.0 → 1.44.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.
- package/README.md +13 -12
- package/dist/claude-session-title.d.ts +6 -4
- package/dist/claude-session-title.d.ts.map +1 -1
- package/dist/claude-session-title.js +6 -4
- package/dist/claude-session-title.js.map +1 -1
- package/dist/cli-agent.d.ts +3 -3
- package/dist/cli-agent.d.ts.map +1 -1
- package/dist/cli-agent.js +8 -6
- package/dist/cli-agent.js.map +1 -1
- package/dist/config/cli-registry/patterns.d.ts +1 -1
- package/dist/config/cli-registry/patterns.d.ts.map +1 -1
- package/dist/config/cli-registry/patterns.js +3 -0
- package/dist/config/cli-registry/patterns.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +1 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +5 -3
- package/dist/config/cli-registry/schema.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +263 -4
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +13 -5
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/config/map-limits.d.ts +13 -1
- package/dist/config/map-limits.d.ts.map +1 -1
- package/dist/config/map-limits.js +28 -1
- package/dist/config/map-limits.js.map +1 -1
- package/dist/config-backup.d.ts +279 -0
- package/dist/config-backup.d.ts.map +1 -0
- package/dist/config-backup.js +794 -0
- package/dist/config-backup.js.map +1 -0
- package/dist/cron/cron-service.d.ts +5 -5
- package/dist/cron/cron-service.js +6 -6
- package/dist/cron/cron-service.js.map +1 -1
- package/dist/custom-model-hosts.d.ts +16 -0
- package/dist/custom-model-hosts.d.ts.map +1 -1
- package/dist/custom-model-hosts.js.map +1 -1
- package/dist/hooks-config.d.ts +24 -0
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +47 -0
- package/dist/hooks-config.js.map +1 -1
- package/dist/intent-store.d.ts +2 -0
- package/dist/intent-store.d.ts.map +1 -1
- package/dist/intent-store.js +9 -0
- package/dist/intent-store.js.map +1 -1
- package/dist/mcp-sync-targets.d.ts +6 -3
- package/dist/mcp-sync-targets.d.ts.map +1 -1
- package/dist/mcp-sync-targets.js +6 -3
- package/dist/mcp-sync-targets.js.map +1 -1
- package/dist/mux-interface.d.ts +28 -7
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/prompt-cache-keepwarm.d.ts +193 -0
- package/dist/prompt-cache-keepwarm.d.ts.map +1 -0
- package/dist/prompt-cache-keepwarm.js +359 -0
- package/dist/prompt-cache-keepwarm.js.map +1 -0
- package/dist/respawn-controller.d.ts.map +1 -1
- package/dist/respawn-controller.js +6 -5
- package/dist/respawn-controller.js.map +1 -1
- package/dist/session-auto-ops.d.ts.map +1 -1
- package/dist/session-auto-ops.js +6 -1
- package/dist/session-auto-ops.js.map +1 -1
- package/dist/session-cli-registry-bridge.d.ts +15 -1
- package/dist/session-cli-registry-bridge.d.ts.map +1 -1
- package/dist/session-cli-registry-bridge.js +20 -3
- package/dist/session-cli-registry-bridge.js.map +1 -1
- package/dist/session-submit-verifier.d.ts +19 -0
- package/dist/session-submit-verifier.d.ts.map +1 -1
- package/dist/session-submit-verifier.js +88 -0
- package/dist/session-submit-verifier.js.map +1 -1
- package/dist/session.d.ts +83 -12
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +150 -16
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +10 -0
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +35 -0
- package/dist/state-store.js.map +1 -1
- package/dist/tab-layout-service.d.ts +33 -0
- package/dist/tab-layout-service.d.ts.map +1 -1
- package/dist/tab-layout-service.js +75 -3
- package/dist/tab-layout-service.js.map +1 -1
- package/dist/tmux-manager.d.ts +52 -9
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +148 -30
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-prefix-table.d.ts +54 -0
- package/dist/tmux-prefix-table.d.ts.map +1 -0
- package/dist/tmux-prefix-table.js +137 -0
- package/dist/tmux-prefix-table.js.map +1 -0
- package/dist/tui/tui-app.d.ts +9 -1
- package/dist/tui/tui-app.d.ts.map +1 -1
- package/dist/tui/tui-app.js +21 -8
- package/dist/tui/tui-app.js.map +1 -1
- package/dist/tui/tui-client.d.ts +3 -2
- package/dist/tui/tui-client.d.ts.map +1 -1
- package/dist/tui/tui-client.js +3 -2
- package/dist/tui/tui-client.js.map +1 -1
- package/dist/types/app-state.d.ts +6 -0
- package/dist/types/app-state.d.ts.map +1 -1
- package/dist/types/app-state.js.map +1 -1
- package/dist/types/session.d.ts +72 -5
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +2 -1
- package/dist/types/session.js.map +1 -1
- package/dist/usage-telemetry.d.ts +15 -0
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +45 -2
- package/dist/usage-telemetry.js.map +1 -1
- package/dist/utils/cli-installed-probes.d.ts +1 -1
- package/dist/utils/cli-installed-probes.d.ts.map +1 -1
- package/dist/utils/cli-installed-probes.js +4 -2
- package/dist/utils/cli-installed-probes.js.map +1 -1
- package/dist/utils/copilot-cli-resolver.d.ts +48 -0
- package/dist/utils/copilot-cli-resolver.d.ts.map +1 -0
- package/dist/utils/copilot-cli-resolver.js +112 -0
- package/dist/utils/copilot-cli-resolver.js.map +1 -0
- package/dist/utils/copilot-plan-usage.d.ts +46 -0
- package/dist/utils/copilot-plan-usage.d.ts.map +1 -0
- package/dist/utils/copilot-plan-usage.js +95 -0
- package/dist/utils/copilot-plan-usage.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/single-line.d.ts +22 -0
- package/dist/utils/single-line.d.ts.map +1 -0
- package/dist/utils/single-line.js +30 -0
- package/dist/utils/single-line.js.map +1 -0
- package/dist/web/approval-inbox.d.ts +6 -0
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +2 -2
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/case-path.d.ts +4 -2
- package/dist/web/case-path.d.ts.map +1 -1
- package/dist/web/case-path.js +13 -4
- package/dist/web/case-path.js.map +1 -1
- package/dist/web/plan-usage-latest.d.ts +2 -1
- package/dist/web/plan-usage-latest.d.ts.map +1 -1
- package/dist/web/plan-usage-latest.js +12 -2
- package/dist/web/plan-usage-latest.js.map +1 -1
- package/dist/web/ports/index.d.ts +1 -0
- package/dist/web/ports/index.d.ts.map +1 -1
- package/dist/web/ports/keep-warm-port.d.ts +9 -0
- package/dist/web/ports/keep-warm-port.d.ts.map +1 -0
- package/dist/web/ports/keep-warm-port.js +6 -0
- package/dist/web/ports/keep-warm-port.js.map +1 -0
- package/dist/web/ports/session-port.d.ts +3 -1
- package/dist/web/ports/session-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.9314ee60.js +43 -0
- package/dist/web/public/app.9314ee60.js.br +0 -0
- package/dist/web/public/app.9314ee60.js.gz +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.12b0c247.js → constants.4866ecc3.js} +205 -3
- package/dist/web/public/constants.4866ecc3.js.br +0 -0
- package/dist/web/public/constants.4866ecc3.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.22ca902b.js +2 -0
- package/dist/web/public/i18n.22ca902b.js.br +0 -0
- package/dist/web/public/i18n.22ca902b.js.gz +0 -0
- package/dist/web/public/{image-input.fcdcb46c.js → image-input.941386e7.js} +24 -14
- package/dist/web/public/image-input.941386e7.js.br +0 -0
- package/dist/web/public/image-input.941386e7.js.gz +0 -0
- package/dist/web/public/index.html +110 -16
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.b42f539b.js → keyboard-accessory.4e8b20ac.js} +51 -22
- package/dist/web/public/keyboard-accessory.4e8b20ac.js.br +0 -0
- package/dist/web/public/keyboard-accessory.4e8b20ac.js.gz +0 -0
- package/dist/web/public/{mobile-handlers.0ef9c311.js → mobile-handlers.44adaa07.js} +48 -16
- package/dist/web/public/mobile-handlers.44adaa07.js.br +0 -0
- package/dist/web/public/mobile-handlers.44adaa07.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +1 -0
- package/dist/web/public/mobile-overview.js.br +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.12fb18de.css +1 -0
- package/dist/web/public/mobile.12fb18de.css.br +0 -0
- package/dist/web/public/mobile.12fb18de.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.73ec0137.js → panels-ui.cbb24ba1.js} +66 -66
- package/dist/web/public/panels-ui.cbb24ba1.js.br +0 -0
- package/dist/web/public/panels-ui.cbb24ba1.js.gz +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/security-notices.json +21 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/{session-ui.d52ff6aa.js → session-ui.9c1f009b.js} +8 -4
- package/dist/web/public/session-ui.9c1f009b.js.br +0 -0
- package/dist/web/public/session-ui.9c1f009b.js.gz +0 -0
- package/dist/web/public/settings-ui.fea9ddae.js +106 -0
- package/dist/web/public/settings-ui.fea9ddae.js.br +0 -0
- package/dist/web/public/settings-ui.fea9ddae.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.e096fcd6.css +1 -0
- package/dist/web/public/styles.e096fcd6.css.br +0 -0
- package/dist/web/public/styles.e096fcd6.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +2 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +41 -22
- package/dist/web/public/terminal-tile.js.br +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/terminal-ui.68dbd352.js +2 -0
- package/dist/web/public/terminal-ui.68dbd352.js.br +0 -0
- package/dist/web/public/terminal-ui.68dbd352.js.gz +0 -0
- package/dist/web/public/tile-grid.js +3 -6
- package/dist/web/public/tile-grid.js.br +0 -0
- package/dist/web/public/tile-grid.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/public/whats-new.json +9 -9
- package/dist/web/response-viewer-transcript.d.ts +6 -0
- package/dist/web/response-viewer-transcript.d.ts.map +1 -1
- package/dist/web/response-viewer-transcript.js +134 -1
- package/dist/web/response-viewer-transcript.js.map +1 -1
- package/dist/web/routes/admin-routes.d.ts +2 -1
- package/dist/web/routes/admin-routes.d.ts.map +1 -1
- package/dist/web/routes/admin-routes.js +3 -0
- package/dist/web/routes/admin-routes.js.map +1 -1
- package/dist/web/routes/case-routes.d.ts +2 -2
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +81 -3
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/config-backup-routes.d.ts +54 -0
- package/dist/web/routes/config-backup-routes.d.ts.map +1 -0
- package/dist/web/routes/config-backup-routes.js +268 -0
- package/dist/web/routes/config-backup-routes.js.map +1 -0
- package/dist/web/routes/custom-model-routes.d.ts +17 -1
- package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
- package/dist/web/routes/custom-model-routes.js +118 -13
- package/dist/web/routes/custom-model-routes.js.map +1 -1
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
- package/dist/web/routes/hook-event-routes.js +26 -5
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/mcp-sync-routes.d.ts +4 -4
- package/dist/web/routes/mcp-sync-routes.js +4 -4
- package/dist/web/routes/ralph-routes.js +2 -2
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/routes/reboot-restore-routes.d.ts.map +1 -1
- package/dist/web/routes/reboot-restore-routes.js +2 -0
- package/dist/web/routes/reboot-restore-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +14 -4
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +131 -30
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/status-telemetry-routes.d.ts +2 -2
- package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
- package/dist/web/routes/status-telemetry-routes.js +8 -4
- package/dist/web/routes/status-telemetry-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts +2 -2
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +18 -0
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/routes/webview-routes.d.ts.map +1 -1
- package/dist/web/routes/webview-routes.js +1 -0
- package/dist/web/routes/webview-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +32 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +64 -4
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +12 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +127 -6
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-listener-wiring.d.ts +6 -0
- package/dist/web/session-listener-wiring.d.ts.map +1 -1
- package/dist/web/session-listener-wiring.js +10 -3
- package/dist/web/session-listener-wiring.js.map +1 -1
- package/dist/web/sse-events.d.ts +5 -2
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +5 -2
- package/dist/web/sse-events.js.map +1 -1
- package/dist/web/webview-proxy.d.ts +8 -3
- package/dist/web/webview-proxy.d.ts.map +1 -1
- package/dist/web/webview-proxy.js +23 -5
- package/dist/web/webview-proxy.js.map +1 -1
- package/package.json +1 -1
- package/skills/codeman/SKILL.md +23 -11
- package/skills/codeman/preamble.sh +12 -2
- package/skills/codeman/reference/endpoints.md +16 -15
- package/skills/codeman/reference/messaging.md +5 -5
- package/skills/codeman/reference/recipes.md +2 -2
- package/skills/codeman/reference/verbs.md +25 -17
- package/dist/web/public/app.f04bb2a5.js +0 -43
- package/dist/web/public/app.f04bb2a5.js.br +0 -0
- package/dist/web/public/app.f04bb2a5.js.gz +0 -0
- package/dist/web/public/constants.12b0c247.js.br +0 -0
- package/dist/web/public/constants.12b0c247.js.gz +0 -0
- package/dist/web/public/i18n.06659676.js +0 -2
- package/dist/web/public/i18n.06659676.js.br +0 -0
- package/dist/web/public/i18n.06659676.js.gz +0 -0
- package/dist/web/public/image-input.fcdcb46c.js.br +0 -0
- package/dist/web/public/image-input.fcdcb46c.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.b42f539b.js.br +0 -0
- package/dist/web/public/keyboard-accessory.b42f539b.js.gz +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.br +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
- package/dist/web/public/mobile.2dff1580.css +0 -1
- package/dist/web/public/mobile.2dff1580.css.br +0 -0
- package/dist/web/public/mobile.2dff1580.css.gz +0 -0
- package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
- package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js.br +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js.gz +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js +0 -97
- package/dist/web/public/settings-ui.3a22bd2a.js.br +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js.gz +0 -0
- package/dist/web/public/styles.ba6a9b84.css +0 -1
- package/dist/web/public/styles.ba6a9b84.css.br +0 -0
- package/dist/web/public/styles.ba6a9b84.css.gz +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js +0 -2
- package/dist/web/public/terminal-ui.0a7ccc29.js.br +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js.gz +0 -0
package/dist/usage-telemetry.js
CHANGED
|
@@ -134,6 +134,43 @@ export function parseCodexRateLimitsResponse(value) {
|
|
|
134
134
|
}
|
|
135
135
|
return telemetry.fiveHour || telemetry.sevenDay ? telemetry : null;
|
|
136
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Normalize GitHub Copilot's quota snapshot (`GET /copilot_internal/user`) into the chip's monthly
|
|
139
|
+
* window. Only `premium_interactions` is a metered quota: `chat` and `completions` report
|
|
140
|
+
* `unlimited: true` on every plan seen, and an unlimited premium quota has nothing to meter, so it
|
|
141
|
+
* yields null and the chip shows no Copilot row rather than a bar stuck at 0%.
|
|
142
|
+
*/
|
|
143
|
+
export function parseCopilotQuotaResponse(value) {
|
|
144
|
+
if (!value || typeof value !== 'object')
|
|
145
|
+
return null;
|
|
146
|
+
const raw = value;
|
|
147
|
+
const snap = raw.quota_snapshots?.premium_interactions;
|
|
148
|
+
if (!snap || typeof snap !== 'object' || snap.unlimited === true)
|
|
149
|
+
return null;
|
|
150
|
+
// A zero (or negative) quota that is not 'unlimited' would show a stuck 0% or 100% row.
|
|
151
|
+
if (typeof snap.entitlement === 'number' && snap.entitlement <= 0)
|
|
152
|
+
return null;
|
|
153
|
+
const finite = (v) => typeof v === 'number' && Number.isFinite(v);
|
|
154
|
+
const limit = finite(snap.entitlement) && snap.entitlement > 0 ? snap.entitlement : undefined;
|
|
155
|
+
let usedPct = null;
|
|
156
|
+
if (finite(snap.percent_remaining))
|
|
157
|
+
usedPct = 100 - snap.percent_remaining;
|
|
158
|
+
else if (limit !== undefined && finite(snap.remaining))
|
|
159
|
+
usedPct = (1 - snap.remaining / limit) * 100;
|
|
160
|
+
if (usedPct === null)
|
|
161
|
+
return null;
|
|
162
|
+
const resetRaw = typeof raw.quota_reset_date_utc === 'string' ? raw.quota_reset_date_utc : raw.quota_reset_date;
|
|
163
|
+
const parsedReset = typeof resetRaw === 'string' ? Date.parse(resetRaw) : NaN;
|
|
164
|
+
const monthly = {
|
|
165
|
+
usedPercentage: clampPct(usedPct),
|
|
166
|
+
resetAt: Number.isFinite(parsedReset) && parsedReset > 0 ? parsedReset : 0,
|
|
167
|
+
};
|
|
168
|
+
if (limit !== undefined && finite(snap.remaining)) {
|
|
169
|
+
monthly.limit = limit;
|
|
170
|
+
monthly.used = Math.max(0, Math.round(limit - snap.remaining));
|
|
171
|
+
}
|
|
172
|
+
return { monthly };
|
|
173
|
+
}
|
|
137
174
|
/** Group a non-negative integer with thousands separators: 562411 → "562,411". */
|
|
138
175
|
function withCommas(n) {
|
|
139
176
|
return Math.max(0, Math.round(n))
|
|
@@ -216,11 +253,17 @@ export function formatSessionStatusText(s, now = Date.now()) {
|
|
|
216
253
|
* localStorage write + identical chip re-render each time.
|
|
217
254
|
*/
|
|
218
255
|
export function telemetrySignature(t) {
|
|
219
|
-
|
|
256
|
+
const parts = [
|
|
220
257
|
t.fiveHour ? Math.round(t.fiveHour.usedPercentage) : null,
|
|
221
258
|
t.fiveHour?.resetAt ?? null,
|
|
222
259
|
t.sevenDay ? Math.round(t.sevenDay.usedPercentage) : null,
|
|
223
260
|
t.sevenDay?.resetAt ?? null,
|
|
224
|
-
]
|
|
261
|
+
];
|
|
262
|
+
// Appended only when present, so the Claude and Codex signatures are byte-identical to before.
|
|
263
|
+
// The limit is part of it: a plan change mid-month (300 to 1500 with 100 used) keeps `used` and the reset.
|
|
264
|
+
if (t.monthly) {
|
|
265
|
+
parts.push(Math.round(t.monthly.usedPercentage), t.monthly.used ?? null, t.monthly.limit ?? null, t.monthly.resetAt);
|
|
266
|
+
}
|
|
267
|
+
return JSON.stringify(parts);
|
|
225
268
|
}
|
|
226
269
|
//# sourceMappingURL=usage-telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-telemetry.js","sourceRoot":"","sources":["../src/usage-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"usage-telemetry.js","sourceRoot":"","sources":["../src/usage-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AA+EH,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,CAAoD;IACvE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAsC;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,CAAC,GAAoB,EAAE,CAAC;IAC9B,IAAI,QAAQ;QAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpC,IAAI,QAAQ;QAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpC,IAAI,OAAO,IAAI,CAAC,cAAc,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;QAC7D,CAAC,CAAC,qBAAqB,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/F,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC5E,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAsC;IACrE,MAAM,EAAE,GAAG,IAAI,EAAE,YAAY,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAsB,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI;QAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC7F,qFAAqF;QACrF,mFAAmF;QACnF,uEAAuE;QACvE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO;YAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,EAAE,CAAC,sBAAsB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAChG,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,EAAE,CAAC,iBAAiB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtF,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAClH,IAAI,KAAK,CAAC,MAAM;YAAE,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAmC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAmB,EAAE,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC;IAC5E,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;YAAE,SAAS;QACxG,IAAI,MAAM,CAAC,kBAAkB,KAAK,GAAG,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM;YAAE,SAAS;QACxF,MAAM,QAAQ,GACZ,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;YAC5F,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YACpC,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,UAAU,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACvF,IAAI,MAAM,CAAC,kBAAkB,KAAK,GAAG;YAAE,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAC;QACvE,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM;YAAE,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC5E,CAAC;IAED,OAAO,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,GAAG,GAAG,KAWX,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC;IACvD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9E,wFAAwF;IACxF,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/E,MAAM,MAAM,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC;SACtE,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IACrG,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAChH,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,MAAM,OAAO,GAAgB;QAC3B,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAC3E,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAgBD,kFAAkF;AAClF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC9B,QAAQ,EAAE;SACV,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,IAAsC;IACvE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,CAAC,GAAkB,EAAE,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC5E,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;IAC/B,IAAI,OAAO,EAAE,EAAE,kBAAkB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzF,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,EAAE,EAAE,mBAAmB,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC3F,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,EAAE,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;QAC5C,CAAC,CAAC,qBAAqB,GAAG,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK;QAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,CAAoB,EAAE,GAAW;IACzD,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9E,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3G,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAuB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACvF,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,CAAC,gBAAgB;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,qBAAqB,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1G,IAAI,CAAC,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAkB;IACnD,MAAM,KAAK,GAAyB;QAClC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI;QACzD,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;QAC3B,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI;QACzD,CAAC,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;KAC5B,CAAC;IACF,+FAA+F;IAC/F,2GAA2G;IAC3G,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACpC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,EACtB,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,EACvB,CAAC,CAAC,OAAO,CAAC,OAAO,CAClB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* and the badge could disagree with the Run menu.
|
|
8
8
|
*
|
|
9
9
|
* Every probe is a memoized resolver, so this is cheap to call per request. Dynamic imports
|
|
10
|
-
* keep the
|
|
10
|
+
* keep the ten resolvers out of any module that never asks.
|
|
11
11
|
*/
|
|
12
12
|
import type { CliEntry } from '../config/cli-registry/types.js';
|
|
13
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-installed-probes.d.ts","sourceRoot":"","sources":["../../src/utils/cli-installed-probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAGhE;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"cli-installed-probes.d.ts","sourceRoot":"","sources":["../../src/utils/cli-installed-probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAGhE;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoClF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAMxG"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* and the badge could disagree with the Run menu.
|
|
8
8
|
*
|
|
9
9
|
* Every probe is a memoized resolver, so this is cheap to call per request. Dynamic imports
|
|
10
|
-
* keep the
|
|
10
|
+
* keep the ten resolvers out of any module that never asks.
|
|
11
11
|
*/
|
|
12
12
|
import { isCliAvailable as isRegistryCliAvailable } from './cli-resolver.js';
|
|
13
13
|
/**
|
|
@@ -17,7 +17,7 @@ import { isCliAvailable as isRegistryCliAvailable } from './cli-resolver.js';
|
|
|
17
17
|
* offer a Run button that spawns a pane which dies on arrival.
|
|
18
18
|
*/
|
|
19
19
|
export async function probeStockCliAvailability() {
|
|
20
|
-
const [{ isClaudeAvailable }, { isOpenCodeAvailable }, { isCodexAvailable }, { isGeminiAvailable }, { isAntigravityAvailable }, { isPiAvailable }, { isGrokAvailable }, { isDeepSeekRunnable }, { isOmpAvailable },] = await Promise.all([
|
|
20
|
+
const [{ isClaudeAvailable }, { isOpenCodeAvailable }, { isCodexAvailable }, { isGeminiAvailable }, { isAntigravityAvailable }, { isPiAvailable }, { isGrokAvailable }, { isDeepSeekRunnable }, { isOmpAvailable }, { isCopilotAvailable },] = await Promise.all([
|
|
21
21
|
import('./claude-cli-resolver.js'),
|
|
22
22
|
import('./opencode-cli-resolver.js'),
|
|
23
23
|
import('./codex-cli-resolver.js'),
|
|
@@ -27,6 +27,7 @@ export async function probeStockCliAvailability() {
|
|
|
27
27
|
import('./grok-cli-resolver.js'),
|
|
28
28
|
import('./deepseek-cli-resolver.js'),
|
|
29
29
|
import('./omp-cli-resolver.js'),
|
|
30
|
+
import('./copilot-cli-resolver.js'),
|
|
30
31
|
]);
|
|
31
32
|
return {
|
|
32
33
|
claude: isClaudeAvailable(),
|
|
@@ -38,6 +39,7 @@ export async function probeStockCliAvailability() {
|
|
|
38
39
|
grok: isGrokAvailable(),
|
|
39
40
|
deepseek: isDeepSeekRunnable(),
|
|
40
41
|
omp: isOmpAvailable(),
|
|
42
|
+
copilot: isCopilotAvailable(),
|
|
41
43
|
};
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-installed-probes.js","sourceRoot":"","sources":["../../src/utils/cli-installed-probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,CACJ,EAAE,iBAAiB,EAAE,EACrB,EAAE,mBAAmB,EAAE,EACvB,EAAE,gBAAgB,EAAE,EACpB,EAAE,iBAAiB,EAAE,EACrB,EAAE,sBAAsB,EAAE,EAC1B,EAAE,aAAa,EAAE,EACjB,EAAE,eAAe,EAAE,EACnB,EAAE,kBAAkB,EAAE,EACtB,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"cli-installed-probes.js","sourceRoot":"","sources":["../../src/utils/cli-installed-probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,CACJ,EAAE,iBAAiB,EAAE,EACrB,EAAE,mBAAmB,EAAE,EACvB,EAAE,gBAAgB,EAAE,EACpB,EAAE,iBAAiB,EAAE,EACrB,EAAE,sBAAsB,EAAE,EAC1B,EAAE,aAAa,EAAE,EACjB,EAAE,eAAe,EAAE,EACnB,EAAE,kBAAkB,EAAE,EACtB,EAAE,cAAc,EAAE,EAClB,EAAE,kBAAkB,EAAE,EACvB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,MAAM,CAAC,0BAA0B,CAAC;QAClC,MAAM,CAAC,4BAA4B,CAAC;QACpC,MAAM,CAAC,yBAAyB,CAAC;QACjC,MAAM,CAAC,0BAA0B,CAAC;QAClC,MAAM,CAAC,+BAA+B,CAAC;QACvC,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,wBAAwB,CAAC;QAChC,MAAM,CAAC,4BAA4B,CAAC;QACpC,MAAM,CAAC,uBAAuB,CAAC;QAC/B,MAAM,CAAC,2BAA2B,CAAC;KACpC,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,iBAAiB,EAAE;QAC3B,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,gBAAgB,EAAE;QACzB,MAAM,EAAE,iBAAiB,EAAE;QAC3B,WAAW,EAAE,sBAAsB,EAAE;QACrC,EAAE,EAAE,aAAa,EAAE;QACnB,IAAI,EAAE,eAAe,EAAE;QACvB,QAAQ,EAAE,kBAAkB,EAAE;QAC9B,GAAG,EAAE,cAAc,EAAE;QACrB,OAAO,EAAE,kBAAkB,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAe,EAAE,iBAA0C;IAC7F,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAY,CAAC;IAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAChE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvB,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resolve the GitHub Copilot CLI binary across common install paths.
|
|
3
|
+
*
|
|
4
|
+
* Uses the shared `createCliExecutableResolver` (cli-executable-resolver.ts),
|
|
5
|
+
* same as the sibling claude/opencode/codex/gemini/antigravity/pi resolvers:
|
|
6
|
+
* server process PATH first, then common install directories, then — last,
|
|
7
|
+
* because it is the only step that spawns anything — an interactive login
|
|
8
|
+
* shell, which is what finds nvm/Homebrew/user-npm installs when Codeman runs
|
|
9
|
+
* as a systemd/launchd service with a minimal PATH.
|
|
10
|
+
*
|
|
11
|
+
* Provides an augmented PATH directory for tmux sessions.
|
|
12
|
+
*
|
|
13
|
+
* @module utils/copilot-cli-resolver
|
|
14
|
+
*/
|
|
15
|
+
import { type CliResolverHost } from './cli-executable-resolver.js';
|
|
16
|
+
/**
|
|
17
|
+
* A real `copilot --version` prints `GitHub Copilot CLI 1.0.94.`. Anchoring on the product
|
|
18
|
+
* name keeps an unrelated `copilot` binary on PATH from being accepted.
|
|
19
|
+
*/
|
|
20
|
+
export declare const COPILOT_VERSION_REGEX: RegExp;
|
|
21
|
+
type CopilotVersionProbe = (binPath: string) => string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Creates an isolated Copilot wrapper around an injected host, version probe and
|
|
24
|
+
* clock. Omitting `versionProbe` keeps the ambient (VITEST-gated) probe, which
|
|
25
|
+
* is exactly what the hermeticity test exercises.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createCopilotResolverForTest(host: CliResolverHost, versionProbe?: CopilotVersionProbe, now?: () => number): import("./cli-executable-resolver.js").CliExecutableResolver<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Finds the directory containing a verified `copilot` binary.
|
|
30
|
+
* Checks `which copilot` first, then falls back to common install locations. Every
|
|
31
|
+
* candidate must pass the `copilot --version` sanity probe before it is accepted.
|
|
32
|
+
*
|
|
33
|
+
* @returns Directory path, or null if not found
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveCopilotDir(): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Check if the GitHub Copilot CLI is available on the system.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isCopilotAvailable(): boolean;
|
|
40
|
+
export declare function getCopilotNotFoundMessage(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Version reported by the resolved `copilot` binary, or null when copilot is
|
|
43
|
+
* unavailable. Surfaced through `GET /api/copilot/status` so a misresolution is
|
|
44
|
+
* diagnosable from the UI.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getCopilotCliVersion(): string | null;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=copilot-cli-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-cli-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/copilot-cli-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAStC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAuC,CAAC;AAqC1E,KAAK,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AAqB9D;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,eAAe,EACrB,YAAY,CAAC,EAAE,mBAAmB,EAClC,GAAG,CAAC,EAAE,MAAM,MAAM,wEAGnB;AAID;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAEpD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resolve the GitHub Copilot CLI binary across common install paths.
|
|
3
|
+
*
|
|
4
|
+
* Uses the shared `createCliExecutableResolver` (cli-executable-resolver.ts),
|
|
5
|
+
* same as the sibling claude/opencode/codex/gemini/antigravity/pi resolvers:
|
|
6
|
+
* server process PATH first, then common install directories, then — last,
|
|
7
|
+
* because it is the only step that spawns anything — an interactive login
|
|
8
|
+
* shell, which is what finds nvm/Homebrew/user-npm installs when Codeman runs
|
|
9
|
+
* as a systemd/launchd service with a minimal PATH.
|
|
10
|
+
*
|
|
11
|
+
* Provides an augmented PATH directory for tmux sessions.
|
|
12
|
+
*
|
|
13
|
+
* @module utils/copilot-cli-resolver
|
|
14
|
+
*/
|
|
15
|
+
import { execFileSync } from 'node:child_process';
|
|
16
|
+
import { EXEC_TIMEOUT_MS } from '../config/exec-timeout.js';
|
|
17
|
+
import { getCli } from '../config/cli-registry/registry.js';
|
|
18
|
+
import { expandHome } from './cli-resolver.js';
|
|
19
|
+
import { createCliExecutableResolver, formatCliNotFoundMessage, } from './cli-executable-resolver.js';
|
|
20
|
+
/**
|
|
21
|
+
* Directories probed after `which`, read from this CLI's registry entry so the spawn
|
|
22
|
+
* path, `codeman doctor` and this resolver cannot disagree about where to look.
|
|
23
|
+
* `~` is expanded by `expandHome`; nothing else is interpreted.
|
|
24
|
+
*/
|
|
25
|
+
const COPILOT_SEARCH_DIRS = () => (getCli('copilot')?.discovery.searchDirs ?? []).map(expandHome);
|
|
26
|
+
/**
|
|
27
|
+
* A real `copilot --version` prints `GitHub Copilot CLI 1.0.94.`. Anchoring on the product
|
|
28
|
+
* name keeps an unrelated `copilot` binary on PATH from being accepted.
|
|
29
|
+
*/
|
|
30
|
+
export const COPILOT_VERSION_REGEX = /GitHub Copilot CLI (\d+\.\d+\.\d+)/;
|
|
31
|
+
const COPILOT_NOT_FOUND = 'GitHub Copilot CLI not found. Install with: npm install -g @github/copilot';
|
|
32
|
+
/**
|
|
33
|
+
* Run `copilot --version` on a candidate path and return the trimmed version when
|
|
34
|
+
* it is the GitHub Copilot CLI. Returns null for anything else — a missing
|
|
35
|
+
* binary, a non-zero exit, a hang (timeout), or output that is not
|
|
36
|
+
* `GitHub Copilot CLI <semver>`-shaped (which is how an unrelated `copilot` on PATH gets rejected).
|
|
37
|
+
*
|
|
38
|
+
* Never runs under vitest: the suites must stay hermetic and must not depend on
|
|
39
|
+
* whether the dev box happens to have copilot installed. The shared resolver host
|
|
40
|
+
* is already inert under vitest, so this gate is defense in depth for any
|
|
41
|
+
* opted-in host that still carries the default probe.
|
|
42
|
+
*/
|
|
43
|
+
function probeCopilotVersion(binPath) {
|
|
44
|
+
if (process.env.VITEST)
|
|
45
|
+
return null;
|
|
46
|
+
try {
|
|
47
|
+
const out = execFileSync(binPath, ['--version'], {
|
|
48
|
+
encoding: 'utf-8',
|
|
49
|
+
timeout: EXEC_TIMEOUT_MS,
|
|
50
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
51
|
+
// A stuck or hostile `copilot` that ignores SIGTERM would survive the timeout
|
|
52
|
+
// and block the server (execFileSync keeps waiting after the signal).
|
|
53
|
+
killSignal: 'SIGKILL',
|
|
54
|
+
}).trim();
|
|
55
|
+
const candidate = COPILOT_VERSION_REGEX.exec(out)?.[1];
|
|
56
|
+
if (candidate)
|
|
57
|
+
return candidate;
|
|
58
|
+
console.warn(`[CopilotResolver] Ignoring ${binPath}: "copilot --version" printed ${JSON.stringify(out.slice(0, 80))}`);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.warn(`[CopilotResolver] Ignoring ${binPath}: "copilot --version" failed (${err.message})`);
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function createCopilotResolver(host, versionProbe = probeCopilotVersion, now) {
|
|
66
|
+
return createCliExecutableResolver({
|
|
67
|
+
binary: 'copilot',
|
|
68
|
+
searchDirs: COPILOT_SEARCH_DIRS,
|
|
69
|
+
validateCandidate: (binPath) => {
|
|
70
|
+
const version = versionProbe(binPath);
|
|
71
|
+
return version ? { accepted: true, metadata: version } : { accepted: false };
|
|
72
|
+
},
|
|
73
|
+
now,
|
|
74
|
+
}, host);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Creates an isolated Copilot wrapper around an injected host, version probe and
|
|
78
|
+
* clock. Omitting `versionProbe` keeps the ambient (VITEST-gated) probe, which
|
|
79
|
+
* is exactly what the hermeticity test exercises.
|
|
80
|
+
*/
|
|
81
|
+
export function createCopilotResolverForTest(host, versionProbe, now) {
|
|
82
|
+
return createCopilotResolver(host, versionProbe ?? probeCopilotVersion, now);
|
|
83
|
+
}
|
|
84
|
+
const copilotResolver = createCopilotResolver();
|
|
85
|
+
/**
|
|
86
|
+
* Finds the directory containing a verified `copilot` binary.
|
|
87
|
+
* Checks `which copilot` first, then falls back to common install locations. Every
|
|
88
|
+
* candidate must pass the `copilot --version` sanity probe before it is accepted.
|
|
89
|
+
*
|
|
90
|
+
* @returns Directory path, or null if not found
|
|
91
|
+
*/
|
|
92
|
+
export function resolveCopilotDir() {
|
|
93
|
+
return copilotResolver.resolve()?.directory ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if the GitHub Copilot CLI is available on the system.
|
|
97
|
+
*/
|
|
98
|
+
export function isCopilotAvailable() {
|
|
99
|
+
return resolveCopilotDir() !== null;
|
|
100
|
+
}
|
|
101
|
+
export function getCopilotNotFoundMessage() {
|
|
102
|
+
return formatCliNotFoundMessage(COPILOT_NOT_FOUND, copilotResolver.diagnostics());
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Version reported by the resolved `copilot` binary, or null when copilot is
|
|
106
|
+
* unavailable. Surfaced through `GET /api/copilot/status` so a misresolution is
|
|
107
|
+
* diagnosable from the UI.
|
|
108
|
+
*/
|
|
109
|
+
export function getCopilotCliVersion() {
|
|
110
|
+
return copilotResolver.resolve()?.metadata ?? null;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=copilot-cli-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-cli-resolver.js","sourceRoot":"","sources":["../../src/utils/copilot-cli-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview GitHub Copilot's monthly premium-request quota, for the header plan-usage chip.
|
|
3
|
+
*
|
|
4
|
+
* The Copilot CLI has no scriptable usage command (`copilot billing` exists only inside the TUI), but
|
|
5
|
+
* the same quota snapshot the editors show is `GET https://api.github.com/copilot_internal/user`,
|
|
6
|
+
* readable with the CLI's own sign-in token. The endpoint is not part of GitHub's documented REST API,
|
|
7
|
+
* so this is read-only, best-effort and silent: any failure (offline, 401, a changed shape) yields
|
|
8
|
+
* `null` and the chip simply has no Copilot row.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ The token is never logged, never put in an error and only ever sent to api.github.com over HTTPS
|
|
11
|
+
* (`redirect: 'error'`, so a redirect cannot carry it elsewhere).
|
|
12
|
+
*
|
|
13
|
+
* @module utils/copilot-plan-usage
|
|
14
|
+
*/
|
|
15
|
+
import { type StatusTelemetry } from '../usage-telemetry.js';
|
|
16
|
+
export declare const COPILOT_QUOTA_URL = "https://api.github.com/copilot_internal/user";
|
|
17
|
+
/**
|
|
18
|
+
* The sign-in token Copilot would use: a token in the environment first, then the plain-text
|
|
19
|
+
* `authTokens` entry the CLI keeps in `<COPILOT_HOME or ~/.copilot>/config.json` when no OS keychain
|
|
20
|
+
* is available. Only github.com sign-ins are read from the file (the quota URL is github.com's).
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveCopilotToken(env?: Record<string, string | undefined>, home?: string): Promise<string | null>;
|
|
23
|
+
export interface ReadCopilotPlanUsageOptions {
|
|
24
|
+
/** Defaults to `resolveCopilotToken()`. */
|
|
25
|
+
token?: string | null;
|
|
26
|
+
/** Injectable for tests. */
|
|
27
|
+
fetchFn?: typeof fetch;
|
|
28
|
+
}
|
|
29
|
+
/** The monthly premium-request window, or null when there is no token, no meter or any failure. */
|
|
30
|
+
export declare function readCopilotPlanUsage(opts?: ReadCopilotPlanUsageOptions): Promise<StatusTelemetry | null>;
|
|
31
|
+
export interface CopilotPlanUsageGates {
|
|
32
|
+
/** `showPlanUsageLimits` as the server reads it (`readPlanUsageTelemetryEnabled()`: absent = on). */
|
|
33
|
+
planUsageEnabled: () => Promise<boolean>;
|
|
34
|
+
/** `resolveCopilotToken()`: env vars and a file read, nothing spawned. */
|
|
35
|
+
resolveToken: () => Promise<string | null>;
|
|
36
|
+
/** `isCopilotAvailable()`: its resolver may run a synchronous login-shell probe. */
|
|
37
|
+
copilotInstalled: () => boolean;
|
|
38
|
+
read: (token: string) => Promise<StatusTelemetry | null>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The server's poll: Copilot's quota, or null when Plan Usage Limits is off, there is no sign-in
|
|
42
|
+
* token or the CLI is not installed. Cheapest gate first, so a host with no Copilot sign-in never
|
|
43
|
+
* runs the CLI resolver on each tick, and nothing at all is read while Plan Usage Limits is off.
|
|
44
|
+
*/
|
|
45
|
+
export declare function readCopilotPlanUsageIfEnabled(gates: CopilotPlanUsageGates): Promise<StatusTelemetry | null>;
|
|
46
|
+
//# sourceMappingURL=copilot-plan-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-plan-usage.d.ts","sourceRoot":"","sources":["../../src/utils/copilot-plan-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExF,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAgBhF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,IAAI,GAAE,MAAkB,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,mGAAmG;AACnG,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,2BAAgC,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmBlH;AAED,MAAM,WAAW,qBAAqB;IACpC,qGAAqG;IACrG,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,0EAA0E;IAC1E,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAKjH"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview GitHub Copilot's monthly premium-request quota, for the header plan-usage chip.
|
|
3
|
+
*
|
|
4
|
+
* The Copilot CLI has no scriptable usage command (`copilot billing` exists only inside the TUI), but
|
|
5
|
+
* the same quota snapshot the editors show is `GET https://api.github.com/copilot_internal/user`,
|
|
6
|
+
* readable with the CLI's own sign-in token. The endpoint is not part of GitHub's documented REST API,
|
|
7
|
+
* so this is read-only, best-effort and silent: any failure (offline, 401, a changed shape) yields
|
|
8
|
+
* `null` and the chip simply has no Copilot row.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ The token is never logged, never put in an error and only ever sent to api.github.com over HTTPS
|
|
11
|
+
* (`redirect: 'error'`, so a redirect cannot carry it elsewhere).
|
|
12
|
+
*
|
|
13
|
+
* @module utils/copilot-plan-usage
|
|
14
|
+
*/
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { parseCopilotQuotaResponse } from '../usage-telemetry.js';
|
|
19
|
+
export const COPILOT_QUOTA_URL = 'https://api.github.com/copilot_internal/user';
|
|
20
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
21
|
+
/** Env names Copilot itself reads for a headless sign-in, in its own precedence order. */
|
|
22
|
+
const TOKEN_ENV_KEYS = ['COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN'];
|
|
23
|
+
/** The CLI writes `// ...` header comments above the JSON in config.json. */
|
|
24
|
+
function parseCommentedJson(raw) {
|
|
25
|
+
return JSON.parse(raw
|
|
26
|
+
.split('\n')
|
|
27
|
+
.filter((line) => !line.trimStart().startsWith('//'))
|
|
28
|
+
.join('\n'));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The sign-in token Copilot would use: a token in the environment first, then the plain-text
|
|
32
|
+
* `authTokens` entry the CLI keeps in `<COPILOT_HOME or ~/.copilot>/config.json` when no OS keychain
|
|
33
|
+
* is available. Only github.com sign-ins are read from the file (the quota URL is github.com's).
|
|
34
|
+
*/
|
|
35
|
+
export async function resolveCopilotToken(env = process.env, home = homedir()) {
|
|
36
|
+
for (const key of TOKEN_ENV_KEYS) {
|
|
37
|
+
const value = env[key]?.trim();
|
|
38
|
+
if (value)
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
const dir = env.COPILOT_HOME?.trim() || join(home, '.copilot');
|
|
42
|
+
try {
|
|
43
|
+
const config = parseCommentedJson(await readFile(join(dir, 'config.json'), 'utf8'));
|
|
44
|
+
const { host, login } = config.lastLoggedInUser ?? {};
|
|
45
|
+
if (host !== 'https://github.com' || !login || !config.authTokens)
|
|
46
|
+
return null;
|
|
47
|
+
for (const key of [`${host}:${login}`, `${host}:${login}:github`]) {
|
|
48
|
+
const token = config.authTokens[key]?.token;
|
|
49
|
+
if (typeof token === 'string' && token.trim())
|
|
50
|
+
return token.trim();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* no config, unreadable, or not JSON: no token */
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/** The monthly premium-request window, or null when there is no token, no meter or any failure. */
|
|
59
|
+
export async function readCopilotPlanUsage(opts = {}) {
|
|
60
|
+
const token = opts.token === undefined ? await resolveCopilotToken() : opts.token;
|
|
61
|
+
if (!token)
|
|
62
|
+
return null;
|
|
63
|
+
const doFetch = opts.fetchFn ?? fetch;
|
|
64
|
+
try {
|
|
65
|
+
const response = await doFetch(COPILOT_QUOTA_URL, {
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${token}`,
|
|
68
|
+
Accept: 'application/json',
|
|
69
|
+
'User-Agent': 'codeman',
|
|
70
|
+
},
|
|
71
|
+
redirect: 'error',
|
|
72
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
73
|
+
});
|
|
74
|
+
if (!response.ok)
|
|
75
|
+
return null;
|
|
76
|
+
return parseCopilotQuotaResponse(await response.json());
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The server's poll: Copilot's quota, or null when Plan Usage Limits is off, there is no sign-in
|
|
84
|
+
* token or the CLI is not installed. Cheapest gate first, so a host with no Copilot sign-in never
|
|
85
|
+
* runs the CLI resolver on each tick, and nothing at all is read while Plan Usage Limits is off.
|
|
86
|
+
*/
|
|
87
|
+
export async function readCopilotPlanUsageIfEnabled(gates) {
|
|
88
|
+
if (!(await gates.planUsageEnabled()))
|
|
89
|
+
return null;
|
|
90
|
+
const token = await gates.resolveToken();
|
|
91
|
+
if (!token || !gates.copilotInstalled())
|
|
92
|
+
return null;
|
|
93
|
+
return gates.read(token);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=copilot-plan-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-plan-usage.js","sourceRoot":"","sources":["../../src/utils/copilot-plan-usage.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { MAX_SESSION_TOKENS } from './token-validation.js';
|
|
|
17
17
|
export { isSafePushEndpoint } from './push-endpoint-validation.js';
|
|
18
18
|
export { stringSimilarity, fuzzyPhraseMatch, todoContentHash } from './string-similarity.js';
|
|
19
19
|
export { assertNever } from './type-safety.js';
|
|
20
|
+
export { toSingleLine } from './single-line.js';
|
|
20
21
|
export { wrapWithNice } from './nice-wrapper.js';
|
|
21
22
|
export { resolveLocalShell, loginShellArgs } from './shell-resolver.js';
|
|
22
23
|
export { findClaudeDir, getAugmentedPath, getClaudeCliVersion, getClaudeBinaryPath, getClaudeNotFoundMessage, } from './claude-cli-resolver.js';
|
|
@@ -32,6 +33,8 @@ export type { DeepSeekProfile, DeepSeekProfileKind } from './deepseek-cli-resolv
|
|
|
32
33
|
export { compileFileQuery, matchFileQuery } from './file-query.js';
|
|
33
34
|
export type { FileQueryMatcher } from './file-query.js';
|
|
34
35
|
export { resolveOmpDir, isOmpAvailable, getOmpNotFoundMessage, getOmpCliVersion } from './omp-cli-resolver.js';
|
|
36
|
+
export { resolveCopilotDir, isCopilotAvailable, getCopilotNotFoundMessage, getCopilotCliVersion, } from './copilot-cli-resolver.js';
|
|
37
|
+
export { readCopilotPlanUsage, resolveCopilotToken } from './copilot-plan-usage.js';
|
|
35
38
|
export { boundedPathExists, describeUnknownPath, probePath, probePathKind, isNearStalledPath, unknownPathReason, } from './bounded-path-probe.js';
|
|
36
39
|
export type { PathProbeState, PathProbeKind, PathProbeOptions } from './bounded-path-probe.js';
|
|
37
40
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export { MAX_SESSION_TOKENS } from './token-validation.js';
|
|
|
16
16
|
export { isSafePushEndpoint } from './push-endpoint-validation.js';
|
|
17
17
|
export { stringSimilarity, fuzzyPhraseMatch, todoContentHash } from './string-similarity.js';
|
|
18
18
|
export { assertNever } from './type-safety.js';
|
|
19
|
+
export { toSingleLine } from './single-line.js';
|
|
19
20
|
export { wrapWithNice } from './nice-wrapper.js';
|
|
20
21
|
export { resolveLocalShell, loginShellArgs } from './shell-resolver.js';
|
|
21
22
|
export { findClaudeDir, getAugmentedPath, getClaudeCliVersion, getClaudeBinaryPath, getClaudeNotFoundMessage, } from './claude-cli-resolver.js';
|
|
@@ -29,5 +30,7 @@ export { resolveGrokDir, isGrokAvailable, getGrokCliVersion, getGrokNotFoundMess
|
|
|
29
30
|
export { resolveDeepSeekDir, isDeepSeekAvailable, isDeepSeekRunnable, getDeepSeekCliVersion, getDeepSeekNotFoundMessage, listDeepSeekProfiles, resolveDefaultDeepSeekProfile, isLaunchableProfile, resolveDshHome, profileExists, } from './deepseek-cli-resolver.js';
|
|
30
31
|
export { compileFileQuery, matchFileQuery } from './file-query.js';
|
|
31
32
|
export { resolveOmpDir, isOmpAvailable, getOmpNotFoundMessage, getOmpCliVersion } from './omp-cli-resolver.js';
|
|
33
|
+
export { resolveCopilotDir, isCopilotAvailable, getCopilotNotFoundMessage, getCopilotCliVersion, } from './copilot-cli-resolver.js';
|
|
34
|
+
export { readCopilotPlanUsage, resolveCopilotToken } from './copilot-plan-usage.js';
|
|
32
35
|
export { boundedPathExists, describeUnknownPath, probePath, probePathKind, isNearStalledPath, unknownPathReason, } from './bounded-path-probe.js';
|
|
33
36
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACpH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Collapse a prompt onto the one line an unattended sender writes.
|
|
3
|
+
*
|
|
4
|
+
* @module utils/single-line
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A prompt as one line: each line is trimmed, blank lines are dropped, and the rest
|
|
8
|
+
* are joined with a single space; a prompt without a line break is returned as is.
|
|
9
|
+
*
|
|
10
|
+
* For the senders that run unattended through `writeViaMux` (respawn's update and
|
|
11
|
+
* kickstart steps, auto-compact). The mux pastes a multi-line prompt as one block,
|
|
12
|
+
* and the check that re-presses a stranded Enter cannot reliably recognise a
|
|
13
|
+
* multi-line paste in the composer, so nobody would notice a prompt left unsubmitted.
|
|
14
|
+
* Cron rejects multi-line prompts for the same reason; these senders join them
|
|
15
|
+
* instead, so a saved multi-line setting is still sent rather than refused.
|
|
16
|
+
*
|
|
17
|
+
* Split and trim, which is linear, rather than one regex replace that folds the
|
|
18
|
+
* whitespace around each break: that regex backtracks quadratically over a long
|
|
19
|
+
* whitespace run (50,000 spaces took over a second).
|
|
20
|
+
*/
|
|
21
|
+
export declare function toSingleLine(prompt: string): string;
|
|
22
|
+
//# sourceMappingURL=single-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-line.d.ts","sourceRoot":"","sources":["../../src/utils/single-line.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOnD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Collapse a prompt onto the one line an unattended sender writes.
|
|
3
|
+
*
|
|
4
|
+
* @module utils/single-line
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A prompt as one line: each line is trimmed, blank lines are dropped, and the rest
|
|
8
|
+
* are joined with a single space; a prompt without a line break is returned as is.
|
|
9
|
+
*
|
|
10
|
+
* For the senders that run unattended through `writeViaMux` (respawn's update and
|
|
11
|
+
* kickstart steps, auto-compact). The mux pastes a multi-line prompt as one block,
|
|
12
|
+
* and the check that re-presses a stranded Enter cannot reliably recognise a
|
|
13
|
+
* multi-line paste in the composer, so nobody would notice a prompt left unsubmitted.
|
|
14
|
+
* Cron rejects multi-line prompts for the same reason; these senders join them
|
|
15
|
+
* instead, so a saved multi-line setting is still sent rather than refused.
|
|
16
|
+
*
|
|
17
|
+
* Split and trim, which is linear, rather than one regex replace that folds the
|
|
18
|
+
* whitespace around each break: that regex backtracks quadratically over a long
|
|
19
|
+
* whitespace run (50,000 spaces took over a second).
|
|
20
|
+
*/
|
|
21
|
+
export function toSingleLine(prompt) {
|
|
22
|
+
if (!/[\r\n]/.test(prompt))
|
|
23
|
+
return prompt;
|
|
24
|
+
return prompt
|
|
25
|
+
.split(/[\r\n]+/)
|
|
26
|
+
.map((line) => line.trim())
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join(' ');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=single-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-line.js","sourceRoot":"","sources":["../../src/utils/single-line.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO,MAAM;SACV,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -107,6 +107,12 @@ interface NotePromptArgs {
|
|
|
107
107
|
* `ApprovalItem.answerInTerminal`.
|
|
108
108
|
*/
|
|
109
109
|
answerInTerminal?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* An idle prompt that should open ALREADY acknowledged for a reason other than
|
|
112
|
+
* `watching`, e.g. `cache keep-alive` when the turn that just ended was Codeman's own
|
|
113
|
+
* prompt-cache nudge. Same consequence as `watching`: the item exists, only its alert is spent.
|
|
114
|
+
*/
|
|
115
|
+
preAcknowledged?: string;
|
|
110
116
|
/** Returns the raw (ANSI-bearing) pane frame, or null when unavailable. */
|
|
111
117
|
capture?: () => string | null;
|
|
112
118
|
/**
|