@opengeni/react 7.4.0 → 7.5.0-canary.36927100590001
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 +124 -27
- package/dist/artifacts-document.js +3 -2
- package/dist/artifacts-presentation.js +3 -2
- package/dist/artifacts-spreadsheet.js +2 -2
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +516 -1413
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-2E6R2Y4W.js → browser-viewer-Z7S7QEJL.js} +6 -5
- package/dist/chat-interactive-block-UGBTNB3L.js +11 -0
- package/dist/{chunk-Y3QTZN2F.js → chunk-2VFNCX4E.js} +6 -6
- package/dist/{chunk-UDD6DLLT.js → chunk-3IJJEYW4.js} +15 -3
- package/dist/chunk-3IJJEYW4.js.map +1 -0
- package/dist/chunk-4RVYOY4O.js +379 -0
- package/dist/chunk-4RVYOY4O.js.map +1 -0
- package/dist/chunk-5CVXZA3Y.js +292 -0
- package/dist/chunk-5CVXZA3Y.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-5J4FOW6Q.js} +2 -10
- package/dist/chunk-5J4FOW6Q.js.map +1 -0
- package/dist/{chunk-KVERXCFY.js → chunk-5KYZIQFY.js} +40 -3
- package/dist/chunk-5KYZIQFY.js.map +1 -0
- package/dist/{chunk-KNDIXZN6.js → chunk-7UAMYXJY.js} +25 -18
- package/dist/{chunk-KNDIXZN6.js.map → chunk-7UAMYXJY.js.map} +1 -1
- package/dist/{chunk-SEEVCT36.js → chunk-A4UJB2MM.js} +2 -2
- package/dist/{chunk-X4HIN6TV.js → chunk-AFLPWUQ7.js} +71 -162
- package/dist/chunk-AFLPWUQ7.js.map +1 -0
- package/dist/chunk-B3V6TG77.js +41 -0
- package/dist/chunk-B3V6TG77.js.map +1 -0
- package/dist/{chunk-XEJEOAOV.js → chunk-B7WMS3CS.js} +51 -40
- package/dist/chunk-B7WMS3CS.js.map +1 -0
- package/dist/{chunk-S5JQ4R22.js → chunk-BDKR6BAR.js} +54 -24
- package/dist/chunk-BDKR6BAR.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-DYWBUX5Q.js} +24 -12
- package/dist/chunk-DYWBUX5Q.js.map +1 -0
- package/dist/{chunk-YZ3YYMOM.js → chunk-E3G7SAYZ.js} +252 -624
- package/dist/chunk-E3G7SAYZ.js.map +1 -0
- package/dist/chunk-JT4JW7BC.js +54 -0
- package/dist/chunk-JT4JW7BC.js.map +1 -0
- package/dist/{chunk-5AZSK6MV.js → chunk-LWNLETQT.js} +5 -5
- package/dist/{chunk-USXVQACU.js → chunk-M7LBYP63.js} +5 -4
- package/dist/{chunk-USXVQACU.js.map → chunk-M7LBYP63.js.map} +1 -1
- package/dist/{chunk-L4OSXQ6H.js → chunk-NBOHNRLJ.js} +1289 -1060
- package/dist/chunk-NBOHNRLJ.js.map +1 -0
- package/dist/chunk-RHREZ7BO.js +11 -0
- package/dist/chunk-RHREZ7BO.js.map +1 -0
- package/dist/chunk-SCOTPE2I.js +589 -0
- package/dist/chunk-SCOTPE2I.js.map +1 -0
- package/dist/chunk-WEHMPOXK.js +39 -0
- package/dist/chunk-WEHMPOXK.js.map +1 -0
- package/dist/chunk-WRHIZYZF.js +988 -0
- package/dist/chunk-WRHIZYZF.js.map +1 -0
- package/dist/{chunk-3E2AITTZ.js → chunk-WUISZ3WU.js} +32 -28
- package/dist/{chunk-3E2AITTZ.js.map → chunk-WUISZ3WU.js.map} +1 -1
- package/dist/chunk-XCHWDJ22.js +107 -0
- package/dist/chunk-XCHWDJ22.js.map +1 -0
- package/dist/{chunk-DUEBTL3N.js → chunk-Y2PRMYLC.js} +4 -3
- package/dist/{chunk-DUEBTL3N.js.map → chunk-Y2PRMYLC.js.map} +1 -1
- package/dist/chunk-YBXQDQFX.js +1772 -0
- package/dist/chunk-YBXQDQFX.js.map +1 -0
- package/dist/chunk-YV4L3ILF.js +9 -0
- package/dist/chunk-YV4L3ILF.js.map +1 -0
- package/dist/{chunk-V2ABIVYJ.js → chunk-ZXSEDZP7.js} +70 -6
- package/dist/chunk-ZXSEDZP7.js.map +1 -0
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +27 -0
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +46 -0
- package/dist/components/artifacts/index.d.ts +7 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +23 -0
- package/dist/components/browser-select-control.d.ts +3 -1
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +20 -3
- package/dist/components/open-geni-links.d.ts +16 -0
- package/dist/components/session-conversation.d.ts +20 -1
- package/dist/components/timeline-pill-geometry.d.ts +8 -0
- package/dist/components/timeline-pill-placement.d.ts +24 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/composer.js +5 -5
- package/dist/{computer-viewer-WMJE6OA3.js → computer-viewer-KJWLH3GI.js} +7 -5
- package/dist/connect.js +7 -6
- package/dist/connect.js.map +1 -1
- package/dist/conversation-timeline.d.ts +1 -1
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +26 -0
- package/dist/desktop.js.map +1 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +1 -1
- package/dist/hooks/use-composer.d.ts +4 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +460 -1386
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +8 -6
- package/dist/interaction.js.map +1 -1
- package/dist/{latest-question-QB4EUCW5.js → latest-question-IS445HOW.js} +3 -3
- package/dist/lib/format.d.ts +6 -1
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/machines.js +2 -2
- package/dist/{markdown-table-layout-PFUEZ2U4.js → markdown-table-layout-QXSLK4BY.js} +37 -5
- package/dist/markdown-table-layout-QXSLK4BY.js.map +1 -0
- package/dist/{queue-surface-implementation-IM2HD3SK.js → queue-surface-implementation-2CAQAIHM.js} +2 -2
- package/dist/realtime.js +3 -3
- package/dist/{sandbox-files-PXPIZAFG.js → sandbox-files-AEJTWGT4.js} +8 -5
- package/dist/sandbox-files-AEJTWGT4.js.map +1 -0
- package/dist/session-ui.d.ts +9 -2
- package/dist/session-ui.js +39 -20
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +4 -4
- package/dist/sites.js +4 -289
- package/dist/sites.js.map +1 -1
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +31 -0
- package/dist/terminal.js.map +1 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/genie-loading.d.ts +3 -1
- package/dist/timeline/types.d.ts +8 -1
- package/dist/{timeline-annotation-selection-ODLVF4OI.js → timeline-annotation-selection-DMLMM2TX.js} +6 -1
- package/dist/timeline-annotation-selection-DMLMM2TX.js.map +1 -0
- package/dist/timeline-pill-geometry-Z23V243M.js +110 -0
- package/dist/timeline-pill-geometry-Z23V243M.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +1073 -0
- package/dist/usage.js.map +1 -0
- package/package.json +19 -3
- package/src/artifacts.ts +37 -0
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +185 -0
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +3 -1
- package/src/components/artifacts/editable-artifact-view.tsx +187 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +34 -36
- package/src/components/artifacts/editable-presentation.tsx +21 -16
- package/src/components/artifacts/index.ts +41 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/session-artifact-viewer.tsx +376 -0
- package/src/components/artifacts/site-view.tsx +116 -0
- package/src/components/browser-select-control.tsx +4 -1
- package/src/components/browser-viewer.tsx +81 -22
- package/src/components/code-editor.tsx +13 -16
- package/src/components/computer-viewer.tsx +51 -23
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/markdown-table-layout.ts +49 -5
- package/src/components/markdown.tsx +5 -2
- package/src/components/message-timeline.tsx +557 -516
- package/src/components/open-geni-links.tsx +24 -0
- package/src/components/sandbox-terminal.tsx +48 -11
- package/src/components/session-chrome.tsx +22 -3
- package/src/components/session-conversation.tsx +195 -102
- package/src/components/timeline-annotation-selection.tsx +7 -0
- package/src/components/timeline-pill-geometry.ts +169 -0
- package/src/components/timeline-pill-placement.ts +99 -0
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/conversation-timeline.ts +10 -2
- package/src/desktop.ts +24 -0
- package/src/editor.ts +13 -0
- package/src/hooks/use-available-models.ts +1 -1
- package/src/hooks/use-composer.ts +57 -2
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-usage.ts +100 -0
- package/src/index.ts +22 -0
- package/src/lib/format.ts +32 -6
- package/src/lib/workbench-peers.ts +62 -0
- package/src/session-ui.ts +22 -0
- package/src/terminal.ts +26 -0
- package/src/timeline/activity-rail.tsx +5 -3
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/genie-loading.tsx +16 -6
- package/src/timeline/projection.ts +78 -4
- package/src/timeline/types.ts +8 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +50 -0
- package/styles/compiled.css +325 -0
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-KVERXCFY.js.map +0 -1
- package/dist/chunk-L4OSXQ6H.js.map +0 -1
- package/dist/chunk-S5JQ4R22.js.map +0 -1
- package/dist/chunk-UDD6DLLT.js.map +0 -1
- package/dist/chunk-UGMKPUEM.js +0 -299
- package/dist/chunk-UGMKPUEM.js.map +0 -1
- package/dist/chunk-V2ABIVYJ.js.map +0 -1
- package/dist/chunk-X4HIN6TV.js.map +0 -1
- package/dist/chunk-XEJEOAOV.js.map +0 -1
- package/dist/chunk-YZ3YYMOM.js.map +0 -1
- package/dist/markdown-table-layout-PFUEZ2U4.js.map +0 -1
- package/dist/timeline-annotation-selection-ODLVF4OI.js.map +0 -1
- /package/dist/{browser-viewer-2E6R2Y4W.js.map → browser-viewer-Z7S7QEJL.js.map} +0 -0
- /package/dist/{computer-viewer-WMJE6OA3.js.map → chat-interactive-block-UGBTNB3L.js.map} +0 -0
- /package/dist/{chunk-Y3QTZN2F.js.map → chunk-2VFNCX4E.js.map} +0 -0
- /package/dist/{chunk-SEEVCT36.js.map → chunk-A4UJB2MM.js.map} +0 -0
- /package/dist/{chunk-5AZSK6MV.js.map → chunk-LWNLETQT.js.map} +0 -0
- /package/dist/{sandbox-files-PXPIZAFG.js.map → computer-viewer-KJWLH3GI.js.map} +0 -0
- /package/dist/{latest-question-QB4EUCW5.js.map → latest-question-IS445HOW.js.map} +0 -0
- /package/dist/{queue-surface-implementation-IM2HD3SK.js.map → queue-surface-implementation-2CAQAIHM.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/timeline-pill-geometry.ts"],"sourcesContent":["import type { TimelinePillPlacement, TimelinePillPosition } from \"./timeline-pill-placement\";\n\nconst INTERACTIVE =\n 'a[href], button, input, select, textarea, summary, [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"switch\"], [role=\"checkbox\"], [contenteditable=\"true\"]';\n\n/** A control this wide is a row (a disclosure header); only what it draws counts. */\nconst ROW_WIDTH_RATIO = 0.8;\n\n/** The full contextual label may not fit beside a compact toolbar on phones. */\nexport function chooseQuestionPosition(\n pill: HTMLElement,\n frame: HTMLElement,\n scroller: HTMLElement,\n preference: readonly TimelinePillPlacement[],\n current: TimelinePillPosition,\n): TimelinePillPosition {\n const rect = pill.getBoundingClientRect();\n const bounds = frame.getBoundingClientRect();\n const view = scroller.getBoundingClientRect();\n if (!rect.width || !view.width) return current;\n const style = getComputedStyle(frame);\n const baseTop = bounds.top - current.offsetY;\n const left = (placement: TimelinePillPlacement) =>\n placement === \"start\"\n ? bounds.left + parseFloat(style.paddingLeft || \"0\")\n : placement === \"end\"\n ? bounds.right - parseFloat(style.paddingRight || \"0\") - rect.width\n : bounds.left + (bounds.width - rect.width) / 2;\n const controls: DOMRect[] = [];\n for (const control of scroller.querySelectorAll<HTMLElement>(INTERACTIVE)) {\n const box = control.getBoundingClientRect();\n if (!box.width || !box.height || box.bottom <= baseTop || box.top >= view.bottom) continue;\n if (box.width < view.width * ROW_WIDTH_RATIO) controls.push(box);\n else {\n for (const icon of control.querySelectorAll(\"svg, img, canvas, video\"))\n controls.push(icon.getBoundingClientRect());\n const walker = scroller.ownerDocument.createTreeWalker(control, NodeFilter.SHOW_TEXT);\n for (let text = walker.nextNode(); text; text = walker.nextNode()) {\n if (!text.textContent?.trim()) continue;\n const range = scroller.ownerDocument.createRange();\n range.selectNodeContents(text);\n controls.push(...range.getClientRects());\n }\n }\n }\n const clear = (placement: TimelinePillPlacement, offsetY: number) =>\n !controls.some(\n (control) =>\n control.right > left(placement) &&\n control.left < left(placement) + rect.width &&\n control.bottom > baseTop + offsetY &&\n control.top < baseTop + offsetY + rect.height,\n );\n const order = [current.placement, ...preference.filter((value) => value !== current.placement)];\n // Return to the normal strip once it is clear, without touching scroll geometry.\n for (const placement of order) if (clear(placement, 0)) return { placement, offsetY: 0 };\n const offsets = [...new Set(controls.map((control) => control.bottom + 4 - baseTop))]\n .filter((offset) => offset > 0 && baseTop + offset + rect.height <= view.bottom)\n .sort((a, b) => a - b);\n for (const offsetY of offsets) {\n for (const placement of order) if (clear(placement, offsetY)) return { placement, offsetY };\n }\n return current;\n}\n\n/**\n * Hit-testing for useTimelinePillPlacement, loaded only once a pill shows so it\n * stays out of a session's first load.\n */\nexport function choosePlacement(\n pill: HTMLElement,\n frame: HTMLElement,\n scroller: HTMLElement,\n preference: readonly TimelinePillPlacement[],\n current: TimelinePillPlacement,\n): TimelinePillPlacement {\n const pillRect = pill.getBoundingClientRect();\n const frameRect = frame.getBoundingClientRect();\n const view = scroller.getBoundingClientRect();\n if (pillRect.width === 0 || view.width === 0) return current;\n const inset = Math.max(0, pillRect.left - frameRect.left, frameRect.right - pillRect.right);\n const gutter = Math.min(inset, parseFloat(getComputedStyle(scroller).paddingLeft) || 16);\n const left = (placement: TimelinePillPlacement) =>\n placement === \"start\"\n ? frameRect.left + gutter\n : placement === \"end\"\n ? frameRect.right - gutter - pillRect.width\n : frameRect.left + (frameRect.width - pillRect.width) / 2;\n const collisions = (placement: TimelinePillPlacement) =>\n countCollisions(\n pill,\n scroller,\n view,\n left(placement),\n pillRect.top,\n pillRect.width,\n pillRect.height,\n );\n // Stay put while the current spot is clear, so the pill does not wander.\n if (collisions(current) === 0) return current;\n let best = current;\n let fewest = Number.POSITIVE_INFINITY;\n for (const candidate of preference) {\n const count = candidate === current ? collisions(current) : collisions(candidate);\n if (count === 0) return candidate;\n if (count < fewest) {\n fewest = count;\n best = candidate;\n }\n }\n return best;\n}\n\nfunction countCollisions(\n pill: HTMLElement,\n scroller: HTMLElement,\n view: DOMRect,\n left: number,\n top: number,\n width: number,\n height: number,\n): number {\n const document = scroller.ownerDocument;\n let count = 0;\n for (const fx of [0.06, 0.3, 0.5, 0.7, 0.94]) {\n for (const fy of [0.2, 0.5, 0.8]) {\n const x = left + width * fx;\n const y = top + height * fy;\n if (x < view.left || x > view.right || y < view.top || y > view.bottom) continue;\n if (coversControl(document.elementsFromPoint(x, y), pill, scroller, view, x, y)) count += 1;\n }\n }\n return count;\n}\n\nfunction coversControl(\n stack: Element[],\n pill: HTMLElement,\n scroller: HTMLElement,\n view: DOMRect,\n x: number,\n y: number,\n): boolean {\n for (const element of stack) {\n if (pill.contains(element)) continue;\n if (!scroller.contains(element) || element === scroller) return false;\n const control = element.closest(INTERACTIVE);\n if (!control || !scroller.contains(control)) return false;\n // A compact control (a link, an icon button) is covered anywhere on its box.\n if (control.getBoundingClientRect().width < view.width * ROW_WIDTH_RATIO) return true;\n // A full-width row (a disclosure header) only where it draws something: an\n // icon or the glyphs of its label, never its empty background.\n if (element.closest(\"svg, img, canvas, video\")) return true;\n return textUnderPoint(element, x, y);\n }\n return false;\n}\n\nfunction textUnderPoint(element: Element, x: number, y: number): boolean {\n const range = element.ownerDocument.createRange();\n for (const node of element.childNodes) {\n if (node.nodeType !== Node.TEXT_NODE || !node.textContent?.trim()) continue;\n range.selectNodeContents(node);\n for (const rect of range.getClientRects()) {\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) return true;\n }\n }\n return false;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Which ceiling ran out: the shared workspace pool, or one member's share of it. */
|
|
2
|
+
export type AllowanceScope = "workspace" | "member";
|
|
3
|
+
export type AllowanceLabels = {
|
|
4
|
+
/** "Usage limit reached" for a member ceiling. */
|
|
5
|
+
memberLimitReachedTitle: string;
|
|
6
|
+
/** "Workspace usage limit reached" for the shared pool. */
|
|
7
|
+
workspaceLimitReachedTitle: string;
|
|
8
|
+
/** Who can fix a member ceiling. */
|
|
9
|
+
memberRemedy: string;
|
|
10
|
+
/** Who can fix the workspace pool. */
|
|
11
|
+
workspaceRemedy: string;
|
|
12
|
+
/** "Resets Nov 1". `date` is already formatted by `formatDate`. */
|
|
13
|
+
resets: (date: string) => string;
|
|
14
|
+
/** Shown when a ceiling has no automatic reset. */
|
|
15
|
+
noReset: string;
|
|
16
|
+
/** Formats a reset instant for `resets`. Defaults to a short local date. */
|
|
17
|
+
formatDate: (iso: string) => string;
|
|
18
|
+
};
|
|
19
|
+
export declare function formatAllowanceDate(iso: string, now?: Date): string;
|
|
20
|
+
/** Full local date and time, for a title/tooltip next to the short date. */
|
|
21
|
+
export declare function formatAllowanceInstant(iso: string): string;
|
|
22
|
+
export declare const DEFAULT_ALLOWANCE_LABELS: AllowanceLabels;
|
|
23
|
+
export declare function allowanceLabels(overrides?: Partial<AllowanceLabels>): AllowanceLabels;
|
|
24
|
+
/** "Resets Nov 1." or the no-reset sentence. */
|
|
25
|
+
export declare function allowanceResetSentence(labels: AllowanceLabels, resetsAt: string | null): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { UsageAllowanceStatus, WorkspaceUsageResponse } from "@opengeni/sdk/usage-allowances";
|
|
2
|
+
import type { AllowanceScope } from "./allowance-copy.js";
|
|
3
|
+
/** One ceiling as a person reads it: how much of it is used, and when it resets. */
|
|
4
|
+
export type UsageReading = {
|
|
5
|
+
scope: AllowanceScope;
|
|
6
|
+
/** Used share of the ceiling. Can exceed 1 after post-call overshoot. */
|
|
7
|
+
fraction: number;
|
|
8
|
+
status: UsageAllowanceStatus;
|
|
9
|
+
resetsAt: string | null;
|
|
10
|
+
/** USD micros. Only shown when a host opts in with `formatAmount`. */
|
|
11
|
+
used: number;
|
|
12
|
+
limit: number;
|
|
13
|
+
remaining: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* What a member can still do: `unlimited` when no ceiling applies, otherwise
|
|
17
|
+
* the state of whichever ceiling stops them first (`binding`).
|
|
18
|
+
*/
|
|
19
|
+
export type UsageSummary = {
|
|
20
|
+
state: "unlimited" | "ok" | "warning" | "exhausted";
|
|
21
|
+
/** The ceiling a person would ask to raise; null when unlimited. */
|
|
22
|
+
binding: UsageReading | null;
|
|
23
|
+
/** Their own ceiling, when one applies. */
|
|
24
|
+
member: UsageReading | null;
|
|
25
|
+
/** The shared workspace pool, when one is set. */
|
|
26
|
+
workspace: UsageReading | null;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Fold a usage response (normally `/usage/me`) into what to tell one member.
|
|
30
|
+
* The server's `status` decides warning/exhausted (it applies the configured
|
|
31
|
+
* thresholds); when both ceilings apply, the one with less room left binds.
|
|
32
|
+
*/
|
|
33
|
+
export declare function summarizeUsage(usage: WorkspaceUsageResponse, subjectId?: string | undefined): UsageSummary;
|
|
34
|
+
/** A whole-number percentage for display: "<1" for a sliver, never "0" for some use. */
|
|
35
|
+
export declare function usagePercentLabel(fraction: number): string;
|
package/dist/usage.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { useUsage } from "./hooks/use-usage.js";
|
|
2
|
+
export type { UsageClientLike, UseUsageOptions, UseUsageResult } from "./hooks/use-usage.js";
|
|
3
|
+
export { summarizeUsage, usagePercentLabel } from "./usage/summary.js";
|
|
4
|
+
export type { UsageReading, UsageSummary } from "./usage/summary.js";
|
|
5
|
+
export { DEFAULT_ALLOWANCE_LABELS, allowanceLabels, allowanceResetSentence, formatAllowanceDate, } from "./usage/allowance-copy.js";
|
|
6
|
+
export type { AllowanceLabels, AllowanceScope } from "./usage/allowance-copy.js";
|
|
7
|
+
export { DEFAULT_USAGE_METER_LABELS, UsageMeter, UsageMeterView } from "./components/usage-meter.js";
|
|
8
|
+
export type { UsageMeterBaseProps, UsageMeterLabels, UsageMeterProps, UsageMeterViewProps, } from "./components/usage-meter.js";
|
|
9
|
+
export { DEFAULT_USAGE_LIMIT_NOTICE_LABELS, UsageLimitNotice, UsageLimitNoticeView, } from "./components/usage-limit-notice.js";
|
|
10
|
+
export type { UsageLimitNoticeLabels, UsageLimitNoticeProps, } from "./components/usage-limit-notice.js";
|
|
11
|
+
export { DEFAULT_USAGE_MEMBER_LIST_LABELS, UsageMemberList, describeMemberLimit, } from "./components/usage-member-list.js";
|
|
12
|
+
export type { UsageAmountFormat, UsageMemberIdentity, UsageMemberListLabels, UsageMemberListProps, } from "./components/usage-member-list.js";
|
|
13
|
+
export type { RenderAllowanceExhausted } from "./timeline/allowance-exhausted-row.js";
|