@chainingintention/pi-web-cn 1.202606.3

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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +364 -0
  3. package/dist/cli.js +960 -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-B4nxYc0g.js +4 -0
  7. package/dist/client/assets/TerminalPanel-htr2dU1I.js +122 -0
  8. package/dist/client/assets/index-BjUH4a8R.js +1994 -0
  9. package/dist/client/assets/vendor-editor-core-B4Sq6exx.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-DznYbTkJ.js +26 -0
  11. package/dist/client/assets/vendor-editor-legacy-B4QLsWF8.js +1 -0
  12. package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
  13. package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
  14. package/dist/client/favicon.svg +11 -0
  15. package/dist/client/index.html +60 -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 +154 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/pi-web-plugins/info/package.json +9 -0
  22. package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
  23. package/dist/pi-web-plugins/updates/package.json +9 -0
  24. package/dist/pi-web-plugins/updates/pi-web-plugin.js +181 -0
  25. package/dist/pi-web-plugins/workspace-tasks/config.js +91 -0
  26. package/dist/pi-web-plugins/workspace-tasks/package.json +9 -0
  27. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +48 -0
  28. package/dist/pi-web-plugins/workspace-tasks/taskRunner.js +12 -0
  29. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +292 -0
  30. package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  31. package/dist/piWebVersionReport.js +221 -0
  32. package/dist/piWebVersionReport.js.map +1 -0
  33. package/dist/plugin-api/unstable.d.ts +22 -0
  34. package/dist/plugin-api.d.ts +163 -0
  35. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  36. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  37. package/dist/server/activity/workspaceActivityService.js +98 -0
  38. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  39. package/dist/server/app.js +115 -0
  40. package/dist/server/app.js.map +1 -0
  41. package/dist/server/configRoutes.js +123 -0
  42. package/dist/server/configRoutes.js.map +1 -0
  43. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  44. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  45. package/dist/server/git/gitEnv.js +15 -0
  46. package/dist/server/git/gitEnv.js.map +1 -0
  47. package/dist/server/git/gitService.js +119 -0
  48. package/dist/server/git/gitService.js.map +1 -0
  49. package/dist/server/gitRoutes.js +23 -0
  50. package/dist/server/gitRoutes.js.map +1 -0
  51. package/dist/server/index.js +7 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/machines/machineClient.js +134 -0
  54. package/dist/server/machines/machineClient.js.map +1 -0
  55. package/dist/server/machines/machineProxyRoutes.js +92 -0
  56. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  57. package/dist/server/machines/machineRoutes.js +50 -0
  58. package/dist/server/machines/machineRoutes.js.map +1 -0
  59. package/dist/server/machines/machineService.js +168 -0
  60. package/dist/server/machines/machineService.js.map +1 -0
  61. package/dist/server/machines/machineStore.js +128 -0
  62. package/dist/server/machines/machineStore.js.map +1 -0
  63. package/dist/server/piWebPluginService.js +235 -0
  64. package/dist/server/piWebPluginService.js.map +1 -0
  65. package/dist/server/piWebStatus.js +462 -0
  66. package/dist/server/piWebStatus.js.map +1 -0
  67. package/dist/server/projects/directorySuggestions.js +37 -0
  68. package/dist/server/projects/directorySuggestions.js.map +1 -0
  69. package/dist/server/projects/projectService.js +31 -0
  70. package/dist/server/projects/projectService.js.map +1 -0
  71. package/dist/server/realtime/sessionEventHub.js +39 -0
  72. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  73. package/dist/server/sessiond/sessionProxyRoutes.js +60 -0
  74. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  75. package/dist/server/sessiond.js +61 -0
  76. package/dist/server/sessiond.js.map +1 -0
  77. package/dist/server/sessions/authProviderOptions.js +56 -0
  78. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  79. package/dist/server/sessions/authRoutes.js +59 -0
  80. package/dist/server/sessions/authRoutes.js.map +1 -0
  81. package/dist/server/sessions/authService.js +74 -0
  82. package/dist/server/sessions/authService.js.map +1 -0
  83. package/dist/server/sessions/builtinCommands.js +27 -0
  84. package/dist/server/sessions/builtinCommands.js.map +1 -0
  85. package/dist/server/sessions/editPreview.js +196 -0
  86. package/dist/server/sessions/editPreview.js.map +1 -0
  87. package/dist/server/sessions/messagePaging.js +43 -0
  88. package/dist/server/sessions/messagePaging.js.map +1 -0
  89. package/dist/server/sessions/oauthLoginFlowService.js +219 -0
  90. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  91. package/dist/server/sessions/piSessionService.js +1054 -0
  92. package/dist/server/sessions/piSessionService.js.map +1 -0
  93. package/dist/server/sessions/sessionArchiveStore.js +216 -0
  94. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  95. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  96. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  97. package/dist/server/sessions/sessionCommandService.js +234 -0
  98. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  99. package/dist/server/sessions/sessionNameGenerator.js +68 -0
  100. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  101. package/dist/server/sessions/sessionRoutes.js +184 -0
  102. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  103. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  104. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  105. package/dist/server/storage/projectStore.js +88 -0
  106. package/dist/server/storage/projectStore.js.map +1 -0
  107. package/dist/server/terminalProxyRoutes.js +130 -0
  108. package/dist/server/terminalProxyRoutes.js.map +1 -0
  109. package/dist/server/terminals/terminalRoutes.js +138 -0
  110. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  111. package/dist/server/terminals/terminalService.js +293 -0
  112. package/dist/server/terminals/terminalService.js.map +1 -0
  113. package/dist/server/terminals/terminalSize.js +17 -0
  114. package/dist/server/terminals/terminalSize.js.map +1 -0
  115. package/dist/server/types.js +2 -0
  116. package/dist/server/types.js.map +1 -0
  117. package/dist/server/webSocketBridge.js +32 -0
  118. package/dist/server/webSocketBridge.js.map +1 -0
  119. package/dist/server/workspaceExplorerRoutes.js +42 -0
  120. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  121. package/dist/server/workspaces/fileContentService.js +70 -0
  122. package/dist/server/workspaces/fileContentService.js.map +1 -0
  123. package/dist/server/workspaces/fileSuggestions.js +148 -0
  124. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  125. package/dist/server/workspaces/fileTreeService.js +26 -0
  126. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  127. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  128. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  129. package/dist/server/workspaces/imagePreviewService.js +40 -0
  130. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  131. package/dist/server/workspaces/pathSafety.js +45 -0
  132. package/dist/server/workspaces/pathSafety.js.map +1 -0
  133. package/dist/server/workspaces/workspaceContext.js +8 -0
  134. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  135. package/dist/server/workspaces/workspaceService.js +39 -0
  136. package/dist/server/workspaces/workspaceService.js.map +1 -0
  137. package/dist/sessiond/config.js +9 -0
  138. package/dist/sessiond/config.js.map +1 -0
  139. package/dist/sessiond/sessionDaemonClient.js +65 -0
  140. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  141. package/dist/shared/activity.js +26 -0
  142. package/dist/shared/activity.js.map +1 -0
  143. package/dist/shared/apiTypes.d.ts +464 -0
  144. package/dist/shared/apiTypes.js +2 -0
  145. package/dist/shared/apiTypes.js.map +1 -0
  146. package/dist/shared/federatedRoutes.js +57 -0
  147. package/dist/shared/federatedRoutes.js.map +1 -0
  148. package/dist/shared/piWebStatusParsing.js +62 -0
  149. package/dist/shared/piWebStatusParsing.js.map +1 -0
  150. package/dist/shared/pluginIds.js +5 -0
  151. package/dist/shared/pluginIds.js.map +1 -0
  152. package/dist/shared/workspaceFiles.js +3 -0
  153. package/dist/shared/workspaceFiles.js.map +1 -0
  154. package/docs/assets/favicon.svg +11 -0
  155. package/docs/assets/pi-web-banner.png +0 -0
  156. package/docs/assets/pi-web-demo.gif +0 -0
  157. package/docs/assets/pi-web-demo.webm +0 -0
  158. package/docs/plugins.md +762 -0
  159. package/extensions/pi-web.ts +133 -0
  160. package/install.sh +5 -0
  161. package/package.json +127 -0
  162. package/plugin-api/unstable.d.ts +1 -0
  163. package/plugin-api.d.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineRoutes.js","sourceRoot":"","sources":["../../../src/server/machines/machineRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { getPiWebStatus } from "../piWebStatus.js";
