@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,309 @@
1
+ import { agentDirEnvSource, hasAgentDirEnvOverride, hasAgentSessionDirEnvOverride, loadPiWebUiConfig, parseAgentConfig, parseUploadsConfig, resolveEffectivePiWebUiConfig, savePiWebUiConfig } from "../config.js";
2
+ import { isPiWebUiPluginId } from "../shared/pluginIds.js";
3
+ export const SELECTED_MACHINE_CONFIG_KEYS = [
4
+ "plugins",
5
+ "pathAccess",
6
+ "uploads",
7
+ "maxUploadBytes",
8
+ "spawnSessions",
9
+ "subsessions",
10
+ "agent",
11
+ ];
12
+ const SELECTED_MACHINE_CONFIG_KEY_SET = new Set(SELECTED_MACHINE_CONFIG_KEYS);
13
+ export function createFilePiWebUiConfigService(options = {}) {
14
+ return {
15
+ read: () => currentPiWebUiConfigResponse(options),
16
+ write: (config) => {
17
+ savePiWebUiConfig(config, options);
18
+ return currentPiWebUiConfigResponse(options);
19
+ },
20
+ };
21
+ }
22
+ export function currentPiWebUiConfigResponse(options = {}) {
23
+ const loaded = loadPiWebUiConfig(options);
24
+ const effective = resolveEffectivePiWebUiConfig(loaded, options);
25
+ const env = options.env ?? process.env;
26
+ return {
27
+ path: loaded.path,
28
+ exists: loaded.exists,
29
+ config: loaded.config,
30
+ effectiveConfig: effective.config,
31
+ envOverrides: piWebUiConfigEnvOverrides(env, effective.config),
32
+ };
33
+ }
34
+ export function registerConfigRoutes(app, service = createFilePiWebUiConfigService()) {
35
+ app.get("/api/config", async (_request, reply) => {
36
+ try {
37
+ return await service.read();
38
+ }
39
+ catch (error) {
40
+ return reply.code(500).send({ error: errorMessage(error) });
41
+ }
42
+ });
43
+ app.put("/api/config", async (request, reply) => {
44
+ try {
45
+ return await service.write(parseConfigRequest(request.body?.config));
46
+ }
47
+ catch (error) {
48
+ const status = isConfigValidationError(error) ? 400 : 500;
49
+ return reply.code(status).send({ error: errorMessage(error) });
50
+ }
51
+ });
52
+ }
53
+ export function registerLocalMachineConfigRoutes(app, service = createFilePiWebUiConfigService()) {
54
+ app.get("/api/machines/local/config", async (_request, reply) => {
55
+ try {
56
+ return selectedMachineConfigResponse(await service.read());
57
+ }
58
+ catch (error) {
59
+ return reply.code(500).send({ error: errorMessage(error) });
60
+ }
61
+ });
62
+ app.put("/api/machines/local/config", async (request, reply) => {
63
+ try {
64
+ const current = await service.read();
65
+ const patch = parseSelectedMachineConfigRequest(request.body?.config);
66
+ return selectedMachineConfigResponse(await service.write(mergeSelectedMachineConfig(current.config, patch)));
67
+ }
68
+ catch (error) {
69
+ const status = isConfigValidationError(error) ? 400 : 500;
70
+ return reply.code(status).send({ error: errorMessage(error) });
71
+ }
72
+ });
73
+ }
74
+ export function parseSelectedMachineConfigRequest(value, agentPathHost = "current") {
75
+ if (!isRecord(value))
76
+ throw new Error("PI WEBUI selected-machine config update must include a config object");
77
+ for (const key of Object.keys(value)) {
78
+ if (!SELECTED_MACHINE_CONFIG_KEY_SET.has(key))
79
+ throw new Error(`PI WEBUI selected-machine config key is not allowed: ${key}`);
80
+ }
81
+ try {
82
+ return pickSelectedMachineConfig(parseConfigRequest(value, agentPathHost));
83
+ }
84
+ catch (error) {
85
+ throw new Error(selectedMachineConfigErrorMessage(error), { cause: error });
86
+ }
87
+ }
88
+ export function mergeSelectedMachineConfig(current, patch) {
89
+ return { ...current, ...pickSelectedMachineConfig(patch) };
90
+ }
91
+ export function selectedMachineConfigResponse(response) {
92
+ return {
93
+ ...response,
94
+ config: pickSelectedMachineConfig(response.config),
95
+ effectiveConfig: pickSelectedMachineConfig(response.effectiveConfig),
96
+ };
97
+ }
98
+ export function parsePiWebUiConfigResponseBody(value, source = "PI WEBUI config response") {
99
+ const record = requireResponseRecord(value, source);
100
+ return {
101
+ path: requireResponseString(record, "path", source),
102
+ exists: requireResponseBoolean(record, "exists", source),
103
+ config: parseConfigRequest(record["config"], "portable"),
104
+ effectiveConfig: parseConfigRequest(record["effectiveConfig"], "portable"),
105
+ envOverrides: parsePiWebUiConfigEnvOverridesResponse(record["envOverrides"], source),
106
+ };
107
+ }
108
+ function parseConfigRequest(value, agentPathHost = "current") {
109
+ if (!isRecord(value))
110
+ throw new Error("PI WEBUI config update must include a config object");
111
+ const config = {};
112
+ const host = value["host"];
113
+ const port = value["port"];
114
+ const allowedHosts = value["allowedHosts"];
115
+ const shortcuts = value["shortcuts"];
116
+ const plugins = value["plugins"];
117
+ const pathAccess = value["pathAccess"];
118
+ const uploads = value["uploads"];
119
+ const maxUploadBytes = value["maxUploadBytes"];
120
+ const spawnSessions = value["spawnSessions"];
121
+ const subsessions = value["subsessions"];
122
+ const agent = value["agent"];
123
+ if (host !== undefined) {
124
+ if (typeof host !== "string")
125
+ throw new Error("PI WEBUI config host must be a string");
126
+ config.host = host;
127
+ }
128
+ if (port !== undefined) {
129
+ if (typeof port !== "number")
130
+ throw new Error("PI WEBUI config port must be a number");
131
+ config.port = port;
132
+ }
133
+ if (allowedHosts !== undefined)
134
+ config.allowedHosts = parseAllowedHostsRequest(allowedHosts);
135
+ if (shortcuts !== undefined)
136
+ config.shortcuts = parseShortcutsRequest(shortcuts);
137
+ if (plugins !== undefined)
138
+ config.plugins = parsePluginsRequest(plugins);
139
+ if (pathAccess !== undefined)
140
+ config.pathAccess = parsePathAccessRequest(pathAccess);
141
+ if (uploads !== undefined)
142
+ config.uploads = parseUploadsConfig(uploads, "request");
143
+ if (maxUploadBytes !== undefined)
144
+ config.maxUploadBytes = parseMaxUploadBytesRequest(maxUploadBytes);
145
+ if (spawnSessions !== undefined) {
146
+ if (typeof spawnSessions !== "boolean")
147
+ throw new Error("PI WEBUI config spawnSessions must be a boolean");
148
+ config.spawnSessions = spawnSessions;
149
+ }
150
+ if (subsessions !== undefined) {
151
+ if (typeof subsessions !== "boolean")
152
+ throw new Error("PI WEBUI config subsessions must be a boolean");
153
+ config.subsessions = subsessions;
154
+ }
155
+ if (agent !== undefined)
156
+ config.agent = parseAgentRequest(agent, agentPathHost);
157
+ return config;
158
+ }
159
+ function pickSelectedMachineConfig(config) {
160
+ return {
161
+ ...(config.plugins !== undefined ? { plugins: config.plugins } : {}),
162
+ ...(config.pathAccess !== undefined ? { pathAccess: config.pathAccess } : {}),
163
+ ...(config.uploads !== undefined ? { uploads: config.uploads } : {}),
164
+ ...(config.maxUploadBytes !== undefined ? { maxUploadBytes: config.maxUploadBytes } : {}),
165
+ ...(config.spawnSessions !== undefined ? { spawnSessions: config.spawnSessions } : {}),
166
+ ...(config.subsessions !== undefined ? { subsessions: config.subsessions } : {}),
167
+ ...(config.agent !== undefined ? { agent: config.agent } : {}),
168
+ };
169
+ }
170
+ function selectedMachineConfigErrorMessage(error) {
171
+ const message = errorMessage(error);
172
+ if (message.startsWith("PI WEBUI config "))
173
+ return `PI WEBUI selected-machine config ${message.slice("PI WEBUI config ".length)}`;
174
+ return `PI WEBUI selected-machine config ${message}`;
175
+ }
176
+ function parseAllowedHostsRequest(value) {
177
+ if (value === true)
178
+ return true;
179
+ if (!Array.isArray(value) || !value.every((item) => typeof item === "string")) {
180
+ throw new Error("PI WEBUI config allowedHosts must be true or an array of strings");
181
+ }
182
+ return value;
183
+ }
184
+ function parseShortcutsRequest(value) {
185
+ if (!isRecord(value))
186
+ throw new Error("PI WEBUI config shortcuts must be an object");
187
+ return Object.fromEntries(Object.entries(value).map(([actionId, shortcut]) => {
188
+ if (shortcut !== null && (typeof shortcut !== "string" || shortcut === ""))
189
+ throw new Error("PI WEBUI config shortcut values must be non-empty strings or null");
190
+ return [actionId, shortcut];
191
+ }));
192
+ }
193
+ function parsePathAccessRequest(value) {
194
+ if (!isRecord(value))
195
+ throw new Error("PI WEBUI config pathAccess must be an object");
196
+ const allowedPaths = value["allowedPaths"];
197
+ return {
198
+ ...(allowedPaths === undefined ? {} : { allowedPaths: parseAllowedPathsRequest(allowedPaths) }),
199
+ };
200
+ }
201
+ function parseAllowedPathsRequest(value) {
202
+ if (!isNonEmptyStringArray(value)) {
203
+ throw new Error("PI WEBUI config pathAccess.allowedPaths must be an array of non-empty strings");
204
+ }
205
+ return value;
206
+ }
207
+ function isNonEmptyStringArray(value) {
208
+ return Array.isArray(value) && value.every((item) => typeof item === "string" && item !== "");
209
+ }
210
+ function parseMaxUploadBytesRequest(value) {
211
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1)
212
+ throw new Error("PI WEBUI config maxUploadBytes must be a positive integer");
213
+ return value;
214
+ }
215
+ function parseAgentRequest(value, pathHost) {
216
+ return parseAgentConfig(value, "request", pathHost);
217
+ }
218
+ function parsePluginsRequest(value) {
219
+ if (!isRecord(value) || Array.isArray(value))
220
+ throw new Error("PI WEBUI config plugins must be an object");
221
+ return Object.fromEntries(Object.entries(value).map(([pluginId, config]) => {
222
+ if (!isPiWebUiPluginId(pluginId))
223
+ throw new Error("PI WEBUI config plugin ids are invalid");
224
+ if (!isRecord(config) || Array.isArray(config))
225
+ throw new Error("PI WEBUI config plugin entries must be objects");
226
+ const enabled = config["enabled"];
227
+ if (enabled !== undefined && typeof enabled !== "boolean")
228
+ throw new Error("PI WEBUI config plugin enabled values must be booleans");
229
+ const settings = config["settings"];
230
+ if (settings !== undefined && (!isRecord(settings) || Array.isArray(settings)))
231
+ throw new Error("PI WEBUI config plugin settings must be objects");
232
+ return [pluginId, config];
233
+ }));
234
+ }
235
+ function parsePiWebUiConfigEnvOverridesResponse(value, source) {
236
+ const record = requireResponseRecord(value, `${source} envOverrides`);
237
+ return {
238
+ host: requireResponseBoolean(record, "host", source),
239
+ port: requireResponseBoolean(record, "port", source),
240
+ allowedHosts: requireResponseBoolean(record, "allowedHosts", source),
241
+ spawnSessions: requireResponseBoolean(record, "spawnSessions", source),
242
+ subsessions: requireResponseBoolean(record, "subsessions", source),
243
+ agentCommand: optionalResponseBoolean(record, "agentCommand", source) ?? false,
244
+ agentDir: optionalResponseBoolean(record, "agentDir", source) ?? false,
245
+ ...optionalAgentDirSource(record, source),
246
+ agentSessionDir: optionalResponseBoolean(record, "agentSessionDir", source) ?? false,
247
+ };
248
+ }
249
+ function requireResponseRecord(value, source) {
250
+ if (!isRecord(value))
251
+ throw new Error(`${source} must be an object`);
252
+ return value;
253
+ }
254
+ function requireResponseString(record, key, source) {
255
+ const value = record[key];
256
+ if (typeof value !== "string")
257
+ throw new Error(`${source} field must be a string: ${key}`);
258
+ return value;
259
+ }
260
+ function requireResponseBoolean(record, key, source) {
261
+ const value = record[key];
262
+ if (typeof value !== "boolean")
263
+ throw new Error(`${source} field must be a boolean: ${key}`);
264
+ return value;
265
+ }
266
+ function optionalResponseBoolean(record, key, source) {
267
+ const value = record[key];
268
+ if (value === undefined)
269
+ return undefined;
270
+ if (typeof value !== "boolean")
271
+ throw new Error(`${source} field must be a boolean: ${key}`);
272
+ return value;
273
+ }
274
+ function optionalAgentDirSource(record, source) {
275
+ const value = record["agentDirSource"];
276
+ if (value === undefined)
277
+ return {};
278
+ if (value !== "pi-webui" && value !== "pi-compatibility")
279
+ throw new Error(`${source} field must be a valid agent directory source: agentDirSource`);
280
+ return { agentDirSource: value };
281
+ }
282
+ function piWebUiConfigEnvOverrides(env, config = {}) {
283
+ const command = config.agent?.command;
284
+ const dirEnvSource = agentDirEnvSource(env);
285
+ return {
286
+ host: isEnvSet(env["PI_WEBUI_HOST"]),
287
+ port: isEnvSet(env["PI_WEBUI_PORT"]) || isEnvSet(env["PORT"]),
288
+ allowedHosts: isEnvSet(env["PI_WEBUI_ALLOWED_HOSTS"]),
289
+ spawnSessions: isEnvSet(env["PI_WEBUI_SPAWN_SESSIONS"]),
290
+ subsessions: isEnvSet(env["PI_WEBUI_SUBSESSIONS"]),
291
+ agentCommand: isEnvSet(env["PI_WEBUI_AGENT_COMMAND"]),
292
+ agentDir: hasAgentDirEnvOverride(env, command),
293
+ ...(dirEnvSource === undefined ? {} : { agentDirSource: dirEnvSource }),
294
+ agentSessionDir: hasAgentSessionDirEnvOverride(env, command),
295
+ };
296
+ }
297
+ function isEnvSet(value) {
298
+ return value !== undefined && value !== "";
299
+ }
300
+ function isConfigValidationError(error) {
301
+ return error instanceof Error && (error.message.startsWith("PI WEBUI config") || error.message.startsWith("PI WEBUI selected-machine config"));
302
+ }
303
+ function errorMessage(error) {
304
+ return error instanceof Error ? error.message : String(error);
305
+ }
306
+ function isRecord(value) {
307
+ return typeof value === "object" && value !== null && !Array.isArray(value);
308
+ }
309
+ //# sourceMappingURL=configRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configRoutes.js","sourceRoot":"","sources":["../../src/server/configRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { createRequire } from "node:module";
2
+ export const NODE_PTY_GLOBAL_REINSTALL_COMMAND = "npm install -g @hyperdreamer/pi-webui --allow-scripts=node-pty";
3
+ const doctorLabel = "node-pty native module loadable";
4
+ const requireFromHere = createRequire(import.meta.url);
5
+ export function checkNodePtyNativeModule(options = {}) {
6
+ try {
7
+ (options.load ?? loadNodePty)();
8
+ return { status: "ok" };
9
+ }
10
+ catch (error) {
11
+ return { status: "load-failed", message: errorMessage(error) };
12
+ }
13
+ }
14
+ export function formatNodePtyNativeModuleCheck(check) {
15
+ if (check.status === "ok")
16
+ return { ok: true, lines: [`✓ ${doctorLabel}`] };
17
+ return {
18
+ ok: false,
19
+ lines: [
20
+ `✗ ${doctorLabel}`,
21
+ ` Could not load node-pty: ${check.message}`,
22
+ " npm may have skipped node-pty's required install script.",
23
+ " For a global npm installation, reinstall PI WEBUI with:",
24
+ ` ${NODE_PTY_GLOBAL_REINSTALL_COMMAND}`,
25
+ " Then run `pi-webui doctor` again.",
26
+ ],
27
+ };
28
+ }
29
+ function loadNodePty() {
30
+ return requireFromHere("node-pty");
31
+ }
32
+ function errorMessage(error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ return message.replaceAll(/\s+/g, " ").trim();
35
+ }
36
+ //# sourceMappingURL=nodePtyNativeModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodePtyNativeModule.js","sourceRoot":"","sources":["../../../src/server/diagnostics/nodePtyNativeModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,iCAAiC,GAAG,gEAAgE,CAAC;AAElH,MAAM,WAAW,GAAG,iCAAiC,CAAC;AACtD,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAiBvD,MAAM,UAAU,wBAAwB,CAAC,UAA2C,EAAE;IACpF,IAAI,CAAC;QACH,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA+B;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5E,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,KAAK,WAAW,EAAE;YAClB,8BAA8B,KAAK,CAAC,OAAO,EAAE;YAC7C,4DAA4D;YAC5D,2DAA2D;YAC3D,OAAO,iCAAiC,EAAE;YAC1C,qCAAqC;SACtC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { accessSync, constants, existsSync, statSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ export const PI_WEBUI_SPAWN_HELPER_ISSUE_URL = "https://github.com/hyperdreamer/pi-webui/issues/4";
5
+ export const NODE_PTY_SPAWN_HELPER_UPSTREAM_ISSUE_URL = "https://github.com/microsoft/node-pty/issues/850";
6
+ const doctorLabel = "node-pty macOS spawn-helper executable";
7
+ const requireFromHere = createRequire(import.meta.url);
8
+ export function checkNodePtyDarwinSpawnHelper(options = {}) {
9
+ const platform = options.platform ?? process.platform;
10
+ if (platform !== "darwin")
11
+ return { status: "skipped", reason: "not-macos" };
12
+ const arch = options.arch ?? process.arch;
13
+ const exists = options.exists ?? existsSync;
14
+ const stat = options.stat ?? statSync;
15
+ const access = options.access ?? accessSync;
16
+ let nodePtyPackageJsonPath;
17
+ try {
18
+ nodePtyPackageJsonPath = options.nodePtyPackageJsonPath ?? (options.resolveNodePtyPackageJson ?? resolveNodePtyPackageJson)();
19
+ }
20
+ catch (error) {
21
+ return { status: "node-pty-not-found", message: errorMessage(error) };
22
+ }
23
+ const nodePtyRoot = dirname(nodePtyPackageJsonPath);
24
+ const nativeDir = findNodePtyNativeDir(nodePtyRoot, platform, arch, exists);
25
+ if (nativeDir === undefined) {
26
+ return {
27
+ status: "native-module-not-found",
28
+ nodePtyRoot,
29
+ expectedHelperPath: join(nodePtyRoot, "prebuilds", `${platform}-${arch}`, "spawn-helper"),
30
+ };
31
+ }
32
+ const helperPath = join(nativeDir, "spawn-helper");
33
+ try {
34
+ if (!stat(helperPath).isFile())
35
+ return { status: "spawn-helper-not-file", helperPath, nodePtyRoot };
36
+ }
37
+ catch (error) {
38
+ if (isFileNotFoundError(error))
39
+ return { status: "spawn-helper-missing", helperPath, nodePtyRoot };
40
+ return { status: "spawn-helper-stat-error", helperPath, nodePtyRoot, message: errorMessage(error) };
41
+ }
42
+ try {
43
+ access(helperPath, constants.X_OK);
44
+ return { status: "ok", helperPath, nodePtyRoot };
45
+ }
46
+ catch {
47
+ return { status: "spawn-helper-not-executable", helperPath, nodePtyRoot, fixCommand: chmodFixCommand(helperPath) };
48
+ }
49
+ }
50
+ export function formatNodePtyDarwinSpawnHelperCheck(check) {
51
+ if (check.status === "skipped")
52
+ return { ok: true, lines: [] };
53
+ if (check.status === "ok") {
54
+ return {
55
+ ok: true,
56
+ lines: [`✓ ${doctorLabel}`, ` ${check.helperPath}`],
57
+ };
58
+ }
59
+ if (check.status === "spawn-helper-not-executable") {
60
+ return {
61
+ ok: false,
62
+ lines: [
63
+ `✗ ${doctorLabel}`,
64
+ ` ${check.helperPath} exists but is not executable.`,
65
+ ` Known upstream node-pty packaging issue: ${NODE_PTY_SPAWN_HELPER_UPSTREAM_ISSUE_URL}`,
66
+ ` PI WEBUI tracking issue: ${PI_WEBUI_SPAWN_HELPER_ISSUE_URL}`,
67
+ " Proposed workaround:",
68
+ ` ${check.fixCommand}`,
69
+ " Then run `pi-webui doctor` again and retry opening a terminal.",
70
+ ],
71
+ };
72
+ }
73
+ return {
74
+ ok: false,
75
+ lines: [`✗ ${doctorLabel}`, ...failureDetails(check)],
76
+ };
77
+ }
78
+ function resolveNodePtyPackageJson() {
79
+ return requireFromHere.resolve("node-pty/package.json");
80
+ }
81
+ function findNodePtyNativeDir(nodePtyRoot, platform, arch, exists) {
82
+ for (const dir of nodePtyNativeDirs(nodePtyRoot, platform, arch)) {
83
+ if (exists(join(dir, "pty.node")))
84
+ return dir;
85
+ }
86
+ return undefined;
87
+ }
88
+ function nodePtyNativeDirs(nodePtyRoot, platform, arch) {
89
+ const dirs = ["build/Release", "build/Debug", `prebuilds/${platform}-${arch}`];
90
+ return dirs.flatMap((dir) => [join(nodePtyRoot, dir), join(nodePtyRoot, "lib", dir)]);
91
+ }
92
+ function failureDetails(check) {
93
+ if (check.status === "node-pty-not-found") {
94
+ return [
95
+ ` Could not resolve node-pty from PI WEBUI: ${check.message}`,
96
+ " Reinstall or update PI WEBUI, then run `pi-webui doctor` again.",
97
+ ];
98
+ }
99
+ if (check.status === "native-module-not-found") {
100
+ return [
101
+ ` Could not find node-pty's native pty.node module under ${check.nodePtyRoot}.`,
102
+ ` Expected macOS helper location: ${check.expectedHelperPath}`,
103
+ " Reinstall or update PI WEBUI, then run `pi-webui doctor` again.",
104
+ ];
105
+ }
106
+ if (check.status === "spawn-helper-missing") {
107
+ return [
108
+ ` Expected helper is missing: ${check.helperPath}`,
109
+ " Reinstall or update PI WEBUI, then run `pi-webui doctor` again.",
110
+ ];
111
+ }
112
+ if (check.status === "spawn-helper-not-file") {
113
+ return [
114
+ ` Expected helper is not a regular file: ${check.helperPath}`,
115
+ " Reinstall or update PI WEBUI, then run `pi-webui doctor` again.",
116
+ ];
117
+ }
118
+ return [
119
+ ` Could not inspect ${check.helperPath}: ${check.message}`,
120
+ " Check the file permissions, then run `pi-webui doctor` again.",
121
+ ];
122
+ }
123
+ function chmodFixCommand(path) {
124
+ return `chmod +x ${shellSingleQuote(path)}`;
125
+ }
126
+ function shellSingleQuote(value) {
127
+ return `'${value.replaceAll("'", "'\\''")}'`;
128
+ }
129
+ function isFileNotFoundError(error) {
130
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
131
+ }
132
+ function errorMessage(error) {
133
+ return error instanceof Error ? error.message : String(error);
134
+ }
135
+ //# sourceMappingURL=nodePtySpawnHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodePtySpawnHelper.js","sourceRoot":"","sources":["../../../src/server/diagnostics/nodePtySpawnHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ const GIT_LOCAL_ENV_VARS = [
2
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
3
+ "GIT_COMMON_DIR",
4
+ "GIT_DIR",
5
+ "GIT_INDEX_FILE",
6
+ "GIT_OBJECT_DIRECTORY",
7
+ "GIT_PREFIX",
8
+ "GIT_QUARANTINE_PATH",
9
+ "GIT_WORK_TREE",
10
+ ];
11
+ export function sanitizedGitEnv(env = process.env) {
12
+ const blocked = new Set(GIT_LOCAL_ENV_VARS);
13
+ return Object.fromEntries(Object.entries(env).filter(([key]) => !blocked.has(key)));
14
+ }
15
+ //# sourceMappingURL=gitEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitEnv.js","sourceRoot":"","sources":["../../../src/server/git/gitEnv.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG;IACzB,kCAAkC;IAClC,gBAAgB;IAChB,SAAS;IACT,gBAAgB;IAChB,sBAAsB;IACtB,YAAY;IACZ,qBAAqB;IACrB,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,kBAAkB,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}