@quiesco/agent 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -2
  3. package/metro.cjs +144 -0
  4. package/package.json +54 -3
  5. package/src/actions/hit-test.ts +42 -0
  6. package/src/actions/host.ts +194 -0
  7. package/src/actions/js.ts +245 -0
  8. package/src/actions/multitouch.ts +179 -0
  9. package/src/actions/native.ts +500 -0
  10. package/src/actions/performer.ts +87 -0
  11. package/src/actions/value.ts +460 -0
  12. package/src/actions/wheel.ts +260 -0
  13. package/src/api-types.ts +32 -0
  14. package/src/api.ts +11 -0
  15. package/src/assertions/index.ts +160 -0
  16. package/src/backdoor.ts +54 -0
  17. package/src/build-config.ts +6 -0
  18. package/src/connection/client.ts +196 -0
  19. package/src/connection/params.ts +63 -0
  20. package/src/early.ts +10 -0
  21. package/src/errors.ts +23 -0
  22. package/src/events.ts +136 -0
  23. package/src/expo-fetch.js +13 -0
  24. package/src/fiber-adapter/default-deps.native.ts +36 -0
  25. package/src/fiber-adapter/default-deps.ts +38 -0
  26. package/src/fiber-adapter/fiber.ts +81 -0
  27. package/src/fiber-adapter/hook.ts +154 -0
  28. package/src/fiber-adapter/host.ts +210 -0
  29. package/src/fiber-adapter/index.ts +221 -0
  30. package/src/fiber-adapter/scheduler.ts +70 -0
  31. package/src/fiber-adapter/traverse.ts +260 -0
  32. package/src/fiber-adapter/types.ts +142 -0
  33. package/src/index.ts +7 -0
  34. package/src/install.ts +6 -0
  35. package/src/json-check.ts +43 -0
  36. package/src/platform.ts +155 -0
  37. package/src/query/index.ts +5 -0
  38. package/src/query/matcher.ts +121 -0
  39. package/src/query/semantic.ts +266 -0
  40. package/src/query/tree.ts +116 -0
  41. package/src/query/visibility.ts +60 -0
  42. package/src/reset/index.ts +59 -0
  43. package/src/reset/storage-defaults.native.ts +26 -0
  44. package/src/reset/storage-defaults.ts +39 -0
  45. package/src/root/QuiescoRoot.tsx +28 -0
  46. package/src/runtime.ts +1003 -0
  47. package/src/singleton.ts +18 -0
  48. package/src/stub.ts +28 -0
  49. package/src/sync/frame-stable.ts +142 -0
  50. package/src/sync/idle-callback.ts +142 -0
  51. package/src/sync/index.ts +17 -0
  52. package/src/sync/native-settle.ts +41 -0
  53. package/src/sync/network.ts +299 -0
  54. package/src/sync/offline.ts +121 -0
  55. package/src/sync/react.ts +28 -0
  56. package/src/sync/timer.ts +124 -0
  57. package/src/sync/tracker.ts +51 -0
  58. package/src/sync/wait-for-idle.ts +141 -0
  59. package/src/version.ts +2 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Built-in stores cleared on soft reset, web (requirements.md §6.5): localStorage, sessionStorage and
3
+ * every IndexedDB database. AsyncStorage on web is backed by localStorage, so it is covered.
4
+ */
5
+ import type { StorageAdapter } from '../api-types';
6
+
7
+ interface IDBFactoryLike {
8
+ databases?: () => Promise<{ name?: string }[]>;
9
+ deleteDatabase(name: string): { onsuccess: (() => void) | null; onerror: (() => void) | null; onblocked: (() => void) | null };
10
+ }
11
+
12
+ function deleteDb(idb: IDBFactoryLike, name: string): Promise<void> {
13
+ return new Promise((resolve, reject) => {
14
+ const req = idb.deleteDatabase(name);
15
+ req.onsuccess = () => resolve();
16
+ req.onerror = () => reject(new Error(`cannot delete IndexedDB database ${name}`));
17
+ // Another connection keeps it open; it is deleted once that connection closes (the remount does that).
18
+ req.onblocked = () => resolve();
19
+ });
20
+ }
21
+
22
+ export function defaultStorageAdapters(g: Record<string, unknown> = globalThis as unknown as Record<string, unknown>): StorageAdapter[] {
23
+ const out: StorageAdapter[] = [];
24
+ for (const key of ['localStorage', 'sessionStorage'] as const) {
25
+ const s = g[key] as { clear?: () => void } | undefined;
26
+ if (s !== undefined && typeof s.clear === 'function') out.push({ name: key, clear: () => s.clear?.() });
27
+ }
28
+ const idb = g['indexedDB'] as IDBFactoryLike | undefined;
29
+ if (idb !== undefined && typeof idb.databases === 'function') {
30
+ out.push({
31
+ name: 'indexedDB',
32
+ clear: async () => {
33
+ const dbs = (await idb.databases?.()) ?? [];
34
+ await Promise.all(dbs.flatMap((d) => (d.name === undefined ? [] : [deleteDb(idb, d.name)])));
35
+ },
36
+ });
37
+ }
38
+ return out;
39
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * App entry wrapper (requirements.md §6.7). Restricts queries to its subtree, connects to the host,
3
+ * and owns the key used to remount the whole app on soft reset.
4
+ * Trackers are installed earlier, at import time: children's effects run before this component's
5
+ * effects, so installing here would miss requests the app starts on mount.
6
+ */
7
+ import type { ReactNode } from 'react';
8
+ import { Fragment, useEffect, useState } from 'react';
9
+
10
+ import { getRuntime } from '../singleton';
11
+
12
+ export interface QuiescoRootProps {
13
+ children?: ReactNode;
14
+ }
15
+
16
+ export function QuiescoRoot({ children }: QuiescoRootProps): ReactNode {
17
+ const runtime = getRuntime();
18
+ const [rootKey, setRootKey] = useState(0);
19
+ useEffect(() => {
20
+ const offRemount = runtime.setRemount(() => setRootKey((k) => k + 1));
21
+ runtime.mount(QuiescoRoot);
22
+ return () => {
23
+ offRemount();
24
+ runtime.unmount();
25
+ };
26
+ }, [runtime]);
27
+ return <Fragment key={rootKey}>{children}</Fragment>;
28
+ }