@jmfederico/pi-web 1.202608.0 → 1.202608.2

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 (258) hide show
  1. package/README.md +4 -4
  2. package/dist/cli.js +287 -113
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/CodeViewer-BMWwxG7q.js +4 -0
  5. package/dist/client/assets/{TerminalPanel-fYrKc3jh.js → TerminalPanel-CacQDIYn.js} +6 -6
  6. package/dist/client/assets/index-DUW2xnoV.js +4279 -0
  7. package/dist/client/assets/vendor-editor-core-CXO8gGab.js +12 -0
  8. package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +46 -0
  9. package/dist/client/index.html +3 -3
  10. package/dist/config.js +110 -73
  11. package/dist/config.js.map +1 -1
  12. package/dist/docker/piWebDockerCommandPlan.js +4 -3
  13. package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
  14. package/dist/environment.js +4 -0
  15. package/dist/environment.js.map +1 -0
  16. package/dist/nativeServices/installedServiceDefinitions.js +602 -0
  17. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
  18. package/dist/nativeServices/serviceAction.js +174 -0
  19. package/dist/nativeServices/serviceAction.js.map +1 -0
  20. package/dist/nativeServices/serviceDoctor.js +374 -71
  21. package/dist/nativeServices/serviceDoctor.js.map +1 -1
  22. package/dist/nativeServices/servicePlan.js +1 -1
  23. package/dist/nativeServices/servicePlan.js.map +1 -1
  24. package/dist/{pi-web-plugins → pi-packages}/relays/markdownDocument.js +1 -1
  25. package/dist/pi-packages/relays/package.json +11 -0
  26. package/dist/{pi-web-plugins → pi-packages}/relays/pi-web-plugin.js +4 -4
  27. package/dist/pi-packages/relays/prompts/relay-worktree.md +157 -0
  28. package/dist/pi-packages/relays/prompts/relay.md +152 -0
  29. package/dist/{pi-web-plugins → pi-packages}/relays/relayDiscovery.js +1 -1
  30. package/dist/{pi-web-plugins → pi-packages}/relays/relaysPanelElement.js +1 -1
  31. package/dist/pi-packages/relays/skills/relay/SKILL.md +123 -0
  32. package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
  33. package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
  34. package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
  35. package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
  36. package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
  37. package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
  38. package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
  39. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
  40. package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
  41. package/dist/{server/git/gitService.js → pi-web-plugins/git/git-backend.js} +209 -60
  42. package/dist/pi-web-plugins/git/package.json +16 -0
  43. package/dist/pi-web-plugins/git/server-plugin.js +176 -0
  44. package/dist/pi-web-plugins/info/infoInternals.js +16 -2
  45. package/dist/pi-web-plugins/info/package.json +1 -1
  46. package/dist/pi-web-plugins/info/pi-web-plugin.js +2 -2
  47. package/dist/pi-web-plugins/updates/package.json +1 -1
  48. package/dist/pi-web-plugins/updates/pi-web-plugin.js +1 -1
  49. package/dist/pi-web-plugins/workspace-tasks/package.json +1 -1
  50. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +3 -3
  51. package/dist/piWebVersionReport.js +63 -10
  52. package/dist/piWebVersionReport.js.map +1 -1
  53. package/dist/plugin-api.d.ts +33 -16
  54. package/dist/pluginRecoveryCli.js +172 -0
  55. package/dist/pluginRecoveryCli.js.map +1 -0
  56. package/dist/server/activity/workspaceActivityService.js +27 -19
  57. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  58. package/dist/server/app.js +41 -15
  59. package/dist/server/app.js.map +1 -1
  60. package/dist/server/configRoutes.js +3 -21
  61. package/dist/server/configRoutes.js.map +1 -1
  62. package/dist/server/knownAutoInstallPiPackages.js +30 -0
  63. package/dist/server/knownAutoInstallPiPackages.js.map +1 -0
  64. package/dist/server/machines/machineClient.js +23 -4
  65. package/dist/server/machines/machineClient.js.map +1 -1
  66. package/dist/server/machines/machinePluginProxyRoutes.js +74 -17
  67. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
  68. package/dist/server/machines/machineProxyRoutes.js +165 -8
  69. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  70. package/dist/server/machines/machineService.js +23 -0
  71. package/dist/server/machines/machineService.js.map +1 -1
  72. package/dist/server/piPackageIdentity.js +25 -0
  73. package/dist/server/piPackageIdentity.js.map +1 -0
  74. package/dist/server/piPackageService.js +69 -8
  75. package/dist/server/piPackageService.js.map +1 -1
  76. package/dist/server/piWebPluginCatalog.js +584 -0
  77. package/dist/server/piWebPluginCatalog.js.map +1 -0
  78. package/dist/server/piWebPluginLifecycle.js +162 -0
  79. package/dist/server/piWebPluginLifecycle.js.map +1 -0
  80. package/dist/server/piWebPluginService.js +159 -261
  81. package/dist/server/piWebPluginService.js.map +1 -1
  82. package/dist/server/piWebStatus.js +41 -9
  83. package/dist/server/piWebStatus.js.map +1 -1
  84. package/dist/server/plugins/pluginBackendProxyRoutes.js +69 -0
  85. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
  86. package/dist/server/plugins/serverPluginExec.js +184 -0
  87. package/dist/server/plugins/serverPluginExec.js.map +1 -0
  88. package/dist/server/plugins/serverPluginRuntime.js +480 -0
  89. package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
  90. package/dist/server/projectTrustRoutes.js +80 -0
  91. package/dist/server/projectTrustRoutes.js.map +1 -0
  92. package/dist/server/projects/projectService.js +3 -1
  93. package/dist/server/projects/projectService.js.map +1 -1
  94. package/dist/server/realtime/sessionEventHub.js +26 -11
  95. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  96. package/dist/server/requestCancellation.js +32 -0
  97. package/dist/server/requestCancellation.js.map +1 -0
  98. package/dist/server/sessiond/agentProcessEnvironment.js +29 -30
  99. package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -1
  100. package/dist/server/sessiond/autoInstallPiPackages.js +63 -0
  101. package/dist/server/sessiond/autoInstallPiPackages.js.map +1 -0
  102. package/dist/server/sessiond/pluginBackendRoutes.js +64 -0
  103. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
  104. package/dist/server/sessiond/sessionDaemonShutdown.js +24 -0
  105. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
  106. package/dist/server/sessiond/sessionProxyRoutes.js +2 -2
  107. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  108. package/dist/server/sessiond/sessionServiceDependencies.js +2 -1
  109. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  110. package/dist/server/sessiond/sessiondStateOwnership.js +235 -0
  111. package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
  112. package/dist/server/sessiond/workspaceCatalogRoutes.js +31 -0
  113. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
  114. package/dist/server/sessiond/workspaceRemovalRoutes.js +41 -0
  115. package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
  116. package/dist/server/sessiond.js +284 -98
  117. package/dist/server/sessiond.js.map +1 -1
  118. package/dist/server/sessions/authService.js +15 -54
  119. package/dist/server/sessions/authService.js.map +1 -1
  120. package/dist/server/sessions/dockerEnvironmentFacts.js +254 -0
  121. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
  122. package/dist/server/sessions/modelCatalogRefresher.js +4 -3
  123. package/dist/server/sessions/modelCatalogRefresher.js.map +1 -1
  124. package/dist/server/sessions/piSessionManagerGateway.js +18 -67
  125. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  126. package/dist/server/sessions/piSessionService.js +495 -142
  127. package/dist/server/sessions/piSessionService.js.map +1 -1
  128. package/dist/server/sessions/sessionCommandService.js +24 -1
  129. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  130. package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
  131. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
  132. package/dist/server/sessions/sessionFileFormat.js +27 -0
  133. package/dist/server/sessions/sessionFileFormat.js.map +1 -0
  134. package/dist/server/sessions/sessionFileHeader.js +1 -14
  135. package/dist/server/sessions/sessionFileHeader.js.map +1 -1
  136. package/dist/server/sessions/sessionModelScope.js +160 -0
  137. package/dist/server/sessions/sessionModelScope.js.map +1 -0
  138. package/dist/server/sessions/sessionNameGenerator.js +6 -6
  139. package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
  140. package/dist/server/sessions/sessionRoutes.js +55 -0
  141. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  142. package/dist/server/sessions/sessionSummaryScanner.js +96 -224
  143. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
  144. package/dist/server/sessions/spawnSubsessionTool.js +5 -9
  145. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  146. package/dist/server/sessions/spawnTargetResolver.js +1 -1
  147. package/dist/server/status/machineStatusRoutes.js +8 -0
  148. package/dist/server/status/machineStatusRoutes.js.map +1 -0
  149. package/dist/server/status/machineStatusService.js +181 -0
  150. package/dist/server/status/machineStatusService.js.map +1 -0
  151. package/dist/server/status/workspaceAttribution.js +87 -0
  152. package/dist/server/status/workspaceAttribution.js.map +1 -0
  153. package/dist/server/storage/piPackageDismissalStore.js +78 -0
  154. package/dist/server/storage/piPackageDismissalStore.js.map +1 -0
  155. package/dist/server/terminalProxyRoutes.js +2 -1
  156. package/dist/server/terminalProxyRoutes.js.map +1 -1
  157. package/dist/server/workspaceExplorerRoutes.js +20 -13
  158. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  159. package/dist/server/workspaces/fileContentService.js +18 -9
  160. package/dist/server/workspaces/fileContentService.js.map +1 -1
  161. package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
  162. package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
  163. package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
  164. package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
  165. package/dist/server/workspaces/filePreviewService.js +81 -0
  166. package/dist/server/workspaces/filePreviewService.js.map +1 -0
  167. package/dist/server/workspaces/projectWorkspaceCwds.js +0 -5
  168. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
  169. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +402 -0
  170. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
  171. package/dist/server/workspaces/workspaceCatalog.js +47 -0
  172. package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
  173. package/dist/server/workspaces/workspaceContext.js +1 -3
  174. package/dist/server/workspaces/workspaceContext.js.map +1 -1
  175. package/dist/server/workspaces/workspaceDeletionRoutes.js +35 -125
  176. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  177. package/dist/server/workspaces/workspaceProviderRegistry.js +651 -0
  178. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
  179. package/dist/server/workspaces/workspaceRemovalService.js +256 -0
  180. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
  181. package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
  182. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
  183. package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
  184. package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
  185. package/dist/server-plugin-api.d.ts +140 -0
  186. package/dist/server-plugin-api.js +2 -0
  187. package/dist/server-plugin-api.js.map +1 -0
  188. package/dist/serverPluginRecovery.js +138 -0
  189. package/dist/serverPluginRecovery.js.map +1 -0
  190. package/dist/sessiond/activeAgentProfile.js +3 -22
  191. package/dist/sessiond/activeAgentProfile.js.map +1 -1
  192. package/dist/sessiond/config.js +11 -0
  193. package/dist/sessiond/config.js.map +1 -1
  194. package/dist/sessiond/sessionDaemonClient.js +11 -9
  195. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  196. package/dist/shared/activeAgentProfile.js +2 -41
  197. package/dist/shared/activeAgentProfile.js.map +1 -1
  198. package/dist/shared/activity.js +0 -3
  199. package/dist/shared/activity.js.map +1 -1
  200. package/dist/shared/apiTypes.js +7 -5
  201. package/dist/shared/apiTypes.js.map +1 -1
  202. package/dist/shared/capabilities.js +8 -6
  203. package/dist/shared/capabilities.js.map +1 -1
  204. package/dist/shared/federatedRoutes.js +36 -5
  205. package/dist/shared/federatedRoutes.js.map +1 -1
  206. package/dist/shared/machinePluginIds.js +4 -2
  207. package/dist/shared/machinePluginIds.js.map +1 -1
  208. package/dist/shared/machineStatus.js +94 -0
  209. package/dist/shared/machineStatus.js.map +1 -0
  210. package/dist/shared/piWebStatusParsing.js +33 -0
  211. package/dist/shared/piWebStatusParsing.js.map +1 -1
  212. package/dist/shared/pluginApiTypes.d.ts +150 -0
  213. package/dist/shared/pluginApiTypes.js +3 -0
  214. package/dist/shared/pluginApiTypes.js.map +1 -0
  215. package/dist/shared/pluginBackendProtocol.js +110 -0
  216. package/dist/shared/pluginBackendProtocol.js.map +1 -0
  217. package/dist/shared/pluginIds.js +5 -0
  218. package/dist/shared/pluginIds.js.map +1 -1
  219. package/dist/shared/pluginRecoveryCommands.js +14 -0
  220. package/dist/shared/pluginRecoveryCommands.js.map +1 -0
  221. package/dist/shared/workspaceFiles.js +41 -2
  222. package/dist/shared/workspaceFiles.js.map +1 -1
  223. package/dist/shared/workspaceRemovalProtocol.js +24 -0
  224. package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
  225. package/docs/config.md +105 -52
  226. package/docs/plugins.md +403 -146
  227. package/examples/workspace-provider-plugin/README.md +52 -0
  228. package/examples/workspace-provider-plugin/package.json +25 -0
  229. package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
  230. package/examples/workspace-provider-plugin/src/server.ts +64 -0
  231. package/examples/workspace-provider-plugin/tsconfig.json +21 -0
  232. package/package.json +30 -11
  233. package/server-plugin-api.d.ts +1 -0
  234. package/dist/client/assets/CodeViewer-D91Sp61M.js +0 -4
  235. package/dist/client/assets/UnifiedDiffViewer-BafLWGtF.js +0 -39
  236. package/dist/client/assets/index-CA8q9_o7.js +0 -4025
  237. package/dist/client/assets/vendor-editor-core-vUi74DnD.js +0 -12
  238. package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +0 -46
  239. package/dist/pi-web-plugins/relays/package.json +0 -9
  240. package/dist/plugin-api/unstable.d.ts +0 -22
  241. package/dist/server/activity/workspaceActivityRoutes.js +0 -4
  242. package/dist/server/activity/workspaceActivityRoutes.js.map +0 -1
  243. package/dist/server/git/gitService.js.map +0 -1
  244. package/dist/server/gitRoutes.js +0 -23
  245. package/dist/server/gitRoutes.js.map +0 -1
  246. package/dist/server/sessions/parentSessionLocator.js +0 -75
  247. package/dist/server/sessions/parentSessionLocator.js.map +0 -1
  248. package/dist/server/workspaces/gitWorktreeDiscovery.js +0 -43
  249. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +0 -1
  250. package/dist/server/workspaces/imagePreviewService.js +0 -40
  251. package/dist/server/workspaces/imagePreviewService.js.map +0 -1
  252. package/dist/server/workspaces/workspaceService.js +0 -52
  253. package/dist/server/workspaces/workspaceService.js.map +0 -1
  254. package/dist/shared/apiTypes.d.ts +0 -1217
  255. package/dist/shared/thinkingLevels.d.ts +0 -27
  256. package/plugin-api/unstable.d.ts +0 -1
  257. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/README.md +0 -0
  258. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/marked.esm.js +0 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Internal per-machine status contract shared by sessiond, the web tier, and
