@anodb/core 0.7.1 → 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.
Files changed (57) hide show
  1. package/PROTOCOL.md +30 -7
  2. package/README.md +82 -40
  3. package/dist/anodb.d.ts +1 -27
  4. package/dist/anodb.js +2 -151
  5. package/dist/anodb.js.map +1 -1
  6. package/dist/blob.d.ts +3 -3
  7. package/dist/blob.js +1 -1
  8. package/dist/blob.js.map +1 -1
  9. package/dist/cli/init.js +5 -2
  10. package/dist/cli/init.js.map +1 -1
  11. package/dist/cli/main.js +0 -0
  12. package/dist/crypto.d.ts +2 -2
  13. package/dist/crypto.js +2 -2
  14. package/dist/crypto.js.map +1 -1
  15. package/dist/db.d.ts +9 -10
  16. package/dist/db.js +28 -33
  17. package/dist/db.js.map +1 -1
  18. package/dist/defaults.d.ts +3 -2
  19. package/dist/defaults.js +7 -5
  20. package/dist/defaults.js.map +1 -1
  21. package/dist/drivers/browser.d.ts +2 -1
  22. package/dist/drivers/browser.js +4 -1
  23. package/dist/drivers/browser.js.map +1 -1
  24. package/dist/index.d.ts +4 -7
  25. package/dist/index.js +2 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/kysely.d.ts +10 -5
  28. package/dist/kysely.js +3 -2
  29. package/dist/kysely.js.map +1 -1
  30. package/dist/links.d.ts +8 -0
  31. package/dist/links.js +16 -0
  32. package/dist/links.js.map +1 -0
  33. package/dist/policy.d.ts +16 -0
  34. package/dist/policy.js +29 -0
  35. package/dist/policy.js.map +1 -0
  36. package/dist/react.d.ts +3 -2
  37. package/dist/react.js +3 -1
  38. package/dist/react.js.map +1 -1
  39. package/dist/result-types.d.ts +13 -0
  40. package/dist/result-types.js +157 -0
  41. package/dist/result-types.js.map +1 -0
  42. package/dist/schema.d.ts +19 -2
  43. package/dist/schema.js +36 -5
  44. package/dist/schema.js.map +1 -1
  45. package/dist/sharing.d.ts +18 -23
  46. package/dist/sharing.js +56 -99
  47. package/dist/sharing.js.map +1 -1
  48. package/dist/store.d.ts +8 -30
  49. package/dist/store.js +35 -86
  50. package/dist/store.js.map +1 -1
  51. package/dist/types.d.ts +6 -0
  52. package/dist/ui.d.ts +131 -0
  53. package/dist/ui.js +361 -0
  54. package/dist/ui.js.map +1 -0
  55. package/docs/DECISIONS.md +5 -0
  56. package/docs/DESIGN.md +4 -18
  57. package/package.json +3 -2
