@knpkv/herdr-usage 0.0.0-stage → 0.1.1

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -2
  3. package/dist/app.d.ts +18 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +77 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +24 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/client/client.css +2 -0
  12. package/dist/client/client.css.map +7 -0
  13. package/dist/client/client.js +180 -0
  14. package/dist/client/client.js.map +7 -0
  15. package/dist/client.d.ts +3 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +88 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/host/failure.d.ts +15 -0
  20. package/dist/host/failure.d.ts.map +1 -0
  21. package/dist/host/failure.js +44 -0
  22. package/dist/host/failure.js.map +1 -0
  23. package/dist/host/limits.d.ts +59 -0
  24. package/dist/host/limits.d.ts.map +1 -0
  25. package/dist/host/limits.js +96 -0
  26. package/dist/host/limits.js.map +1 -0
  27. package/dist/host/usage.d.ts +93 -0
  28. package/dist/host/usage.d.ts.map +1 -0
  29. package/dist/host/usage.js +95 -0
  30. package/dist/host/usage.js.map +1 -0
  31. package/dist/host.d.ts +12 -0
  32. package/dist/host.d.ts.map +1 -0
  33. package/dist/host.js +12 -0
  34. package/dist/host.js.map +1 -0
  35. package/dist/options.d.ts +24 -0
  36. package/dist/options.d.ts.map +1 -0
  37. package/dist/options.js +28 -0
  38. package/dist/options.js.map +1 -0
  39. package/dist/selection.d.ts +8 -0
  40. package/dist/selection.d.ts.map +1 -0
  41. package/dist/selection.js +8 -0
  42. package/dist/selection.js.map +1 -0
  43. package/dist/views/usage-empty-art.d.ts +4 -0
  44. package/dist/views/usage-empty-art.d.ts.map +1 -0
  45. package/dist/views/usage-empty-art.js +8 -0
  46. package/dist/views/usage-empty-art.js.map +1 -0
  47. package/dist/views/usage-limits-chart-view.d.ts +12 -0
  48. package/dist/views/usage-limits-chart-view.d.ts.map +1 -0
  49. package/dist/views/usage-limits-chart-view.js +8 -0
  50. package/dist/views/usage-limits-chart-view.js.map +1 -0
  51. package/dist/views/usage-limits-chart.d.ts +28 -0
  52. package/dist/views/usage-limits-chart.d.ts.map +1 -0
  53. package/dist/views/usage-limits-chart.js +50 -0
  54. package/dist/views/usage-limits-chart.js.map +1 -0
  55. package/dist/views/usage-limits-page.d.ts +61 -0
  56. package/dist/views/usage-limits-page.d.ts.map +1 -0
  57. package/dist/views/usage-limits-page.js +275 -0
  58. package/dist/views/usage-limits-page.js.map +1 -0
  59. package/dist/views/usage-limits-view.d.ts +20 -0
  60. package/dist/views/usage-limits-view.d.ts.map +1 -0
  61. package/dist/views/usage-limits-view.js +36 -0
  62. package/dist/views/usage-limits-view.js.map +1 -0
  63. package/dist/views/usage-page.d.ts +53 -0
  64. package/dist/views/usage-page.d.ts.map +1 -0
  65. package/dist/views/usage-page.js +242 -0
  66. package/dist/views/usage-page.js.map +1 -0
  67. package/dist/views/usage-selection.d.ts +24 -0
  68. package/dist/views/usage-selection.d.ts.map +1 -0
  69. package/dist/views/usage-selection.js +51 -0
  70. package/dist/views/usage-selection.js.map +1 -0
  71. package/dist/views/views.css +1034 -0
  72. package/dist/views.d.ts +13 -0
  73. package/dist/views.d.ts.map +1 -0
  74. package/dist/views.js +13 -0
  75. package/dist/views.js.map +1 -0
  76. package/package.json +90 -3
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The `herdr-usage` executable's options, read from its environment. `HERDR_USAGE_LIMITS_COMMAND` (a JSON array)
3
+ * overrides the agent-usage command a standalone run reads this machine with. Unset, it is the installed
4
+ * `@knpkv/agent-usage` run by the same node: no PATH lookup and no `.cmd` shim, which Windows can't spawn without a
5
+ * shell. Set but malformed, it is refused rather than quietly replaced by the default.
6
+ *
7
+ * @module
8
+ */
9
+ import { Result, Schema } from "effect";
10
+ /** `HERDR_USAGE_LIMITS_COMMAND` is set but isn't a non-empty JSON array of strings. */
11
+ export class UsageLimitsCommandInvalid extends Schema.TaggedError()("UsageLimitsCommandInvalid", { message: Schema.String }) {
12
+ }
13
+ const LimitsCommand = Schema.fromJsonString(Schema.NonEmptyArray(Schema.String));
14
+ export const readUsageOptions = (env, runtime) => {
15
+ const configured = env.HERDR_USAGE_LIMITS_COMMAND;
16
+ if (configured === undefined) {
17
+ return Result.succeed({
18
+ limitsCommand: [runtime.execPath, runtime.resolve("@knpkv/agent-usage/main.js"), "limits"]
19
+ });
20
+ }
21
+ return Result.mapBoth(Schema.decodeUnknownResult(LimitsCommand)(configured), {
22
+ onFailure: () => new UsageLimitsCommandInvalid({
23
+ message: "HERDR_USAGE_LIMITS_COMMAND must be a JSON array of strings, like [\"agent-usage\",\"limits\"]."
24
+ }),
25
+ onSuccess: (limitsCommand) => ({ limitsCommand })
26
+ });
27
+ };
28
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGvC,uFAAuF;AACvF,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC5F,2BAA2B,EAC3B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAC3B;CAAG;AAQJ,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AAEhF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAiD,EACjD,OAAqB,EACsC,EAAE;IAC7D,MAAM,UAAU,GAAG,GAAG,CAAC,0BAA0B,CAAA;IACjD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC;YACpB,aAAa,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,EAAE,QAAQ,CAAC;SAC3F,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,EAAE;QAC3E,SAAS,EAAE,GAAG,EAAE,CACd,IAAI,yBAAyB,CAAC;YAC5B,OAAO,EAAE,gGAAgG;SAC1G,CAAC;QACJ,SAAS,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;KAClD,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `@knpkv/herdr-usage/selection` — the Usage page's selectors (range, zone, host) and their canonical form.
3
+ * No React: the hub's route code and the app's client both read it.
4
+ *
5
+ * @module
6
+ */
7
+ export * from "./views/usage-selection.js";
8
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,4BAA4B,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `@knpkv/herdr-usage/selection` — the Usage page's selectors (range, zone, host) and their canonical form.
3
+ * No React: the hub's route code and the app's client both read it.
4
+ *
5
+ * @module
6
+ */
7
+ export * from "./views/usage-selection.js";
8
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,4BAA4B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type ReactElement } from "react";
2
+ /** Static decorative empty-state drawing from the reviewed export63 frame; clip ids belong to each instance. */
3
+ export declare const UsageEmptyArt: () => ReactElement;
4
+ //# sourceMappingURL=usage-empty-art.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-empty-art.d.ts","sourceRoot":"","sources":["../../src/views/usage-empty-art.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAEhD,gHAAgH;AAChH,eAAO,MAAM,aAAa,QAAO,YAiFhC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ /** Static decorative empty-state drawing from the reviewed export63 frame; clip ids belong to each instance. */
4
+ export const UsageEmptyArt = () => {
5
+ const seed = useId();
6
+ return (_jsxs("svg", { viewBox: "-6 -6 44 44", width: "88", height: "88", fill: "none", "aria-hidden": "true", focusable: "false", className: "usage-empty-art", children: [_jsxs("defs", { children: [_jsx("clipPath", { id: `${seed}-b`, children: _jsx("path", { d: "M4 18.75A12 12 0 1 0 28 18.75A12 12 0 1 0 4 18.75Z" }) }), _jsx("clipPath", { id: `${seed}-e0`, children: _jsx("path", { d: "M13.875 18.59C13.875 18.784 13.866 19.027 13.848 19.209C13.83 19.39 13.803 19.532 13.768 19.678C13.732 19.824 13.688 19.958 13.635 20.083C13.582 20.208 13.521 20.324 13.452 20.431C13.383 20.537 13.305 20.634 13.22 20.72C13.135 20.807 13.043 20.884 12.943 20.95C12.842 21.015 12.736 21.071 12.619 21.116C12.503 21.16 12.389 21.194 12.244 21.216C12.099 21.239 11.915 21.25 11.75 21.25C11.585 21.25 11.401 21.239 11.256 21.216C11.111 21.194 10.997 21.16 10.881 21.116C10.764 21.071 10.658 21.015 10.557 20.95C10.457 20.884 10.365 20.807 10.28 20.72C10.195 20.634 10.117 20.537 10.048 20.431C9.979 20.324 9.918 20.208 9.865 20.083C9.812 19.958 9.768 19.824 9.732 19.678C9.697 19.532 9.67 19.39 9.652 19.209C9.634 19.027 9.625 18.784 9.625 18.59C9.625 18.397 9.634 18.206 9.652 18.046C9.67 17.887 9.697 17.761 9.732 17.633C9.768 17.505 9.812 17.387 9.865 17.277C9.918 17.167 9.979 17.065 10.048 16.971C10.117 16.878 10.195 16.792 10.28 16.716C10.365 16.64 10.457 16.572 10.557 16.514C10.658 16.456 10.764 16.407 10.881 16.368C10.997 16.329 11.111 16.299 11.256 16.28C11.401 16.26 11.585 16.25 11.75 16.25C11.915 16.25 12.099 16.26 12.244 16.28C12.389 16.299 12.503 16.329 12.619 16.368C12.736 16.407 12.842 16.456 12.943 16.514C13.043 16.572 13.135 16.64 13.22 16.716C13.305 16.792 13.383 16.878 13.452 16.971C13.521 17.065 13.582 17.167 13.635 17.277C13.688 17.387 13.732 17.505 13.768 17.633C13.803 17.761 13.83 17.887 13.848 18.046C13.866 18.206 13.875 18.397 13.875 18.59Z" }) }), _jsx("clipPath", { id: `${seed}-e1`, children: _jsx("path", { d: "M22.375 18.59C22.375 18.784 22.366 19.027 22.348 19.209C22.33 19.39 22.303 19.532 22.268 19.678C22.232 19.824 22.188 19.958 22.135 20.083C22.082 20.208 22.021 20.324 21.952 20.431C21.883 20.537 21.805 20.634 21.72 20.72C21.635 20.807 21.543 20.884 21.443 20.95C21.342 21.015 21.236 21.071 21.119 21.116C21.003 21.16 20.889 21.194 20.744 21.216C20.599 21.239 20.415 21.25 20.25 21.25C20.085 21.25 19.901 21.239 19.756 21.216C19.611 21.194 19.497 21.16 19.381 21.116C19.264 21.071 19.158 21.015 19.057 20.95C18.957 20.884 18.865 20.807 18.78 20.72C18.695 20.634 18.617 20.537 18.548 20.431C18.479 20.324 18.418 20.208 18.365 20.083C18.312 19.958 18.268 19.824 18.232 19.678C18.197 19.532 18.17 19.39 18.152 19.209C18.134 19.027 18.125 18.784 18.125 18.59C18.125 18.397 18.134 18.206 18.152 18.046C18.17 17.887 18.197 17.761 18.232 17.633C18.268 17.505 18.312 17.387 18.365 17.277C18.418 17.167 18.479 17.065 18.548 16.971C18.617 16.878 18.695 16.792 18.78 16.716C18.865 16.64 18.957 16.572 19.057 16.514C19.158 16.456 19.264 16.407 19.381 16.368C19.497 16.329 19.611 16.299 19.756 16.28C19.901 16.26 20.085 16.25 20.25 16.25C20.415 16.25 20.599 16.26 20.744 16.28C20.889 16.299 21.003 16.329 21.119 16.368C21.236 16.407 21.342 16.456 21.443 16.514C21.543 16.572 21.635 16.64 21.72 16.716C21.805 16.792 21.883 16.878 21.952 16.971C22.021 17.065 22.082 17.167 22.135 17.277C22.188 17.387 22.232 17.505 22.268 17.633C22.303 17.761 22.33 17.887 22.348 18.046C22.366 18.206 22.375 18.397 22.375 18.59Z" }) })] }), _jsx("ellipse", { cx: "16", cy: "30.75", rx: "8.64", ry: "1", fill: "#002b27", fillOpacity: "0.16" }), _jsxs("g", { transform: "translate(0 0) rotate(0 16 30.75) translate(16 30.75) scale(1 1) translate(-16 -30.75)", children: [_jsx("path", { d: "M4 18.75A12 12 0 1 0 28 18.75A12 12 0 1 0 4 18.75Z", fill: "#007068" }), _jsx("g", { clipPath: `url(#${seed}-b)`, children: _jsx("path", { d: "M2.75 17.13A11.88 11.88 0 1 0 26.51 17.13A11.88 11.88 0 1 0 2.75 17.13Z", fill: "#009794" }) }), _jsx("rect", { x: "-2.5", y: "-0.8", width: "5", height: "1.6", rx: "0.8", transform: "translate(7.6 18.03) rotate(-64)", fill: "#00b8b8" }), _jsx("g", { clipPath: `url(#${seed}-b)`, children: _jsxs("g", { transform: "translate(0 0)", children: [_jsx("ellipse", { cx: "8", cy: "22.15", rx: "1.8", ry: "1", fill: "#f17993", fillOpacity: "0.5" }), _jsx("ellipse", { cx: "24", cy: "22.15", rx: "1.8", ry: "1", fill: "#f17993", fillOpacity: "0.5" }), _jsx("path", { d: "M13.875 18.59C13.875 18.784 13.866 19.027 13.848 19.209C13.83 19.39 13.803 19.532 13.768 19.678C13.732 19.824 13.688 19.958 13.635 20.083C13.582 20.208 13.521 20.324 13.452 20.431C13.383 20.537 13.305 20.634 13.22 20.72C13.135 20.807 13.043 20.884 12.943 20.95C12.842 21.015 12.736 21.071 12.619 21.116C12.503 21.16 12.389 21.194 12.244 21.216C12.099 21.239 11.915 21.25 11.75 21.25C11.585 21.25 11.401 21.239 11.256 21.216C11.111 21.194 10.997 21.16 10.881 21.116C10.764 21.071 10.658 21.015 10.557 20.95C10.457 20.884 10.365 20.807 10.28 20.72C10.195 20.634 10.117 20.537 10.048 20.431C9.979 20.324 9.918 20.208 9.865 20.083C9.812 19.958 9.768 19.824 9.732 19.678C9.697 19.532 9.67 19.39 9.652 19.209C9.634 19.027 9.625 18.784 9.625 18.59C9.625 18.397 9.634 18.206 9.652 18.046C9.67 17.887 9.697 17.761 9.732 17.633C9.768 17.505 9.812 17.387 9.865 17.277C9.918 17.167 9.979 17.065 10.048 16.971C10.117 16.878 10.195 16.792 10.28 16.716C10.365 16.64 10.457 16.572 10.557 16.514C10.658 16.456 10.764 16.407 10.881 16.368C10.997 16.329 11.111 16.299 11.256 16.28C11.401 16.26 11.585 16.25 11.75 16.25C11.915 16.25 12.099 16.26 12.244 16.28C12.389 16.299 12.503 16.329 12.619 16.368C12.736 16.407 12.842 16.456 12.943 16.514C13.043 16.572 13.135 16.64 13.22 16.716C13.305 16.792 13.383 16.878 13.452 16.971C13.521 17.065 13.582 17.167 13.635 17.277C13.688 17.387 13.732 17.505 13.768 17.633C13.803 17.761 13.83 17.887 13.848 18.046C13.866 18.206 13.875 18.397 13.875 18.59Z", fill: "#f6fbfb" }), _jsxs("g", { clipPath: `url(#${seed}-e0)`, children: [_jsx("circle", { cx: "11.75", cy: "19.15", r: "1.573", fill: "#007068" }), _jsx("circle", { cx: "11.75", cy: "19.244", r: "0.818", fill: "#002b27" }), _jsx("circle", { cx: "11.184", cy: "18.521", r: "0.566", fill: "#ffffff" }), _jsx("circle", { cx: "12.41", cy: "19.748", r: "0.22", fill: "#ffffff" })] }), _jsx("path", { d: "M22.375 18.59C22.375 18.784 22.366 19.027 22.348 19.209C22.33 19.39 22.303 19.532 22.268 19.678C22.232 19.824 22.188 19.958 22.135 20.083C22.082 20.208 22.021 20.324 21.952 20.431C21.883 20.537 21.805 20.634 21.72 20.72C21.635 20.807 21.543 20.884 21.443 20.95C21.342 21.015 21.236 21.071 21.119 21.116C21.003 21.16 20.889 21.194 20.744 21.216C20.599 21.239 20.415 21.25 20.25 21.25C20.085 21.25 19.901 21.239 19.756 21.216C19.611 21.194 19.497 21.16 19.381 21.116C19.264 21.071 19.158 21.015 19.057 20.95C18.957 20.884 18.865 20.807 18.78 20.72C18.695 20.634 18.617 20.537 18.548 20.431C18.479 20.324 18.418 20.208 18.365 20.083C18.312 19.958 18.268 19.824 18.232 19.678C18.197 19.532 18.17 19.39 18.152 19.209C18.134 19.027 18.125 18.784 18.125 18.59C18.125 18.397 18.134 18.206 18.152 18.046C18.17 17.887 18.197 17.761 18.232 17.633C18.268 17.505 18.312 17.387 18.365 17.277C18.418 17.167 18.479 17.065 18.548 16.971C18.617 16.878 18.695 16.792 18.78 16.716C18.865 16.64 18.957 16.572 19.057 16.514C19.158 16.456 19.264 16.407 19.381 16.368C19.497 16.329 19.611 16.299 19.756 16.28C19.901 16.26 20.085 16.25 20.25 16.25C20.415 16.25 20.599 16.26 20.744 16.28C20.889 16.299 21.003 16.329 21.119 16.368C21.236 16.407 21.342 16.456 21.443 16.514C21.543 16.572 21.635 16.64 21.72 16.716C21.805 16.792 21.883 16.878 21.952 16.971C22.021 17.065 22.082 17.167 22.135 17.277C22.188 17.387 22.232 17.505 22.268 17.633C22.303 17.761 22.33 17.887 22.348 18.046C22.366 18.206 22.375 18.397 22.375 18.59Z", fill: "#f6fbfb" }), _jsxs("g", { clipPath: `url(#${seed}-e1)`, children: [_jsx("circle", { cx: "20.25", cy: "19.15", r: "1.573", fill: "#007068" }), _jsx("circle", { cx: "20.25", cy: "19.244", r: "0.818", fill: "#002b27" }), _jsx("circle", { cx: "19.684", cy: "18.521", r: "0.566", fill: "#ffffff" }), _jsx("circle", { cx: "20.91", cy: "19.748", r: "0.22", fill: "#ffffff" })] }), _jsx("path", { d: "M9.85 14.5Q11.55 13.15 13.45 14.6", stroke: "#002b27", strokeOpacity: "0.9", strokeWidth: "1.15", strokeLinecap: "round" }), _jsx("path", { d: "M22.15 14.5Q20.45 13.15 18.55 14.6", stroke: "#002b27", strokeOpacity: "0.9", strokeWidth: "1.15", strokeLinecap: "round" })] }) })] })] }));
7
+ };
8
+ //# sourceMappingURL=usage-empty-art.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-empty-art.js","sourceRoot":"","sources":["../../src/views/usage-empty-art.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ReactElement } from "react";
2
+ import type { LimitsChart } from "./usage-limits-chart.js";
3
+ /**
4
+ * The Limits page's token chart (06 Usage): every bar prints its value, and the legend says each tool's total in
5
+ * text, so nothing is told by colour alone. The figure's accessible name reads every bar; the drawing is hidden.
6
+ */
7
+ export declare const UsageLimitsChart: ({ chart, overview }: {
8
+ readonly chart: LimitsChart;
9
+ /** Where "Fleet token overview" leads: the Tokens page. */
10
+ readonly overview: string;
11
+ }) => ReactElement;
12
+ //# sourceMappingURL=usage-limits-chart-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-chart-view.d.ts","sourceRoot":"","sources":["../../src/views/usage-limits-chart-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,wBAG1B;IACD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,KAAG,YAkCH,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "@knpkv/rly/foundations";
3
+ /**
4
+ * The Limits page's token chart (06 Usage): every bar prints its value, and the legend says each tool's total in
5
+ * text, so nothing is told by colour alone. The figure's accessible name reads every bar; the drawing is hidden.
6
+ */
7
+ export const UsageLimitsChart = ({ chart, overview }) => (_jsxs("figure", { className: "usage-limits-chart", "aria-label": chart.label, "data-region": "detail", children: [_jsxs("div", { className: "usage-limits-chart-head", children: [_jsx("h2", { children: chart.title }), _jsxs("a", { href: overview, children: ["Fleet token overview", _jsx(Icon, { name: "chevron-right", size: "small", decorative: true })] })] }), _jsx("div", { className: "usage-limits-bars", "aria-hidden": "true", style: { gridTemplateColumns: `repeat(${String(chart.bars.length)}, minmax(0, 1fr))` }, children: chart.bars.map((bar, index) => (_jsxs("div", { className: "usage-limits-bar", children: [_jsx("span", { className: "usage-limits-bar-value", children: bar.value }), _jsx("span", { className: "usage-limits-bar-fill", style: { blockSize: `${String(bar.height)}px` } }), _jsx("span", { className: "usage-limits-bar-period", children: bar.period })] }, index))) }), _jsx("figcaption", { children: chart.legend.map((entry) => (_jsx("span", { "data-total": entry.total ? "true" : undefined, "data-unknown": entry.unknown ? "true" : undefined, children: entry.text }, entry.text))) })] }));
8
+ //# sourceMappingURL=usage-limits-chart-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-chart-view.js","sourceRoot":"","sources":["../../src/views/usage-limits-chart-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAI7C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,KAAK,EACL,QAAQ,EAKT,EAAgB,EAAE,CAAC,CAClB,kBAAQ,SAAS,EAAC,oBAAoB,gBAAa,KAAK,CAAC,KAAK,iBAAc,QAAQ,aAClF,eAAK,SAAS,EAAC,yBAAyB,aACtC,uBAAK,KAAK,CAAC,KAAK,GAAM,EACtB,aAAG,IAAI,EAAE,QAAQ,qCAEf,KAAC,IAAI,IAAC,IAAI,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,EAAC,UAAU,SAAG,IACnD,IACA,EACN,cACE,SAAS,EAAC,mBAAmB,iBACjB,MAAM,EAClB,KAAK,EAAE,EAAE,mBAAmB,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,YAErF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,eAAiB,SAAS,EAAC,kBAAkB,aAC3C,eAAM,SAAS,EAAC,wBAAwB,YAAE,GAAG,CAAC,KAAK,GAAQ,EAC3D,eAAM,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAI,EAC3F,eAAM,SAAS,EAAC,yBAAyB,YAAE,GAAG,CAAC,MAAM,GAAQ,KAHrD,KAAK,CAIT,CACP,CAAC,GACE,EACN,+BACG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,6BAEc,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,kBAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAE/C,KAAK,CAAC,IAAI,IAJN,KAAK,CAAC,IAAI,CAKV,CACR,CAAC,GACS,IACN,CACV,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The Limits page's token chart as the 06 Usage design draws it: the hub's own tokens per period, each bar labelled
3
+ * with its value, and a text legend with per-tool totals. A tool whose limits cannot be read is left out of every
4
+ * total and named as excluded: Unknown is not zero. Pure: the caller supplies the page time zone.
5
+ *
6
+ * @module
7
+ */
8
+ import { type Agent } from "@knpkv/agent-usage/limits";
9
+ import type { FleetUsage } from "@knpkv/herdr-connect/usage";
10
+ export interface LimitsChart {
11
+ /** "Tokens on atlas, last 7 days", with ", Claude only" when a tool is excluded. */
12
+ readonly title: string;
13
+ /** Every bar in words, for the figure's accessible name. */
14
+ readonly label: string;
15
+ readonly bars: ReadonlyArray<{
16
+ readonly period: string;
17
+ readonly value: string;
18
+ readonly height: number;
19
+ }>;
20
+ readonly legend: ReadonlyArray<{
21
+ readonly text: string;
22
+ readonly total: boolean;
23
+ readonly unknown: boolean;
24
+ }>;
25
+ }
26
+ /** The chart for `host`'s own usage read, without `excluded` tools, or null when that host has no read. */
27
+ export declare const limitsChart: (fleet: FleetUsage, host: string, excluded: ReadonlyArray<Agent>) => LimitsChart | null;
28
+ //# sourceMappingURL=usage-limits-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-chart.d.ts","sourceRoot":"","sources":["../../src/views/usage-limits-chart.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1G,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAC9G;AAuBD,2GAA2G;AAC3G,eAAO,MAAM,WAAW,UACf,UAAU,QACX,MAAM,YACF,aAAa,CAAC,KAAK,CAAC,KAC7B,WAAW,GAAG,IAmChB,CAAA"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The Limits page's token chart as the 06 Usage design draws it: the hub's own tokens per period, each bar labelled
3
+ * with its value, and a text legend with per-tool totals. A tool whose limits cannot be read is left out of every
4
+ * total and named as excluded: Unknown is not zero. Pure: the caller supplies the page time zone.
5
+ *
6
+ * @module
7
+ */
8
+ import { agentName } from "@knpkv/agent-usage/limits";
9
+ const rangeWords = { "24h": "last 24 hours", "7d": "last 7 days", "30d": "last 30 days" };
10
+ const agents = ["claude", "codex"];
11
+ /** The tallest bar's height in pixels; every bar keeps at least 4px so a quiet period stays visible. */
12
+ const tallest = 140;
13
+ const compact = new Intl.NumberFormat("en", { notation: "compact", maximumFractionDigits: 1 });
14
+ const periodLabel = (start, range) => new Intl.DateTimeFormat("en-GB", range.bucket === "hour"
15
+ ? { hour: "2-digit", minute: "2-digit", timeZone: range.timeZone }
16
+ : range.bucket === "week"
17
+ ? { day: "numeric", month: "short", timeZone: range.timeZone }
18
+ : { weekday: "short", timeZone: range.timeZone }).format(start);
19
+ /** The chart for `host`'s own usage read, without `excluded` tools, or null when that host has no read. */
20
+ export const limitsChart = (fleet, host, excluded) => {
21
+ const own = fleet.hosts.find((entry) => entry.host.toLowerCase() === host.toLowerCase());
22
+ if (own === undefined || own.reading._tag !== "Read")
23
+ return null;
24
+ const usage = own.reading.usage;
25
+ const counted = usage.tokens.filter((cell) => !excluded.includes(cell.agent));
26
+ const perPeriod = usage.periods.map((_, index) => counted.filter((cell) => cell.period === index).reduce((sum, cell) => sum + cell.tokens, 0));
27
+ const max = Math.max(0, ...perPeriod);
28
+ const included = agents.filter((agent) => !excluded.includes(agent));
29
+ const only = excluded.length === 0 ? "" : `, ${included.map(agentName).join(" and ")} only`;
30
+ const title = `Tokens on ${own.host}, ${rangeWords[usage.range.preset]}${only}`;
31
+ const bars = usage.periods.map((period, index) => ({
32
+ period: periodLabel(period.start, usage.range),
33
+ value: compact.format(perPeriod[index] ?? 0),
34
+ height: max === 0 ? 4 : Math.max(4, Math.round(((perPeriod[index] ?? 0) / max) * tallest))
35
+ }));
36
+ const total = perPeriod.reduce((sum, value) => sum + value, 0);
37
+ const agentTotal = (agent) => counted.filter((cell) => cell.agent === agent).reduce((sum, cell) => sum + cell.tokens, 0);
38
+ return {
39
+ title,
40
+ label: `${own.host} tokens ${rangeWords[usage.range.preset]}${only}: ${bars.map((bar) => `${bar.period} ${bar.value}`).join(", ")}`,
41
+ bars,
42
+ legend: [
43
+ ...agents.map((agent) => excluded.includes(agent)
44
+ ? { text: `${agentName(agent)} Unknown, excluded`, total: false, unknown: true }
45
+ : { text: `${agentName(agent)} ${compact.format(agentTotal(agent))}`, total: false, unknown: false }),
46
+ { text: `${compact.format(total)} ${excluded.length === 0 ? "total" : "counted"}`, total: true, unknown: false }
47
+ ]
48
+ };
49
+ };
50
+ //# sourceMappingURL=usage-limits-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-chart.js","sourceRoot":"","sources":["../../src/views/usage-limits-chart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The Usage Limits page as the 06 Usage design draws it: one verdict sentence about the hub, notices for old or
3
+ * unreadable limits, then one card per tool. Built from the hub's own `agent-usage limits` read; other hosts'
4
+ * account limits stay on their machines. agent-usage's own model decides each window's tone and freshness. Pure:
5
+ * the caller supplies the hub's clock and the page time zone.
6
+ *
7
+ * @module
8
+ */
9
+ import { type Agent, type WindowSummary } from "@knpkv/agent-usage/limits";
10
+ import type { FleetLimits } from "@knpkv/herdr-connect/usage";
11
+ type Tone = "neutral" | "caution" | "critical";
12
+ export interface LimitsCard {
13
+ readonly agent: Agent;
14
+ readonly name: string;
15
+ /** "atlas, read 14:01", "atlas, sign-in required" or "atlas, could not be fetched". */
16
+ readonly read: string;
17
+ /** Share of the tool's primary window, or null when it cannot be read. */
18
+ readonly figure: number | null;
19
+ /** What the figure measures: "5-hour limit used". */
20
+ readonly measures: string;
21
+ readonly state: {
22
+ readonly label: string;
23
+ readonly tone: Tone;
24
+ } | null;
25
+ readonly track: {
26
+ readonly value: number;
27
+ readonly stale: boolean;
28
+ readonly label: string;
29
+ readonly valueText: string;
30
+ } | null;
31
+ /** Term and value; a null value reads "Unknown". */
32
+ readonly details: ReadonlyArray<readonly [string, string | null]>;
33
+ readonly note: string | null;
34
+ }
35
+ export interface LimitsPage {
36
+ readonly summary: {
37
+ readonly verdict: string;
38
+ readonly note: string;
39
+ };
40
+ readonly notices: ReadonlyArray<{
41
+ readonly title: string;
42
+ readonly text: string;
43
+ }>;
44
+ readonly cards: ReadonlyArray<LimitsCard>;
45
+ }
46
+ type Status = "unknown" | "stale" | "at-limit" | "near" | "ok";
47
+ /**
48
+ * A primary window's status. The tone is agent-usage's: it counts a window projected to run out before its reset
49
+ * as near, whatever share it has used.
50
+ */
51
+ export declare const windowStatus: (window: Pick<WindowSummary, "tone" | "freshness" | "usedPercent"> | undefined) => Status;
52
+ /** A reset as the cards print it, in `timeZone` relative to `now`: "Today, 16:40", "Next Sunday, 07:00". */
53
+ export declare const resetLabel: (at: number, now: number, timeZone: string) => string;
54
+ /**
55
+ * The page for `host`'s own read, `sinceLoad` ms after the page received it, or null when that host has no limits
56
+ * reading to show (the page then shows its empty or unavailable state). Every tool gets a card: a tool with nothing
57
+ * readable is Unknown, never left out.
58
+ */
59
+ export declare const limitsPage: (fleet: FleetLimits, host: string, sinceLoad: number, timeZone: string) => LimitsPage | null;
60
+ export {};
61
+ //# sourceMappingURL=usage-limits-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-page.d.ts","sourceRoot":"","sources":["../../src/views/usage-limits-page.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,KAAK,KAAK,EAMV,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D,KAAK,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAA;AAE9C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;IACtE,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;QACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAC3B,GAAG,IAAI,CAAA;IACR,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACrE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClF,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CAC1C;AAQD,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;AAiB9D;;;GAGG;AACH,eAAO,MAAM,YAAY,WACf,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,SAAS,KAC5E,MAIF,CAAA;AAyCD,4GAA4G;AAC5G,eAAO,MAAM,UAAU,OAAQ,MAAM,OAAO,MAAM,YAAY,MAAM,KAAG,MAA4C,CAAA;AA+KnH;;;;GAIG;AACH,eAAO,MAAM,UAAU,UACd,WAAW,QACZ,MAAM,aACD,MAAM,YACP,MAAM,KACf,UAAU,GAAG,IAqDf,CAAA"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * The Usage Limits page as the 06 Usage design draws it: one verdict sentence about the hub, notices for old or
3
+ * unreadable limits, then one card per tool. Built from the hub's own `agent-usage limits` read; other hosts'
4
+ * account limits stay on their machines. agent-usage's own model decides each window's tone and freshness. Pure:
5
+ * the caller supplies the hub's clock and the page time zone.
6
+ *
7
+ * @module
8
+ */
9
+ import { agentName, summarizeLimits, windowName } from "@knpkv/agent-usage/limits";
10
+ /** Claude is limited by its 5-hour window first, Codex by its weekly one. */
11
+ const primaryWindow = { claude: "5-hour", codex: "Weekly" };
12
+ const agents = ["claude", "codex"];
13
+ /** Only these reasons mean the account needs a sign-in; any other failure is Unknown with its own cause. */
14
+ const signInReasons = new Set(["NoAuth", "AuthExpired"]);
15
+ const known = (window) => window === undefined || window.usedPercent === null ? null : Math.round(window.usedPercent);
16
+ /**
17
+ * A primary window's status. The tone is agent-usage's: it counts a window projected to run out before its reset
18
+ * as near, whatever share it has used.
19
+ */
20
+ export const windowStatus = (window) => {
21
+ if (window === undefined || known(window) === null || window.tone === "unknown")
22
+ return "unknown";
23
+ if (window.freshness === "stale")
24
+ return "stale";
25
+ return window.tone === "at-limit" ? "at-limit" : window.tone === "near" ? "near" : "ok";
26
+ };
27
+ const status = (tool) => windowStatus(tool.primary);
28
+ /** "weekly" or "5-hour", as a limit's name inside a sentence. */
29
+ const windowWord = (agent) => (primaryWindow[agent] === "Weekly" ? "weekly" : "5-hour");
30
+ /**
31
+ * Reset times in the page time zone: "today", a weekday within the next six days, "next <weekday>" a week or more
32
+ * out, and the date for one already past (a stale reading's window may have reset since).
33
+ */
34
+ const formatter = (timeZone, now) => {
35
+ const clock = new Intl.DateTimeFormat("en-GB", { hour: "2-digit", minute: "2-digit", timeZone });
36
+ const weekday = new Intl.DateTimeFormat("en-GB", { weekday: "long", timeZone });
37
+ const dated = new Intl.DateTimeFormat("en-GB", { weekday: "long", day: "numeric", month: "long", timeZone });
38
+ const date = new Intl.DateTimeFormat("en-CA", { year: "numeric", month: "2-digit", day: "2-digit", timeZone });
39
+ const dayNumber = (at) => {
40
+ const [year, month, day] = date.format(at).split("-").map(Number);
41
+ return Date.UTC(year ?? 0, (month ?? 1) - 1, day ?? 1) / 86_400_000;
42
+ };
43
+ const days = (at) => dayNumber(at) - dayNumber(now);
44
+ const dayName = (at) => at < now
45
+ ? dated.format(at)
46
+ : days(at) === 0
47
+ ? "today"
48
+ : days(at) >= 7
49
+ ? `next ${weekday.format(at)}`
50
+ : weekday.format(at);
51
+ const capital = (words) => `${words.charAt(0).toUpperCase()}${words.slice(1)}`;
52
+ return {
53
+ clock: (at) => clock.format(at),
54
+ /** "Today, 16:40", "Wednesday, 07:00", "Next Sunday, 07:00". */
55
+ reset: (at) => `${capital(dayName(at))}, ${clock.format(at)}`,
56
+ /** "today at 16:40", "Tuesday at 03:29". */
57
+ resetWords: (at) => `${dayName(at)} at ${clock.format(at)}`,
58
+ /** "16:40" later today, otherwise with its day: "Tuesday at 03:29". */
59
+ until: (at) => (at >= now && days(at) === 0 ? clock.format(at) : `${dayName(at)} at ${clock.format(at)}`)
60
+ };
61
+ };
62
+ /** A reset as the cards print it, in `timeZone` relative to `now`: "Today, 16:40", "Next Sunday, 07:00". */
63
+ export const resetLabel = (at, now, timeZone) => formatter(timeZone, now).reset(at);
64
+ /** "72% of its 5-hour limit" for a 5-hour primary, "31% weekly" for a weekly one. */
65
+ const primaryPhrase = (tool) => primaryWindow[tool.agent] === "Weekly"
66
+ ? `${String(known(tool.primary))}% weekly`
67
+ : `${String(known(tool.primary))}% of its 5-hour limit`;
68
+ /** "Claude is at 72% of its 5-hour limit and 48% weekly", "Codex is at 31% weekly". */
69
+ const standing = (tool) => {
70
+ const weekly = known(tool.weekly);
71
+ return primaryWindow[tool.agent] === "Weekly" || weekly === null
72
+ ? `${tool.name} is at ${primaryPhrase(tool)}`
73
+ : `${tool.name} is at ${primaryPhrase(tool)} and ${String(weekly)}% weekly`;
74
+ };
75
+ /** "31% weekly", "72% 5-hour": a tool's primary level in passing. */
76
+ const level = (tool) => `${String(known(tool.primary))}% ${windowWord(tool.agent)}`;
77
+ const card = (tool, host, format) => {
78
+ const used = known(tool.primary);
79
+ const readAt = tool.primary?.observedAt ?? null;
80
+ const state = status(tool);
81
+ const primaryName = primaryWindow[tool.agent];
82
+ const stale = state === "stale";
83
+ const signIn = tool.unreadable._tag === "SignIn";
84
+ const resetOf = (window) => window?.resetsAt === null || window?.resetsAt === undefined || window.usedPercent === null
85
+ ? null
86
+ : format.reset(window.resetsAt);
87
+ const usedText = (window) => {
88
+ const share = known(window);
89
+ return share === null ? null : `${String(share)}% used`;
90
+ };
91
+ const details = primaryName === "5-hour"
92
+ ? [
93
+ ["5-hour reset", resetOf(tool.fiveHour)],
94
+ ["Weekly limit", usedText(tool.weekly)],
95
+ ["Weekly reset", resetOf(tool.weekly)]
96
+ ]
97
+ : [
98
+ ["5-hour limit", usedText(tool.fiveHour)],
99
+ ["5-hour reset", resetOf(tool.fiveHour)],
100
+ ["Weekly reset", resetOf(tool.weekly)]
101
+ ];
102
+ const primaryReset = tool.primary?.resetsAt ?? null;
103
+ return {
104
+ agent: tool.agent,
105
+ name: tool.name,
106
+ read: state === "unknown" || readAt === null
107
+ ? `${host}, ${tool.unreadable._tag === "SignIn" ? "sign-in required" : tool.unreadable.words}`
108
+ : `${host}, read ${format.clock(readAt)}`,
109
+ figure: state === "unknown" ? null : used,
110
+ measures: state === "unknown" ? `${primaryName} limit` : `${primaryName} limit used`,
111
+ state: state === "unknown"
112
+ ? signIn
113
+ ? { label: "Sign-in required", tone: "caution" }
114
+ : { label: "Unknown", tone: "neutral" }
115
+ : stale && readAt !== null
116
+ ? { label: `Stale, as of ${format.clock(readAt)}`, tone: "neutral" }
117
+ : state === "at-limit"
118
+ ? { label: "Limit reached", tone: "critical" }
119
+ : state === "near"
120
+ ? { label: "Near limit", tone: "caution" }
121
+ : null,
122
+ track: state === "unknown" || used === null
123
+ ? null
124
+ : {
125
+ value: used,
126
+ stale,
127
+ label: `${tool.name} ${windowWord(tool.agent)} limit`,
128
+ valueText: stale && readAt !== null
129
+ ? `${String(used)}% used as of ${format.clock(readAt)}`
130
+ : `${String(used)}% used`
131
+ },
132
+ details,
133
+ note: state === "unknown"
134
+ ? signIn
135
+ ? `Unknown is not zero. Sign in on ${host}, then read again.`
136
+ : `Unknown is not zero. Read again on ${host}.`
137
+ : state === "at-limit" && primaryReset !== null
138
+ ? `New ${tool.name} work on ${host} waits until ${format.until(primaryReset)}.`
139
+ : state === "near" && used !== null && primaryReset !== null
140
+ ? `${String(100 - used)}% left until ${format.until(primaryReset)}.`
141
+ : null
142
+ };
143
+ };
144
+ /** "Codex can’t be read until you sign in." or "Codex can’t be read: could not be fetched." */
145
+ const unreadableSentence = (tool) => tool.unreadable._tag === "SignIn"
146
+ ? `${tool.name} can’t be read until you sign in.`
147
+ : `${tool.name} can’t be read: ${tool.unreadable.words}.`;
148
+ /**
149
+ * One sentence on whether the hub has room. A current full or near limit leads, then old readings, then unreadable
150
+ * tools; stale and unreadable tools keep their own notices whatever leads.
151
+ */
152
+ const summary = (tools, host, format) => {
153
+ const readable = tools.filter((tool) => status(tool) !== "unknown");
154
+ const unknown = tools.filter((tool) => status(tool) === "unknown");
155
+ const stale = readable.filter((tool) => status(tool) === "stale");
156
+ const full = readable.find((tool) => status(tool) === "at-limit");
157
+ const near = readable.find((tool) => status(tool) === "near");
158
+ const others = (tool) => readable.filter((other) => other !== tool && status(other) === "ok");
159
+ if (full !== undefined) {
160
+ const reset = full.primary?.resetsAt ?? null;
161
+ const rest = others(full).map((tool) => `${tool.name} still has room: ${level(tool)}.`);
162
+ return {
163
+ verdict: `${full.name} is at its ${windowWord(full.agent)} limit on ${host}.`,
164
+ note: [
165
+ reset === null
166
+ ? `New ${full.name} work waits for its reset.`
167
+ : `New ${full.name} work waits until ${format.until(reset)}.`,
168
+ ...rest
169
+ ].join(" ")
170
+ };
171
+ }
172
+ if (near !== undefined) {
173
+ const reset = near.primary?.resetsAt ?? null;
174
+ const rest = others(near).map((tool) => `${tool.name} has room: ${level(tool)}.`);
175
+ return {
176
+ verdict: `${host} is close to ${near.name}’s ${windowWord(near.agent)} limit.`,
177
+ note: [
178
+ reset === null
179
+ ? `${near.name} is at ${String(known(near.primary))}%.`
180
+ : `${near.name} is at ${String(known(near.primary))}% and resets ${format.resetWords(reset)}.`,
181
+ ...rest
182
+ ].join(" ")
183
+ };
184
+ }
185
+ if (stale.length > 0) {
186
+ const readAt = Math.min(...stale.map((tool) => tool.primary?.observedAt ?? Number.POSITIVE_INFINITY));
187
+ const levels = stale.map((tool, index) => `${tool.name}${index === 0 ? " was" : ""} at ${primaryPhrase(tool)}`);
188
+ return {
189
+ verdict: `${host}’s limits were last read at ${format.clock(readAt)}.`,
190
+ note: `As of then, ${levels.join(" and ")}. Read again before starting more work.`
191
+ };
192
+ }
193
+ if (unknown.length > 0 && readable.length > 0) {
194
+ return {
195
+ verdict: `${readable.map((tool) => tool.name).join(" and ")} ${readable.length === 1 ? "has" : "have"} room on ${host}; ${unknown.map((tool) => tool.name).join(" and ")} ${unknown.length === 1 ? "is" : "are"} Unknown.`,
196
+ note: [...readable.map((tool) => `${standing(tool)}.`), ...unknown.map(unreadableSentence)].join(" ")
197
+ };
198
+ }
199
+ if (readable.length === 0) {
200
+ return { verdict: `${host}’s limits are Unknown.`, note: unknown.map(unreadableSentence).join(" ") };
201
+ }
202
+ return { verdict: `${host} has room for more work.`, note: readable.map((tool) => `${standing(tool)}.`).join(" ") };
203
+ };
204
+ /**
205
+ * Why `agent`'s primary window cannot be read: the window's own Unknown reading, else the failed poll for the whole
206
+ * agent, else nothing reported yet.
207
+ */
208
+ const unreadable = (agent, latest, primary, agentProblem) => {
209
+ const own = latest.filter((snapshot) => snapshot.agent === agent);
210
+ const reading = (own.find((snapshot) => snapshot.label !== "*" && windowName(snapshot) === primaryWindow[agent]) ??
211
+ own.find((snapshot) => snapshot.label === "*"))?.reading;
212
+ if (reading?._tag === "Unknown" && signInReasons.has(reading.reason))
213
+ return { _tag: "SignIn" };
214
+ return { _tag: "Cause", words: primary?.problem ?? agentProblem ?? "nothing reported yet" };
215
+ };
216
+ /**
217
+ * The page for `host`'s own read, `sinceLoad` ms after the page received it, or null when that host has no limits
218
+ * reading to show (the page then shows its empty or unavailable state). Every tool gets a card: a tool with nothing
219
+ * readable is Unknown, never left out.
220
+ */
221
+ export const limitsPage = (fleet, host, sinceLoad, timeZone) => {
222
+ const own = fleet.hosts.find((entry) => entry.host.toLowerCase() === host.toLowerCase());
223
+ if (own === undefined || own.reading._tag !== "Read")
224
+ return null;
225
+ const latest = own.reading.limits.latest;
226
+ if (latest.length === 0)
227
+ return null;
228
+ const now = own.reading.limits.observedAt + Math.max(0, sinceLoad);
229
+ const groups = summarizeLimits(latest, now);
230
+ const tools = agents.map((agent) => {
231
+ const group = groups.find((entry) => entry.agent === agent);
232
+ const window = (name) => group?.windows.find((entry) => entry.name === name);
233
+ const primary = window(primaryWindow[agent]);
234
+ return {
235
+ agent,
236
+ name: agentName(agent),
237
+ primary,
238
+ fiveHour: window("5-hour"),
239
+ weekly: window("Weekly"),
240
+ unreadable: unreadable(agent, latest, primary, group?.problem?.reason)
241
+ };
242
+ });
243
+ const format = formatter(timeZone, now);
244
+ const stale = tools.filter((tool) => status(tool) === "stale");
245
+ const staleAt = stale.length === 0
246
+ ? null
247
+ : Math.min(...stale.map((tool) => tool.primary?.observedAt ?? Number.POSITIVE_INFINITY));
248
+ const unknown = tools.filter((tool) => status(tool) === "unknown");
249
+ const current = tools.filter((tool) => status(tool) !== "unknown" && status(tool) !== "stale");
250
+ const currentWords = current.length === 0
251
+ ? ""
252
+ : ` ${current.map((other) => other.name).join(" and ")} ${current.length === 1 ? "is" : "are"} current.`;
253
+ return {
254
+ summary: summary(tools, own.host, format),
255
+ notices: [
256
+ ...(staleAt === null
257
+ ? []
258
+ : [{
259
+ title: `Limits were last read at ${format.clock(staleAt)}.`,
260
+ text: `They show how full each limit was then, not now. Read again on ${own.host}.`
261
+ }]),
262
+ ...unknown.map((tool) => tool.unreadable._tag === "SignIn"
263
+ ? {
264
+ title: `${tool.name} needs a fresh sign-in on ${own.host}.`,
265
+ text: `${tool.name} limits read Unknown until you sign in on ${own.host} and read again.${currentWords}`
266
+ }
267
+ : {
268
+ title: `${tool.name} limits can’t be read on ${own.host}.`,
269
+ text: `${tool.name} reads Unknown until a read succeeds.${currentWords}`
270
+ })
271
+ ],
272
+ cards: tools.map((tool) => card(tool, own.host, format))
273
+ };
274
+ };
275
+ //# sourceMappingURL=usage-limits-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limits-page.js","sourceRoot":"","sources":["../../src/views/usage-limits-page.ts"],"names":[],"mappings":"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"}