@stigmer/react 0.0.36
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/LICENSE +190 -0
- package/README.md +248 -0
- package/agent/components/AgentCard.d.ts +9 -0
- package/agent/components/AgentCard.d.ts.map +1 -0
- package/agent/components/AgentCard.js +26 -0
- package/agent/components/AgentCard.js.map +1 -0
- package/agent/components/AgentOverview.d.ts +7 -0
- package/agent/components/AgentOverview.d.ts.map +1 -0
- package/agent/components/AgentOverview.js +36 -0
- package/agent/components/AgentOverview.js.map +1 -0
- package/agent/components/AgentPicker.d.ts +17 -0
- package/agent/components/AgentPicker.d.ts.map +1 -0
- package/agent/components/AgentPicker.js +86 -0
- package/agent/components/AgentPicker.js.map +1 -0
- package/agent/hooks/useAgentSearch.d.ts +28 -0
- package/agent/hooks/useAgentSearch.d.ts.map +1 -0
- package/agent/hooks/useAgentSearch.js +63 -0
- package/agent/hooks/useAgentSearch.js.map +1 -0
- package/agent/index.d.ts +9 -0
- package/agent/index.d.ts.map +1 -0
- package/agent/index.js +7 -0
- package/agent/index.js.map +1 -0
- package/agent-execution/components/ApprovalControls.d.ts +10 -0
- package/agent-execution/components/ApprovalControls.d.ts.map +1 -0
- package/agent-execution/components/ApprovalControls.js +19 -0
- package/agent-execution/components/ApprovalControls.js.map +1 -0
- package/agent-execution/components/ExecutionStatus.d.ts +8 -0
- package/agent-execution/components/ExecutionStatus.d.ts.map +1 -0
- package/agent-execution/components/ExecutionStatus.js +14 -0
- package/agent-execution/components/ExecutionStatus.js.map +1 -0
- package/agent-execution/components/ExecutionStream.d.ts +16 -0
- package/agent-execution/components/ExecutionStream.d.ts.map +1 -0
- package/agent-execution/components/ExecutionStream.js +39 -0
- package/agent-execution/components/ExecutionStream.js.map +1 -0
- package/agent-execution/components/MessageEntry.d.ts +17 -0
- package/agent-execution/components/MessageEntry.d.ts.map +1 -0
- package/agent-execution/components/MessageEntry.js +36 -0
- package/agent-execution/components/MessageEntry.js.map +1 -0
- package/agent-execution/components/MessageInput.d.ts +10 -0
- package/agent-execution/components/MessageInput.d.ts.map +1 -0
- package/agent-execution/components/MessageInput.js +27 -0
- package/agent-execution/components/MessageInput.js.map +1 -0
- package/agent-execution/components/OutputBlock.d.ts +9 -0
- package/agent-execution/components/OutputBlock.d.ts.map +1 -0
- package/agent-execution/components/OutputBlock.js +15 -0
- package/agent-execution/components/OutputBlock.js.map +1 -0
- package/agent-execution/components/SubAgentCard.d.ts +11 -0
- package/agent-execution/components/SubAgentCard.d.ts.map +1 -0
- package/agent-execution/components/SubAgentCard.js +19 -0
- package/agent-execution/components/SubAgentCard.js.map +1 -0
- package/agent-execution/components/ToolCallCard.d.ts +11 -0
- package/agent-execution/components/ToolCallCard.d.ts.map +1 -0
- package/agent-execution/components/ToolCallCard.js +25 -0
- package/agent-execution/components/ToolCallCard.js.map +1 -0
- package/agent-execution/helpers.d.ts +35 -0
- package/agent-execution/helpers.d.ts.map +1 -0
- package/agent-execution/helpers.js +157 -0
- package/agent-execution/helpers.js.map +1 -0
- package/agent-execution/hooks/useAgentExecution.d.ts +21 -0
- package/agent-execution/hooks/useAgentExecution.d.ts.map +1 -0
- package/agent-execution/hooks/useAgentExecution.js +99 -0
- package/agent-execution/hooks/useAgentExecution.js.map +1 -0
- package/agent-execution/hooks/useApproval.d.ts +12 -0
- package/agent-execution/hooks/useApproval.d.ts.map +1 -0
- package/agent-execution/hooks/useApproval.js +32 -0
- package/agent-execution/hooks/useApproval.js.map +1 -0
- package/agent-execution/index.d.ts +14 -0
- package/agent-execution/index.d.ts.map +1 -0
- package/agent-execution/index.js +15 -0
- package/agent-execution/index.js.map +1 -0
- package/catalog/components/ResourceSearchCard.d.ts +23 -0
- package/catalog/components/ResourceSearchCard.d.ts.map +1 -0
- package/catalog/components/ResourceSearchCard.js +36 -0
- package/catalog/components/ResourceSearchCard.js.map +1 -0
- package/catalog/index.d.ts +4 -0
- package/catalog/index.d.ts.map +1 -0
- package/catalog/index.js +5 -0
- package/catalog/index.js.map +1 -0
- package/catalog/internal/time.d.ts +13 -0
- package/catalog/internal/time.d.ts.map +1 -0
- package/catalog/internal/time.js +41 -0
- package/catalog/internal/time.js.map +1 -0
- package/context.d.ts +12 -0
- package/context.d.ts.map +1 -0
- package/context.js +13 -0
- package/context.js.map +1 -0
- package/hooks.d.ts +19 -0
- package/hooks.d.ts.map +1 -0
- package/hooks.js +28 -0
- package/hooks.js.map +1 -0
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -0
- package/index.js +6 -0
- package/index.js.map +1 -0
- package/internal/badge.d.ts +8 -0
- package/internal/badge.d.ts.map +1 -0
- package/internal/badge.js +34 -0
- package/internal/badge.js.map +1 -0
- package/internal/button.d.ts +9 -0
- package/internal/button.d.ts.map +1 -0
- package/internal/button.js +36 -0
- package/internal/button.js.map +1 -0
- package/internal/collapsible.d.ts +6 -0
- package/internal/collapsible.d.ts.map +1 -0
- package/internal/collapsible.js +14 -0
- package/internal/collapsible.js.map +1 -0
- package/internal/section.d.ts +8 -0
- package/internal/section.d.ts.map +1 -0
- package/internal/section.js +6 -0
- package/internal/section.js.map +1 -0
- package/internal/textarea.d.ts +4 -0
- package/internal/textarea.d.ts.map +1 -0
- package/internal/textarea.js +9 -0
- package/internal/textarea.js.map +1 -0
- package/mcp-server/hooks/useMcpServerSearch.d.ts +25 -0
- package/mcp-server/hooks/useMcpServerSearch.d.ts.map +1 -0
- package/mcp-server/hooks/useMcpServerSearch.js +57 -0
- package/mcp-server/hooks/useMcpServerSearch.js.map +1 -0
- package/mcp-server/index.d.ts +3 -0
- package/mcp-server/index.d.ts.map +1 -0
- package/mcp-server/index.js +3 -0
- package/mcp-server/index.js.map +1 -0
- package/package.json +75 -0
- package/provider.d.ts +55 -0
- package/provider.d.ts.map +1 -0
- package/provider.js +34 -0
- package/provider.js.map +1 -0
- package/session/components/AgentSessionHistory.d.ts +8 -0
- package/session/components/AgentSessionHistory.d.ts.map +1 -0
- package/session/components/AgentSessionHistory.js +11 -0
- package/session/components/AgentSessionHistory.js.map +1 -0
- package/session/components/SessionCard.d.ts +8 -0
- package/session/components/SessionCard.d.ts.map +1 -0
- package/session/components/SessionCard.js +57 -0
- package/session/components/SessionCard.js.map +1 -0
- package/session/hooks/useAgentSessionList.d.ts +21 -0
- package/session/hooks/useAgentSessionList.d.ts.map +1 -0
- package/session/hooks/useAgentSessionList.js +90 -0
- package/session/hooks/useAgentSessionList.js.map +1 -0
- package/session/index.d.ts +7 -0
- package/session/index.d.ts.map +1 -0
- package/session/index.js +6 -0
- package/session/index.js.map +1 -0
- package/skill/hooks/useSkillSearch.d.ts +25 -0
- package/skill/hooks/useSkillSearch.d.ts.map +1 -0
- package/skill/hooks/useSkillSearch.js +57 -0
- package/skill/hooks/useSkillSearch.js.map +1 -0
- package/skill/index.d.ts +3 -0
- package/skill/index.d.ts.map +1 -0
- package/skill/index.js +3 -0
- package/skill/index.js.map +1 -0
- package/src/agent/components/AgentCard.tsx +125 -0
- package/src/agent/components/AgentOverview.tsx +209 -0
- package/src/agent/components/AgentPicker.tsx +255 -0
- package/src/agent/hooks/useAgentSearch.ts +94 -0
- package/src/agent/index.ts +17 -0
- package/src/agent-execution/components/ApprovalControls.tsx +99 -0
- package/src/agent-execution/components/ExecutionStatus.tsx +33 -0
- package/src/agent-execution/components/ExecutionStream.tsx +148 -0
- package/src/agent-execution/components/MessageEntry.tsx +125 -0
- package/src/agent-execution/components/MessageInput.tsx +70 -0
- package/src/agent-execution/components/OutputBlock.tsx +43 -0
- package/src/agent-execution/components/SubAgentCard.tsx +138 -0
- package/src/agent-execution/components/ToolCallCard.tsx +153 -0
- package/src/agent-execution/helpers.ts +193 -0
- package/src/agent-execution/hooks/useAgentExecution.ts +147 -0
- package/src/agent-execution/hooks/useApproval.ts +56 -0
- package/src/agent-execution/index.ts +46 -0
- package/src/catalog/components/ResourceSearchCard.tsx +137 -0
- package/src/catalog/index.ts +6 -0
- package/src/catalog/internal/time.ts +40 -0
- package/src/context.ts +15 -0
- package/src/hooks.ts +32 -0
- package/src/index.ts +6 -0
- package/src/internal/badge.tsx +52 -0
- package/src/internal/button.tsx +60 -0
- package/src/internal/collapsible.tsx +21 -0
- package/src/internal/section.tsx +18 -0
- package/src/internal/textarea.tsx +23 -0
- package/src/mcp-server/hooks/useMcpServerSearch.ts +79 -0
- package/src/mcp-server/index.ts +6 -0
- package/src/provider.tsx +73 -0
- package/src/session/components/AgentSessionHistory.tsx +109 -0
- package/src/session/components/SessionCard.tsx +113 -0
- package/src/session/hooks/useAgentSessionList.ts +117 -0
- package/src/session/index.ts +13 -0
- package/src/skill/hooks/useSkillSearch.ts +79 -0
- package/src/skill/index.ts +6 -0
- package/src/styles.css +72 -0
- package/styles.css +2 -0
package/provider.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { cn, resolvePresetClass } from "@stigmer/theme";
|
|
4
|
+
import { StigmerContext } from "./context";
|
|
5
|
+
/**
|
|
6
|
+
* React provider that distributes a {@link Stigmer} SDK client to
|
|
7
|
+
* descendant components via {@link StigmerContext}.
|
|
8
|
+
*
|
|
9
|
+
* Renders a `<div class="stgm">` container that scopes Stigmer's
|
|
10
|
+
* CSS reset and design tokens. External consumers importing
|
|
11
|
+
* `@stigmer/react/styles.css` get isolated styles that do not
|
|
12
|
+
* leak into the host application.
|
|
13
|
+
*
|
|
14
|
+
* Pass {@link StigmerProviderProps.preset | preset} to apply a
|
|
15
|
+
* built-in theme, or use {@link StigmerProviderProps.className | className}
|
|
16
|
+
* for custom styling.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const client = useMemo(
|
|
21
|
+
* () => new Stigmer({ baseUrl, getAccessToken }),
|
|
22
|
+
* [getAccessToken],
|
|
23
|
+
* );
|
|
24
|
+
*
|
|
25
|
+
* <StigmerProvider client={client} preset="fintech">
|
|
26
|
+
* <App />
|
|
27
|
+
* </StigmerProvider>
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function StigmerProvider({ client, children, preset, className, }) {
|
|
31
|
+
const presetClass = preset ? resolvePresetClass(preset) : "";
|
|
32
|
+
return (_jsx(StigmerContext.Provider, { value: client, children: _jsx("div", { className: cn("stgm", presetClass, className), children: children }) }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=provider.js.map
|
package/provider.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,OAAO,EAAE,EAAE,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA4B3C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,GACY;IACrB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YACpC,cAAK,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,GAC5C,CAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface AgentSessionHistoryProps {
|
|
2
|
+
agentId: string;
|
|
3
|
+
onSessionSelect?: (sessionId: string) => void;
|
|
4
|
+
pageSize?: number;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function AgentSessionHistory({ agentId, onSessionSelect, pageSize, className, }: AgentSessionHistoryProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=AgentSessionHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentSessionHistory.d.ts","sourceRoot":"","sources":["../../../src/session/components/AgentSessionHistory.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,eAAe,EACf,QAAY,EACZ,SAAS,GACV,EAAE,wBAAwB,2CAyF1B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { History, Loader2, AlertCircle, RotateCw } from "lucide-react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { SessionCard } from "./SessionCard";
|
|
6
|
+
import { useAgentSessionList } from "../hooks/useAgentSessionList";
|
|
7
|
+
export function AgentSessionHistory({ agentId, onSessionSelect, pageSize = 5, className, }) {
|
|
8
|
+
const { sessions, isLoading, error, hasMore, isLoadingMore, loadMore, retry, } = useAgentSessionList(agentId, { pageSize });
|
|
9
|
+
return (_jsxs("section", { className: cn("stgm-agent-session-history", className), children: [_jsx("h3", { className: "text-muted-foreground mb-3 text-sm font-semibold tracking-wider uppercase", children: "Recent Sessions" }), error && (_jsxs("div", { className: "bg-destructive/10 text-destructive flex items-center gap-2 rounded-lg px-3 py-2 text-sm", children: [_jsx(AlertCircle, { className: "size-4 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: error.message || "Something went wrong" }), _jsxs("button", { type: "button", onClick: retry, className: "text-destructive hover:text-destructive/80 inline-flex shrink-0 items-center gap-1 text-xs font-medium transition-colors", children: [_jsx(RotateCw, { className: "size-3" }), "Retry"] })] })), isLoading && sessions.length === 0 && !error && (_jsx("div", { className: "space-y-3", children: Array.from({ length: 3 }).map((_, i) => (_jsx("div", { className: "bg-muted/50 h-[52px] animate-pulse rounded-xl" }, i))) })), !isLoading && sessions.length === 0 && !error && (_jsxs("div", { className: "border-border flex flex-col items-center justify-center rounded-lg border border-dashed py-12 text-center", children: [_jsx(History, { className: "text-muted-foreground/40 mb-3 size-10" }), _jsx("p", { className: "text-sm font-medium", children: "No sessions yet" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "Run this agent to create your first session." })] })), sessions.length > 0 && (_jsx("div", { className: "space-y-2", children: sessions.map((session) => (_jsx(SessionCard, { session: session, onNavigate: onSessionSelect }, session.metadata?.id))) })), hasMore && (_jsx("div", { className: "flex justify-center pt-3", children: _jsxs("button", { type: "button", onClick: loadMore, disabled: isLoadingMore, className: cn("border-border inline-flex h-8 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium", "bg-background hover:bg-accent hover:text-accent-foreground transition-colors", "disabled:pointer-events-none disabled:opacity-50", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none"), children: [isLoadingMore && (_jsx(Loader2, { className: "size-3.5 animate-spin" })), "Load more"] }) }))] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=AgentSessionHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentSessionHistory.js","sourceRoot":"","sources":["../../../src/session/components/AgentSessionHistory.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AASnE,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,EACP,eAAe,EACf,QAAQ,GAAG,CAAC,EACZ,SAAS,GACgB;IACzB,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,OAAO,EACP,aAAa,EACb,QAAQ,EACR,KAAK,GACN,GAAG,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,OAAO,CACL,mBAAS,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,aAC7D,aAAI,SAAS,EAAC,2EAA2E,gCAEpF,EAEJ,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,yFAAyF,aACtG,KAAC,WAAW,IAAC,SAAS,EAAC,iBAAiB,GAAG,EAC3C,eAAM,SAAS,EAAC,yBAAyB,YACtC,KAAK,CAAC,OAAO,IAAI,sBAAsB,GACnC,EACP,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,KAAK,EACd,SAAS,EAAC,0HAA0H,aAEpI,KAAC,QAAQ,IAAC,SAAS,EAAC,QAAQ,GAAG,aAExB,IACL,CACP,EAEA,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAC/C,cAAK,SAAS,EAAC,WAAW,YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,cAEE,SAAS,EAAC,+CAA+C,IADpD,CAAC,CAEN,CACH,CAAC,GACE,CACP,EAEA,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAChD,eAAK,SAAS,EAAC,2GAA2G,aACxH,KAAC,OAAO,IAAC,SAAS,EAAC,uCAAuC,GAAG,EAC7D,YAAG,SAAS,EAAC,qBAAqB,gCAAoB,EACtD,YAAG,SAAS,EAAC,oCAAoC,6DAE7C,IACA,CACP,EAEA,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,cAAK,SAAS,EAAC,WAAW,YACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzB,KAAC,WAAW,IAEV,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,eAAe,IAFtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAGzB,CACH,CAAC,GACE,CACP,EAEA,OAAO,IAAI,CACV,cAAK,SAAS,EAAC,0BAA0B,YACvC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,EAAE,CACX,+FAA+F,EAC/F,8EAA8E,EAC9E,kDAAkD,EAClD,yEAAyE,CAC1E,aAEA,aAAa,IAAI,CAChB,KAAC,OAAO,IAAC,SAAS,EAAC,uBAAuB,GAAG,CAC9C,iBAEM,GACL,CACP,IACO,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
2
|
+
export interface SessionCardProps {
|
|
3
|
+
session: Session;
|
|
4
|
+
onNavigate?: (sessionId: string) => void;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function SessionCard({ session, onNavigate, className }: SessionCardProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=SessionCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionCard.d.ts","sourceRoot":"","sources":["../../../src/session/components/SessionCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sDAAsD,CAAC;AAKpF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CA8D/E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { MessageSquare, ChevronRight } from "lucide-react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
export function SessionCard({ session, onNavigate, className }) {
|
|
6
|
+
const id = session.metadata?.id ?? "";
|
|
7
|
+
const displayName = session.spec?.subject || session.metadata?.name || "Untitled session";
|
|
8
|
+
const createdAt = session.status?.audit?.specAudit?.createdAt;
|
|
9
|
+
const updatedAt = session.status?.audit?.specAudit?.updatedAt;
|
|
10
|
+
const interactive = !!onNavigate;
|
|
11
|
+
return (_jsx("div", { role: interactive ? "button" : undefined, tabIndex: interactive ? 0 : undefined, onClick: interactive ? () => onNavigate(id) : undefined, onKeyDown: interactive
|
|
12
|
+
? (e) => {
|
|
13
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
onNavigate(id);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
: undefined, className: cn("stgm-session-card", "bg-card text-card-foreground ring-foreground/10 flex flex-col gap-3 overflow-hidden rounded-xl py-3 text-sm ring-1", interactive && "cursor-pointer hover:bg-accent/50 transition-colors", "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none", className), children: _jsxs("div", { className: "grid auto-rows-min grid-cols-[1fr_auto] items-start gap-1 px-3", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium leading-snug", children: [_jsx(MessageSquare, { className: "text-muted-foreground size-4 shrink-0" }), _jsx("span", { className: "truncate", children: displayName })] }), interactive && (_jsx("div", { className: "col-start-2 row-span-2 row-start-1 self-start justify-self-end", children: _jsx(ChevronRight, { className: "text-muted-foreground size-4" }) })), _jsx("div", { className: "text-muted-foreground col-start-1 text-sm", children: _jsxs("span", { className: "flex items-center gap-3", children: [createdAt && (_jsx("time", { dateTime: toISOString(createdAt), children: formatRelativeTime(createdAt) })), updatedAt && createdAt && (_jsxs("span", { className: "text-muted-foreground/60", children: ["updated ", formatRelativeTime(updatedAt)] }))] }) })] }) }));
|
|
19
|
+
}
|
|
20
|
+
function toDate(ts) {
|
|
21
|
+
if (!ts)
|
|
22
|
+
return null;
|
|
23
|
+
const seconds = Number(ts.seconds);
|
|
24
|
+
if (!seconds && seconds !== 0)
|
|
25
|
+
return null;
|
|
26
|
+
return new Date(seconds * 1000 + Math.floor(ts.nanos / 1_000_000));
|
|
27
|
+
}
|
|
28
|
+
function toISOString(ts) {
|
|
29
|
+
return toDate(ts)?.toISOString() ?? "";
|
|
30
|
+
}
|
|
31
|
+
function formatRelativeTime(ts) {
|
|
32
|
+
const date = toDate(ts);
|
|
33
|
+
if (!date)
|
|
34
|
+
return "";
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const diffMs = now - date.getTime();
|
|
37
|
+
if (diffMs < 0)
|
|
38
|
+
return "just now";
|
|
39
|
+
if (diffMs < 60_000)
|
|
40
|
+
return "just now";
|
|
41
|
+
const minutes = Math.floor(diffMs / 60_000);
|
|
42
|
+
if (minutes < 60)
|
|
43
|
+
return `${minutes}m ago`;
|
|
44
|
+
const hours = Math.floor(minutes / 60);
|
|
45
|
+
if (hours < 24)
|
|
46
|
+
return `${hours}h ago`;
|
|
47
|
+
const days = Math.floor(hours / 24);
|
|
48
|
+
if (days === 1)
|
|
49
|
+
return "yesterday";
|
|
50
|
+
if (days < 7)
|
|
51
|
+
return `${days}d ago`;
|
|
52
|
+
return date.toLocaleDateString(undefined, {
|
|
53
|
+
month: "short",
|
|
54
|
+
day: "numeric",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=SessionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionCard.js","sourceRoot":"","sources":["../../../src/session/components/SessionCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
|
|
2
|
+
export interface UseAgentSessionListOptions {
|
|
3
|
+
pageSize?: number;
|
|
4
|
+
}
|
|
5
|
+
export interface UseAgentSessionListReturn {
|
|
6
|
+
sessions: Session[];
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
error: Error | null;
|
|
9
|
+
hasMore: boolean;
|
|
10
|
+
isLoadingMore: boolean;
|
|
11
|
+
loadMore: () => void;
|
|
12
|
+
retry: () => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetches sessions scoped to a specific agent with "load more" pagination.
|
|
16
|
+
*
|
|
17
|
+
* Returns sessions sorted by creation time descending (most recent first).
|
|
18
|
+
* Automatically resets when `agentId` changes.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useAgentSessionList(agentId: string, options?: UseAgentSessionListOptions): UseAgentSessionListReturn;
|
|
21
|
+
//# sourceMappingURL=useAgentSessionList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentSessionList.d.ts","sourceRoot":"","sources":["../../../src/session/hooks/useAgentSessionList.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sDAAsD,CAAC;AAOpF,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,0BAA0B,GACnC,yBAAyB,CAmF3B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { create } from "@bufbuild/protobuf";
|
|
4
|
+
import { ListSessionsByAgentRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/session/v1/io_pb";
|
|
5
|
+
import { useStigmer } from "../../hooks";
|
|
6
|
+
const DEFAULT_PAGE_SIZE = 5;
|
|
7
|
+
/**
|
|
8
|
+
* Fetches sessions scoped to a specific agent with "load more" pagination.
|
|
9
|
+
*
|
|
10
|
+
* Returns sessions sorted by creation time descending (most recent first).
|
|
11
|
+
* Automatically resets when `agentId` changes.
|
|
12
|
+
*/
|
|
13
|
+
export function useAgentSessionList(agentId, options) {
|
|
14
|
+
const pageSize = options?.pageSize ?? DEFAULT_PAGE_SIZE;
|
|
15
|
+
const stigmer = useStigmer();
|
|
16
|
+
const [sessions, setSessions] = useState([]);
|
|
17
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
18
|
+
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
19
|
+
const [error, setError] = useState(null);
|
|
20
|
+
const [currentPage, setCurrentPage] = useState(0);
|
|
21
|
+
const [totalPages, setTotalPages] = useState(0);
|
|
22
|
+
const hasMore = currentPage + 1 < totalPages;
|
|
23
|
+
const latestAgentId = useRef(agentId);
|
|
24
|
+
const fetchPage = useCallback(async (page, append) => {
|
|
25
|
+
if (!agentId)
|
|
26
|
+
return;
|
|
27
|
+
const isInitial = !append;
|
|
28
|
+
if (isInitial)
|
|
29
|
+
setIsLoading(true);
|
|
30
|
+
else
|
|
31
|
+
setIsLoadingMore(true);
|
|
32
|
+
setError(null);
|
|
33
|
+
try {
|
|
34
|
+
const result = await stigmer.session.listByAgent(create(ListSessionsByAgentRequestSchema, {
|
|
35
|
+
agentId,
|
|
36
|
+
pageSize,
|
|
37
|
+
pageToken: page > 0 ? String(page) : "",
|
|
38
|
+
}));
|
|
39
|
+
if (latestAgentId.current !== agentId)
|
|
40
|
+
return;
|
|
41
|
+
setTotalPages(result.totalPages);
|
|
42
|
+
setCurrentPage(page);
|
|
43
|
+
if (append) {
|
|
44
|
+
setSessions((prev) => [...prev, ...result.entries]);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
setSessions(result.entries);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (latestAgentId.current !== agentId)
|
|
52
|
+
return;
|
|
53
|
+
setError(err instanceof Error ? err : new Error("Failed to load sessions"));
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
if (latestAgentId.current !== agentId)
|
|
57
|
+
return;
|
|
58
|
+
setIsLoading(false);
|
|
59
|
+
setIsLoadingMore(false);
|
|
60
|
+
}
|
|
61
|
+
}, [agentId, pageSize, stigmer]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
latestAgentId.current = agentId;
|
|
64
|
+
setSessions([]);
|
|
65
|
+
setCurrentPage(0);
|
|
66
|
+
setTotalPages(0);
|
|
67
|
+
fetchPage(0, false);
|
|
68
|
+
}, [agentId, fetchPage]);
|
|
69
|
+
const loadMore = useCallback(() => {
|
|
70
|
+
if (!hasMore || isLoadingMore)
|
|
71
|
+
return;
|
|
72
|
+
fetchPage(currentPage + 1, true);
|
|
73
|
+
}, [hasMore, isLoadingMore, currentPage, fetchPage]);
|
|
74
|
+
const retry = useCallback(() => {
|
|
75
|
+
setSessions([]);
|
|
76
|
+
setCurrentPage(0);
|
|
77
|
+
setTotalPages(0);
|
|
78
|
+
fetchPage(0, false);
|
|
79
|
+
}, [fetchPage]);
|
|
80
|
+
return {
|
|
81
|
+
sessions,
|
|
82
|
+
isLoading,
|
|
83
|
+
error,
|
|
84
|
+
hasMore,
|
|
85
|
+
isLoadingMore,
|
|
86
|
+
loadMore,
|
|
87
|
+
retry,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=useAgentSessionList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAgentSessionList.js","sourceRoot":"","sources":["../../../src/session/hooks/useAgentSessionList.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,qDAAqD,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAgB5B;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,OAAoC;IAEpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC;IACxD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,GAAG,UAAU,CAAC;IAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,IAAY,EAAE,MAAe,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC;QAC1B,IAAI,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;;YAC7B,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAC9C,MAAM,CAAC,gCAAgC,EAAE;gBACvC,OAAO;gBACP,QAAQ;gBACR,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;aACxC,CAAC,CACH,CAAC;YAEF,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO;YAE9C,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,CAAC;YAErB,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO;YAC9C,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC9E,CAAC;gBAAS,CAAC;YACT,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO;YAC9C,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAC7B,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC;QAChC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,cAAc,CAAC,CAAC,CAAC,CAAC;QAClB,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,OAAO,IAAI,aAAa;YAAE,OAAO;QACtC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,cAAc,CAAC,CAAC,CAAC,CAAC;QAClB,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO;QACL,QAAQ;QACR,SAAS;QACT,KAAK;QACL,OAAO;QACP,aAAa;QACb,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { useAgentSessionList } from "./hooks/useAgentSessionList";
|
|
2
|
+
export type { UseAgentSessionListOptions, UseAgentSessionListReturn, } from "./hooks/useAgentSessionList";
|
|
3
|
+
export { SessionCard } from "./components/SessionCard";
|
|
4
|
+
export type { SessionCardProps } from "./components/SessionCard";
|
|
5
|
+
export { AgentSessionHistory } from "./components/AgentSessionHistory";
|
|
6
|
+
export type { AgentSessionHistoryProps } from "./components/AgentSessionHistory";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
|
package/session/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAMlE,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SearchResult } from "@stigmer/protos/ai/stigmer/search/v1/io_pb";
|
|
2
|
+
export interface UseSkillSearchOptions {
|
|
3
|
+
org: string;
|
|
4
|
+
debounceMs?: number;
|
|
5
|
+
pageSize?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface UseSkillSearchReturn {
|
|
8
|
+
query: string;
|
|
9
|
+
setQuery: (query: string) => void;
|
|
10
|
+
results: SearchResult[];
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
error: string | null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Debounced skill search scoped to a specific organization.
|
|
16
|
+
*
|
|
17
|
+
* On mount fetches all accessible skills (empty query). Typing fires at most
|
|
18
|
+
* one request per debounce interval. Stale responses from out-of-order
|
|
19
|
+
* requests are discarded.
|
|
20
|
+
*
|
|
21
|
+
* Returns full {@link SearchResult} objects suitable for use with
|
|
22
|
+
* `ResourceSearchCard`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useSkillSearch(options: UseSkillSearchOptions): UseSkillSearchReturn;
|
|
25
|
+
//# sourceMappingURL=useSkillSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSkillSearch.d.ts","sourceRoot":"","sources":["../../../src/skill/hooks/useSkillSearch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAK/E,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CAkCnF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useStigmer } from "../../hooks";
|
|
4
|
+
const DEBOUNCE_MS = 300;
|
|
5
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
6
|
+
/**
|
|
7
|
+
* Debounced skill search scoped to a specific organization.
|
|
8
|
+
*
|
|
9
|
+
* On mount fetches all accessible skills (empty query). Typing fires at most
|
|
10
|
+
* one request per debounce interval. Stale responses from out-of-order
|
|
11
|
+
* requests are discarded.
|
|
12
|
+
*
|
|
13
|
+
* Returns full {@link SearchResult} objects suitable for use with
|
|
14
|
+
* `ResourceSearchCard`.
|
|
15
|
+
*/
|
|
16
|
+
export function useSkillSearch(options) {
|
|
17
|
+
const { org, debounceMs = DEBOUNCE_MS, pageSize = DEFAULT_PAGE_SIZE } = options;
|
|
18
|
+
const stigmer = useStigmer();
|
|
19
|
+
const [query, setQuery] = useState("");
|
|
20
|
+
const [results, setResults] = useState([]);
|
|
21
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
22
|
+
const [error, setError] = useState(null);
|
|
23
|
+
const latestRequestId = useRef(0);
|
|
24
|
+
const debouncedQuery = useDebouncedValue(query, debounceMs);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const requestId = ++latestRequestId.current;
|
|
27
|
+
setIsLoading(true);
|
|
28
|
+
setError(null);
|
|
29
|
+
stigmer.skill
|
|
30
|
+
.list({ query: debouncedQuery, org, page: { num: 1, size: pageSize } })
|
|
31
|
+
.then((response) => {
|
|
32
|
+
if (requestId !== latestRequestId.current)
|
|
33
|
+
return;
|
|
34
|
+
setResults(response.entries);
|
|
35
|
+
})
|
|
36
|
+
.catch((err) => {
|
|
37
|
+
if (requestId !== latestRequestId.current)
|
|
38
|
+
return;
|
|
39
|
+
setError(err instanceof Error ? err.message : "Search failed");
|
|
40
|
+
})
|
|
41
|
+
.finally(() => {
|
|
42
|
+
if (requestId !== latestRequestId.current)
|
|
43
|
+
return;
|
|
44
|
+
setIsLoading(false);
|
|
45
|
+
});
|
|
46
|
+
}, [debouncedQuery, org, pageSize, stigmer]);
|
|
47
|
+
return { query, setQuery, results, isLoading, error };
|
|
48
|
+
}
|
|
49
|
+
function useDebouncedValue(value, delayMs) {
|
|
50
|
+
const [debounced, setDebounced] = useState(value);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
const timer = setTimeout(() => setDebounced(value), delayMs);
|
|
53
|
+
return () => clearTimeout(timer);
|
|
54
|
+
}, [value, delayMs]);
|
|
55
|
+
return debounced;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=useSkillSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSkillSearch.js","sourceRoot":"","sources":["../../../src/skill/hooks/useSkillSearch.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAgB7B;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,WAAW,EAAE,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAChF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,OAAO,CAAC,KAAK;aACV,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;aACtE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO;gBAAE,OAAO;YAClD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO;gBAAE,OAAO;YAClD,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO;gBAAE,OAAO;YAClD,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAI,KAAQ,EAAE,OAAe;IACrD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/skill/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC"}
|
package/skill/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
2
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
3
|
+
import { Bot, Globe, Server, FileCode2, Users } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
import { cn } from "@stigmer/theme";
|
|
6
|
+
|
|
7
|
+
import { Badge } from "../../internal/badge";
|
|
8
|
+
|
|
9
|
+
export interface AgentCardProps {
|
|
10
|
+
agent: Agent;
|
|
11
|
+
onClick?: () => void;
|
|
12
|
+
href?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function AgentCard({ agent, onClick, href, className }: AgentCardProps) {
|
|
17
|
+
const meta = agent.metadata;
|
|
18
|
+
const spec = agent.spec;
|
|
19
|
+
const isPublic = meta?.visibility === ApiResourceVisibility.visibility_public;
|
|
20
|
+
const qualifiedSlug = meta?.org ? `${meta.org}/${meta.slug}` : meta?.slug;
|
|
21
|
+
|
|
22
|
+
const mcpServerCount = spec?.mcpServerUsages?.length ?? 0;
|
|
23
|
+
const skillCount = spec?.skillRefs?.length ?? 0;
|
|
24
|
+
const subAgentCount = spec?.subAgents?.length ?? 0;
|
|
25
|
+
|
|
26
|
+
const Tag = href ? "a" : "div";
|
|
27
|
+
const interactive = !!(onClick || href);
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<Tag
|
|
31
|
+
href={href}
|
|
32
|
+
onClick={onClick}
|
|
33
|
+
role={interactive ? "button" : undefined}
|
|
34
|
+
tabIndex={interactive ? 0 : undefined}
|
|
35
|
+
onKeyDown={
|
|
36
|
+
interactive
|
|
37
|
+
? (e: React.KeyboardEvent) => {
|
|
38
|
+
if (onClick && (e.key === "Enter" || e.key === " ")) {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
onClick();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
: undefined
|
|
44
|
+
}
|
|
45
|
+
className={cn(
|
|
46
|
+
"bg-card text-card-foreground flex flex-col rounded-xl border p-4",
|
|
47
|
+
interactive &&
|
|
48
|
+
"hover:bg-accent/50 focus-visible:ring-ring cursor-pointer transition-colors focus-visible:ring-2 focus-visible:outline-none",
|
|
49
|
+
className,
|
|
50
|
+
)}
|
|
51
|
+
>
|
|
52
|
+
<div className="flex items-start gap-3">
|
|
53
|
+
{spec?.iconUrl ? (
|
|
54
|
+
<img
|
|
55
|
+
src={spec.iconUrl}
|
|
56
|
+
alt=""
|
|
57
|
+
className="size-9 shrink-0 rounded-lg object-cover"
|
|
58
|
+
/>
|
|
59
|
+
) : (
|
|
60
|
+
<div className="bg-muted flex size-9 shrink-0 items-center justify-center rounded-lg">
|
|
61
|
+
<Bot className="text-muted-foreground size-4" />
|
|
62
|
+
</div>
|
|
63
|
+
)}
|
|
64
|
+
<div className="min-w-0 flex-1">
|
|
65
|
+
<div className="flex items-center gap-2">
|
|
66
|
+
<span className="truncate text-sm font-semibold">{meta?.name}</span>
|
|
67
|
+
{isPublic && (
|
|
68
|
+
<Badge variant="outline" className="shrink-0 text-[10px]">
|
|
69
|
+
<Globe className="size-2.5" />
|
|
70
|
+
Public
|
|
71
|
+
</Badge>
|
|
72
|
+
)}
|
|
73
|
+
</div>
|
|
74
|
+
<p className="text-muted-foreground truncate font-mono text-[11px]">
|
|
75
|
+
{qualifiedSlug}
|
|
76
|
+
</p>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
{spec?.description && (
|
|
81
|
+
<p className="text-muted-foreground mt-2 line-clamp-2 text-xs leading-relaxed">
|
|
82
|
+
{spec.description}
|
|
83
|
+
</p>
|
|
84
|
+
)}
|
|
85
|
+
|
|
86
|
+
{(mcpServerCount > 0 || skillCount > 0 || subAgentCount > 0) && (
|
|
87
|
+
<div className="text-muted-foreground mt-3 flex items-center gap-3 text-[11px]">
|
|
88
|
+
{mcpServerCount > 0 && (
|
|
89
|
+
<span className="flex items-center gap-1">
|
|
90
|
+
<Server className="size-3" />
|
|
91
|
+
{mcpServerCount}
|
|
92
|
+
</span>
|
|
93
|
+
)}
|
|
94
|
+
{skillCount > 0 && (
|
|
95
|
+
<span className="flex items-center gap-1">
|
|
96
|
+
<FileCode2 className="size-3" />
|
|
97
|
+
{skillCount}
|
|
98
|
+
</span>
|
|
99
|
+
)}
|
|
100
|
+
{subAgentCount > 0 && (
|
|
101
|
+
<span className="flex items-center gap-1">
|
|
102
|
+
<Users className="size-3" />
|
|
103
|
+
{subAgentCount}
|
|
104
|
+
</span>
|
|
105
|
+
)}
|
|
106
|
+
</div>
|
|
107
|
+
)}
|
|
108
|
+
|
|
109
|
+
{meta?.tags && meta.tags.length > 0 && (
|
|
110
|
+
<div className="mt-3 flex flex-wrap gap-1">
|
|
111
|
+
{meta.tags.slice(0, 4).map((tag: string) => (
|
|
112
|
+
<Badge key={tag} variant="secondary" className="text-[10px]">
|
|
113
|
+
{tag}
|
|
114
|
+
</Badge>
|
|
115
|
+
))}
|
|
116
|
+
{meta.tags.length > 4 && (
|
|
117
|
+
<span className="text-muted-foreground self-center text-[10px]">
|
|
118
|
+
+{meta.tags.length - 4}
|
|
119
|
+
</span>
|
|
120
|
+
)}
|
|
121
|
+
</div>
|
|
122
|
+
)}
|
|
123
|
+
</Tag>
|
|
124
|
+
);
|
|
125
|
+
}
|