package/dist/ui.js ADDED
@@ -0,0 +1,361 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Ready-made React components for anoDB's sharing and device features. They are plain HTML with
5
+ * `anodb-*` class names and minimal layout styles, so they fit into any design:
6
+ *
7
+ * <PairDevice /> add a device to your identity (QR code + safety code)
8
+ * <DeviceList /> your devices, with revoke
9
+ * <AddMember space={id} /> add someone by npub (owners / admins)
10
+ * <Invitations /> spaces you were added to, with accept / decline
11
+ * <Members space={id} /> members with roles (owners / admins can change them)
12
+ *
13
+ * Links and QR codes are ordinary `https://your-app/#anodb=…` URLs: scanning one with a phone's
14
+ * camera opens your app with the request filled in. Nothing is approved without a click, and
15
+ * pairing always shows a code to compare on both devices.
16
+ */
17
+ import qrcode from 'qrcode-generator';
18
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
19
+ import { LINK_CHANNEL } from './links.js';
20
+ import { useAnoDB } from './react.js';
21
+ const en = {
22
+ addDevice: 'Add a device',
23
+ addDeviceHint: 'On the new device, choose “This is a new device”, then scan its QR code with this device or paste its link here.',
24
+ pairingLink: 'Pairing link',
25
+ check: 'Check',
26
+ compare: 'Does the new device show this code?',
27
+ deviceName: 'Name for the new device',
28
+ approve: 'Yes, approve',
29
+ cancel: 'Cancel',
30
+ approved: 'Approved. The new device will finish setting up in a moment.',
31
+ newDevice: 'This is a new device',
32
+ newDeviceHint: 'Shows a QR code for one of your existing devices. This device then switches to that identity (its current local data is replaced).',
33
+ showQr: 'Show pairing QR code',
34
+ scanWithOther: 'Scan with your existing device, or copy the link to it. Then check that it shows this code:',
35
+ waiting: 'Waiting for approval…',
36
+ copy: 'Copy link',
37
+ copied: 'Copied',
38
+ devices: 'Your devices',
39
+ thisDevice: 'this device',
40
+ revoked: 'revoked',
41
+ revoke: 'Revoke',
42
+ confirmRevoke: 'Revoke for good?',
43
+ role: 'Role',
44
+ addMember: 'Add a member',
45
+ add: 'Add',
46
+ added: 'Added. They see an invitation the next time they open the app.',
47
+ joined: 'Joined',
48
+ invitations: 'Invitations',
49
+ accept: 'Accept',
50
+ decline: 'Decline',
51
+ members: 'Members',
52
+ you: 'you',
53
+ remove: 'Remove',
54
+ confirmRemove: 'Remove?',
55
+ invalidLink: 'This is not an anoDB link for this app.',
56
+ };
57
+ const ja = {
58
+ addDevice: '端末を追加',
59
+ addDeviceHint: '新しい端末で「この端末を追加する」を選び、表示された QR コードをこの端末で読み取るか、リンクをここに貼り付けてください。',
60
+ pairingLink: 'ペアリング用リンク',
61
+ check: '確認',
62
+ compare: '新しい端末に同じコードが表示されていますか?',
63
+ deviceName: '新しい端末の名前',
64
+ approve: 'はい、承認する',
65
+ cancel: 'キャンセル',
66
+ approved: '承認しました。まもなく新しい端末の設定が完了します。',
67
+ newDevice: 'この端末を追加する',
68
+ newDeviceHint: '既存の端末で読み取る QR コードを表示します。承認されると、この端末はそのアカウントに切り替わります(この端末にある今のデータは置き換わります)。',
69
+ showQr: 'ペアリング用 QR コードを表示',
70
+ scanWithOther: '既存の端末で読み取るか、リンクを送ってください。相手の端末に次のコードが出ていることを確認してください:',
71
+ waiting: '承認を待っています…',
72
+ copy: 'リンクをコピー',
73
+ copied: 'コピーしました',
74
+ devices: 'あなたの端末',
75
+ thisDevice: 'この端末',
76
+ revoked: '失効済み',
77
+ revoke: '失効',
78
+ confirmRevoke: '本当に失効させますか?',
79
+ role: '役割',
80
+ addMember: 'メンバーを追加',
81
+ add: '追加',
82
+ added: '追加しました。相手が次にアプリを開くと招待が表示されます。',
83
+ joined: '参加しました',
84
+ invitations: '招待',
85
+ accept: '参加する',
86
+ decline: '断る',
87
+ members: 'メンバー',
88
+ you: 'あなた',
89
+ remove: '外す',
90
+ confirmRemove: '外しますか?',
91
+ invalidLink: 'このアプリ用の anoDB のリンクではありません。',
92
+ };
93
+ const LABELS = { en, ja };
94
+ function detectLang() {
95
+ const l = typeof navigator !== 'undefined' ? navigator.language : '';
96
+ return /^ja/i.test(l) ? 'ja' : 'en';
97
+ }
98
+ function useLabels(p) {
99
+ return useMemo(() => ({ ...LABELS[p.lang ?? detectLang()], ...p.labels }), [p.lang, p.labels]);
100
+ }
101
+ function useSharingDB() {
102
+ return useAnoDB();
103
+ }
104
+ /**
105
+ * Re-read state that has no change event of its own (members, requests, devices…): on every
106
+ * database change and once a second. Re-renders only when the value changes.
107
+ */
108
+ export function useLive(read, deps = []) {
109
+ const db = useSharingDB();
110
+ // eslint-disable-next-line react-hooks/exhaustive-deps
111
+ const fn = useCallback(() => read(db), [db, ...deps]);
112
+ const [value, setValue] = useState(fn);
113
+ const last = useRef(JSON.stringify(value));
114
+ useEffect(() => {
115
+ const update = () => {
116
+ const v = fn();
117
+ const s = JSON.stringify(v);
118
+ if (s !== last.current) {
119
+ last.current = s;
120
+ setValue(v);
121
+ }
122
+ };
123
+ update();
124
+ const stop = db.onChange(update);
125
+ const t = setInterval(update, 1000);
126
+ return () => {
127
+ stop();
128
+ clearInterval(t);
129
+ };
130
+ }, [db, fn]);
131
+ return value;
132
+ }
133
+ // ---- links -----------------------------------------------------------------------------------
134
+ /** Wrap an `anodb://` link into an https URL of this app, so phones open it from a QR code. */
135
+ export function toAppLink(uri, base) {
136
+ const b = base ?? (typeof location !== 'undefined' ? `${location.origin}${location.pathname}` : '');
137
+ return b ? `${b}#anodb=${encodeURIComponent(uri)}` : uri;
138
+ }
139
+ /** Accepts an `anodb://…` link or an app link (`…#anodb=…`) and returns the `anodb://` link. */
140
+ export function parseAppLink(text) {
141
+ const t = text.trim();
142
+ if (t.startsWith('anodb://'))
143
+ return t;
144
+ try {
145
+ const hash = new URL(t).hash.replace(/^#/, '');
146
+ const v = new URLSearchParams(hash).get('anodb');
147
+ return v?.startsWith('anodb://') ? v : null;
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ /** An `anodb://<kind>` link this page was opened with (`#anodb=…`), and a way to clear it. */
154
+ export function useIncomingLink(kind) {
155
+ const [link, setLink] = useState(null);
156
+ useEffect(() => {
157
+ const read = () => {
158
+ const l = typeof location !== 'undefined' ? parseAppLink(location.href) : null;
159
+ setLink(l?.startsWith(`anodb://${kind}`) ? l : null);
160
+ };
161
+ read();
162
+ window.addEventListener('hashchange', read);
163
+ // A link opened in another tab while this one holds the database (see browserDriver).
164
+ const ch = typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(LINK_CHANNEL) : null;
165
+ if (ch)
166
+ ch.onmessage = (e) => {
167
+ const l = typeof e.data?.href === 'string' ? parseAppLink(e.data.href) : null;
168
+ if (!l || parseAppLink(location.href) === l)
169
+ return;
170
+ // Put it in this page's URL so every useIncomingLink (including ones mounted later) sees it.
171
+ history.replaceState(null, '', `${location.pathname}${location.search}#anodb=${encodeURIComponent(l)}`);
172
+ window.dispatchEvent(new HashChangeEvent('hashchange'));
173
+ };
174
+ return () => {
175
+ window.removeEventListener('hashchange', read);
176
+ ch?.close();
177
+ };
178
+ }, [kind]);
179
+ const clear = useCallback(() => {
180
+ setLink(null);
181
+ if (typeof location !== 'undefined' && location.hash.includes('anodb='))
182
+ history.replaceState(null, '', `${location.pathname}${location.search}`);
183
+ }, []);
184
+ return [link, clear];
185
+ }
186
+ // ---- building blocks -------------------------------------------------------------------------
187
+ const col = { display: 'flex', flexDirection: 'column', gap: 8 };
188
+ const row = { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' };
189
+ const list = { listStyle: 'none', padding: 0, margin: 0, display: 'flex', flexDirection: 'column', gap: 6 };
190
+ const mono = { fontFamily: 'ui-monospace, monospace', wordBreak: 'break-all', fontSize: '0.85em' };
191
+ const codeStyle = { fontFamily: 'ui-monospace, monospace', fontSize: '1.6em', letterSpacing: '0.15em', fontWeight: 700 };
192
+ /** QR code as SVG (dark modules use `currentColor`). */
193
+ export function QRCode(props) {
194
+ const { path, n } = useMemo(() => {
195
+ const qr = qrcode(0, 'M');
196
+ qr.addData(props.value);
197
+ qr.make();
198
+ const n = qr.getModuleCount();
199
+ let d = '';
200
+ for (let r = 0; r < n; r++)
201
+ for (let c = 0; c < n; c++)
202
+ if (qr.isDark(r, c))
203
+ d += `M${c + 4} ${r + 4}h1v1h-1z`;
204
+ return { path: d, n: n + 8 };
205
+ }, [props.value]);
206
+ const size = props.size ?? 200;
207
+ return (_jsxs("svg", { className: props.className ?? 'anodb-qr', width: size, height: size, viewBox: `0 0 ${n} ${n}`, role: "img", "aria-label": props.title ?? 'QR code', shapeRendering: "crispEdges", children: [_jsx("rect", { width: n, height: n, fill: "#fff" }), _jsx("path", { d: path, fill: "#000" })] }));
208
+ }
209
+ function CopyButton({ text, l }) {
210
+ const [done, setDone] = useState(false);
211
+ return (_jsx("button", { type: "button", className: "anodb-button anodb-secondary", onClick: () => void navigator.clipboard?.writeText(text).then(() => {
212
+ setDone(true);
213
+ setTimeout(() => setDone(false), 1500);
214
+ }), children: done ? l.copied : l.copy }));
215
+ }
216
+ function ErrorText({ error }) {
217
+ return error ? (_jsx("p", { className: "anodb-error", role: "alert", style: { color: '#c0392b', margin: 0 }, children: error })) : null;
218
+ }
219
+ /** A button that asks for a second click before doing something destructive. */
220
+ function ConfirmButton(props) {
221
+ const [armed, setArmed] = useState(false);
222
+ useEffect(() => {
223
+ if (!armed)
224
+ return;
225
+ const t = setTimeout(() => setArmed(false), 4000);
226
+ return () => clearTimeout(t);
227
+ }, [armed]);
228
+ return (_jsx("button", { type: "button", className: `anodb-button ${armed ? 'anodb-danger' : 'anodb-secondary'}`, onClick: () => (armed ? (setArmed(false), props.onConfirm()) : setArmed(true)), children: armed ? props.confirm : props.label }));
229
+ }
230
+ const useErr = () => {
231
+ const [error, setError] = useState(null);
232
+ const run = useCallback((p) => p.then((v) => (setError(null), v)).catch((e) => (setError(e.message), undefined)), []);
233
+ return { error, setError, run };
234
+ };
235
+ /**
236
+ * Add a device to your identity. On the existing device: scan or paste the new device's link,
237
+ * compare the code, approve. On the new device: show the QR code and wait.
238
+ */
239
+ export function PairDevice(props) {
240
+ const l = useLabels(props);
241
+ const mode = props.mode ?? 'both';
242
+ return (_jsxs("div", { className: props.className ?? 'anodb-pair', style: col, children: [mode !== 'new-device' && _jsx(ApprovePairing, { l: l }), mode !== 'approve' && _jsx(NewDevicePairing, { l: l, ...(props.onPaired ? { onPaired: props.onPaired } : {}), ...(props.linkBase ? { linkBase: props.linkBase } : {}) })] }));
243
+ }
244
+ function ApprovePairing({ l }) {
245
+ const db = useSharingDB();
246
+ const [incoming, clearIncoming] = useIncomingLink('pair');
247
+ const [text, setText] = useState('');
248
+ const [pending, setPending] = useState(null);
249
+ const [name, setName] = useState('');
250
+ const [done, setDone] = useState(false);
251
+ const { error, setError, run } = useErr();
252
+ const check = useCallback((value) => {
253
+ setDone(false);
254
+ const uri = parseAppLink(value);
255
+ if (!uri)
256
+ return setError(l.invalidLink);
257
+ try {
258
+ setPending(db.parsePairing(uri));
259
+ setError(null);
260
+ }
261
+ catch (e) {
262
+ setError(e.message);
263
+ }
264
+ }, [db, l, setError]);
265
+ useEffect(() => {
266
+ if (incoming) {
267
+ setText(incoming);
268
+ check(incoming);
269
+ }
270
+ }, [incoming, check]);
271
+ return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.addDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.addDeviceHint }), !pending && (_jsxs("form", { style: row, onSubmit: (e) => {
272
+ e.preventDefault();
273
+ check(text);
274
+ }, children: [_jsx("input", { className: "anodb-input", "aria-label": l.pairingLink, placeholder: l.pairingLink, value: text, onChange: (e) => setText(e.target.value), style: { flex: 1, minWidth: 0 } }), _jsx("button", { className: "anodb-button", children: l.check })] })), pending && (_jsxs("div", { className: "anodb-confirm", style: col, children: [_jsx("span", { children: l.compare }), _jsx("span", { className: "anodb-code", style: codeStyle, children: pending.code }), _jsx("input", { className: "anodb-input", "aria-label": l.deviceName, placeholder: l.deviceName, value: name, onChange: (e) => setName(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(pending.approve(name.trim() || 'device')).then((ok) => {
275
+ if (ok === undefined)
276
+ return;
277
+ setPending(null);
278
+ setText('');
279
+ setDone(true);
280
+ clearIncoming();
281
+ }), children: l.approve }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => {
282
+ setPending(null);
283
+ clearIncoming();
284
+ }, children: l.cancel })] })] })), done && _jsx("p", { style: { margin: 0 }, children: l.approved }), _jsx(ErrorText, { error: error })] }));
285
+ }
286
+ function NewDevicePairing({ l, onPaired, linkBase }) {
287
+ const db = useSharingDB();
288
+ const [offer, setOffer] = useState(null);
289
+ const { error, run } = useErr();
290
+ const link = offer ? toAppLink(offer.uri, linkBase) : '';
291
+ return (_jsxs("section", { className: "anodb-section", style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.newDevice }), _jsx("p", { className: "anodb-hint", style: { margin: 0 }, children: l.newDeviceHint }), !offer && (_jsx("div", { children: _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => void run(db.startPairing()).then((o) => {
292
+ if (!o)
293
+ return;
294
+ setOffer(o);
295
+ void o.done.then(async () => {
296
+ if (onPaired)
297
+ return onPaired();
298
+ await db.close();
299
+ location.reload();
300
+ });
301
+ }), children: l.showQr }) })), offer && (_jsxs("div", { style: col, children: [_jsx(QRCode, { value: link, title: l.pairingLink }), _jsx("span", { style: mono, children: link }), _jsx("span", { children: l.scanWithOther }), _jsx("span", { className: "anodb-code", style: codeStyle, children: offer.code }), _jsx("div", { style: row, children: _jsx(CopyButton, { text: link, l: l }) }), _jsx("span", { className: "anodb-hint", children: l.waiting })] })), _jsx(ErrorText, { error: error })] }));
302
+ }
303
+ /** Your devices, with a revoke button for each other device. */
304
+ export function DeviceList(props) {
305
+ const l = useLabels(props);
306
+ const db = useSharingDB();
307
+ const devices = useLive((d) => d.devices());
308
+ const { error, run } = useErr();
309
+ return (_jsxs("section", { className: props.className ?? 'anodb-devices', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.devices }), _jsx("ul", { style: list, children: devices.map((d) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between', opacity: d.revoked ? 0.5 : 1 }, children: [_jsxs("span", { children: [d.name, d.current && ` (${l.thisDevice})`, d.revoked && ` — ${l.revoked}`] }), !d.current && !d.revoked && _jsx(ConfirmButton, { label: l.revoke, confirm: l.confirmRevoke, onConfirm: () => void run(db.revokeDevice(d.device)) })] }, d.device))) }), _jsx(ErrorText, { error: error })] }));
310
+ }
311
+ // ---- sharing ---------------------------------------------------------------------------------
312
+ const MANAGER = { owner: true, admin: true };
313
+ /**
314
+ * Add someone to a space by npub (owners / admins). They must have published a key package
315
+ * (`db.publishKeyPackage()`); they then see an invitation to accept. Deciding *who* may join —
316
+ * links, approval, sign-in with an external provider — is left to the app or anoAuth.
317
+ */
318
+ export function AddMember(props) {
319
+ const l = useLabels(props);
320
+ const db = useSharingDB();
321
+ const me = useLive((d) => d.roleIn(props.space), [props.space]);
322
+ const roles = me === 'owner' ? ['writer', 'reader', 'admin'] : ['writer', 'reader'];
323
+ const [role, setRole] = useState('writer');
324
+ const [npub, setNpub] = useState('');
325
+ const [done, setDone] = useState(false);
326
+ const { error, run } = useErr();
327
+ if (!me || !MANAGER[me])
328
+ return null;
329
+ return (_jsxs("form", { className: props.className ?? 'anodb-add-member', style: col, onSubmit: (e) => {
330
+ e.preventDefault();
331
+ setDone(false);
332
+ void run(db.addMember(props.space, npub.trim(), role).then(() => true)).then((ok) => {
333
+ if (!ok)
334
+ return;
335
+ setNpub('');
336
+ setDone(true);
337
+ });
338
+ }, children: [_jsx("h3", { style: { margin: 0 }, children: l.addMember }), _jsx("input", { className: "anodb-input", "aria-label": "npub", placeholder: "npub1\u2026", value: npub, onChange: (e) => setNpub(e.target.value) }), _jsxs("div", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: role, onChange: (e) => setRole(e.target.value), children: roles.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx("button", { className: "anodb-button", disabled: !npub.trim(), children: l.add })] }), done && (_jsx("span", { className: "anodb-hint", role: "status", children: l.added })), _jsx(ErrorText, { error: error })] }));
339
+ }
340
+ /** Invitations sent to your npub (`db.addMember(space, npub, role)`), with accept / decline. */
341
+ export function Invitations(props) {
342
+ const l = useLabels(props);
343
+ const db = useSharingDB();
344
+ const invitations = useLive((d) => d.invitations());
345
+ const { error, run } = useErr();
346
+ if (invitations.length === 0)
347
+ return null;
348
+ return (_jsxs("section", { className: "anodb-invitations", style: col, children: [_jsx("h4", { style: { margin: 0 }, children: l.invitations }), _jsx("ul", { style: list, children: invitations.map((i) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsxs("span", { children: [i.name, " ", _jsx("span", { className: "anodb-badge", children: i.role })] }), _jsxs("span", { style: row, children: [_jsx("button", { className: "anodb-button", onClick: () => void run(db.acceptInvitation(i.space)).then(() => props.onJoined?.(i.space)), children: l.accept }), _jsx("button", { className: "anodb-button anodb-secondary", onClick: () => db.declineInvitation(i.space), children: l.decline })] })] }, i.space))) }), _jsx(ErrorText, { error: error })] }));
349
+ }
350
+ /** Members of a space. Owners and admins can change roles and remove members. */
351
+ export function Members(props) {
352
+ const l = useLabels(props);
353
+ const db = useSharingDB();
354
+ const members = useLive((d) => d.members(props.space), [props.space]);
355
+ const me = useLive((d) => d.roleIn(props.space), [props.space]);
356
+ const { error, run } = useErr();
357
+ const assignable = me === 'owner' ? ['admin', 'writer', 'reader'] : ['writer', 'reader'];
358
+ const canManage = (m) => m.identity !== db.pubkey && m.role !== 'owner' && (me === 'owner' || (me === 'admin' && m.role !== 'admin'));
359
+ return (_jsxs("section", { className: props.className ?? 'anodb-members', style: col, children: [_jsx("h3", { style: { margin: 0 }, children: l.members }), _jsx("ul", { style: list, children: members.map((m) => (_jsxs("li", { style: { ...row, justifyContent: 'space-between' }, children: [_jsx("span", { children: props.nameOf ? props.nameOf(m) : m.identity === db.pubkey ? l.you : `${m.npub.slice(0, 12)}…` }), canManage(m) ? (_jsxs("span", { style: row, children: [_jsx("select", { className: "anodb-select", "aria-label": l.role, value: m.role, onChange: (e) => void run(db.setRole(props.space, m.identity, e.target.value)), children: assignable.map((r) => (_jsx("option", { value: r, children: r }, r))) }), _jsx(ConfirmButton, { label: l.remove, confirm: l.confirmRemove, onConfirm: () => void run(db.removeMember(props.space, m.identity)) })] })) : (_jsx("span", { className: "anodb-badge", children: m.role }))] }, m.identity))) }), _jsx(ErrorText, { error: error })] }));
360
+ }
361
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"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"}
package/docs/DECISIONS.md CHANGED
@@ -27,3 +27,8 @@
27
27
  | 20 | リリース | v0.2 土台 → v0.3 共有 → v0.4 同期と公開。v0.1 互換は捨てる(protocol v2) |
