agent-tower 0.1.5 → 0.1.7

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 (149) hide show
  1. package/dist/cli.js +11 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/mcp/index.js +21 -5
  4. package/dist/mcp/index.js.map +1 -1
  5. package/dist/routes/filesystem.d.ts.map +1 -1
  6. package/dist/routes/filesystem.js +62 -0
  7. package/dist/routes/filesystem.js.map +1 -1
  8. package/dist/routes/projects.d.ts.map +1 -1
  9. package/dist/routes/projects.js +6 -0
  10. package/dist/routes/projects.js.map +1 -1
  11. package/dist/services/copy-files.service.d.ts +8 -0
  12. package/dist/services/copy-files.service.d.ts.map +1 -0
  13. package/dist/services/copy-files.service.js +82 -0
  14. package/dist/services/copy-files.service.js.map +1 -0
  15. package/dist/services/notifications/notification.service.d.ts.map +1 -1
  16. package/dist/services/notifications/notification.service.js +5 -2
  17. package/dist/services/notifications/notification.service.js.map +1 -1
  18. package/dist/services/project.service.d.ts +15 -0
  19. package/dist/services/project.service.d.ts.map +1 -1
  20. package/dist/services/project.service.js +3 -0
  21. package/dist/services/project.service.js.map +1 -1
  22. package/dist/services/workspace.service.d.ts +17 -0
  23. package/dist/services/workspace.service.d.ts.map +1 -1
  24. package/dist/services/workspace.service.js +39 -0
  25. package/dist/services/workspace.service.js.map +1 -1
  26. package/dist/web/assets/AgentDemoPage-CHlsAeGt.js +1 -0
  27. package/dist/web/assets/{DemoPage-C4Z_ftHI.js → DemoPage-BuI7acbi.js} +1 -1
  28. package/dist/web/assets/NotificationSettingsPage-BGoKo6r7.js +1 -0
  29. package/dist/web/assets/{ProfileSettingsPage-Cs93rTRr.js → ProfileSettingsPage-DuWWMW-Z.js} +2 -2
  30. package/dist/web/assets/{ProjectKanbanPage-BmlRVfzo.js → ProjectKanbanPage-DsCdIAOu.js} +26 -26
  31. package/dist/web/assets/ProjectSettingsPage-CE8pGEMA.js +2 -0
  32. package/dist/web/assets/{api-client-CEBkg5lt.js → api-client-CvXTcmYq.js} +1 -1
  33. package/dist/web/assets/chevron-down-ml0TDwNN.js +1 -0
  34. package/dist/web/assets/{circle-alert-BEozlsMd.js → circle-alert-BxinJD1E.js} +1 -1
  35. package/dist/web/assets/code-block-OCS4YCEC-BcChVPQR.js +2 -0
  36. package/dist/web/assets/folder-picker-DQQA9MJl.js +1 -0
  37. package/dist/web/assets/{index-BuAijQvi.js → index-Bd8P8ri4.js} +7 -7
  38. package/dist/web/assets/index-RpcjVTWm.css +1 -0
  39. package/dist/web/assets/{loader-circle-yEIqsdJ1.js → loader-circle-DLsnUkgW.js} +1 -1
  40. package/dist/web/assets/{mermaid-NOHMQCX5-CIqtI2jF.js → mermaid-NOHMQCX5-hAoNEzYT.js} +43 -43
  41. package/dist/web/assets/modal-DAr55LDv.js +1 -0
  42. package/dist/web/assets/{query-keys-BD_s_Etj.js → query-keys-BAUd6IYD.js} +1 -1
  43. package/dist/web/assets/select-Bi3jfZzX.js +1 -0
  44. package/dist/web/assets/{use-profiles-Rh8rBsAt.js → use-profiles-DSKFDf9E.js} +1 -1
  45. package/dist/web/assets/use-projects-BUtm-JeL.js +1 -0
  46. package/dist/web/assets/x-I40qDFta.js +1 -0
  47. package/dist/web/index.html +2 -2
  48. package/node_modules/@agent-tower/shared/dist/types.d.ts +11 -0
  49. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  50. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  51. package/node_modules/prisma/node_modules/@prisma/debug/LICENSE +201 -0
  52. package/node_modules/prisma/node_modules/@prisma/debug/README.md +29 -0
  53. package/node_modules/prisma/node_modules/@prisma/debug/dist/index.d.ts +35 -0
  54. package/node_modules/prisma/node_modules/@prisma/debug/dist/index.js +236 -0
  55. package/node_modules/prisma/node_modules/@prisma/debug/dist/util.d.ts +2 -0
  56. package/node_modules/prisma/node_modules/@prisma/debug/dist/util.js +74 -0
  57. package/node_modules/prisma/node_modules/@prisma/debug/package.json +37 -0
  58. package/node_modules/prisma/node_modules/@prisma/engines-version/LICENSE +201 -0
  59. package/node_modules/prisma/node_modules/@prisma/engines-version/README.md +8 -0
  60. package/node_modules/prisma/node_modules/@prisma/engines-version/index.d.ts +1 -0
  61. package/node_modules/prisma/node_modules/@prisma/engines-version/index.js +5 -0
  62. package/node_modules/prisma/node_modules/@prisma/engines-version/package.json +27 -0
  63. package/node_modules/prisma/node_modules/@prisma/fetch-engine/LICENSE +201 -0
  64. package/node_modules/prisma/node_modules/@prisma/fetch-engine/README.md +8 -0
  65. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/BinaryType.d.ts +5 -0
  66. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/BinaryType.js +25 -0
  67. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chmodPlusX.d.ts +1 -0
  68. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chmodPlusX.js +25 -0
  69. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-2BCLJS3M.js +2385 -0
  70. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-4LX3XBNY.js +161 -0
  71. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-AH6QHEOA.js +66 -0
  72. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-CWGQAQ3T.js +49 -0
  73. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-FQ2BOR66.js +2457 -0
  74. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-KDPLGCY6.js +1404 -0
  75. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-KJ74H3SQ.js +2385 -0
  76. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-MX3HXAU2.js +44 -0
  77. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-PXQVM7NP.js +159 -0
  78. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-QLWYUM7O.js +8153 -0
  79. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-QSTZGX47.js +70 -0
  80. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-RGVHWUUH.js +2786 -0
  81. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-VTJS2JJN.js +4232 -0
  82. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/chunk-X37PZICB.js +29 -0
  83. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/cleanupCache.d.ts +1 -0
  84. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/cleanupCache.js +28 -0
  85. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/download.d.ts +27 -0
  86. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/download.js +41 -0
  87. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/downloadZip.d.ts +6 -0
  88. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/downloadZip.js +30 -0
  89. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/env.d.ts +14 -0
  90. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/env.js +29 -0
  91. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/getHash.d.ts +1 -0
  92. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/getHash.js +25 -0
  93. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/getProxyAgent.d.ts +3 -0
  94. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/getProxyAgent.js +25 -0
  95. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/index.d.ts +5 -0
  96. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/index.js +49 -0
  97. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/log.d.ts +2 -0
  98. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/log.js +25 -0
  99. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/multipart-parser-47FFAP42.js +371 -0
  100. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/utils.d.ts +11 -0
  101. package/node_modules/prisma/node_modules/@prisma/fetch-engine/dist/utils.js +29 -0
  102. package/node_modules/prisma/node_modules/@prisma/fetch-engine/package.json +59 -0
  103. package/node_modules/prisma/node_modules/@prisma/get-platform/LICENSE +201 -0
  104. package/node_modules/prisma/node_modules/@prisma/get-platform/README.md +16 -0
  105. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/assertNodeAPISupported.d.ts +4 -0
  106. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/assertNodeAPISupported.js +25 -0
  107. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/binaryTargets.d.ts +2 -0
  108. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/binaryTargets.js +26 -0
  109. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-2ESYSVXG.js +67 -0
  110. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-2U36ISZO.js +34 -0
  111. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-6HZWON4S.js +1 -0
  112. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-7MLUNQIZ.js +62 -0
  113. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-B23KD6U3.js +53 -0
  114. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-D7S5FGQN.js +367 -0
  115. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-FWMN4WME.js +41 -0
  116. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-M5NKJZ76.js +14956 -0
  117. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-O5EOXX3N.js +43 -0
  118. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-YDM7ULQH.js +580 -0
  119. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/chunk-YVXCXD3A.js +70 -0
  120. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/getNodeAPIName.d.ts +8 -0
  121. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/getNodeAPIName.js +25 -0
  122. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/getPlatform.d.ts +105 -0
  123. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/getPlatform.js +38 -0
  124. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/index.d.ts +7 -0
  125. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/index.js +43 -0
  126. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/link.d.ts +1 -0
  127. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/link.js +26 -0
  128. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/logger.d.ts +8 -0
  129. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/logger.js +29 -0
  130. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/binaryTargetRegex.d.ts +8 -0
  131. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/binaryTargetRegex.js +27 -0
  132. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/index.d.ts +1 -0
  133. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/index.js +28 -0
  134. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/jestContext.d.ts +108 -0
  135. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/jestContext.js +27 -0
  136. package/node_modules/prisma/node_modules/@prisma/get-platform/dist/test-utils/jestSnapshotSerializer.js +205 -0
  137. package/node_modules/prisma/node_modules/@prisma/get-platform/package.json +49 -0
  138. package/package.json +1 -1
  139. package/prisma/CLAUDE.md +11 -0
  140. package/prisma/migrations/20260225070554_add_project_config/migration.sql +117 -0
  141. package/prisma/migrations/20260225073151_add_quick_commands/migration.sql +2 -0
  142. package/prisma/migrations/migration_lock.toml +3 -0
  143. package/prisma/schema.prisma +3 -0
  144. package/dist/web/assets/AgentDemoPage-WdWEQtyU.js +0 -1
  145. package/dist/web/assets/NotificationSettingsPage-FrLfgt9y.js +0 -1
  146. package/dist/web/assets/code-block-OCS4YCEC-CGgYYS4A.js +0 -2
  147. package/dist/web/assets/folder-picker-BP3x3phB.js +0 -1
  148. package/dist/web/assets/index-CxV866Yg.css +0 -1
  149. package/dist/web/assets/modal-BoX2RXaV.js +0 -1
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var jestSnapshotSerializer_exports = {};
20
+ __export(jestSnapshotSerializer_exports, {
21
+ default: () => jestSnapshotSerializer_default
22
+ });
23
+ module.exports = __toCommonJS(jestSnapshotSerializer_exports);
24
+ var import_chunk_B23KD6U3 = require("../chunk-B23KD6U3.js");
25
+ var import_chunk_7MLUNQIZ = require("../chunk-7MLUNQIZ.js");
26
+ var import_chunk_2ESYSVXG = require("../chunk-2ESYSVXG.js");
27
+ var require_replace_string = (0, import_chunk_2ESYSVXG.__commonJS)({
28
+ "../../node_modules/.pnpm/replace-string@3.1.0/node_modules/replace-string/index.js"(exports, module2) {
29
+ "use strict";
30
+ module2.exports = (string, needle, replacement, options = {}) => {
31
+ if (typeof string !== "string") {
32
+ throw new TypeError(`Expected input to be a string, got ${typeof string}`);
33
+ }
34
+ if (!(typeof needle === "string" && needle.length > 0) || !(typeof replacement === "string" || typeof replacement === "function")) {
35
+ return string;
36
+ }
37
+ let result = "";
38
+ let matchCount = 0;
39
+ let prevIndex = options.fromIndex > 0 ? options.fromIndex : 0;
40
+ if (prevIndex > string.length) {
41
+ return string;
42
+ }
43
+ while (true) {
44
+ const index = options.caseInsensitive ? string.toLowerCase().indexOf(needle.toLowerCase(), prevIndex) : string.indexOf(needle, prevIndex);
45
+ if (index === -1) {
46
+ break;
47
+ }
48
+ matchCount++;
49
+ const replaceStr = typeof replacement === "string" ? replacement : replacement(
50
+ // If `caseInsensitive`` is enabled, the matched substring may be different from the needle.
51
+ string.slice(index, index + needle.length),
52
+ matchCount,
53
+ string,
54
+ index
55
+ );
56
+ const beginSlice = matchCount === 1 ? 0 : prevIndex;
57
+ result += string.slice(beginSlice, index) + replaceStr;
58
+ prevIndex = index + needle.length;
59
+ }
60
+ if (matchCount === 0) {
61
+ return string;
62
+ }
63
+ return result + string.slice(prevIndex);
64
+ };
65
+ }
66
+ });
67
+ var require_ansi_regex = (0, import_chunk_2ESYSVXG.__commonJS)({
68
+ "../../node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js"(exports, module2) {
69
+ "use strict";
70
+ module2.exports = ({ onlyFirst = false } = {}) => {
71
+ const pattern = [
72
+ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
73
+ "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"
74
+ ].join("|");
75
+ return new RegExp(pattern, onlyFirst ? void 0 : "g");
76
+ };
77
+ }
78
+ });
79
+ var require_strip_ansi = (0, import_chunk_2ESYSVXG.__commonJS)({
80
+ "../../node_modules/.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi/index.js"(exports, module2) {
81
+ "use strict";
82
+ var ansiRegex = require_ansi_regex();
83
+ module2.exports = (string) => typeof string === "string" ? string.replace(ansiRegex(), "") : string;
84
+ }
85
+ });
86
+ var require_jestSnapshotSerializer = (0, import_chunk_2ESYSVXG.__commonJS)({
87
+ "src/test-utils/jestSnapshotSerializer.js"(exports, module2) {
88
+ var path = (0, import_chunk_2ESYSVXG.__require)("path");
89
+ var replaceAll = require_replace_string();
90
+ var stripAnsi = require_strip_ansi();
91
+ var { binaryTargetRegex } = ((0, import_chunk_B23KD6U3.init_binaryTargetRegex)(), (0, import_chunk_2ESYSVXG.__toCommonJS)(import_chunk_B23KD6U3.binaryTargetRegex_exports));
92
+ var pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
93
+ function normalizePrismaPaths(str) {
94
+ return str.replace(/prisma\\([\w-]+)\.prisma/g, "prisma/$1.prisma").replace(/prisma\\seed\.ts/g, "prisma/seed.ts").replace(/custom-folder\\seed\.js/g, "custom-folder/seed.js");
95
+ }
96
+ function normalizeLogs(str) {
97
+ return str.replace(
98
+ /Started query engine http server on http:\/\/127\.0\.0\.1:\d{1,5}/g,
99
+ "Started query engine http server on http://127.0.0.1:00000"
100
+ ).replace(/Starting a postgresql pool with \d+ connections./g, "Starting a postgresql pool with XX connections.");
101
+ }
102
+ function normalizeTmpDir(str) {
103
+ return str.replace(/\/tmp\/([a-z0-9]+)\//g, "/tmp/dir/");
104
+ }
105
+ function trimErrorPaths(str) {
106
+ const parentDir = path.dirname(path.dirname(path.dirname(__dirname)));
107
+ return replaceAll(str, parentDir, "");
108
+ }
109
+ function normalizeToUnixPaths(str) {
110
+ return replaceAll(str, path.sep, "/");
111
+ }
112
+ function normalizeGitHubLinks(str) {
113
+ return str.replace(/https:\/\/github.com\/prisma\/prisma(-client-js)?\/issues\/new\S+/, "TEST_GITHUB_LINK");
114
+ }
115
+ function normalizeTsClientStackTrace(str) {
116
+ return str.replace(/([/\\]client[/\\]src[/\\]__tests__[/\\].*test\.ts)(:\d*:\d*)/, "$1:0:0").replace(/([/\\]client[/\\]tests[/\\]functional[/\\].*\.ts)(:\d*:\d*)/, "$1:0:0");
117
+ }
118
+ function removePlatforms(str) {
119
+ return str.replace(binaryTargetRegex, "TEST_PLATFORM");
120
+ }
121
+ function normalizeNodeApiLibFilePath(str) {
122
+ return str.replace(
123
+ /((lib)?query_engine-TEST_PLATFORM\.)(.*)(\.node)/g,
124
+ "libquery_engine-TEST_PLATFORM.LIBRARY_TYPE.node"
125
+ );
126
+ }
127
+ function normalizeBinaryFilePath(str) {
128
+ return str.replace(/\.exe(\s+)?(\W.*)/g, "$1$2").replace(/\.exe$/g, "");
129
+ }
130
+ function normalizeMigrateTimestamps(str) {
131
+ return str.replace(/(?<!\d)\d{14}(?!\d)/g, "20201231000000");
132
+ }
133
+ function normalizeDbUrl(str) {
134
+ return str.replace(/(localhost|postgres|mysql|mssql|mongodb_migrate|cockroachdb):(\d+)/g, "localhost:$2");
135
+ }
136
+ function normalizeRustError(str) {
137
+ return str.replace(/\/rustc\/(.+)\//g, "/rustc/hash/").replace(/(\[.*)(:\d*:\d*)(\])/g, "[/some/rust/path:0:0$3");
138
+ }
139
+ function normalizeRustCodeLocation(str) {
140
+ return str.replace(/(\w+\.rs):(\d+):(\d+)/g, "$1:0:0");
141
+ }
142
+ function normalizeArtificialPanic(str) {
143
+ return str.replace(/(Command failed with exit code 101:) (.+) /g, "$1 prisma-engines-path ");
144
+ }
145
+ function normalizeTime(str) {
146
+ return str.replace(/ \d+ms/g, " XXXms").replace(/ \d+(\.\d+)?s/g, " XXXms");
147
+ }
148
+ function prepareSchemaForSnapshot(str) {
149
+ if (!str.includes("tmp/prisma-tests/integration-test")) return str;
150
+ const urlRegex = /url\s*=\s*.+/;
151
+ const outputRegex = /output\s*=\s*.+/;
152
+ return str.split("\n").map((line) => {
153
+ const urlMatch = urlRegex.exec(line);
154
+ if (urlMatch) {
155
+ return `${line.slice(0, urlMatch.index)}url = "***"`;
156
+ }
157
+ const outputMatch = outputRegex.exec(line);
158
+ if (outputMatch) {
159
+ return `${line.slice(0, outputMatch.index)}output = "***"`;
160
+ }
161
+ return line;
162
+ }).join("\n");
163
+ }
164
+ function wrapWithQuotes(str) {
165
+ return `"${str}"`;
166
+ }
167
+ module2.exports = {
168
+ // Expected by Jest
169
+ test(value) {
170
+ return typeof value === "string" || value instanceof Error;
171
+ },
172
+ serialize(value) {
173
+ const message = typeof value === "string" ? value : value instanceof Error ? value.message : "";
174
+ return pipe(
175
+ stripAnsi,
176
+ // integration-tests pkg
177
+ prepareSchemaForSnapshot,
178
+ // Generic
179
+ normalizeTmpDir,
180
+ normalizeTime,
181
+ // From Client package
182
+ normalizeGitHubLinks,
183
+ removePlatforms,
184
+ normalizeNodeApiLibFilePath,
185
+ normalizeBinaryFilePath,
186
+ normalizeTsClientStackTrace,
187
+ trimErrorPaths,
188
+ normalizePrismaPaths,
189
+ normalizeLogs,
190
+ // remove windows \\
191
+ normalizeToUnixPaths,
192
+ // From Migrate/CLI package
193
+ normalizeDbUrl,
194
+ normalizeRustError,
195
+ normalizeRustCodeLocation,
196
+ normalizeMigrateTimestamps,
197
+ // artificial panic
198
+ normalizeArtificialPanic,
199
+ wrapWithQuotes
200
+ )(message);
201
+ }
202
+ };
203
+ }
204
+ });
205
+ var jestSnapshotSerializer_default = require_jestSnapshotSerializer();
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@prisma/get-platform",
3
+ "version": "5.22.0",
4
+ "description": "This package is intended for Prisma's internal use",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "license": "Apache-2.0",
8
+ "author": "Tim Suchanek <suchanek@prisma.io>",
9
+ "homepage": "https://www.prisma.io",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/prisma/prisma.git",
13
+ "directory": "packages/get-platform"
14
+ },
15
+ "bugs": "https://github.com/prisma/prisma/issues",
16
+ "devDependencies": {
17
+ "@codspeed/benchmark.js-plugin": "3.1.1",
18
+ "@swc/core": "1.6.13",
19
+ "@swc/jest": "0.2.36",
20
+ "@types/jest": "29.5.12",
21
+ "@types/node": "18.19.31",
22
+ "benchmark": "2.1.4",
23
+ "jest": "29.7.0",
24
+ "jest-junit": "16.0.0",
25
+ "typescript": "5.4.5",
26
+ "escape-string-regexp": "4.0.0",
27
+ "execa": "5.1.1",
28
+ "fs-jetpack": "5.1.0",
29
+ "kleur": "4.1.5",
30
+ "replace-string": "3.1.0",
31
+ "strip-ansi": "6.0.1",
32
+ "tempy": "1.0.1",
33
+ "terminal-link": "2.1.1",
34
+ "ts-pattern": "5.2.0"
35
+ },
36
+ "dependencies": {
37
+ "@prisma/debug": "5.22.0"
38
+ },
39
+ "files": [
40
+ "README.md",
41
+ "dist"
42
+ ],
43
+ "sideEffects": false,
44
+ "scripts": {
45
+ "dev": "DEV=true tsx helpers/build.ts",
46
+ "build": "tsx helpers/build.ts",
47
+ "test": "jest"
48
+ }
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-tower",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "AI Agent Task Management Dashboard",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,11 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 25, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #2547 | 2:59 PM | 🔵 | Project-level configuration feature research completed | ~626 |
11
+ </claude-mem-context>
@@ -0,0 +1,117 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Project" (
3
+ "id" TEXT NOT NULL PRIMARY KEY,
4
+ "name" TEXT NOT NULL,
5
+ "description" TEXT,
6
+ "repoPath" TEXT NOT NULL,
7
+ "mainBranch" TEXT NOT NULL DEFAULT 'main',
8
+ "copyFiles" TEXT,
9
+ "setupScript" TEXT,
10
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
11
+ "updatedAt" DATETIME NOT NULL
12
+ );
13
+
14
+ -- CreateTable
15
+ CREATE TABLE "Task" (
16
+ "id" TEXT NOT NULL PRIMARY KEY,
17
+ "title" TEXT NOT NULL,
18
+ "description" TEXT,
19
+ "status" TEXT NOT NULL DEFAULT 'TODO',
20
+ "priority" INTEGER NOT NULL DEFAULT 0,
21
+ "position" INTEGER NOT NULL DEFAULT 0,
22
+ "projectId" TEXT NOT NULL,
23
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
24
+ "updatedAt" DATETIME NOT NULL,
25
+ CONSTRAINT "Task_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE
26
+ );
27
+
28
+ -- CreateTable
29
+ CREATE TABLE "Workspace" (
30
+ "id" TEXT NOT NULL PRIMARY KEY,
31
+ "taskId" TEXT NOT NULL,
32
+ "branchName" TEXT NOT NULL,
33
+ "worktreePath" TEXT NOT NULL,
34
+ "status" TEXT NOT NULL DEFAULT 'ACTIVE',
35
+ "commitMessage" TEXT,
36
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
37
+ "updatedAt" DATETIME NOT NULL,
38
+ CONSTRAINT "Workspace_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task" ("id") ON DELETE CASCADE ON UPDATE CASCADE
39
+ );
40
+
41
+ -- CreateTable
42
+ CREATE TABLE "Session" (
43
+ "id" TEXT NOT NULL PRIMARY KEY,
44
+ "workspaceId" TEXT NOT NULL,
45
+ "agentType" TEXT NOT NULL,
46
+ "variant" TEXT NOT NULL DEFAULT 'DEFAULT',
47
+ "prompt" TEXT NOT NULL,
48
+ "status" TEXT NOT NULL DEFAULT 'PENDING',
49
+ "purpose" TEXT NOT NULL DEFAULT 'CHAT',
50
+ "logSnapshot" TEXT,
51
+ "tokenUsage" TEXT,
52
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
53
+ "updatedAt" DATETIME NOT NULL,
54
+ CONSTRAINT "Session_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace" ("id") ON DELETE CASCADE ON UPDATE CASCADE
55
+ );
56
+
57
+ -- CreateTable
58
+ CREATE TABLE "ExecutionProcess" (
59
+ "id" TEXT NOT NULL PRIMARY KEY,
60
+ "sessionId" TEXT NOT NULL,
61
+ "pid" INTEGER,
62
+ "exitCode" INTEGER,
63
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
64
+ "updatedAt" DATETIME NOT NULL,
65
+ CONSTRAINT "ExecutionProcess_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "Session" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
+ );
67
+
68
+ -- CreateTable
69
+ CREATE TABLE "ExecutionLog" (
70
+ "id" TEXT NOT NULL PRIMARY KEY,
71
+ "processId" TEXT NOT NULL,
72
+ "content" TEXT NOT NULL,
73
+ "timestamp" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
74
+ );
75
+
76
+ -- CreateTable
77
+ CREATE TABLE "Attachment" (
78
+ "id" TEXT NOT NULL PRIMARY KEY,
79
+ "originalName" TEXT NOT NULL,
80
+ "mimeType" TEXT NOT NULL,
81
+ "sizeBytes" INTEGER NOT NULL,
82
+ "storagePath" TEXT NOT NULL,
83
+ "hash" TEXT NOT NULL,
84
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
85
+ );
86
+
87
+ -- CreateTable
88
+ CREATE TABLE "NotificationSettings" (
89
+ "id" TEXT NOT NULL PRIMARY KEY DEFAULT 'singleton',
90
+ "osNotificationEnabled" BOOLEAN NOT NULL DEFAULT true,
91
+ "thirdPartyChannel" TEXT NOT NULL DEFAULT 'none',
92
+ "feishuWebhookUrl" TEXT,
93
+ "thirdPartyBaseUrl" TEXT,
94
+ "taskInReviewTitleTemplate" TEXT NOT NULL DEFAULT 'Agent Tower',
95
+ "taskInReviewBodyTemplate" TEXT NOT NULL DEFAULT '✅ "{taskTitle}" 已完成,等待审查'
96
+ );
97
+
98
+ -- CreateIndex
99
+ CREATE INDEX "Task_projectId_idx" ON "Task"("projectId");
100
+
101
+ -- CreateIndex
102
+ CREATE INDEX "Task_status_idx" ON "Task"("status");
103
+
104
+ -- CreateIndex
105
+ CREATE INDEX "Workspace_taskId_idx" ON "Workspace"("taskId");
106
+
107
+ -- CreateIndex
108
+ CREATE INDEX "Session_workspaceId_idx" ON "Session"("workspaceId");
109
+
110
+ -- CreateIndex
111
+ CREATE INDEX "ExecutionProcess_sessionId_idx" ON "ExecutionProcess"("sessionId");
112
+
113
+ -- CreateIndex
114
+ CREATE INDEX "ExecutionLog_processId_idx" ON "ExecutionLog"("processId");
115
+
116
+ -- CreateIndex
117
+ CREATE INDEX "Attachment_hash_idx" ON "Attachment"("hash");
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "Project" ADD COLUMN "quickCommands" TEXT;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (i.e. Git)
3
+ provider = "sqlite"
@@ -14,6 +14,9 @@ model Project {
14
14
  description String?
15
15
  repoPath String
16
16
  mainBranch String @default("main")
17
+ copyFiles String? // 逗号分隔的 glob/路径列表,worktree 创建后自动复制
18
+ setupScript String? // 多行命令文本,worktree 创建后自动执行
19
+ quickCommands String? // JSON: [{ name, command }],终端快捷命令
17
20
  createdAt DateTime @default(now())
18
21
  updatedAt DateTime @updatedAt
19
22
  tasks Task[]
@@ -1 +0,0 @@
1
- import{c as b,r as s,j as e,L as W}from"./index-BuAijQvi.js";import{a as f,B as y}from"./api-client-CEBkg5lt.js";import{u as Q,a as X,b as L,c as Y,d as Z,e as ee,S as te,f as se,T as ne,P as re,G as ae,h as le}from"./mermaid-NOHMQCX5-CIqtI2jF.js";import{d as ie}from"./use-profiles-Rh8rBsAt.js";import"./query-keys-BD_s_Etj.js";const oe=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],ce=b("at-sign",oe);const de=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],xe=b("chevron-up",de);const me=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],ue=b("hash",me);const pe=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],he=b("send",pe),ge=!0;function ye(){const[w,_]=s.useState([]),[l,S]=s.useState(""),[d,k]=s.useState("DEFAULT"),[i,A]=s.useState(""),[r,D]=s.useState(null),[a,o]=s.useState("idle"),[h,E]=s.useState(!1),[x,j]=s.useState(""),$=s.useRef(null),C=s.useRef(null),m=s.useRef(null),{data:u}=ie(l),H=u?Object.keys(u):["DEFAULT"],U=t=>{S(t),k("DEFAULT")},F=s.useCallback(t=>{o(t===0?"stopped":"error")},[]),M=s.useCallback(t=>{console.error("Agent error:",t),o("error")},[]),{isConnected:p,isAttached:g,logs:v,entries:V,agentSessionId:I,attach:z,clearLogs:P}=Q({sessionId:r||"",onExit:F,onError:M}),{todos:R}=X(V);s.useEffect(()=>{f.get("/demo/agents").then(t=>{_(t.agents);const n=t.agents.find(N=>N.available);n&&S(n.type)})},[]),s.useEffect(()=>{$.current?.scrollToBottom("smooth")},[v]),s.useEffect(()=>{console.log(`[AgentDemoPage:useEffect] t=${Date.now()} sessionId=${r} isConnected=${p} isAttached=${g}`),r&&p&&!g&&(console.log(`[AgentDemoPage:useEffect] t=${Date.now()} calling attach()`),z())},[r,p,g,z]);const B=t=>{if(j(t.target.value),m.current){m.current.style.height="auto";const N=Math.min(m.current.scrollHeight,210);m.current.style.height=`${N}px`}},G=async()=>{if(!l||!i.trim())return;const t=Date.now();console.log(`[AgentDemoPage:handleStart] t=${t} starting...`),o("starting"),P();try{const n=await f.post("/demo/start",{agentType:l,prompt:i.trim(),variant:d});ge&&console.log(`[AgentDemoPage:handleStart] t=${Date.now()} apiTime=${Date.now()-t}ms sessionId=${n.sessionId}`),D(n.sessionId),o("running")}catch(n){console.error("Start failed:",n),o("error")}},T=async()=>{if(!r||!x.trim())return;const t=x.trim();j("");try{await f.post(`/demo/${r}/message`,{message:t})}catch(n){console.error("Send failed:",n)}},O=async()=>{if(r)try{await f.post(`/demo/${r}/stop`),o("stopped")}catch(t){console.error("Stop failed:",t)}},K=()=>{D(null),o("idle"),A(""),j(""),P()},q=a==="running",c=r!==null,J=w.find(t=>t.type===l);return e.jsxs("div",{className:"flex flex-col h-full bg-white",children:[e.jsxs("div",{className:"px-8 py-5 border-b border-neutral-100 bg-white transition-all duration-300",children:[e.jsxs("div",{className:"flex items-center flex-wrap gap-3",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"text-base font-medium text-blue-600",children:"Agent Demo"}),e.jsx("span",{className:"text-neutral-300 text-sm",children:"/"}),e.jsx("span",{className:"text-xl font-bold text-neutral-900 tracking-tight",children:c?i.slice(0,50)+(i.length>50?"...":""):"新会话"})]}),e.jsxs("div",{className:"flex items-center",children:[a==="running"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-blue-50 text-blue-700 rounded-full text-xs font-medium border border-blue-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-pulse"}),e.jsx("span",{children:"Running"})]}),a==="stopped"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-emerald-50 text-emerald-700 rounded-full text-xs font-medium border border-emerald-100",children:[e.jsx(Y,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Done"})]}),a==="idle"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-neutral-100 text-neutral-600 rounded-full text-xs font-medium border border-neutral-200",children:[e.jsx(Z,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Idle"})]}),a==="starting"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-amber-50 text-amber-700 rounded-full text-xs font-medium border border-amber-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-spin"}),e.jsx("span",{children:"Starting..."})]}),a==="error"&&e.jsx("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-red-50 text-red-700 rounded-full text-xs font-medium border border-red-100",children:e.jsx("span",{children:"Error"})})]})]}),c&&e.jsxs("div",{className:"mt-1.5 flex items-start gap-2 group max-w-4xl",children:[e.jsx("div",{className:`text-sm text-neutral-600 leading-relaxed cursor-pointer transition-all ${h?"":"truncate"}`,onClick:()=>E(!h),children:i}),e.jsx("button",{onClick:()=>E(!h),className:"mt-0.5 text-neutral-400 opacity-0 group-hover:opacity-100 hover:text-neutral-600 transition-opacity",children:h?e.jsx(xe,{size:14}):e.jsx(ee,{size:14})})]}),e.jsxs("div",{className:"flex items-center gap-6 mt-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Agent"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-900 font-medium bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:J?.name||l||"未选择"})]}),d!=="DEFAULT"&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Variant"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-700 font-medium bg-blue-50 px-2 py-1 rounded border border-blue-100",children:d})]}),I&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Session"}),e.jsxs("div",{className:"flex items-center gap-1.5 text-neutral-700 font-mono bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:[I.slice(0,8),"..."]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"连接"}),e.jsx("div",{className:`flex items-center gap-1.5 font-medium px-2 py-1 rounded border ${p?"text-emerald-700 bg-emerald-50 border-emerald-100":"text-neutral-500 bg-neutral-50 border-neutral-100"}`,children:p?g?"已连接":"连接中...":"未连接"})]}),c&&e.jsx(y,{variant:"outline",size:"sm",onClick:K,className:"ml-auto",children:"新会话"}),e.jsxs(W,{to:"/settings/profiles",className:`flex items-center gap-1.5 text-xs text-neutral-500 hover:text-neutral-900 transition-colors ${c?"":"ml-auto"}`,children:[e.jsx(te,{size:14}),e.jsx("span",{children:"Profiles 设置"})]})]})]}),e.jsx("div",{ref:C,className:"flex-1 overflow-y-auto px-8 py-6",children:c?e.jsx("div",{className:"min-h-[200px]",children:v.length===0?e.jsx("div",{className:"text-neutral-400 text-center py-8",children:"等待 Agent 响应..."}):e.jsx(se,{ref:$,logs:v,scrollElementRef:C})}):e.jsxs("div",{className:"max-w-2xl mx-auto space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"选择 Agent"}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:w.map(t=>e.jsxs(y,{variant:l===t.type?"default":"outline",disabled:!t.available,onClick:()=>U(t.type),children:[t.name,t.available&&t.version&&` (${t.version})`,!t.available&&" (不可用)"]},t.type))})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"配置变体 (Profile Variant)"}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:H.map(t=>e.jsx("button",{onClick:()=>k(t),className:`px-3 py-1.5 rounded-full text-sm font-medium border transition-colors ${d===t?"bg-neutral-900 text-white border-neutral-900":"bg-white text-neutral-600 border-neutral-200 hover:border-neutral-400"}`,children:t},t))}),u&&u[d]&&e.jsx("p",{className:"mt-2 text-xs text-neutral-500 font-mono",children:Object.entries(u[d]).map(([t,n])=>`${t}: ${JSON.stringify(n)}`).join(", ")})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:"输入任务"}),e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{value:i,onChange:t=>A(t.target.value),rows:4,placeholder:"描述你想让 Agent 完成的任务...",className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm"}),e.jsx("div",{className:"flex items-center justify-end px-3 pb-3 pt-1",children:e.jsx(y,{onClick:G,disabled:a==="starting"||!l||!i.trim(),children:a==="starting"?"启动中...":"开始"})})]})]})]})}),c&&R.length>0&&e.jsx("div",{className:"px-8 py-2 bg-white border-t border-neutral-100",children:e.jsx(ne,{todos:R})}),c&&e.jsx("div",{className:"px-8 py-6 border-t border-neutral-100 bg-white",children:e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{ref:m,value:x,onChange:B,rows:3,placeholder:"发送消息给 Agent...",className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm scrollbar-thin scrollbar-thumb-neutral-200 scrollbar-track-transparent",style:{minHeight:"80px",maxHeight:"210px"},onKeyDown:t=>{t.key==="Enter"&&!t.shiftKey&&!t.repeat&&!t.nativeEvent.isComposing&&t.nativeEvent.keyCode!==229&&(t.preventDefault(),T())}}),e.jsxs("div",{className:"flex items-center justify-between px-3 pb-3 pt-1 border-t border-transparent",children:[e.jsxs("div",{className:"flex items-center gap-1 text-neutral-400",children:[e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Attach File",children:e.jsx(re,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Mention",children:e.jsx(ce,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Reference Issue",children:e.jsx(ue,{size:18})}),e.jsx("div",{className:"w-px h-4 bg-neutral-200 mx-1"}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Search Web",children:e.jsx(ae,{size:18})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[q&&e.jsxs("button",{onClick:O,className:"flex items-center gap-2 px-3 py-2 text-xs font-semibold text-red-600 bg-red-50 hover:bg-red-100 rounded-lg transition-colors",children:[e.jsx(le,{size:12,fill:"currentColor"}),e.jsx("span",{children:"Stop"})]}),e.jsxs("button",{onClick:T,disabled:!x.trim(),className:`flex items-center gap-2 px-3 py-2 text-xs font-semibold rounded-lg transition-all ${x.trim()?"bg-neutral-900 text-white hover:bg-black shadow-sm":"bg-neutral-100 text-neutral-400 cursor-not-allowed"}`,children:[e.jsx("span",{children:"Send"}),e.jsx(he,{size:14})]})]})]})]})})]})}export{ye as AgentDemoPage};
@@ -1 +0,0 @@
1
- import{c as j,u as S,r as a,j as e}from"./index-BuAijQvi.js";import{u as E,a as y,q as N}from"./query-keys-BD_s_Etj.js";import{a as x,B as g}from"./api-client-CEBkg5lt.js";import{L as I}from"./loader-circle-yEIqsdJ1.js";import{C as P}from"./circle-alert-BEozlsMd.js";const q=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],z=j("circle-check",q);const R=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]],L=j("link",R);function B(){return E({queryKey:N.notifications.settings,queryFn:()=>x.get("/notifications/settings")})}function A(){const s=S();return y({mutationFn:c=>x.put("/notifications/settings",c),onSuccess:()=>{s.invalidateQueries({queryKey:N.notifications.settings})}})}function F(){return y({mutationFn:s=>x.post("/notifications/test",s)})}const _=[{value:"none",label:"无"},{value:"feishu",label:"飞书"}];function $(){const{data:s,isLoading:c}=B(),r=A(),l=F(),[n,p]=a.useState({webhookUrl:"",baseUrl:"",titleTemplate:"",bodyTemplate:""}),[u,h]=a.useState(!1),[f,i]=a.useState("idle"),d=a.useRef(void 0);if(a.useEffect(()=>{s&&!u&&p({webhookUrl:s.feishuWebhookUrl??"",baseUrl:s.thirdPartyBaseUrl??"",titleTemplate:s.taskInReviewTitleTemplate??"",bodyTemplate:s.taskInReviewBodyTemplate??""})},[s,u]),a.useEffect(()=>(l.isSuccess?(i("success"),d.current=setTimeout(()=>i("idle"),3e3)):l.isError&&(i("error"),d.current=setTimeout(()=>i("idle"),5e3)),()=>clearTimeout(d.current)),[l.isSuccess,l.isError]),c)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:"加载中..."});const m=s?.osNotificationEnabled??!0,b=s?.thirdPartyChannel??"none",o=(t,C)=>{p(U=>({...U,[t]:C})),h(!0)},k=()=>{r.mutate({osNotificationEnabled:!m})},v=t=>{r.mutate({thirdPartyChannel:t})},T=()=>{r.mutate({feishuWebhookUrl:n.webhookUrl.trim()||null,thirdPartyBaseUrl:n.baseUrl.trim()||null,taskInReviewTitleTemplate:n.titleTemplate.trim()||"Agent Tower",taskInReviewBodyTemplate:n.bodyTemplate.trim()||'✅ "{taskTitle}" 已完成,等待审查'},{onSuccess:()=>h(!1)})},w=()=>{n.webhookUrl.trim()&&l.mutate({channel:"feishu",webhookUrl:n.webhookUrl.trim(),baseUrl:n.baseUrl.trim()||void 0})};return e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-3xl space-y-8",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"系统通知"}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:"任务完成时弹出桌面通知"}),e.jsx("button",{onClick:k,className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${m?"bg-neutral-900":"bg-neutral-200"}`,children:e.jsx("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${m?"translate-x-[18px]":"translate-x-[3px]"}`})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"第三方通知"}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:"选择一个第三方渠道接收通知"}),e.jsx("select",{value:b,onChange:t=>v(t.target.value),className:"px-3 py-1.5 border border-neutral-200 rounded-lg text-sm text-neutral-700 focus:outline-none focus:ring-1 focus:ring-neutral-300 bg-white",children:_.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value))}),b==="feishu"&&e.jsxs("div",{className:"mt-4 space-y-4",children:[e.jsxs("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-1 text-[13px] font-medium text-neutral-700 mb-1",children:[e.jsx(L,{size:12}),"Webhook URL"]}),e.jsx("input",{type:"text",value:n.webhookUrl,onChange:t=>o("webhookUrl",t.target.value),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/...",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(g,{size:"sm",variant:"outline",onClick:w,disabled:!n.webhookUrl.trim()||l.isPending,children:[l.isPending&&e.jsx(I,{size:12,className:"animate-spin mr-1"}),"测试发送"]}),f==="success"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-green-600",children:[e.jsx(z,{size:12}),"发送成功"]}),f==="error"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-red-500",children:[e.jsx(P,{size:12}),"发送失败"]})]})]}),e.jsx("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"跳转地址(用于生成任务链接)"}),e.jsx("input",{type:"text",value:n.baseUrl,onChange:t=>o("baseUrl",t.target.value),placeholder:"http://localhost:5173",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsxs("p",{className:"text-[11px] text-neutral-400 mt-1",children:['通知卡片中的"查看任务"按钮将跳转到 ',"{baseUrl}/projects/{projectId}/tasks/{taskId}"]})]})})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:"通知模板"}),e.jsxs("p",{className:"text-[12px] text-neutral-400 mb-3",children:["支持变量: ","{taskTitle}",", ","{taskId}",", ","{projectId}",", ","{projectName}",", ","{status}"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"标题模板"}),e.jsx("input",{type:"text",value:n.titleTemplate,onChange:t=>o("titleTemplate",t.target.value),placeholder:"Agent Tower",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:"内容模板"}),e.jsx("textarea",{value:n.bodyTemplate,onChange:t=>o("bodyTemplate",t.target.value),placeholder:'✅ "{taskTitle}" 已完成,等待审查',rows:2,className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300 resize-none"})]})]})]}),u&&e.jsx("div",{className:"sticky bottom-6 flex justify-end",children:e.jsx(g,{size:"sm",onClick:T,disabled:r.isPending,children:r.isPending?"保存中...":"保存所有更改"})})]})}export{$ as NotificationSettingsPage};
@@ -1,2 +0,0 @@
1
- import{L as h,Z as x,I as p,g as u}from"./mermaid-NOHMQCX5-CIqtI2jF.js";import{r as i,j as a}from"./index-BuAijQvi.js";import"./api-client-CEBkg5lt.js";var v=u("block","before:content-[counter(line)]","before:inline-block","before:[counter-increment:line]","before:w-6","before:mr-4","before:text-[13px]","before:text-right","before:text-muted-foreground/50","before:font-mono","before:select-none"),k=r=>{let e={};for(let l of r.split(";")){let n=l.indexOf(":");if(n>0){let c=l.slice(0,n).trim(),o=l.slice(n+1).trim();c&&o&&(e[c]=o)}}return e},j=i.memo(({children:r,result:e,language:l,className:n,...c})=>{let o=i.useMemo(()=>{let s={};return e.bg&&(s["--sdm-bg"]=e.bg),e.fg&&(s["--sdm-fg"]=e.fg),e.rootStyle&&Object.assign(s,k(e.rootStyle)),s},[e.bg,e.fg,e.rootStyle]);return a.jsx("pre",{className:u(n,"p-4 text-sm","bg-[var(--sdm-bg,transparent)]","dark:bg-[var(--shiki-dark-bg,var(--sdm-bg,transparent))]"),"data-language":l,"data-streamdown":"code-block-body",style:o,...c,children:a.jsx("code",{className:"[counter-increment:line_0] [counter-reset:line]",children:e.tokens.map((s,d)=>a.jsx("span",{className:v,children:s.map((t,b)=>a.jsx("span",{className:u("text-[var(--sdm-c,inherit)]","dark:text-[var(--shiki-dark,var(--sdm-c,inherit))]",t.bgColor&&"bg-[var(--sdm-tbg)]",t.bgColor&&"dark:bg-[var(--shiki-dark-bg,var(--sdm-tbg))]"),style:{...t.color?{"--sdm-c":t.color}:{},...t.bgColor?{"--sdm-tbg":t.bgColor}:{},...t.htmlStyle},...t.htmlAttrs,children:t.content},b))},d))})})},(r,e)=>r.result===e.result&&r.language===e.language&&r.className===e.className),y=({className:r,language:e,style:l,...n})=>a.jsx("div",{className:u("my-4 w-full overflow-hidden rounded-xl border border-border",r),"data-language":e,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...l},...n}),N=({language:r,children:e})=>a.jsxs("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-language":r,"data-streamdown":"code-block-header",children:[a.jsx("span",{className:"ml-1 font-mono lowercase",children:r}),a.jsx("div",{className:"flex items-center gap-2",children:e})]}),w=/\n+$/,E=({code:r,language:e,className:l,children:n,...c})=>{let{shikiTheme:o}=i.useContext(h),s=x(),d=i.useMemo(()=>r.replace(w,""),[r]),t=i.useMemo(()=>({bg:"transparent",fg:"inherit",tokens:d.split(`
2
- `).map(g=>[{content:g,color:"inherit",bgColor:"transparent",htmlStyle:{},offset:0}])}),[d]),[b,m]=i.useState(t);return i.useEffect(()=>{if(!s){m(t);return}let g=s.highlight({code:d,language:e,themes:o},f=>{m(f)});if(g){m(g);return}m(t)},[d,e,o,s,t]),a.jsx(p.Provider,{value:{code:r},children:a.jsxs(y,{language:e,children:[a.jsx(N,{language:e,children:n}),a.jsx(j,{className:l,language:e,result:b,...c})]})})};export{E as CodeBlock};
@@ -1 +0,0 @@
1
- import{c as H,r as a,j as e}from"./index-BuAijQvi.js";import{a as k,c}from"./api-client-CEBkg5lt.js";import{C}from"./mermaid-NOHMQCX5-CIqtI2jF.js";import{L as w}from"./loader-circle-yEIqsdJ1.js";import{C as E}from"./circle-alert-BEozlsMd.js";import{F as z}from"./ProjectKanbanPage-BmlRVfzo.js";import"./query-keys-BD_s_Etj.js";import"./modal-BoX2RXaV.js";const K=[["path",{d:"M18 19a5 5 0 0 1-5-5v8",key:"sz5oeg"}],["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5",key:"1w6njk"}],["circle",{cx:"13",cy:"12",r:"2",key:"1j92g6"}],["circle",{cx:"20",cy:"19",r:"2",key:"1obnsp"}]],S=H("folder-git-2",K);function T({value:l,onChange:m,placeholder:G}){const[x,V]=a.useState(""),[p,D]=a.useState([]),[h,L]=a.useState(""),[R,f]=a.useState(!1),[j,g]=a.useState(null),[d,N]=a.useState(l),[b,n]=a.useState(null),[P,v]=a.useState(!1),y=a.useRef(!1);a.useEffect(()=>{N(l)},[l]);const r=a.useCallback(async t=>{f(!0),g(null);try{const s={};t&&(s.path=t);const u=await k.get("/filesystem/browse",{params:s});V(u.current),L(u.parent),D(u.dirs)}catch(s){g(s instanceof Error?s.message:"Failed to browse directory")}finally{f(!1)}},[]);a.useEffect(()=>{y.current||(y.current=!0,r())},[r]);const i=a.useCallback(async t=>{v(!0),n(null);try{const s=await k.get("/filesystem/validate",{params:{path:t}});s.valid?(m(t),n(null)):n(s.error??"Not a Git repository")}catch(s){n(s instanceof Error?s.message:"Validation failed")}finally{v(!1)}},[m]),F=a.useCallback(t=>{t.isGitRepo?(i(t.path),r(t.path)):(r(t.path),n(null))},[i,r]),o=x?x.split("/").filter(Boolean):[],I=a.useCallback(t=>{const s="/"+o.slice(0,t+1).join("/");r(s),n(null)},[o,r]),B=a.useCallback(t=>{if(t.key==="Enter"&&!t.nativeEvent.isComposing&&t.nativeEvent.keyCode!==229){t.preventDefault();const s=d.trim();s&&(r(s),i(s))}},[d,r,i]);return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"text",value:d,onChange:t=>N(t.target.value),onKeyDown:B,placeholder:G??"e.g., /Users/me/projects/my-repo",className:c("w-full px-3 py-2 border rounded-lg text-sm font-mono focus:outline-none transition-colors pr-8",l?"border-emerald-300 bg-emerald-50/50 focus:border-emerald-400":"border-neutral-200 focus:border-neutral-400")}),l&&e.jsx(S,{size:14,className:"absolute right-3 top-1/2 -translate-y-1/2 text-emerald-500"})]}),e.jsx("p",{className:"text-xs text-neutral-400",children:"Browse and select a Git repository, or type a path and press Enter"}),e.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-neutral-500 overflow-x-auto pb-1 scrollbar-none",children:[e.jsx("button",{onClick:()=>r("/"),className:"hover:text-neutral-900 transition-colors flex-shrink-0 px-1 py-0.5 rounded hover:bg-neutral-100",children:"/"}),o.map((t,s)=>e.jsxs("span",{className:"flex items-center gap-0.5 flex-shrink-0",children:[e.jsx(C,{size:10,className:"text-neutral-300"}),e.jsx("button",{onClick:()=>I(s),className:c("px-1 py-0.5 rounded transition-colors truncate max-w-[120px]",s===o.length-1?"font-medium text-neutral-900":"hover:text-neutral-900 hover:bg-neutral-100"),children:t})]},s))]}),e.jsx("div",{className:"border border-neutral-200 rounded-lg overflow-hidden",children:e.jsx("div",{className:"max-h-[200px] overflow-y-auto",children:R?e.jsxs("div",{className:"flex items-center justify-center py-8 text-neutral-400",children:[e.jsx(w,{size:16,className:"animate-spin mr-2"}),e.jsx("span",{className:"text-xs",children:"Loading..."})]}):j?e.jsxs("div",{className:"flex items-center justify-center py-8 text-red-500 gap-2",children:[e.jsx(E,{size:14}),e.jsx("span",{className:"text-xs",children:j})]}):p.length===0?e.jsx("div",{className:"flex items-center justify-center py-8 text-neutral-400",children:e.jsx("span",{className:"text-xs",children:"No subdirectories"})}):e.jsxs("ul",{className:"divide-y divide-neutral-100",children:[x!==h&&e.jsx("li",{children:e.jsxs("button",{onClick:()=>r(h),className:"w-full flex items-center gap-2.5 px-3 py-2 text-left hover:bg-neutral-50 transition-colors group",children:[e.jsx(z,{size:14,className:"text-neutral-400 flex-shrink-0"}),e.jsx("span",{className:"text-xs text-neutral-500 group-hover:text-neutral-700",children:".."})]})}),p.map(t=>e.jsx("li",{children:e.jsxs("button",{onClick:()=>F(t),className:c("w-full flex items-center gap-2.5 px-3 py-2 text-left transition-colors group",t.path===l?"bg-emerald-50":"hover:bg-neutral-50"),children:[t.isGitRepo?e.jsx(S,{size:14,className:"text-emerald-500 flex-shrink-0"}):e.jsx(z,{size:14,className:"text-neutral-400 flex-shrink-0"}),e.jsx("span",{className:c("text-xs truncate",t.path===l?"font-medium text-emerald-700":"text-neutral-700 group-hover:text-neutral-900"),children:t.name}),t.isGitRepo&&e.jsx("span",{className:"ml-auto flex-shrink-0 text-[10px] font-medium bg-emerald-100 text-emerald-600 px-1.5 py-0.5 rounded",children:"Git"}),!t.isGitRepo&&e.jsx(C,{size:12,className:"ml-auto text-neutral-300 group-hover:text-neutral-400 flex-shrink-0"})]})},t.path))]})})}),P&&e.jsxs("div",{className:"flex items-center gap-2 text-xs text-neutral-400",children:[e.jsx(w,{size:12,className:"animate-spin"}),e.jsx("span",{children:"Validating..."})]}),b&&e.jsxs("div",{className:"flex items-center gap-2 text-xs text-red-500",children:[e.jsx(E,{size:12}),e.jsx("span",{children:b})]})]})}export{T as FolderPicker};
@@ -1 +0,0 @@
1
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-950:oklch(25.8% .092 26.042);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-600:oklch(60% .118 184.704);--color-cyan-600:oklch(60.9% .126 221.723);--color-sky-600:oklch(58.8% .158 241.966);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-600:oklch(51.1% .262 276.966);--color-violet-600:oklch(54.1% .281 293.009);--color-pink-600:oklch(59.2% .249 .584);--color-rose-600:oklch(58.6% .253 17.585);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-size:16px}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground);-webkit-tap-highlight-color:transparent}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1\/2{top:50%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-0\.5{right:calc(var(--spacing)*.5)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-6{margin-inline:calc(var(--spacing)*6)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.my-1\.5{margin-block:calc(var(--spacing)*1.5)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-8{margin-right:calc(var(--spacing)*8)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-0\.5{margin-left:calc(var(--spacing)*-.5)}.-ml-\[2px\]{margin-left:-2px}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-28{max-height:calc(var(--spacing)*28)}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-\[200px\]{max-height:200px}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[40px\]{min-height:40px}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-40{width:calc(var(--spacing)*40)}.w-44{width:calc(var(--spacing)*44)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-80{width:calc(var(--spacing)*80)}.w-\[14px\]{width:14px}.w-\[260px\]{width:260px}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[85\%\]{max-width:85%}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[40px\]{min-width:40px}.min-w-\[120px\]{min-width:120px}.min-w-\[160px\]{min-width:160px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.origin-top-left{transform-origin:0 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[18px\]{--tw-translate-x:18px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px*var(--tw-space-y-reverse));margin-block-end:calc(1px*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-neutral-100>:not(:last-child)){border-color:var(--color-neutral-100)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) + 8px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-md{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.rounded-tr-sm{border-top-right-radius:calc(var(--radius) - 4px)}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.\!border-neutral-800{border-color:var(--color-neutral-800)!important}.border-\[\#333\]{border-color:#333}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-400{border-color:var(--color-blue-400)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-300{border-color:var(--color-emerald-300)}.border-neutral-50{border-color:var(--color-neutral-50)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-400{border-color:var(--color-neutral-400)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-900{border-color:var(--color-neutral-900)}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.border-t-neutral-900{border-top-color:var(--color-neutral-900)}.\!bg-neutral-900{background-color:var(--color-neutral-900)!important}.bg-\[\#1e1e1e\]{background-color:#1e1e1e}.bg-\[\#2d2d2d\]{background-color:#2d2d2d}.bg-\[\#333\]{background-color:#333}.bg-\[\#252526\]{background-color:#252526}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-background{background-color:var(--background)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/50{background-color:#eff6ff80}@supports (color:color-mix(in lab,red,red)){.bg-blue-50\/50{background-color:color-mix(in oklab,var(--color-blue-50)50%,transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/30{background-color:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/50{background-color:#ecfdf580}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/50{background-color:color-mix(in oklab,var(--color-emerald-50)50%,transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-emerald-950\/40{background-color:#002c2266}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/40{background-color:color-mix(in oklab,var(--color-emerald-950)40%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab,red,red)){.bg-neutral-50\/50{background-color:color-mix(in oklab,var(--color-neutral-50)50%,transparent)}}.bg-neutral-50\/80{background-color:#fafafacc}@supports (color:color-mix(in lab,red,red)){.bg-neutral-50\/80{background-color:color-mix(in oklab,var(--color-neutral-50)80%,transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-100\/60{background-color:#f5f5f599}@supports (color:color-mix(in lab,red,red)){.bg-neutral-100\/60{background-color:color-mix(in oklab,var(--color-neutral-100)60%,transparent)}}.bg-neutral-100\/80{background-color:#f5f5f5cc}@supports (color:color-mix(in lab,red,red)){.bg-neutral-100\/80{background-color:color-mix(in oklab,var(--color-neutral-100)80%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-200\/60{background-color:#e5e5e599}@supports (color:color-mix(in lab,red,red)){.bg-neutral-200\/60{background-color:color-mix(in oklab,var(--color-neutral-200)60%,transparent)}}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-primary{background-color:var(--primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-950\/40{background-color:#46080966}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/40{background-color:color-mix(in oklab,var(--color-red-950)40%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white)60%,transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white)80%,transparent)}}.bg-\[repeating-conic-gradient\(\#f3f3f3_0\%_25\%\,\#fff_0\%_50\%\)\]{background-image:repeating-conic-gradient(#f3f3f3 0% 25%,#fff 0% 50%)}.bg-\[length\:16px_16px\]{background-size:16px 16px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-10{padding-inline:calc(var(--spacing)*10)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-\[3px\]{padding-block:3px}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-2\.5{padding-top:calc(var(--spacing)*2.5)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-1\.5{padding-bottom:calc(var(--spacing)*1.5)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-\[14px\]{--tw-leading:14px;line-height:14px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-neutral-100{color:var(--color-neutral-100)!important}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-cyan-600{color:var(--color-cyan-600)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-foreground{color:var(--foreground)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-600{color:var(--color-green-600)}.text-indigo-600{color:var(--color-indigo-600)}.text-muted-foreground{color:var(--muted-foreground)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-pink-600{color:var(--color-pink-600)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-rose-600{color:var(--color-rose-600)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sky-600{color:var(--color-sky-600)}.text-teal-600{color:var(--color-teal-600)}.text-violet-600{color:var(--color-violet-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-neutral-300{-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.placeholder-neutral-400::placeholder{color:var(--color-neutral-400)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.opacity-100{opacity:1}.\!shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_-2px_6px_rgba\(0\,0\,0\,0\.02\)\]{--tw-shadow:0 -2px 6px var(--tw-shadow-color,#00000005);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-neutral-200\/50{--tw-shadow-color:#e5e5e580}@supports (color:color-mix(in lab,red,red)){.shadow-neutral-200\/50{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-neutral-200)50%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.fade-in{--tw-enter-opacity:0}.paused{animation-play-state:paused}.running{animation-play-state:running}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}@media(hover:hover){.group-hover\:flex:is(:where(.group):hover *){display:flex}.group-hover\:border-neutral-300:is(:where(.group):hover *){border-color:var(--color-neutral-300)}.group-hover\:text-neutral-400:is(:where(.group):hover *){color:var(--color-neutral-400)}.group-hover\:text-neutral-500:is(:where(.group):hover *){color:var(--color-neutral-500)}.group-hover\:text-neutral-700:is(:where(.group):hover *){color:var(--color-neutral-700)}.group-hover\:text-neutral-800:is(:where(.group):hover *){color:var(--color-neutral-800)}.group-hover\:text-neutral-900:is(:where(.group):hover *){color:var(--color-neutral-900)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-1:before{content:var(--tw-content);top:calc(var(--spacing)*1)}.before\:bottom-2:before{content:var(--tw-content);bottom:calc(var(--spacing)*2)}.before\:left-\[7px\]:before{content:var(--tw-content);left:7px}.before\:w-px:before{content:var(--tw-content);width:1px}.before\:bg-neutral-100:before{content:var(--tw-content);background-color:var(--color-neutral-100)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:border-neutral-300:focus-within{border-color:var(--color-neutral-300)}.focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-neutral-300:focus-within{--tw-ring-color:var(--color-neutral-300)}@media(hover:hover){.hover\:border-neutral-200:hover{border-color:var(--color-neutral-200)}.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:border-neutral-400:hover{border-color:var(--color-neutral-400)}.hover\:bg-\[\#333\]:hover{background-color:#333}.hover\:bg-\[\#444\]:hover{background-color:#444}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-emerald-50:hover{background-color:var(--color-emerald-50)}.hover\:bg-emerald-100:hover{background-color:var(--color-emerald-100)}.hover\:bg-emerald-700:hover{background-color:var(--color-emerald-700)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-100\/80:hover{background-color:#f5f5f5cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-neutral-100\/80:hover{background-color:color-mix(in oklab,var(--color-neutral-100)80%,transparent)}}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-neutral-200\/50:hover{background-color:#e5e5e580}@supports (color:color-mix(in lab,red,red)){.hover\:bg-neutral-200\/50:hover{background-color:color-mix(in oklab,var(--color-neutral-200)50%,transparent)}}.hover\:bg-neutral-300:hover{background-color:var(--color-neutral-300)}.hover\:bg-neutral-900:hover{background-color:var(--color-neutral-900)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-neutral-300:hover{color:var(--color-neutral-300)}.hover\:text-neutral-500:hover{color:var(--color-neutral-500)}.hover\:text-neutral-600:hover{color:var(--color-neutral-600)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}.hover\:text-neutral-800:hover{color:var(--color-neutral-800)}.hover\:text-neutral-900:hover{color:var(--color-neutral-900)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-emerald-300:focus{border-color:var(--color-emerald-300)}.focus\:border-emerald-400:focus{border-color:var(--color-emerald-400)}.focus\:border-neutral-300:focus{border-color:var(--color-neutral-300)}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-emerald-500\/20:focus{--tw-ring-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.focus\:ring-emerald-500\/20:focus{--tw-ring-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.focus\:ring-neutral-300:focus{--tw-ring-color:var(--color-neutral-300)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.active\:bg-black:active{background-color:var(--color-black)}.active\:bg-blue-400:active{background-color:var(--color-blue-400)}.active\:bg-neutral-50:active{background-color:var(--color-neutral-50)}.active\:bg-neutral-400:active{background-color:var(--color-neutral-400)}.active\:bg-red-50:active{background-color:var(--color-red-50)}.active\:bg-red-600:active{background-color:var(--color-red-600)}.active\:text-neutral-600:active{color:var(--color-neutral-600)}.active\:text-neutral-900:active{color:var(--color-neutral-900)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-neutral-50:disabled{background-color:var(--color-neutral-50)}.disabled\:text-neutral-500:disabled{color:var(--color-neutral-500)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing)*1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.pb-safe{padding-bottom:env(safe-area-inset-bottom,0px)}.pt-safe{padding-top:env(safe-area-inset-top,0px)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}