@agenshield/daemon 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 (124) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -0
  3. package/acl.d.ts +44 -0
  4. package/acl.d.ts.map +1 -0
  5. package/auth/index.d.ts +9 -0
  6. package/auth/index.d.ts.map +1 -0
  7. package/auth/middleware.d.ts +49 -0
  8. package/auth/middleware.d.ts.map +1 -0
  9. package/auth/passcode.d.ts +70 -0
  10. package/auth/passcode.d.ts.map +1 -0
  11. package/auth/session.d.ts +71 -0
  12. package/auth/session.d.ts.map +1 -0
  13. package/command-sync.d.ts +41 -0
  14. package/command-sync.d.ts.map +1 -0
  15. package/config/defaults.d.ts +10 -0
  16. package/config/defaults.d.ts.map +1 -0
  17. package/config/index.d.ts +7 -0
  18. package/config/index.d.ts.map +1 -0
  19. package/config/loader.d.ts +25 -0
  20. package/config/loader.d.ts.map +1 -0
  21. package/config/paths.d.ts +20 -0
  22. package/config/paths.d.ts.map +1 -0
  23. package/data/integration-catalog.d.ts +32 -0
  24. package/data/integration-catalog.d.ts.map +1 -0
  25. package/events/emitter.d.ts +126 -0
  26. package/events/emitter.d.ts.map +1 -0
  27. package/events/index.d.ts +5 -0
  28. package/events/index.d.ts.map +1 -0
  29. package/index.d.ts +19 -0
  30. package/index.d.ts.map +1 -0
  31. package/index.js +7591 -0
  32. package/main.d.ts +6 -0
  33. package/main.d.ts.map +1 -0
  34. package/main.js +7539 -0
  35. package/mcp/client.d.ts +73 -0
  36. package/mcp/client.d.ts.map +1 -0
  37. package/mcp/index.d.ts +7 -0
  38. package/mcp/index.d.ts.map +1 -0
  39. package/mcp/oauth-provider.d.ts +27 -0
  40. package/mcp/oauth-provider.d.ts.map +1 -0
  41. package/mcp/state.d.ts +31 -0
  42. package/mcp/state.d.ts.map +1 -0
  43. package/package.json +43 -0
  44. package/routes/agenco.d.ts +13 -0
  45. package/routes/agenco.d.ts.map +1 -0
  46. package/routes/auth.d.ts +11 -0
  47. package/routes/auth.d.ts.map +1 -0
  48. package/routes/config.d.ts +6 -0
  49. package/routes/config.d.ts.map +1 -0
  50. package/routes/discovery.d.ts +8 -0
  51. package/routes/discovery.d.ts.map +1 -0
  52. package/routes/exec.d.ts +6 -0
  53. package/routes/exec.d.ts.map +1 -0
  54. package/routes/fs.d.ts +6 -0
  55. package/routes/fs.d.ts.map +1 -0
  56. package/routes/health.d.ts +6 -0
  57. package/routes/health.d.ts.map +1 -0
  58. package/routes/index.d.ts +9 -0
  59. package/routes/index.d.ts.map +1 -0
  60. package/routes/marketplace.d.ts +9 -0
  61. package/routes/marketplace.d.ts.map +1 -0
  62. package/routes/rpc.d.ts +9 -0
  63. package/routes/rpc.d.ts.map +1 -0
  64. package/routes/secrets.d.ts +6 -0
  65. package/routes/secrets.d.ts.map +1 -0
  66. package/routes/security.d.ts +6 -0
  67. package/routes/security.d.ts.map +1 -0
  68. package/routes/skills.d.ts +11 -0
  69. package/routes/skills.d.ts.map +1 -0
  70. package/routes/sse.d.ts +9 -0
  71. package/routes/sse.d.ts.map +1 -0
  72. package/routes/status.d.ts +6 -0
  73. package/routes/status.d.ts.map +1 -0
  74. package/routes/wrappers.d.ts +12 -0
  75. package/routes/wrappers.d.ts.map +1 -0
  76. package/server.d.ts +18 -0
  77. package/server.d.ts.map +1 -0
  78. package/services/activity-log.d.ts +21 -0
  79. package/services/activity-log.d.ts.map +1 -0
  80. package/services/broker-bridge.d.ts +43 -0
  81. package/services/broker-bridge.d.ts.map +1 -0
  82. package/services/integration-skills.d.ts +26 -0
  83. package/services/integration-skills.d.ts.map +1 -0
  84. package/services/marketplace.d.ts +79 -0
  85. package/services/marketplace.d.ts.map +1 -0
  86. package/services/openclaw-config.d.ts +15 -0
  87. package/services/openclaw-config.d.ts.map +1 -0
  88. package/services/skill-analyzer.d.ts +21 -0
  89. package/services/skill-analyzer.d.ts.map +1 -0
  90. package/services/skill-lifecycle.d.ts +23 -0
  91. package/services/skill-lifecycle.d.ts.map +1 -0
  92. package/state/index.d.ts +76 -0
  93. package/state/index.d.ts.map +1 -0
  94. package/static.d.ts +9 -0
  95. package/static.d.ts.map +1 -0
  96. package/ui-assets/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  97. package/ui-assets/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  98. package/ui-assets/assets/index-CC_zbvUx.css +1 -0
  99. package/ui-assets/assets/index-Chp3YFDr.js +947 -0
  100. package/ui-assets/assets/manrope-latin-400-normal-8tf8FM3T.woff +0 -0
  101. package/ui-assets/assets/manrope-latin-400-normal-PaqtzbVb.woff2 +0 -0
  102. package/ui-assets/assets/manrope-latin-500-normal-BYYD-dBL.woff2 +0 -0
  103. package/ui-assets/assets/manrope-latin-500-normal-DMZssgOp.woff +0 -0
  104. package/ui-assets/assets/manrope-latin-600-normal-4f0koTD-.woff2 +0 -0
  105. package/ui-assets/assets/manrope-latin-600-normal-BqgrALkZ.woff +0 -0
  106. package/ui-assets/assets/manrope-latin-700-normal-BZp_XxE4.woff2 +0 -0
  107. package/ui-assets/assets/manrope-latin-700-normal-DGRFkw-m.woff +0 -0
  108. package/ui-assets/assets/manrope-latin-800-normal-BfWYOv1c.woff2 +0 -0
  109. package/ui-assets/assets/manrope-latin-800-normal-uHUdIJgA.woff +0 -0
  110. package/ui-assets/favicon.svg +1 -0
  111. package/ui-assets/index.html +14 -0
  112. package/ui-assets/package.json +34 -0
  113. package/utils/logged-fetch.d.ts +13 -0
  114. package/utils/logged-fetch.d.ts.map +1 -0
  115. package/vault/crypto.d.ts +28 -0
  116. package/vault/crypto.d.ts.map +1 -0
  117. package/vault/index.d.ts +64 -0
  118. package/vault/index.d.ts.map +1 -0
  119. package/watchers/index.d.ts +6 -0
  120. package/watchers/index.d.ts.map +1 -0
  121. package/watchers/security.d.ts +20 -0
  122. package/watchers/security.d.ts.map +1 -0
  123. package/watchers/skills.d.ts +85 -0
  124. package/watchers/skills.d.ts.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/services/marketplace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EAOrB,MAAM,iBAAiB,CAAC;AA0MzB;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAkCzF;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAC/C,KAAK,EAAE,oBAAoB,EAAE,GAC5B,IAAI,CAkBN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,IAAI,CAUvG;AAED,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,mBAAmB,EAAE,CA4B5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAqB5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAU/E;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAclF;AAMD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqGjF;AA4FD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,oBAAoB,EAAE,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAgB/B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAc/B;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAgDtC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenClaw Config Service