3
+ * the browser.
4
+ *
5
+ * sessiond resolves `cwd → workspace → project` and rolls status up, so the
6
+ * browser never attributes anything itself: it renders whatever node flags the
7
+ * snapshot carries. The types are deliberately internal — nothing here is
8
+ * exported from the plugin API.
9
+ */
10
+ /** The complete set of flags PI WEB itself publishes today. */
11
+ export const CORE_STATUS_FLAGS = {
12
+ /** A session in the subtree has work in progress (`isSessionActive`). */
13
+ working: "core:working",
14
+ /** A live terminal in the subtree. */
15
+ terminal: "core:terminal",
16
+ /** An unread session completion in the subtree. */
17
+ unread: "core:unread",
18
+ };
19
+ /**
20
+ * Combine child flags into a parent node. A flag is set on the parent when it
21
+ * is set on any child, and unset flags are omitted so that two trees carrying
22
+ * the same status compare equal by structure.
23
+ */
24
+ export function rollUpStatusFlags(sources) {
25
+ const rolled = new Map();
26
+ for (const source of sources) {
27
+ for (const [flagId, isSet] of Object.entries(source)) {
28
+ if (isSet)
29
+ rolled.set(flagId, true);
30
+ }
31
+ }
32
+ return Object.fromEntries(rolled);
33
+ }
34
+ /**
35
+ * Parse a snapshot received over HTTP or the realtime socket.
36
+ *
37
+ * Structural fields are required, because a snapshot missing them cannot be
38
+ * ordered or rendered. Flag content is tolerated instead: an unrecognised flag
39
+ * id is kept as-is so it still contributes an indicator, and an entry whose
40
+ * value is not a boolean is dropped rather than failing the whole payload,
41
+ * since a newer daemon adding flags must never blank a machine's status.
42
+ */
43
+ export function parseMachineStatusSnapshot(value) {
44
+ if (!isRecord(value))
45
+ return undefined;
46
+ const epochId = value["epochId"];
47
+ const revision = value["revision"];
48
+ const generatedAt = value["generatedAt"];
49
+ const machine = parseStatusFlags(value["machine"]);
50
+ const unattributed = parseStatusFlags(value["unattributed"]);
51
+ const projects = parseStatusFlagsByNodeId(value["projects"]);
52
+ const workspaces = parseStatusFlagsByNodeId(value["workspaces"]);
53
+ if (typeof epochId !== "string" || epochId === "")
54
+ return undefined;
55
+ if (typeof revision !== "number" || !Number.isFinite(revision))
56
+ return undefined;
57
+ if (typeof generatedAt !== "string" || generatedAt === "")
58
+ return undefined;
59
+ if (machine === undefined || unattributed === undefined)
60
+ return undefined;
61
+ if (projects === undefined || workspaces === undefined)
62
+ return undefined;
63
+ return { epochId, revision, machine, projects, workspaces, unattributed, generatedAt };
64
+ }
65
+ /**
66
+ * Flag ids arrive from another machine, so entries are collected through a map
67
+ * and `Object.fromEntries`: a key such as `__proto__` then becomes an ordinary
68
+ * own property instead of reassigning the result's prototype.
69
+ */
70
+ function parseStatusFlags(value) {
71
+ if (!isRecord(value))
72
+ return undefined;
73
+ const flags = new Map();
74
+ for (const [flagId, isSet] of Object.entries(value)) {
75
+ if (typeof isSet === "boolean")
76
+ flags.set(flagId, isSet);
77
+ }
78
+ return Object.fromEntries(flags);
79
+ }
80
+ function parseStatusFlagsByNodeId(value) {
81
+ if (!isRecord(value))
82
+ return undefined;
83
+ const nodes = new Map();
84
+ for (const [nodeId, nodeFlags] of Object.entries(value)) {
85
+ const parsed = parseStatusFlags(nodeFlags);
86
+ if (parsed !== undefined)
87
+ nodes.set(nodeId, parsed);
88
+ }
89
+ return Object.fromEntries(nodes);
90
+ }
91
+ function isRecord(value) {
92
+ return typeof value === "object" && value !== null && !Array.isArray(value);
93
+ }
94
+ //# sourceMappingURL=machineStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineStatus.js","sourceRoot":"","sources":["../../src/shared/machineStatus.ts"],"names":[],"mappings":"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"}
@@ -35,10 +35,12 @@ export function parsePiWebRuntimeComponent(value) {
35
35
  const component = value["component"];
36
36
  const label = value["label"];
37
37
  const runtimeVersion = value["runtimeVersion"];
38
+ const piVersion = value["piVersion"];
38
39
  const available = value["available"];
39
40
  const capabilities = parseKnownPiWebCapabilities(value["capabilities"]);
40
41
  const activeAgentProfileValue = value["activeAgentProfile"];
41
42
  const activeAgentProfile = activeAgentProfileValue === undefined ? undefined : parseActiveAgentProfileDescriptor(activeAgentProfileValue);
43
+ const deprecatedAgentInputs = parseDeprecatedAgentInputs(value["deprecatedAgentInputs"]);
42
44
  const error = value["error"];
43
45
  if (component !== "web" && component !== "sessiond")
44
46
  return undefined;
@@ -50,12 +52,41 @@ export function parsePiWebRuntimeComponent(value) {
50
52
  component,
51
53
  label,
52
54
  ...(typeof runtimeVersion === "string" ? { runtimeVersion } : {}),
55
+ ...(typeof piVersion === "string" ? { piVersion } : {}),
53
56
  available,
54
57
  capabilities,
55
58
  ...(activeAgentProfile === undefined ? {} : { activeAgentProfile }),
59
+ ...(deprecatedAgentInputs === undefined ? {} : { deprecatedAgentInputs }),
56
60
  ...(typeof error === "string" ? { error } : {}),
57
61
  };
58
62
  }
