@av-pi-studio/server 0.0.1

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 (315) hide show
  1. package/README.md +411 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/agent/agent-manager.d.ts +107 -0
  4. package/dist/agent/agent-manager.d.ts.map +1 -0
  5. package/dist/agent/agent-manager.js +218 -0
  6. package/dist/agent/agent-manager.js.map +1 -0
  7. package/dist/agent/agent-service.d.ts +36 -0
  8. package/dist/agent/agent-service.d.ts.map +1 -0
  9. package/dist/agent/agent-service.js +195 -0
  10. package/dist/agent/agent-service.js.map +1 -0
  11. package/dist/agent/index.d.ts +17 -0
  12. package/dist/agent/index.d.ts.map +1 -0
  13. package/dist/agent/index.js +18 -0
  14. package/dist/agent/index.js.map +1 -0
  15. package/dist/agent/manifest.d.ts +7 -0
  16. package/dist/agent/manifest.d.ts.map +1 -0
  17. package/dist/agent/manifest.js +27 -0
  18. package/dist/agent/manifest.js.map +1 -0
  19. package/dist/agent/mcp-server.d.ts +100 -0
  20. package/dist/agent/mcp-server.d.ts.map +1 -0
  21. package/dist/agent/mcp-server.js +163 -0
  22. package/dist/agent/mcp-server.js.map +1 -0
  23. package/dist/agent/permissions.d.ts +71 -0
  24. package/dist/agent/permissions.d.ts.map +1 -0
  25. package/dist/agent/permissions.js +132 -0
  26. package/dist/agent/permissions.js.map +1 -0
  27. package/dist/agent/provider-contract.d.ts +134 -0
  28. package/dist/agent/provider-contract.d.ts.map +1 -0
  29. package/dist/agent/provider-contract.js +2 -0
  30. package/dist/agent/provider-contract.js.map +1 -0
  31. package/dist/agent/provider-registry.d.ts +37 -0
  32. package/dist/agent/provider-registry.d.ts.map +1 -0
  33. package/dist/agent/provider-registry.js +92 -0
  34. package/dist/agent/provider-registry.js.map +1 -0
  35. package/dist/agent/provider-snapshot.d.ts +52 -0
  36. package/dist/agent/provider-snapshot.d.ts.map +1 -0
  37. package/dist/agent/provider-snapshot.js +73 -0
  38. package/dist/agent/provider-snapshot.js.map +1 -0
  39. package/dist/agent/providers/mock/mock-provider.d.ts +44 -0
  40. package/dist/agent/providers/mock/mock-provider.d.ts.map +1 -0
  41. package/dist/agent/providers/mock/mock-provider.js +162 -0
  42. package/dist/agent/providers/mock/mock-provider.js.map +1 -0
  43. package/dist/agent/providers/pi/agent.d.ts +80 -0
  44. package/dist/agent/providers/pi/agent.d.ts.map +1 -0
  45. package/dist/agent/providers/pi/agent.js +322 -0
  46. package/dist/agent/providers/pi/agent.js.map +1 -0
  47. package/dist/agent/providers/pi/event-mapper.d.ts +17 -0
  48. package/dist/agent/providers/pi/event-mapper.d.ts.map +1 -0
  49. package/dist/agent/providers/pi/event-mapper.js +150 -0
  50. package/dist/agent/providers/pi/event-mapper.js.map +1 -0
  51. package/dist/agent/providers/pi/rpc-transport.d.ts +53 -0
  52. package/dist/agent/providers/pi/rpc-transport.d.ts.map +1 -0
  53. package/dist/agent/providers/pi/rpc-transport.js +190 -0
  54. package/dist/agent/providers/pi/rpc-transport.js.map +1 -0
  55. package/dist/agent/providers/pi/session-hydration.d.ts +11 -0
  56. package/dist/agent/providers/pi/session-hydration.d.ts.map +1 -0
  57. package/dist/agent/providers/pi/session-hydration.js +167 -0
  58. package/dist/agent/providers/pi/session-hydration.js.map +1 -0
  59. package/dist/agent/rewind-rpc.d.ts +15 -0
  60. package/dist/agent/rewind-rpc.d.ts.map +1 -0
  61. package/dist/agent/rewind-rpc.js +30 -0
  62. package/dist/agent/rewind-rpc.js.map +1 -0
  63. package/dist/agent/session-operations.d.ts +32 -0
  64. package/dist/agent/session-operations.d.ts.map +1 -0
  65. package/dist/agent/session-operations.js +130 -0
  66. package/dist/agent/session-operations.js.map +1 -0
  67. package/dist/agent/structured-generation.d.ts +39 -0
  68. package/dist/agent/structured-generation.d.ts.map +1 -0
  69. package/dist/agent/structured-generation.js +78 -0
  70. package/dist/agent/structured-generation.js.map +1 -0
  71. package/dist/agent/timeline-rpc.d.ts +21 -0
  72. package/dist/agent/timeline-rpc.d.ts.map +1 -0
  73. package/dist/agent/timeline-rpc.js +59 -0
  74. package/dist/agent/timeline-rpc.js.map +1 -0
  75. package/dist/agent/timeline-store.d.ts +100 -0
  76. package/dist/agent/timeline-store.d.ts.map +1 -0
  77. package/dist/agent/timeline-store.js +255 -0
  78. package/dist/agent/timeline-store.js.map +1 -0
  79. package/dist/auth/index.d.ts +2 -0
  80. package/dist/auth/index.d.ts.map +1 -0
  81. package/dist/auth/index.js +3 -0
  82. package/dist/auth/index.js.map +1 -0
  83. package/dist/auth/password-auth.d.ts +44 -0
  84. package/dist/auth/password-auth.d.ts.map +1 -0
  85. package/dist/auth/password-auth.js +78 -0
  86. package/dist/auth/password-auth.js.map +1 -0
  87. package/dist/config/daemon-config.d.ts +634 -0
  88. package/dist/config/daemon-config.d.ts.map +1 -0
  89. package/dist/config/daemon-config.js +258 -0
  90. package/dist/config/daemon-config.js.map +1 -0
  91. package/dist/config/index.d.ts +3 -0
  92. package/dist/config/index.d.ts.map +1 -0
  93. package/dist/config/index.js +4 -0
  94. package/dist/config/index.js.map +1 -0
  95. package/dist/config/project-config.d.ts +104 -0
  96. package/dist/config/project-config.d.ts.map +1 -0
  97. package/dist/config/project-config.js +106 -0
  98. package/dist/config/project-config.js.map +1 -0
  99. package/dist/daemon/bootstrap.d.ts +37 -0
  100. package/dist/daemon/bootstrap.d.ts.map +1 -0
  101. package/dist/daemon/bootstrap.js +448 -0
  102. package/dist/daemon/bootstrap.js.map +1 -0
  103. package/dist/daemon/dev-bootstrap.d.ts +14 -0
  104. package/dist/daemon/dev-bootstrap.d.ts.map +1 -0
  105. package/dist/daemon/dev-bootstrap.js +231 -0
  106. package/dist/daemon/dev-bootstrap.js.map +1 -0
  107. package/dist/daemon/dev-main.d.ts +3 -0
  108. package/dist/daemon/dev-main.d.ts.map +1 -0
  109. package/dist/daemon/dev-main.js +36 -0
  110. package/dist/daemon/dev-main.js.map +1 -0
  111. package/dist/daemon/index.d.ts +15 -0
  112. package/dist/daemon/index.d.ts.map +1 -0
  113. package/dist/daemon/index.js +21 -0
  114. package/dist/daemon/index.js.map +1 -0
  115. package/dist/daemon/main.d.ts +3 -0
  116. package/dist/daemon/main.d.ts.map +1 -0
  117. package/dist/daemon/main.js +29 -0
  118. package/dist/daemon/main.js.map +1 -0
  119. package/dist/daemon/orchestration-rpc.d.ts +19 -0
  120. package/dist/daemon/orchestration-rpc.d.ts.map +1 -0
  121. package/dist/daemon/orchestration-rpc.js +136 -0
  122. package/dist/daemon/orchestration-rpc.js.map +1 -0
  123. package/dist/files/download-token-store.d.ts +14 -0
  124. package/dist/files/download-token-store.d.ts.map +1 -0
  125. package/dist/files/download-token-store.js +33 -0
  126. package/dist/files/download-token-store.js.map +1 -0
  127. package/dist/files/file-explorer.d.ts +54 -0
  128. package/dist/files/file-explorer.d.ts.map +1 -0
  129. package/dist/files/file-explorer.js +182 -0
  130. package/dist/files/file-explorer.js.map +1 -0
  131. package/dist/files/file-transfer.d.ts +30 -0
  132. package/dist/files/file-transfer.d.ts.map +1 -0
  133. package/dist/files/file-transfer.js +132 -0
  134. package/dist/files/file-transfer.js.map +1 -0
  135. package/dist/files/index.d.ts +4 -0
  136. package/dist/files/index.d.ts.map +1 -0
  137. package/dist/files/index.js +5 -0
  138. package/dist/files/index.js.map +1 -0
  139. package/dist/http/host-allowlist.d.ts +15 -0
  140. package/dist/http/host-allowlist.d.ts.map +1 -0
  141. package/dist/http/host-allowlist.js +52 -0
  142. package/dist/http/host-allowlist.js.map +1 -0
  143. package/dist/http/http-server.d.ts +27 -0
  144. package/dist/http/http-server.d.ts.map +1 -0
  145. package/dist/http/http-server.js +76 -0
  146. package/dist/http/http-server.js.map +1 -0
  147. package/dist/http/index.d.ts +3 -0
  148. package/dist/http/index.d.ts.map +1 -0
  149. package/dist/http/index.js +4 -0
  150. package/dist/http/index.js.map +1 -0
  151. package/dist/index.d.ts +18 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +35 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/logging/index.d.ts +2 -0
  156. package/dist/logging/index.d.ts.map +1 -0
  157. package/dist/logging/index.js +2 -0
  158. package/dist/logging/index.js.map +1 -0
  159. package/dist/logging/logger.d.ts +48 -0
  160. package/dist/logging/logger.d.ts.map +1 -0
  161. package/dist/logging/logger.js +53 -0
  162. package/dist/logging/logger.js.map +1 -0
  163. package/dist/orchestration/chat-service.d.ts +61 -0
  164. package/dist/orchestration/chat-service.d.ts.map +1 -0
  165. package/dist/orchestration/chat-service.js +156 -0
  166. package/dist/orchestration/chat-service.js.map +1 -0
  167. package/dist/orchestration/cron.d.ts +30 -0
  168. package/dist/orchestration/cron.d.ts.map +1 -0
  169. package/dist/orchestration/cron.js +136 -0
  170. package/dist/orchestration/cron.js.map +1 -0
  171. package/dist/orchestration/index.d.ts +5 -0
  172. package/dist/orchestration/index.d.ts.map +1 -0
  173. package/dist/orchestration/index.js +6 -0
  174. package/dist/orchestration/index.js.map +1 -0
  175. package/dist/orchestration/loop-service.d.ts +129 -0
  176. package/dist/orchestration/loop-service.d.ts.map +1 -0
  177. package/dist/orchestration/loop-service.js +234 -0
  178. package/dist/orchestration/loop-service.js.map +1 -0
  179. package/dist/orchestration/schedule-service.d.ts +65 -0
  180. package/dist/orchestration/schedule-service.d.ts.map +1 -0
  181. package/dist/orchestration/schedule-service.js +201 -0
  182. package/dist/orchestration/schedule-service.js.map +1 -0
  183. package/dist/persistence/atomic-store.d.ts +45 -0
  184. package/dist/persistence/atomic-store.d.ts.map +1 -0
  185. package/dist/persistence/atomic-store.js +92 -0
  186. package/dist/persistence/atomic-store.js.map +1 -0
  187. package/dist/persistence/entity-schemas.d.ts +1707 -0
  188. package/dist/persistence/entity-schemas.d.ts.map +1 -0
  189. package/dist/persistence/entity-schemas.js +250 -0
  190. package/dist/persistence/entity-schemas.js.map +1 -0
  191. package/dist/persistence/entity-stores.d.ts +46 -0
  192. package/dist/persistence/entity-stores.d.ts.map +1 -0
  193. package/dist/persistence/entity-stores.js +167 -0
  194. package/dist/persistence/entity-stores.js.map +1 -0
  195. package/dist/persistence/index.d.ts +4 -0
  196. package/dist/persistence/index.d.ts.map +1 -0
  197. package/dist/persistence/index.js +5 -0
  198. package/dist/persistence/index.js.map +1 -0
  199. package/dist/projects/checkout-diff-manager.d.ts +44 -0
  200. package/dist/projects/checkout-diff-manager.d.ts.map +1 -0
  201. package/dist/projects/checkout-diff-manager.js +82 -0
  202. package/dist/projects/checkout-diff-manager.js.map +1 -0
  203. package/dist/projects/git-checkout-rpc.d.ts +18 -0
  204. package/dist/projects/git-checkout-rpc.d.ts.map +1 -0
  205. package/dist/projects/git-checkout-rpc.js +57 -0
  206. package/dist/projects/git-checkout-rpc.js.map +1 -0
  207. package/dist/projects/git-detect.d.ts +21 -0
  208. package/dist/projects/git-detect.d.ts.map +1 -0
  209. package/dist/projects/git-detect.js +34 -0
  210. package/dist/projects/git-detect.js.map +1 -0
  211. package/dist/projects/git-operations.d.ts +67 -0
  212. package/dist/projects/git-operations.d.ts.map +1 -0
  213. package/dist/projects/git-operations.js +200 -0
  214. package/dist/projects/git-operations.js.map +1 -0
  215. package/dist/projects/github-service.d.ts +80 -0
  216. package/dist/projects/github-service.d.ts.map +1 -0
  217. package/dist/projects/github-service.js +172 -0
  218. package/dist/projects/github-service.js.map +1 -0
  219. package/dist/projects/index.d.ts +13 -0
  220. package/dist/projects/index.d.ts.map +1 -0
  221. package/dist/projects/index.js +19 -0
  222. package/dist/projects/index.js.map +1 -0
  223. package/dist/projects/open-project.d.ts +35 -0
  224. package/dist/projects/open-project.d.ts.map +1 -0
  225. package/dist/projects/open-project.js +106 -0
  226. package/dist/projects/open-project.js.map +1 -0
  227. package/dist/projects/reconciliation.d.ts +15 -0
  228. package/dist/projects/reconciliation.d.ts.map +1 -0
  229. package/dist/projects/reconciliation.js +63 -0
  230. package/dist/projects/reconciliation.js.map +1 -0
  231. package/dist/projects/status-projection.d.ts +33 -0
  232. package/dist/projects/status-projection.d.ts.map +1 -0
  233. package/dist/projects/status-projection.js +98 -0
  234. package/dist/projects/status-projection.js.map +1 -0
  235. package/dist/projects/workspace-activity.d.ts +28 -0
  236. package/dist/projects/workspace-activity.d.ts.map +1 -0
  237. package/dist/projects/workspace-activity.js +74 -0
  238. package/dist/projects/workspace-activity.js.map +1 -0
  239. package/dist/projects/workspace-git-service.d.ts +27 -0
  240. package/dist/projects/workspace-git-service.d.ts.map +1 -0
  241. package/dist/projects/workspace-git-service.js +60 -0
  242. package/dist/projects/workspace-git-service.js.map +1 -0
  243. package/dist/projects/workspace-registry.d.ts +59 -0
  244. package/dist/projects/workspace-registry.d.ts.map +1 -0
  245. package/dist/projects/workspace-registry.js +149 -0
  246. package/dist/projects/workspace-registry.js.map +1 -0
  247. package/dist/projects/worktree-service.d.ts +100 -0
  248. package/dist/projects/worktree-service.d.ts.map +1 -0
  249. package/dist/projects/worktree-service.js +216 -0
  250. package/dist/projects/worktree-service.js.map +1 -0
  251. package/dist/proxy/index.d.ts +4 -0
  252. package/dist/proxy/index.d.ts.map +1 -0
  253. package/dist/proxy/index.js +5 -0
  254. package/dist/proxy/index.js.map +1 -0
  255. package/dist/proxy/service-hostname.d.ts +21 -0
  256. package/dist/proxy/service-hostname.d.ts.map +1 -0
  257. package/dist/proxy/service-hostname.js +44 -0
  258. package/dist/proxy/service-hostname.js.map +1 -0
  259. package/dist/proxy/service-port-registry.d.ts +36 -0
  260. package/dist/proxy/service-port-registry.d.ts.map +1 -0
  261. package/dist/proxy/service-port-registry.js +55 -0
  262. package/dist/proxy/service-port-registry.js.map +1 -0
  263. package/dist/proxy/service-proxy.d.ts +34 -0
  264. package/dist/proxy/service-proxy.d.ts.map +1 -0
  265. package/dist/proxy/service-proxy.js +54 -0
  266. package/dist/proxy/service-proxy.js.map +1 -0
  267. package/dist/terminal/index.d.ts +4 -0
  268. package/dist/terminal/index.d.ts.map +1 -0
  269. package/dist/terminal/index.js +5 -0
  270. package/dist/terminal/index.js.map +1 -0
  271. package/dist/terminal/pty-backend.d.ts +44 -0
  272. package/dist/terminal/pty-backend.d.ts.map +1 -0
  273. package/dist/terminal/pty-backend.js +119 -0
  274. package/dist/terminal/pty-backend.js.map +1 -0
  275. package/dist/terminal/screen-buffer.d.ts +21 -0
  276. package/dist/terminal/screen-buffer.d.ts.map +1 -0
  277. package/dist/terminal/screen-buffer.js +55 -0
  278. package/dist/terminal/screen-buffer.js.map +1 -0
  279. package/dist/terminal/terminal-manager.d.ts +79 -0
  280. package/dist/terminal/terminal-manager.d.ts.map +1 -0
  281. package/dist/terminal/terminal-manager.js +174 -0
  282. package/dist/terminal/terminal-manager.js.map +1 -0
  283. package/dist/terminal/terminal-rpc.d.ts +20 -0
  284. package/dist/terminal/terminal-rpc.d.ts.map +1 -0
  285. package/dist/terminal/terminal-rpc.js +122 -0
  286. package/dist/terminal/terminal-rpc.js.map +1 -0
  287. package/dist/util/concurrency.d.ts +16 -0
  288. package/dist/util/concurrency.d.ts.map +1 -0
  289. package/dist/util/concurrency.js +23 -0
  290. package/dist/util/concurrency.js.map +1 -0
  291. package/dist/util/index.d.ts +2 -0
  292. package/dist/util/index.d.ts.map +1 -0
  293. package/dist/util/index.js +2 -0
  294. package/dist/util/index.js.map +1 -0
  295. package/dist/ws/capability-store.d.ts +11 -0
  296. package/dist/ws/capability-store.d.ts.map +1 -0
  297. package/dist/ws/capability-store.js +10 -0
  298. package/dist/ws/capability-store.js.map +1 -0
  299. package/dist/ws/index.d.ts +5 -0
  300. package/dist/ws/index.d.ts.map +1 -0
  301. package/dist/ws/index.js +6 -0
  302. package/dist/ws/index.js.map +1 -0
  303. package/dist/ws/router.d.ts +34 -0
  304. package/dist/ws/router.d.ts.map +1 -0
  305. package/dist/ws/router.js +97 -0
  306. package/dist/ws/router.js.map +1 -0
  307. package/dist/ws/session.d.ts +28 -0
  308. package/dist/ws/session.d.ts.map +1 -0
  309. package/dist/ws/session.js +36 -0
  310. package/dist/ws/session.js.map +1 -0
  311. package/dist/ws/ws-server.d.ts +41 -0
  312. package/dist/ws/ws-server.d.ts.map +1 -0
  313. package/dist/ws/ws-server.js +104 -0
  314. package/dist/ws/ws-server.js.map +1 -0
  315. package/package.json +48 -0
