@stwd/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +99 -0
  2. package/dist/components/ApprovalQueue.d.ts +6 -0
  3. package/dist/components/ApprovalQueue.d.ts.map +1 -0
  4. package/dist/components/ApprovalQueue.js +44 -0
  5. package/dist/components/ApprovalQueue.js.map +1 -0
  6. package/dist/components/PolicyControls.d.ts +6 -0
  7. package/dist/components/PolicyControls.d.ts.map +1 -0
  8. package/dist/components/PolicyControls.js +224 -0
  9. package/dist/components/PolicyControls.js.map +1 -0
  10. package/dist/components/SpendDashboard.d.ts +6 -0
  11. package/dist/components/SpendDashboard.d.ts.map +1 -0
  12. package/dist/components/SpendDashboard.js +52 -0
  13. package/dist/components/SpendDashboard.js.map +1 -0
  14. package/dist/components/TransactionHistory.d.ts +6 -0
  15. package/dist/components/TransactionHistory.d.ts.map +1 -0
  16. package/dist/components/TransactionHistory.js +34 -0
  17. package/dist/components/TransactionHistory.js.map +1 -0
  18. package/dist/components/WalletOverview.d.ts +6 -0
  19. package/dist/components/WalletOverview.d.ts.map +1 -0
  20. package/dist/components/WalletOverview.js +40 -0
  21. package/dist/components/WalletOverview.js.map +1 -0
  22. package/dist/hooks/useApprovals.d.ts +14 -0
  23. package/dist/hooks/useApprovals.d.ts.map +1 -0
  24. package/dist/hooks/useApprovals.js +75 -0
  25. package/dist/hooks/useApprovals.js.map +1 -0
  26. package/dist/hooks/usePolicies.d.ts +14 -0
  27. package/dist/hooks/usePolicies.d.ts.map +1 -0
  28. package/dist/hooks/usePolicies.js +75 -0
  29. package/dist/hooks/usePolicies.js.map +1 -0
  30. package/dist/hooks/useSpend.d.ts +11 -0
  31. package/dist/hooks/useSpend.d.ts.map +1 -0
  32. package/dist/hooks/useSpend.js +42 -0
  33. package/dist/hooks/useSpend.js.map +1 -0
  34. package/dist/hooks/useSteward.d.ts +6 -0
  35. package/dist/hooks/useSteward.d.ts.map +1 -0
  36. package/dist/hooks/useSteward.js +8 -0
  37. package/dist/hooks/useSteward.js.map +1 -0
  38. package/dist/hooks/useTransactions.d.ts +24 -0
  39. package/dist/hooks/useTransactions.d.ts.map +1 -0
  40. package/dist/hooks/useTransactions.js +78 -0
  41. package/dist/hooks/useTransactions.js.map +1 -0
  42. package/dist/hooks/useWallet.d.ts +16 -0
  43. package/dist/hooks/useWallet.d.ts.map +1 -0
  44. package/dist/hooks/useWallet.js +46 -0
  45. package/dist/hooks/useWallet.js.map +1 -0
  46. package/dist/index.d.ts +16 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +19 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/provider.d.ts +11 -0
  51. package/dist/provider.d.ts.map +1 -0
  52. package/dist/provider.js +81 -0
  53. package/dist/provider.js.map +1 -0
  54. package/dist/styles.css +796 -0
  55. package/dist/types.d.ts +223 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/format.d.ts +41 -0
  60. package/dist/utils/format.d.ts.map +1 -0
  61. package/dist/utils/format.js +138 -0
  62. package/dist/utils/format.js.map +1 -0
  63. package/dist/utils/theme.d.ts +5 -0
  64. package/dist/utils/theme.d.ts.map +1 -0
  65. package/dist/utils/theme.js +35 -0
  66. package/dist/utils/theme.js.map +1 -0
  67. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # @stwd/react
