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.
- package/LICENSE +21 -0
- package/README.md +48 -4
- package/bin/pi-forge.mjs +37 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js +34 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js.map +1 -0
- package/dist/client/assets/index-B-529kgJ.css +32 -0
- package/dist/client/assets/index-BzKzxXFs.js +392 -0
- package/dist/client/assets/index-BzKzxXFs.js.map +1 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js +3 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js.map +1 -0
- package/dist/client/icons/icon-192.png +0 -0
- package/dist/client/icons/icon-512.png +0 -0
- package/dist/client/icons/icon-maskable-512.png +0 -0
- package/dist/client/icons/icon.svg +9 -0
- package/dist/client/index.html +24 -0
- package/dist/client/manifest.webmanifest +1 -0
- package/dist/client/offline.html +142 -0
- package/dist/client/sw.js +3 -0
- package/dist/client/sw.js.map +1 -0
- package/dist/client/workbox-6d7155ed.js +3 -0
- package/dist/client/workbox-6d7155ed.js.map +1 -0
- package/dist/server/agent-resource-loader.js +126 -0
- package/dist/server/agent-resource-loader.js.map +1 -0
- package/dist/server/attachment-converters.js +96 -0
- package/dist/server/attachment-converters.js.map +1 -0
- package/dist/server/auth.js +209 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/compaction-history.js +106 -0
- package/dist/server/compaction-history.js.map +1 -0
- package/dist/server/concurrency.js +49 -0
- package/dist/server/concurrency.js.map +1 -0
- package/dist/server/config-export.js +220 -0
- package/dist/server/config-export.js.map +1 -0
- package/dist/server/config-manager.js +528 -0
- package/dist/server/config-manager.js.map +1 -0
- package/dist/server/config.js +326 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/conversion-worker.mjs +90 -0
- package/dist/server/diagnostics.js +137 -0
- package/dist/server/diagnostics.js.map +1 -0
- package/dist/server/extensions-discovery.js +147 -0
- package/dist/server/extensions-discovery.js.map +1 -0
- package/dist/server/file-manager.js +734 -0
- package/dist/server/file-manager.js.map +1 -0
- package/dist/server/file-references.js +215 -0
- package/dist/server/file-references.js.map +1 -0
- package/dist/server/file-searcher.js +385 -0
- package/dist/server/file-searcher.js.map +1 -0
- package/dist/server/git-runner.js +684 -0
- package/dist/server/git-runner.js.map +1 -0
- package/dist/server/index.js +468 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/config.js +133 -0
- package/dist/server/mcp/config.js.map +1 -0
- package/dist/server/mcp/manager.js +351 -0
- package/dist/server/mcp/manager.js.map +1 -0
- package/dist/server/mcp/tool-bridge.js +173 -0
- package/dist/server/mcp/tool-bridge.js.map +1 -0
- package/dist/server/project-manager.js +301 -0
- package/dist/server/project-manager.js.map +1 -0
- package/dist/server/pty-manager.js +354 -0
- package/dist/server/pty-manager.js.map +1 -0
- package/dist/server/routes/_schemas.js +73 -0
- package/dist/server/routes/_schemas.js.map +1 -0
- package/dist/server/routes/auth.js +164 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/config.js +1163 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/control.js +464 -0
- package/dist/server/routes/control.js.map +1 -0
- package/dist/server/routes/exec.js +217 -0
- package/dist/server/routes/exec.js.map +1 -0
- package/dist/server/routes/files.js +847 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/git.js +837 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/health.js +97 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/mcp.js +300 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/projects.js +259 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/prompt.js +496 -0
- package/dist/server/routes/prompt.js.map +1 -0
- package/dist/server/routes/sessions.js +783 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/stream.js +69 -0
- package/dist/server/routes/stream.js.map +1 -0
- package/dist/server/routes/terminal.js +335 -0
- package/dist/server/routes/terminal.js.map +1 -0
- package/dist/server/session-registry.js +1197 -0
- package/dist/server/session-registry.js.map +1 -0
- package/dist/server/skill-overrides.js +151 -0
- package/dist/server/skill-overrides.js.map +1 -0
- package/dist/server/skills-export.js +257 -0
- package/dist/server/skills-export.js.map +1 -0
- package/dist/server/sse-bridge.js +220 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/dist/server/tool-overrides.js +277 -0
- package/dist/server/tool-overrides.js.map +1 -0
- package/dist/server/turn-diff-builder.js +280 -0
- package/dist/server/turn-diff-builder.js.map +1 -0
- 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": "
|
|
4
|
-
"description": "Browser
|
|
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-
|
|
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
|
-
"
|
|
13
|
-
|
|
14
|
-
"pi-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
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
|
}
|