@stigmer/react 0.0.39 → 0.0.40
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/agent/AgentDetailView.d.ts +12 -1
- package/agent/AgentDetailView.d.ts.map +1 -1
- package/agent/AgentDetailView.js +6 -5
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/agentSetupReducer.d.ts +1 -0
- package/agent/agentSetupReducer.d.ts.map +1 -1
- package/agent/agentSetupReducer.js +11 -0
- package/agent/agentSetupReducer.js.map +1 -1
- package/agent/useAgentSetup.d.ts.map +1 -1
- package/agent/useAgentSetup.js +41 -6
- package/agent/useAgentSetup.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts +33 -0
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -0
- package/api-key/ApiKeyCreatedAlert.js +61 -0
- package/api-key/ApiKeyCreatedAlert.js.map +1 -0
- package/api-key/ApiKeyListPanel.d.ts +30 -0
- package/api-key/ApiKeyListPanel.d.ts.map +1 -0
- package/api-key/ApiKeyListPanel.js +126 -0
- package/api-key/ApiKeyListPanel.js.map +1 -0
- package/api-key/CreateApiKeyForm.d.ts +35 -0
- package/api-key/CreateApiKeyForm.d.ts.map +1 -0
- package/api-key/CreateApiKeyForm.js +81 -0
- package/api-key/CreateApiKeyForm.js.map +1 -0
- package/api-key/index.d.ts +13 -0
- package/api-key/index.d.ts.map +1 -0
- package/api-key/index.js +7 -0
- package/api-key/index.js.map +1 -0
- package/api-key/useApiKeyList.d.ts +28 -0
- package/api-key/useApiKeyList.d.ts.map +1 -0
- package/api-key/useApiKeyList.js +52 -0
- package/api-key/useApiKeyList.js.map +1 -0
- package/api-key/useCreateApiKey.d.ts +40 -0
- package/api-key/useCreateApiKey.d.ts.map +1 -0
- package/api-key/useCreateApiKey.js +56 -0
- package/api-key/useCreateApiKey.js.map +1 -0
- package/api-key/useDeleteApiKey.d.ts +26 -0
- package/api-key/useDeleteApiKey.d.ts.map +1 -0
- package/api-key/useDeleteApiKey.js +43 -0
- package/api-key/useDeleteApiKey.js.map +1 -0
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +12 -0
- package/composer/SessionComposer.js.map +1 -1
- package/index.d.ts +5 -3
- package/index.d.ts.map +1 -1
- package/index.js +5 -3
- package/index.js.map +1 -1
- package/library/VisibilityToggle.d.ts +41 -0
- package/library/VisibilityToggle.d.ts.map +1 -0
- package/library/VisibilityToggle.js +80 -0
- package/library/VisibilityToggle.js.map +1 -0
- package/library/index.d.ts +4 -0
- package/library/index.d.ts.map +1 -1
- package/library/index.js +2 -0
- package/library/index.js.map +1 -1
- package/library/useUpdateVisibility.d.ts +40 -0
- package/library/useUpdateVisibility.d.ts.map +1 -0
- package/library/useUpdateVisibility.js +67 -0
- package/library/useUpdateVisibility.js.map +1 -0
- package/mcp-server/McpServerDetailView.d.ts +12 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +6 -5
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/package.json +4 -4
- package/search/useResourceCount.d.ts +2 -2
- package/search/useResourceCount.js +2 -2
- package/search/useResourceCount.js.map +1 -1
- package/search/useResourceList.d.ts +8 -3
- package/search/useResourceList.d.ts.map +1 -1
- package/search/useResourceList.js +2 -2
- package/search/useResourceList.js.map +1 -1
- package/session/index.d.ts +1 -0
- package/session/index.d.ts.map +1 -1
- package/session/index.js +2 -0
- package/session/index.js.map +1 -1
- package/session/useCreateSession.d.ts +1 -1
- package/session/useCreateSession.d.ts.map +1 -1
- package/session/useCreateSession.js +2 -1
- package/session/useCreateSession.js.map +1 -1
- package/skill/SkillDetailView.d.ts +12 -1
- package/skill/SkillDetailView.d.ts.map +1 -1
- package/skill/SkillDetailView.js +6 -5
- package/skill/SkillDetailView.js.map +1 -1
- package/src/agent/AgentDetailView.tsx +32 -6
- package/src/agent/agentSetupReducer.ts +12 -0
- package/src/agent/useAgentSetup.ts +69 -19
- package/src/api-key/ApiKeyCreatedAlert.tsx +184 -0
- package/src/api-key/ApiKeyListPanel.tsx +359 -0
- package/src/api-key/CreateApiKeyForm.tsx +250 -0
- package/src/api-key/index.ts +12 -0
- package/src/api-key/useApiKeyList.ts +68 -0
- package/src/api-key/useCreateApiKey.ts +71 -0
- package/src/api-key/useDeleteApiKey.ts +57 -0
- package/src/composer/SessionComposer.tsx +13 -0
- package/src/index.ts +26 -1
- package/src/library/VisibilityToggle.tsx +205 -0
- package/src/library/index.ts +9 -0
- package/src/library/useUpdateVisibility.ts +94 -0
- package/src/mcp-server/McpServerDetailView.tsx +32 -6
- package/src/search/useResourceCount.ts +4 -4
- package/src/search/useResourceList.ts +10 -5
- package/src/session/index.ts +3 -0
- package/src/session/useCreateSession.ts +6 -5
- package/src/skill/SkillDetailView.tsx +32 -6
- package/styles.css +1 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
7
|
+
import { useApiKeyList } from "./useApiKeyList";
|
|
8
|
+
import { useDeleteApiKey } from "./useDeleteApiKey";
|
|
9
|
+
/**
|
|
10
|
+
* Displays a list of {@link ApiKey} resources for the authenticated
|
|
11
|
+
* identity with inline delete confirmation.
|
|
12
|
+
*
|
|
13
|
+
* Each key is rendered as a row showing name, fingerprint, creation
|
|
14
|
+
* date, expiry, and last-used time. A delete button triggers an
|
|
15
|
+
* inline confirmation — the row transforms to show confirm/cancel
|
|
16
|
+
* actions.
|
|
17
|
+
*
|
|
18
|
+
* API keys are identity-scoped: the server returns all keys belonging
|
|
19
|
+
* to the authenticated user, regardless of organization.
|
|
20
|
+
*
|
|
21
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <ApiKeyListPanel />
|
|
26
|
+
*
|
|
27
|
+
* <ApiKeyListPanel
|
|
28
|
+
* onRefetchRef={(refetch) => { listRefetchRef.current = refetch; }}
|
|
29
|
+
* />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function ApiKeyListPanel({ onRefetchRef, className, }) {
|
|
33
|
+
const { apiKeys, isLoading, error, refetch } = useApiKeyList();
|
|
34
|
+
const [confirmingId, setConfirmingId] = useState(null);
|
|
35
|
+
if (onRefetchRef) {
|
|
36
|
+
onRefetchRef(refetch);
|
|
37
|
+
}
|
|
38
|
+
if (isLoading) {
|
|
39
|
+
return (_jsx("div", { className: cn("space-y-2", className), "aria-busy": "true", "aria-label": "Loading API keys", children: Array.from({ length: 2 }, (_, i) => (_jsx("div", { className: "bg-muted/40 h-14 animate-pulse rounded-lg" }, i))) }));
|
|
40
|
+
}
|
|
41
|
+
if (error) {
|
|
42
|
+
return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(error) }));
|
|
43
|
+
}
|
|
44
|
+
if (apiKeys.length === 0) {
|
|
45
|
+
return (_jsx("p", { className: cn("text-muted-foreground py-4 text-center text-xs", className), children: "No API keys yet." }));
|
|
46
|
+
}
|
|
47
|
+
return (_jsx("div", { className: cn("space-y-2", className), role: "list", "aria-label": "API keys", children: apiKeys.map((key) => {
|
|
48
|
+
const id = key.metadata?.id ?? "";
|
|
49
|
+
return (_jsx(ApiKeyRow, { apiKey: key, isConfirming: confirmingId === id, onConfirmDelete: () => setConfirmingId(id), onCancelDelete: () => setConfirmingId(null), onDeleted: () => {
|
|
50
|
+
setConfirmingId(null);
|
|
51
|
+
refetch();
|
|
52
|
+
} }, id));
|
|
53
|
+
}) }));
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// ApiKeyRow (internal)
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
function ApiKeyRow({ apiKey, isConfirming, onConfirmDelete, onCancelDelete, onDeleted, }) {
|
|
59
|
+
const { deleteKey, isDeleting, error } = useDeleteApiKey();
|
|
60
|
+
const id = apiKey.metadata?.id ?? "";
|
|
61
|
+
const name = apiKey.metadata?.name || apiKey.metadata?.slug || "Unnamed key";
|
|
62
|
+
const fingerprint = apiKey.spec?.fingerprint;
|
|
63
|
+
const neverExpires = apiKey.spec?.neverExpires;
|
|
64
|
+
const expiresAt = apiKey.spec?.expiresAt;
|
|
65
|
+
const lastUsedAt = apiKey.status?.lastUsedAt;
|
|
66
|
+
const createdAt = apiKey.status?.audit?.specAudit?.createdAt;
|
|
67
|
+
const handleDelete = useCallback(async () => {
|
|
68
|
+
try {
|
|
69
|
+
await deleteKey(id);
|
|
70
|
+
onDeleted();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// error state is surfaced via the hook
|
|
74
|
+
}
|
|
75
|
+
}, [id, deleteKey, onDeleted]);
|
|
76
|
+
if (isConfirming) {
|
|
77
|
+
return (_jsxs("div", { role: "listitem", className: "flex items-center justify-between rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-xs text-foreground", children: ["Delete ", _jsx("span", { className: "font-medium", children: name }), "?", fingerprint && (_jsxs("span", { className: "text-muted-foreground", children: [" ", "(\u2026", fingerprint, ")"] }))] }), error && (_jsx("p", { className: "mt-0.5 text-[0.65rem] text-destructive", children: getUserMessage(error) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleDelete, disabled: isDeleting, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-destructive text-destructive-foreground hover:bg-destructive/90", "disabled:pointer-events-none disabled:opacity-50"), children: [isDeleting && _jsx(SpinnerIcon, {}), "Delete"] }), _jsx("button", { type: "button", onClick: onCancelDelete, disabled: isDeleting, className: cn("rounded-md px-2.5 py-1 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }));
|
|
78
|
+
}
|
|
79
|
+
return (_jsxs("div", { role: "listitem", className: "flex items-center gap-3 rounded-lg border border-border/60 px-3 py-2.5 hover:border-border transition-colors", children: [_jsx(KeyIcon, {}), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: name }), fingerprint && (_jsxs("span", { className: "block text-xs text-muted-foreground font-mono", children: ["\u2026", fingerprint] }))] }), _jsxs("div", { className: "hidden sm:flex shrink-0 items-center gap-4 text-xs text-muted-foreground", children: [createdAt && (_jsx("span", { title: `Created ${timestampDate(createdAt).toISOString()}`, children: formatShortDate(timestampDate(createdAt)) })), _jsx("span", { children: neverExpires
|
|
80
|
+
? "No expiry"
|
|
81
|
+
: expiresAt
|
|
82
|
+
? `Expires ${formatShortDate(timestampDate(expiresAt))}`
|
|
83
|
+
: "No expiry" }), _jsx("span", { children: lastUsedAt ? formatRelativeTime(timestampDate(lastUsedAt)) : "Never used" })] }), _jsx("button", { type: "button", onClick: onConfirmDelete, "aria-label": `Delete ${name}`, className: cn("shrink-0 rounded p-1", "text-muted-foreground hover:text-destructive hover:bg-destructive/10", "transition-colors"), children: _jsx(TrashIcon, {}) })] }));
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Formatting helpers
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
function formatShortDate(date) {
|
|
89
|
+
return date.toLocaleDateString(undefined, {
|
|
90
|
+
month: "short",
|
|
91
|
+
day: "numeric",
|
|
92
|
+
year: "numeric",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function formatRelativeTime(date) {
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const diffMs = now - date.getTime();
|
|
98
|
+
if (diffMs < 0)
|
|
99
|
+
return "Just now";
|
|
100
|
+
const seconds = Math.floor(diffMs / 1000);
|
|
101
|
+
if (seconds < 60)
|
|
102
|
+
return "Just now";
|
|
103
|
+
const minutes = Math.floor(seconds / 60);
|
|
104
|
+
if (minutes < 60)
|
|
105
|
+
return `${minutes}m ago`;
|
|
106
|
+
const hours = Math.floor(minutes / 60);
|
|
107
|
+
if (hours < 24)
|
|
108
|
+
return `${hours}h ago`;
|
|
109
|
+
const days = Math.floor(hours / 24);
|
|
110
|
+
if (days < 30)
|
|
111
|
+
return `${days}d ago`;
|
|
112
|
+
return formatShortDate(date);
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Icons
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
function KeyIcon() {
|
|
118
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", className: "shrink-0 text-muted-foreground", children: [_jsx("circle", { cx: "5.5", cy: "10.5", r: "3" }), _jsx("path", { d: "M8 8l5.5-5.5M11 5l2-2M10.5 2.5l2 2" })] }));
|
|
119
|
+
}
|
|
120
|
+
function TrashIcon() {
|
|
121
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M2.5 4h11M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }), _jsx("path", { d: "M12.5 4v9a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V4" }), _jsx("line", { x1: "6.5", y1: "7", x2: "6.5", y2: "11" }), _jsx("line", { x1: "9.5", y1: "7", x2: "9.5", y2: "11" })] }));
|
|
122
|
+
}
|
|
123
|
+
function SpinnerIcon() {
|
|
124
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=ApiKeyListPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyListPanel.js","sourceRoot":"","sources":["../../src/api-key/ApiKeyListPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
|
|
2
|
+
export interface CreateApiKeyFormProps {
|
|
3
|
+
/** Organization slug used as the `org` field when creating the key. */
|
|
4
|
+
readonly org: string;
|
|
5
|
+
/**
|
|
6
|
+
* Fired with the newly created API key after successful creation.
|
|
7
|
+
* The `spec.keyHash` field of the returned key contains the raw
|
|
8
|
+
* key value — available only at this moment.
|
|
9
|
+
*/
|
|
10
|
+
readonly onCreated?: (apiKey: ApiKey) => void;
|
|
11
|
+
/** Fired when the user cancels creation. */
|
|
12
|
+
readonly onCancel?: () => void;
|
|
13
|
+
readonly className?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Compact form for creating a new API key.
|
|
17
|
+
*
|
|
18
|
+
* Collects a **name** (required) and an **expiry** choice (30 / 60 /
|
|
19
|
+
* 90 days or never), then creates the key via {@link useCreateApiKey}.
|
|
20
|
+
* On success it fires `onCreated` with the full {@link ApiKey}
|
|
21
|
+
* response, which includes the raw key in `spec.keyHash`.
|
|
22
|
+
*
|
|
23
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <CreateApiKeyForm
|
|
28
|
+
* org="acme"
|
|
29
|
+
* onCreated={(key) => setRevealedKey(key)}
|
|
30
|
+
* onCancel={() => setShowForm(false)}
|
|
31
|
+
* />
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function CreateApiKeyForm({ org, onCreated, onCancel, className, }: CreateApiKeyFormProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=CreateApiKeyForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateApiKeyForm.d.ts","sourceRoot":"","sources":["../../src/api-key/CreateApiKeyForm.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iDAAiD,CAAC;AAO9E,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,qBAAqB,2CAqHvB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { useCreateApiKey } from "./useCreateApiKey";
|
|
7
|
+
/**
|
|
8
|
+
* Compact form for creating a new API key.
|
|
9
|
+
*
|
|
10
|
+
* Collects a **name** (required) and an **expiry** choice (30 / 60 /
|
|
11
|
+
* 90 days or never), then creates the key via {@link useCreateApiKey}.
|
|
12
|
+
* On success it fires `onCreated` with the full {@link ApiKey}
|
|
13
|
+
* response, which includes the raw key in `spec.keyHash`.
|
|
14
|
+
*
|
|
15
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <CreateApiKeyForm
|
|
20
|
+
* org="acme"
|
|
21
|
+
* onCreated={(key) => setRevealedKey(key)}
|
|
22
|
+
* onCancel={() => setShowForm(false)}
|
|
23
|
+
* />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function CreateApiKeyForm({ org, onCreated, onCancel, className, }) {
|
|
27
|
+
const { create, isCreating, error, clearError } = useCreateApiKey();
|
|
28
|
+
const [name, setName] = useState("");
|
|
29
|
+
const [expiry, setExpiry] = useState("never");
|
|
30
|
+
const trimmedName = name.trim();
|
|
31
|
+
const canSubmit = trimmedName !== "" && !isCreating;
|
|
32
|
+
const handleSubmit = useCallback(async (e) => {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
if (!canSubmit)
|
|
35
|
+
return;
|
|
36
|
+
clearError();
|
|
37
|
+
try {
|
|
38
|
+
const apiKey = await create({
|
|
39
|
+
name: trimmedName,
|
|
40
|
+
org,
|
|
41
|
+
...(expiry === "never"
|
|
42
|
+
? { neverExpires: true }
|
|
43
|
+
: { expiresAt: daysFromNow(Number(expiry)) }),
|
|
44
|
+
});
|
|
45
|
+
onCreated?.(apiKey);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// error state is managed by useCreateApiKey
|
|
49
|
+
}
|
|
50
|
+
}, [canSubmit, trimmedName, org, expiry, create, clearError, onCreated]);
|
|
51
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-3", className), children: [_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("label", { htmlFor: "stgm-new-apikey-name", className: "text-xs font-medium text-foreground", children: "Name" }), _jsx("input", { id: "stgm-new-apikey-name", type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "e.g. ci-deploy-key", disabled: isCreating, autoFocus: true, required: true, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") })] }), _jsxs("fieldset", { className: "space-y-1.5", children: [_jsx("legend", { className: "text-xs font-medium text-foreground", children: "Expiration" }), _jsx("div", { className: "flex flex-wrap gap-2", children: EXPIRY_OPTIONS.map(({ value, label }) => (_jsx(ExpiryRadio, { value: value, label: label, checked: expiry === value, disabled: isCreating, onChange: setExpiry }, value))) })] })] }), error && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "submit", disabled: !canSubmit, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isCreating && _jsx(SpinnerIcon, {}), "Create API key"] }), onCancel && (_jsx("button", { type: "button", onClick: onCancel, disabled: isCreating, className: cn("rounded-md px-3 py-1.5 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" }))] })] }));
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Expiry helpers
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
const EXPIRY_OPTIONS = [
|
|
57
|
+
{ value: "30", label: "30 days" },
|
|
58
|
+
{ value: "60", label: "60 days" },
|
|
59
|
+
{ value: "90", label: "90 days" },
|
|
60
|
+
{ value: "never", label: "Never" },
|
|
61
|
+
];
|
|
62
|
+
function daysFromNow(days) {
|
|
63
|
+
const date = new Date();
|
|
64
|
+
date.setDate(date.getDate() + days);
|
|
65
|
+
return date;
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// ExpiryRadio (internal)
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
function ExpiryRadio({ value, label, checked, disabled, onChange, }) {
|
|
71
|
+
return (_jsxs("label", { className: cn("inline-flex cursor-pointer items-center rounded-md border px-2.5 py-1 text-xs transition-colors", checked
|
|
72
|
+
? "border-primary bg-primary-subtle text-primary font-medium"
|
|
73
|
+
: "border-input bg-background text-muted-foreground hover:border-border hover:text-foreground", disabled && "pointer-events-none opacity-50"), children: [_jsx("input", { type: "radio", name: "stgm-apikey-expiry", value: value, checked: checked, disabled: disabled, onChange: () => onChange(value), className: "sr-only" }), label] }));
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Icons
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function SpinnerIcon() {
|
|
79
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=CreateApiKeyForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateApiKeyForm.js","sourceRoot":"","sources":["../../src/api-key/CreateApiKeyForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { useApiKeyList } from "./useApiKeyList";
|
|
2
|
+
export type { UseApiKeyListReturn } from "./useApiKeyList";
|
|
3
|
+
export { useCreateApiKey } from "./useCreateApiKey";
|
|
4
|
+
export type { UseCreateApiKeyReturn } from "./useCreateApiKey";
|
|
5
|
+
export { useDeleteApiKey } from "./useDeleteApiKey";
|
|
6
|
+
export type { UseDeleteApiKeyReturn } from "./useDeleteApiKey";
|
|
7
|
+
export { ApiKeyListPanel } from "./ApiKeyListPanel";
|
|
8
|
+
export type { ApiKeyListPanelProps } from "./ApiKeyListPanel";
|
|
9
|
+
export { CreateApiKeyForm } from "./CreateApiKeyForm";
|
|
10
|
+
export type { CreateApiKeyFormProps } from "./CreateApiKeyForm";
|
|
11
|
+
export { ApiKeyCreatedAlert } from "./ApiKeyCreatedAlert";
|
|
12
|
+
export type { ApiKeyCreatedAlertProps } from "./ApiKeyCreatedAlert";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api-key/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/api-key/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { useApiKeyList } from "./useApiKeyList";
|
|
2
|
+
export { useCreateApiKey } from "./useCreateApiKey";
|
|
3
|
+
export { useDeleteApiKey } from "./useDeleteApiKey";
|
|
4
|
+
export { ApiKeyListPanel } from "./ApiKeyListPanel";
|
|
5
|
+
export { CreateApiKeyForm } from "./CreateApiKeyForm";
|
|
6
|
+
export { ApiKeyCreatedAlert } from "./ApiKeyCreatedAlert";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api-key/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
|
|
2
|
+
export interface UseApiKeyListReturn {
|
|
3
|
+
readonly apiKeys: readonly ApiKey[];
|
|
4
|
+
readonly isLoading: boolean;
|
|
5
|
+
readonly error: Error | null;
|
|
6
|
+
readonly refetch: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Data hook that fetches all {@link ApiKey} entries for the
|
|
10
|
+
* authenticated identity.
|
|
11
|
+
*
|
|
12
|
+
* API keys are identity-scoped — the server returns every key owned
|
|
13
|
+
* by the identity in the auth header, regardless of organization.
|
|
14
|
+
* Call `refetch()` to re-query after mutations (create / delete).
|
|
15
|
+
*
|
|
16
|
+
* The raw key value is never returned by `findAll` — only the
|
|
17
|
+
* `fingerprint` (last 6 characters) is available for display.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const { apiKeys, isLoading, error, refetch } = useApiKeyList();
|
|
22
|
+
*
|
|
23
|
+
* if (isLoading) return <Spinner />;
|
|
24
|
+
* apiKeys.map((k) => k.metadata?.name);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function useApiKeyList(): UseApiKeyListReturn;
|
|
28
|
+
//# sourceMappingURL=useApiKeyList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApiKeyList.d.ts","sourceRoot":"","sources":["../../src/api-key/useApiKeyList.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iDAAiD,CAAC;AAI9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CAkCnD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { useStigmer } from "../hooks";
|
|
4
|
+
import { toError } from "../internal/toError";
|
|
5
|
+
/**
|
|
6
|
+
* Data hook that fetches all {@link ApiKey} entries for the
|
|
7
|
+
* authenticated identity.
|
|
8
|
+
*
|
|
9
|
+
* API keys are identity-scoped — the server returns every key owned
|
|
10
|
+
* by the identity in the auth header, regardless of organization.
|
|
11
|
+
* Call `refetch()` to re-query after mutations (create / delete).
|
|
12
|
+
*
|
|
13
|
+
* The raw key value is never returned by `findAll` — only the
|
|
14
|
+
* `fingerprint` (last 6 characters) is available for display.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { apiKeys, isLoading, error, refetch } = useApiKeyList();
|
|
19
|
+
*
|
|
20
|
+
* if (isLoading) return <Spinner />;
|
|
21
|
+
* apiKeys.map((k) => k.metadata?.name);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function useApiKeyList() {
|
|
25
|
+
const stigmer = useStigmer();
|
|
26
|
+
const [apiKeys, setApiKeys] = useState([]);
|
|
27
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
28
|
+
const [error, setError] = useState(null);
|
|
29
|
+
const [fetchKey, setFetchKey] = useState(0);
|
|
30
|
+
const refetch = useCallback(() => setFetchKey((k) => k + 1), []);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const cancelled = { current: false };
|
|
33
|
+
setIsLoading(true);
|
|
34
|
+
setError(null);
|
|
35
|
+
stigmer.apiKey.findAll().then((result) => {
|
|
36
|
+
if (cancelled.current)
|
|
37
|
+
return;
|
|
38
|
+
setApiKeys([...result.entries]);
|
|
39
|
+
setIsLoading(false);
|
|
40
|
+
}, (err) => {
|
|
41
|
+
if (cancelled.current)
|
|
42
|
+
return;
|
|
43
|
+
setError(toError(err));
|
|
44
|
+
setIsLoading(false);
|
|
45
|
+
});
|
|
46
|
+
return () => {
|
|
47
|
+
cancelled.current = true;
|
|
48
|
+
};
|
|
49
|
+
}, [stigmer, fetchKey]);
|
|
50
|
+
return { apiKeys, isLoading, error, refetch };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=useApiKeyList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useApiKeyList.js","sourceRoot":"","sources":["../../src/api-key/useApiKeyList.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAErC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC9B,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAChC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC9B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CACF,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ApiKeyInput } from "@stigmer/sdk";
|
|
2
|
+
import type { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
|
|
3
|
+
export interface UseCreateApiKeyReturn {
|
|
4
|
+
readonly create: (input: ApiKeyInput) => Promise<ApiKey>;
|
|
5
|
+
readonly isCreating: boolean;
|
|
6
|
+
readonly error: Error | null;
|
|
7
|
+
readonly clearError: () => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Behavior hook that wraps `apiKey.create()` with loading and error
|
|
11
|
+
* state.
|
|
12
|
+
*
|
|
13
|
+
* Creates an API key resource. The caller provides an
|
|
14
|
+
* {@link ApiKeyInput} with `name`, `org`, and optionally `expiresAt`
|
|
15
|
+
* or `neverExpires`.
|
|
16
|
+
*
|
|
17
|
+
* **Critical**: The returned {@link ApiKey} is the *only* time the
|
|
18
|
+
* raw key value is available — it is returned in `spec.keyHash` of
|
|
19
|
+
* the create response. After creation the server stores only the
|
|
20
|
+
* hash; subsequent queries return an empty `keyHash` and only the
|
|
21
|
+
* `fingerprint` (last 6 characters) for display.
|
|
22
|
+
*
|
|
23
|
+
* Callers must capture the raw key from the resolved promise and
|
|
24
|
+
* present it to the user immediately (e.g. via
|
|
25
|
+
* {@link ApiKeyCreatedAlert}).
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const { create, isCreating, error } = useCreateApiKey();
|
|
30
|
+
*
|
|
31
|
+
* const apiKey = await create({
|
|
32
|
+
* name: "ci-deploy-key",
|
|
33
|
+
* org: "acme",
|
|
34
|
+
* neverExpires: true,
|
|
35
|
+
* });
|
|
36
|
+
* // apiKey.spec?.keyHash contains the raw key — show it once
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function useCreateApiKey(): UseCreateApiKeyReturn;
|
|
40
|
+
//# sourceMappingURL=useCreateApiKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCreateApiKey.d.ts","sourceRoot":"","sources":["../../src/api-key/useCreateApiKey.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iDAAiD,CAAC;AAI9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CAyBvD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { useStigmer } from "../hooks";
|
|
4
|
+
import { toError } from "../internal/toError";
|
|
5
|
+
/**
|
|
6
|
+
* Behavior hook that wraps `apiKey.create()` with loading and error
|
|
7
|
+
* state.
|
|
8
|
+
*
|
|
9
|
+
* Creates an API key resource. The caller provides an
|
|
10
|
+
* {@link ApiKeyInput} with `name`, `org`, and optionally `expiresAt`
|
|
11
|
+
* or `neverExpires`.
|
|
12
|
+
*
|
|
13
|
+
* **Critical**: The returned {@link ApiKey} is the *only* time the
|
|
14
|
+
* raw key value is available — it is returned in `spec.keyHash` of
|
|
15
|
+
* the create response. After creation the server stores only the
|
|
16
|
+
* hash; subsequent queries return an empty `keyHash` and only the
|
|
17
|
+
* `fingerprint` (last 6 characters) for display.
|
|
18
|
+
*
|
|
19
|
+
* Callers must capture the raw key from the resolved promise and
|
|
20
|
+
* present it to the user immediately (e.g. via
|
|
21
|
+
* {@link ApiKeyCreatedAlert}).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const { create, isCreating, error } = useCreateApiKey();
|
|
26
|
+
*
|
|
27
|
+
* const apiKey = await create({
|
|
28
|
+
* name: "ci-deploy-key",
|
|
29
|
+
* org: "acme",
|
|
30
|
+
* neverExpires: true,
|
|
31
|
+
* });
|
|
32
|
+
* // apiKey.spec?.keyHash contains the raw key — show it once
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function useCreateApiKey() {
|
|
36
|
+
const stigmer = useStigmer();
|
|
37
|
+
const [isCreating, setIsCreating] = useState(false);
|
|
38
|
+
const [error, setError] = useState(null);
|
|
39
|
+
const clearError = useCallback(() => setError(null), []);
|
|
40
|
+
const create = useCallback(async (input) => {
|
|
41
|
+
setIsCreating(true);
|
|
42
|
+
setError(null);
|
|
43
|
+
try {
|
|
44
|
+
return await stigmer.apiKey.create(input);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
setError(toError(err));
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
setIsCreating(false);
|
|
52
|
+
}
|
|
53
|
+
}, [stigmer]);
|
|
54
|
+
return { create, isCreating, error, clearError };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=useCreateApiKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCreateApiKey.js","sourceRoot":"","sources":["../../src/api-key/useCreateApiKey.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,KAAkB,EAAmB,EAAE;QAC5C,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ApiKey } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
|
|
2
|
+
export interface UseDeleteApiKeyReturn {
|
|
3
|
+
readonly deleteKey: (id: string) => Promise<ApiKey>;
|
|
4
|
+
readonly isDeleting: boolean;
|
|
5
|
+
readonly error: Error | null;
|
|
6
|
+
readonly clearError: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Behavior hook that wraps `apiKey.delete()` with loading and error
|
|
10
|
+
* state.
|
|
11
|
+
*
|
|
12
|
+
* Deletes an API key by its resource ID. Returns the deleted
|
|
13
|
+
* {@link ApiKey} on success so callers can confirm which key was
|
|
14
|
+
* removed. The deletion is permanent — the key can no longer be
|
|
15
|
+
* used for authentication.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const { deleteKey, isDeleting, error } = useDeleteApiKey();
|
|
20
|
+
*
|
|
21
|
+
* await deleteKey("key-id-abc123");
|
|
22
|
+
* refetch(); // refresh the list after deletion
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function useDeleteApiKey(): UseDeleteApiKeyReturn;
|
|
26
|
+
//# sourceMappingURL=useDeleteApiKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeleteApiKey.d.ts","sourceRoot":"","sources":["../../src/api-key/useDeleteApiKey.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iDAAiD,CAAC;AAI9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CAyBvD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { useStigmer } from "../hooks";
|
|
4
|
+
import { toError } from "../internal/toError";
|
|
5
|
+
/**
|
|
6
|
+
* Behavior hook that wraps `apiKey.delete()` with loading and error
|
|
7
|
+
* state.
|
|
8
|
+
*
|
|
9
|
+
* Deletes an API key by its resource ID. Returns the deleted
|
|
10
|
+
* {@link ApiKey} on success so callers can confirm which key was
|
|
11
|
+
* removed. The deletion is permanent — the key can no longer be
|
|
12
|
+
* used for authentication.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const { deleteKey, isDeleting, error } = useDeleteApiKey();
|
|
17
|
+
*
|
|
18
|
+
* await deleteKey("key-id-abc123");
|
|
19
|
+
* refetch(); // refresh the list after deletion
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function useDeleteApiKey() {
|
|
23
|
+
const stigmer = useStigmer();
|
|
24
|
+
const [isDeleting, setIsDeleting] = useState(false);
|
|
25
|
+
const [error, setError] = useState(null);
|
|
26
|
+
const clearError = useCallback(() => setError(null), []);
|
|
27
|
+
const deleteKey = useCallback(async (id) => {
|
|
28
|
+
setIsDeleting(true);
|
|
29
|
+
setError(null);
|
|
30
|
+
try {
|
|
31
|
+
return await stigmer.apiKey.delete(id);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
setError(toError(err));
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
setIsDeleting(false);
|
|
39
|
+
}
|
|
40
|
+
}, [stigmer]);
|
|
41
|
+
return { deleteKey, isDeleting, error, clearError };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=useDeleteApiKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeleteApiKey.js","sourceRoot":"","sources":["../../src/api-key/useDeleteApiKey.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,EAAU,EAAmB,EAAE;QACpC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionComposer.d.ts","sourceRoot":"","sources":["../../src/composer/SessionComposer.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SessionComposer.d.ts","sourceRoot":"","sources":["../../src/composer/SessionComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,18 @@ export function SessionComposer({ onSubmit, isSubmitting = false, disabled = fal
|
|
|
115
115
|
const agentSetup = useAgentSetup(showAgent ? (org ?? null) : null, pool.availableKeys);
|
|
116
116
|
const mcpSetup = useMcpServerSetup(showMcp ? (org ?? null) : null, pool.availableKeys);
|
|
117
117
|
// ---------------------------------------------------------------------------
|
|
118
|
+
// Pool-resolve notification — when POOL_RESOLVE transitions agentSetup to
|
|
119
|
+
// "ready" reactively (via the useEffect inside useAgentSetup), the
|
|
120
|
+
// imperative callbacks (handleAgentSelect, handleEnvSubmit) are not
|
|
121
|
+
// involved, so onAgentResolutionChange would never fire. This effect
|
|
122
|
+
// bridges that gap so the parent always knows the current resolution.
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
if (agentSetup.state.status !== "ready")
|
|
126
|
+
return;
|
|
127
|
+
onAgentResolutionChange?.(agentSetup.state.resolution);
|
|
128
|
+
}, [agentSetup.state, onAgentResolutionChange]);
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
118
130
|
// Attachments — file upload state machine
|
|
119
131
|
// ---------------------------------------------------------------------------
|
|
120
132
|
const attachments = useAttachments(enableAttachments
|