2
+ import { DEFAULT_REMOTE_HEALTH_TIMEOUT_MS, RemoteMachineClient, validateConfiguredMachineHeaders } from "./machineClient.js";
3
+ import { MachineStore } from "./machineStore.js";
4
+ const LOCAL_MACHINE_TIMESTAMP = "1970-01-01T00:00:00.000Z";
5
+ const DEFAULT_HEALTH_CACHE_TTL_MS = 5_000;
6
+ export class MachineService {
7
+ constructor(store = new MachineStore(), deps = {}) {
8
+ this.store = store;
9
+ this.deps = deps;
10
+ this.healthCache = new Map();
11
+ }
12
+ async list() {
13
+ return [localMachine(), ...(await this.store.list()).map(publicMachine)];
14
+ }
15
+ async get(id) {
16
+ if (id === "local")
17
+ return localMachine();
18
+ const machine = (await this.store.list()).find((stored) => stored.id === id);
19
+ return machine === undefined ? undefined : publicMachine(machine);
20
+ }
21
+ async add(input) {
22
+ const name = validateName(input.name);
23
+ const baseUrl = validateBaseUrl(input.baseUrl);
24
+ const stored = await this.store.add({ name, baseUrl, ...optionalSecrets(input) });
25
+ return publicMachine(stored);
26
+ }
27
+ async update(id, input) {
28
+ if (id === "local")
29
+ throw new Error("Local machine cannot be changed");
30
+ const patch = {};
31
+ if (input.name !== undefined)
32
+ patch.name = validateName(input.name);
33
+ if (input.baseUrl !== undefined)
34
+ patch.baseUrl = validateBaseUrl(input.baseUrl);
35
+ if (input.token !== undefined)
36
+ patch.token = input.token;
37
+ if (input.headers !== undefined)
38
+ patch.headers = validateHeaders(input.headers);
39
+ const stored = await this.store.update(id, patch);
40
+ if (stored !== undefined)
41
+ this.healthCache.delete(id);
42
+ return stored === undefined ? undefined : publicMachine(stored);
43
+ }
44
+ async remove(id) {
45
+ if (id === "local")
46
+ throw new Error("Local machine cannot be deleted");
47
+ const removed = await this.store.remove(id);
48
+ if (removed)
49
+ this.healthCache.delete(id);
50
+ return removed;
51
+ }
52
+ async storedRemote(id) {
53
+ if (id === "local")
54
+ return undefined;
55
+ return (await this.store.list()).find((machine) => machine.id === id);
56
+ }
57
+ async remoteClient(id) {
58
+ const machine = await this.storedRemote(id);
59
+ return machine === undefined ? undefined : this.clientFor(machine);
60
+ }
61
+ async health(id) {
62
+ const cached = this.healthCache.get(id);
63
+ const now = this.now().getTime();
64
+ if (cached !== undefined && cached.expiresAt > now)
65
+ return cached.health;
66
+ const health = id === "local" ? await this.localHealth() : await this.remoteHealth(id);
67
+ if (health === undefined)
68
+ return undefined;
69
+ this.healthCache.set(id, { expiresAt: now + (this.deps.healthCacheTtlMs ?? DEFAULT_HEALTH_CACHE_TTL_MS), health });
70
+ return health;
71
+ }
72
+ async localHealth() {
73
+ const checkedAt = this.now().toISOString();
74
+ try {
75
+ const status = await (this.deps.localStatus ?? getPiWebStatus)();
76
+ return { machineId: "local", ok: true, checkedAt, status: "online", web: status.components.web, sessiond: status.components.sessiond };
77
+ }
78
+ catch (error) {
79
+ return { machineId: "local", ok: false, checkedAt, status: "error", error: errorMessage(error) };
80
+ }
81
+ }
82
+ async remoteHealth(id) {
83
+ const machine = await this.storedRemote(id);
84
+ if (machine === undefined)
85
+ return undefined;
86
+ const checkedAt = this.now().toISOString();
87
+ try {
88
+ const response = await this.clientFor(machine).requestJson("GET", "/api/pi-web/status", undefined, { timeoutMs: DEFAULT_REMOTE_HEALTH_TIMEOUT_MS });
89
+ if (response.statusCode >= 200 && response.statusCode < 300 && isPiWebStatusResponse(response.body)) {
90
+ return { machineId: id, ok: true, checkedAt, status: "online", web: response.body.components.web, sessiond: response.body.components.sessiond };
91
+ }
92
+ return { machineId: id, ok: false, checkedAt, status: "error", error: `Remote health returned HTTP ${String(response.statusCode)}` };
93
+ }
94
+ catch (error) {
95
+ return { machineId: id, ok: false, checkedAt, status: "offline", error: errorMessage(error) };
96
+ }
97
+ }
98
+ clientFor(machine) {
99
+ return this.deps.remoteClientFactory?.(machine) ?? new RemoteMachineClient(machine);
100
+ }
101
+ now() {
102
+ return this.deps.now?.() ?? new Date();
103
+ }
104
+ }
105
+ export function localMachine() {
106
+ return { id: "local", name: "Local", kind: "local", createdAt: LOCAL_MACHINE_TIMESTAMP, updatedAt: LOCAL_MACHINE_TIMESTAMP };
107
+ }
108
+ function publicMachine(machine) {
109
+ return { id: machine.id, name: machine.name, kind: "remote", baseUrl: machine.baseUrl, createdAt: machine.createdAt, updatedAt: machine.updatedAt };
110
+ }
111
+ function validateName(value) {
112
+ const name = value?.trim();
113
+ if (name === undefined || name === "")
114
+ throw new Error("Machine name is required");
115
+ return name;
116
+ }
117
+ function validateBaseUrl(value) {
118
+ const raw = value?.trim();
119
+ if (raw === undefined || raw === "")
120
+ throw new Error("Machine baseUrl is required");
121
+ let url;
122
+ try {
123
+ url = new URL(raw);
124
+ }
125
+ catch {
126
+ throw new Error("Machine baseUrl must be a valid URL");
127
+ }
128
+ if (url.protocol !== "http:" && url.protocol !== "https:")
129
+ throw new Error("Machine baseUrl must use http or https");
130
+ if (url.username !== "" || url.password !== "")
131
+ throw new Error("Machine baseUrl must not include credentials");
132
+ if (url.search !== "" || url.hash !== "")
133
+ throw new Error("Machine baseUrl must not include query or hash");
134
+ return url.href.replace(/\/$/u, "");
135
+ }
136
+ function optionalSecrets(input) {
137
+ return {
138
+ ...(input.token === undefined ? {} : { token: input.token }),
139
+ ...(input.headers === undefined ? {} : { headers: validateHeaders(input.headers) }),
140
+ };
141
+ }
142
+ function validateHeaders(value) {
143
+ return validateConfiguredMachineHeaders(value) ?? {};
144
+ }
145
+ function errorMessage(error) {
146
+ return error instanceof Error ? error.message : String(error);
147
+ }
148
+ function isPiWebStatusResponse(value) {
149
+ if (!isRecord(value))
150
+ return false;
151
+ const components = value["components"];
152
+ if (!isRecord(components))
153
+ return false;
154
+ return isPiWebComponentStatus(components["web"]) && isPiWebComponentStatus(components["sessiond"]);
155
+ }
156
+ function isPiWebComponentStatus(value) {
157
+ if (!isRecord(value))
158
+ return false;
159
+ const component = value["component"];
160
+ return (component === "web" || component === "sessiond")
161
+ && typeof value["label"] === "string"
162
+ && typeof value["stale"] === "boolean"
163
+ && typeof value["available"] === "boolean";
164
+ }
165
+ function isRecord(value) {
166
+ return typeof value === "object" && value !== null && !Array.isArray(value);
167
+ }
168
+ //# sourceMappingURL=machineService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineService.js","sourceRoot":"","sources":["../../../src/server/machines/machineService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { piWebDataDir } from "../../config.js";
5
+ const MACHINE_STORE_FILE_MODE = 0o600;
6
+ export function defaultMachineStorePath(env = process.env, cwd = process.cwd()) {
7
+ return join(piWebDataDir(env, cwd), "machines.json");
8
+ }
9
+ export function machineStorePath(env = process.env, cwd = process.cwd()) {
10
+ const configured = env["PI_WEB_MACHINES_FILE"];
11
+ if (configured === undefined || configured === "")
12
+ return defaultMachineStorePath(env, cwd);
13
+ return resolve(cwd, configured);
14
+ }
15
+ export class MachineStore {
16
+ constructor(filePath = machineStorePath()) {
17
+ this.filePath = filePath;
18
+ }
19
+ async list() {
20
+ return (await this.read()).machines;
21
+ }
22
+ async add(input) {
23
+ const data = await this.read();
24
+ const now = new Date().toISOString();
25
+ const machine = {
26
+ id: randomUUID(),
27
+ name: input.name,
28
+ kind: "remote",
29
+ baseUrl: input.baseUrl,
30
+ ...(input.token === undefined ? {} : { token: input.token }),
31
+ ...(input.headers === undefined ? {} : { headers: input.headers }),
32
+ createdAt: now,
33
+ updatedAt: now,
34
+ };
35
+ data.machines.push(machine);
36
+ await this.write(data);
37
+ return machine;
38
+ }
39
+ async update(id, patch) {
40
+ const data = await this.read();
41
+ const index = data.machines.findIndex((machine) => machine.id === id);
42
+ if (index < 0)
43
+ return undefined;
44
+ const current = data.machines[index];
45
+ if (current === undefined)
46
+ return undefined;
47
+ const next = { ...current, ...patch, updatedAt: new Date().toISOString() };
48
+ data.machines[index] = next;
49
+ await this.write(data);
50
+ return next;
51
+ }
52
+ async remove(id) {
53
+ const data = await this.read();
54
+ const machines = data.machines.filter((machine) => machine.id !== id);
55
+ if (machines.length === data.machines.length)
56
+ return false;
57
+ await this.write({ machines });
58
+ return true;
59
+ }
60
+ async read() {
61
+ try {
62
+ const value = JSON.parse(await readFile(this.filePath, "utf8"));
63
+ const parsed = parseMachineFile(value);
64
+ await restrictMachineStorePermissions(this.filePath);
65
+ return parsed;
66
+ }
67
+ catch (error) {
68
+ if (isNodeErrorWithCode(error, "ENOENT"))
69
+ return { machines: [] };
70
+ throw error;
71
+ }
72
+ }
73
+ async write(data) {
74
+ await mkdir(dirname(this.filePath), { recursive: true });
75
+ await writeFile(this.filePath, `${JSON.stringify(data, null, 2)}\n`, { encoding: "utf8", mode: MACHINE_STORE_FILE_MODE });
76
+ await restrictMachineStorePermissions(this.filePath);
77
+ }
78
+ }
79
+ function parseMachineFile(value) {
80
+ if (!isRecord(value) || !Array.isArray(value["machines"]))
81
+ throw new Error("Invalid machine file");
82
+ return { machines: value["machines"].map(parseStoredMachine) };
83
+ }
84
+ function parseStoredMachine(value) {
85
+ if (!isRecord(value))
86
+ throw new Error("Invalid machine");
87
+ const id = value["id"];
88
+ const name = value["name"];
89
+ const kind = value["kind"];
90
+ const baseUrl = value["baseUrl"];
91
+ const createdAt = value["createdAt"];
92
+ const updatedAt = value["updatedAt"];
93
+ if (typeof id !== "string" || typeof name !== "string" || kind !== "remote" || typeof baseUrl !== "string" || typeof createdAt !== "string" || typeof updatedAt !== "string")
94
+ throw new Error("Invalid machine");
95
+ const token = optionalString(value["token"], "token");
96
+ const headers = optionalStringRecord(value["headers"], "headers");
97
+ return { id, name, kind, baseUrl, createdAt, updatedAt, ...(token === undefined ? {} : { token }), ...(headers === undefined ? {} : { headers }) };
98
+ }
99
+ function optionalString(value, key) {
100
+ if (value === undefined)
101
+ return undefined;
102
+ if (typeof value !== "string")
103
+ throw new Error(`Invalid machine ${key}`);
104
+ return value;
105
+ }
106
+ function optionalStringRecord(value, key) {
107
+ if (value === undefined)
108
+ return undefined;
109
+ if (!isRecord(value))
110
+ throw new Error(`Invalid machine ${key}`);
111
+ return Object.fromEntries(Object.entries(value).map(([header, headerValue]) => {
112
+ if (typeof headerValue !== "string")
113
+ throw new Error(`Invalid machine ${key}`);
114
+ return [header, headerValue];
115
+ }));
116
+ }
117
+ async function restrictMachineStorePermissions(path) {
118
+ if (process.platform === "win32")
119
+ return;
120
+ await chmod(path, MACHINE_STORE_FILE_MODE);
121
+ }
122
+ function isRecord(value) {
123
+ return typeof value === "object" && value !== null && !Array.isArray(value);
124
+ }
125
+ function isNodeErrorWithCode(error, code) {
126
+ return error instanceof Error && "code" in error && error.code === code;
127
+ }
128
+ //# sourceMappingURL=machineStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineStore.js","sourceRoot":"","sources":["../../../src/server/machines/machineStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readdir, readFile, realpath, stat } from "node:fs/promises";
3
+ import { dirname, join, relative, resolve, sep } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { DefaultPackageManager, getAgentDir, SettingsManager } from "@earendil-works/pi-coding-agent";
6
+ import { loadPiWebConfig, piWebDataDir } from "../config.js";
7
+ import { isPiWebPluginId } from "../shared/pluginIds.js";
8
+ export class DefaultPiPackageProvider {
9
+ constructor(cwd = process.cwd(), agentDir = getAgentDir()) {
10
+ this.packageManager = new DefaultPackageManager({
11
+ cwd,
12
+ agentDir,
13
+ settingsManager: SettingsManager.create(cwd, agentDir),
14
+ });
15
+ }
16
+ listPackages() {
17
+ return this.packageManager.listConfiguredPackages();
18
+ }
19
+ getInstalledPath(source, scope) {
20
+ return this.packageManager.getInstalledPath(source, scope);
21
+ }
22
+ }
23
+ export class PiWebPluginService {
24
+ constructor(options = {}) {
25
+ const cwd = options.cwd ?? process.cwd();
26
+ const agentDir = options.agentDir ?? getAgentDir();
27
+ this.roots = options.roots ?? defaultPluginRoots(cwd);
28
+ this.packageProvider = options.packageProvider === false ? undefined : options.packageProvider ?? new DefaultPiPackageProvider(cwd, agentDir);
29
+ this.configProvider = options.configProvider ?? (() => loadPiWebConfig({ cwd }).config);
30
+ }
31
+ async manifest() {
32
+ return {
33
+ plugins: (await this.plugins()).plugins
34
+ .filter((plugin) => plugin.enabled)
35
+ .map((plugin) => ({ id: plugin.id, module: plugin.module, source: plugin.source, scope: plugin.scope })),
36
+ };
37
+ }
38
+ async plugins() {
39
+ const [plugins, config] = await Promise.all([this.discoverPlugins(), Promise.resolve(this.configProvider())]);
40
+ return { plugins: plugins.map((plugin) => this.pluginInfo(plugin, config)) };
41
+ }
42
+ async readAsset(pluginId, assetPath) {
43
+ if (!isPiWebPluginId(pluginId))
44
+ return undefined;
45
+ const plugin = (await this.discoverPlugins()).find((candidate) => candidate.id === pluginId);
46
+ if (plugin === undefined)
47
+ return undefined;
48
+ const resolved = resolve(plugin.root, assetPath);
49
+ const [realRoot, realAsset] = await Promise.all([
50
+ realpath(plugin.root),
51
+ realpath(resolved).catch(() => undefined),
52
+ ]);
53
+ if (realAsset === undefined || !isWithin(realRoot, realAsset))
54
+ return undefined;
55
+ const assetStat = await stat(realAsset).catch(() => undefined);
56
+ if (assetStat?.isFile() !== true)
57
+ return undefined;
58
+ return { content: await readFile(realAsset), contentType: contentTypeFor(realAsset) };
59
+ }
60
+ pluginInfo(plugin, config) {
61
+ return {
62
+ id: plugin.id,
63
+ module: `/pi-web-plugins/${encodeURIComponent(plugin.id)}/${plugin.entryFile}?v=${encodeURIComponent(plugin.version)}`,
64
+ source: plugin.source,
65
+ scope: plugin.scope,
66
+ enabled: config.plugins?.[plugin.id]?.enabled !== false,
67
+ };
68
+ }
69
+ async discoverPlugins() {
70
+ const records = new Map();
71
+ for (const plugin of await this.discoverLocalPlugins())
72
+ addUnique(records, plugin);
73
+ if (this.packageProvider !== undefined) {
74
+ for (const plugin of await this.discoverPiPackagePlugins(this.packageProvider))
75
+ addUnique(records, plugin);
76
+ }
77
+ return [...records.values()].sort((left, right) => left.id.localeCompare(right.id));
78
+ }
79
+ async discoverLocalPlugins() {
80
+ const plugins = [];
81
+ for (const root of this.roots)
82
+ plugins.push(...await discoverLocalRoot(root));
83
+ return plugins;
84
+ }
85
+ async discoverPiPackagePlugins(packageProvider) {
86
+ const plugins = [];
87
+ for (const configuredPackage of packageProvider.listPackages()) {
88
+ const root = configuredPackage.installedPath ?? packageProvider.getInstalledPath(configuredPackage.source, configuredPackage.scope);
89
+ if (root === undefined)
90
+ continue;
91
+ try {
92
+ plugins.push(...await discoverPackageRoot(root, configuredPackage));
93
+ }
94
+ catch (error) {
95
+ warnInvalidPlugin(configuredPackage.source, error);
96
+ }
97
+ }
98
+ return plugins;
99
+ }
100
+ }
101
+ function defaultPluginRoots(cwd) {
102
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
103
+ const packageRoot = join(moduleDir, "..", "..");
104
+ return [
105
+ { path: bundledPluginRoot(packageRoot), source: "bundled", scope: "bundled" },
106
+ ...sourceCheckoutPluginRoots(cwd),
107
+ { path: join(piWebDataDir(), "plugins"), source: "local", scope: "local" },
108
+ ];
109
+ }
110
+ function bundledPluginRoot(packageRoot) {
111
+ return join(packageRoot, "dist", "pi-web-plugins");
112
+ }
113
+ function sourceCheckoutPluginRoots(cwd) {
114
+ const pluginsRoot = join(cwd, "plugins");
115
+ if (!existsSync(join(cwd, "src", "server", "index.ts")) || !existsSync(pluginsRoot))
116
+ return [];
117
+ return [{ path: pluginsRoot, source: "dev", scope: "local" }];
118
+ }
119
+ async function discoverLocalRoot(root) {
120
+ if (!existsSync(root.path))
121
+ return [];
122
+ const entries = await readdir(root.path, { withFileTypes: true }).catch(() => []);
123
+ const plugins = [];
124
+ for (const entry of entries) {
125
+ if (!isPiWebPluginId(entry.name))
126
+ continue;
127
+ const pluginRoot = join(root.path, entry.name);
128
+ const pluginStat = entry.isDirectory() ? undefined : entry.isSymbolicLink() ? await stat(pluginRoot).catch(() => undefined) : undefined;
129
+ if (!entry.isDirectory() && pluginStat?.isDirectory() !== true)
130
+ continue;
131
+ try {
132
+ plugins.push(...await discoverLocalPlugin(pluginRoot, root));
133
+ }
134
+ catch (error) {
135
+ warnInvalidPlugin(pluginRoot, error);
136
+ }
137
+ }
138
+ return plugins;
139
+ }
140
+ async function discoverLocalPlugin(root, localRoot) {
141
+ const config = await readPiWebPackageConfig(root);
142
+ if (config === undefined)
143
+ return [];
144
+ const plugins = await discoverPluginEntries(root, config);
145
+ return plugins.map((plugin) => ({ ...plugin, source: localRoot.source, scope: localRoot.scope }));
146
+ }
147
+ async function discoverPackageRoot(root, configuredPackage) {
148
+ const config = await readPiWebPackageConfig(root);
149
+ if (config === undefined)
150
+ return [];
151
+ const plugins = await discoverPluginEntries(root, config);
152
+ return plugins.map((plugin) => ({ ...plugin, source: configuredPackage.source, scope: configuredPackage.scope }));
153
+ }
154
+ async function discoverPluginEntries(root, config) {
155
+ const plugins = [];
156
+ for (const entry of config.plugins) {
157
+ if (!isSafeRelativePath(entry.module))
158
+ throw new Error(`Unsafe PI WEB plugin module path for ${entry.id}: ${entry.module}`);
159
+ const entryPath = join(root, entry.module);
160
+ const entryStat = await stat(entryPath).catch(() => undefined);
161
+ if (entryStat?.isFile() !== true)
162
+ throw new Error(`PI WEB plugin module not found for ${entry.id}: ${entry.module}`);
163
+ plugins.push({ id: entry.id, root, entryFile: entry.module, version: String(Math.floor(entryStat.mtimeMs)) });
164
+ }
165
+ return plugins;
166
+ }
167
+ async function readPiWebPackageConfig(root) {
168
+ const packagePath = join(root, "package.json");
169
+ const content = await readFile(packagePath, "utf8").catch(() => undefined);
170
+ if (content === undefined)
171
+ return undefined;
172
+ const parsed = JSON.parse(content);
173
+ if (!isRecord(parsed))
174
+ return undefined;
175
+ const piWeb = parsed["piWeb"];
176
+ if (!isRecord(piWeb))
177
+ return undefined;
178
+ const plugins = parsePluginEntries(piWeb, packagePath);
179
+ if (plugins.length === 0)
180
+ return undefined;
181
+ return { plugins };
182
+ }
183
+ function parsePluginEntries(piWeb, packagePath) {
184
+ if (piWeb["plugin"] !== undefined)
185
+ throw new Error(`Unsupported PI WEB plugin metadata in ${packagePath}: use piWeb.plugins with { id, module } entries`);
186
+ const plugins = piWeb["plugins"];
187
+ if (plugins === undefined)
188
+ return [];
189
+ if (!Array.isArray(plugins))
190
+ throw new Error(`PI WEB plugins must be an array in ${packagePath}`);
191
+ return plugins.map((entry, index) => {
192
+ if (!isRecord(entry))
193
+ throw new Error(`PI WEB plugin entry ${String(index + 1)} must be an object in ${packagePath}`);
194
+ const id = entry["id"];
195
+ const module = entry["module"];
196
+ if (typeof id !== "string" || !isPiWebPluginId(id))
197
+ throw new Error(`Invalid PI WEB plugin id in ${packagePath}: ${String(id)}`);
198
+ if (typeof module !== "string" || module === "")
199
+ throw new Error(`Invalid PI WEB plugin module for ${id} in ${packagePath}`);
200
+ return { id, module };
201
+ });
202
+ }
203
+ function addUnique(records, plugin) {
204
+ if (records.has(plugin.id)) {
205
+ warnInvalidPlugin(plugin.source, `Duplicate PI WEB plugin id: ${plugin.id}`);
206
+ return;
207
+ }
208
+ records.set(plugin.id, plugin);
209
+ }
210
+ function warnInvalidPlugin(source, error) {
211
+ const message = error instanceof Error ? error.message : String(error);
212
+ console.warn(`Skipping PI WEB plugin from ${source}: ${message}`);
213
+ }
214
+ function isSafeRelativePath(path) {
215
+ return path !== "" && !path.includes("..") && !path.startsWith("/");
216
+ }
217
+ function isWithin(root, candidate) {
218
+ const rel = relative(root, candidate);
219
+ return rel === "" || (!rel.startsWith("..") && !rel.startsWith(sep));
220
+ }
221
+ function contentTypeFor(path) {
222
+ if (path.endsWith(".js"))
223
+ return "application/javascript; charset=utf-8";
224
+ if (path.endsWith(".json"))
225
+ return "application/json; charset=utf-8";
226
+ if (path.endsWith(".css"))
227
+ return "text/css; charset=utf-8";
228
+ if (path.endsWith(".html"))
229
+ return "text/html; charset=utf-8";
230
+ return "application/octet-stream";
231
+ }
232
+ function isRecord(value) {
233
+ return typeof value === "object" && value !== null && !Array.isArray(value);
234
+ }
235
+ //# sourceMappingURL=piWebPluginService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piWebPluginService.js","sourceRoot":"","sources":["../../src/server/piWebPluginService.ts"],"names":[],"mappings":"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"}