28
28
  | 21 | 大きなファイル(2026-11-10 追加) | **Blossom** に端末側で暗号化して保存し、参照だけを DB に。複数サーバーへミラー、ハッシュ検証、ファイルごとの使い捨て鍵で認可(アップロードした端末だけ削除可)。暗号文を拒否するサーバーを Content-Type の偽装で回避することはしない |
29
29
  | 22 | 通信経路(2026-11-10 追加) | **WebRTC を主、リレーを予備**に。シグナリングは Nostr リレー(nostr-p2p、public 化)。既定は**自分の端末同士だけ**直接接続、他メンバーとは `p2p.mode: 'members'` で(IP が見えるため)。全端末が ack したときだけリレー保存を省く |
30
+ | 23 | 型と UI(2026-11-10 追加) | Kysely の結果は **boolean → true/false、json → 値**(クエリの構文木から列の型を解決。生 SQL は SQLite の値のまま)。共有・端末追加の **React 部品を同梱**(`<PairDevice />` など)。リンクと QR は `https://アプリ/#anodb=…` で、開いても**クリックなしでは承認しない**・ペアリングは必ずコード照合 |
31
+ | 24 | 行の所有権(2026-11-12 追加、**25 で既定を変更**) | **行は作った人のもの**を既定に。行 ID に作成者の identity を埋め込み(`<pubkey>-<乱数>`)、全端末が受信時に「その行を変えられるのは作成者だけ(削除は owner / admin も可、編集は不可)」を検証。`createdBy` / `updatedBy` は署名から自動で埋まり偽装できない。共同編集の表は `shared()` で明示。**スナップショットは owner / admin(と自分の端末)からのものだけ信頼**(writer のスナップショットで他人の行を書き換えられた穴を塞ぐ)。HLC は書き手が選べるので「最初に作った人」を時刻で決める方式は採らない |
32
+ | 25 | 既定は普通の DB(2026-11-12 追加、**26 で撤回**) | **既定の保存先は「アプリ空間」**=同じ appId の利用者全員で共有する 1 つの DB(招待なし・誰でも読み書き。鍵は appId から導出するので**実質公開**)。表も既定は**誰でも編集・削除可**(RLS なしの Postgres と同じ)。作成者だけが編集できる表は `owned()` で**オプトイン**(24 の規則)。`createdBy` の偽装防止(他人名義の行は作れない)だけは常に有効。自分専用の暗号化データは `space: db.personalSpace`(または `defaultSpace: 'personal'`)、招待制は従来どおり `createSpace`。アプリ空間にはメンバー・スナップショット・鍵更新がなく、端末失効は自分が知っている範囲でしか効かない。理由: DB として最初に触ったときに招待や承認が出てくるのはリッチすぎる |
33
+ | 26 | 暗号化された分散 DB に絞る(2026-11-15 追加) | 25 の**アプリ空間を削除**(鍵が appId から誰でも作れ、暗号化が名ばかりだった)。**公開テーブル(Nostr の投稿・プロフィール等を SQL 表に)と `db.nostr` も削除**(暗号化しない経路で、DB ではなく SNS クライアントの機能)。既定は**自分専用スペース**(自分の端末だけ・招待も規則も不要)。サーバーがない以上「読める=鍵を持つ」なので、**共有=鍵を渡す=招待**は省けない。表は既定で誰でも編集可、`owned()` はオプトイン(25 から維持)。次: 招待を「本人確認・参加条件・鍵の受け渡し」に分け、外部の認証基盤(OIDC・NIP-05・独自発行者)を差し込めるようにする |
34
+ | 27 | 招待の仕方は anoAuth へ(2026-11-15 追加) | anoDB は**公開鍵だけ**を扱う: `addMember(space, npub, role, { devices? })`・`setRole`・`removeMember`・鍵の配布と更新。**招待リンク・参加申請・承認(`createInviteLink` / `requestJoin` / `approveJoinRequest`、`<InviteLink />` / `<JoinSpace />`)は削除**。誰を入れるか(リンク・承認・OIDC・署名付き証明書・外部 ID の予約・定期再確認)は別プロジェクト **anoAuth** が管理者の端末で判定し、`addMember` を呼ぶ。理由: 外部の認証基盤と連携させる前提で、DB に招待の方式を持ち込まない。grill の Q1〜Q7(pubkey+外部 ID の予約 / 受付は owner・admin だけ / 入口は招待リンク / 証明付きリンクは何度でも+期限 30 日+取り消し / ID トークンは発行から 7 日 / 90 日ごとの再確認 / 初版はリンク・npub・手動承認・署名付き証明書・OIDC)は anoAuth に引き継ぐ |
package/docs/DESIGN.md CHANGED
@@ -61,7 +61,7 @@
61
61
 