3
+ *
4
+ * Helpers to manage per-skill entries in $AGENT_HOME/.openclaw/openclaw.json.
5
+ * Skills are configured under skills.entries.<skillKey> with { enabled: boolean }.
6
+ */
7
+ /**
8
+ * Add a skill entry to openclaw.json with enabled: true.
9
+ */
10
+ export declare function addSkillEntry(slug: string, env?: Record<string, string>): void;
11
+ /**
12
+ * Remove a skill entry from openclaw.json.
13
+ */
14
+ export declare function removeSkillEntry(slug: string): void;
15
+ //# sourceMappingURL=openclaw-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-config.d.ts","sourceRoot":"","sources":["../../src/services/openclaw-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoCH;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAiB9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQnD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Skill Analyzer Service
3
+ *
4
+ * MVP: Extracts commands from skill metadata (frontmatter) and content (regex).
5
+ * Cloud API integration can be added later.
6
+ */
7
+ import type { SkillAnalysis } from '@agenshield/ipc';
8
+ /**
9
+ * Analyze a skill and return analysis results.
10
+ * MVP: metadata extraction + regex detection.
11
+ */
12
+ export declare function analyzeSkill(skillName: string, content: string, metadata?: Record<string, unknown>): SkillAnalysis;
13
+ /**
14
+ * Get cached analysis for a skill
15
+ */
16
+ export declare function getCachedAnalysis(skillName: string): SkillAnalysis | undefined;
17
+ /**
18
+ * Clear cached analysis for a skill
19
+ */
20
+ export declare function clearCachedAnalysis(skillName: string): void;
21
+ //# sourceMappingURL=skill-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-analyzer.d.ts","sourceRoot":"","sources":["../../src/services/skill-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,iBAAiB,CAAC;AAgJvE;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,aAAa,CAqEf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAG9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAI3D"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Skill Lifecycle Utilities
3
+ *
4
+ * Shared helpers for creating/removing skill wrappers and policies.
5
+ * Used by both skills routes and marketplace routes.
6
+ */
7
+ /**
8
+ * Create a bash wrapper in $AGENT_HOME/bin/<skill-name> that invokes the skill through policy.
9
+ */
10
+ export declare function createSkillWrapper(name: string, binDir: string): void;
11
+ /**
12
+ * Remove the skill wrapper from $AGENT_HOME/bin/<skill-name>.
13
+ */
14
+ export declare function removeSkillWrapper(name: string, binDir: string): void;
15
+ /**
16
+ * Add a PolicyConfig entry for the skill to the daemon config.
17
+ */
18
+ export declare function addSkillPolicy(name: string): void;
19
+ /**
20
+ * Remove the PolicyConfig entry for a skill from the daemon config.
21
+ */
22
+ export declare function removeSkillPolicy(name: string): void;
23
+ //# sourceMappingURL=skill-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-lifecycle.d.ts","sourceRoot":"","sources":["../../src/services/skill-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CASrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoBjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQpD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * System state manager
3
+ *
4
+ * Manages the state.json file for tracking AgenShield system state.
5
+ */
6
+ import type { SystemState, AgenCoState, DaemonState, UserState, GroupState, InstallationState, PasscodeProtectionState } from '@agenshield/ipc';
7
+ /**
8
+ * Get the state file path
9
+ */
10
+ export declare function getStatePath(): string;
11
+ /**
12
+ * Get default system state
13
+ */
14
+ export declare function getDefaultState(): SystemState;
15
+ /**
16
+ * Load system state from disk
17
+ * Returns default state if file doesn't exist or is invalid
18
+ */
19
+ export declare function loadState(): SystemState;
20
+ /**
21
+ * Save system state to disk
22
+ */
23
+ export declare function saveState(state: SystemState): void;
24
+ /**
25
+ * Update system state with partial updates
26
+ */
27
+ export declare function updateState(updates: Partial<SystemState>): SystemState;
28
+ /**
29
+ * Update daemon state
30
+ */
31
+ export declare function updateDaemonState(updates: Partial<DaemonState>): SystemState;
32
+ /**
33
+ * Update AgenCo state
34
+ */
35
+ export declare function updateAgenCoState(updates: Partial<AgenCoState>): SystemState;
36
+ /**
37
+ * Update installation state
38
+ */
39
+ export declare function updateInstallationState(updates: Partial<InstallationState>): SystemState;
40
+ /**
41
+ * Update passcode protection state
42
+ */
43
+ export declare function updatePasscodeProtectionState(updates: Partial<PasscodeProtectionState>): SystemState;
44
+ /**
45
+ * Get passcode protection state
46
+ */
47
+ export declare function getPasscodeProtectionState(): PasscodeProtectionState | undefined;
48
+ /**
49
+ * Add a user to state
50
+ */
51
+ export declare function addUserState(user: UserState): SystemState;
52
+ /**
53
+ * Remove a user from state
54
+ */
55
+ export declare function removeUserState(username: string): SystemState;
56
+ /**
57
+ * Add a group to state
58
+ */
59
+ export declare function addGroupState(group: GroupState): SystemState;
60
+ /**
61
+ * Remove a group from state
62
+ */
63
+ export declare function removeGroupState(name: string): SystemState;
64
+ /**
65
+ * Add a connected integration to AgenCo state
66
+ */
67
+ export declare function addConnectedIntegration(integrationId: string): SystemState;
68
+ /**
69
+ * Remove a connected integration from AgenCo state
70
+ */
71
+ export declare function removeConnectedIntegration(integrationId: string): SystemState;
72
+ /**
73
+ * Initialize state file if it doesn't exist
74
+ */
75
+ export declare function initializeState(): SystemState;
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAIhJ;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAqB7C;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,WAAW,CAuBvC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAUlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAyBtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAK5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAK5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAKxF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,WAAW,CAKpG;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,GAAG,SAAS,CAGhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAazD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAK7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAa5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAK1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAS1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAO7E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAU7C"}
package/static.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Static asset resolver for embedded UI
3
+ */
4
+ /**
5
+ * Get the path to UI assets
6
+ * @returns Path to UI assets or null if not found
7
+ */
8
+ export declare function getUiAssetsPath(): string | null;
9
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAc/C"}
@@ -0,0 +1 @@
1
+ @font-face{font-family:Manrope;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/manrope-latin-400-normal-PaqtzbVb.woff2) format("woff2"),url(/assets/manrope-latin-400-normal-8tf8FM3T.woff) format("woff")}@font-face{font-family:Manrope;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/manrope-latin-500-normal-BYYD-dBL.woff2) format("woff2"),url(/assets/manrope-latin-500-normal-DMZssgOp.woff) format("woff")}@font-face{font-family:Manrope;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/manrope-latin-600-normal-4f0koTD-.woff2) format("woff2"),url(/assets/manrope-latin-600-normal-BqgrALkZ.woff) format("woff")}@font-face{font-family:Manrope;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/manrope-latin-700-normal-BZp_XxE4.woff2) format("woff2"),url(/assets/manrope-latin-700-normal-DGRFkw-m.woff) format("woff")}@font-face{font-family:Manrope;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/manrope-latin-800-normal-BfWYOv1c.woff2) format("woff2"),url(/assets/manrope-latin-800-normal-uHUdIJgA.woff) format("woff")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff) format("woff")}.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: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--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}.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))}