🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@openparachute/surface-client

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@openparachute/surface-client - npm Package Compare versions

Comparing version
0.3.3-rc.1
to
0.3.3-rc.2
+181
dist/live-list.d.ts
/**
* Live-list — a framework-light reconciler over `VaultClient.subscribe()`.
*
* `VaultClient.subscribe()` is the raw transport: it hands you a `snapshot`
* (the complete matching set) followed by `upsert` / `remove` deltas, plus a
* lifecycle status. Every surface that wants a *live note list* then has to
* hand-roll the same reconciliation: keep an ordered array, replace-in-place
* on upsert, drop on remove, replace-wholesale on the next snapshot, and map
* the transport status onto a UI-facing "is this live?" state.
*
* notes-ui did exactly this, coupled to TanStack Query (`live-query.ts`).
* This module extracts the reconciliation core with **zero framework
* dependency** — no React, no react-query — so any surface (vanilla,
* React via `useSyncExternalStore`, signals, Svelte stores, …) can consume
* the same well-tested logic. notes-ui now delegates to this core and keeps
* only its react-query binding on top.
*
* ## Shape
*
* {@link createLiveList} opens a subscription and returns a small store:
*
* - `getList()` — the current ordered `Note[]` (a stable reference between
* changes; a fresh array on every reconciled change so identity-based
* memoization works).
* - `getState()` — `{ status, list, thinking }` snapshot.
* - `subscribe(listener)` — register for change notifications; returns an
* unsubscribe. The signature is `useSyncExternalStore`-compatible
* (`(onStoreChange) => () => void`).
* - `close()` — tear down the subscription (idempotent).
*
* ## Status
*
* The transport's four-state lifecycle (`connecting` / `open` /
* `reconnecting` / `closed`) is surfaced verbatim as {@link LiveListStatus},
* except `open` is renamed `live` — the consumer-facing word. A list is
* "live" only while the stream is open; in every other state the consumer
* should treat the list as a best-effort cache (e.g. keep polling) — the
* last good list is retained, never cleared, across reconnects and closes.
*
* ## Reconciliation (identical to notes-ui's prior contract)
*
* - `snapshot` REPLACES the list wholesale (vault re-delivers a fresh
* snapshot on every reconnect — self-correcting; anything missed while
* disconnected is reconciled in one shot).
* - `upsert` replaces the row with the same `id` IN PLACE, or prepends it
* if new. We do not re-sort on a single upsert — vault's snapshot is the
* ordering authority; an in-place update keeps an already-rendered row
* from jumping while the user reads it, and the next snapshot re-aligns.
* - `remove` drops the row by `id`; idempotent.
* - A transient transport error changes NOTHING — the last list stays put.
*
* ## The "thinking" / live-activity indicator
*
* Agentic surfaces stream a note that's mid-generation with
* `metadata.status: "thinking"` (vault's agent-thread convention), flipping
* it to a terminal status when done. {@link LiveListState.thinking} is true
* whenever any note in the current list is in such an in-progress status —
* the data signal behind a "thinking…" / typing indicator. The set of
* in-progress statuses is configurable ({@link CreateLiveListOptions.thinkingStatuses}).
*/
import type { SubscribeOptions, SubscribeStatus } from "./subscribe.js";
import type { Note } from "./vault-types.js";
/**
* Minimal slice of `VaultClient` the live-list needs — just `subscribe`.
* Typing the dependency as this structural interface (rather than the
* concrete class) keeps the core trivially testable with a fake and avoids
* a hard import cycle with the heavy client module.
*/
export interface LiveListClient {
subscribe(query: unknown, handlers: {
onSnapshot: (notes: Note[]) => void;
onUpsert: (note: Note) => void;
onRemove: (id: string) => void;
onStatus?: (status: SubscribeStatus) => void;
onError?: (err: unknown) => void;
}, opts?: SubscribeOptions): () => void;
}
/**
* Consumer-facing lifecycle of a live list. Maps `VaultClient.subscribe()`'s
* {@link SubscribeStatus} 1:1, renaming `open` → `live` (the consumer word).
*/
export type LiveListStatus =
/** First connection attempt is in flight. */
"connecting"
/** Stream is open and delivering — the list is authoritative + fresh. */
| "live"
/** Stream dropped; reconnecting (last good list retained). */
| "reconnecting"
/** Terminal: closed / unrecoverable error / unsubscribable query. */
| "closed";
/** A point-in-time snapshot of a live list. */
export interface LiveListState {
/** Consumer-facing lifecycle — see {@link LiveListStatus}. */
status: LiveListStatus;
/** The current ordered note list (best-effort across reconnects). */
list: Note[];
/**
* True while any note in the list is in an in-progress status (default:
* `metadata.status === "thinking"`). The signal behind a "thinking…" /
* typing indicator. See {@link CreateLiveListOptions.thinkingStatuses}.
*/
thinking: boolean;
}
export interface CreateLiveListOptions {
/**
* `metadata.status` values that count as "in progress" for the
* {@link LiveListState.thinking} indicator. Defaults to `["thinking"]`.
* Pass your own set (e.g. `["thinking", "streaming", "running"]`) to match
* your surface's status vocabulary; pass `[]` to disable the indicator.
*/
thinkingStatuses?: readonly string[];
/** Forwarded to `VaultClient.subscribe()` (backoff, external abort). */
subscribeOptions?: SubscribeOptions;
/**
* Surface transport errors. Transient errors keep retrying inside
* `subscribe()` and never disturb the list — this is purely observational
* (logging / diagnostics). A terminal error is always followed by a
* `closed` status. Defaults to a no-op (a live-transport error must never
* become the list's error state — that would make live worse than polling).
*/
onError?: (err: unknown) => void;
}
/**
* A live, reconciling note list. Framework-agnostic store: read with
* {@link getState}/{@link getList}, observe with {@link subscribe}, dispose
* with {@link close}.
*/
export interface LiveList {
/** Current ordered note list. Fresh array on each reconciled change. */
getList(): Note[];
/** Current full state snapshot (status + list + thinking). */
getState(): LiveListState;
/**
* Register for change notifications. The listener takes no arguments —
* pull the new value via {@link getState}/{@link getList}. Returns an
* unsubscribe. Signature is `useSyncExternalStore`-compatible.
*/
subscribe(listener: () => void): () => void;
/** Tear down the underlying subscription. Idempotent. */
close(): void;
}
/**
* Reconcile a single `upsert` into a list: replace the row with the same
* `id` in place, or prepend it if new. Pure — returns a new array, leaves
* the input untouched. Exported for direct testing + reuse.
*/
export declare function reconcileUpsert(list: Note[], note: Note): Note[];
/**
* Reconcile a `remove`: drop the row by `id`. Idempotent — returns the SAME
* reference when the id is absent (so consumers can skip a re-render). Pure.
*/
export declare function reconcileRemove(list: Note[], id: string): Note[];
/** Map a transport status to the consumer-facing live-list status. */
export declare function toLiveListStatus(status: SubscribeStatus): LiveListStatus;
/**
* Whether a query (as raw `URLSearchParams`) can be evaluated as a live
* stream — false for `search` / `near` / `cursor` (vault rejects them). Thin
* boolean wrapper over {@link assertSubscribableQuery} for call sites that
* want to branch rather than catch.
*/
export declare function isSubscribableParams(params: URLSearchParams): boolean;
/**
* Open a live, reconciling note list over `client.subscribe(query, …)`.
*
* Returns immediately with an empty list in `connecting` status; the
* snapshot/upsert/remove/status events drive it from there. For an
* unsubscribable query (`search` / `near` / `cursor`) the list never opens a
* stream — it stays `closed` with an empty list, and `onError` fires once
* with the rejection so the caller can fall back to polling.
*
* @example
* ```ts
* const live = createLiveList(vault, { tag: "#agent/thread" });
* const unsub = live.subscribe(() => render(live.getState()));
* // later:
* unsub();
* live.close();
* ```
*/
export declare function createLiveList(client: LiveListClient, query: URLSearchParams | Record<string, string> | unknown, opts?: CreateLiveListOptions): LiveList;
//# sourceMappingURL=live-list.d.ts.map
{"version":3,"file":"live-list.d.ts","sourceRoot":"","sources":["../src/live-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CACP,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE;QACR,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;QACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QAC/B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;QAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;KAClC,EACD,IAAI,CAAC,EAAE,gBAAgB,GACtB,MAAM,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc;AACxB,6CAA6C;AAC3C,YAAY;AACd,yEAAyE;GACvE,MAAM;AACR,8DAA8D;GAC5D,cAAc;AAChB,qEAAqE;GACnE,QAAQ,CAAC;AAEb,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,MAAM,EAAE,cAAc,CAAC;IACvB,qEAAqE;IACrE,IAAI,EAAE,IAAI,EAAE,CAAC;IACb;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,OAAO,IAAI,IAAI,EAAE,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,IAAI,aAAa,CAAC;IAC1B;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,yDAAyD;IACzD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAMhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,CAIhE;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAOrE;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,EACzD,IAAI,GAAE,qBAA0B,GAC/B,QAAQ,CAyHV"}
/**
* Live-list — a framework-light reconciler over `VaultClient.subscribe()`.
*
* `VaultClient.subscribe()` is the raw transport: it hands you a `snapshot`
* (the complete matching set) followed by `upsert` / `remove` deltas, plus a
* lifecycle status. Every surface that wants a *live note list* then has to
* hand-roll the same reconciliation: keep an ordered array, replace-in-place
* on upsert, drop on remove, replace-wholesale on the next snapshot, and map
* the transport status onto a UI-facing "is this live?" state.
*
* notes-ui did exactly this, coupled to TanStack Query (`live-query.ts`).
* This module extracts the reconciliation core with **zero framework
* dependency** — no React, no react-query — so any surface (vanilla,
* React via `useSyncExternalStore`, signals, Svelte stores, …) can consume
* the same well-tested logic. notes-ui now delegates to this core and keeps
* only its react-query binding on top.
*
* ## Shape
*
* {@link createLiveList} opens a subscription and returns a small store:
*
* - `getList()` — the current ordered `Note[]` (a stable reference between
* changes; a fresh array on every reconciled change so identity-based
* memoization works).
* - `getState()` — `{ status, list, thinking }` snapshot.
* - `subscribe(listener)` — register for change notifications; returns an
* unsubscribe. The signature is `useSyncExternalStore`-compatible
* (`(onStoreChange) => () => void`).
* - `close()` — tear down the subscription (idempotent).
*
* ## Status
*
* The transport's four-state lifecycle (`connecting` / `open` /
* `reconnecting` / `closed`) is surfaced verbatim as {@link LiveListStatus},
* except `open` is renamed `live` — the consumer-facing word. A list is
* "live" only while the stream is open; in every other state the consumer
* should treat the list as a best-effort cache (e.g. keep polling) — the
* last good list is retained, never cleared, across reconnects and closes.
*
* ## Reconciliation (identical to notes-ui's prior contract)
*
* - `snapshot` REPLACES the list wholesale (vault re-delivers a fresh
* snapshot on every reconnect — self-correcting; anything missed while
* disconnected is reconciled in one shot).
* - `upsert` replaces the row with the same `id` IN PLACE, or prepends it
* if new. We do not re-sort on a single upsert — vault's snapshot is the
* ordering authority; an in-place update keeps an already-rendered row
* from jumping while the user reads it, and the next snapshot re-aligns.
* - `remove` drops the row by `id`; idempotent.
* - A transient transport error changes NOTHING — the last list stays put.
*
* ## The "thinking" / live-activity indicator
*
* Agentic surfaces stream a note that's mid-generation with
* `metadata.status: "thinking"` (vault's agent-thread convention), flipping
* it to a terminal status when done. {@link LiveListState.thinking} is true
* whenever any note in the current list is in such an in-progress status —
* the data signal behind a "thinking…" / typing indicator. The set of
* in-progress statuses is configurable ({@link CreateLiveListOptions.thinkingStatuses}).
*/
import { assertSubscribableQuery } from "./subscribe.js";
/**
* Reconcile a single `upsert` into a list: replace the row with the same
* `id` in place, or prepend it if new. Pure — returns a new array, leaves
* the input untouched. Exported for direct testing + reuse.
*/
export function reconcileUpsert(list, note) {
const idx = list.findIndex((n) => n.id === note.id);
if (idx === -1)
return [note, ...list];
const next = list.slice();
next[idx] = note;
return next;
}
/**
* Reconcile a `remove`: drop the row by `id`. Idempotent — returns the SAME
* reference when the id is absent (so consumers can skip a re-render). Pure.
*/
export function reconcileRemove(list, id) {
const idx = list.findIndex((n) => n.id === id);
if (idx === -1)
return list;
return list.filter((n) => n.id !== id);
}
/** Map a transport status to the consumer-facing live-list status. */
export function toLiveListStatus(status) {
return status === "open" ? "live" : status;
}
/**
* Whether a query (as raw `URLSearchParams`) can be evaluated as a live
* stream — false for `search` / `near` / `cursor` (vault rejects them). Thin
* boolean wrapper over {@link assertSubscribableQuery} for call sites that
* want to branch rather than catch.
*/
export function isSubscribableParams(params) {
try {
assertSubscribableQuery(params);
return true;
}
catch {
return false;
}
}
const DEFAULT_THINKING_STATUSES = ["thinking"];
/** Is any note in the list in an in-progress status? */
function computeThinking(list, statuses) {
if (statuses.length === 0)
return false;
for (const note of list) {
const status = note.metadata?.status;
if (typeof status === "string" && statuses.includes(status))
return true;
}
return false;
}
/**
* Open a live, reconciling note list over `client.subscribe(query, …)`.
*
* Returns immediately with an empty list in `connecting` status; the
* snapshot/upsert/remove/status events drive it from there. For an
* unsubscribable query (`search` / `near` / `cursor`) the list never opens a
* stream — it stays `closed` with an empty list, and `onError` fires once
* with the rejection so the caller can fall back to polling.
*
* @example
* ```ts
* const live = createLiveList(vault, { tag: "#agent/thread" });
* const unsub = live.subscribe(() => render(live.getState()));
* // later:
* unsub();
* live.close();
* ```
*/
export function createLiveList(client, query, opts = {}) {
const thinkingStatuses = opts.thinkingStatuses ?? DEFAULT_THINKING_STATUSES;
let list = [];
let status = "connecting";
let thinking = false;
let snapshot = { status, list, thinking };
let closed = false;
const listeners = new Set();
/**
* Recompute the cached `thinking` flag + the immutable state snapshot, then
* fan out to listeners. Called after every reconciled change. The snapshot
* is rebuilt (not mutated) so `useSyncExternalStore`'s `Object.is` check
* sees a new reference exactly when something changed.
*/
const commit = () => {
thinking = computeThinking(list, thinkingStatuses);
snapshot = { status, list, thinking };
for (const listener of listeners) {
try {
listener();
}
catch {
// A throwing listener must not break fan-out to the others or the
// reconcile loop.
}
}
};
/**
* Branch unsubscribable queries before touching the transport: no stream,
* terminal `closed`, surface the rejection once.
*/
let params = null;
if (query instanceof URLSearchParams) {
params = query;
}
else if (query && typeof query === "object" && !Array.isArray(query)) {
// Plain Record<string,string> — the only other shape we can pre-validate
// without pulling in the full notes-query serializer. Other inputs (the
// typed NotesQuery objects) are validated by subscribe() itself.
try {
params = new URLSearchParams(query);
}
catch {
params = null;
}
}
if (params && !isSubscribableParams(params)) {
status = "closed";
commit();
try {
assertSubscribableQuery(params);
}
catch (err) {
opts.onError?.(err);
}
return {
getList: () => snapshot.list,
getState: () => snapshot,
subscribe: (listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
},
close: () => { },
};
}
const unsubscribe = client.subscribe(query, {
onSnapshot: (notes) => {
if (closed)
return;
// Authoritative complete set — replace wholesale.
list = notes.slice();
commit();
},
onUpsert: (note) => {
if (closed)
return;
list = reconcileUpsert(list, note);
commit();
},
onRemove: (id) => {
if (closed)
return;
const next = reconcileRemove(list, id);
if (next === list)
return; // id absent — nothing changed, no fan-out
list = next;
commit();
},
onStatus: (s) => {
if (closed)
return;
const next = toLiveListStatus(s);
if (next === status)
return;
status = next;
commit();
},
onError: (err) => {
// Observational only — the list is never disturbed by a transport
// error (last good list stays put). A terminal error is followed by
// onStatus("closed") above.
opts.onError?.(err);
},
}, opts.subscribeOptions);
const close = () => {
if (closed)
return;
closed = true;
unsubscribe();
};
return {
getList: () => snapshot.list,
getState: () => snapshot,
subscribe: (listener) => {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
},
close,
};
}
//# sourceMappingURL=live-list.js.map
{"version":3,"file":"live-list.js","sourceRoot":"","sources":["../src/live-list.ts"],"names":[],"mappings":"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"}
+2
-1

@@ -36,2 +36,3 @@ /**

export { parseSSEStream, startSubscription, assertSubscribableQuery, type SSEEvent, type SubscribeHandlers, type SubscribeOptions, type SubscribeStatus, type SubscribeTransport, } from "./subscribe.js";
export { createLiveList, reconcileUpsert, reconcileRemove, isSubscribableParams, toLiveListStatus, type LiveList, type LiveListClient, type LiveListState, type LiveListStatus, type CreateLiveListOptions, } from "./live-list.js";
export type { TagExpandMode, VaultInfo, Note, NoteSummary, NoteLink, NoteAttachment, TagSummary, TagFieldSchema, TagRecord, TagUpsertPayload, UpdateNotePayload, CreateNotePayload, NoteLinkAddPayload, NoteLinkRemovePayload, FindPathResult, StorageUploadResult, UploadProgress, ReachabilitySignal, } from "./vault-types.js";

@@ -58,3 +59,3 @@ export { loadToken, saveToken, clearToken, clearAllTokensForApp, storedFromTokenResponse, tokenKey, TOKEN_KEY_PREFIX, type TokenStorageOpts, } from "./token-storage.js";

*/
export declare const APP_CLIENT_VERSION = "0.3.3-rc.1";
export declare const APP_CLIENT_VERSION = "0.3.3-rc.2";
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,EACL,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACV,aAAa,EACb,SAAS,EACT,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,QAAQ,EACR,gBAAgB,EAChB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,uBAAuB,GAC7B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOlE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGlF,YAAY,EACV,UAAU,EACV,2BAA2B,EAC3B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAKtD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,eAAyB,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}

