@lapis-notes/api 0.1.0 → 0.1.3

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 (109) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +5 -0
  3. package/dist/app-database-host.d.ts +1 -0
  4. package/dist/app-database-host.js +1 -0
  5. package/dist/browser-sync-security.d.ts +45 -0
  6. package/dist/browser-sync-security.js +189 -0
  7. package/dist/build-tools/vite.d.ts +15 -0
  8. package/dist/build-tools/vite.js +36 -0
  9. package/dist/cache.svelte.d.ts +1 -1
  10. package/dist/cache.svelte.js +4 -1
  11. package/dist/components/editor/editor.css +54 -2
  12. package/dist/components/editor/extensions/lint/lapis-lint-tooltip.svelte +18 -5
  13. package/dist/components/editor/extensions/lint/lint-tooltip-actions.d.ts +0 -2
  14. package/dist/components/editor/extensions/lint/lint-tooltip-actions.js +0 -14
  15. package/dist/components/editor/language-service/index.js +23 -2
  16. package/dist/components/icon/icon-list.svelte.d.ts +1 -1
  17. package/dist/components/select/select.svelte.d.ts +1 -1
  18. package/dist/context.svelte.d.ts +11 -1
  19. package/dist/context.svelte.js +38 -1
  20. package/dist/docs-api.d.ts +2 -0
  21. package/dist/docs-api.js +1 -0
  22. package/dist/generated/plugin-host-modules.schema.generated.d.ts +443 -13
  23. package/dist/generated/plugin-host-modules.schema.generated.js +970 -306
  24. package/dist/index.d.ts +5 -0
  25. package/dist/index.js +5 -0
  26. package/dist/language-service/manager.d.ts +5 -0
  27. package/dist/language-service/manager.js +58 -14
  28. package/dist/lapis-extension.d.ts +1 -1
  29. package/dist/lapis-extension.js +12 -0
  30. package/dist/nostr-signer.d.ts +68 -0
  31. package/dist/nostr-signer.js +49 -0
  32. package/dist/plugin-asset-server.d.ts +1 -0
  33. package/dist/plugin-asset-server.js +3 -0
  34. package/dist/plugin-capability-facade.d.ts +1 -1
  35. package/dist/plugin-capability-facade.js +6 -0
  36. package/dist/plugin-distribution/catalog-media.d.ts +4 -0
  37. package/dist/plugin-distribution/catalog-media.js +40 -0
  38. package/dist/plugin-distribution/download-stats.d.ts +4 -0
  39. package/dist/plugin-distribution/download-stats.js +19 -0
  40. package/dist/plugin-distribution/index.d.ts +4 -0
  41. package/dist/plugin-distribution/index.js +4 -0
  42. package/dist/plugin-distribution/installer.d.ts +3 -0
  43. package/dist/plugin-distribution/installer.js +26 -3
  44. package/dist/plugin-distribution/manager.d.ts +71 -5
  45. package/dist/plugin-distribution/manager.js +376 -37
  46. package/dist/plugin-distribution/nostr-registry-adapter.d.ts +29 -0
  47. package/dist/plugin-distribution/nostr-registry-adapter.js +152 -0
  48. package/dist/plugin-distribution/plugin-bundle-verifier.d.ts +43 -0
  49. package/dist/plugin-distribution/plugin-bundle-verifier.js +64 -1
  50. package/dist/plugin-distribution/plugin-bundle.d.ts +14 -0
  51. package/dist/plugin-distribution/plugin-bundle.js +46 -7
  52. package/dist/plugin-distribution/plugin-markdown.d.ts +6 -0
  53. package/dist/plugin-distribution/plugin-markdown.js +94 -0
  54. package/dist/plugin-distribution/registry-client.d.ts +6 -1
  55. package/dist/plugin-distribution/registry-client.js +32 -10
  56. package/dist/plugin-distribution/registry-source-state.d.ts +15 -0
  57. package/dist/plugin-distribution/registry-source-state.js +42 -0
  58. package/dist/plugin-distribution/schemas.d.ts +2511 -2824
  59. package/dist/plugin-distribution/schemas.js +111 -42
  60. package/dist/plugin-distribution/types.d.ts +116 -5
  61. package/dist/plugin-distribution-host.d.ts +4 -0
  62. package/dist/plugin-distribution-host.js +2 -0
  63. package/dist/plugin-install-progress.js +1 -1
  64. package/dist/plugin-manager.d.ts +3 -0
  65. package/dist/plugin-manager.js +21 -13
  66. package/dist/plugin-settings.d.ts +21 -0
  67. package/dist/plugin-settings.js +41 -0
  68. package/dist/plugin.d.ts +13 -0
  69. package/dist/plugin.js +56 -0
  70. package/dist/registry-schema/catalog-v1.d.ts +4143 -0
  71. package/dist/registry-schema/catalog-v1.js +172 -0
  72. package/dist/registry-schema/catalog-v2.d.ts +5275 -0
  73. package/dist/registry-schema/catalog-v2.js +137 -0
  74. package/dist/registry-schema/index.d.ts +1 -0
  75. package/dist/registry-schema/index.js +1 -0
  76. package/dist/registry-schema/release-notes.d.ts +5 -0
  77. package/dist/registry-schema/release-notes.js +21 -0
  78. package/dist/server-host.d.ts +28 -0
  79. package/dist/server-host.js +17 -0
  80. package/dist/storage/app-database.d.ts +37 -2
  81. package/dist/storage/app-database.js +41 -1
  82. package/dist/storage/browser-coordinated-app-database.d.ts +3 -1
  83. package/dist/storage/browser-coordinated-app-database.js +8 -0
  84. package/dist/storage/browser.d.ts +4 -1
  85. package/dist/storage/browser.js +84 -0
  86. package/dist/storage/desktop-native.d.ts +4 -2
  87. package/dist/storage/desktop-native.js +90 -1
  88. package/dist/storage/fs.d.ts +17 -0
  89. package/dist/storage/index.d.ts +1 -0
  90. package/dist/storage/index.js +1 -0
  91. package/dist/storage/memory-vault-adapter.d.ts +3 -1
  92. package/dist/storage/memory-vault-adapter.js +60 -0
  93. package/dist/storage/remote-app-database.d.ts +19 -0
  94. package/dist/storage/remote-app-database.js +130 -0
  95. package/dist/storage/task-projection.d.ts +2 -1
  96. package/dist/storage/task-projection.js +7 -2
  97. package/dist/storage/turso-app-database.d.ts +3 -1
  98. package/dist/storage/turso-app-database.js +45 -0
  99. package/dist/storage/vault-session.js +11 -0
  100. package/dist/storage/vault-state.d.ts +1 -1
  101. package/dist/storage/vault.svelte.d.ts +3 -1
  102. package/dist/storage/vault.svelte.js +76 -3
  103. package/dist/sync-host-security.d.ts +285 -0
  104. package/dist/sync-host-security.js +2237 -0
  105. package/dist/sync-host.d.ts +179 -0
  106. package/dist/sync-host.js +769 -0
  107. package/dist/workspace.svelte.d.ts +1 -1
  108. package/dist/workspace.svelte.js +1 -1
  109. package/package.json +48 -10
