pi-forge 0.0.0 → 1.1.4

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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -4
  3. package/bin/pi-forge.mjs +37 -0
  4. package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js +34 -0
  5. package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js.map +1 -0
  6. package/dist/client/assets/index-B-529kgJ.css +32 -0
  7. package/dist/client/assets/index-BzKzxXFs.js +392 -0
  8. package/dist/client/assets/index-BzKzxXFs.js.map +1 -0
  9. package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js +3 -0
  10. package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js.map +1 -0
  11. package/dist/client/icons/icon-192.png +0 -0
  12. package/dist/client/icons/icon-512.png +0 -0
  13. package/dist/client/icons/icon-maskable-512.png +0 -0
  14. package/dist/client/icons/icon.svg +9 -0
  15. package/dist/client/index.html +24 -0
  16. package/dist/client/manifest.webmanifest +1 -0
  17. package/dist/client/offline.html +142 -0
  18. package/dist/client/sw.js +3 -0
  19. package/dist/client/sw.js.map +1 -0
  20. package/dist/client/workbox-6d7155ed.js +3 -0
  21. package/dist/client/workbox-6d7155ed.js.map +1 -0
  22. package/dist/server/agent-resource-loader.js +126 -0
  23. package/dist/server/agent-resource-loader.js.map +1 -0
  24. package/dist/server/attachment-converters.js +96 -0
  25. package/dist/server/attachment-converters.js.map +1 -0
  26. package/dist/server/auth.js +209 -0
  27. package/dist/server/auth.js.map +1 -0
  28. package/dist/server/compaction-history.js +106 -0
  29. package/dist/server/compaction-history.js.map +1 -0
  30. package/dist/server/concurrency.js +49 -0
  31. package/dist/server/concurrency.js.map +1 -0
  32. package/dist/server/config-export.js +220 -0
  33. package/dist/server/config-export.js.map +1 -0
  34. package/dist/server/config-manager.js +528 -0
  35. package/dist/server/config-manager.js.map +1 -0
  36. package/dist/server/config.js +326 -0
  37. package/dist/server/config.js.map +1 -0
  38. package/dist/server/conversion-worker.mjs +90 -0
  39. package/dist/server/diagnostics.js +137 -0
  40. package/dist/server/diagnostics.js.map +1 -0
  41. package/dist/server/extensions-discovery.js +147 -0
  42. package/dist/server/extensions-discovery.js.map +1 -0
  43. package/dist/server/file-manager.js +734 -0
  44. package/dist/server/file-manager.js.map +1 -0
  45. package/dist/server/file-references.js +215 -0
  46. package/dist/server/file-references.js.map +1 -0
  47. package/dist/server/file-searcher.js +385 -0
  48. package/dist/server/file-searcher.js.map +1 -0
  49. package/dist/server/git-runner.js +684 -0
  50. package/dist/server/git-runner.js.map +1 -0
  51. package/dist/server/index.js +468 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/mcp/config.js +133 -0
  54. package/dist/server/mcp/config.js.map +1 -0
  55. package/dist/server/mcp/manager.js +351 -0
  56. package/dist/server/mcp/manager.js.map +1 -0
  57. package/dist/server/mcp/tool-bridge.js +173 -0
  58. package/dist/server/mcp/tool-bridge.js.map +1 -0
  59. package/dist/server/project-manager.js +301 -0
  60. package/dist/server/project-manager.js.map +1 -0
  61. package/dist/server/pty-manager.js +354 -0
  62. package/dist/server/pty-manager.js.map +1 -0
  63. package/dist/server/routes/_schemas.js +73 -0
  64. package/dist/server/routes/_schemas.js.map +1 -0
  65. package/dist/server/routes/auth.js +164 -0
  66. package/dist/server/routes/auth.js.map +1 -0
  67. package/dist/server/routes/config.js +1163 -0
  68. package/dist/server/routes/config.js.map +1 -0
  69. package/dist/server/routes/control.js +464 -0
  70. package/dist/server/routes/control.js.map +1 -0
  71. package/dist/server/routes/exec.js +217 -0
  72. package/dist/server/routes/exec.js.map +1 -0
  73. package/dist/server/routes/files.js +847 -0
  74. package/dist/server/routes/files.js.map +1 -0
  75. package/dist/server/routes/git.js +837 -0
  76. package/dist/server/routes/git.js.map +1 -0
  77. package/dist/server/routes/health.js +97 -0
  78. package/dist/server/routes/health.js.map +1 -0
  79. package/dist/server/routes/mcp.js +300 -0
  80. package/dist/server/routes/mcp.js.map +1 -0
  81. package/dist/server/routes/projects.js +259 -0
  82. package/dist/server/routes/projects.js.map +1 -0
  83. package/dist/server/routes/prompt.js +496 -0
  84. package/dist/server/routes/prompt.js.map +1 -0
  85. package/dist/server/routes/sessions.js +783 -0
  86. package/dist/server/routes/sessions.js.map +1 -0
  87. package/dist/server/routes/stream.js +69 -0
  88. package/dist/server/routes/stream.js.map +1 -0
  89. package/dist/server/routes/terminal.js +335 -0
  90. package/dist/server/routes/terminal.js.map +1 -0
  91. package/dist/server/session-registry.js +1197 -0
  92. package/dist/server/session-registry.js.map +1 -0
  93. package/dist/server/skill-overrides.js +151 -0
  94. package/dist/server/skill-overrides.js.map +1 -0
  95. package/dist/server/skills-export.js +257 -0
  96. package/dist/server/skills-export.js.map +1 -0
  97. package/dist/server/sse-bridge.js +220 -0
  98. package/dist/server/sse-bridge.js.map +1 -0
  99. package/dist/server/tool-overrides.js +277 -0
  100. package/dist/server/tool-overrides.js.map +1 -0
  101. package/dist/server/turn-diff-builder.js +280 -0
  102. package/dist/server/turn-diff-builder.js.map +1 -0
  103. package/package.json +53 -12