@@ -50,2 +50,8 @@ /**

export { parseSSEStream, startSubscription, assertSubscribableQuery, } from "./subscribe.js";
// Live-list — framework-light reconciler over `VaultClient.subscribe()`.
// `createLiveList` maintains an ordered note list from the snapshot + delta
// stream and exposes a `useSyncExternalStore`-compatible store (list, status,
// thinking indicator). No React / react-query — any surface can consume it.
// The pure reconcilers + the subscribable-query guard are exported for reuse.
export { createLiveList, reconcileUpsert, reconcileRemove, isSubscribableParams, toLiveListStatus, } from "./live-list.js";
// Token persistence.

@@ -52,0 +58,0 @@ export { loadToken, saveToken, clearToken, clearAllTokensForApp, storedFromTokenResponse, tokenKey, TOKEN_KEY_PREFIX, } from "./token-storage.js";

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,sEAAsE;AACtE,wEAAwE;AACxE,6EAA6E;AAC7E,uCAAuC;AACvC,OAAO,EACL,kBAAkB,GAQnB,MAAM,2BAA2B,CAAC;AAEnC,qDAAqD;AACrD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GAOpB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,wEAAwE;AACxE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AAE7F,yCAAyC;AACzC,OAAO,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAE3B,wEAAwE;AACxE,4EAA4E;AAC5E,oDAAoD;AACpD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,GAQpB,MAAM,kBAAkB,CAAC;AAE1B,0EAA0E;AAC1E,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,uBAAuB,GAMxB,MAAM,gBAAgB,CAAC;AAwBxB,qBAAqB;AACrB,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,QAAQ,EACR,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,gDAAgD;AAChD,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,GAE3B,MAAM,gBAAgB,CAAC;AAExB,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElE,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AACxE,wCAAwC;AACxC,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAclF;;;;;;;GAOG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,gFAAgF;AAChF,2EAA2E;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,sEAAsE;AACtE,wEAAwE;AACxE,6EAA6E;AAC7E,uCAAuC;AACvC,OAAO,EACL,kBAAkB,GAQnB,MAAM,2BAA2B,CAAC;AAEnC,qDAAqD;AACrD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GAOpB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,wEAAwE;AACxE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AAE7F,yCAAyC;AACzC,OAAO,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAE3B,wEAAwE;AACxE,4EAA4E;AAC5E,oDAAoD;AACpD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,GAQpB,MAAM,kBAAkB,CAAC;AAE1B,0EAA0E;AAC1E,uEAAuE;AACvE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,uBAAuB,GAMxB,MAAM,gBAAgB,CAAC;AAExB,yEAAyE;AACzE,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,gBAAgB,GAMjB,MAAM,gBAAgB,CAAC;AAwBxB,qBAAqB;AACrB,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,QAAQ,EACR,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,gDAAgD;AAChD,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,GAE3B,MAAM,gBAAgB,CAAC;AAExB,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElE,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AACxE,wCAAwC;AACxC,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAclF;;;;;;;GAOG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,gFAAgF;AAChF,2EAA2E;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}

@@ -1,2 +0,2 @@

export declare const SURFACE_CLIENT_VERSION = "0.3.3-rc.1";
export declare const SURFACE_CLIENT_VERSION = "0.3.3-rc.2";
//# sourceMappingURL=version.d.ts.map
// AUTO-GENERATED by scripts/gen-version.ts — do not edit by hand.
// Source of truth: package.json "version". Regenerated on every build
// (prebuild). See #57 — keeps SURFACE_CLIENT_VERSION from drifting.
export const SURFACE_CLIENT_VERSION = "0.3.3-rc.1";
export const SURFACE_CLIENT_VERSION = "0.3.3-rc.2";
//# sourceMappingURL=version.js.map
{
"name": "@openparachute/surface-client",
"version": "0.3.3-rc.1",
"version": "0.3.3-rc.2",
"description": "Shared browser-side library for Parachute apps \u2014 OAuth (PKCE + DCR), vault REST client, token storage, service-worker reload helper, vault-id + runtime tenancy helpers.",

@@ -27,2 +27,6 @@ "license": "AGPL-3.0",

},
"./live-list": {
"types": "./dist/live-list.d.ts",
"import": "./dist/live-list.js"
},
"./token-storage": {

@@ -29,0 +33,0 @@ "types": "./dist/token-storage.d.ts",