2
+
3
+ Embeddable React components for Steward agent wallet management. Drop-in UI for wallet overview, transaction history, policy controls, approval queues, and spend analytics.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @stwd/react @stwd/sdk
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```tsx
14
+ import { StewardProvider, WalletOverview, PolicyControls, TransactionHistory } from "@stwd/react";
15
+ import "@stwd/react/styles.css";
16
+ import { StewardClient } from "@stwd/sdk";
17
+
18
+ const client = new StewardClient({
19
+ baseUrl: "https://api.steward.fi",
20
+ bearerToken: agentJwt,
21
+ });
22
+
23
+ function AgentWalletPage({ agentId }: { agentId: string }) {
24
+ return (
25
+ <StewardProvider client={client} agentId={agentId}>
26
+ <WalletOverview showQR />
27
+ <PolicyControls />
28
+ <TransactionHistory pageSize={10} />
29
+ </StewardProvider>
30
+ );
31
+ }
32
+ ```
33
+
34
+ ## Components
35
+
36
+ | Component | Description |
37
+ |-----------|-------------|
38
+ | `<StewardProvider>` | Context provider — wraps all other components |
39
+ | `<WalletOverview>` | Wallet address, balance, chain info, funding QR |
40
+ | `<TransactionHistory>` | Paginated tx list with status badges and explorer links |
41
+ | `<PolicyControls>` | Human-friendly policy toggles (spending limits, address lists, etc.) |
42
+ | `<ApprovalQueue>` | Pending transaction review with approve/deny |
43
+ | `<SpendDashboard>` | Spend tracking with budget bars and charts |
44
+
45
+ ## Hooks
46
+
47
+ All components use public hooks. Use them directly for custom UIs:
48
+
49
+ ```tsx
50
+ import { useSteward, useWallet, useTransactions, usePolicies, useApprovals, useSpend } from "@stwd/react";
51
+ ```
52
+
53
+ | Hook | Returns |
54
+ |------|---------|
55
+ | `useSteward()` | Client, agentId, features, theme, tenant config |
56
+ | `useWallet()` | Agent data, balance, addresses with auto-refresh |
57
+ | `useTransactions(opts?)` | Paginated tx history |
58
+ | `usePolicies()` | Policy CRUD + template support |
59
+ | `useApprovals(interval?)` | Pending approvals + approve/reject actions |
60
+ | `useSpend(range?)` | Spend analytics for time range |
61
+
62
+ ## Theming
63
+
64
+ Components use CSS custom properties. Override any `--stwd-*` variable:
65
+
66
+ ```css
67
+ .stwd-root {
68
+ --stwd-primary: #8B5CF6;
69
+ --stwd-accent: #A78BFA;
70
+ --stwd-bg: #0F0F0F;
71
+ --stwd-surface: #1A1A2E;
72
+ --stwd-text: #FAFAFA;
73
+ --stwd-muted: #6B7280;
74
+ --stwd-success: #10B981;
75
+ --stwd-error: #EF4444;
76
+ --stwd-warning: #F59E0B;
77
+ --stwd-radius: 12px;
78
+ --stwd-font: Inter, system-ui, sans-serif;
79
+ }
80
+ ```
81
+
82
+ Or pass theme overrides to the provider:
83
+
84
+ ```tsx
85
+ <StewardProvider
86
+ client={client}
87
+ agentId={agentId}
88
+ theme={{ primaryColor: "#FF6B35", colorScheme: "light" }}
89
+ >
90
+ ```
91
+
92
+ ## Peer Dependencies
93
+
94
+ - `react >= 18`
95
+ - `@stwd/sdk >= 0.1.0`
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1,6 @@
1
+ import type { ApprovalQueueProps } from "../types.js";
2
+ /**
3
+ * Pending transactions awaiting human review.
4
+ */
5
+ export declare function ApprovalQueue({ refreshInterval, onResolve, showPolicyReason, className, }: ApprovalQueueProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=ApprovalQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalQueue.d.ts","sourceRoot":"","sources":["../../src/components/ApprovalQueue.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKtD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,SAAS,EACT,gBAAuB,EACvB,SAAS,GACV,EAAE,kBAAkB,kDA2IpB"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useApprovals } from "../hooks/useApprovals.js";
4
+ import { useStewardContext } from "../provider.js";
5
+ import { truncateAddress, formatWei, formatRelativeTime, getStatusColor } from "../utils/format.js";
6
+ /**
7
+ * Pending transactions awaiting human review.
8
+ */
9
+ export function ApprovalQueue({ refreshInterval, onResolve, showPolicyReason = true, className, }) {
10
+ const { features } = useStewardContext();
11
+ const { pending, isLoading, error, approve, reject, isResolving } = useApprovals(refreshInterval);
12
+ const [confirmAction, setConfirmAction] = useState(null);
13
+ if (!features.showApprovalQueue)
14
+ return null;
15
+ const handleConfirm = async () => {
16
+ if (!confirmAction)
17
+ return;
18
+ try {
19
+ if (confirmAction.action === "approve") {
20
+ await approve(confirmAction.txId);
21
+ }
22
+ else {
23
+ await reject(confirmAction.txId);
24
+ }
25
+ onResolve?.(confirmAction.txId, confirmAction.action === "approve" ? "approved" : "rejected");
26
+ }
27
+ catch {
28
+ // Error handled by hook
29
+ }
30
+ setConfirmAction(null);
31
+ };
32
+ if (isLoading) {
33
+ return (_jsx("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading approvals..." }) }));
34
+ }
35
+ if (error) {
36
+ return (_jsx("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load approvals: ", error.message] }) }));
37
+ }
38
+ return (_jsxs("div", { className: `stwd-card stwd-approval-queue ${className || ""}`, children: [_jsxs("div", { className: "stwd-approval-header", children: [_jsx("h3", { className: "stwd-heading", children: "Pending Approvals" }), pending.length > 0 && (_jsx("span", { className: "stwd-badge stwd-badge-warning", children: pending.length }))] }), pending.length === 0 ? (_jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\u2705" }), _jsx("div", { className: "stwd-empty-text", children: "No pending approvals" })] })) : (_jsx("div", { className: "stwd-approval-list", children: pending.map((entry) => (_jsxs("div", { className: "stwd-approval-item", children: [_jsxs("div", { className: "stwd-approval-main", children: [_jsxs("div", { className: "stwd-approval-to", children: ["To: ", _jsx("code", { children: truncateAddress(entry.to) })] }), _jsxs("div", { className: "stwd-approval-value", children: [formatWei(entry.value), " ETH"] }), _jsxs("div", { className: "stwd-approval-meta", children: [_jsxs("span", { className: "stwd-badge stwd-badge-muted", children: ["Chain ", entry.chainId] }), _jsx("span", { className: "stwd-approval-time", children: formatRelativeTime(entry.createdAt) })] })] }), showPolicyReason && entry.policyResults.length > 0 && (_jsxs("div", { className: "stwd-approval-reasons", children: [_jsx("div", { className: "stwd-approval-reasons-label", children: "Triggered policies:" }), entry.policyResults
39
+ .filter((pr) => !pr.passed)
40
+ .map((pr, i) => (_jsxs("div", { className: `stwd-badge ${getStatusColor("rejected")}`, children: [pr.type, ": ", pr.reason || "failed"] }, i)))] })), _jsxs("div", { className: "stwd-approval-actions", children: [_jsx("button", { className: "stwd-btn stwd-btn-error", disabled: isResolving, onClick: () => setConfirmAction({ txId: entry.txId, action: "reject" }), children: "Deny" }), _jsx("button", { className: "stwd-btn stwd-btn-success", disabled: isResolving, onClick: () => setConfirmAction({ txId: entry.txId, action: "approve" }), children: "Approve" })] })] }, entry.id))) })), confirmAction && (_jsx("div", { className: "stwd-modal-overlay", onClick: () => setConfirmAction(null), children: _jsxs("div", { className: "stwd-modal", onClick: (e) => e.stopPropagation(), children: [_jsx("h3", { className: "stwd-heading", children: confirmAction.action === "approve" ? "Approve Transaction?" : "Deny Transaction?" }), _jsx("p", { className: "stwd-muted-text", children: confirmAction.action === "approve"
41
+ ? "This transaction will be signed and broadcast."
42
+ : "This transaction will be rejected and will not be executed." }), _jsxs("div", { className: "stwd-modal-actions", children: [_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setConfirmAction(null), children: "Cancel" }), _jsx("button", { className: `stwd-btn ${confirmAction.action === "approve" ? "stwd-btn-success" : "stwd-btn-error"}`, onClick: handleConfirm, disabled: isResolving, children: isResolving ? "Processing..." : confirmAction.action === "approve" ? "Approve" : "Deny" })] })] }) }))] }));
43
+ }
44
+ //# sourceMappingURL=ApprovalQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalQueue.js","sourceRoot":"","sources":["../../src/components/ApprovalQueue.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { PolicyControlsProps } from "../types.js";
2
+ /**
3
+ * Human-friendly policy toggles. Respects tenant exposure config.
4
+ */
5
+ export declare function PolicyControls({ showTemplates, onSave, readOnly, labels: labelOverrides, className, }: PolicyControlsProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=PolicyControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolicyControls.d.ts","sourceRoot":"","sources":["../../src/components/PolicyControls.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAsBvE;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,aAAoB,EACpB,MAAM,EACN,QAAgB,EAChB,MAAM,EAAE,cAAc,EACtB,SAAS,GACV,EAAE,mBAAmB,kDAsMrB"}
@@ -0,0 +1,224 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { usePolicies } from "../hooks/usePolicies.js";
4
+ import { useStewardContext } from "../provider.js";
5
+ const DEFAULT_LABELS = {
6
+ "spending-limit": "Spending Limits",
7
+ "approved-addresses": "Approved Addresses",
8
+ "auto-approve-threshold": "Auto-Approve Threshold",
9
+ "time-window": "Time Window",
10
+ "rate-limit": "Rate Limit",
11
+ "allowed-chains": "Allowed Chains",
12
+ };
13
+ const POLICY_DESCRIPTIONS = {
14
+ "spending-limit": "Set maximum amounts per transaction, per day, and per week.",
15
+ "approved-addresses": "Whitelist or blacklist specific addresses for transactions.",
16
+ "auto-approve-threshold": "Transactions below this amount are auto-approved without review.",
17
+ "time-window": "Restrict transactions to specific hours and days.",
18
+ "rate-limit": "Limit the number of transactions per hour and per day.",
19
+ "allowed-chains": "Restrict which blockchain networks can be used.",
20
+ };
21
+ /**
22
+ * Human-friendly policy toggles. Respects tenant exposure config.
23
+ */
24
+ export function PolicyControls({ showTemplates = true, onSave, readOnly = false, labels: labelOverrides, className, }) {
25
+ const { features, tenantConfig } = useStewardContext();
26
+ const { policies, isLoading, isSaving, error, setPolicies, applyTemplate } = usePolicies();
27
+ const [editPolicies, setEditPolicies] = useState(null);
28
+ const [showTemplateModal, setShowTemplateModal] = useState(false);
29
+ const [saveError, setSaveError] = useState(null);
30
+ if (!features.showPolicyControls)
31
+ return null;
32
+ const labels = { ...DEFAULT_LABELS, ...labelOverrides };
33
+ const exposure = tenantConfig?.exposedPolicies;
34
+ const templates = tenantConfig?.policyTemplates || [];
35
+ const currentPolicies = editPolicies || policies;
36
+ const getExposure = (type) => {
37
+ return exposure?.[type] || "visible";
38
+ };
39
+ const visibleTypes = [
40
+ "spending-limit",
41
+ "approved-addresses",
42
+ "auto-approve-threshold",
43
+ "time-window",
44
+ "rate-limit",
45
+ "allowed-chains",
46
+ ].filter((t) => getExposure(t) !== "hidden");
47
+ const findPolicy = (type) => currentPolicies.find((p) => p.type === type);
48
+ const updatePolicy = (type, updates) => {
49
+ if (readOnly)
50
+ return;
51
+ const existing = currentPolicies.find((p) => p.type === type);
52
+ const updated = existing
53
+ ? currentPolicies.map((p) => (p.type === type ? { ...p, ...updates } : p))
54
+ : [
55
+ ...currentPolicies,
56
+ {
57
+ id: `policy-${type}`,
58
+ type,
59
+ enabled: true,
60
+ config: {},
61
+ ...updates,
62
+ },
63
+ ];
64
+ setEditPolicies(updated);
65
+ };
66
+ const updateConfig = (type, key, value) => {
67
+ const policy = findPolicy(type);
68
+ const config = { ...(policy?.config || {}), [key]: value };
69
+ updatePolicy(type, { config });
70
+ };
71
+ const handleSave = async () => {
72
+ if (!editPolicies)
73
+ return;
74
+ setSaveError(null);
75
+ try {
76
+ await setPolicies(editPolicies);
77
+ setEditPolicies(null);
78
+ onSave?.(editPolicies);
79
+ }
80
+ catch (err) {
81
+ setSaveError(err instanceof Error ? err.message : "Failed to save");
82
+ }
83
+ };
84
+ const handleApplyTemplate = async (templateId) => {
85
+ try {
86
+ await applyTemplate(templateId);
87
+ setShowTemplateModal(false);
88
+ setEditPolicies(null);
89
+ }
90
+ catch (err) {
91
+ setSaveError(err instanceof Error ? err.message : "Failed to apply template");
92
+ }
93
+ };
94
+ if (isLoading) {
95
+ return (_jsx("div", { className: `stwd-card stwd-policy-controls ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading policies..." }) }));
96
+ }
97
+ return (_jsxs("div", { className: `stwd-card stwd-policy-controls ${className || ""}`, children: [_jsxs("div", { className: "stwd-policy-header", children: [_jsx("h3", { className: "stwd-heading", children: "Policy Controls" }), showTemplates && templates.length > 0 && !readOnly && (_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setShowTemplateModal(true), children: "Use Template" }))] }), error && _jsx("div", { className: "stwd-error-text", children: error.message }), _jsx("div", { className: "stwd-policy-list", children: visibleTypes.map((type) => {
98
+ const policy = findPolicy(type);
99
+ const isEnforced = getExposure(type) === "enforced";
100
+ const isEnabled = policy?.enabled ?? false;
101
+ return (_jsxs("div", { className: `stwd-policy-item ${isEnforced ? "stwd-enforced" : ""}`, children: [_jsxs("div", { className: "stwd-policy-item-header", children: [_jsxs("div", { className: "stwd-policy-info", children: [_jsxs("div", { className: "stwd-policy-name", children: [isEnforced && _jsx("span", { className: "stwd-lock-icon", title: "Set by platform", children: "\uD83D\uDD12" }), labels[type]] }), _jsx("div", { className: "stwd-policy-desc", children: POLICY_DESCRIPTIONS[type] })] }), _jsxs("label", { className: "stwd-toggle", children: [_jsx("input", { type: "checkbox", checked: isEnabled, disabled: readOnly || isEnforced, onChange: (e) => updatePolicy(type, { enabled: e.target.checked }) }), _jsx("span", { className: "stwd-toggle-slider" })] })] }), isEnabled && (_jsx("div", { className: "stwd-policy-config", children: _jsx(PolicyConfigEditor, { type: type, config: policy?.config || {}, readOnly: readOnly || isEnforced, onConfigChange: (key, val) => updateConfig(type, key, val) }) })), isEnforced && (_jsx("div", { className: "stwd-enforced-label", children: "Set by platform \u2014 cannot be changed" }))] }, type));
102
+ }) }), editPolicies && !readOnly && (_jsxs("div", { className: "stwd-policy-actions", children: [saveError && _jsx("div", { className: "stwd-error-text", children: saveError }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setEditPolicies(null), disabled: isSaving, children: "Cancel" }), _jsx("button", { className: "stwd-btn stwd-btn-primary", onClick: handleSave, disabled: isSaving, children: isSaving ? "Saving..." : "Save Policies" })] })), showTemplateModal && (_jsx("div", { className: "stwd-modal-overlay", onClick: () => setShowTemplateModal(false), children: _jsxs("div", { className: "stwd-modal", onClick: (e) => e.stopPropagation(), children: [_jsx("h3", { className: "stwd-heading", children: "Choose a Template" }), _jsx("div", { className: "stwd-template-list", children: templates.map((tpl) => (_jsxs("div", { className: "stwd-template-card", children: [_jsx("div", { className: "stwd-template-name", children: tpl.name }), _jsx("div", { className: "stwd-template-desc", children: tpl.description }), _jsx("button", { className: "stwd-btn stwd-btn-primary", onClick: () => handleApplyTemplate(tpl.id), disabled: isSaving, children: "Apply" })] }, tpl.id))) }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: () => setShowTemplateModal(false), children: "Cancel" })] }) }))] }));
103
+ }
104
+ function PolicyConfigEditor({ type, config, readOnly, onConfigChange }) {
105
+ switch (type) {
106
+ case "spending-limit":
107
+ return _jsx(SpendingLimitEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
108
+ case "approved-addresses":
109
+ return _jsx(ApprovedAddressesEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
110
+ case "auto-approve-threshold":
111
+ return _jsx(AutoApproveEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
112
+ case "time-window":
113
+ return _jsx(TimeWindowEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
114
+ case "rate-limit":
115
+ return _jsx(RateLimitEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
116
+ case "allowed-chains":
117
+ return _jsx(AllowedChainsEditor, { config: config, readOnly: readOnly, onChange: onConfigChange });
118
+ default:
119
+ return null;
120
+ }
121
+ }
122
+ // ─── Spending Limit ───
123
+ function SpendingLimitEditor({ config, readOnly, onChange, }) {
124
+ const toEth = (wei) => {
125
+ if (!wei || typeof wei !== "string")
126
+ return "";
127
+ try {
128
+ return (Number(BigInt(wei)) / 1e18).toString();
129
+ }
130
+ catch {
131
+ return String(wei);
132
+ }
133
+ };
134
+ const toWei = (eth) => {
135
+ try {
136
+ return BigInt(Math.floor(parseFloat(eth) * 1e18)).toString();
137
+ }
138
+ catch {
139
+ return "0";
140
+ }
141
+ };
142
+ return (_jsxs("div", { className: "stwd-config-grid", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per transaction (ETH)" }), _jsx("input", { type: "number", step: "0.001", className: "stwd-input", value: toEth(config.maxPerTx), disabled: readOnly, onChange: (e) => onChange("maxPerTx", toWei(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per day (ETH)" }), _jsx("input", { type: "number", step: "0.01", className: "stwd-input", value: toEth(config.maxPerDay), disabled: readOnly, onChange: (e) => onChange("maxPerDay", toWei(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max per week (ETH)" }), _jsx("input", { type: "number", step: "0.01", className: "stwd-input", value: toEth(config.maxPerWeek), disabled: readOnly, onChange: (e) => onChange("maxPerWeek", toWei(e.target.value)) })] })] }));
143
+ }
144
+ // ─── Approved Addresses ───
145
+ function ApprovedAddressesEditor({ config, readOnly, onChange, }) {
146
+ const addresses = config.addresses || [];
147
+ const mode = config.mode || "whitelist";
148
+ const [newAddr, setNewAddr] = useState("");
149
+ const addAddress = () => {
150
+ if (newAddr && /^0x[0-9a-fA-F]{40}$/.test(newAddr)) {
151
+ onChange("addresses", [...addresses, newAddr]);
152
+ setNewAddr("");
153
+ }
154
+ };
155
+ const removeAddress = (idx) => {
156
+ onChange("addresses", addresses.filter((_, i) => i !== idx));
157
+ };
158
+ return (_jsxs("div", { className: "stwd-config-stack", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Mode" }), _jsxs("select", { className: "stwd-select", value: mode, disabled: readOnly, onChange: (e) => onChange("mode", e.target.value), children: [_jsx("option", { value: "whitelist", children: "Whitelist (only these addresses)" }), _jsx("option", { value: "blacklist", children: "Blacklist (block these addresses)" })] })] }), _jsx("div", { className: "stwd-address-list", children: addresses.map((addr, i) => (_jsxs("div", { className: "stwd-address-item", children: [_jsx("code", { children: addr }), !readOnly && (_jsx("button", { className: "stwd-btn stwd-btn-ghost stwd-btn-sm", onClick: () => removeAddress(i), children: "\u2715" }))] }, i))) }), !readOnly && (_jsxs("div", { className: "stwd-address-add", children: [_jsx("input", { type: "text", className: "stwd-input", placeholder: "0x...", value: newAddr, onChange: (e) => setNewAddr(e.target.value), onKeyDown: (e) => e.key === "Enter" && addAddress() }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: addAddress, children: "Add" })] }))] }));
159
+ }
160
+ // ─── Auto-Approve Threshold ───
161
+ function AutoApproveEditor({ config, readOnly, onChange, }) {
162
+ const toEth = (wei) => {
163
+ if (!wei || typeof wei !== "string")
164
+ return "";
165
+ try {
166
+ return (Number(BigInt(wei)) / 1e18).toString();
167
+ }
168
+ catch {
169
+ return String(wei);
170
+ }
171
+ };
172
+ const toWei = (eth) => {
173
+ try {
174
+ return BigInt(Math.floor(parseFloat(eth) * 1e18)).toString();
175
+ }
176
+ catch {
177
+ return "0";
178
+ }
179
+ };
180
+ return (_jsxs("div", { className: "stwd-config-stack", children: [_jsx("p", { className: "stwd-muted-text", children: "Transactions below this amount will be automatically approved without human review." }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Threshold (ETH)" }), _jsx("input", { type: "number", step: "0.001", className: "stwd-input", value: toEth(config.threshold), disabled: readOnly, onChange: (e) => onChange("threshold", toWei(e.target.value)) })] })] }));
181
+ }
182
+ // ─── Time Window ───
183
+ function TimeWindowEditor({ config, readOnly, onChange, }) {
184
+ const allowedHours = config.allowedHours || [
185
+ { start: 9, end: 17 },
186
+ ];
187
+ const allowedDays = config.allowedDays || [1, 2, 3, 4, 5];
188
+ const dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
189
+ const toggleDay = (day) => {
190
+ const newDays = allowedDays.includes(day)
191
+ ? allowedDays.filter((d) => d !== day)
192
+ : [...allowedDays, day].sort();
193
+ onChange("allowedDays", newDays);
194
+ };
195
+ const updateHours = (index, field, value) => {
196
+ const newHours = allowedHours.map((h, i) => i === index ? { ...h, [field]: value } : h);
197
+ onChange("allowedHours", newHours);
198
+ };
199
+ return (_jsxs("div", { className: "stwd-config-stack", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Active Hours" }), allowedHours.map((hours, i) => (_jsxs("div", { className: "stwd-time-range", children: [_jsx("input", { type: "number", min: 0, max: 23, className: "stwd-input stwd-input-sm", value: hours.start, disabled: readOnly, onChange: (e) => updateHours(i, "start", parseInt(e.target.value)) }), _jsx("span", { children: "to" }), _jsx("input", { type: "number", min: 0, max: 23, className: "stwd-input stwd-input-sm", value: hours.end, disabled: readOnly, onChange: (e) => updateHours(i, "end", parseInt(e.target.value)) })] }, i)))] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Active Days" }), _jsx("div", { className: "stwd-day-picker", children: dayNames.map((name, i) => (_jsx("button", { className: `stwd-day-btn ${allowedDays.includes(i) ? "stwd-day-active" : ""}`, disabled: readOnly, onClick: () => toggleDay(i), children: name }, i))) })] })] }));
200
+ }
201
+ // ─── Rate Limit ───
202
+ function RateLimitEditor({ config, readOnly, onChange, }) {
203
+ return (_jsxs("div", { className: "stwd-config-grid", children: [_jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max transactions per hour" }), _jsx("input", { type: "number", min: 1, className: "stwd-input", value: config.maxTxPerHour || 10, disabled: readOnly, onChange: (e) => onChange("maxTxPerHour", parseInt(e.target.value)) })] }), _jsxs("div", { className: "stwd-config-field", children: [_jsx("label", { children: "Max transactions per day" }), _jsx("input", { type: "number", min: 1, className: "stwd-input", value: config.maxTxPerDay || 100, disabled: readOnly, onChange: (e) => onChange("maxTxPerDay", parseInt(e.target.value)) })] })] }));
204
+ }
205
+ // ─── Allowed Chains ───
206
+ function AllowedChainsEditor({ config, readOnly, onChange, }) {
207
+ const chains = config.chains || [];
208
+ const availableChains = [
209
+ { caip2: "eip155:1", name: "Ethereum", symbol: "ETH" },
210
+ { caip2: "eip155:8453", name: "Base", symbol: "ETH" },
211
+ { caip2: "eip155:137", name: "Polygon", symbol: "POL" },
212
+ { caip2: "eip155:42161", name: "Arbitrum", symbol: "ETH" },
213
+ { caip2: "eip155:56", name: "BSC", symbol: "BNB" },
214
+ { caip2: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", name: "Solana", symbol: "SOL" },
215
+ ];
216
+ const toggleChain = (caip2) => {
217
+ const newChains = chains.includes(caip2)
218
+ ? chains.filter((c) => c !== caip2)
219
+ : [...chains, caip2];
220
+ onChange("chains", newChains);
221
+ };
222
+ return (_jsx("div", { className: "stwd-config-stack", children: _jsx("div", { className: "stwd-chain-checklist", children: availableChains.map((chain) => (_jsxs("label", { className: "stwd-chain-option", children: [_jsx("input", { type: "checkbox", checked: chains.includes(chain.caip2), disabled: readOnly, onChange: () => toggleChain(chain.caip2) }), _jsx("span", { className: "stwd-chain-name", children: chain.name }), _jsx("span", { className: "stwd-chain-symbol", children: chain.symbol })] }, chain.caip2))) }) }));
223
+ }
224
+ //# sourceMappingURL=PolicyControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolicyControls.js","sourceRoot":"","sources":["../../src/components/PolicyControls.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SpendDashboardProps } from "../types.js";
2
+ /**
3
+ * Spend tracking visualization with budget usage bars and breakdown.
4
+ */
5
+ export declare function SpendDashboard({ range, showBudgetUsage, showChart, showTopDestinations, className, }: SpendDashboardProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=SpendDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpendDashboard.d.ts","sourceRoot":"","sources":["../../src/components/SpendDashboard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAY,EACZ,eAAsB,EACtB,SAAgB,EAChB,mBAA0B,EAC1B,SAAS,GACV,EAAE,mBAAmB,kDAiKrB"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useSpend } from "../hooks/useSpend.js";
3
+ import { useStewardContext } from "../provider.js";
4
+ import { truncateAddress } from "../utils/format.js";
5
+ /**
6
+ * Spend tracking visualization with budget usage bars and breakdown.
7
+ */
8
+ export function SpendDashboard({ range = "7d", showBudgetUsage = true, showChart = true, showTopDestinations = true, className, }) {
9
+ const { features } = useStewardContext();
10
+ const { stats, isLoading, error } = useSpend(range);
11
+ if (!features.showSpendDashboard)
12
+ return null;
13
+ if (isLoading) {
14
+ return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading spend data..." }) }));
15
+ }
16
+ if (error) {
17
+ return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load spend data: ", error.message] }) }));
18
+ }
19
+ if (!stats) {
20
+ return (_jsx("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: _jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\uD83D\uDCCA" }), _jsx("div", { className: "stwd-empty-text", children: "No spend data available" })] }) }));
21
+ }
22
+ const getRangeLabel = (r) => {
23
+ switch (r) {
24
+ case "24h": return "Last 24 Hours";
25
+ case "7d": return "Last 7 Days";
26
+ case "30d": return "Last 30 Days";
27
+ case "all": return "All Time";
28
+ default: return r;
29
+ }
30
+ };
31
+ const getBarColor = (pct) => {
32
+ if (pct >= 90)
33
+ return "var(--stwd-error)";
34
+ if (pct >= 70)
35
+ return "var(--stwd-warning)";
36
+ return "var(--stwd-success)";
37
+ };
38
+ return (_jsxs("div", { className: `stwd-card stwd-spend-dashboard ${className || ""}`, children: [_jsxs("div", { className: "stwd-spend-header", children: [_jsx("h3", { className: "stwd-heading", children: "Spend Dashboard" }), _jsx("span", { className: "stwd-badge stwd-badge-muted", children: getRangeLabel(stats.range) })] }), _jsxs("div", { className: "stwd-spend-stats-grid", children: [_jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Total Spent" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.totalSpentFormatted, " ETH"] })] }), _jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Transactions" }), _jsx("div", { className: "stwd-stat-value", children: stats.txCount })] }), _jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Avg Tx Value" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.avgTxValueFormatted, " ETH"] })] }), stats.largestTx && (_jsxs("div", { className: "stwd-stat-card", children: [_jsx("div", { className: "stwd-stat-label", children: "Largest Tx" }), _jsxs("div", { className: "stwd-stat-value", children: [stats.largestTx.value, " ETH"] })] }))] }), showBudgetUsage && stats.budgetUsage && (_jsxs("div", { className: "stwd-budget-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Budget Usage" }), _jsxs("div", { className: "stwd-budget-bar-group", children: [_jsxs("div", { className: "stwd-budget-bar-label", children: [_jsx("span", { children: "Daily" }), _jsxs("span", { children: [stats.budgetUsage.dailyPercent, "%"] })] }), _jsx("div", { className: "stwd-budget-bar-track", children: _jsx("div", { className: "stwd-budget-bar-fill", style: {
39
+ width: `${Math.min(100, stats.budgetUsage.dailyPercent)}%`,
40
+ backgroundColor: getBarColor(stats.budgetUsage.dailyPercent),
41
+ } }) }), _jsxs("div", { className: "stwd-budget-bar-detail", children: [stats.budgetUsage.dailyUsed, " / ", stats.budgetUsage.dailyLimit, " wei"] })] }), _jsxs("div", { className: "stwd-budget-bar-group", children: [_jsxs("div", { className: "stwd-budget-bar-label", children: [_jsx("span", { children: "Weekly" }), _jsxs("span", { children: [stats.budgetUsage.weeklyPercent, "%"] })] }), _jsx("div", { className: "stwd-budget-bar-track", children: _jsx("div", { className: "stwd-budget-bar-fill", style: {
42
+ width: `${Math.min(100, stats.budgetUsage.weeklyPercent)}%`,
43
+ backgroundColor: getBarColor(stats.budgetUsage.weeklyPercent),
44
+ } }) }), _jsxs("div", { className: "stwd-budget-bar-detail", children: [stats.budgetUsage.weeklyUsed, " / ", stats.budgetUsage.weeklyLimit, " wei"] })] })] })), showChart && stats.daily.length > 0 && (_jsxs("div", { className: "stwd-chart-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Daily Spend" }), _jsx("div", { className: "stwd-bar-chart", children: stats.daily.map((day) => {
45
+ const maxSpent = Math.max(...stats.daily.map((d) => parseFloat(d.spentFormatted) || 0));
46
+ const height = maxSpent > 0
47
+ ? (parseFloat(day.spentFormatted) / maxSpent) * 100
48
+ : 0;
49
+ return (_jsxs("div", { className: "stwd-bar-col", title: `${day.date}: ${day.spentFormatted} ETH (${day.txCount} txs)`, children: [_jsx("div", { className: "stwd-bar", style: { height: `${Math.max(2, height)}%` } }), _jsx("div", { className: "stwd-bar-label", children: day.date.slice(-5) })] }, day.date));
50
+ }) })] })), showTopDestinations && stats.topDestinations.length > 0 && (_jsxs("div", { className: "stwd-destinations-section", children: [_jsx("h4", { className: "stwd-subheading", children: "Top Destinations" }), _jsx("div", { className: "stwd-destination-list", children: stats.topDestinations.map((dest, i) => (_jsxs("div", { className: "stwd-destination-row", children: [_jsx("code", { className: "stwd-address", children: truncateAddress(dest.address) }), _jsxs("span", { className: "stwd-destination-amount", children: [dest.totalSent, " wei"] }), _jsxs("span", { className: "stwd-badge stwd-badge-muted", children: [dest.txCount, " txs"] })] }, i))) })] }))] }));
51
+ }
52
+ //# sourceMappingURL=SpendDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpendDashboard.js","sourceRoot":"","sources":["../../src/components/SpendDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TransactionHistoryProps } from "../types.js";
2
+ /**
3
+ * Paginated transaction list with status badges and explorer links.
4
+ */
5
+ export declare function TransactionHistory({ pageSize, statusFilter, chainFilter, showPolicyDetails, renderTransaction, onTransactionClick, className, }: TransactionHistoryProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=TransactionHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionHistory.d.ts","sourceRoot":"","sources":["../../src/components/TransactionHistory.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAY3D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,GACV,EAAE,uBAAuB,kDA6IzB"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useTransactions } from "../hooks/useTransactions.js";
3
+ import { useStewardContext } from "../provider.js";
4
+ import { truncateAddress, formatWei, formatRelativeTime, getExplorerTxUrl, getStatusColor, copyToClipboard, } from "../utils/format.js";
5
+ /**
6
+ * Paginated transaction list with status badges and explorer links.
7
+ */
8
+ export function TransactionHistory({ pageSize = 20, statusFilter, chainFilter, showPolicyDetails = false, renderTransaction, onTransactionClick, className, }) {
9
+ const { features } = useStewardContext();
10
+ if (!features.showTransactionHistory)
11
+ return null;
12
+ const { transactions, isLoading, error, page, totalPages, nextPage, prevPage } = useTransactions({
13
+ pageSize,
14
+ status: statusFilter,
15
+ chainId: chainFilter?.[0],
16
+ });
17
+ if (isLoading) {
18
+ return (_jsx("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: _jsx("div", { className: "stwd-loading", children: "Loading transactions..." }) }));
19
+ }
20
+ if (error) {
21
+ return (_jsx("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: _jsxs("div", { className: "stwd-error-text", children: ["Failed to load transactions: ", error.message] }) }));
22
+ }
23
+ return (_jsxs("div", { className: `stwd-card stwd-tx-history ${className || ""}`, children: [_jsx("h3", { className: "stwd-heading", children: "Transaction History" }), transactions.length === 0 ? (_jsxs("div", { className: "stwd-empty-state", children: [_jsx("div", { className: "stwd-empty-icon", children: "\uD83D\uDCED" }), _jsx("div", { className: "stwd-empty-text", children: "No transactions yet" })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "stwd-tx-list", children: transactions.map((tx) => {
24
+ if (renderTransaction) {
25
+ return _jsx("div", { children: renderTransaction(tx) }, tx.id);
26
+ }
27
+ const chainId = tx.request?.chainId || 8453;
28
+ return (_jsxs("div", { className: `stwd-tx-row ${onTransactionClick ? "stwd-tx-clickable" : ""}`, onClick: () => onTransactionClick?.(tx), children: [_jsxs("div", { className: "stwd-tx-main", children: [_jsx("div", { className: "stwd-tx-to", children: tx.request?.to ? (_jsx("code", { children: truncateAddress(tx.request.to) })) : (_jsx("span", { className: "stwd-muted-text", children: "\u2014" })) }), _jsxs("div", { className: "stwd-tx-value", children: [tx.request?.value ? formatWei(tx.request.value) : "0", " ETH"] })] }), _jsxs("div", { className: "stwd-tx-meta", children: [_jsx("span", { className: `stwd-badge ${getStatusColor(tx.status)}`, children: tx.status }), _jsx("span", { className: "stwd-tx-time", children: formatRelativeTime(tx.createdAt) }), tx.txHash && (_jsx("a", { className: "stwd-link", href: getExplorerTxUrl(tx.txHash, chainId), target: "_blank", rel: "noopener noreferrer", onClick: (e) => e.stopPropagation(), title: "View on explorer", children: "\u2197" })), tx.txHash && (_jsx("button", { className: "stwd-btn stwd-btn-ghost stwd-btn-sm", onClick: (e) => {
29
+ e.stopPropagation();
30
+ copyToClipboard(tx.txHash);
31
+ }, title: "Copy tx hash", children: "\uD83D\uDCCB" }))] }), showPolicyDetails && tx.policyResults.length > 0 && (_jsx("div", { className: "stwd-tx-policies", children: tx.policyResults.map((pr, i) => (_jsxs("span", { className: `stwd-badge ${pr.passed ? "stwd-badge-success" : "stwd-badge-error"}`, children: [pr.type, ": ", pr.passed ? "✓" : "✗", pr.reason && ` (${pr.reason})`] }, i))) }))] }, tx.id));
32
+ }) }), totalPages > 1 && (_jsxs("div", { className: "stwd-pagination", children: [_jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: prevPage, disabled: page <= 1, children: "\u2190 Prev" }), _jsxs("span", { className: "stwd-page-info", children: ["Page ", page, " of ", totalPages] }), _jsx("button", { className: "stwd-btn stwd-btn-secondary", onClick: nextPage, disabled: page >= totalPages, children: "Next \u2192" })] }))] }))] }));
33
+ }
34
+ //# sourceMappingURL=TransactionHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionHistory.js","sourceRoot":"","sources":["../../src/components/TransactionHistory.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { WalletOverviewProps } from "../types.js";
2
+ /**
3
+ * Displays agent wallet address, balances, chain info, and optional funding QR.
4
+ */
5
+ export declare function WalletOverview({ chains, showQR, showCopy, className, onCopyAddress, }: WalletOverviewProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=WalletOverview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WalletOverview.d.ts","sourceRoot":"","sources":["../../src/components/WalletOverview.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,QAAe,EACf,SAAS,EACT,aAAa,GACd,EAAE,mBAAmB,kDA2GrB"}