@@ -0,0 +1,285 @@
1
+ import { type Event as NostrEvent } from "nostr-tools/pure";
2
+ import type { AppDatabase } from "./storage/app-database";
3
+ export type SyncCryptoObjectType = "file-content" | "file-manifest" | "tree-manifest" | "revision-payload" | "revision-archive" | "head-payload" | "membership-payload";
4
+ export type SyncDeviceRole = "owner" | "member";
5
+ export type SyncIdentityState = "setup-required" | "active" | "rotation-pending";
6
+ export interface SyncIdentityHistoryEntry {
7
+ publicKey: string;
8
+ generation: number;
9
+ activatedMembershipGeneration: number;
10
+ retiredMembershipGeneration?: number;
11
+ cutoffHeads?: Record<string, string>;
12
+ }
13
+ export interface SyncIdentityPublicStatus {
14
+ state: SyncIdentityState;
15
+ publicKey?: string;
16
+ generation: number;
17
+ history: SyncIdentityHistoryEntry[];
18
+ pendingPublicKey?: string;
19
+ canRotate: boolean;
20
+ }
21
+ export interface SyncDeviceMembership {
22
+ publicKey: string;
23
+ alias: string;
24
+ role: SyncDeviceRole;
25
+ state: "active" | "revoked";
26
+ addedAt: number;
27
+ revokedAt?: number;
28
+ cutoffHead?: string;
29
+ }
30
+ export interface SyncMembershipSnapshot {
31
+ schemaVersion: 1 | 2;
32
+ vaultId: string;
33
+ ownerPublicKey: string;
34
+ generation: number;
35
+ currentEpoch: number;
36
+ previousEventId?: string;
37
+ devices: SyncDeviceMembership[];
38
+ /** NIP-44 sealed current-epoch material, keyed by active device public key. */
39
+ epochEnvelopes?: Record<string, string>;
40
+ /** Current-epoch material sealed to the recovery authority. */
41
+ recoveryEpochEnvelope?: string;
42
+ /** Stable remote-account identity and its root-authorised public lineage. */
43
+ syncIdentity?: {
44
+ publicKey: string;
45
+ generation: number;
46
+ history: SyncIdentityHistoryEntry[];
47
+ };
48
+ /** Active Sync Identity secret sealed independently to each active device. */
49
+ syncIdentityEnvelopes?: Record<string, string>;
50
+ /** Active Sync Identity secret sealed to the recovery authority. */
51
+ recoverySyncIdentityEnvelope?: string;
52
+ /** Final accepted legacy device-authored HEADs at Sync Identity activation. */
53
+ legacyTransportCutoffHeads?: Record<string, string>;
54
+ event?: NostrEvent;
55
+ }
56
+ export interface SyncCryptoStatus {
57
+ state: "unenrolled" | "locked" | "unlocked";
58
+ suite: "lapis-sync-v1-xchacha20poly1305-schnorr";
59
+ publicKey?: string;
60
+ /** Unambiguous replacement for the deprecated publicKey device-key alias. */
61
+ devicePublicKey?: string;
62
+ vaultId?: string;
63
+ deviceAlias?: string;
64
+ role?: SyncDeviceRole;
65
+ deviceState?: "active" | "revoked" | "recovery-pending";
66
+ currentEpoch?: number;
67
+ membershipGeneration?: number;
68
+ canManageDevices?: boolean;
69
+ syncIdentity?: SyncIdentityPublicStatus;
70
+ }
71
+ export interface SyncEncryptedObject {
72
+ bytes: Uint8Array;
73
+ objectHash: string;
74
+ }
75
+ export interface UnsignedSyncEvent {
76
+ kind: number;
77
+ created_at: number;
78
+ tags: string[][];
79
+ content: string;
80
+ }
81
+ export interface SyncCryptoCapability {
82
+ status(): Promise<SyncCryptoStatus>;
83
+ /** Explicitly create a new sync vault through a host-owned enrollment flow. */
84
+ enrollNewVault(input: {
85
+ deviceAlias: string;
86
+ }): Promise<SyncCryptoStatus>;
87
+ /** Ask the owning host to perform its user-verification unlock flow. */
88
+ requestUnlock(): Promise<SyncCryptoStatus>;
89
+ getDevicePublicKey(): Promise<string>;
90
+ encryptObject(input: {
91
+ epoch: number;
92
+ type: SyncCryptoObjectType;
93
+ plaintext: Uint8Array;
94
+ }): Promise<SyncEncryptedObject>;
95
+ decryptObject(input: {
96
+ epoch: number;
97
+ type: SyncCryptoObjectType;
98
+ envelope: Uint8Array;
99
+ }): Promise<Uint8Array>;
100
+ calculateContentId(input: {
101
+ epoch: number;
102
+ plaintext: Uint8Array;
103
+ }): Promise<string>;
104
+ signEvent(event: UnsignedSyncEvent): Promise<NostrEvent>;
105
+ /** Sign a bounded inner revision or HEAD attestation with this device. */
106
+ signDeviceEvent(event: UnsignedSyncEvent): Promise<NostrEvent>;
107
+ }
108
+ export type SyncIdentitySigningPurpose = "transport" | "relay-auth" | "blossom-auth" | "connection-probe";
109
+ export interface SyncIdentityCapability {
110
+ status(): Promise<SyncIdentityPublicStatus>;
111
+ initialize(input: {
112
+ cutoffHeads: Record<string, string>;
113
+ }): Promise<{
114
+ status: SyncIdentityPublicStatus;
115
+ membershipEvent: NostrEvent;
116
+ }>;
117
+ signEvent(input: {
118
+ purpose: SyncIdentitySigningPurpose;
119
+ identity?: "active" | "pending";
120
+ event: UnsignedSyncEvent;
121
+ }): Promise<NostrEvent>;
122
+ beginRotation(): Promise<SyncIdentityPublicStatus>;
123
+ commitRotation(input: {
124
+ pendingPublicKey: string;
125
+ cutoffHeads: Record<string, string>;
126
+ }): Promise<{
127
+ status: SyncIdentityPublicStatus;
128
+ membershipEvent: NostrEvent;
129
+ }>;
130
+ cancelRotation(): Promise<SyncIdentityPublicStatus>;
131
+ }
132
+ export interface SyncPairingSessionSnapshot {
133
+ sessionId: string;
134
+ role: "owner" | "joining";
135
+ state: "waiting-for-peer" | "waiting-for-sas" | "waiting-for-confirmation" | "ready-to-enroll" | "transferring" | "complete" | "cancelled" | "expired" | "error";
136
+ expiresAt: number;
137
+ sas?: string;
138
+ peerPublicKey?: string;
139
+ peerAlias?: string;
140
+ error?: string;
141
+ }
142
+ export interface SyncPairingActionResult {
143
+ session: SyncPairingSessionSnapshot;
144
+ outboundEvents: NostrEvent[];
145
+ /** Public transport endpoints for this bounded pairing session. */
146
+ relayUrls: string[];
147
+ invitationUri?: string;
148
+ membershipEvent?: NostrEvent;
149
+ /** Bounded plugin data recovered only from the encrypted pairing transfer. */
150
+ metadata?: unknown;
151
+ }
152
+ export interface SyncPairingCapability {
153
+ beginOwner(input: {
154
+ relayUrls: string[];
155
+ cutoffHeads?: Record<string, string>;
156
+ metadata?: unknown;
157
+ }): Promise<SyncPairingActionResult>;
158
+ acceptInvite(input: {
159
+ invitationUri: string;
160
+ deviceAlias: string;
161
+ }): Promise<SyncPairingActionResult>;
162
+ ingest(input: {
163
+ sessionId: string;
164
+ event: NostrEvent;
165
+ }): Promise<SyncPairingActionResult>;
166
+ confirm(sessionId: string, sas?: string): Promise<SyncPairingActionResult>;
167
+ cancel(sessionId: string): Promise<SyncPairingSessionSnapshot>;
168
+ /** Create a disposable kind-24134 event for relay policy probing. */
169
+ createRelayProbe(): Promise<NostrEvent>;
170
+ }
171
+ export interface SyncMembershipCapability {
172
+ getSnapshot(): Promise<SyncMembershipSnapshot>;
173
+ ingest(event: NostrEvent): Promise<SyncMembershipSnapshot>;
174
+ renameDevice(input: {
175
+ publicKey: string;
176
+ alias: string;
177
+ }): Promise<SyncMembershipSnapshot>;
178
+ revokeDevice(input: {
179
+ publicKey: string;
180
+ cutoffHeads: Record<string, string>;
181
+ }): Promise<SyncMembershipSnapshot>;
182
+ recoverOwner(input: {
183
+ cutoffHeads: Record<string, string>;
184
+ }): Promise<SyncMembershipSnapshot>;
185
+ }
186
+ export interface SyncRecoveryCapability {
187
+ exportBundle(input?: {
188
+ metadata?: unknown;
189
+ }): Promise<Uint8Array>;
190
+ importBundle(input: {
191
+ bundle: Uint8Array;
192
+ replaceExisting?: boolean;
193
+ }): Promise<{
194
+ status: SyncCryptoStatus;
195
+ metadata?: unknown;
196
+ }>;
197
+ }
198
+ export interface SyncCryptoEnrollmentRequest {
199
+ mode: "new-vault" | "paired-device" | "recovery";
200
+ deviceAlias?: string;
201
+ sessionId?: string;
202
+ }
203
+ export interface PluginNetworkRequest {
204
+ url: string;
205
+ method?: string;
206
+ headers?: Record<string, string>;
207
+ body?: BodyInit | ReadableStream<Uint8Array> | null;
208
+ timeoutMs?: number;
209
+ signal?: AbortSignal;
210
+ }
211
+ export interface PluginNetworkResponse {
212
+ url: string;
213
+ status: number;
214
+ statusText: string;
215
+ headers: Record<string, string>;
216
+ body: ReadableStream<Uint8Array> | null;
217
+ arrayBuffer(): Promise<ArrayBuffer>;
218
+ text(): Promise<string>;
219
+ }
220
+ export interface PluginWebSocket {
221
+ readonly url: string;
222
+ readonly ready: Promise<void>;
223
+ readonly readyState: number;
224
+ addEventListener(type: "open" | "message" | "error" | "close", listener: EventListenerOrEventListenerObject): void;
225
+ removeEventListener(type: "open" | "message" | "error" | "close", listener: EventListenerOrEventListenerObject): void;
226
+ send(data: string | ArrayBuffer | ArrayBufferView | Blob): void;
227
+ close(code?: number, reason?: string): void;
228
+ }
229
+ export interface PluginNetworkCapability {
230
+ /** Ask the host to approve and persist an exact origin grant. */
231
+ requestOriginGrant(origin: string, options?: {
232
+ allowPrivateNetwork?: boolean;
233
+ }): Promise<void>;
234
+ request(request: PluginNetworkRequest): Promise<PluginNetworkResponse>;
235
+ connectWebSocket(url: string, protocols?: string | string[]): Promise<PluginWebSocket>;
236
+ }
237
+ export type SyncWrappingKeyDescriptor = {
238
+ name: "argon2id";
239
+ timeCost: number;
240
+ memoryKiB: number;
241
+ parallelism: number;
242
+ dkLen: 32;
243
+ saltHex: string;
244
+ } | {
245
+ name: "external";
246
+ provider: "webauthn-prf" | "os-credential-store";
247
+ keyId: string;
248
+ };
249
+ export interface SyncHostSecurityOptions {
250
+ fetch?: typeof fetch;
251
+ WebSocket?: typeof WebSocket;
252
+ argon2?: {
253
+ timeCost?: number;
254
+ memoryKiB?: number;
255
+ parallelism?: number;
256
+ };
257
+ }
258
+ export declare class SyncHostSecurityService {
259
+ #private;
260
+ readonly database: AppDatabase;
261
+ readonly assertRuntime: (pluginId: string, runtimeId: string) => void;
262
+ constructor(database: AppDatabase, assertRuntime: (pluginId: string, runtimeId: string) => void, options?: SyncHostSecurityOptions);
263
+ enroll(pluginId: string, passphrase: string, request?: SyncCryptoEnrollmentRequest): Promise<SyncCryptoStatus>;
264
+ enrollWithWrappingKey(pluginId: string, wrappingKey: Uint8Array, descriptor: Extract<SyncWrappingKeyDescriptor, {
265
+ name: "external";
266
+ }>, request?: SyncCryptoEnrollmentRequest): Promise<SyncCryptoStatus>;
267
+ unlock(pluginId: string, passphrase: string): Promise<SyncCryptoStatus>;
268
+ unlockWithWrappingKey(pluginId: string, wrappingKey: Uint8Array): Promise<SyncCryptoStatus>;
269
+ lock(pluginId: string): void;
270
+ status(pluginId: string): Promise<SyncCryptoStatus>;
271
+ crypto(pluginId: string, runtimeId: string, assertGranted?: () => void, requestUnlock?: () => Promise<SyncCryptoStatus>, requestEnrollment?: (input: SyncCryptoEnrollmentRequest) => Promise<SyncCryptoStatus>): SyncCryptoCapability;
272
+ syncIdentity(pluginId: string, runtimeId: string, assertGranted?: () => void): SyncIdentityCapability;
273
+ pairing(pluginId: string, runtimeId: string, assertGranted?: () => void, requestEnrollment?: (input: SyncCryptoEnrollmentRequest) => Promise<SyncCryptoStatus>): SyncPairingCapability;
274
+ membership(pluginId: string, runtimeId: string, assertGranted?: () => void): SyncMembershipCapability;
275
+ recovery(pluginId: string, runtimeId: string, assertGranted?: () => void, requestPassphrase?: (mode: "export" | "import") => Promise<string | null>, requestEnrollment?: (input: SyncCryptoEnrollmentRequest) => Promise<SyncCryptoStatus>): SyncRecoveryCapability;
276
+ grantNetworkOrigin(pluginId: string, origin: string, options?: {
277
+ allowPrivateNetwork?: boolean;
278
+ }): Promise<void>;
279
+ hasNetworkOriginGrant(pluginId: string, origin: string): Promise<boolean>;
280
+ revokeNetworkOrigin(pluginId: string, origin: string): Promise<void>;
281
+ revokePlugin(pluginId: string): void;
282
+ network(pluginId: string, runtimeId: string, assertGranted?: () => void, requestOriginGrant?: (origin: string, options?: {
283
+ allowPrivateNetwork?: boolean;
284
+ }) => Promise<void>): PluginNetworkCapability;
285
+ }