@hyperdreamer/pi-webui 1.6.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 (276) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +148 -0
  3. package/dist/cli.js +975 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/apple-touch-icon.png +0 -0
  6. package/dist/client/assets/CodeViewer-aB4ZVzEu.js +4 -0
  7. package/dist/client/assets/UnifiedDiffViewer-f8X7aTkU.js +39 -0
  8. package/dist/client/assets/index-Cffeusjy.js +6022 -0
  9. package/dist/client/assets/vendor-editor-core-vUi74DnD.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +46 -0
  11. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
  12. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
  13. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
  14. package/dist/client/favicon.svg +8 -0
  15. package/dist/client/index.html +65 -0
  16. package/dist/client/manifest.webmanifest +24 -0
  17. package/dist/client/pwa-icon-192.png +0 -0
  18. package/dist/client/pwa-icon-512.png +0 -0
  19. package/dist/config.js +417 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/docker/piWebUiDockerCommandPlan.js +211 -0
  22. package/dist/docker/piWebUiDockerCommandPlan.js.map +1 -0
  23. package/dist/nativeServices/serviceDoctor.js +480 -0
  24. package/dist/nativeServices/serviceDoctor.js.map +1 -0
  25. package/dist/nativeServices/serviceInstall.js +35 -0
  26. package/dist/nativeServices/serviceInstall.js.map +1 -0
  27. package/dist/nativeServices/servicePlan.js +358 -0
  28. package/dist/nativeServices/servicePlan.js.map +1 -0
  29. package/dist/nativeServices/serviceProbe.js +447 -0
  30. package/dist/nativeServices/serviceProbe.js.map +1 -0
  31. package/dist/nativeServices/serviceRendering.js +122 -0
  32. package/dist/nativeServices/serviceRendering.js.map +1 -0
  33. package/dist/pi-webui-plugins/info/package.json +9 -0
  34. package/dist/pi-webui-plugins/info/pi-webui-plugin.js +51 -0
  35. package/dist/pi-webui-plugins/updates/package.json +9 -0
  36. package/dist/pi-webui-plugins/updates/pi-webui-plugin.js +185 -0
  37. package/dist/pi-webui-plugins/updates/updatesLogic.js +97 -0
  38. package/dist/pi-webui-plugins/workspace-tasks/config.js +91 -0
  39. package/dist/pi-webui-plugins/workspace-tasks/package.json +9 -0
  40. package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +48 -0
  41. package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +12 -0
  42. package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +288 -0
  43. package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  44. package/dist/piWebUiVersionReport.js +225 -0
  45. package/dist/piWebUiVersionReport.js.map +1 -0
  46. package/dist/plugin-api/unstable.d.ts +22 -0
  47. package/dist/plugin-api.d.ts +199 -0
  48. package/dist/server/activeAgentProfileProvider.js +25 -0
  49. package/dist/server/activeAgentProfileProvider.js.map +1 -0
  50. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  51. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  52. package/dist/server/activity/workspaceActivityService.js +98 -0
  53. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  54. package/dist/server/app.js +211 -0
  55. package/dist/server/app.js.map +1 -0
  56. package/dist/server/browserMessageProjection.js +56 -0
  57. package/dist/server/browserMessageProjection.js.map +1 -0
  58. package/dist/server/configRoutes.js +309 -0
  59. package/dist/server/configRoutes.js.map +1 -0
  60. package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
  61. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
  62. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  63. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  64. package/dist/server/git/gitEnv.js +15 -0
  65. package/dist/server/git/gitEnv.js.map +1 -0
  66. package/dist/server/git/gitService.js +123 -0
  67. package/dist/server/git/gitService.js.map +1 -0
  68. package/dist/server/gitRoutes.js +23 -0
  69. package/dist/server/gitRoutes.js.map +1 -0
  70. package/dist/server/index.js +7 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/machines/machineClient.js +172 -0
  73. package/dist/server/machines/machineClient.js.map +1 -0
  74. package/dist/server/machines/machinePluginProxyRoutes.js +190 -0
  75. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  76. package/dist/server/machines/machineProxyRoutes.js +172 -0
  77. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  78. package/dist/server/machines/machineRoutes.js +56 -0
  79. package/dist/server/machines/machineRoutes.js.map +1 -0
  80. package/dist/server/machines/machineService.js +238 -0
  81. package/dist/server/machines/machineService.js.map +1 -0
  82. package/dist/server/machines/machineStore.js +128 -0
  83. package/dist/server/machines/machineStore.js.map +1 -0
  84. package/dist/server/models/modelsConfigRoutes.js +40 -0
  85. package/dist/server/models/modelsConfigRoutes.js.map +1 -0
  86. package/dist/server/models/modelsConfigService.js +339 -0
  87. package/dist/server/models/modelsConfigService.js.map +1 -0
  88. package/dist/server/piPackagePluginsConfigRoutes.js +86 -0
  89. package/dist/server/piPackagePluginsConfigRoutes.js.map +1 -0
  90. package/dist/server/piPackagePluginsConfigService.js +311 -0
  91. package/dist/server/piPackagePluginsConfigService.js.map +1 -0
  92. package/dist/server/piPackageRoutes.js +91 -0
  93. package/dist/server/piPackageRoutes.js.map +1 -0
  94. package/dist/server/piPackageService.js +101 -0
  95. package/dist/server/piPackageService.js.map +1 -0
  96. package/dist/server/piWebUiPluginService.js +326 -0
  97. package/dist/server/piWebUiPluginService.js.map +1 -0
  98. package/dist/server/piWebUiReleaseLookupCache.js +37 -0
  99. package/dist/server/piWebUiReleaseLookupCache.js.map +1 -0
  100. package/dist/server/piWebUiStatus.js +622 -0
  101. package/dist/server/piWebUiStatus.js.map +1 -0
  102. package/dist/server/piWebUiStatusCache.js +45 -0
  103. package/dist/server/piWebUiStatusCache.js.map +1 -0
  104. package/dist/server/projects/directorySuggestions.js +37 -0
  105. package/dist/server/projects/directorySuggestions.js.map +1 -0
  106. package/dist/server/projects/projectService.js +31 -0
  107. package/dist/server/projects/projectService.js.map +1 -0
  108. package/dist/server/realtime/sessionEventHub.js +70 -0
  109. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  110. package/dist/server/sessiond/sessionDaemonStartup.js +49 -0
  111. package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -0
  112. package/dist/server/sessiond/sessionProxyRoutes.js +87 -0
  113. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  114. package/dist/server/sessiond/skillsGithubToken.js +7 -0
  115. package/dist/server/sessiond/skillsGithubToken.js.map +1 -0
  116. package/dist/server/sessiond.js +152 -0
  117. package/dist/server/sessiond.js.map +1 -0
  118. package/dist/server/sessions/attachmentService.js +119 -0
  119. package/dist/server/sessions/attachmentService.js.map +1 -0
  120. package/dist/server/sessions/authProviderOptions.js +50 -0
  121. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  122. package/dist/server/sessions/authRoutes.js +69 -0
  123. package/dist/server/sessions/authRoutes.js.map +1 -0
  124. package/dist/server/sessions/authService.js +134 -0
  125. package/dist/server/sessions/authService.js.map +1 -0
  126. package/dist/server/sessions/builtinCommands.js +27 -0
  127. package/dist/server/sessions/builtinCommands.js.map +1 -0
  128. package/dist/server/sessions/editPreview.js +196 -0
  129. package/dist/server/sessions/editPreview.js.map +1 -0
  130. package/dist/server/sessions/messagePaging.js +43 -0
  131. package/dist/server/sessions/messagePaging.js.map +1 -0
  132. package/dist/server/sessions/oauthLoginFlowService.js +349 -0
  133. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  134. package/dist/server/sessions/piSessionManagerGateway.js +115 -0
  135. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  136. package/dist/server/sessions/piSessionService.js +3230 -0
  137. package/dist/server/sessions/piSessionService.js.map +1 -0
  138. package/dist/server/sessions/plainTextTheme.js +112 -0
  139. package/dist/server/sessions/plainTextTheme.js.map +1 -0
  140. package/dist/server/sessions/sessionArchiveMigration.js +590 -0
  141. package/dist/server/sessions/sessionArchiveMigration.js.map +1 -0
  142. package/dist/server/sessions/sessionArchiveStore.js +262 -0
  143. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  144. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  145. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  146. package/dist/server/sessions/sessionCleanup.js +157 -0
  147. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  148. package/dist/server/sessions/sessionCommandService.js +313 -0
  149. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  150. package/dist/server/sessions/sessionDefaultsRoutes.js +65 -0
  151. package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -0
  152. package/dist/server/sessions/sessionDefaultsService.js +90 -0
  153. package/dist/server/sessions/sessionDefaultsService.js.map +1 -0
  154. package/dist/server/sessions/sessionHistoryExport.js +115 -0
  155. package/dist/server/sessions/sessionHistoryExport.js.map +1 -0
  156. package/dist/server/sessions/sessionMetadataStore.js +102 -0
  157. package/dist/server/sessions/sessionMetadataStore.js.map +1 -0
  158. package/dist/server/sessions/sessionNameGenerator.js +90 -0
  159. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  160. package/dist/server/sessions/sessionNotificationStore.js +484 -0
  161. package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
  162. package/dist/server/sessions/sessionRoutes.js +590 -0
  163. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  164. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  165. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  166. package/dist/server/sessions/sessionService.js +2 -0
  167. package/dist/server/sessions/sessionService.js.map +1 -0
  168. package/dist/server/sessions/sessionTreeProjection.js +250 -0
  169. package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
  170. package/dist/server/sessions/sessionUnreadStore.js +520 -0
  171. package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
  172. package/dist/server/sessions/spawnSessionTool.js +41 -0
  173. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  174. package/dist/server/sessions/spawnSubsessionTool.js +214 -0
  175. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  176. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  177. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  178. package/dist/server/sessions/subsessionTranscript.js +235 -0
  179. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  180. package/dist/server/skills/runNpx.js +30 -0
  181. package/dist/server/skills/runNpx.js.map +1 -0
  182. package/dist/server/skills/skillLock.js +115 -0
  183. package/dist/server/skills/skillLock.js.map +1 -0
  184. package/dist/server/skills/skillUpdates.js +194 -0
  185. package/dist/server/skills/skillUpdates.js.map +1 -0
  186. package/dist/server/skills/skillsConfigRoutes.js +64 -0
  187. package/dist/server/skills/skillsConfigRoutes.js.map +1 -0
  188. package/dist/server/skills/skillsConfigService.js +391 -0
  189. package/dist/server/skills/skillsConfigService.js.map +1 -0
  190. package/dist/server/storage/projectStore.js +88 -0
  191. package/dist/server/storage/projectStore.js.map +1 -0
  192. package/dist/server/systemInfoRoutes.js +265 -0
  193. package/dist/server/systemInfoRoutes.js.map +1 -0
  194. package/dist/server/terminalProxyRoutes.js +140 -0
  195. package/dist/server/terminalProxyRoutes.js.map +1 -0
  196. package/dist/server/terminals/terminalRoutes.js +155 -0
  197. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  198. package/dist/server/terminals/terminalService.js +305 -0
  199. package/dist/server/terminals/terminalService.js.map +1 -0
  200. package/dist/server/terminals/terminalSize.js +17 -0
  201. package/dist/server/terminals/terminalSize.js.map +1 -0
  202. package/dist/server/types.js +2 -0
  203. package/dist/server/types.js.map +1 -0
  204. package/dist/server/webSocketBridge.js +32 -0
  205. package/dist/server/webSocketBridge.js.map +1 -0
  206. package/dist/server/workingDirectory.js +44 -0
  207. package/dist/server/workingDirectory.js.map +1 -0
  208. package/dist/server/workspaceExplorerRoutes.js +109 -0
  209. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  210. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  211. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  212. package/dist/server/workspaces/fileContentService.js +181 -0
  213. package/dist/server/workspaces/fileContentService.js.map +1 -0
  214. package/dist/server/workspaces/fileSuggestions.js +520 -0
  215. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  216. package/dist/server/workspaces/fileTreeService.js +35 -0
  217. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  218. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  219. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  220. package/dist/server/workspaces/imagePreviewService.js +40 -0
  221. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  222. package/dist/server/workspaces/pathAccessPolicy.js +90 -0
  223. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  224. package/dist/server/workspaces/pathSafety.js +45 -0
  225. package/dist/server/workspaces/pathSafety.js.map +1 -0
  226. package/dist/server/workspaces/projectPiWebUiConfig.js +61 -0
  227. package/dist/server/workspaces/projectPiWebUiConfig.js.map +1 -0
  228. package/dist/server/workspaces/workspaceContext.js +8 -0
  229. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  230. package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
  231. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  232. package/dist/server/workspaces/workspaceService.js +39 -0
  233. package/dist/server/workspaces/workspaceService.js.map +1 -0
  234. package/dist/sessiond/activeAgentProfile.js +31 -0
  235. package/dist/sessiond/activeAgentProfile.js.map +1 -0
  236. package/dist/sessiond/config.js +9 -0
  237. package/dist/sessiond/config.js.map +1 -0
  238. package/dist/sessiond/sessionDaemonClient.js +103 -0
  239. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  240. package/dist/shared/activeAgentProfile.js +76 -0
  241. package/dist/shared/activeAgentProfile.js.map +1 -0
  242. package/dist/shared/activity.js +11 -0
  243. package/dist/shared/activity.js.map +1 -0
  244. package/dist/shared/apiTypes.d.ts +1212 -0
  245. package/dist/shared/apiTypes.js +25 -0
  246. package/dist/shared/apiTypes.js.map +1 -0
  247. package/dist/shared/capabilities.js +69 -0
  248. package/dist/shared/capabilities.js.map +1 -0
  249. package/dist/shared/federatedRoutes.js +109 -0
  250. package/dist/shared/federatedRoutes.js.map +1 -0
  251. package/dist/shared/machinePluginIds.js +41 -0
  252. package/dist/shared/machinePluginIds.js.map +1 -0
  253. package/dist/shared/piWebUiStatusParsing.js +108 -0
  254. package/dist/shared/piWebUiStatusParsing.js.map +1 -0
  255. package/dist/shared/pluginIds.js +5 -0
  256. package/dist/shared/pluginIds.js.map +1 -0
  257. package/dist/shared/promptAttachments.js +92 -0
  258. package/dist/shared/promptAttachments.js.map +1 -0
  259. package/dist/shared/thinkingLevels.d.ts +27 -0
  260. package/dist/shared/thinkingLevels.js +31 -0
  261. package/dist/shared/thinkingLevels.js.map +1 -0
  262. package/dist/shared/workspaceDeletion.js +12 -0
  263. package/dist/shared/workspaceDeletion.js.map +1 -0
  264. package/dist/shared/workspaceFiles.js +3 -0
  265. package/dist/shared/workspaceFiles.js.map +1 -0
  266. package/docs/assets/favicon.svg +8 -0
  267. package/docs/assets/pi-webui-banner.png +0 -0
  268. package/docs/assets/pi-webui-desktop.png +0 -0
  269. package/docs/assets/pi-webui-mobile.png +0 -0
  270. package/docs/assets/pi-webui-tablet.png +0 -0
  271. package/docs/config.md +265 -0
  272. package/docs/plugins.md +988 -0
  273. package/extensions/pi-webui.ts +133 -0
  274. package/package.json +143 -0
  275. package/plugin-api/unstable.d.ts +1 -0
  276. package/plugin-api.d.ts +1 -0
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title desc">
2
+ <title id="title">PI WEBUI icon</title>
3
+ <desc id="desc">A thin green rounded speech-bubble outline framing a bold mathematical pi symbol.</desc>
4
+ <g id="speech-bubble" fill="none" stroke="#1E9E4A" stroke-width="32" stroke-linecap="round" stroke-linejoin="round">
5
+ <path d="M120 88H392A48 48 0 0 1 440 136V304A48 48 0 0 1 392 352H224L152 416L168 352H120A48 48 0 0 1 72 304V136A48 48 0 0 1 120 88Z"/>
6
+ </g>
7
+ <path id="pi-symbol" fill="#1E9E4A" transform="translate(121 311) scale(.17 -.17)" d="M86 1120H1499V864H1303V362Q1303 233 1327.5 201.5Q1352 170 1408 170Q1465 170 1497 174V-14Q1435 -39 1223 -39Q1156 -39 1091 -20Q987 11 958 102Q945 145 945 233V864H640V0H282V864H86Z"/>
8
+ </svg>
@@ -0,0 +1,65 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title>PI WEBUI</title>
7
+ <meta name="theme-color" content="#0d1117" />
8
+ <link rel="icon" type="image/svg+xml" href="./favicon.svg" />
9
+ <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
10
+ <link rel="manifest" href="./manifest.webmanifest" />
11
+ <style>
12
+ :root {
13
+ color-scheme: dark;
14
+ --pi-control-font-size: 16px;
15
+ --pi-control-font-family: system-ui, sans-serif;
16
+ --pi-control-monospace-font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
17
+ --pi-bg: #0d1117;
18
+ --pi-surface: #161b22;
19
+ --pi-surface-hover: #21262d;
20
+ --pi-terminal-bg: #05070a;
21
+ --pi-terminal-text: #e6edf3;
22
+ --pi-border: #30363d;
23
+ --pi-border-muted: #21262d;
24
+ --pi-text: #e6edf3;
25
+ --pi-text-secondary: #c9d1d9;
26
+ --pi-text-bright: #f0f6fc;
27
+ --pi-muted: #8b949e;
28
+ --pi-dim: #6e7681;
29
+ --pi-accent: #58a6ff;
30
+ --pi-accent-border: #2f81f7;
31
+ --pi-selection-bg: #0d2847;
32
+ --pi-success: #3fb950;
33
+ --pi-success-border: #238636;
34
+ --pi-success-bg: #0f1b12;
35
+ --pi-success-surface: #0f2a16;
36
+ --pi-success-ring: #3fb95055;
37
+ --pi-warning: #d29922;
38
+ --pi-warning-border: #6e5200;
39
+ --pi-warning-surface: #1f1a10;
40
+ --pi-danger: #ff7b72;
41
+ --pi-purple: #d2a8ff;
42
+ --pi-purple-border: #a371f7;
43
+ --pi-purple-surface: #21132f;
44
+ --pi-overlay: #0008;
45
+ --pi-shadow-soft: #0006;
46
+ --pi-shadow: #0008;
47
+ --pi-shadow-strong: #000b;
48
+ --pi-bg-overlay-soft: #0d1117dd;
49
+ --pi-bg-overlay: #0d1117e6;
50
+ --pi-success-bg-overlay: #0f1b12ee;
51
+ --pi-terminal-selection: #264f78;
52
+ }
53
+ html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
54
+ body { min-height: 100dvh; }
55
+ </style>
56
+ <script type="module" crossorigin src="./assets/index-Cffeusjy.js"></script>
57
+ <link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
58
+ <link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
59
+ <link rel="modulepreload" crossorigin href="./assets/vendor-terminal-D8k4UKM2.js">
60
+ <link rel="stylesheet" crossorigin href="./assets/vendor-terminal-BrP-ENHg.css">
61
+ </head>
62
+ <body>
63
+ <pi-webui-app></pi-webui-app>
64
+ </body>
65
+ </html>
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "PI WEBUI",
3
+ "short_name": "PI WEBUI",
4
+ "description": "Remote web UI and browser control plane for persistent Pi Coding Agent sessions.",
5
+ "start_url": "./",
6
+ "scope": "./",
7
+ "display": "standalone",
8
+ "background_color": "#0d1117",
9
+ "theme_color": "#0d1117",
10
+ "icons": [
11
+ {
12
+ "src": "./pwa-icon-192.png",
13
+ "sizes": "192x192",
14
+ "type": "image/png",
15
+ "purpose": "any maskable"
16
+ },
17
+ {
18
+ "src": "./pwa-icon-512.png",
19
+ "sizes": "512x512",
20
+ "type": "image/png",
21
+ "purpose": "any maskable"
22
+ }
23
+ ]
24
+ }
Binary file
Binary file
package/dist/config.js ADDED
@@ -0,0 +1,417 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { basename, dirname, isAbsolute, join, normalize, resolve } from "node:path";
4
+ import { isPiCompanionCommand, usesPiCodingAgentStateCompatibility } from "./shared/activeAgentProfile.js";
5
+ import { isPiWebUiPluginId, piWebUiPluginIdPattern } from "./shared/pluginIds.js";
6
+ export { isPiCompanionCommand };
7
+ export function defaultPiWebUiConfigPath(env = process.env) {
8
+ const xdgConfigHome = env["XDG_CONFIG_HOME"];
9
+ return join(xdgConfigHome !== undefined && xdgConfigHome !== "" ? xdgConfigHome : join(homedir(), ".config"), "pi-webui", "config.json");
10
+ }
11
+ export function defaultPiWebUiDataDir() {
12
+ return join(homedir(), ".pi-webui");
13
+ }
14
+ /**
15
+ * Default maximum HTTP body size (bytes) for the web/API and session daemon.
16
+ * Generous headroom for base64 image attachments (well above pi's 4.5MB
17
+ * per-image inline limit so several images fit in one request).
18
+ */
19
+ export const DEFAULT_PORT = 8808;
20
+ export const DEFAULT_MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
21
+ export const DEFAULT_UPLOADS_FOLDER = ".pi-webui/uploads";
22
+ export const DEFAULT_AGENT_COMMAND = "pi";
23
+ export const PI_WEBUI_AGENT_COMMAND_ENV = "PI_WEBUI_AGENT_COMMAND";
24
+ export const PI_WEBUI_AGENT_DIR_ENV = "PI_WEBUI_AGENT_DIR";
25
+ export const PI_WEBUI_AGENT_SESSION_DIR_ENV = "PI_WEBUI_AGENT_SESSION_DIR";
26
+ export const PI_CODING_AGENT_DIR_ENV = "PI_CODING_AGENT_DIR";
27
+ export const PI_CODING_AGENT_SESSION_DIR_ENV = "PI_CODING_AGENT_SESSION_DIR";
28
+ export function effectiveAgentConfig(env = process.env, config = {}) {
29
+ const command = parseAgentCommand(envValue(env, PI_WEBUI_AGENT_COMMAND_ENV) ?? config.agent?.command ?? DEFAULT_AGENT_COMMAND, "agent.command", "environment", "current");
30
+ const configuredDir = envValue(env, PI_WEBUI_AGENT_DIR_ENV) ?? (usesPiCodingAgentStateCompatibility(command) ? envValue(env, PI_CODING_AGENT_DIR_ENV) : undefined) ?? config.agent?.dir ?? defaultAgentDirForCommand(command, env);
31
+ return {
32
+ command,
33
+ dir: resolveAgentDirPath(configuredDir, env, "agent.dir", "environment"),
34
+ sessionDirEnvKeys: agentSessionDirEnvKeys(command),
35
+ };
36
+ }
37
+ export function agentSessionDirEnvKeys(command = DEFAULT_AGENT_COMMAND) {
38
+ return uniqueStrings([
39
+ PI_WEBUI_AGENT_SESSION_DIR_ENV,
40
+ ...(usesPiCodingAgentStateCompatibility(command) ? [PI_CODING_AGENT_SESSION_DIR_ENV] : []),
41
+ ]);
42
+ }
43
+ export function agentDirEnvSource(env) {
44
+ if (isEnvSet(env[PI_WEBUI_AGENT_DIR_ENV]))
45
+ return "pi-webui";
46
+ if (isEnvSet(env[PI_CODING_AGENT_DIR_ENV]))
47
+ return "pi-compatibility";
48
+ return undefined;
49
+ }
50
+ export function hasAgentDirEnvOverride(env, command = DEFAULT_AGENT_COMMAND) {
51
+ const source = agentDirEnvSource(env);
52
+ return source === "pi-webui" || (source === "pi-compatibility" && usesPiCodingAgentStateCompatibility(command));
53
+ }
54
+ export function hasAgentSessionDirEnvOverride(env, command = DEFAULT_AGENT_COMMAND) {
55
+ return agentSessionDirEnvKeys(command).some((key) => isEnvSet(env[key]));
56
+ }
57
+ export function effectiveUploadsConfig(config = {}) {
58
+ return { defaultFolder: config.uploads?.defaultFolder ?? DEFAULT_UPLOADS_FOLDER };
59
+ }
60
+ export function maxUploadBytes(env = process.env, config = {}) {
61
+ const fromEnv = env["PI_WEBUI_MAX_UPLOAD_BYTES"];
62
+ if (fromEnv !== undefined && fromEnv !== "") {
63
+ const parsed = Number(fromEnv);
64
+ if (Number.isInteger(parsed) && parsed > 0)
65
+ return parsed;
66
+ }
67
+ if (config.maxUploadBytes !== undefined)
68
+ return config.maxUploadBytes;
69
+ return DEFAULT_MAX_UPLOAD_BYTES;
70
+ }
71
+ export function piWebUiDataDir(env = process.env, cwd = process.cwd()) {
72
+ const configured = env["PI_WEBUI_DATA_DIR"];
73
+ if (configured === undefined || configured === "")
74
+ return defaultPiWebUiDataDir();
75
+ return resolve(cwd, configured);
76
+ }
77
+ export function piWebUiConfigPath(env = process.env, cwd = process.cwd()) {
78
+ const configured = env["PI_WEBUI_CONFIG"];
79
+ if (configured === undefined || configured === "")
80
+ return defaultPiWebUiConfigPath(env);
81
+ return resolve(cwd, configured);
82
+ }
83
+ export function loadPiWebUiConfig(options = {}) {
84
+ const env = options.env ?? process.env;
85
+ const path = piWebUiConfigPath(env, options.cwd ?? process.cwd());
86
+ if (!existsSync(path))
87
+ return { path, exists: false, config: {} };
88
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
89
+ if (!isRecord(parsed))
90
+ throw new Error(`PI WEBUI config must be a JSON object: ${path}`);
91
+ return { path, exists: true, config: parsePiWebUiConfig(parsed, path) };
92
+ }
93
+ export function effectivePiWebUiConfig(options = {}) {
94
+ return resolveEffectivePiWebUiConfig(loadPiWebUiConfig(options), options);
95
+ }
96
+ export function resolveEffectivePiWebUiConfig(loaded, options = {}) {
97
+ const env = options.env ?? process.env;
98
+ const host = env["PI_WEBUI_HOST"];
99
+ const port = env["PI_WEBUI_PORT"] ?? env["PORT"];
100
+ const allowedHosts = env["PI_WEBUI_ALLOWED_HOSTS"];
101
+ const maxUpload = env["PI_WEBUI_MAX_UPLOAD_BYTES"];
102
+ const agent = effectiveAgentConfig(env, loaded.config);
103
+ return {
104
+ ...loaded,
105
+ config: {
106
+ ...loaded.config,
107
+ ...(host !== undefined && host !== "" ? { host } : {}),
108
+ ...(port !== undefined && port !== "" ? { port: parsePort(port, "PI_WEBUI_PORT") } : {}),
109
+ ...(allowedHosts !== undefined && allowedHosts !== "" ? { allowedHosts: parseAllowedHostsEnv(allowedHosts) } : {}),
110
+ ...(maxUpload !== undefined && maxUpload !== "" ? { maxUploadBytes: parseMaxUploadBytes(maxUpload, "PI_WEBUI_MAX_UPLOAD_BYTES") } : {}),
111
+ uploads: effectiveUploadsConfig(loaded.config),
112
+ // Always resolved (on by default) so the effective config is the single
113
+ // source of truth for the runtime state and the settings UI toggle.
114
+ spawnSessions: spawnSessionsEnabled(env, loaded.config),
115
+ // Beta capability, resolved off by default.
116
+ subsessions: subsessionsEnabled(env, loaded.config),
117
+ agent: { command: agent.command, dir: agent.dir },
118
+ },
119
+ };
120
+ }
121
+ export function savePiWebUiConfig(config, options = {}) {
122
+ const env = options.env ?? process.env;
123
+ const path = piWebUiConfigPath(env, options.cwd ?? process.cwd());
124
+ const normalized = parsePiWebUiConfig(piWebUiConfigRecord(config), path);
125
+ effectiveAgentConfig(env, normalized);
126
+ const existing = readExistingConfigObject(path);
127
+ if (existing["agent"] !== undefined)
128
+ parseAgentConfig(existing["agent"], path);
129
+ delete existing["host"];
130
+ delete existing["port"];
131
+ delete existing["allowedHosts"];
132
+ delete existing["shortcuts"];
133
+ delete existing["plugins"];
134
+ delete existing["pathAccess"];
135
+ delete existing["uploads"];
136
+ delete existing["maxUploadBytes"];
137
+ delete existing["spawnSessions"];
138
+ delete existing["subsessions"];
139
+ delete existing["agent"];
140
+ const merged = { ...existing, ...piWebUiConfigRecord(normalized) };
141
+ mkdirSync(dirname(path), { recursive: true });
142
+ writeFileSync(path, `${JSON.stringify(merged, null, 2)}\n`, "utf8");
143
+ return { path, exists: true, config: normalized };
144
+ }
145
+ function readExistingConfigObject(path) {
146
+ if (!existsSync(path))
147
+ return {};
148
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
149
+ if (!isRecord(parsed))
150
+ throw new Error(`PI WEBUI config must be a JSON object: ${path}`);
151
+ return parsed;
152
+ }
153
+ function piWebUiConfigRecord(config) {
154
+ return {
155
+ ...(config.host !== undefined ? { host: config.host } : {}),
156
+ ...(config.port !== undefined ? { port: config.port } : {}),
157
+ ...(config.allowedHosts !== undefined ? { allowedHosts: config.allowedHosts } : {}),
158
+ ...(config.shortcuts !== undefined ? { shortcuts: config.shortcuts } : {}),
159
+ ...(config.plugins !== undefined ? { plugins: config.plugins } : {}),
160
+ ...(config.pathAccess !== undefined ? { pathAccess: config.pathAccess } : {}),
161
+ ...(config.uploads !== undefined ? { uploads: config.uploads } : {}),
162
+ ...(config.maxUploadBytes !== undefined ? { maxUploadBytes: config.maxUploadBytes } : {}),
163
+ ...(config.spawnSessions !== undefined ? { spawnSessions: config.spawnSessions } : {}),
164
+ ...(config.subsessions !== undefined ? { subsessions: config.subsessions } : {}),
165
+ ...(config.agent !== undefined ? { agent: config.agent } : {}),
166
+ };
167
+ }
168
+ function parsePiWebUiConfig(value, path) {
169
+ return {
170
+ ...(value["host"] !== undefined ? { host: parseString(value["host"], "host", path) } : {}),
171
+ ...(value["port"] !== undefined ? { port: parsePort(value["port"], "port", path) } : {}),
172
+ ...(value["allowedHosts"] !== undefined ? { allowedHosts: parseAllowedHosts(value["allowedHosts"], path) } : {}),
173
+ ...(value["shortcuts"] !== undefined ? { shortcuts: parseShortcuts(value["shortcuts"], path) } : {}),
174
+ ...(value["plugins"] !== undefined ? { plugins: parsePlugins(value["plugins"], path) } : {}),
175
+ ...(value["pathAccess"] !== undefined ? { pathAccess: parsePathAccessConfig(value["pathAccess"], path) } : {}),
176
+ ...(value["uploads"] !== undefined ? { uploads: parseUploadsConfig(value["uploads"], path) } : {}),
177
+ ...(value["maxUploadBytes"] !== undefined ? { maxUploadBytes: parseMaxUploadBytes(value["maxUploadBytes"], "maxUploadBytes", path) } : {}),
178
+ ...(value["spawnSessions"] !== undefined ? { spawnSessions: parseSpawnSessions(value["spawnSessions"], path) } : {}),
179
+ ...(value["subsessions"] !== undefined ? { subsessions: parseSubsessions(value["subsessions"], path) } : {}),
180
+ ...(value["agent"] !== undefined ? { agent: parseAgentConfig(value["agent"], path) } : {}),
181
+ };
182
+ }
183
+ function parseMaxUploadBytes(value, key, path = "environment") {
184
+ const bytes = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
185
+ if (!Number.isInteger(bytes) || bytes < 1)
186
+ throw new Error(`PI WEBUI config ${key} must be a positive integer: ${path}`);
187
+ return bytes;
188
+ }
189
+ function parseSpawnSessions(value, path) {
190
+ if (typeof value !== "boolean")
191
+ throw new Error(`PI WEBUI config spawnSessions must be a boolean: ${path}`);
192
+ return value;
193
+ }
194
+ /**
195
+ * Whether LLMs may start new sessions via the spawn_session tool. On by default
196
+ * (spawned sessions appear in the session list, so humans notice them); set the
197
+ * env var `PI_WEBUI_SPAWN_SESSIONS` or the `spawnSessions` config key to `false`
198
+ * to disable. The env var takes precedence over the config file.
199
+ */
200
+ export function spawnSessionsEnabled(env = process.env, config = {}) {
201
+ const fromEnv = env["PI_WEBUI_SPAWN_SESSIONS"];
202
+ if (fromEnv !== undefined && fromEnv !== "")
203
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
204
+ return config.spawnSessions ?? true;
205
+ }
206
+ function parseSubsessions(value, path) {
207
+ if (typeof value !== "boolean")
208
+ throw new Error(`PI WEBUI config subsessions must be a boolean: ${path}`);
209
+ return value;
210
+ }
211
+ /**
212
+ * Beta: whether LLMs may start tracked child sessions via the spawn_subsession
213
+ * family of tools. Off by default while the capability stabilizes, so it can
214
+ * ship in main without affecting releases; enable with the env var
215
+ * `PI_WEBUI_SUBSESSIONS` or the `subsessions` config key. The env var takes
216
+ * precedence over the config file. Subsessions also require spawnSessions to be
217
+ * enabled (they share the same project-scope resolver).
218
+ */
219
+ export function subsessionsEnabled(env = process.env, config = {}) {
220
+ const fromEnv = env["PI_WEBUI_SUBSESSIONS"];
221
+ if (fromEnv !== undefined && fromEnv !== "")
222
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
223
+ return config.subsessions ?? false;
224
+ }
225
+ function parseString(value, key, path) {
226
+ if (typeof value !== "string" || value === "")
227
+ throw new Error(`PI WEBUI config ${key} must be a non-empty string: ${path}`);
228
+ return value;
229
+ }
230
+ const AGENT_CONFIG_KEYS = new Set(["command", "dir"]);
231
+ const SAFE_BARE_AGENT_COMMAND_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9._+-]*$/u;
232
+ export function parseAgentConfig(value, path, pathHost = "current") {
233
+ if (!isRecord(value))
234
+ throw new Error(`PI WEBUI config agent must be an object: ${path}`);
235
+ const unknownKey = Object.keys(value).find((key) => !AGENT_CONFIG_KEYS.has(key));
236
+ if (unknownKey !== undefined)
237
+ throw new Error(`PI WEBUI config agent contains unknown key ${JSON.stringify(unknownKey)}: ${path}`);
238
+ const command = value["command"];
239
+ const dir = value["dir"];
240
+ return {
241
+ ...(command !== undefined ? { command: parseAgentCommand(command, "agent.command", path, pathHost) } : {}),
242
+ ...(dir !== undefined ? { dir: parseAgentDir(dir, "agent.dir", path, pathHost) } : {}),
243
+ };
244
+ }
245
+ function parseAgentCommand(value, key, path, pathHost) {
246
+ const command = parseString(value, key, path).trim();
247
+ if (!isSafeAgentCommand(command, pathHost)) {
248
+ const absoluteLabel = pathHost === "current" ? "host-absolute" : "absolute";
249
+ throw new Error(`PI WEBUI config ${key} must be a safe bare executable name or ${absoluteLabel} executable path: ${path}`);
250
+ }
251
+ return command;
252
+ }
253
+ function parseAgentDir(value, key, path, pathHost) {
254
+ const dir = parseString(value, key, path).trim();
255
+ const isAbsoluteDir = pathHost === "current" ? isHostAbsoluteAgentDir(dir) : isPortableAbsoluteAgentPath(dir);
256
+ if (!isAbsoluteDir && !isHomePath(dir, pathHost)) {
257
+ const absoluteLabel = pathHost === "current" ? "a host-absolute" : "an absolute";
258
+ throw new Error(`PI WEBUI config ${key} must be ${absoluteLabel} path or start with ~: ${path}`);
259
+ }
260
+ return dir;
261
+ }
262
+ function resolveAgentDirPath(value, env, key, path) {
263
+ const parsed = parseAgentDir(value, key, path, "current");
264
+ const expanded = expandHomePath(parsed, env);
265
+ if (!isHostAbsoluteAgentDir(expanded)) {
266
+ throw new Error(`PI WEBUI config ${key} must resolve to a host-absolute path: ${path}`);
267
+ }
268
+ return normalize(expanded);
269
+ }
270
+ export function isSafeAgentCommandForHost(value) {
271
+ return isSafeAgentCommand(value, "current");
272
+ }
273
+ function isSafeAgentCommand(value, pathHost) {
274
+ if (value === "" || value !== value.trim() || value.includes("\0") || /[\s;&|`$<>]/u.test(value))
275
+ return false;
276
+ if (SAFE_BARE_AGENT_COMMAND_PATTERN.test(value))
277
+ return true;
278
+ if (pathHost === "current")
279
+ return isAbsolute(value) && basename(value) !== "";
280
+ return isAbsoluteLike(value) && value.split(/[\\/]/u).at(-1) !== "";
281
+ }
282
+ export function isHostAbsoluteAgentDir(value) {
283
+ return isSafeAgentDirPath(value) && isAbsolute(value);
284
+ }
285
+ function isPortableAbsoluteAgentPath(value) {
286
+ return isSafeAgentDirPath(value) && isAbsoluteLike(value);
287
+ }
288
+ function isSafeAgentDirPath(value) {
289
+ return value !== "" && value === value.trim() && !hasControlCharacter(value);
290
+ }
291
+ function parsePort(value, key, path = "environment") {
292
+ const port = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
293
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
294
+ throw new Error(`PI WEBUI config ${key} must be an integer from 1 to 65535: ${path}`);
295
+ return port;
296
+ }
297
+ function parseAllowedHosts(value, path) {
298
+ if (value === true)
299
+ return true;
300
+ if (!isNonEmptyStringArray(value)) {
301
+ throw new Error(`PI WEBUI config allowedHosts must be true or an array of non-empty strings: ${path}`);
302
+ }
303
+ return value;
304
+ }
305
+ function parseAllowedHostsEnv(value) {
306
+ if (value === "true")
307
+ return true;
308
+ return value.split(",").map((host) => host.trim()).filter((host) => host !== "");
309
+ }
310
+ export function parsePathAccessConfig(value, path) {
311
+ if (!isRecord(value))
312
+ throw new Error(`PI WEBUI config pathAccess must be an object: ${path}`);
313
+ const allowedPaths = value["allowedPaths"];
314
+ return {
315
+ ...(allowedPaths !== undefined ? { allowedPaths: parseAllowedPaths(allowedPaths, path) } : {}),
316
+ };
317
+ }
318
+ function parseAllowedPaths(value, path) {
319
+ if (!isNonEmptyStringArray(value))
320
+ throw new Error(`PI WEBUI config pathAccess.allowedPaths must be an array of non-empty strings: ${path}`);
321
+ return value;
322
+ }
323
+ export function parseUploadsConfig(value, path) {
324
+ if (!isRecord(value))
325
+ throw new Error(`PI WEBUI config uploads must be an object: ${path}`);
326
+ const defaultFolder = value["defaultFolder"];
327
+ return {
328
+ ...(defaultFolder !== undefined ? { defaultFolder: parseWorkspaceRelativeFolder(defaultFolder, "uploads.defaultFolder", path) } : {}),
329
+ };
330
+ }
331
+ function parseWorkspaceRelativeFolder(value, key, path) {
332
+ if (typeof value !== "string" || value.trim() === "")
333
+ throw new Error(`PI WEBUI config ${key} must be a non-empty workspace-relative path: ${path}`);
334
+ if (isAbsoluteLike(value))
335
+ throw new Error(`PI WEBUI config ${key} must be workspace-relative: ${path}`);
336
+ const parts = value.split(/[\\/]+/).filter((part) => part !== "" && part !== ".");
337
+ if (parts.length === 0)
338
+ throw new Error(`PI WEBUI config ${key} must be a non-empty workspace-relative path: ${path}`);
339
+ if (parts.some((part) => part === ".."))
340
+ throw new Error(`PI WEBUI config ${key} must not contain path traversal: ${path}`);
341
+ return parts.join("/");
342
+ }
343
+ function isHomePath(value, pathHost) {
344
+ return value === "~" || value.startsWith("~/") || ((pathHost === "portable" || process.platform === "win32") && value.startsWith("~\\"));
345
+ }
346
+ function expandHomePath(value, env) {
347
+ const home = env["HOME"] !== undefined && env["HOME"] !== "" ? env["HOME"] : homedir();
348
+ if (value === "~")
349
+ return home;
350
+ if (value.startsWith("~/") || (process.platform === "win32" && value.startsWith("~\\")))
351
+ return join(home, value.slice(2));
352
+ return value;
353
+ }
354
+ function defaultAgentDirForCommand(command, env) {
355
+ if (usesPiCodingAgentStateCompatibility(command))
356
+ return expandHomePath("~/.pi/agent", env);
357
+ throw new Error(`PI WEBUI config agent.dir or ${PI_WEBUI_AGENT_DIR_ENV} is required when agent.command is ${JSON.stringify(command)}`);
358
+ }
359
+ function envValue(env, key) {
360
+ const value = env[key];
361
+ return value !== undefined && value !== "" ? value : undefined;
362
+ }
363
+ function isEnvSet(value) {
364
+ return value !== undefined && value !== "";
365
+ }
366
+ function uniqueStrings(values) {
367
+ return [...new Set(values)];
368
+ }
369
+ function hasControlCharacter(value) {
370
+ for (const character of value) {
371
+ const code = character.charCodeAt(0);
372
+ if (code < 32 || code === 127)
373
+ return true;
374
+ }
375
+ return false;
376
+ }
377
+ function isAbsoluteLike(value) {
378
+ const withForwardSlashes = value.replace(/\\/g, "/");
379
+ return isAbsolute(value) || withForwardSlashes.startsWith("/") || /^[A-Za-z]:\//.test(withForwardSlashes);
380
+ }
381
+ function parseShortcuts(value, path) {
382
+ if (!isRecord(value))
383
+ throw new Error(`PI WEBUI config shortcuts must be an object: ${path}`);
384
+ return Object.fromEntries(Object.entries(value).map(([actionId, shortcut]) => {
385
+ if (shortcut !== null && (typeof shortcut !== "string" || shortcut === "")) {
386
+ throw new Error(`PI WEBUI config shortcut values must be non-empty strings or null: ${path}`);
387
+ }
388
+ return [actionId, shortcut];
389
+ }));
390
+ }
391
+ function parsePlugins(value, path) {
392
+ if (!isRecord(value) || Array.isArray(value))
393
+ throw new Error(`PI WEBUI config plugins must be an object: ${path}`);
394
+ return Object.fromEntries(Object.entries(value).map(([pluginId, config]) => {
395
+ if (!isPiWebUiPluginId(pluginId))
396
+ throw new Error(`PI WEBUI config plugin ids must match ${piWebUiPluginIdPattern.source}: ${path}`);
397
+ if (!isRecord(config) || Array.isArray(config))
398
+ throw new Error(`PI WEBUI config plugin entries must be objects: ${path}`);
399
+ const enabled = config["enabled"];
400
+ if (enabled !== undefined && typeof enabled !== "boolean")
401
+ throw new Error(`PI WEBUI config plugin enabled values must be booleans: ${path}`);
402
+ const settings = config["settings"];
403
+ if (settings !== undefined && (!isRecord(settings) || Array.isArray(settings)))
404
+ throw new Error(`PI WEBUI config plugin settings must be objects: ${path}`);
405
+ return [pluginId, config];
406
+ }));
407
+ }
408
+ function isRecord(value) {
409
+ return typeof value === "object" && value !== null && !Array.isArray(value);
410
+ }
411
+ function isNonEmptyStringArray(value) {
412
+ return Array.isArray(value) && value.every((item) => typeof item === "string" && item !== "");
413
+ }
414
+ export function examplePiWebUiConfig(config = {}) {
415
+ return `${JSON.stringify({ host: config.host ?? "127.0.0.1", port: config.port ?? DEFAULT_PORT, allowedHosts: config.allowedHosts ?? [] }, null, 2)}\n`;
416
+ }
417
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}