@@ -0,0 +1,258 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFileSync } from "node:fs";
3
+ import { z } from "zod";
4
+ /**
5
+ * Daemon config (`$PI_STUDIO_HOME/config.json`) — architecture/config.md § Daemon config,
6
+ * § Env precedence, § Behavior; MAIN-SCOPE.md §6.
7
+ *
8
+ * Every field is optional with a sensible default, so a missing or `{}` config yields a fully
9
+ * populated object. Legacy shapes (`allowedHosts`, provider `command:{mode,…}`) are normalized
10
+ * inline on load (no migration framework). Environment variables overlay the parsed config (env
11
+ * wins) for the keys enumerated in config.md.
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // Provider overrides (agents.providers.{id})
15
+ // ---------------------------------------------------------------------------
16
+ /** Provider ids: `/^[a-z][a-z0-9-]*$/`. */
17
+ export const providerIdSchema = z.string().regex(/^[a-z][a-z0-9-]*$/, "invalid provider id");
18
+ /** A custom Pi-compatible provider profile, or an override of the built-in `pi` provider. */
19
+ export const providerOverrideSchema = z.object({
20
+ extends: z.literal("pi").optional(),
21
+ label: z.string().optional(),
22
+ description: z.string().optional(),
23
+ command: z.array(z.string()).optional(),
24
+ env: z.record(z.string(), z.string()).optional(),
25
+ params: z.record(z.string(), z.unknown()).optional(),
26
+ models: z.array(z.unknown()).optional(),
27
+ additionalModels: z.array(z.unknown()).optional(),
28
+ disallowedTools: z.array(z.string()).optional(),
29
+ enabled: z.boolean().optional(),
30
+ order: z.number().optional(),
31
+ });
32
+ /** The only built-in provider id; everything else under `agents.providers` is a custom profile. */
33
+ const BUILTIN_PROVIDER_IDS = new Set(["pi"]);
34
+ /**
35
+ * `agents.providers` map. Keys must match the provider-id pattern. A *custom* profile (any id other
36
+ * than a built-in) must declare `extends:"pi"` and a `label`; overriding the built-in `pi` does not.
37
+ */
38
+ export const providersRecordSchema = z
39
+ .record(providerIdSchema, providerOverrideSchema)
40
+ .superRefine((record, ctx) => {
41
+ for (const [id, override] of Object.entries(record)) {
42
+ if (BUILTIN_PROVIDER_IDS.has(id))
43
+ continue;
44
+ if (override.extends !== "pi") {
45
+ ctx.addIssue({
46
+ code: z.ZodIssueCode.custom,
47
+ message: `custom provider "${id}" must set extends:"pi"`,
48
+ path: [id, "extends"],
49
+ });
50
+ }
51
+ if (!override.label) {
52
+ ctx.addIssue({
53
+ code: z.ZodIssueCode.custom,
54
+ message: `custom provider "${id}" must set a label`,
55
+ path: [id, "label"],
56
+ });
57
+ }
58
+ }
59
+ });
60
+ export const metadataGenerationProviderSchema = z.object({
61
+ provider: z.string(),
62
+ model: z.string().optional(),
63
+ thinkingOptionId: z.string().optional(),
64
+ });
65
+ // ---------------------------------------------------------------------------
66
+ // PersistedConfigSchema
67
+ // ---------------------------------------------------------------------------
68
+ const hostnamesSchema = z.union([z.literal(true), z.array(z.string())]);
69
+ export const persistedConfigSchema = z
70
+ .object({
71
+ version: z.number().default(1),
72
+ daemon: z
73
+ .object({
74
+ listen: z.string().default("127.0.0.1:6767"),
75
+ hostnames: hostnamesSchema.default(["localhost", "*.localhost"]),
76
+ mcp: z
77
+ .object({
78
+ enabled: z.boolean().default(true),
79
+ injectIntoAgents: z.boolean().default(true),
80
+ })
81
+ .default({}),
82
+ appendSystemPrompt: z.string().default(""),
83
+ cors: z.object({ allowedOrigins: z.array(z.string()).default([]) }).default({}),
84
+ relay: z
85
+ .object({
86
+ enabled: z.boolean().default(false),
87
+ endpoint: z.string().optional(),
88
+ publicEndpoint: z.string().optional(),
89
+ useTls: z.boolean().default(false),
90
+ publicUseTls: z.boolean().default(false),
91
+ })
92
+ .default({}),
93
+ auth: z.object({ password: z.string().optional() }).default({}),
94
+ serviceProxy: z
95
+ .object({
96
+ listen: z.string().optional(),
97
+ publicBaseUrl: z.string().optional(),
98
+ enabled: z.boolean().optional(),
99
+ })
100
+ .default({}),
101
+ })
102
+ .default({}),
103
+ app: z.object({ baseUrl: z.string().optional() }).default({}),
104
+ worktrees: z.object({ root: z.string().optional() }).default({}),
105
+ providers: z
106
+ .object({ local: z.object({ modelsDir: z.string().optional() }).default({}) })
107
+ .default({}),
108
+ agents: z
109
+ .object({
110
+ providers: providersRecordSchema.default({}),
111
+ metadataGeneration: z
112
+ .object({ providers: z.array(metadataGenerationProviderSchema).default([]) })
113
+ .default({}),
114
+ })
115
+ .default({}),
116
+ log: z
117
+ .object({
118
+ level: z.string().default("info"),
119
+ format: z.string().default("json"),
120
+ console: z.record(z.string(), z.unknown()).default({}),
121
+ file: z
122
+ .object({
123
+ level: z.string().optional(),
124
+ path: z.string().optional(),
125
+ rotate: z
126
+ .object({ maxSize: z.string().optional(), maxFiles: z.number().optional() })
127
+ .default({}),
128
+ })
129
+ .default({}),
130
+ })
131
+ .default({}),
132
+ })
133
+ .default({});
134
+ // ---------------------------------------------------------------------------
135
+ // Legacy normalization (inline; no migration framework)
136
+ // ---------------------------------------------------------------------------
137
+ /**
138
+ * Migrate a legacy provider override. The old `command` was an object `{ mode, command?, args? }`;
139
+ * the current shape is a `string[]`. The `mode` wrapper is dropped (rpc is implicit).
140
+ *
141
+ * COMPAT(legacy-provider-command): inline; remove when no config.json carries the object form.
142
+ */
143
+ function migrateProviderSettings(value) {
144
+ if (!value || typeof value !== "object")
145
+ return value;
146
+ const override = { ...value };
147
+ const command = override.command;
148
+ if (command && !Array.isArray(command) && typeof command === "object") {
149
+ const legacy = command;
150
+ const base = typeof legacy.command === "string"
151
+ ? [legacy.command]
152
+ : Array.isArray(legacy.command)
153
+ ? legacy.command
154
+ : [];
155
+ const args = Array.isArray(legacy.args) ? legacy.args : [];
156
+ const merged = [...base, ...args].filter((part) => typeof part === "string");
157
+ if (merged.length > 0)
158
+ override.command = merged;
159
+ else
160
+ delete override.command;
161
+ }
162
+ return override;
163
+ }
164
+ /** Normalize a raw config object before schema validation. */
165
+ export function migrateConfig(raw) {
166
+ const root = { ...raw };
167
+ const daemon = { ...root.daemon };
168
+ // COMPAT(legacy-allowed-hosts): `allowedHosts` → `hostnames` (daemon-level or top-level).
169
+ if (daemon.hostnames === undefined) {
170
+ if (daemon.allowedHosts !== undefined)
171
+ daemon.hostnames = daemon.allowedHosts;
172
+ else if (root.allowedHosts !== undefined)
173
+ daemon.hostnames = root.allowedHosts;
174
+ }
175
+ delete daemon.allowedHosts;
176
+ delete root.allowedHosts;
177
+ root.daemon = daemon;
178
+ const agents = { ...root.agents };
179
+ const providers = agents.providers;
180
+ if (providers && typeof providers === "object" && !Array.isArray(providers)) {
181
+ const migrated = {};
182
+ for (const [id, override] of Object.entries(providers)) {
183
+ migrated[id] = migrateProviderSettings(override);
184
+ }
185
+ agents.providers = migrated;
186
+ }
187
+ if (Object.keys(agents).length > 0)
188
+ root.agents = agents;
189
+ return root;
190
+ }
191
+ function envBool(value) {
192
+ const v = value.trim().toLowerCase();
193
+ return v === "1" || v === "true" || v === "yes" || v === "on";
194
+ }
195
+ /**
196
+ * Overlay environment variables onto a parsed config (env wins) for the keys enumerated in
197
+ * config.md § Env precedence.
198
+ */
199
+ export function overlayEnv(config, env) {
200
+ const next = structuredClone(config);
201
+ if (env.PI_STUDIO_LISTEN)
202
+ next.daemon.listen = env.PI_STUDIO_LISTEN;
203
+ if (env.PI_STUDIO_PASSWORD)
204
+ next.daemon.auth.password = env.PI_STUDIO_PASSWORD;
205
+ if (env.PI_STUDIO_HOSTNAMES !== undefined) {
206
+ const raw = env.PI_STUDIO_HOSTNAMES.trim();
207
+ next.daemon.hostnames =
208
+ raw.toLowerCase() === "true"
209
+ ? true
210
+ : raw
211
+ .split(",")
212
+ .map((h) => h.trim())
213
+ .filter((h) => h.length > 0);
214
+ }
215
+ if (env.PI_STUDIO_RELAY_ENDPOINT)
216
+ next.daemon.relay.endpoint = env.PI_STUDIO_RELAY_ENDPOINT;
217
+ if (env.PI_STUDIO_RELAY_PUBLIC_ENDPOINT) {
218
+ next.daemon.relay.publicEndpoint = env.PI_STUDIO_RELAY_PUBLIC_ENDPOINT;
219
+ }
220
+ if (env.PI_STUDIO_RELAY_USE_TLS !== undefined) {
221
+ next.daemon.relay.useTls = envBool(env.PI_STUDIO_RELAY_USE_TLS);
222
+ }
223
+ if (env.PI_STUDIO_RELAY_PUBLIC_USE_TLS !== undefined) {
224
+ next.daemon.relay.publicUseTls = envBool(env.PI_STUDIO_RELAY_PUBLIC_USE_TLS);
225
+ }
226
+ if (env.PI_STUDIO_SERVICE_PROXY_LISTEN) {
227
+ next.daemon.serviceProxy.listen = env.PI_STUDIO_SERVICE_PROXY_LISTEN;
228
+ }
229
+ if (env.PI_STUDIO_SERVICE_PROXY_PUBLIC_BASE_URL) {
230
+ next.daemon.serviceProxy.publicBaseUrl = env.PI_STUDIO_SERVICE_PROXY_PUBLIC_BASE_URL;
231
+ }
232
+ if (env.PI_STUDIO_SERVICE_PROXY_ENABLED !== undefined) {
233
+ next.daemon.serviceProxy.enabled = envBool(env.PI_STUDIO_SERVICE_PROXY_ENABLED);
234
+ }
235
+ return next;
236
+ }
237
+ // ---------------------------------------------------------------------------
238
+ // loadConfig
239
+ // ---------------------------------------------------------------------------
240
+ /**
241
+ * Load and normalize `config.json`: read JSON (or `{}` when missing/corrupt), migrate legacy
242
+ * shapes, validate with {@link persistedConfigSchema}, then overlay env vars. Throws if the parsed
243
+ * config is structurally invalid (e.g. a bad provider id or a custom provider missing extends/label).
244
+ */
245
+ export function loadConfig(path, env = process.env) {
246
+ let raw = {};
247
+ if (existsSync(path)) {
248
+ try {
249
+ raw = JSON.parse(readFileSync(path, "utf8"));
250
+ }
251
+ catch {
252
+ raw = {};
253
+ }
254
+ }
255
+ const parsed = persistedConfigSchema.parse(migrateConfig(raw));
256
+ return overlayEnv(parsed, env);
257
+ }
258
+ //# sourceMappingURL=daemon-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-config.js","sourceRoot":"","sources":["../../src/config/daemon-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./daemon-config.js";
2
+ export * from "./project-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Configuration: daemon config.json + per-project pi-studio.json.
2
+ export * from "./daemon-config.js";
3
+ export * from "./project-config.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * A named script entry. `command` is required; `type:"service"` flags it for the service proxy.
4
+ * Extra fields are tolerated (full script-entry schema is TODO(verify)).
5
+ */
6
+ export declare const scriptEntrySchema: z.ZodObject<{
7
+ type: z.ZodOptional<z.ZodString>;
8
+ command: z.ZodString;
9
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
10
+ type: z.ZodOptional<z.ZodString>;
11
+ command: z.ZodString;
12
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
13
+ type: z.ZodOptional<z.ZodString>;
14
+ command: z.ZodString;
15
+ }, z.ZodTypeAny, "passthrough">>;
16
+ export type ScriptEntry = z.infer<typeof scriptEntrySchema>;
17
+ /** True when a script should be registered with the service proxy. */
18
+ export declare function isServiceScript(entry: ScriptEntry): boolean;
19
+ export declare const piStudioConfigSchema: z.ZodObject<{
20
+ worktree: z.ZodDefault<z.ZodEffects<z.ZodObject<{
21
+ setup: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
22
+ teardown: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ setup?: string | string[] | undefined;
25
+ teardown?: string | string[] | undefined;
26
+ }, {
27
+ setup?: string | string[] | undefined;
28
+ teardown?: string | string[] | undefined;
29
+ }>, {
30
+ setup: string[];
31
+ teardown: string[];
32
+ }, {
33
+ setup?: string | string[] | undefined;
34
+ teardown?: string | string[] | undefined;
35
+ }>>;
36
+ scripts: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
37
+ type: z.ZodOptional<z.ZodString>;
38
+ command: z.ZodString;
39
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
40
+ type: z.ZodOptional<z.ZodString>;
41
+ command: z.ZodString;
42
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
43
+ type: z.ZodOptional<z.ZodString>;
44
+ command: z.ZodString;
45
+ }, z.ZodTypeAny, "passthrough">>>>;
46
+ instructions: z.ZodOptional<z.ZodString>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ worktree: {
49
+ setup: string[];
50
+ teardown: string[];
51
+ };
52
+ scripts: Record<string, z.objectOutputType<{
53
+ type: z.ZodOptional<z.ZodString>;
54
+ command: z.ZodString;
55
+ }, z.ZodTypeAny, "passthrough">>;
56
+ instructions?: string | undefined;
57
+ }, {
58
+ worktree?: {
59
+ setup?: string | string[] | undefined;
60
+ teardown?: string | string[] | undefined;
61
+ } | undefined;
62
+ scripts?: Record<string, z.objectInputType<{
63
+ type: z.ZodOptional<z.ZodString>;
64
+ command: z.ZodString;
65
+ }, z.ZodTypeAny, "passthrough">> | undefined;
66
+ instructions?: string | undefined;
67
+ }>;
68
+ export type PiStudioConfig = z.infer<typeof piStudioConfigSchema>;
69
+ /** Parse + normalize a raw `pi-studio.json` document. Throws on invalid input. */
70
+ export declare function normalizeProjectConfig(raw: unknown): PiStudioConfig;
71
+ /** Revision token of a `pi-studio.json` (content hash). `null` means "no file on disk". */
72
+ export declare const piStudioConfigRevisionSchema: z.ZodNullable<z.ZodString>;
73
+ export type PiStudioConfigRevision = z.infer<typeof piStudioConfigRevisionSchema>;
74
+ export type ProjectConfigWriteError = "project_not_found" | "invalid_project_config" | "stale_project_config" | "write_failed";
75
+ /** Compute the revision token for the given file contents (sha256 hex). */
76
+ export declare function computeRevision(contents: string): string;
77
+ export interface ReadProjectConfigResult {
78
+ config: PiStudioConfig;
79
+ /** `null` when no `pi-studio.json` exists (project has no per-project config yet). */
80
+ revision: PiStudioConfigRevision;
81
+ }
82
+ /**
83
+ * Read + normalize `pi-studio.json`. A missing file yields the default (empty) config with a `null`
84
+ * revision; corrupt/invalid JSON yields defaults too (read is lenient — the write path enforces
85
+ * validity).
86
+ */
87
+ export declare function readProjectConfig(path: string): Promise<ReadProjectConfigResult>;
88
+ export type WriteProjectConfigResult = {
89
+ ok: true;
90
+ revision: string;
91
+ config: PiStudioConfig;
92
+ } | {
93
+ ok: false;
94
+ error: ProjectConfigWriteError;
95
+ };
96
+ /**
97
+ * Write `pi-studio.json` under the optimistic-concurrency revision model. Returns a typed error:
98
+ * - `project_not_found` — the project root directory does not exist.
99
+ * - `invalid_project_config` — `newConfig` fails schema validation.
100
+ * - `stale_project_config` — the on-disk file changed since `expectedRevision` was read.
101
+ * - `write_failed` — the filesystem write threw.
102
+ */
103
+ export declare function writeProjectConfig(path: string, newConfig: unknown, expectedRevision: PiStudioConfigRevision): Promise<WriteProjectConfigResult>;
104
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/config/project-config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;gCAKd,CAAC;AACjB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAEnE;AAMD,2FAA2F;AAC3F,eAAO,MAAM,4BAA4B,4BAAwB,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,MAAM,uBAAuB,GAC/B,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,cAAc,CAAC;AAEnB,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAOD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,sFAAsF;IACtF,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAUtF;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,gBAAgB,EAAE,sBAAsB,GACvC,OAAO,CAAC,wBAAwB,CAAC,CAgBnC"}
@@ -0,0 +1,106 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { dirname } from "node:path";
5
+ import { z } from "zod";
6
+ /**
7
+ * Per-project `pi-studio.json` config — architecture/config.md § Per-project config,
8
+ * features/worktrees.md § Lifecycle config, features/service-proxy.md § Triggering.
9
+ *
10
+ * Holds worktree lifecycle commands (`setup`/`teardown`) and named `scripts` (a `type:"service"`
11
+ * script is proxied). A stale-write revision model guards concurrent edits.
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // Schema + normalization
15
+ // ---------------------------------------------------------------------------
16
+ /** Normalize a `string | string[] | undefined` command list: split to array, drop blanks. */
17
+ function toCommandList(value) {
18
+ const list = value === undefined ? [] : Array.isArray(value) ? value : [value];
19
+ return list.map((entry) => entry.trim()).filter((entry) => entry.length > 0);
20
+ }
21
+ const commandsInputSchema = z.union([z.string(), z.array(z.string())]).optional();
22
+ /** Worktree lifecycle block — `setup`/`teardown` normalized to deduped command arrays. */
23
+ const worktreeConfigSchema = z
24
+ .object({ setup: commandsInputSchema, teardown: commandsInputSchema })
25
+ .transform((w) => ({ setup: toCommandList(w.setup), teardown: toCommandList(w.teardown) }));
26
+ /**
27
+ * A named script entry. `command` is required; `type:"service"` flags it for the service proxy.
28
+ * Extra fields are tolerated (full script-entry schema is TODO(verify)).
29
+ */
30
+ export const scriptEntrySchema = z
31
+ .object({
32
+ type: z.string().optional(),
33
+ command: z.string(),
34
+ })
35
+ .passthrough();
36
+ /** True when a script should be registered with the service proxy. */
37
+ export function isServiceScript(entry) {
38
+ return entry.type === "service";
39
+ }
40
+ export const piStudioConfigSchema = z.object({
41
+ worktree: worktreeConfigSchema.default({}),
42
+ scripts: z.record(z.string(), scriptEntrySchema).default({}),
43
+ instructions: z.string().optional(),
44
+ });
45
+ /** Parse + normalize a raw `pi-studio.json` document. Throws on invalid input. */
46
+ export function normalizeProjectConfig(raw) {
47
+ return piStudioConfigSchema.parse(raw ?? {});
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // Revision / stale-write model
51
+ // ---------------------------------------------------------------------------
52
+ /** Revision token of a `pi-studio.json` (content hash). `null` means "no file on disk". */
53
+ export const piStudioConfigRevisionSchema = z.string().nullable();
54
+ /** Compute the revision token for the given file contents (sha256 hex). */
55
+ export function computeRevision(contents) {
56
+ return createHash("sha256").update(contents).digest("hex");
57
+ }
58
+ async function currentRevision(path) {
59
+ if (!existsSync(path))
60
+ return null;
61
+ return computeRevision(await readFile(path, "utf8"));
62
+ }
63
+ /**
64
+ * Read + normalize `pi-studio.json`. A missing file yields the default (empty) config with a `null`
65
+ * revision; corrupt/invalid JSON yields defaults too (read is lenient — the write path enforces
66
+ * validity).
67
+ */
68
+ export async function readProjectConfig(path) {
69
+ if (!existsSync(path))
70
+ return { config: normalizeProjectConfig({}), revision: null };
71
+ const contents = await readFile(path, "utf8");
72
+ let parsed;
73
+ try {
74
+ parsed = normalizeProjectConfig(JSON.parse(contents));
75
+ }
76
+ catch {
77
+ parsed = normalizeProjectConfig({});
78
+ }
79
+ return { config: parsed, revision: computeRevision(contents) };
80
+ }
81
+ /**
82
+ * Write `pi-studio.json` under the optimistic-concurrency revision model. Returns a typed error:
83
+ * - `project_not_found` — the project root directory does not exist.
84
+ * - `invalid_project_config` — `newConfig` fails schema validation.
85
+ * - `stale_project_config` — the on-disk file changed since `expectedRevision` was read.
86
+ * - `write_failed` — the filesystem write threw.
87
+ */
88
+ export async function writeProjectConfig(path, newConfig, expectedRevision) {
89
+ if (!existsSync(dirname(path)))
90
+ return { ok: false, error: "project_not_found" };
91
+ const parsed = piStudioConfigSchema.safeParse(newConfig);
92
+ if (!parsed.success)
93
+ return { ok: false, error: "invalid_project_config" };
94
+ const onDisk = await currentRevision(path);
95
+ if (expectedRevision !== onDisk)
96
+ return { ok: false, error: "stale_project_config" };
97
+ try {
98
+ const contents = `${JSON.stringify(newConfig, null, 2)}\n`;
99
+ await writeFile(path, contents, "utf8");
100
+ return { ok: true, revision: computeRevision(contents), config: parsed.data };
101
+ }
102
+ catch {
103
+ return { ok: false, error: "write_failed" };
104
+ }
105
+ }
106
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/config/project-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Server as HttpServer } from "node:http";
2
+ export interface DaemonOptions {
3
+ host: string;
4
+ port: number;
5
+ /** Overrides `PI_STUDIO_HOME` (defaults to `~/.pi-studio`). */
6
+ home?: string;
7
+ /** Overrides the config path (defaults to `<home>/config.json`). */
8
+ configPath?: string;
9
+ serverId?: string;
10
+ }
11
+ export interface DaemonHandle {
12
+ httpServer: HttpServer;
13
+ serverId: string;
14
+ home: string;
15
+ provider: string;
16
+ close(): Promise<void>;
17
+ }
18
+ /**
19
+ * Every WS client only routes bare top-level frames it recognizes (`status`/`ping`/`pong`/
20
+ * `session`) — `DaemonClient.handleTextFrame`'s `default:` case silently drops anything else,
21
+ * including unwrapped fan-out messages like `{ type: "terminals_update", ... }`. Call sites across
22
+ * the daemon send plain "session update" objects (`agent_update`, `workspace_update`,
23
+ * `terminals_update`, …) expecting them to reach `onSessionMessage` subscribers, so `broadcast`
24
+ * wraps every message in the `session` envelope through this helper. A few call sites already
25
+ * wrap manually (`{ type: "session", message: event }`) — passed through as-is, never
26
+ * double-wrapped.
27
+ */
28
+ export declare function wrapSessionEnvelope(message: unknown): {
29
+ type: "session";
30
+ message: unknown;
31
+ } | unknown;
32
+ /**
33
+ * Start the real production daemon. Returns a handle exposing the HTTP server, serverId, and a
34
+ * `close()` for graceful shutdown.
35
+ */
36
+ export declare function startDaemon(opts: DaemonOptions): DaemonHandle;
37
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/daemon/bootstrap.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAyCtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAmCD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAIrG;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAwY7D"}