@knpkv/herdr-usage 0.1.3 → 0.2.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/dist/client/client.js +39 -38
- package/dist/client/client.js.map +4 -4
- package/dist/client.js +11 -24
- package/dist/client.js.map +1 -1
- package/dist/shell.d.ts +20 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +24 -0
- package/dist/shell.js.map +1 -0
- package/dist/views.d.ts +2 -2
- package/dist/views.js +2 -2
- package/package.json +6 -6
package/dist/client.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* The Usage app's client:
|
|
4
|
-
* {@link
|
|
3
|
+
* The Usage app's client: {@link UsagePage} in the app's own React root, given a {@link UsageShell} made from the
|
|
4
|
+
* {@link ShellContext} its shell passes (the hub's superapp or hub-app's standalone shell). Bundled to
|
|
5
|
+
* `dist/client/client.js`.
|
|
5
6
|
*
|
|
6
7
|
* Reads go to the app's own routes (`ctx.api("/limits")`, `ctx.api("/usage")`), with the shell's request headers.
|
|
7
8
|
*
|
|
8
9
|
* @module
|
|
9
10
|
*/
|
|
10
|
-
import { FleetLimits, FleetReadLoadError, FleetUsage } from "@knpkv/herdr-connect/usage";
|
|
11
|
+
import { FleetLimits, FleetReadLoadError, FleetUsage, onLoopback } from "@knpkv/herdr-connect/usage";
|
|
11
12
|
import { defineAppClient } from "@knpkv/hub-app";
|
|
12
13
|
import { Icon } from "@knpkv/rly/foundations";
|
|
13
14
|
import { Clock, Effect, Exit, ManagedRuntime, Option, Schema } from "effect";
|
|
14
15
|
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/http";
|
|
15
16
|
import { useMemo } from "react";
|
|
16
17
|
import { createRoot } from "react-dom/client";
|
|
18
|
+
import { usageChrome, usageHref } from "./shell.js";
|
|
17
19
|
import { UsagePage, UsagePageId } from "./views.js";
|
|
18
20
|
const runtime = ManagedRuntime.make(FetchHttpClient.layer);
|
|
19
21
|
/** One read of an app route, stamped with when this page received it. */
|
|
@@ -36,18 +38,6 @@ const onRuntime = (effect) => Effect.callback((resume, signal) => {
|
|
|
36
38
|
onExit: (exit) => resume(Exit.isSuccess(exit) ? Effect.succeed(exit.value) : Effect.failCause(exit.cause))
|
|
37
39
|
});
|
|
38
40
|
});
|
|
39
|
-
/** The header chrome the shell lends, when it lends an outlet and the means to group around it. */
|
|
40
|
-
const chromeOf = (context) => {
|
|
41
|
-
const { headerOutlet, setHeaderMode } = context;
|
|
42
|
-
return headerOutlet === undefined || headerOutlet === null || setHeaderMode === undefined
|
|
43
|
-
? null
|
|
44
|
-
: {
|
|
45
|
-
host: context.caller.login,
|
|
46
|
-
headerOutlet,
|
|
47
|
-
setEmpty: context.setEmpty,
|
|
48
|
-
setGrouped: (grouped) => setHeaderMode(grouped ? "grouped" : "shell")
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
41
|
const UsageApp = ({ context }) => {
|
|
52
42
|
const reads = useMemo(() => ({
|
|
53
43
|
limits: onRuntime(load(context, "/limits", FleetLimits)),
|
|
@@ -56,22 +46,19 @@ const UsageApp = ({ context }) => {
|
|
|
56
46
|
const shell = useMemo(() => ({
|
|
57
47
|
active: context.active,
|
|
58
48
|
navigate: (href) => context.navigate(href, "replace", null),
|
|
59
|
-
href: (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return `?${query.toString()}#usage/${page}`;
|
|
63
|
-
},
|
|
64
|
-
// The shell's header outlet, when it lends one; standalone it has no grouped header, so no chrome.
|
|
65
|
-
chrome: chromeOf(context),
|
|
49
|
+
href: usageHref(context),
|
|
50
|
+
// The shell's grouped header, when it has one; standalone it has none, so no chrome.
|
|
51
|
+
chrome: usageChrome(context),
|
|
66
52
|
nextIcon: _jsx(Icon, { name: "chevron-right", decorative: true })
|
|
67
53
|
}), [context]);
|
|
68
54
|
const page = Option.getOrElse(Schema.decodeUnknownOption(UsagePageId)(context.page), () => "limits");
|
|
69
55
|
return (_jsx(UsagePage, { content: {
|
|
70
|
-
host: context.caller.login,
|
|
56
|
+
host: context.host ?? context.caller.login,
|
|
71
57
|
reads,
|
|
72
58
|
viewerTimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
73
59
|
now: Date.now(),
|
|
74
|
-
|
|
60
|
+
// On this machine's loopback the page links to the local agent-usage dashboard, as the hub's own Usage did.
|
|
61
|
+
onHubMachine: onLoopback()
|
|
75
62
|
}, shell: shell, page: page, search: context.search }));
|
|
76
63
|
};
|
|
77
64
|
export default defineAppClient({
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"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"}
|
package/dist/shell.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the Usage client takes from whichever shell mounts it: the header chrome and its page links.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { ShellContext } from "@knpkv/hub-app";
|
|
7
|
+
import type { UsageChrome, UsagePageId } from "./views.js";
|
|
8
|
+
/** The parts of a {@link ShellContext} these read; fields added after contract 1 shipped are optional. */
|
|
9
|
+
export type UsageShellContext = Pick<ShellContext, "caller" | "setEmpty" | "headerOutlet" | "setHeaderMode"> & {
|
|
10
|
+
readonly host?: string;
|
|
11
|
+
readonly href?: (page: string, search?: URLSearchParams) => string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The header chrome, when the shell can group its header around the page. The outlet may still be null: the hub
|
|
15
|
+
* renders it only once the page asks to group, and until then the page draws its title and tabs inline.
|
|
16
|
+
*/
|
|
17
|
+
export declare const usageChrome: (context: UsageShellContext) => UsageChrome | null;
|
|
18
|
+
/** The link to one Usage page with these selectors: the shell's own when it builds them, else the shared route shape. */
|
|
19
|
+
export declare const usageHref: (context: UsageShellContext) => (page: UsagePageId, search: URLSearchParams) => string;
|
|
20
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE1D,0GAA0G;AAC1G,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC,GAAG;IAC7G,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,KAAK,MAAM,CAAA;CACnE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,YAAa,iBAAiB,KAAG,WAAW,GAAG,IAUtE,CAAA;AAED,yHAAyH;AACzH,eAAO,MAAM,SAAS,YAAa,iBAAiB,YAAY,WAAW,UAAU,eAAe,KAAG,MAKtG,CAAA"}
|
package/dist/shell.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The header chrome, when the shell can group its header around the page. The outlet may still be null: the hub
|
|
3
|
+
* renders it only once the page asks to group, and until then the page draws its title and tabs inline.
|
|
4
|
+
*/
|
|
5
|
+
export const usageChrome = (context) => {
|
|
6
|
+
const { setHeaderMode } = context;
|
|
7
|
+
return setHeaderMode === undefined
|
|
8
|
+
? null
|
|
9
|
+
: {
|
|
10
|
+
host: context.host ?? context.caller.login,
|
|
11
|
+
headerOutlet: context.headerOutlet ?? null,
|
|
12
|
+
setEmpty: context.setEmpty,
|
|
13
|
+
setGrouped: (grouped) => setHeaderMode(grouped ? "grouped" : "shell")
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
/** The link to one Usage page with these selectors: the shell's own when it builds them, else the shared route shape. */
|
|
17
|
+
export const usageHref = (context) => (page, search) => {
|
|
18
|
+
if (context.href !== undefined)
|
|
19
|
+
return context.href(page, search);
|
|
20
|
+
const query = new URLSearchParams(search);
|
|
21
|
+
query.delete("tab");
|
|
22
|
+
return `?${query.toString()}#usage/${page}`;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAA0B,EAAsB,EAAE;IAC5E,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;IACjC,OAAO,aAAa,KAAK,SAAS;QAChC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK;YAC1C,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;YAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;SACtE,CAAA;AACL,CAAC,CAAA;AAED,yHAAyH;AACzH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC,IAAiB,EAAE,MAAuB,EAAU,EAAE;IAC9G,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;IACzC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAA;AAC7C,CAAC,CAAA"}
|
package/dist/views.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@knpkv/herdr-usage/views` — the Usage pages' React views. React and rly are peers: whoever renders these views
|
|
3
|
-
* supplies one copy of each. The
|
|
4
|
-
*
|
|
3
|
+
* supplies one copy of each. The app's own client renders {@link UsagePage}; another host may too, with its own
|
|
4
|
+
* {@link UsageShell}.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
package/dist/views.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@knpkv/herdr-usage/views` — the Usage pages' React views. React and rly are peers: whoever renders these views
|
|
3
|
-
* supplies one copy of each. The
|
|
4
|
-
*
|
|
3
|
+
* supplies one copy of each. The app's own client renders {@link UsagePage}; another host may too, with its own
|
|
4
|
+
* {@link UsageShell}.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knpkv/herdr-usage",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Claude and Codex usage and limits across the fleet, as a Relay hub app that also runs on its own",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
"@effect/platform-node": "4.0.0",
|
|
48
48
|
"@effect/platform-node-shared": "4.0.0",
|
|
49
49
|
"@knpkv/bounded-io": "^0.3.0",
|
|
50
|
-
"@knpkv/herdr-connect": "^0.31.3",
|
|
51
50
|
"@knpkv/agent-usage": "^0.11.4",
|
|
52
|
-
"@knpkv/herdr-
|
|
53
|
-
"@knpkv/hub-app": "^0.
|
|
51
|
+
"@knpkv/herdr-connect": "^0.31.4",
|
|
52
|
+
"@knpkv/hub-app": "^0.5.0",
|
|
53
|
+
"@knpkv/herdr-fleet": "^0.22.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"effect": "4.0.0",
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
"rimraf": "^6.1.3",
|
|
71
71
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
72
72
|
"vitest": "^5.0.5",
|
|
73
|
-
"@knpkv/
|
|
74
|
-
"@knpkv/
|
|
73
|
+
"@knpkv/browser-pairing": "^0.8.0",
|
|
74
|
+
"@knpkv/rly": "^0.25.0"
|
|
75
75
|
},
|
|
76
76
|
"bin": {
|
|
77
77
|
"herdr-usage": "./dist/bin.js"
|