@@ -0,0 +1,280 @@
1
+ import { stat, readFile } from "node:fs/promises";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
3
+ import { runGitRaw } from "./git-runner.js";
4
+ /**
5
+ * Walk the session's messages array and pull out the latest turn's
6
+ * write/edit operations, paired with their result details.
7
+ *
8
+ * When `explicitStartIndex` is provided (the session-registry's
9
+ * `lastAgentStartIndex`), the walk starts there and ignores
10
+ * intermediate user-shaped messages produced by compaction or steering.
11
+ * Otherwise we fall back to "the most recent user message" — fine for
12
+ * the common case and necessary for cold-loaded sessions that never
13
+ * emitted `agent_start` since the server booted.
14
+ */
15
+ export function collectTurnTouches(messages, explicitStartIndex) {
16
+ let startIndex = 0;
17
+ if (explicitStartIndex !== undefined &&
18
+ explicitStartIndex >= 0 &&
19
+ explicitStartIndex <= messages.length) {
20
+ startIndex = explicitStartIndex;
21
+ }
22
+ else {
23
+ for (let i = messages.length - 1; i >= 0; i--) {
24
+ const m = messages[i];
25
+ if (m.role === "user") {
26
+ startIndex = i + 1;
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ // Build callId → ToolCallInfo from assistant messages first.
32
+ // The SDK's `ToolCall` block (defined in `@mariozechner/pi-ai`'s
33
+ // types.d.ts) uses `arguments` for the input object — NOT `input`.
34
+ // We accept either field as a defensive measure: `arguments` is
35
+ // canonical, `input` is the historical naming some other SDKs use
36
+ // and a sensible alias if the pi schema ever shifts.
37
+ const callsById = new Map();
38
+ for (let i = startIndex; i < messages.length; i++) {
39
+ const m = messages[i];
40
+ if (m.role !== "assistant" || !Array.isArray(m.content))
41
+ continue;
42
+ for (const block of m.content) {
43
+ const b = block;
44
+ if (b.type !== "toolCall")
45
+ continue;
46
+ const name = b.name;
47
+ if (name !== "write" && name !== "edit")
48
+ continue;
49
+ const id = typeof b.id === "string" ? b.id : undefined;
50
+ const args = (b.arguments ?? b.input);
51
+ const path = typeof args?.path === "string" ? args.path : undefined;
52
+ if (id === undefined || path === undefined)
53
+ continue;
54
+ callsById.set(id, { toolCallId: id, toolName: name, path });
55
+ }
56
+ }
57
+ // Walk toolResults in order so multiple edits to the same file land
58
+ // in chronological sequence. The fallback "latest details.diff per
59
+ // file" naturally emerges because later entries overwrite earlier
60
+ // ones in the per-file map upstream.
61
+ const out = [];
62
+ for (let i = startIndex; i < messages.length; i++) {
63
+ const m = messages[i];
64
+ if (m.role !== "toolResult")
65
+ continue;
66
+ if (typeof m.toolCallId !== "string")
67
+ continue;
68
+ const call = callsById.get(m.toolCallId);
69
+ if (call === undefined)
70
+ continue;
71
+ const details = m.details;
72
+ const diffStr = typeof details?.diff === "string" ? details.diff : undefined;
73
+ const result = { isError: m.isError === true };
74
+ if (diffStr !== undefined)
75
+ result.diff = diffStr;
76
+ out.push({ call, result });
77
+ }
78
+ return out;
79
+ }
80
+ /**
81
+ * Build the per-file turn-diff for a session. Caller passes the
82
+ * session's `workspacePath` (the project root) — the builder uses it
83
+ * to scope `git diff` calls and to resolve relative paths the agent
84
+ * may have written into the toolCall input.
85
+ */
86
+ export async function buildTurnDiff(session, projectPath, explicitStartIndex) {
87
+ const touches = collectTurnTouches(session.messages, explicitStartIndex);
88
+ if (touches.length === 0)
89
+ return [];
90
+ const isGitRepo = await stat(join(projectPath, ".git")).then((s) => s.isDirectory() || s.isFile(), // .git can be a file in worktrees
91
+ () => false);
92
+ // Group by canonicalized absolute path. Multiple edits to the same
93
+ // file fold into one entry — we use cumulative `git diff HEAD`
94
+ // when possible so the order doesn't matter.
95
+ const byFile = new Map();
96
+ for (const pair of touches) {
97
+ const abs = absolutize(pair.call.path, projectPath);
98
+ const existing = byFile.get(abs);
99
+ if (existing === undefined)
100
+ byFile.set(abs, [pair]);
101
+ else
102
+ existing.push(pair);
103
+ }
104
+ // Single `git diff HEAD -- <files...>` for every touched file at
105
+ // once, then split the output by `diff --git` headers. Replaces the
106
+ // per-file subprocess fork; on a 50-file refactor that's 50→1 git
107
+ // invocations. Untracked files (no entry in HEAD) are absent from
108
+ // the result map and fall through to `tryPureAddition` below.
109
+ const gitDiffs = isGitRepo
110
+ ? await tryGitDiffMany(projectPath, [...byFile.keys()])
111
+ : new Map();
112
+ const entries = [];
113
+ for (const [absPath, pairs] of byFile) {
114
+ const toolName = preferredTool(pairs);
115
+ let diff;
116
+ let isPureAddition = false;
117
+ if (isGitRepo) {
118
+ diff = gitDiffs.get(absPath);
119
+ }
120
+ if (diff === undefined || diff.length === 0) {
121
+ // No git diff available (untracked, no repo, file went missing).
122
+ // Try pure-addition from current disk contents.
123
+ const pure = await tryPureAddition(projectPath, absPath);
124
+ if (pure !== undefined) {
125
+ diff = pure;
126
+ isPureAddition = true;
127
+ }
128
+ }
129
+ if (diff === undefined || diff.length === 0) {
130
+ // Last-resort fallback: the LATEST edit's per-edit diff. Better
131
+ // than dropping the file entirely.
132
+ for (let i = pairs.length - 1; i >= 0; i--) {
133
+ const candidate = pairs[i]?.result.diff;
134
+ if (candidate !== undefined && candidate.length > 0) {
135
+ diff = candidate;
136
+ break;
137
+ }
138
+ }
139
+ }
140
+ if (diff === undefined || diff.length === 0) {
141
+ // Truly nothing to show — skip rather than emit a noisy entry.
142
+ continue;
143
+ }
144
+ const { additions, deletions } = countChanges(diff);
145
+ entries.push({
146
+ file: absPath,
147
+ tool: toolName,
148
+ diff,
149
+ additions,
150
+ deletions,
151
+ isPureAddition,
152
+ });
153
+ }
154
+ // Sort alphabetically for stable rendering.
155
+ entries.sort((a, b) => a.file.localeCompare(b.file));
156
+ return entries;
157
+ }
158
+ function preferredTool(pairs) {
159
+ // If any entry was a `write`, the file was overwritten at some
160
+ // point — that dominates. Otherwise it's `edit`.
161
+ return pairs.some((p) => p.call.toolName === "write") ? "write" : "edit";
162
+ }
163
+ function absolutize(path, projectPath) {
164
+ return isAbsolute(path) ? resolve(path) : resolve(join(projectPath, path));
165
+ }
166
+ /**
167
+ * Run `git diff HEAD -- <files...>` for ALL touched files in one
168
+ * subprocess. Returns a map of absolute-path → unified-diff string;
169
+ * files that produced no diff (unchanged, untracked, deleted) are
170
+ * absent from the map. Callers fall back to `tryPureAddition` /
171
+ * the per-edit diff for those.
172
+ *
173
+ * `--no-color` keeps escape codes out; `--no-ext-diff` skips user-
174
+ * configured external diff drivers that could vary output.
175
+ *
176
+ * Output format for multi-file diffs:
177
+ * diff --git a/<rel1> b/<rel1>
178
+ * ...hunks...
179
+ * diff --git a/<rel2> b/<rel2>
180
+ * ...
181
+ * We split by the regex anchor `(?=^diff --git )` (multiline) which
182
+ * preserves the leading `diff --git` line on each chunk so the
183
+ * chunk parses cleanly as a single-file unified diff downstream.
184
+ */
185
+ async function tryGitDiffMany(projectPath, absPaths) {
186
+ const out = new Map();
187
+ if (absPaths.length === 0)
188
+ return out;
189
+ const rels = [];
190
+ const relToAbs = new Map();
191
+ for (const abs of absPaths) {
192
+ const rel = relative(projectPath, abs);
193
+ if (rel.startsWith(".."))
194
+ continue;
195
+ rels.push(rel);
196
+ relToAbs.set(rel, abs);
197
+ }
198
+ if (rels.length === 0)
199
+ return out;
200
+ let stdout;
201
+ try {
202
+ const r = await runGitRaw(projectPath, ["diff", "--no-color", "--no-ext-diff", "HEAD", "--", ...rels], { maxBuffer: 16 * 1024 * 1024 });
203
+ stdout = r.stdout;
204
+ }
205
+ catch {
206
+ // Common failures: not a git repo (no HEAD yet), git not on PATH.
207
+ return out;
208
+ }
209
+ if (stdout.length === 0)
210
+ return out;
211
+ // Split-with-lookahead keeps the `diff --git ...` header on each chunk.
212
+ const chunks = stdout.split(/(?=^diff --git )/m).filter((c) => c.length > 0);
213
+ for (const chunk of chunks) {
214
+ const newlineIdx = chunk.indexOf("\n");
215
+ const headerLine = newlineIdx === -1 ? chunk : chunk.slice(0, newlineIdx);
216
+ const m = /^diff --git a\/(.+?) b\/(.+)$/.exec(headerLine);
217
+ if (m === null)
218
+ continue;
219
+ // Prefer matching against the post-rename (b/) path; fall back to
220
+ // a/ for renames where we asked by the old name. Renames inside
221
+ // a turn-diff are rare since the agent's own write/edit tools
222
+ // operate by path — but be defensive.
223
+ const newRel = m[2] ?? "";
224
+ const oldRel = m[1] ?? "";
225
+ const abs = relToAbs.get(newRel) ?? relToAbs.get(oldRel);
226
+ if (abs === undefined)
227
+ continue;
228
+ out.set(abs, chunk);
229
+ }
230
+ return out;
231
+ }
232
+ /**
233
+ * Build a unified diff that adds the file from /dev/null. Used when
234
+ * the file is untracked / new — every line is an addition.
235
+ */
236
+ async function tryPureAddition(projectPath, absPath) {
237
+ let content;
238
+ try {
239
+ content = await readFile(absPath, "utf8");
240
+ }
241
+ catch {
242
+ // File vanished between the toolCall and our read (agent deleted
243
+ // it after writing it). Return undefined → caller skips this file
244
+ // in the turn diff rather than failing the whole build.
245
+ return undefined;
246
+ }
247
+ const rel = relative(projectPath, absPath);
248
+ if (rel.startsWith(".."))
249
+ return undefined;
250
+ const lines = content.length === 0 ? [] : content.split("\n");
251
+ // Trailing newline produces a trailing empty element from split;
252
+ // drop it so the hunk count is right.
253
+ const tail = content.endsWith("\n") && lines.length > 0 && lines[lines.length - 1] === ""
254
+ ? lines.slice(0, -1)
255
+ : lines;
256
+ const header = `diff --git a/${rel} b/${rel}\n` +
257
+ `new file mode 100644\n` +
258
+ `--- /dev/null\n` +
259
+ `+++ b/${rel}\n`;
260
+ if (tail.length === 0)
261
+ return header;
262
+ const hunk = `@@ -0,0 +1,${tail.length} @@\n` + tail.map((l) => `+${l}`).join("\n") + "\n";
263
+ return header + hunk;
264
+ }
265
+ function countChanges(diff) {
266
+ let additions = 0;
267
+ let deletions = 0;
268
+ for (const line of diff.split("\n")) {
269
+ if (line.startsWith("+++"))
270
+ continue;
271
+ if (line.startsWith("---"))
272
+ continue;
273
+ if (line.startsWith("+"))
274
+ additions += 1;
275
+ else if (line.startsWith("-"))
276
+ deletions += 1;
277
+ }
278
+ return { additions, deletions };
279
+ }
280
+ //# sourceMappingURL=turn-diff-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-diff-builder.js","sourceRoot":"","sources":["../src/turn-diff-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,61 @@
1
1
  {
2
2
  "name": "pi-forge",
3
- "version": "0.0.0",
4
- "description": "Browser workbench for the pi coding agent. Reserved see https://github.com/Devin-Marks/pi-workbench (rename in progress).",
3
+ "version": "1.1.4",
4
+ "description": "Browser UI for the pi coding agent — embedded HTTP server with a React workbench (chat, file browser, terminal, git, MCP).",
5
+ "keywords": [
6
+ "pi",
7
+ "coding-agent",
8
+ "ai",
9
+ "llm",
10
+ "agent",
11
+ "workbench",
12
+ "fastify"
13
+ ],
14
+ "homepage": "https://github.com/Devin-Marks/pi-forge#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/Devin-Marks/pi-forge/issues"
17
+ },
5
18
  "repository": {
6
19
  "type": "git",
7
- "url": "git+https://github.com/Devin-Marks/pi-workbench.git"
20
+ "url": "git+https://github.com/Devin-Marks/pi-forge.git"
8
21
  },
9
- "homepage": "https://github.com/Devin-Marks/pi-workbench",
10
22
  "license": "MIT",
11
23
  "author": "Devin Marks",
12
- "keywords": [
13
- "pi",
14
- "pi-coding-agent",
15
- "agent",
16
- "browser-ui",
17
- "self-hosted",
18
- "workbench"
19
- ]
24
+ "type": "module",
25
+ "bin": {
26
+ "pi-forge": "bin/pi-forge.mjs"
27
+ },
28
+ "files": [
29
+ "bin/",
30
+ "dist/",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "engines": {
35
+ "node": ">=20"
36
+ },
37
+ "dependencies": {
38
+ "@fastify/cors": "^11.0.1",
39
+ "@fastify/multipart": "^9.0.3",
40
+ "@fastify/rate-limit": "^10.2.2",
41
+ "@fastify/static": "^9.1.3",
42
+ "@fastify/swagger": "^9.5.0",
43
+ "@fastify/swagger-ui": "^5.2.3",
44
+ "@fastify/websocket": "^11.0.2",
45
+ "@mariozechner/pi-agent-core": "0.73.1",
46
+ "@mariozechner/pi-ai": "0.73.1",
47
+ "@mariozechner/pi-coding-agent": "0.73.1",
48
+ "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "exceljs": "^4.4.0",
50
+ "fastify": "^5.3.2",
51
+ "jsonwebtoken": "^9.0.2",
52
+ "mammoth": "^1.12.0",
53
+ "node-pty": "^1.0.0",
54
+ "pdf-parse": "^2.4.5",
55
+ "tar": "^7.5.15"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public",
59
+ "provenance": true
60
+ }
20
61
  }