62
62
  **原則**
63
63
 
64
- 1. **アプリから見える DB エンジンは一つ**。個人・共有・公開データが同じ SQLite に入り、JOIN できる。
64
+ 1. **アプリから見える DB エンジンは一つ**。個人・共有データが同じ SQLite に入り、JOIN できる。
65
65
  2. **ローカルが正**。ネットワークは複製の運搬路。オンラインでもオフラインでも書き込みの挙動は同じ。
66
66
  3. **リレーも他のメンバーも信頼しない**。署名・委任・権限・世代鍵をすべて受信側が検証する。
67
67
  4. **受信は完全に冪等**。重複・順不同・再送・再署名・後から届く権限変更のすべてを「再評価」で吸収する。
@@ -132,7 +132,7 @@
132
132
 
133
133
  | 方法 | 流れ |
134
134
  |---|---|
135
- | npub 招待 | 相手は鍵パッケージ(kind 10304: 端末の委任一覧)を公開しておく → admin が `invite(space, npub, role)` |
135
+ | npub 招待 | 相手は鍵パッケージ(kind 10304: 端末の委任一覧)を公開しておく → admin が `addMember(space, npub, role)`(端末の委任を直接渡すことも可) |
136
136
  | 招待リンク | 使い捨て・期限付きのリンク → 開いた人は「参加リクエスト」を送るだけ → **admin が承認**して初めて鍵が渡る |