63
+ /**
64
+ * Parse deprecated agent-configuration inputs reported by another component or
65
+ * machine. The payload only feeds an advisory warning banner, so malformed
66
+ * entries are dropped rather than failing the whole runtime snapshot: a
67
+ * cross-version peer must never blank a machine's runtime over a warning.
68
+ * Returns undefined when the field itself is absent or not an array.
69
+ */
70
+ export function parseDeprecatedAgentInputs(value) {
71
+ if (!Array.isArray(value))
72
+ return undefined;
73
+ const inputs = [];
74
+ for (const entry of value) {
75
+ if (!isRecord(entry))
76
+ continue;
77
+ const source = entry["source"];
78
+ const name = entry["name"];
79
+ const replacement = entry["replacement"];
80
+ if (source !== "environment" && source !== "config")
81
+ continue;
82
+ if (typeof name !== "string" || name === "")
83
+ continue;
84
+ if (replacement !== undefined && (typeof replacement !== "string" || replacement === ""))
85
+ continue;
86
+ inputs.push({ source, name, ...(replacement === undefined ? {} : { replacement }) });
87
+ }
88
+ return inputs;
89
+ }
59
90
  export function parsePiWebComponentStatus(value) {
60
91
  if (!isRecord(value))
61
92
  return undefined;
@@ -63,6 +94,7 @@ export function parsePiWebComponentStatus(value) {
63
94
  const label = value["label"];
64
95
  const runtimeVersion = value["runtimeVersion"];
65
96
  const installedVersion = value["installedVersion"];
97
+ const piVersion = value["piVersion"];
66
98
  const stale = value["stale"];
67
99
  const available = value["available"];
68
100
  const error = value["error"];
@@ -76,6 +108,7 @@ export function parsePiWebComponentStatus(value) {
76
108
  label,
77
109
  ...(typeof runtimeVersion === "string" ? { runtimeVersion } : {}),
78
110
  ...(typeof installedVersion === "string" ? { installedVersion } : {}),
111
+ ...(typeof piVersion === "string" ? { piVersion } : {}),
79
112
  stale,
80
113
  available,
81
114
  ...(installation === undefined ? {} : { installation }),
@@ -1 +1 @@
1
- {"version":3,"file":"piWebStatusParsing.js","sourceRoot":"","sources":["../../src/shared/piWebStatusParsing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9J,MAAM,GAAG,GAAG,yBAAyB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,2BAA2B,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5L,MAAM,GAAG,GAAG,0BAA0B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,2BAA2B,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACxE,MAAM,uBAAuB,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,uBAAuB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iCAAiC,CAAC,uBAAuB,CAAC,CAAC;IAC1I,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,SAAS,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChI,IAAI,uBAAuB,KAAK,SAAS,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,kBAAkB,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9H,OAAO;QACL,SAAS;QACT,KAAK;QACL,GAAG,CAAC,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,SAAS;QACT,YAAY;QACZ,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChI,OAAO;QACL,SAAS;QACT,KAAK;QACL,GAAG,CAAC,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,KAAK;QACL,SAAS;QACT,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpI,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"piWebStatusParsing.js","sourceRoot":"","sources":["../../src/shared/piWebStatusParsing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ export type MachineKind = "local" | "remote";
2
+ export type JsonPrimitive = string | number | boolean | null;
3
+ export type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];
4
+ export interface JsonObject {
5
+ readonly [key: string]: JsonValue;
6
+ }
7
+ export interface WorkspaceProviderCapabilities {
8
+ readonly request: boolean;
9
+ /** True only when this specific workspace advertises removal. */
10
+ readonly remove: boolean;
11
+ }
12
+ /** Public identity and browser-visible data for the plugin that owns a workspace. */
13
+ export interface WorkspaceProviderMetadata {
14
+ readonly pluginId: string;
15
+ readonly capabilities: WorkspaceProviderCapabilities;
16
+ readonly metadata?: JsonObject;
17
+ }
18
+ /** Provider-authored removal wording exposed to browser plugins. */
19
+ export interface WorkspaceRemovalPresentation {
20
+ readonly actionLabel: string;
21
+ readonly confirmation: string;
22
+ }
23
+ export interface FileTreeEntry {
24
+ name: string;
25
+ path: string;
26
+ type: "file" | "directory" | "symlink";
27
+ size?: number;
28
+ modifiedAt?: string;
29
+ }
30
+ export interface FileTreeResponse {
31
+ path: string;
32
+ entries: FileTreeEntry[];
33
+ scannedAt: string;
34
+ truncated: boolean;
35
+ }
36
+ export type FileContentMediaType = "image" | "html" | "pdf" | "markdown";
37
+ export interface FileContentResponse {
38
+ path: string;
39
+ language?: string;
40
+ mediaType?: FileContentMediaType;
41
+ mimeType?: string;
42
+ encoding: "utf8";
43
+ size: number;
44
+ modifiedAt: string;
45
+ content: string;
46
+ truncated: boolean;
47
+ binary: boolean;
48
+ }
49
+ export interface WriteWorkspaceFileOptions {
50
+ createDirs?: boolean;
51
+ overwrite?: boolean;
52
+ }
53
+ export interface WriteWorkspaceFileResponse {
54
+ path: string;
55
+ size: number;
56
+ modifiedAt: string;
57
+ created: boolean;
58
+ }
59
+ export interface DeleteWorkspaceFileResponse {
60
+ path: string;
61
+ existed: boolean;
62
+ }
63
+ export interface MoveWorkspaceFileOptions {
64
+ createDirs?: boolean;
65
+ overwrite?: boolean;
66
+ }
67
+ export interface MoveWorkspaceFileResponse {
68
+ fromPath: string;
69
+ toPath: string;
70
+ size: number;
71
+ modifiedAt: string;
72
+ }
73
+ export type TerminalCommandRunStatus = "queued" | "running" | "succeeded" | "failed";
74
+ export interface TerminalCommandRun {
75
+ id: string;
76
+ origin: string;
77
+ projectId: string;
78
+ workspaceId: string;
79
+ terminalId: string;
80
+ title: string;
81
+ command: string;
82
+ status: TerminalCommandRunStatus;
83
+ exitCode?: number;
84
+ createdAt: string;
85
+ startedAt?: string;
86
+ completedAt?: string;
87
+ metadata: Record<string, string>;
88
+ }
89
+ export interface TerminalCommandRunHandle {
90
+ run: TerminalCommandRun;
91
+ completed: Promise<TerminalCommandRun>;
92
+ }
93
+ export type PiWebServiceComponent = "web" | "sessiond";
94
+ export type PiWebStatusSeverity = "info" | "warning" | "error";
95
+ export type PiWebInstallationKind = "pi-package" | "npm-global" | "local" | "docker" | "unknown";
96
+ export type PiWebDockerMode = "runtime" | "dev";
97
+ export interface PiWebInstallationInfo {
98
+ kind: PiWebInstallationKind;
99
+ path?: string;
100
+ source?: string;
101
+ scope?: "user" | "project";
102
+ npmRoot?: string;
103
+ dockerMode?: PiWebDockerMode;
104
+ }
105
+ export interface PiWebComponentStatus {
106
+ component: PiWebServiceComponent;
107
+ label: string;
108
+ runtimeVersion?: string;
109
+ installedVersion?: string;
110
+ /** Version of the Pi coding agent library loaded by this component's process; omitted when the component does not report it. */
111
+ piVersion?: string;
112
+ stale: boolean;
113
+ available: boolean;
114
+ installation?: PiWebInstallationInfo;
115
+ error?: string;
116
+ }
117
+ export interface PiWebReleaseStatus {
118
+ packageName: string;
119
+ latestVersion?: string;
120
+ updateAvailable: boolean;
121
+ checkedAt?: string;
122
+ skipped?: boolean;
123
+ error?: string;
124
+ }
125
+ export interface PiWebStatusMessage {
126
+ id: string;
127
+ severity: PiWebStatusSeverity;
128
+ title: string;
129
+ body: string;
130
+ command?: string;
131
+ }
132
+ export interface PiWebVersionResponse {
133
+ packageName: string;
134
+ generatedAt: string;
135
+ components: {
136
+ web: PiWebComponentStatus;
137
+ sessiond: PiWebComponentStatus;
138
+ };
139
+ }
140
+ export interface PiWebStatusResponse extends PiWebVersionResponse {
141
+ release: PiWebReleaseStatus;
142
+ commands: {
143
+ update?: string;
144
+ restart?: string;
145
+ restartWeb?: string;
146
+ restartSessiond?: string;
147
+ status?: string;
148
+ };
149
+ messages: PiWebStatusMessage[];
150
+ }
@@ -0,0 +1,3 @@
1
+ // Dependency-free DTOs shared by PI WEB's public plugin entrypoints and host protocols.
2
+ export {};
3
+ //# sourceMappingURL=pluginApiTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginApiTypes.js","sourceRoot":"","sources":["../../src/shared/pluginApiTypes.ts"],"names":[],"mappings":"AAAA,wFAAwF"}
@@ -0,0 +1,110 @@
1
+ /** Maximum UTF-8 JSON input accepted from a browser plugin. */
2
+ export const PLUGIN_BACKEND_JSON_MAX_BYTES = 256 * 1024;
3
+ /** Bounded result allowance demonstrated by Git's existing 2 MiB command-output limit. */
4
+ export const PLUGIN_BACKEND_RESPONSE_JSON_MAX_BYTES = 8 * 1024 * 1024;
5
+ /** Envelope allowance for the active backend revision and JSON field names. */
6
+ export const PLUGIN_BACKEND_REQUEST_BODY_MAX_BYTES = PLUGIN_BACKEND_JSON_MAX_BYTES + 4 * 1024;
7
+ /** Allowance for an attributed error envelope around a bounded result. */
8
+ export const PLUGIN_BACKEND_RESPONSE_BODY_MAX_BYTES = PLUGIN_BACKEND_RESPONSE_JSON_MAX_BYTES + 4 * 1024;
9
+ /** Bounded provider callback deadline inside sessiond. */
10
+ export const PLUGIN_BACKEND_REQUEST_TIMEOUT_MS = 10_000;
11
+ /** End-to-end sessiond deadline, including owner re-resolution and validation. */
12
+ export const PLUGIN_BACKEND_DISPATCH_TIMEOUT_MS = 25_000;
13
+ /** Remote gateway deadline, including workspace owner re-resolution. */
14
+ export const PLUGIN_BACKEND_FEDERATION_TIMEOUT_MS = 30_000;
15
+ export const PLUGIN_BACKEND_OPERATION_MAX_LENGTH = 128;
16
+ export const PLUGIN_BACKEND_REVISION_MAX_LENGTH = 512;
17
+ const OPERATION_PATTERN = /^[a-z][a-z0-9.-]*$/u;
18
+ const MAX_JSON_DEPTH = 64;
19
+ export function isPluginBackendOperation(value) {
20
+ return value.length <= PLUGIN_BACKEND_OPERATION_MAX_LENGTH && OPERATION_PATTERN.test(value);
21
+ }
22
+ export function requirePluginBackendOperation(value) {
23
+ if (!isPluginBackendOperation(value)) {
24
+ throw new Error(`Plugin backend operation must match ${String(OPERATION_PATTERN)} and be at most ${String(PLUGIN_BACKEND_OPERATION_MAX_LENGTH)} characters`);
25
+ }
26
+ return value;
27
+ }
28
+ export function requirePluginBackendRevision(value) {
29
+ if (typeof value !== "string" || value === "" || value.length > PLUGIN_BACKEND_REVISION_MAX_LENGTH) {
30
+ throw new Error(`Plugin backend revision must be a non-empty string of at most ${String(PLUGIN_BACKEND_REVISION_MAX_LENGTH)} characters`);
31
+ }
32
+ return value;
33
+ }
34
+ /** Clone and freeze a runtime value after enforcing the JSON and byte contract. */
35
+ export function cloneBoundedPluginBackendJson(value, label, maxBytes = PLUGIN_BACKEND_JSON_MAX_BYTES) {
36
+ const cloned = cloneJsonValue(value, new Set(), label, 0);
37
+ const serialized = JSON.stringify(cloned);
38
+ if (utf8ByteLength(serialized) > maxBytes) {
39
+ throw new Error(`${label} exceeds the ${String(maxBytes)} byte limit`);
40
+ }
41
+ return cloned;
42
+ }
43
+ export function serializeBoundedPluginBackendJson(value, label, maxBytes = PLUGIN_BACKEND_JSON_MAX_BYTES) {
44
+ return JSON.stringify(cloneBoundedPluginBackendJson(value, label, maxBytes));
45
+ }
46
+ export function parseBoundedPluginBackendJson(text, label, maxBytes = PLUGIN_BACKEND_JSON_MAX_BYTES) {
47
+ if (utf8ByteLength(text) > maxBytes) {
48
+ throw new Error(`${label} exceeds the ${String(maxBytes)} byte limit`);
49
+ }
50
+ let value;
51
+ try {
52
+ value = JSON.parse(text);
53
+ }
54
+ catch (error) {
55
+ throw new Error(`${label} must be valid JSON`, { cause: error });
56
+ }
57
+ return cloneBoundedPluginBackendJson(value, label, maxBytes);
58
+ }
59
+ export function parsePluginBackendRequestEnvelope(value) {
60
+ if (!isPlainRecord(value))
61
+ throw new Error("Plugin backend request body must be an object");
62
+ return Object.freeze({
63
+ revision: requirePluginBackendRevision(value["revision"]),
64
+ input: cloneBoundedPluginBackendJson(value["input"], "Plugin backend request input"),
65
+ });
66
+ }
67
+ export function utf8ByteLength(value) {
68
+ return new TextEncoder().encode(value).byteLength;
69
+ }
70
+ function cloneJsonValue(value, ancestors, label, depth) {
71
+ if (depth > MAX_JSON_DEPTH)
72
+ throw new Error(`${label} exceeds the maximum JSON depth of ${String(MAX_JSON_DEPTH)}`);
73
+ if (value === null || typeof value === "string" || typeof value === "boolean")
74
+ return value;
75
+ if (typeof value === "number") {
76
+ if (!Number.isFinite(value))
77
+ throw new Error(`${label} must contain only finite JSON numbers`);
78
+ return value;
79
+ }
80
+ if (Array.isArray(value)) {
81
+ if (ancestors.has(value))
82
+ throw new Error(`${label} must not contain cycles`);
83
+ ancestors.add(value);
84
+ const output = value.map((child) => cloneJsonValue(child, ancestors, label, depth + 1));
85
+ ancestors.delete(value);
86
+ Object.freeze(output);
87
+ return output;
88
+ }
89
+ if (!isPlainRecord(value))
90
+ throw new Error(`${label} must contain only JSON values`);
91
+ if (ancestors.has(value))
92
+ throw new Error(`${label} must not contain cycles`);
93
+ ancestors.add(value);
94
+ const output = {};
95
+ for (const [key, child] of Object.entries(value)) {
96
+ defineJsonProperty(output, key, cloneJsonValue(child, ancestors, label, depth + 1));
97
+ }
98
+ ancestors.delete(value);
99
+ return Object.freeze(output);
100
+ }
101
+ function defineJsonProperty(record, key, value) {
102
+ Object.defineProperty(record, key, { value, enumerable: true, configurable: true, writable: true });
103
+ }
104
+ function isPlainRecord(value) {
105
+ if (typeof value !== "object" || value === null || Array.isArray(value))
106
+ return false;
107
+ const prototype = Object.getPrototypeOf(value);
108
+ return prototype === Object.prototype || prototype === null;
109
+ }
110
+ //# sourceMappingURL=pluginBackendProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginBackendProtocol.js","sourceRoot":"","sources":["../../src/shared/pluginBackendProtocol.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  export const piWebPluginIdPattern = /^[a-z][a-z0-9.-]*$/u;
2
+ const reservedPiWebPluginIds = new Set(["core", "themes"]);
3
+ const machinePluginIdPrefix = "machine.";
2
4
  export function isPiWebPluginId(value) {
3
5
  return piWebPluginIdPattern.test(value);
4
6
  }
7
+ export function isReservedPiWebPluginId(value) {
8
+ return reservedPiWebPluginIds.has(value) || value.startsWith(machinePluginIdPrefix);
9
+ }
5
10
  //# sourceMappingURL=pluginIds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pluginIds.js","sourceRoot":"","sources":["../../src/shared/pluginIds.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"pluginIds.js","sourceRoot":"","sources":["../../src/shared/pluginIds.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3D,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAEzC,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { isPiWebPluginId } from "./pluginIds.js";
2
+ /** Secret-free commands accepted by the offline recovery CLI. */
3
+ export const PI_WEB_PLUGIN_RECOVERY_COMMANDS = Object.freeze({
4
+ showSafeStart: "pi-web plugins safe-start show",
5
+ bundledOnly: "pi-web plugins safe-start set bundled-only --restart",
6
+ noServerPlugins: "pi-web plugins safe-start set none --restart",
7
+ clearSafeStart: "pi-web plugins safe-start clear --restart",
8
+ });
9
+ export function pluginDisableRecoveryCommand(pluginId) {
10
+ if (!isPiWebPluginId(pluginId))
11
+ throw new Error(`Invalid PI WEB plugin id: ${pluginId}`);
12
+ return `pi-web plugins disable ${pluginId} --restart`;
13
+ }
14
+ //# sourceMappingURL=pluginRecoveryCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginRecoveryCommands.js","sourceRoot":"","sources":["../../src/shared/pluginRecoveryCommands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,iEAAiE;AACjE,MAAM,CAAC,MAAM,+BAA+B,GAA0C,MAAM,CAAC,MAAM,CAAC;IAClG,aAAa,EAAE,gCAAgC;IAC/C,WAAW,EAAE,sDAAsD;IACnE,eAAe,EAAE,8CAA8C;IAC/D,cAAc,EAAE,2CAA2C;CAC5D,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACzF,OAAO,0BAA0B,QAAQ,YAAY,CAAC;AACxD,CAAC"}
@@ -1,3 +1,42 @@
1
- export const MAX_IMAGE_PREVIEW_BYTES = 10 * 1024 * 1024;
2
- export const MAX_IMAGE_PREVIEW_LABEL = "10 MB";
1
+ export const MAX_INLINE_PREVIEW_BYTES = 10 * 1024 * 1024;
2
+ export const MAX_INLINE_PREVIEW_LABEL = "10 MB";
3
+ export const MAX_WORKSPACE_FILE_CONTENT_BYTES = 512 * 1024;
4
+ // Extension classification is shared by JSON source reads, streamed previews,
5
+ // and proxy response policy. Keep this an allowlist: only classifications with
6
+ // a preview MIME type may be served as browser-rendered bytes.
7
+ //
8
+ // `source` decides what a JSON file read carries: "text" formats keep capped
9
+ // literal UTF-8 source so the viewer can offer Raw mode, while "stream" formats
10
+ // stay out of JSON and are only ever served as preview bytes.
11
+ const WORKSPACE_FILE_CLASSIFICATIONS = {
12
+ ".avif": { mediaType: "image", source: "stream", previewMimeType: "image/avif" },
13
+ ".bmp": { mediaType: "image", source: "stream", previewMimeType: "image/bmp" },
14
+ ".gif": { mediaType: "image", source: "stream", previewMimeType: "image/gif" },
15
+ ".ico": { mediaType: "image", source: "stream", previewMimeType: "image/x-icon" },
16
+ ".jpeg": { mediaType: "image", source: "stream", previewMimeType: "image/jpeg" },
17
+ ".jpg": { mediaType: "image", source: "stream", previewMimeType: "image/jpeg" },
18
+ ".png": { mediaType: "image", source: "stream", previewMimeType: "image/png" },
19
+ // SVG is markup: it previews as an image but also has readable source, so it
20
+ // keeps literal text for Raw mode.
21
+ ".svg": { mediaType: "image", source: "text", previewMimeType: "image/svg+xml" },
22
+ ".webp": { mediaType: "image", source: "stream", previewMimeType: "image/webp" },
23
+ ".htm": { mediaType: "html", source: "text", previewMimeType: "text/html; charset=utf-8" },
24
+ ".html": { mediaType: "html", source: "text", previewMimeType: "text/html; charset=utf-8" },
25
+ ".pdf": { mediaType: "pdf", source: "stream", previewMimeType: "application/pdf" },
26
+ ".md": { mediaType: "markdown", source: "text" },
27
+ ".markdown": { mediaType: "markdown", source: "text" },
28
+ };
29
+ export function classifyWorkspaceFile(path) {
30
+ const slashIndex = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
31
+ const dotIndex = path.lastIndexOf(".");
32
+ if (dotIndex <= slashIndex)
33
+ return undefined;
34
+ const extension = path.slice(dotIndex).toLowerCase();
35
+ return WORKSPACE_FILE_CLASSIFICATIONS[extension];
36
+ }
37
+ /** Return the leaf filename for either POSIX or Windows-style workspace paths. */
38
+ export function workspaceFileName(path) {
39
+ const separatorIndex = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
40
+ return path.slice(separatorIndex + 1);
41
+ }
3
42
  //# sourceMappingURL=workspaceFiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceFiles.js","sourceRoot":"","sources":["../../src/shared/workspaceFiles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"workspaceFiles.js","sourceRoot":"","sources":["../../src/shared/workspaceFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Small JSON request carrying the host-issued confirmation precondition. */
2
+ export const WORKSPACE_REMOVAL_REQUEST_BODY_MAX_BYTES = 4 * 1024;
3
+ /** One sessiond-owned deadline across owner resolution, validation, and planning. */
4
+ export const WORKSPACE_REMOVAL_OPERATION_TIMEOUT_MS = 25_000;
5
+ /** Leaves time for cancellation to reach remote web/sessiond before gateway timeout. */
6
+ export const WORKSPACE_REMOVAL_FEDERATION_TIMEOUT_MS = 30_000;
7
+ export const WORKSPACE_REMOVAL_PRECONDITION_MAX_LENGTH = 256;
8
+ export function parseWorkspaceRemovalRequest(value) {
9
+ if (!isRecord(value))
10
+ throw new Error("Workspace removal request must be an object");
11
+ return { precondition: requireWorkspaceRemovalPrecondition(value["precondition"]) };
12
+ }
13
+ export function requireWorkspaceRemovalPrecondition(value) {
14
+ if (typeof value !== "string"
15
+ || value === ""
16
+ || value.length > WORKSPACE_REMOVAL_PRECONDITION_MAX_LENGTH) {
17
+ throw new Error(`Workspace removal precondition must be a non-empty string of at most ${String(WORKSPACE_REMOVAL_PRECONDITION_MAX_LENGTH)} characters`);
18
+ }
19
+ return value;
20
+ }
21
+ function isRecord(value) {
22
+ return typeof value === "object" && value !== null && !Array.isArray(value);
23
+ }
24
+ //# sourceMappingURL=workspaceRemovalProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceRemovalProtocol.js","sourceRoot":"","sources":["../../src/shared/workspaceRemovalProtocol.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,GAAG,IAAI,CAAC;AACjE,qFAAqF;AACrF,MAAM,CAAC,MAAM,sCAAsC,GAAG,MAAM,CAAC;AAC7D,wFAAwF;AACxF,MAAM,CAAC,MAAM,uCAAuC,GAAG,MAAM,CAAC;AAC9D,MAAM,CAAC,MAAM,yCAAyC,GAAG,GAAG,CAAC;AAE7D,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACrF,OAAO,EAAE,YAAY,EAAE,mCAAmC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,KAAc;IAChE,IACE,OAAO,KAAK,KAAK,QAAQ;WACtB,KAAK,KAAK,EAAE;WACZ,KAAK,CAAC,MAAM,GAAG,yCAAyC,EAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wEAAwE,MAAM,CAAC,yCAAyC,CAAC,aAAa,CACvI,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}