@dxos/plugin-client 0.9.1-main.c7dcc2e112 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/{AccountContainer-LIMGLO2Y.mjs → AccountContainer-7SF53UON.mjs} +15 -11
- package/dist/lib/neutral/AccountContainer-7SF53UON.mjs.map +7 -0
- package/dist/lib/neutral/ClientPlugin.node.mjs +2 -2
- package/dist/lib/neutral/ClientPlugin.node.mjs.map +3 -3
- package/dist/lib/neutral/{DevicesContainer-X26OGLFK.mjs → DevicesContainer-PRWIN36N.mjs} +25 -16
- package/dist/lib/neutral/DevicesContainer-PRWIN36N.mjs.map +7 -0
- package/dist/lib/neutral/{InvitationsContainer-OBBCJ7CJ.mjs → InvitationsContainer-BI5RAWET.mjs} +42 -31
- package/dist/lib/neutral/InvitationsContainer-BI5RAWET.mjs.map +7 -0
- package/dist/lib/neutral/{ProfileContainer-FGS2MVWA.mjs → ProfileContainer-YEAYOTX5.mjs} +21 -20
- package/dist/lib/neutral/ProfileContainer-YEAYOTX5.mjs.map +7 -0
- package/dist/lib/neutral/{RecoveryCredentialsContainer-SL4LYHBE.mjs → RecoveryCredentialsContainer-6BZ2IWX7.mjs} +22 -13
- package/dist/lib/neutral/RecoveryCredentialsContainer-6BZ2IWX7.mjs.map +7 -0
- package/dist/lib/neutral/UsageContainer-2DWCVVE4.mjs +241 -0
- package/dist/lib/neutral/UsageContainer-2DWCVVE4.mjs.map +7 -0
- package/dist/lib/neutral/account-cache-YVQKLNV2.mjs +16 -0
- package/dist/lib/neutral/account-cache-YVQKLNV2.mjs.map +7 -0
- package/dist/lib/neutral/{app-graph-builder-FTXJNX37.mjs → app-graph-builder-RVXTD6OE.mjs} +3 -3
- package/dist/lib/neutral/app-graph-builder-RVXTD6OE.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +4 -4
- package/dist/lib/neutral/capabilities/node.mjs +3 -3
- package/dist/lib/neutral/chunk-A7WDDIWY.mjs +162 -0
- package/dist/lib/neutral/chunk-A7WDDIWY.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-JEF2FQGB.mjs → chunk-JY35S2CN.mjs} +2 -2
- package/dist/lib/neutral/{chunk-JEF2FQGB.mjs.map → chunk-JY35S2CN.mjs.map} +1 -1
- package/dist/lib/neutral/chunk-ZFABGG2E.mjs +8 -0
- package/dist/lib/neutral/containers/index.mjs +6 -6
- package/dist/lib/neutral/{create-agent-U567RM7Z.mjs → create-agent-6UKJMZS5.mjs} +2 -2
- package/dist/lib/neutral/{create-identity-IKN2FJ5B.mjs → create-identity-ULCRB3YH.mjs} +2 -2
- package/dist/lib/neutral/{create-passkey-JAD3ACY7.mjs → create-passkey-I7VDS3AC.mjs} +2 -2
- package/dist/lib/neutral/{create-recovery-code-JZYXR4BY.mjs → create-recovery-code-DH2B6EGP.mjs} +2 -2
- package/dist/lib/neutral/index.mjs +4 -2
- package/dist/lib/neutral/{layer-specs-VQCJLV33.mjs → layer-specs-YI7BVWKZ.mjs} +6 -8
- package/dist/lib/neutral/layer-specs-YI7BVWKZ.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/{navigation-handler-MPJAVHWY.mjs → navigation-handler-MQ6MZXLX.mjs} +2 -2
- package/dist/lib/neutral/{open-usage-24I7RAFL.mjs → open-usage-OJVTPGOY.mjs} +2 -2
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +1 -1
- package/dist/lib/neutral/{redeem-passkey-4DR7GPMU.mjs → redeem-passkey-TYP4XLHO.mjs} +2 -2
- package/dist/lib/neutral/{redeem-token-N5MBQG3I.mjs → redeem-token-2J33R3PV.mjs} +2 -2
- package/dist/lib/neutral/{share-identity-YJIFDIPJ.mjs → share-identity-TOROBLWL.mjs} +2 -2
- package/dist/lib/neutral/testing/index.mjs.map +2 -2
- package/dist/lib/neutral/types/index.mjs +3 -1
- package/dist/types/src/capabilities/account-cache.d.ts +1 -31
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/client.d.ts +1 -2
- package/dist/types/src/capabilities/client.d.ts.map +1 -1
- package/dist/types/src/capabilities/hub-http-client.d.ts +1 -2
- package/dist/types/src/capabilities/hub-http-client.d.ts.map +1 -1
- package/dist/types/src/capabilities/layer-specs.d.ts +1 -2
- package/dist/types/src/capabilities/layer-specs.d.ts.map +1 -1
- package/dist/types/src/capabilities/migrations.d.ts +1 -1
- package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts +1 -2
- package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-context.d.ts +1 -6
- package/dist/types/src/capabilities/react-context.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/schema-defs.d.ts +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.d.ts.map +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts +14 -0
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts +14 -0
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageContainer.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts +16 -7
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +2 -0
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/{state/use-hub-http.d.ts → hooks/useHubClient.d.ts} +1 -1
- package/dist/types/src/hooks/useHubClient.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +4 -0
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
- package/dist/types/src/{state → types}/account-cache.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +46 -45
- package/src/capabilities/account-cache.ts +1 -3
- package/src/capabilities/app-graph-builder.ts +80 -79
- package/src/capabilities/layer-specs.ts +4 -6
- package/src/commands/account/login/login.ts +2 -2
- package/src/containers/AccountContainer/AccountContainer.stories.tsx +46 -0
- package/src/containers/AccountContainer/AccountContainer.tsx +66 -62
- package/src/containers/DevicesContainer/DevicesContainer.tsx +69 -54
- package/src/containers/InvitationsContainer/InvitationsContainer.stories.tsx +46 -0
- package/src/containers/InvitationsContainer/InvitationsContainer.tsx +64 -61
- package/src/containers/ProfileContainer/ProfileContainer.tsx +37 -27
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +50 -41
- package/src/containers/UsageContainer/UsageContainer.tsx +11 -10
- package/src/containers/UsageContainer/UsageView.stories.tsx +13 -0
- package/src/containers/UsageContainer/UsageView.tsx +182 -150
- package/src/hooks/index.ts +5 -0
- package/src/testing/initializeIdentity.ts +1 -0
- package/src/types/capabilities.ts +1 -1
- package/src/types/index.ts +1 -0
- package/dist/lib/neutral/AccountContainer-LIMGLO2Y.mjs.map +0 -7
- package/dist/lib/neutral/DevicesContainer-X26OGLFK.mjs.map +0 -7
- package/dist/lib/neutral/InvitationsContainer-OBBCJ7CJ.mjs.map +0 -7
- package/dist/lib/neutral/ProfileContainer-FGS2MVWA.mjs.map +0 -7
- package/dist/lib/neutral/RecoveryCredentialsContainer-SL4LYHBE.mjs.map +0 -7
- package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs +0 -226
- package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs.map +0 -7
- package/dist/lib/neutral/account-cache-4EKGEUJI.mjs +0 -43
- package/dist/lib/neutral/account-cache-4EKGEUJI.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-FTXJNX37.mjs.map +0 -7
- package/dist/lib/neutral/chunk-54MDDWCV.mjs +0 -8
- package/dist/lib/neutral/chunk-DA3LZQSD.mjs +0 -136
- package/dist/lib/neutral/chunk-DA3LZQSD.mjs.map +0 -7
- package/dist/lib/neutral/layer-specs-VQCJLV33.mjs.map +0 -7
- package/dist/types/src/state/use-hub-http.d.ts.map +0 -1
- /package/dist/lib/neutral/{chunk-54MDDWCV.mjs.map → chunk-ZFABGG2E.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-agent-U567RM7Z.mjs.map → create-agent-6UKJMZS5.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-identity-IKN2FJ5B.mjs.map → create-identity-ULCRB3YH.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-passkey-JAD3ACY7.mjs.map → create-passkey-I7VDS3AC.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-recovery-code-JZYXR4BY.mjs.map → create-recovery-code-DH2B6EGP.mjs.map} +0 -0
- /package/dist/lib/neutral/{navigation-handler-MPJAVHWY.mjs.map → navigation-handler-MQ6MZXLX.mjs.map} +0 -0
- /package/dist/lib/neutral/{open-usage-24I7RAFL.mjs.map → open-usage-OJVTPGOY.mjs.map} +0 -0
- /package/dist/lib/neutral/{redeem-passkey-4DR7GPMU.mjs.map → redeem-passkey-TYP4XLHO.mjs.map} +0 -0
- /package/dist/lib/neutral/{redeem-token-N5MBQG3I.mjs.map → redeem-token-2J33R3PV.mjs.map} +0 -0
- /package/dist/lib/neutral/{share-identity-YJIFDIPJ.mjs.map → share-identity-TOROBLWL.mjs.map} +0 -0
- /package/dist/types/src/{state → types}/account-cache.d.ts +0 -0
- /package/src/{state/use-hub-http.ts → hooks/useHubClient.ts} +0 -0
- /package/src/{state → types}/account-cache.ts +0 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useHubHttpClient
|
|
3
|
+
} from "./chunk-JY35S2CN.mjs";
|
|
4
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
5
|
+
|
|
6
|
+
// src/containers/UsageContainer/UsageContainer.tsx
|
|
7
|
+
import React2, { useCallback as useCallback2, useState as useState2 } from "react";
|
|
8
|
+
import { Context } from "@dxos/context";
|
|
9
|
+
import { log } from "@dxos/log";
|
|
10
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
11
|
+
|
|
12
|
+
// src/containers/UsageContainer/UsageView.tsx
|
|
13
|
+
import * as Schema from "effect/Schema";
|
|
14
|
+
import React, { useCallback, useMemo, useState } from "react";
|
|
15
|
+
import { IconButton, Message, Status, ToggleIconButton, useTranslation } from "@dxos/react-ui";
|
|
16
|
+
import { Form } from "@dxos/react-ui-form";
|
|
17
|
+
import { JsonHighlighter } from "@dxos/react-ui-syntax-highlighter";
|
|
18
|
+
import { meta } from "#meta";
|
|
19
|
+
var usageMatchesLimit = (item, limit) => {
|
|
20
|
+
if (item.eventType !== limit.eventType || item.valueKey !== limit.valueKey) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return limit.subtypePattern.every((pattern, index) => pattern === "*" || pattern === item.subtypePattern[index]);
|
|
24
|
+
};
|
|
25
|
+
var sumUsageForLimit = (usage, limit) => usage.reduce((total, item) => usageMatchesLimit(item, limit) ? total + item.amount : total, 0);
|
|
26
|
+
var formatValueKey = (valueKey) => valueKey.replace(/([A-Z])/g, " $1").trim().toLowerCase();
|
|
27
|
+
var formatLimitLabel = (limit, t) => {
|
|
28
|
+
const metric = formatValueKey(limit.valueKey);
|
|
29
|
+
const subtype = limit.subtypePattern.filter((segment) => segment && segment !== "*").join("/");
|
|
30
|
+
if (limit.eventType === "ai") {
|
|
31
|
+
return `${subtype || t("usage-all-models.label")} \xB7 ${metric}`;
|
|
32
|
+
}
|
|
33
|
+
return `${subtype ? `${limit.eventType}/${subtype}` : limit.eventType} \xB7 ${metric}`;
|
|
34
|
+
};
|
|
35
|
+
var formatAmount = (amount) => amount.toLocaleString();
|
|
36
|
+
var SECONDS_PER_HOUR = 60 * 60;
|
|
37
|
+
var formatWindow = (windowHours, t) => {
|
|
38
|
+
if (windowHours % (24 * 30) === 0) {
|
|
39
|
+
return t("usage-window-months.label", {
|
|
40
|
+
count: windowHours / (24 * 30)
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (windowHours % 24 === 0) {
|
|
44
|
+
return t("usage-window-days.label", {
|
|
45
|
+
count: windowHours / 24
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return t("usage-window-hours.label", {
|
|
49
|
+
count: windowHours
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
var computeRows = (data, t) => data.limits.map((limit) => {
|
|
53
|
+
const used = sumUsageForLimit(data.usage, limit);
|
|
54
|
+
const label = formatLimitLabel(limit, t);
|
|
55
|
+
const windowHours = limit.windowDuration / SECONDS_PER_HOUR;
|
|
56
|
+
const window = formatWindow(windowHours, t);
|
|
57
|
+
const key = `${limit.eventType}/${limit.subtypePattern.join(",")}/${limit.valueKey}/${limit.windowDuration}/${limit.limit ?? "unlimited"}`;
|
|
58
|
+
if (limit.limit === null) {
|
|
59
|
+
return {
|
|
60
|
+
key,
|
|
61
|
+
label,
|
|
62
|
+
caption: t("usage-unlimited.description", {
|
|
63
|
+
used: formatAmount(used),
|
|
64
|
+
window
|
|
65
|
+
}),
|
|
66
|
+
windowHours
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const percent = limit.limit > 0 ? Math.min(100, Math.round(used / limit.limit * 100)) : used > 0 ? 100 : 0;
|
|
70
|
+
return {
|
|
71
|
+
key,
|
|
72
|
+
label,
|
|
73
|
+
caption: `${t("usage-percent-used.label", {
|
|
74
|
+
percent
|
|
75
|
+
})} \xB7 ${t("usage-limit.description", {
|
|
76
|
+
used: formatAmount(used),
|
|
77
|
+
limit: formatAmount(limit.limit),
|
|
78
|
+
window
|
|
79
|
+
})}`,
|
|
80
|
+
percent,
|
|
81
|
+
windowHours
|
|
82
|
+
};
|
|
83
|
+
}).sort((left, right) => left.windowHours - right.windowHours);
|
|
84
|
+
var usageField = (title, description) => Schema.optional(Schema.Number.annotations({
|
|
85
|
+
title,
|
|
86
|
+
description
|
|
87
|
+
}));
|
|
88
|
+
var buildUsageForm = (rows) => {
|
|
89
|
+
const fields = {};
|
|
90
|
+
const values = {};
|
|
91
|
+
rows.forEach((row, index) => {
|
|
92
|
+
const field = `metric_${index}`;
|
|
93
|
+
fields[field] = usageField(row.label, row.caption);
|
|
94
|
+
if (row.percent !== void 0) {
|
|
95
|
+
values[field] = row.percent;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
schema: Schema.Struct(fields),
|
|
100
|
+
values
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
var STATE_MESSAGES = {
|
|
104
|
+
unavailable: {
|
|
105
|
+
valence: "warning",
|
|
106
|
+
icon: "ph--cloud-slash--duotone",
|
|
107
|
+
title: "usage-unavailable.title",
|
|
108
|
+
description: "usage-unavailable.description"
|
|
109
|
+
},
|
|
110
|
+
error: {
|
|
111
|
+
valence: "error",
|
|
112
|
+
icon: "ph--cloud-x--duotone",
|
|
113
|
+
title: "usage-offline.title",
|
|
114
|
+
description: "usage-offline.description"
|
|
115
|
+
},
|
|
116
|
+
empty: {
|
|
117
|
+
valence: "neutral",
|
|
118
|
+
icon: "ph--chart-bar--duotone",
|
|
119
|
+
title: "usage-empty.title",
|
|
120
|
+
description: "usage-empty.description"
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
var UsageView = ({ state, data, lastUpdated, onRefresh }) => {
|
|
124
|
+
const { t } = useTranslation(meta.profile.key);
|
|
125
|
+
const [rawExpanded, setRawExpanded] = useState(false);
|
|
126
|
+
const { schema, values, empty } = useMemo(() => {
|
|
127
|
+
const rows = data ? computeRows(data, t) : [];
|
|
128
|
+
return {
|
|
129
|
+
...buildUsageForm(rows),
|
|
130
|
+
empty: rows.length === 0
|
|
131
|
+
};
|
|
132
|
+
}, [
|
|
133
|
+
data,
|
|
134
|
+
t
|
|
135
|
+
]);
|
|
136
|
+
const message = state === "unavailable" ? STATE_MESSAGES.unavailable : state === "error" ? STATE_MESSAGES.error : state === "ready" && empty ? STATE_MESSAGES.empty : void 0;
|
|
137
|
+
const meterFieldProvider = useCallback(({ fieldProps: { label, description, getValue } }) => {
|
|
138
|
+
const percent = getValue();
|
|
139
|
+
return /* @__PURE__ */ React.createElement(Form.Row, {
|
|
140
|
+
label,
|
|
141
|
+
description
|
|
142
|
+
}, typeof percent === "number" ? /* @__PURE__ */ React.createElement(Status, {
|
|
143
|
+
progress: percent / 100,
|
|
144
|
+
"aria-label": t("usage-percent-used.label", {
|
|
145
|
+
percent
|
|
146
|
+
})
|
|
147
|
+
}) : t("usage-unlimited.label"));
|
|
148
|
+
}, [
|
|
149
|
+
t
|
|
150
|
+
]);
|
|
151
|
+
return /* @__PURE__ */ React.createElement(Form.Root, {
|
|
152
|
+
variant: "settings",
|
|
153
|
+
layout: "static",
|
|
154
|
+
schema,
|
|
155
|
+
values
|
|
156
|
+
}, /* @__PURE__ */ React.createElement(Form.Viewport, {
|
|
157
|
+
scroll: true
|
|
158
|
+
}, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.Section, {
|
|
159
|
+
title: t("usage-section.title"),
|
|
160
|
+
description: t("usage-section.description")
|
|
161
|
+
}, state === "loading" ? /* @__PURE__ */ React.createElement(Status, {
|
|
162
|
+
indeterminate: true,
|
|
163
|
+
"aria-label": t("usage-section.title")
|
|
164
|
+
}) : message ? /* @__PURE__ */ React.createElement(Message.Root, {
|
|
165
|
+
valence: message.valence
|
|
166
|
+
}, /* @__PURE__ */ React.createElement(Message.Title, {
|
|
167
|
+
icon: message.icon
|
|
168
|
+
}, t(message.title)), /* @__PURE__ */ React.createElement(Message.Content, null, t(message.description))) : /* @__PURE__ */ React.createElement(Form.FieldSet, {
|
|
169
|
+
fieldProvider: meterFieldProvider
|
|
170
|
+
})), state === "ready" && data && /* @__PURE__ */ React.createElement(Form.Section, null, /* @__PURE__ */ React.createElement(Form.Row, {
|
|
171
|
+
label: lastUpdated !== void 0 ? t("usage-last-updated.label", {
|
|
172
|
+
time: new Date(lastUpdated).toLocaleTimeString()
|
|
173
|
+
}) : t("usage-refresh.label")
|
|
174
|
+
}, onRefresh && /* @__PURE__ */ React.createElement(IconButton, {
|
|
175
|
+
iconOnly: true,
|
|
176
|
+
variant: "ghost",
|
|
177
|
+
icon: "ph--arrow-clockwise--regular",
|
|
178
|
+
label: t("usage-refresh.label"),
|
|
179
|
+
onClick: onRefresh
|
|
180
|
+
}))), state === "ready" && data && /* @__PURE__ */ React.createElement(Form.Section, null, /* @__PURE__ */ React.createElement(Form.Row, {
|
|
181
|
+
label: t("usage-raw-json.label")
|
|
182
|
+
}, /* @__PURE__ */ React.createElement(ToggleIconButton, {
|
|
183
|
+
iconOnly: true,
|
|
184
|
+
variant: "ghost",
|
|
185
|
+
active: rawExpanded,
|
|
186
|
+
icon: "ph--caret-right--regular",
|
|
187
|
+
label: t("usage-raw-json.label"),
|
|
188
|
+
onClick: () => setRawExpanded((value) => !value)
|
|
189
|
+
})), rawExpanded && /* @__PURE__ */ React.createElement(JsonHighlighter, {
|
|
190
|
+
data,
|
|
191
|
+
testId: "usage-raw-json"
|
|
192
|
+
})))));
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// src/containers/UsageContainer/UsageContainer.tsx
|
|
196
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/UsageContainer/UsageContainer.tsx";
|
|
197
|
+
var UsageContainer = () => {
|
|
198
|
+
const hubHttp = useHubHttpClient();
|
|
199
|
+
const [fetchState, setFetchState] = useState2({
|
|
200
|
+
state: "loading"
|
|
201
|
+
});
|
|
202
|
+
const [lastUpdated, setLastUpdated] = useState2();
|
|
203
|
+
const [refreshCount, setRefreshCount] = useState2(0);
|
|
204
|
+
useAsyncEffect(async () => {
|
|
205
|
+
if (!hubHttp) {
|
|
206
|
+
setFetchState({
|
|
207
|
+
state: "unavailable"
|
|
208
|
+
});
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
setFetchState((previous) => previous.state === "ready" ? previous : {
|
|
212
|
+
state: "loading"
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
const result = await hubHttp.getProfileUsage(new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 32 }));
|
|
216
|
+
setFetchState({
|
|
217
|
+
state: "ready",
|
|
218
|
+
data: result
|
|
219
|
+
});
|
|
220
|
+
setLastUpdated(Date.now());
|
|
221
|
+
} catch (err) {
|
|
222
|
+
log.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 39, S: void 0 });
|
|
223
|
+
setFetchState({
|
|
224
|
+
state: "error"
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}, [
|
|
228
|
+
hubHttp,
|
|
229
|
+
refreshCount
|
|
230
|
+
]);
|
|
231
|
+
const handleRefresh = useCallback2(() => setRefreshCount((count) => count + 1), []);
|
|
232
|
+
return /* @__PURE__ */ React2.createElement(UsageView, {
|
|
233
|
+
...fetchState,
|
|
234
|
+
lastUpdated,
|
|
235
|
+
onRefresh: handleRefresh
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
export {
|
|
239
|
+
UsageContainer as default
|
|
240
|
+
};
|
|
241
|
+
//# sourceMappingURL=UsageContainer-2DWCVVE4.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/UsageContainer/UsageContainer.tsx", "../../../src/containers/UsageContainer/UsageView.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { type GetProfileUsageResponse } from '@dxos/protocols';\nimport { useAsyncEffect } from '@dxos/react-ui';\n\nimport { useHubHttpClient } from '../../hooks';\nimport { UsageView, type UsageViewState } from './UsageView';\n\n/** State + payload kept together so `ready` always carries data (mirrors the discriminated `UsageViewProps`). */\ntype UsageFetchState = { state: Exclude<UsageViewState, 'ready'> } | { state: 'ready'; data: GetProfileUsageResponse };\n\n/**\n * Fetches rolling-window profile usage from the hub service and renders it.\n * Connected wrapper around the presentational {@link UsageView}.\n */\nexport const UsageContainer = () => {\n const hubHttp = useHubHttpClient();\n const [fetchState, setFetchState] = useState<UsageFetchState>({ state: 'loading' });\n const [lastUpdated, setLastUpdated] = useState<number | undefined>();\n const [refreshCount, setRefreshCount] = useState(0);\n\n useAsyncEffect(async () => {\n if (!hubHttp) {\n setFetchState({ state: 'unavailable' });\n return;\n }\n // Keep prior data visible while refetching; only show the loading state on first load.\n setFetchState((previous) => (previous.state === 'ready' ? previous : { state: 'loading' }));\n try {\n const result = await hubHttp.getProfileUsage(new Context());\n setFetchState({ state: 'ready', data: result });\n setLastUpdated(Date.now());\n } catch (err) {\n log.catch(err);\n setFetchState({ state: 'error' });\n }\n }, [hubHttp, refreshCount]);\n\n const handleRefresh = useCallback(() => setRefreshCount((count) => count + 1), []);\n\n return <UsageView {...fetchState} lastUpdated={lastUpdated} onRefresh={handleRefresh} />;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { type GetProfileUsageResponse, type MeteringLimit, type MeteringUsageItem } from '@dxos/protocols';\nimport { IconButton, Message, Status, ToggleIconButton, useTranslation } from '@dxos/react-ui';\nimport { Form, type FormFieldProvider } from '@dxos/react-ui-form';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\n\nimport { meta } from '#meta';\n\nexport type UsageViewState = 'loading' | 'ready' | 'error' | 'unavailable';\n\ntype UsageViewCommonProps = {\n /** Epoch milliseconds of the last successful fetch. */\n lastUpdated?: number;\n /** Invoked when the user requests a refresh. */\n onRefresh?: () => void;\n};\n\n/**\n * Discriminated on `state`: the payload is required (and only present) when `state` is `'ready'`, so a\n * missing payload can't be silently rendered as an empty plan.\n */\nexport type UsageViewProps =\n | (UsageViewCommonProps & { state: Exclude<UsageViewState, 'ready'>; data?: undefined })\n | (UsageViewCommonProps & { state: 'ready'; data: GetProfileUsageResponse });\n\ntype TFunction = (key: string, options?: Record<string, unknown>) => string;\n\n/**\n * Whether a usage row falls under a limit. Subtype segments are matched positionally against\n * `subtypePattern` where `*` matches any segment.\n */\nconst usageMatchesLimit = (item: MeteringUsageItem, limit: MeteringLimit): boolean => {\n if (item.eventType !== limit.eventType || item.valueKey !== limit.valueKey) {\n return false;\n }\n return limit.subtypePattern.every((pattern, index) => pattern === '*' || pattern === item.subtypePattern[index]);\n};\n\n/** Sum every usage item that falls under the limit. */\nconst sumUsageForLimit = (usage: GetProfileUsageResponse['usage'], limit: MeteringLimit): number =>\n usage.reduce((total, item) => (usageMatchesLimit(item, limit) ? total + item.amount : total), 0);\n\n/** Humanize a camelCase value key, e.g. `outputTokens` → `output tokens`. */\nconst formatValueKey = (valueKey: string): string =>\n valueKey\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase();\n\n/**\n * Human label for a limit: a scope followed by the value key, e.g.\n * `{ eventType: 'ai', valueKey: 'outputTokens', subtypePattern: ['*'] }` → `All models · output tokens`,\n * `{ eventType: 'ai', valueKey: 'inputTokens', subtypePattern: ['claude-opus-4'] }` → `claude-opus-4 · input tokens`.\n */\nconst formatLimitLabel = (limit: MeteringLimit, t: TFunction): string => {\n const metric = formatValueKey(limit.valueKey);\n const subtype = limit.subtypePattern.filter((segment) => segment && segment !== '*').join('/');\n if (limit.eventType === 'ai') {\n return `${subtype || t('usage-all-models.label')} · ${metric}`;\n }\n return `${subtype ? `${limit.eventType}/${subtype}` : limit.eventType} · ${metric}`;\n};\n\nconst formatAmount = (amount: number): string => amount.toLocaleString();\n\nconst SECONDS_PER_HOUR = 60 * 60;\n\n/** Render `windowHours` as a localized \"N months / days / hours\" string. */\nconst formatWindow = (windowHours: number, t: TFunction): string => {\n if (windowHours % (24 * 30) === 0) {\n return t('usage-window-months.label', { count: windowHours / (24 * 30) });\n }\n if (windowHours % 24 === 0) {\n return t('usage-window-days.label', { count: windowHours / 24 });\n }\n return t('usage-window-hours.label', { count: windowHours });\n};\n\ntype UsageRow = {\n key: string;\n /** Field label (schema `title` annotation). */\n label: string;\n /** Field caption (schema `description` annotation). */\n caption: string;\n /** Consumption as a whole percentage (`0`–`100`); `undefined` for an unlimited limit. */\n percent?: number;\n windowHours: number;\n};\n\n/** One display row per limit, shorter windows first. A `null` limit is reported as unlimited. */\nconst computeRows = (data: GetProfileUsageResponse, t: TFunction): UsageRow[] =>\n data.limits\n .map((limit): UsageRow => {\n const used = sumUsageForLimit(data.usage, limit);\n const label = formatLimitLabel(limit, t);\n const windowHours = limit.windowDuration / SECONDS_PER_HOUR;\n const window = formatWindow(windowHours, t);\n const key = `${limit.eventType}/${limit.subtypePattern.join(',')}/${limit.valueKey}/${limit.windowDuration}/${limit.limit ?? 'unlimited'}`;\n if (limit.limit === null) {\n return {\n key,\n label,\n caption: t('usage-unlimited.description', { used: formatAmount(used), window }),\n windowHours,\n };\n }\n const percent = limit.limit > 0 ? Math.min(100, Math.round((used / limit.limit) * 100)) : used > 0 ? 100 : 0;\n return {\n key,\n label,\n caption: `${t('usage-percent-used.label', { percent })} · ${t('usage-limit.description', { used: formatAmount(used), limit: formatAmount(limit.limit), window })}`,\n percent,\n windowHours,\n };\n })\n .sort((left, right) => left.windowHours - right.windowHours);\n\n/**\n * A single usage field: an optional number carrying its label/caption as `title`/`description`\n * annotations and the consumption percentage as its value. Optional so the form renders no required\n * markers; `Schema.Number` keeps the field context-free (`R = never`) so the struct stays assignable to `Form`.\n */\nconst usageField = (title: string, description: string) =>\n Schema.optional(Schema.Number.annotations({ title, description }));\n\n/**\n * Build the Effect schema (one annotated field per limit) and matching values. Unlimited limits have no\n * value, so their field reads `undefined` and the renderer shows the \"Unlimited\" label instead of a meter.\n */\nconst buildUsageForm = (rows: UsageRow[]) => {\n const fields: Record<string, ReturnType<typeof usageField>> = {};\n const values: Record<string, number> = {};\n rows.forEach((row, index) => {\n const field = `metric_${index}`;\n fields[field] = usageField(row.label, row.caption);\n if (row.percent !== undefined) {\n values[field] = row.percent;\n }\n });\n return { schema: Schema.Struct(fields), values };\n};\n\n/** Non-data states shown as a single `Message`, keyed by message variant (translation keys for the copy). */\nconst STATE_MESSAGES = {\n unavailable: {\n valence: 'warning',\n icon: 'ph--cloud-slash--duotone',\n title: 'usage-unavailable.title',\n description: 'usage-unavailable.description',\n },\n error: {\n valence: 'error',\n icon: 'ph--cloud-x--duotone',\n title: 'usage-offline.title',\n description: 'usage-offline.description',\n },\n empty: {\n valence: 'neutral',\n icon: 'ph--chart-bar--duotone',\n title: 'usage-empty.title',\n description: 'usage-empty.description',\n },\n} as const;\n\n/**\n * Presentational view of profile usage: renders loading/error/unavailable/empty states, or a\n * schema-driven settings form (one read-only field per limit), plus a refresh control and a\n * collapsible raw-response viewer. Pure — all data via props.\n */\nexport const UsageView = ({ state, data, lastUpdated, onRefresh }: UsageViewProps) => {\n const { t } = useTranslation(meta.profile.key);\n const [rawExpanded, setRawExpanded] = useState(false);\n\n const { schema, values, empty } = useMemo(() => {\n const rows = data ? computeRows(data, t) : [];\n return { ...buildUsageForm(rows), empty: rows.length === 0 };\n }, [data, t]);\n\n // Non-data states resolve to a `Message`; `loading` shows a spinner and `ready` with data shows the form.\n const message =\n state === 'unavailable'\n ? STATE_MESSAGES.unavailable\n : state === 'error'\n ? STATE_MESSAGES.error\n : state === 'ready' && empty\n ? STATE_MESSAGES.empty\n : undefined;\n\n // Render each metric as a meter from its percentage value; unlimited limits (no value) show a label.\n const meterFieldProvider = useCallback<FormFieldProvider>(\n ({ fieldProps: { label, description, getValue } }) => {\n const percent = getValue();\n return (\n <Form.Row label={label} description={description}>\n {typeof percent === 'number' ? (\n <Status progress={percent / 100} aria-label={t('usage-percent-used.label', { percent })} />\n ) : (\n t('usage-unlimited.label')\n )}\n </Form.Row>\n );\n },\n [t],\n );\n\n return (\n <Form.Root variant='settings' layout='static' schema={schema} values={values}>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={t('usage-section.title')} description={t('usage-section.description')}>\n {state === 'loading' ? (\n <Status indeterminate aria-label={t('usage-section.title')} />\n ) : message ? (\n <Message.Root valence={message.valence}>\n <Message.Title icon={message.icon}>{t(message.title)}</Message.Title>\n <Message.Content>{t(message.description)}</Message.Content>\n </Message.Root>\n ) : (\n <Form.FieldSet fieldProvider={meterFieldProvider} />\n )}\n </Form.Section>\n\n {state === 'ready' && data && (\n <Form.Section>\n <Form.Row\n label={\n lastUpdated !== undefined\n ? t('usage-last-updated.label', { time: new Date(lastUpdated).toLocaleTimeString() })\n : t('usage-refresh.label')\n }\n >\n {onRefresh && (\n <IconButton\n iconOnly\n variant='ghost'\n icon='ph--arrow-clockwise--regular'\n label={t('usage-refresh.label')}\n onClick={onRefresh}\n />\n )}\n </Form.Row>\n </Form.Section>\n )}\n\n {state === 'ready' && data && (\n <Form.Section>\n <Form.Row label={t('usage-raw-json.label')}>\n <ToggleIconButton\n iconOnly\n variant='ghost'\n active={rawExpanded}\n icon='ph--caret-right--regular'\n label={t('usage-raw-json.label')}\n onClick={() => setRawExpanded((value) => !value)}\n />\n </Form.Row>\n {rawExpanded && <JsonHighlighter data={data} testId='usage-raw-json' />}\n </Form.Section>\n )}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useState", "Context", "log", "useAsyncEffect", "Schema", "React", "useCallback", "useMemo", "useState", "IconButton", "Message", "Status", "ToggleIconButton", "useTranslation", "Form", "JsonHighlighter", "meta", "usageMatchesLimit", "item", "limit", "eventType", "valueKey", "subtypePattern", "every", "pattern", "index", "sumUsageForLimit", "usage", "reduce", "total", "amount", "formatValueKey", "replace", "trim", "toLowerCase", "formatLimitLabel", "t", "metric", "subtype", "filter", "segment", "join", "formatAmount", "toLocaleString", "SECONDS_PER_HOUR", "formatWindow", "windowHours", "count", "computeRows", "data", "limits", "map", "used", "label", "windowDuration", "window", "key", "caption", "percent", "Math", "min", "round", "sort", "left", "right", "usageField", "title", "description", "optional", "Number", "annotations", "buildUsageForm", "rows", "fields", "values", "forEach", "row", "field", "undefined", "schema", "Struct", "STATE_MESSAGES", "unavailable", "valence", "icon", "error", "empty", "UsageView", "state", "lastUpdated", "onRefresh", "profile", "rawExpanded", "setRawExpanded", "length", "message", "meterFieldProvider", "fieldProps", "getValue", "Row", "progress", "aria-label", "Root", "variant", "layout", "Viewport", "scroll", "Content", "Section", "indeterminate", "Title", "FieldSet", "fieldProvider", "time", "Date", "toLocaleTimeString", "iconOnly", "onClick", "active", "value", "testId", "fetchState", "setFetchState", "state", "useState", "lastUpdated", "useAsyncEffect", "result", "setLastUpdated", "log", "err", "hubHttp", "useCallback", "onRefresh"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/capabilities/account-cache.ts
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { Capability } from "@dxos/app-framework";
|
|
6
|
+
import { createKvsStore } from "@dxos/effect";
|
|
7
|
+
import { AccountCache, ClientCapabilities } from "#types";
|
|
8
|
+
var account_cache_default = Capability.makeModule(() => Effect.succeed(Capability.contributes(ClientCapabilities.AccountCache, createKvsStore({
|
|
9
|
+
key: "composer.account",
|
|
10
|
+
schema: AccountCache,
|
|
11
|
+
defaultValue: () => ({})
|
|
12
|
+
}))));
|
|
13
|
+
export {
|
|
14
|
+
account_cache_default as default
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=account-cache-YVQKLNV2.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/account-cache.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { createKvsStore } from '@dxos/effect';\n\nimport { AccountCache, ClientCapabilities } from '#types';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(\n ClientCapabilities.AccountCache,\n createKvsStore<AccountCache>({\n key: 'composer.account',\n schema: AccountCache,\n defaultValue: () => ({}),\n }),\n ),\n ),\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,sBAAsB;AAE/B,SAASC,cAAcC,0BAA0B;AAEjD,IAAA,wBAAeH,WAAWI,WAAW,MAC5BC,eACLL,WAAWM,YACTH,mBAAmBD,cACnBD,eAA6B;EAC3BM,KAAK;EACLC,QAAQN;EACRO,cAAc,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "createKvsStore", "AccountCache", "ClientCapabilities", "makeModule", "succeed", "contributes", "key", "schema", "defaultValue"]
|
|
7
|
+
}
|
|
@@ -36,7 +36,7 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
]),
|
|
39
|
-
connector: Effect.
|
|
39
|
+
connector: (node, get) => Effect.gen(function* () {
|
|
40
40
|
const client = yield* Capability.get(ClientCapabilities.Client);
|
|
41
41
|
const identity = get(CreateAtom.fromObservable(client.halo.identity));
|
|
42
42
|
const status = get(CreateAtom.fromObservable(client.mesh.networkStatus));
|
|
@@ -149,11 +149,11 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
|
|
|
149
149
|
]
|
|
150
150
|
})
|
|
151
151
|
];
|
|
152
|
-
})
|
|
152
|
+
}).pipe(Effect.orDie)
|
|
153
153
|
});
|
|
154
154
|
return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
|
|
155
155
|
}));
|
|
156
156
|
export {
|
|
157
157
|
app_graph_builder_default as default
|
|
158
158
|
};
|
|
159
|
-
//# sourceMappingURL=app-graph-builder-
|
|
159
|
+
//# sourceMappingURL=app-graph-builder-RVXTD6OE.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { CreateAtom, GraphBuilder, Node, NodeMatcher } from '@dxos/plugin-graph';\nimport { ConnectionState } from '@dxos/react-client/mesh';\n\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { Account, ClientCapabilities } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* GraphBuilder.createExtension({\n id: 'root',\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: 'openUserAccount',\n data: () => Operation.invoke(ClientOperation.ShareIdentity),\n properties: {\n label: ['open-user-account.label', { ns: meta.profile.key }],\n icon: 'ph--user--regular',\n disposition: 'menu',\n keyBinding: {\n macos: 'meta+shift+.',\n // TODO(wittjosiah): Test on windows to see if it behaves the same as linux.\n windows: 'alt+shift+.',\n linux: 'alt+shift+>',\n },\n },\n },\n ]),\n connector: (node, get) =>\n Effect.gen(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const identity = get(CreateAtom.fromObservable(client.halo.identity));\n const status = get(CreateAtom.fromObservable(client.mesh.networkStatus));\n\n return [\n Node.make({\n id: Account.id,\n type: meta.profile.key,\n properties: {\n label: ['account.label', { ns: meta.profile.key }],\n icon: 'ph--user--regular',\n disposition: 'user-account',\n testId: 'clientPlugin.account',\n // NOTE: This currently needs to be the identity key because the fallback is generated from hex.\n userId: identity?.identityKey.toHex(),\n hue: identity?.profile?.data?.hue,\n emoji: identity?.profile?.data?.emoji,\n status: status.swarm === ConnectionState.OFFLINE ? 'error' : 'active',\n },\n nodes: [\n Node.make({\n id: Account.Profile,\n data: Account.Profile,\n type: meta.profile.key,\n properties: {\n label: ['profile.label', { ns: meta.profile.key }],\n icon: 'ph--user--regular',\n },\n }),\n Node.make({\n id: Account.Account,\n data: Account.Account,\n type: meta.profile.key,\n properties: {\n label: ['account-panel.label', { ns: meta.profile.key }],\n icon: 'ph--identification-card--regular',\n },\n }),\n Node.make({\n id: Account.Devices,\n data: Account.Devices,\n type: meta.profile.key,\n properties: {\n label: ['devices.label', { ns: meta.profile.key }],\n icon: 'ph--devices--regular',\n testId: 'clientPlugin.devices',\n },\n }),\n Node.make({\n id: Account.Security,\n data: Account.Security,\n type: meta.profile.key,\n properties: {\n label: ['security.label', { ns: meta.profile.key }],\n icon: 'ph--key--regular',\n },\n }),\n Node.make({\n id: Account.Invitations,\n data: Account.Invitations,\n type: meta.profile.key,\n properties: {\n label: ['invitations-panel.label', { ns: meta.profile.key }],\n icon: 'ph--ticket--regular',\n },\n }),\n Node.make({\n id: Account.Usage,\n data: Account.Usage,\n type: meta.profile.key,\n properties: {\n label: ['usage-panel.label', { ns: meta.profile.key }],\n icon: 'ph--chart-bar--regular',\n },\n }),\n ],\n }),\n ];\n }).pipe(Effect.orDie),\n });\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,YAAYC,cAAcC,MAAMC,mBAAmB;AAC5D,SAASC,uBAAuB;AAEhC,SAASC,YAAY;AACrB,SAASC,uBAAuB;AAChC,SAASC,SAASC,0BAA0B;AAE5C,IAAA,4BAAeX,WAAWY,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAOV,aAAaW,gBAAgB;IACrDC,IAAI;IACJC,OAAOX,YAAYY;IACnBC,SAAS,MACAC,eAAQ;MACb;QACEJ,IAAI;QACJK,MAAM,MAAMnB,UAAUoB,OAAOb,gBAAgBc,aAAa;QAC1DC,YAAY;UACVC,OAAO;YAAC;YAA2B;cAAEC,IAAIlB,KAAKmB,QAAQC;YAAI;;UAC1DC,MAAM;UACNC,aAAa;UACbC,YAAY;YACVC,OAAO;;YAEPC,SAAS;YACTC,OAAO;UACT;QACF;MACF;KACD;IACHC,WAAW,CAACC,MAAMC,QACTC,WAAI,aAAA;AACT,YAAMC,SAAS,OAAOvC,WAAWqC,IAAI1B,mBAAmB6B,MAAM;AAC9D,YAAMC,WAAWJ,IAAIlC,WAAWuC,eAAeH,OAAOI,KAAKF,QAAQ,CAAA;AACnE,YAAMG,SAASP,IAAIlC,WAAWuC,eAAeH,OAAOM,KAAKC,aAAa,CAAA;AAEtE,aAAO;QACLzC,KAAK0C,KAAK;UACR/B,IAAIN,QAAQM;UACZgC,MAAMxC,KAAKmB,QAAQC;UACnBJ,YAAY;YACVC,OAAO;cAAC;cAAiB;gBAAEC,IAAIlB,KAAKmB,QAAQC;cAAI;;YAChDC,MAAM;YACNC,aAAa;YACbmB,QAAQ;;YAERC,QAAQT,UAAUU,YAAYC,MAAAA;YAC9BC,KAAKZ,UAAUd,SAASN,MAAMgC;YAC9BC,OAAOb,UAAUd,SAASN,MAAMiC;YAChCV,QAAQA,OAAOW,UAAUhD,gBAAgBiD,UAAU,UAAU;UAC/D;UACAC,OAAO;YACLpD,KAAK0C,KAAK;cACR/B,IAAIN,QAAQgD;cACZrC,MAAMX,QAAQgD;cACdV,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBAChDC,MAAM;cACR;YACF,CAAA;YACAxB,KAAK0C,KAAK;cACR/B,IAAIN,QAAQA;cACZW,MAAMX,QAAQA;cACdsC,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAAuB;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBACtDC,MAAM;cACR;YACF,CAAA;YACAxB,KAAK0C,KAAK;cACR/B,IAAIN,QAAQiD;cACZtC,MAAMX,QAAQiD;cACdX,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBAChDC,MAAM;gBACNoB,QAAQ;cACV;YACF,CAAA;YACA5C,KAAK0C,KAAK;cACR/B,IAAIN,QAAQkD;cACZvC,MAAMX,QAAQkD;cACdZ,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAAkB;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBACjDC,MAAM;cACR;YACF,CAAA;YACAxB,KAAK0C,KAAK;cACR/B,IAAIN,QAAQmD;cACZxC,MAAMX,QAAQmD;cACdb,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAA2B;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBAC1DC,MAAM;cACR;YACF,CAAA;YACAxB,KAAK0C,KAAK;cACR/B,IAAIN,QAAQoD;cACZzC,MAAMX,QAAQoD;cACdd,MAAMxC,KAAKmB,QAAQC;cACnBJ,YAAY;gBACVC,OAAO;kBAAC;kBAAqB;oBAAEC,IAAIlB,KAAKmB,QAAQC;kBAAI;;gBACpDC,MAAM;cACR;YACF,CAAA;;QAEJ,CAAA;;IAEJ,CAAA,EAAGkC,KAAYC,YAAK;EACxB,CAAA;AAEA,SAAOhE,WAAWiE,YAAYhE,gBAAgBiE,iBAAiBpD,UAAAA;AACjE,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "AppCapabilities", "Operation", "CreateAtom", "GraphBuilder", "Node", "NodeMatcher", "ConnectionState", "meta", "ClientOperation", "Account", "ClientCapabilities", "makeModule", "fnUntraced", "extensions", "createExtension", "id", "match", "whenRoot", "actions", "succeed", "data", "invoke", "ShareIdentity", "properties", "label", "ns", "profile", "key", "icon", "disposition", "keyBinding", "macos", "windows", "linux", "connector", "node", "get", "gen", "client", "Client", "identity", "fromObservable", "halo", "status", "mesh", "networkStatus", "make", "type", "testId", "userId", "identityKey", "toHex", "hue", "emoji", "swarm", "OFFLINE", "nodes", "Profile", "Devices", "Security", "Invitations", "Usage", "pipe", "orDie", "contributes", "AppGraphBuilder"]
|
|
7
|
+
}
|
|
@@ -5,14 +5,14 @@ import { Capability as Capability2 } from "@dxos/app-framework";
|
|
|
5
5
|
|
|
6
6
|
// src/capabilities/navigation-handler/index.ts
|
|
7
7
|
import { Capability } from "@dxos/app-framework";
|
|
8
|
-
var NavigationHandler = Capability.lazy("NavigationHandler", () => import("../navigation-handler-
|
|
8
|
+
var NavigationHandler = Capability.lazy("NavigationHandler", () => import("../navigation-handler-MQ6MZXLX.mjs"));
|
|
9
9
|
|
|
10
10
|
// src/capabilities/index.ts
|
|
11
|
-
var AccountCache = Capability2.lazy("AccountCache", () => import("../account-cache-
|
|
12
|
-
var AppGraphBuilder = Capability2.lazy("AppGraphBuilder", () => import("../app-graph-builder-
|
|
11
|
+
var AccountCache = Capability2.lazy("AccountCache", () => import("../account-cache-YVQKLNV2.mjs"));
|
|
12
|
+
var AppGraphBuilder = Capability2.lazy("AppGraphBuilder", () => import("../app-graph-builder-RVXTD6OE.mjs"));
|
|
13
13
|
var HubHttpClient = Capability2.lazy("HubHttpClient", () => import("../hub-http-client-WOJUCDKV.mjs"));
|
|
14
14
|
var Client = Capability2.lazy("Client", () => import("../client-7I5Y5SOA.mjs"));
|
|
15
|
-
var LayerSpecs = Capability2.lazy("LayerSpecs", () => import("../layer-specs-
|
|
15
|
+
var LayerSpecs = Capability2.lazy("LayerSpecs", () => import("../layer-specs-YI7BVWKZ.mjs"));
|
|
16
16
|
var Migrations = Capability2.lazy("Migrations", () => import("../migrations-7FTW55ER.mjs"));
|
|
17
17
|
var OperationHandler = Capability2.lazy("OperationHandler", () => import("../operation-handler-E3HB7E2T.mjs"));
|
|
18
18
|
var ReactContext = Capability2.lazy("ReactContext", () => import("../react-context-V74T6JOJ.mjs"));
|
|
@@ -2,11 +2,11 @@ import "../chunk-J5LGTIGS.mjs";
|
|
|
2
2
|
|
|
3
3
|
// src/capabilities/node.ts
|
|
4
4
|
import { Capability } from "@dxos/app-framework";
|
|
5
|
-
var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-
|
|
5
|
+
var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-RVXTD6OE.mjs"));
|
|
6
6
|
var Client = Capability.lazy("Client", () => import("../client-7I5Y5SOA.mjs"));
|
|
7
|
-
var LayerSpecs = Capability.lazy("LayerSpecs", () => import("../layer-specs-
|
|
7
|
+
var LayerSpecs = Capability.lazy("LayerSpecs", () => import("../layer-specs-YI7BVWKZ.mjs"));
|
|
8
8
|
var Migrations = Capability.lazy("Migrations", () => import("../migrations-7FTW55ER.mjs"));
|
|
9
|
-
var NavigationHandler = Capability.lazy("NavigationHandler", () => import("../navigation-handler-
|
|
9
|
+
var NavigationHandler = Capability.lazy("NavigationHandler", () => import("../navigation-handler-MQ6MZXLX.mjs"));
|
|
10
10
|
var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-E3HB7E2T.mjs"));
|
|
11
11
|
var SchemaDefs = Capability.lazy("SchemaDefs", () => import("../schema-defs-IHBCKTMM.mjs"));
|
|
12
12
|
export {
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// src/types/account-cache.ts
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
var AccountCacheValue = Schema.Struct({
|
|
4
|
+
identityDid: Schema.String,
|
|
5
|
+
email: Schema.String,
|
|
6
|
+
emailVerified: Schema.Boolean,
|
|
7
|
+
/** ISO timestamp. */
|
|
8
|
+
createdAt: Schema.String,
|
|
9
|
+
invitationsRemaining: Schema.Number
|
|
10
|
+
});
|
|
11
|
+
var AccountCacheInvitation = Schema.Struct({
|
|
12
|
+
code: Schema.String,
|
|
13
|
+
/** ISO timestamp. */
|
|
14
|
+
createdAt: Schema.String,
|
|
15
|
+
redeemedByIdentityDid: Schema.optional(Schema.String),
|
|
16
|
+
/** ISO timestamp. */
|
|
17
|
+
redeemedAt: Schema.optional(Schema.String)
|
|
18
|
+
});
|
|
19
|
+
var AccountCache = Schema.Struct({
|
|
20
|
+
account: Schema.optional(AccountCacheValue),
|
|
21
|
+
invitations: Schema.optional(Schema.Array(AccountCacheInvitation)),
|
|
22
|
+
/** Epoch ms when the cache was last refreshed. */
|
|
23
|
+
fetchedAt: Schema.optional(Schema.Number)
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// src/types/capabilities.ts
|
|
27
|
+
import { Capability } from "@dxos/app-framework";
|
|
28
|
+
import { meta } from "#meta";
|
|
29
|
+
(function(ClientCapabilities2) {
|
|
30
|
+
ClientCapabilities2.Client = Capability.make(`${meta.profile.key}.capability.client`);
|
|
31
|
+
ClientCapabilities2.Schema = Capability.make(`${meta.profile.key}.capability.schema`);
|
|
32
|
+
ClientCapabilities2.Migration = Capability.make(`${meta.profile.key}.capability.migration`);
|
|
33
|
+
ClientCapabilities2.AccountCache = Capability.make(`${meta.profile.key}.capability.accountCache`);
|
|
34
|
+
ClientCapabilities2.HubHttpClient = Capability.make(`${meta.profile.key}.capability.hubHttpClient`);
|
|
35
|
+
})(ClientCapabilities || (ClientCapabilities = {}));
|
|
36
|
+
var ClientCapabilities;
|
|
37
|
+
|
|
38
|
+
// src/types/events.ts
|
|
39
|
+
import { ActivationEvent } from "@dxos/app-framework";
|
|
40
|
+
import { meta as meta2 } from "#meta";
|
|
41
|
+
(function(ClientEvents2) {
|
|
42
|
+
ClientEvents2.ClientReady = ActivationEvent.make(`${meta2.profile.key}.event.clientReady`);
|
|
43
|
+
ClientEvents2.SetupSchema = ActivationEvent.make(`${meta2.profile.key}.event.setupSchema`);
|
|
44
|
+
ClientEvents2.SetupMigration = ActivationEvent.make(`${meta2.profile.key}.event.setupMigration`);
|
|
45
|
+
ClientEvents2.IdentityCreated = ActivationEvent.make(`${meta2.profile.key}.event.identityCreated`);
|
|
46
|
+
ClientEvents2.SpacesReady = ActivationEvent.make(`${meta2.profile.key}.event.spacesReady`);
|
|
47
|
+
})(ClientEvents || (ClientEvents = {}));
|
|
48
|
+
var ClientEvents;
|
|
49
|
+
|
|
50
|
+
// src/types/schema.ts
|
|
51
|
+
import * as Schema2 from "effect/Schema";
|
|
52
|
+
import { IdentityDid, SpaceId } from "@dxos/keys";
|
|
53
|
+
import { meta as meta3 } from "#meta";
|
|
54
|
+
var IdentitySchema = Schema2.Struct({
|
|
55
|
+
identityDid: IdentityDid,
|
|
56
|
+
spaceId: Schema2.optional(SpaceId),
|
|
57
|
+
profile: Schema2.optional(Schema2.Struct({
|
|
58
|
+
displayName: Schema2.optional(Schema2.String),
|
|
59
|
+
avatarCid: Schema2.optional(Schema2.String),
|
|
60
|
+
data: Schema2.optional(Schema2.Record({
|
|
61
|
+
key: Schema2.String,
|
|
62
|
+
value: Schema2.Any
|
|
63
|
+
}))
|
|
64
|
+
}))
|
|
65
|
+
});
|
|
66
|
+
(function(ClientAction2) {
|
|
67
|
+
const ProfileSchema = Schema2.Struct({
|
|
68
|
+
displayName: Schema2.optional(Schema2.String),
|
|
69
|
+
avatarCid: Schema2.optional(Schema2.String),
|
|
70
|
+
data: Schema2.optional(Schema2.Record({
|
|
71
|
+
key: Schema2.String,
|
|
72
|
+
value: Schema2.Any
|
|
73
|
+
}))
|
|
74
|
+
});
|
|
75
|
+
class CreateIdentity extends Schema2.TaggedClass()(`${meta3.profile.key}.action.create-identity`, {
|
|
76
|
+
input: ProfileSchema,
|
|
77
|
+
output: IdentitySchema
|
|
78
|
+
}) {
|
|
79
|
+
}
|
|
80
|
+
ClientAction2.CreateIdentity = CreateIdentity;
|
|
81
|
+
class JoinIdentity extends Schema2.TaggedClass()(`${meta3.profile.key}.action.join-identity`, {
|
|
82
|
+
input: Schema2.Struct({
|
|
83
|
+
invitationCode: Schema2.optional(Schema2.String)
|
|
84
|
+
}),
|
|
85
|
+
output: Schema2.Void
|
|
86
|
+
}) {
|
|
87
|
+
}
|
|
88
|
+
ClientAction2.JoinIdentity = JoinIdentity;
|
|
89
|
+
class ShareIdentity extends Schema2.TaggedClass()(`${meta3.profile.key}.action.share-identity`, {
|
|
90
|
+
input: Schema2.Void,
|
|
91
|
+
output: Schema2.Void
|
|
92
|
+
}) {
|
|
93
|
+
}
|
|
94
|
+
ClientAction2.ShareIdentity = ShareIdentity;
|
|
95
|
+
class RecoverIdentity extends Schema2.TaggedClass()(`${meta3.profile.key}.action.recover-identity`, {
|
|
96
|
+
input: Schema2.Void,
|
|
97
|
+
output: Schema2.Void
|
|
98
|
+
}) {
|
|
99
|
+
}
|
|
100
|
+
ClientAction2.RecoverIdentity = RecoverIdentity;
|
|
101
|
+
class ResetStorage extends Schema2.TaggedClass()(`${meta3.profile.key}.action.reset-storage`, {
|
|
102
|
+
input: Schema2.Struct({
|
|
103
|
+
mode: Schema2.optional(Schema2.String)
|
|
104
|
+
}),
|
|
105
|
+
output: Schema2.Void
|
|
106
|
+
}) {
|
|
107
|
+
}
|
|
108
|
+
ClientAction2.ResetStorage = ResetStorage;
|
|
109
|
+
class CreateAgent extends Schema2.TaggedClass()(`${meta3.profile.key}.action.create-agent`, {
|
|
110
|
+
input: Schema2.Void,
|
|
111
|
+
output: Schema2.Void
|
|
112
|
+
}) {
|
|
113
|
+
}
|
|
114
|
+
ClientAction2.CreateAgent = CreateAgent;
|
|
115
|
+
class CreateRecoveryCode extends Schema2.TaggedClass()(`${meta3.profile.key}.action.create-recovery-code`, {
|
|
116
|
+
input: Schema2.Void,
|
|
117
|
+
output: Schema2.Void
|
|
118
|
+
}) {
|
|
119
|
+
}
|
|
120
|
+
ClientAction2.CreateRecoveryCode = CreateRecoveryCode;
|
|
121
|
+
class CreatePasskey extends Schema2.TaggedClass()(`${meta3.profile.key}.action.create-passkey`, {
|
|
122
|
+
input: Schema2.Void,
|
|
123
|
+
output: Schema2.Void
|
|
124
|
+
}) {
|
|
125
|
+
}
|
|
126
|
+
ClientAction2.CreatePasskey = CreatePasskey;
|
|
127
|
+
class RedeemPasskey extends Schema2.TaggedClass()(`${meta3.profile.key}.action.redeem-passkey`, {
|
|
128
|
+
input: Schema2.Void,
|
|
129
|
+
output: Schema2.Void
|
|
130
|
+
}) {
|
|
131
|
+
}
|
|
132
|
+
ClientAction2.RedeemPasskey = RedeemPasskey;
|
|
133
|
+
class RedeemToken extends Schema2.TaggedClass()(`${meta3.profile.key}.action.redeem-token`, {
|
|
134
|
+
input: Schema2.Struct({
|
|
135
|
+
token: Schema2.String
|
|
136
|
+
}),
|
|
137
|
+
output: Schema2.Void
|
|
138
|
+
}) {
|
|
139
|
+
}
|
|
140
|
+
ClientAction2.RedeemToken = RedeemToken;
|
|
141
|
+
})(ClientAction || (ClientAction = {}));
|
|
142
|
+
(function(Account2) {
|
|
143
|
+
const _id = "dxos.org.plugin.client.account";
|
|
144
|
+
Account2.id = `!${_id}`;
|
|
145
|
+
Account2.Profile = `${_id}.profile`;
|
|
146
|
+
Account2.Devices = `${_id}.devices`;
|
|
147
|
+
Account2.Security = `${_id}.security`;
|
|
148
|
+
Account2.Account = `${_id}.account`;
|
|
149
|
+
Account2.Invitations = `${_id}.invitations`;
|
|
150
|
+
Account2.Usage = `${_id}.usage`;
|
|
151
|
+
})(Account || (Account = {}));
|
|
152
|
+
var ClientAction;
|
|
153
|
+
var Account;
|
|
154
|
+
|
|
155
|
+
export {
|
|
156
|
+
AccountCache,
|
|
157
|
+
ClientCapabilities,
|
|
158
|
+
ClientEvents,
|
|
159
|
+
ClientAction,
|
|
160
|
+
Account
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-A7WDDIWY.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/account-cache.ts", "../../../src/types/capabilities.ts", "../../../src/types/events.ts", "../../../src/types/schema.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nconst AccountCacheValue = Schema.Struct({\n identityDid: Schema.String,\n email: Schema.String,\n emailVerified: Schema.Boolean,\n /** ISO timestamp. */\n createdAt: Schema.String,\n invitationsRemaining: Schema.Number,\n});\nexport type AccountCacheValue = Schema.Schema.Type<typeof AccountCacheValue>;\n\nconst AccountCacheInvitation = Schema.Struct({\n code: Schema.String,\n /** ISO timestamp. */\n createdAt: Schema.String,\n redeemedByIdentityDid: Schema.optional(Schema.String),\n /** ISO timestamp. */\n redeemedAt: Schema.optional(Schema.String),\n});\nexport type AccountCacheInvitation = Schema.Schema.Type<typeof AccountCacheInvitation>;\n\nexport const AccountCache = Schema.Struct({\n account: Schema.optional(AccountCacheValue),\n invitations: Schema.optional(Schema.Array(AccountCacheInvitation)),\n /** Epoch ms when the cache was last refreshed. */\n fetchedAt: Schema.optional(Schema.Number),\n});\nexport type AccountCache = Schema.Schema.Type<typeof AccountCache>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Client } from '@dxos/client';\nimport { type ObjectMigration } from '@dxos/client/echo';\nimport { type Type } from '@dxos/echo';\nimport { type HubHttpClient } from '@dxos/edge-client';\n\nimport { meta } from '#meta';\n\nimport { type AccountCache as AccountCacheType } from './account-cache';\n\nexport namespace ClientCapabilities {\n export const Client = Capability.make<Client>(`${meta.profile.key}.capability.client`);\n export const Schema = Capability.make<Type.AnyEntity[]>(`${meta.profile.key}.capability.schema`);\n export const Migration = Capability.make<ObjectMigration[]>(`${meta.profile.key}.capability.migration`);\n export const AccountCache = Capability.make<Atom.Writable<AccountCacheType>>(\n `${meta.profile.key}.capability.accountCache`,\n );\n export const HubHttpClient = Capability.make<HubHttpClient>(`${meta.profile.key}.capability.hubHttpClient`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ActivationEvent } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\nexport namespace ClientEvents {\n export const ClientReady = ActivationEvent.make(`${meta.profile.key}.event.clientReady`);\n export const SetupSchema = ActivationEvent.make(`${meta.profile.key}.event.setupSchema`);\n export const SetupMigration = ActivationEvent.make(`${meta.profile.key}.event.setupMigration`);\n export const IdentityCreated = ActivationEvent.make(`${meta.profile.key}.event.identityCreated`);\n export const SpacesReady = ActivationEvent.make(`${meta.profile.key}.event.spacesReady`);\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Client, type ClientOptions } from '@dxos/client';\nimport { IdentityDid, SpaceId } from '@dxos/keys';\n\nimport { meta } from '#meta';\n\n// TODO(wittjosiah): Factor out. Generate?\nconst IdentitySchema = Schema.Struct({\n identityDid: IdentityDid,\n spaceId: Schema.optional(SpaceId),\n profile: Schema.optional(\n Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n ),\n});\n\nexport namespace ClientAction {\n const ProfileSchema = Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n });\n\n export class CreateIdentity extends Schema.TaggedClass<CreateIdentity>()(\n `${meta.profile.key}.action.create-identity`,\n {\n input: ProfileSchema,\n output: IdentitySchema,\n },\n ) {}\n\n export class JoinIdentity extends Schema.TaggedClass<JoinIdentity>()(`${meta.profile.key}.action.join-identity`, {\n input: Schema.Struct({\n invitationCode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class ShareIdentity extends Schema.TaggedClass<ShareIdentity>()(`${meta.profile.key}.action.share-identity`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RecoverIdentity extends Schema.TaggedClass<RecoverIdentity>()(\n `${meta.profile.key}.action.recover-identity`,\n {\n input: Schema.Void,\n output: Schema.Void,\n },\n ) {}\n\n export class ResetStorage extends Schema.TaggedClass<ResetStorage>()(`${meta.profile.key}.action.reset-storage`, {\n input: Schema.Struct({\n mode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class CreateAgent extends Schema.TaggedClass<CreateAgent>()(`${meta.profile.key}.action.create-agent`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class CreateRecoveryCode extends Schema.TaggedClass<CreateRecoveryCode>()(\n `${meta.profile.key}.action.create-recovery-code`,\n {\n input: Schema.Void,\n output: Schema.Void,\n },\n ) {}\n\n export class CreatePasskey extends Schema.TaggedClass<CreatePasskey>()(`${meta.profile.key}.action.create-passkey`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RedeemPasskey extends Schema.TaggedClass<RedeemPasskey>()(`${meta.profile.key}.action.redeem-passkey`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RedeemToken extends Schema.TaggedClass<RedeemToken>()(`${meta.profile.key}.action.redeem-token`, {\n input: Schema.Struct({\n token: Schema.String,\n }),\n output: Schema.Void,\n }) {}\n}\n\nexport type ClientPluginOptions = ClientOptions & {\n /**\n * Base origin for the invitation link.\n */\n shareableLinkOrigin?: string;\n\n /**\n * Path for the invitation link.\n */\n invitationPath?: string;\n\n /**\n * Query parameter for the invitation code.\n */\n invitationProp?: string;\n\n /**\n * Run after the client has been initialized.\n * Plugin context is provided so capabilities are accessible.\n */\n onClientInitialized?: (params: { client: Client }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n\n /**\n * Called when spaces are ready.\n * Plugin context is provided so capabilities are accessible.\n */\n onSpacesReady?: (params: { client: Client }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n\n /**\n * Called when the client is reset.\n * Plugin context is provided so capabilities are accessible.\n */\n onReset?: (params: { target?: string }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n};\n\nexport namespace Account {\n // TODO(wittjosiah): Cannot use slashes in ids until we have a router which decouples ids from url paths.\n const _id = 'dxos.org.plugin.client.account';\n // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.\n // Ideally this should be worked into the data model in a generic way.\n export const id = `!${_id}`;\n\n export const Profile = `${_id}.profile`;\n export const Devices = `${_id}.devices`;\n export const Security = `${_id}.security`;\n export const Account = `${_id}.account`;\n export const Invitations = `${_id}.invitations`;\n export const Usage = `${_id}.usage`;\n}\n"],
|
|
5
|
+
"mappings": ";AAIA,YAAYA,YAAY;AAExB,IAAMC,oBAA2BC,cAAO;EACtCC,aAAoBC;EACpBC,OAAcD;EACdE,eAAsBC;;EAEtBC,WAAkBJ;EAClBK,sBAA6BC;AAC/B,CAAA;AAGA,IAAMC,yBAAgCT,cAAO;EAC3CU,MAAaR;;EAEbI,WAAkBJ;EAClBS,uBAA8BC,gBAAgBV,aAAM;;EAEpDW,YAAmBD,gBAAgBV,aAAM;AAC3C,CAAA;AAGO,IAAMY,eAAsBd,cAAO;EACxCe,SAAgBH,gBAASb,iBAAAA;EACzBiB,aAAoBJ,gBAAgBK,aAAMR,sBAAAA,CAAAA;;EAE1CS,WAAkBN,gBAAgBJ,aAAM;AAC1C,CAAA;;;ACzBA,SAASW,kBAAkB;AAM3B,SAASC,YAAY;UAIJC,qBAAAA;sBACFC,SAASH,WAAWI,KAAa,GAAGH,KAAKI,QAAQC,GAAG,oBAAoB;sBACxEC,SAASP,WAAWI,KAAuB,GAAGH,KAAKI,QAAQC,GAAG,oBAAoB;sBAClFE,YAAYR,WAAWI,KAAwB,GAAGH,KAAKI,QAAQC,GAAG,uBAAuB;sBACzFG,eAAeT,WAAWI,KACrC,GAAGH,KAAKI,QAAQC,GAAG,0BAA0B;sBAElCI,gBAAgBV,WAAWI,KAAoB,GAAGH,KAAKI,QAAQC,GAAG,2BAA2B;AAC5G,GARiBJ,uBAAAA,qBAAAA,CAAAA,EAAAA;;;;ACZjB,SAASS,uBAAuB;AAEhC,SAASC,QAAAA,aAAY;UAEJC,eAAAA;gBACFC,cAAcH,gBAAgBI,KAAK,GAAGH,MAAKI,QAAQC,GAAG,oBAAoB;gBAC1EC,cAAcP,gBAAgBI,KAAK,GAAGH,MAAKI,QAAQC,GAAG,oBAAoB;gBAC1EE,iBAAiBR,gBAAgBI,KAAK,GAAGH,MAAKI,QAAQC,GAAG,uBAAuB;gBAChFG,kBAAkBT,gBAAgBI,KAAK,GAAGH,MAAKI,QAAQC,GAAG,wBAAwB;gBAClFI,cAAcV,gBAAgBI,KAAK,GAAGH,MAAKI,QAAQC,GAAG,oBAAoB;AACzF,GANiBJ,iBAAAA,eAAAA,CAAAA,EAAAA;;;;ACHjB,YAAYS,aAAY;AAIxB,SAASC,aAAaC,eAAe;AAErC,SAASC,QAAAA,aAAY;AAGrB,IAAMC,iBAAwBC,eAAO;EACnCC,aAAaL;EACbM,SAAgBC,iBAASN,OAAAA;EACzBO,SAAgBD,iBACPH,eAAO;IACZK,aAAoBF,iBAAgBG,cAAM;IAC1CC,WAAkBJ,iBAAgBG,cAAM;IACxCE,MAAaL,iBAAgBM,eAAO;MAAEC,KAAYJ;MAAQK,OAAcC;IAAI,CAAA,CAAA;EAC9E,CAAA,CAAA;AAEJ,CAAA;UAEiBC,eAAAA;AACf,QAAMC,gBAAuBd,eAAO;IAClCK,aAAoBF,iBAAgBG,cAAM;IAC1CC,WAAkBJ,iBAAgBG,cAAM;IACxCE,MAAaL,iBAAgBM,eAAO;MAAEC,KAAYJ;MAAQK,OAAcC;IAAI,CAAA,CAAA;EAC9E,CAAA;EAEO,MAAMG,uBAA8BC,oBAAW,EACpD,GAAGlB,MAAKM,QAAQM,GAAG,2BACnB;IACEO,OAAOH;IACPI,QAAQnB;EACV,CAAA,EAAA;EACC;gBANUgB,iBAAAA;EAQN,MAAMI,qBAA4BH,oBAAW,EAAiB,GAAGlB,MAAKM,QAAQM,GAAG,yBAAyB;IAC/GO,OAAcjB,eAAO;MACnBoB,gBAAuBjB,iBAAgBG,cAAM;IAC/C,CAAA;IACAY,QAAeG;EACjB,CAAA,EAAA;EAAI;gBALSF,eAAAA;EAON,MAAMG,sBAA6BN,oBAAW,EAAkB,GAAGlB,MAAKM,QAAQM,GAAG,0BAA0B;IAClHO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EAAI;gBAHSC,gBAAAA;EAKN,MAAMC,wBAA+BP,oBAAW,EACrD,GAAGlB,MAAKM,QAAQM,GAAG,4BACnB;IACEO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EACC;gBANUE,kBAAAA;EAQN,MAAMC,qBAA4BR,oBAAW,EAAiB,GAAGlB,MAAKM,QAAQM,GAAG,yBAAyB;IAC/GO,OAAcjB,eAAO;MACnByB,MAAatB,iBAAgBG,cAAM;IACrC,CAAA;IACAY,QAAeG;EACjB,CAAA,EAAA;EAAI;gBALSG,eAAAA;EAON,MAAME,oBAA2BV,oBAAW,EAAgB,GAAGlB,MAAKM,QAAQM,GAAG,wBAAwB;IAC5GO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EAAI;gBAHSK,cAAAA;EAKN,MAAMC,2BAAkCX,oBAAW,EACxD,GAAGlB,MAAKM,QAAQM,GAAG,gCACnB;IACEO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EACC;gBANUM,qBAAAA;EAQN,MAAMC,sBAA6BZ,oBAAW,EAAkB,GAAGlB,MAAKM,QAAQM,GAAG,0BAA0B;IAClHO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EAAI;gBAHSO,gBAAAA;EAKN,MAAMC,sBAA6Bb,oBAAW,EAAkB,GAAGlB,MAAKM,QAAQM,GAAG,0BAA0B;IAClHO,OAAcI;IACdH,QAAeG;EACjB,CAAA,EAAA;EAAI;gBAHSQ,gBAAAA;EAKN,MAAMC,oBAA2Bd,oBAAW,EAAgB,GAAGlB,MAAKM,QAAQM,GAAG,wBAAwB;IAC5GO,OAAcjB,eAAO;MACnB+B,OAAczB;IAChB,CAAA;IACAY,QAAeG;EACjB,CAAA,EAAA;EAAI;gBALSS,cAAAA;AAMf,GAvEiBjB,iBAAAA,eAAAA,CAAAA,EAAAA;UA4GAmB,UAAAA;AAEf,QAAMC,MAAM;WAGCC,KAAK,IAAID,GAAAA;WAETE,UAAU,GAAGF,GAAAA;WACbG,UAAU,GAAGH,GAAAA;WACbI,WAAW,GAAGJ,GAAAA;WACdD,UAAU,GAAGC,GAAAA;WACbK,cAAc,GAAGL,GAAAA;WACjBM,QAAQ,GAAGN,GAAAA;AAC1B,GAbiBD,YAAAA,UAAAA,CAAAA,EAAAA;;;",
|
|
6
|
+
"names": ["Schema", "AccountCacheValue", "Struct", "identityDid", "String", "email", "emailVerified", "Boolean", "createdAt", "invitationsRemaining", "Number", "AccountCacheInvitation", "code", "redeemedByIdentityDid", "optional", "redeemedAt", "AccountCache", "account", "invitations", "Array", "fetchedAt", "Capability", "meta", "ClientCapabilities", "Client", "make", "profile", "key", "Schema", "Migration", "AccountCache", "HubHttpClient", "ActivationEvent", "meta", "ClientEvents", "ClientReady", "make", "profile", "key", "SetupSchema", "SetupMigration", "IdentityCreated", "SpacesReady", "Schema", "IdentityDid", "SpaceId", "meta", "IdentitySchema", "Struct", "identityDid", "spaceId", "optional", "profile", "displayName", "String", "avatarCid", "data", "Record", "key", "value", "Any", "ClientAction", "ProfileSchema", "CreateIdentity", "TaggedClass", "input", "output", "JoinIdentity", "invitationCode", "Void", "ShareIdentity", "RecoverIdentity", "ResetStorage", "mode", "CreateAgent", "CreateRecoveryCode", "CreatePasskey", "RedeemPasskey", "RedeemToken", "token", "Account", "_id", "id", "Profile", "Devices", "Security", "Invitations", "Usage"]
|
|
7
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/hooks/useHubClient.ts
|
|
2
2
|
import { useEffect } from "react";
|
|
3
3
|
import { useCapabilities } from "@dxos/app-framework/ui";
|
|
4
4
|
import { createEdgeIdentity } from "@dxos/client/edge";
|
|
@@ -24,4 +24,4 @@ var useHubHttpClient = () => {
|
|
|
24
24
|
export {
|
|
25
25
|
useHubHttpClient
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-JY35S2CN.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/
|
|
3
|
+
"sources": ["../../../src/hooks/useHubClient.ts"],
|
|
4
4
|
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { createEdgeIdentity } from '@dxos/client/edge';\nimport { type HubHttpClient } from '@dxos/edge-client';\nimport { useClient } from '@dxos/react-client';\nimport { useIdentity } from '@dxos/react-client/halo';\n\nimport { ClientCapabilities } from '#types';\n\n/**\n * Returns the shared `HubHttpClient` singleton for hub-service API calls.\n * Updates the VP-auth identity whenever the signed-in user changes.\n * Returns `undefined` when the hub URL is unconfigured (no HubHttpClient capability).\n */\nexport const useHubHttpClient = (): HubHttpClient | undefined => {\n const client = useClient();\n const identity = useIdentity();\n const [hubHttpClient] = useCapabilities(ClientCapabilities.HubHttpClient);\n\n useEffect(() => {\n if (hubHttpClient && identity) {\n hubHttpClient.setIdentity(createEdgeIdentity(client));\n }\n }, [client, identity, hubHttpClient]);\n\n return hubHttpClient ?? undefined;\n};\n"],
|
|
5
5
|
"mappings": ";AAIA,SAASA,iBAAiB;AAE1B,SAASC,uBAAuB;AAChC,SAASC,0BAA0B;AAEnC,SAASC,iBAAiB;AAC1B,SAASC,mBAAmB;AAE5B,SAASC,0BAA0B;AAO5B,IAAMC,mBAAmB,MAAA;AAC9B,QAAMC,SAASJ,UAAAA;AACf,QAAMK,WAAWJ,YAAAA;AACjB,QAAM,CAACK,aAAAA,IAAiBR,gBAAgBI,mBAAmBK,aAAa;AAExEV,YAAU,MAAA;AACR,QAAIS,iBAAiBD,UAAU;AAC7BC,oBAAcE,YAAYT,mBAAmBK,MAAAA,CAAAA;IAC/C;EACF,GAAG;IAACA;IAAQC;IAAUC;GAAc;AAEpC,SAAOA,iBAAiBG;AAC1B;",
|
|
6
6
|
"names": ["useEffect", "useCapabilities", "createEdgeIdentity", "useClient", "useIdentity", "ClientCapabilities", "useHubHttpClient", "client", "identity", "hubHttpClient", "HubHttpClient", "setIdentity", "undefined"]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// src/operations/index.ts
|
|
2
|
+
import { OperationHandlerSet } from "@dxos/compute";
|
|
3
|
+
var ClientOperationHandlerSet = OperationHandlerSet.lazy(() => import("./create-agent-6UKJMZS5.mjs"), () => import("./create-identity-ULCRB3YH.mjs"), () => import("./create-passkey-I7VDS3AC.mjs"), () => import("./create-recovery-code-DH2B6EGP.mjs"), () => import("./join-identity-PJCHDNLH.mjs"), () => import("./open-usage-OJVTPGOY.mjs"), () => import("./recover-identity-B7YM2BR4.mjs"), () => import("./redeem-passkey-TYP4XLHO.mjs"), () => import("./redeem-token-2J33R3PV.mjs"), () => import("./reset-storage-K47HZTGP.mjs"), () => import("./share-identity-TOROBLWL.mjs"));
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
ClientOperationHandlerSet
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=chunk-ZFABGG2E.mjs.map
|