orchajs 0.20.2 → 0.21.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 (99) hide show
  1. package/README.md +129 -0
  2. package/dist/bin.d.ts +2 -0
  3. package/dist/bin.js +13 -0
  4. package/dist/browser.d.ts +2 -0
  5. package/dist/browser.js +12 -0
  6. package/dist/cli-agents-template.d.ts +1 -1
  7. package/dist/cli-agents-template.js +22 -0
  8. package/dist/cli.js +35 -9
  9. package/dist/compiler/build-project.d.ts +1 -0
  10. package/dist/compiler/build-project.js +75 -8
  11. package/dist/compiler/compile.d.ts +1 -1
  12. package/dist/compiler/compile.js +11 -9
  13. package/dist/file-content.js +42 -6
  14. package/dist/index.d.ts +1 -5
  15. package/dist/index.js +1 -2
  16. package/dist/integrations/esbuild.js +5 -2
  17. package/dist/integrations/expo.d.ts +1 -0
  18. package/dist/integrations/expo.js +1 -0
  19. package/dist/integrations/metro.d.ts +15 -0
  20. package/dist/integrations/metro.js +25 -0
  21. package/dist/integrations/next.d.ts +23 -0
  22. package/dist/integrations/next.js +53 -0
  23. package/dist/integrations/runtime-build.d.ts +4 -0
  24. package/dist/integrations/runtime-build.js +32 -0
  25. package/dist/integrations/vite.d.ts +23 -0
  26. package/dist/integrations/vite.js +32 -0
  27. package/dist/integrations/webpack.d.ts +24 -0
  28. package/dist/integrations/webpack.js +21 -0
  29. package/dist/orcha.js +17 -8
  30. package/dist/playground/server.js +57 -7
  31. package/dist/project-loader.js +3 -0
  32. package/dist/providers/browser.d.ts +2 -0
  33. package/dist/providers/browser.js +20 -0
  34. package/dist/react-native.d.ts +2 -0
  35. package/dist/react-native.js +12 -0
  36. package/dist/runtime/actions/browser-native.d.ts +3 -0
  37. package/dist/runtime/actions/browser-native.js +28 -0
  38. package/dist/runtime/actions/execute.d.ts +7 -0
  39. package/dist/runtime/actions/execute.js +9 -2
  40. package/dist/runtime/agent.d.ts +1 -0
  41. package/dist/runtime/agent.js +8 -5
  42. package/dist/runtime/compiler-hook.d.ts +5 -0
  43. package/dist/runtime/compiler-hook.js +8 -0
  44. package/dist/runtime/create-orcha.d.ts +2 -1
  45. package/dist/runtime/create-orcha.js +15 -19
  46. package/dist/runtime/platform-browser.d.ts +2 -0
  47. package/dist/runtime/platform-browser.js +15 -0
  48. package/dist/runtime/platform-node.d.ts +2 -0
  49. package/dist/runtime/platform-node.js +31 -0
  50. package/dist/runtime/platform-react-native.d.ts +2 -0
  51. package/dist/runtime/platform-react-native.js +15 -0
  52. package/dist/runtime/platform.d.ts +15 -0
  53. package/dist/runtime/platform.js +1 -0
  54. package/dist/runtime/random-id.d.ts +1 -0
  55. package/dist/runtime/random-id.js +26 -0
  56. package/dist/runtime-entry.d.ts +5 -0
  57. package/dist/runtime-entry.js +2 -0
  58. package/dist/storage/browser-indexeddb.d.ts +7 -16
  59. package/dist/storage/browser-indexeddb.js +102 -19
  60. package/dist/storage/react-native-jsonl.d.ts +7 -16
  61. package/dist/storage/react-native-jsonl.js +65 -19
  62. package/dist/types.d.ts +3 -1
  63. package/dist-cjs/browser.js +48 -0
  64. package/dist-cjs/cli-agents-template.js +22 -0
  65. package/dist-cjs/compiler/build-project.js +97 -8
  66. package/dist-cjs/compiler/compile.js +17 -9
  67. package/dist-cjs/file-content.js +42 -7
  68. package/dist-cjs/index.js +4 -9
  69. package/dist-cjs/integrations/esbuild.js +6 -2
  70. package/dist-cjs/integrations/expo.js +29 -0
  71. package/dist-cjs/integrations/metro.js +51 -0
  72. package/dist-cjs/integrations/next.js +75 -0
  73. package/dist-cjs/integrations/runtime-build.js +70 -0
  74. package/dist-cjs/integrations/vite.js +57 -0
  75. package/dist-cjs/integrations/webpack.js +51 -0
  76. package/dist-cjs/orcha.js +17 -12
  77. package/dist-cjs/playground/server.js +62 -9
  78. package/dist-cjs/project-loader.js +10 -0
  79. package/dist-cjs/providers/browser.js +61 -0
  80. package/dist-cjs/react-native.js +48 -0
  81. package/dist-cjs/runtime/actions/browser-native.js +68 -0
  82. package/dist-cjs/runtime/actions/execute.js +12 -2
  83. package/dist-cjs/runtime/agent.js +8 -6
  84. package/dist-cjs/runtime/compiler-hook.js +37 -0
  85. package/dist-cjs/runtime/create-orcha.js +18 -21
  86. package/dist-cjs/runtime/platform-browser.js +48 -0
  87. package/dist-cjs/runtime/platform-node.js +59 -0
  88. package/dist-cjs/runtime/platform-react-native.js +45 -0
  89. package/dist-cjs/runtime/platform.js +17 -0
  90. package/dist-cjs/runtime/random-id.js +55 -0
  91. package/dist-cjs/runtime-entry.js +34 -0
  92. package/dist-cjs/storage/browser-indexeddb.js +102 -5
  93. package/dist-cjs/storage/react-native-jsonl.js +73 -5
  94. package/dist-cjs/types/react-native-async-storage.d.js +2 -0
  95. package/package.json +69 -9
  96. package/dist/playground/public/app.css +0 -1
  97. package/dist/playground/public/app.js +0 -31
  98. package/dist/playground/public/index.html +0 -15
  99. package/dist/playground/public/orcha-logo.svg +0 -4