137
137
 
138
138
  どちらも**招待された側が承諾するまで何も同期されない**(自分で送ったリクエストへの招待は自動承諾)。
@@ -178,23 +178,9 @@
178
178
 
179
179
  ---
180
180
 
181
- ## 8. 公開テーブル(Nostr 互換)
181
+ ## 8. 公開テーブル(削除)
182
182
 
183
- ```ts
184
- defineSchema({ posts: publicTable('note'), profiles: publicTable('profile'), follows: publicTable('follows') })
185
- ```
186
-
187
- | プリセット | kind | 行 | 更新 |
188
- |---|---|---|---|
189
- | `note` | 1 | 1 イベント = 1 行 | 編集不可(削除=NIP-09) |
190
- | `profile` | 0 | 作者ごとに 1 行(`id` = pubkey) | 置換(新しい方が勝つ) |
191
- | `follows` | 3 | フォロー先ごとに 1 行 | 自分の行の増減 → リスト全体を再発行 |
192
- | `reaction` | 7 | 1 イベント = 1 行 | 削除=NIP-09 |
193
- | `longForm` | 30023 | `d` ごとに 1 行 | アドレス単位で置換 |
194
-
195
- - `INSERT/UPDATE/DELETE` は**本人の鍵で署名された標準イベント**になり、他のクライアントからそのまま見える(recovery モードでは署名者が必要)
196
- - `db.syncPublic(table, filter, { live })` で取得(署名検証済み・置換規則つき)してローカルに保存 → オフラインでも SQL・JOIN できる。著者を指定すると NIP-65 の write リレーも探す
197
- - 公開テーブルは**暗号化されない**。置換イベントの自分の更新は、既存より必ず新しい `created_at` にする(同秒の「id が小さい方が勝つ」規則で編集が負けるのを防ぐ)
183
+ v0.10 で削除(DECISIONS 26)。anoDB は暗号化された分散 DB に絞る。
198
184
 
199
185
  ---
200
186
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anodb/core",
3
- "version": "0.7.1",
3
+ "version": "0.10.0",
4
4
  "description": "Absolutely No DB — a decentralized, local-first database over Nostr. Zero servers to run. Zero servers to trust.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -57,7 +57,8 @@
57
57
  "@noble/hashes": "^2.4.0",
58
58
  "kysely": "^0.29.8",
59
59
  "nostr-p2p": "^0.1.1",
60
- "nostr-tools": "^2.26.0"
60
+ "nostr-tools": "^2.26.0",
61
+ "qrcode-generator": "^2.0.4"
61
62
  },
62
63
  "devDependencies": {
63
64
  "@types/node": "^26.6.6",