@@ -0,0 +1,34 @@
1
+ "use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var runtime_entry_exports = {};
21
+ __export(runtime_entry_exports, {
22
+ OrchaError: () => import_errors.OrchaError,
23
+ exportSessionJsonl: () => import_migrate.exportSessionJsonl,
24
+ migrateSessionStore: () => import_migrate.migrateSessionStore
25
+ });
26
+ module.exports = __toCommonJS(runtime_entry_exports);
27
+ var import_errors = require("./errors.js");
28
+ var import_migrate = require("./storage/migrate.js");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ OrchaError,
32
+ exportSessionJsonl,
33
+ migrateSessionStore
34
+ });
@@ -22,16 +22,113 @@ __export(browser_indexeddb_exports, {
22
22
  BrowserIndexedDbSessionStore: () => BrowserIndexedDbSessionStore
23
23
  });
24
24
  module.exports = __toCommonJS(browser_indexeddb_exports);
25
+ const DATABASE_VERSION = 1;
26
+ const EVENT_STORE = "events";
25
27
  class BrowserIndexedDbSessionStore {
26
- async read(_sessionId) {
27
- throw new Error("Browser IndexedDB session storage is not implemented yet.");
28
+ #databaseName;
29
+ #namespace;
30
+ #listeners = /* @__PURE__ */ new Map();
31
+ #allListeners = /* @__PURE__ */ new Set();
32
+ constructor(namespace, databaseName = "orchajs") {
33
+ this.#namespace = namespace;
34
+ this.#databaseName = databaseName;
28
35
  }
29
- async append(_sessionId, _events) {
30
- throw new Error("Browser IndexedDB session storage is not implemented yet.");
36
+ async read(sessionId) {
37
+ const database = await this.#open();
38
+ const transaction = database.transaction(EVENT_STORE, "readonly");
39
+ const index = transaction.objectStore(EVENT_STORE).index("session");
40
+ const records = await request(
41
+ index.getAll(IDBKeyRange.only([this.#namespace, sessionId]))
42
+ );
43
+ await transactionComplete(transaction);
44
+ return records.sort((left, right) => left.sequence - right.sequence).map((record) => record.event);
45
+ }
46
+ async append(sessionId, events) {
47
+ if (events.length === 0) {
48
+ return;
49
+ }
50
+ const database = await this.#open();
51
+ const transaction = database.transaction(EVENT_STORE, "readwrite");
52
+ const store = transaction.objectStore(EVENT_STORE);
53
+ for (const event of events) {
54
+ store.add({
55
+ id: eventId(this.#namespace, sessionId, event.sequence),
56
+ namespace: this.#namespace,
57
+ sessionId,
58
+ sequence: event.sequence,
59
+ event
60
+ });
61
+ }
62
+ await transactionComplete(transaction);
63
+ this.#listeners.get(sessionId)?.forEach((listener) => listener(events));
64
+ this.#allListeners.forEach((listener) => listener(sessionId, events));
31
65
  }
32
66
  async listSessionIds() {
33
- throw new Error("Browser IndexedDB session storage is not implemented yet.");
67
+ const database = await this.#open();
68
+ const transaction = database.transaction(EVENT_STORE, "readonly");
69
+ const index = transaction.objectStore(EVENT_STORE).index("namespace");
70
+ const records = await request(
71
+ index.getAll(IDBKeyRange.only(this.#namespace))
72
+ );
73
+ await transactionComplete(transaction);
74
+ return [...new Set(records.map((record) => record.sessionId))].sort();
75
+ }
76
+ subscribe(sessionId, listener) {
77
+ const listeners = this.#listeners.get(sessionId) ?? /* @__PURE__ */ new Set();
78
+ listeners.add(listener);
79
+ this.#listeners.set(sessionId, listeners);
80
+ return () => {
81
+ listeners.delete(listener);
82
+ if (listeners.size === 0) {
83
+ this.#listeners.delete(sessionId);
84
+ }
85
+ };
86
+ }
87
+ subscribeAll(listener) {
88
+ this.#allListeners.add(listener);
89
+ return () => this.#allListeners.delete(listener);
90
+ }
91
+ async describeLocation(sessionId) {
92
+ return `indexeddb://${this.#databaseName}/${this.#namespace}/${sessionId}`;
34
93
  }
94
+ #open() {
95
+ if (typeof indexedDB === "undefined") {
96
+ throw new Error("IndexedDB is unavailable in this runtime.");
97
+ }
98
+ return new Promise((resolve, reject) => {
99
+ const openRequest = indexedDB.open(this.#databaseName, DATABASE_VERSION);
100
+ openRequest.onupgradeneeded = () => {
101
+ const database = openRequest.result;
102
+ if (database.objectStoreNames.contains(EVENT_STORE)) {
103
+ return;
104
+ }
105
+ const store = database.createObjectStore(EVENT_STORE, {
106
+ keyPath: "id"
107
+ });
108
+ store.createIndex("session", ["namespace", "sessionId"]);
109
+ store.createIndex("namespace", "namespace");
110
+ };
111
+ openRequest.onsuccess = () => resolve(openRequest.result);
112
+ openRequest.onerror = () => reject(openRequest.error);
113
+ openRequest.onblocked = () => reject(new Error("Opening the Orcha IndexedDB database was blocked."));
114
+ });
115
+ }
116
+ }
117
+ function eventId(namespace, sessionId, sequence) {
118
+ return `${namespace}\0${sessionId}\0${sequence.toString().padStart(12, "0")}`;
119
+ }
120
+ function request(value) {
121
+ return new Promise((resolve, reject) => {
122
+ value.onsuccess = () => resolve(value.result);
123
+ value.onerror = () => reject(value.error);
124
+ });
125
+ }
126
+ function transactionComplete(transaction) {
127
+ return new Promise((resolve, reject) => {
128
+ transaction.oncomplete = () => resolve();
129
+ transaction.onerror = () => reject(transaction.error);
130
+ transaction.onabort = () => reject(transaction.error ?? new Error("IndexedDB transaction aborted."));
131
+ });
35
132
  }
36
133
  // Annotate the CommonJS export names for ESM import in node:
37
134
  0 && (module.exports = {
@@ -1,8 +1,10 @@
1
1
  "use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
2
2
  "use strict";
3
+ var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
6
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
9
  var __export = (target, all) => {
8
10
  for (var name in all)
@@ -16,21 +18,87 @@ var __copyProps = (to, from, except, desc) => {
16
18
  }
17
19
  return to;
18
20
  };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
19
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
30
  var react_native_jsonl_exports = {};
21
31
  __export(react_native_jsonl_exports, {
22
32
  ReactNativeJsonlSessionStore: () => ReactNativeJsonlSessionStore
23
33
  });
24
34
  module.exports = __toCommonJS(react_native_jsonl_exports);
35
+ var import_async_storage = __toESM(require("@react-native-async-storage/async-storage"), 1);
36
+ const writes = /* @__PURE__ */ new Map();
25
37
  class ReactNativeJsonlSessionStore {
26
- async read(_sessionId) {
27
- throw new Error("React Native JSONL session storage is not implemented yet.");
38
+ #namespace;
39
+ #listeners = /* @__PURE__ */ new Map();
40
+ #allListeners = /* @__PURE__ */ new Set();
41
+ constructor(namespace) {
42
+ this.#namespace = namespace;
28
43
  }
29
- async append(_sessionId, _events) {
30
- throw new Error("React Native JSONL session storage is not implemented yet.");
44
+ async read(sessionId) {
45
+ const contents = await import_async_storage.default.getItem(this.#key(sessionId));
46
+ if (!contents) {
47
+ return [];
48
+ }
49
+ return contents.split("\n").filter(Boolean).map((line) => JSON.parse(line));
50
+ }
51
+ async append(sessionId, events) {
52
+ if (events.length === 0) {
53
+ return;
54
+ }
55
+ const key = this.#key(sessionId);
56
+ const previous = writes.get(key) ?? Promise.resolve();
57
+ const write = previous.then(async () => {
58
+ const existing = await import_async_storage.default.getItem(key);
59
+ const appended = events.map((event) => JSON.stringify(event)).join("\n");
60
+ await import_async_storage.default.setItem(
61
+ key,
62
+ `${existing ? `${existing.replace(/\n*$/, "")}
63
+ ` : ""}${appended}
64
+ `
65
+ );
66
+ });
67
+ writes.set(key, write);
68
+ try {
69
+ await write;
70
+ } finally {
71
+ if (writes.get(key) === write) {
72
+ writes.delete(key);
73
+ }
74
+ }
75
+ this.#listeners.get(sessionId)?.forEach((listener) => listener(events));
76
+ this.#allListeners.forEach((listener) => listener(sessionId, events));
31
77
  }
32
78
  async listSessionIds() {
33
- throw new Error("React Native JSONL session storage is not implemented yet.");
79
+ const prefix = `@orchajs:${this.#namespace}:`;
80
+ return (await import_async_storage.default.getAllKeys()).filter((key) => key.startsWith(prefix)).map((key) => key.slice(prefix.length)).sort();
81
+ }
82
+ subscribe(sessionId, listener) {
83
+ const listeners = this.#listeners.get(sessionId) ?? /* @__PURE__ */ new Set();
84
+ listeners.add(listener);
85
+ this.#listeners.set(sessionId, listeners);
86
+ return () => {
87
+ listeners.delete(listener);
88
+ if (listeners.size === 0) {
89
+ this.#listeners.delete(sessionId);
90
+ }
91
+ };
92
+ }
93
+ subscribeAll(listener) {
94
+ this.#allListeners.add(listener);
95
+ return () => this.#allListeners.delete(listener);
96
+ }
97
+ async describeLocation(sessionId) {
98
+ return `async-storage://${this.#key(sessionId)}`;
99
+ }
100
+ #key(sessionId) {
101
+ return `@orchajs:${this.#namespace}:${sessionId}`;
34
102
  }
35
103
  }
36
104
  // Annotate the CommonJS export names for ESM import in node:
@@ -0,0 +1,2 @@
1
+ "use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchajs",
3
- "version": "0.20.2",
3
+ "version": "0.21.0",
4
4
  "description": "A filesystem-convention, stateful agent framework for JavaScript.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -23,6 +23,8 @@
23
23
  "exports": {
24
24
  ".": {
25
25
  "types": "./dist/index.d.ts",
26
+ "react-native": "./dist/react-native.js",
27
+ "browser": "./dist/browser.js",
26
28
  "import": "./dist/index.js",
27
29
  "require": "./dist-cjs/index.js"
28
30
  },
@@ -40,6 +42,31 @@
40
42
  "types": "./dist/testing.d.ts",
41
43
  "import": "./dist/testing.js",
42
44
  "require": "./dist-cjs/testing.js"
45
+ },
46
+ "./vite": {
47
+ "types": "./dist/integrations/vite.d.ts",
48
+ "import": "./dist/integrations/vite.js",
49
+ "require": "./dist-cjs/integrations/vite.js"
50
+ },
51
+ "./webpack": {
52
+ "types": "./dist/integrations/webpack.d.ts",
53
+ "import": "./dist/integrations/webpack.js",
54
+ "require": "./dist-cjs/integrations/webpack.js"
55
+ },
56
+ "./next": {
57
+ "types": "./dist/integrations/next.d.ts",
58
+ "import": "./dist/integrations/next.js",
59
+ "require": "./dist-cjs/integrations/next.js"
60
+ },
61
+ "./metro": {
62
+ "types": "./dist/integrations/metro.d.ts",
63
+ "import": "./dist/integrations/metro.js",
64
+ "require": "./dist-cjs/integrations/metro.js"
65
+ },
66
+ "./expo": {
67
+ "types": "./dist/integrations/expo.d.ts",
68
+ "import": "./dist/integrations/expo.js",
69
+ "require": "./dist-cjs/integrations/expo.js"
43
70
  }
44
71
  },
45
72
  "typesVersions": {
@@ -52,11 +79,26 @@
52
79
  ],
53
80
  "testing": [
54
81
  "dist/testing.d.ts"
82
+ ],
83
+ "vite": [
84
+ "dist/integrations/vite.d.ts"
85
+ ],
86
+ "webpack": [
87
+ "dist/integrations/webpack.d.ts"
88
+ ],
89
+ "next": [
90
+ "dist/integrations/next.d.ts"
91
+ ],
92
+ "metro": [
93
+ "dist/integrations/metro.d.ts"
94
+ ],
95
+ "expo": [
96
+ "dist/integrations/expo.d.ts"
55
97
  ]
56
98
  }
57
99
  },
58
100
  "bin": {
59
- "orcha": "dist/cli.js"
101
+ "orcha": "dist/bin.js"
60
102
  },
61
103
  "files": [
62
104
  "dist",
@@ -65,7 +107,7 @@
65
107
  "LICENSE"
66
108
  ],
67
109
  "scripts": {
68
- "build": "node scripts/clean-dist.mjs && npm run build --workspace=@orchajs/playground-ui && tsc -p tsconfig.json && node scripts/build-cjs.mjs && tsc -p tsconfig.playground.json && node scripts/build-playground.mjs",
110
+ "build": "node scripts/clean-dist.mjs && npm run build --workspace=@orchajs/playground-ui && tsc -p tsconfig.json && node scripts/build-cjs.mjs && tsc -p tsconfig.playground.json",
69
111
  "dev": "tsc -p tsconfig.json --watch",
70
112
  "test": "npm run build && npm run test:runtime && npm run test:create-orcha",
71
113
  "test:runtime": "node --test tests/*.test.mjs",
@@ -81,19 +123,25 @@
81
123
  "engines": {
82
124
  "node": ">=18.20.8"
83
125
  },
84
- "dependencies": {
85
- "chokidar": "4.0.3",
86
- "dotenv": "16.6.1",
87
- "esbuild": "^0.25.9"
88
- },
89
126
  "peerDependencies": {
127
+ "@orchajs/playground-ui": ">=0.2.2 <1",
128
+ "@react-native-async-storage/async-storage": ">=2 <3",
90
129
  "@aws-sdk/client-bedrock-runtime": ">=3.864.0 <4",
91
130
  "@google/genai": ">=2.22.0 <3",
92
131
  "@jitl/quickjs-singlefile-cjs-release-sync": ">=0.32.0 <0.33",
93
132
  "better-sqlite3": ">=11.10.0 <12",
133
+ "chokidar": ">=4 <5",
134
+ "dotenv": ">=16 <17",
135
+ "esbuild": ">=0.25 <0.26",
94
136
  "quickjs-emscripten-core": ">=0.32.0 <0.33"
95
137
  },
96
138
  "peerDependenciesMeta": {
139
+ "@orchajs/playground-ui": {
140
+ "optional": true
141
+ },
142
+ "@react-native-async-storage/async-storage": {
143
+ "optional": true
144
+ },
97
145
  "@aws-sdk/client-bedrock-runtime": {
98
146
  "optional": true
99
147
  },
@@ -106,6 +154,15 @@
106
154
  "better-sqlite3": {
107
155
  "optional": true
108
156
  },
157
+ "chokidar": {
158
+ "optional": true
159
+ },
160
+ "dotenv": {
161
+ "optional": true
162
+ },
163
+ "esbuild": {
164
+ "optional": true
165
+ },
109
166
  "quickjs-emscripten-core": {
110
167
  "optional": true
111
168
  }
@@ -121,10 +178,13 @@
121
178
  "@types/react-dom": "^18.3.7",
122
179
  "@xyflow/react": "^12.11.6",
123
180
  "baseui": "^16.1.1",
181
+ "better-sqlite3": "11.10.0",
182
+ "chokidar": "4.0.3",
183
+ "dotenv": "16.6.1",
184
+ "esbuild": "^0.25.9",
124
185
  "react": "^18.3.1",
125
186
  "react-dom": "^18.3.1",
126
187
  "react-markdown": "^10.1.0",
127
- "better-sqlite3": "11.10.0",
128
188
  "quickjs-emscripten-core": "0.32.0",
129
189
  "styletron-engine-atomic": "^1.6.2",
130
190
  "styletron-react": "^6.1.1",
@@ -1 +0,0 @@
1
- .react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}