@prestyj/cli 5.8.0 → 5.9.0
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/assets/skills/evidence-led-ui/LICENSES.md +12 -0
- package/assets/skills/evidence-led-ui/SKILL.md +14 -6
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
- package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
- package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
- package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
- package/dist/app-sidecar-sessions.d.ts +8 -0
- package/dist/app-sidecar-sessions.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.js +31 -0
- package/dist/app-sidecar-sessions.js.map +1 -0
- package/dist/app-sidecar-sessions.test.d.ts +2 -0
- package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.test.js +83 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -0
- package/dist/app-sidecar.js +250 -107
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +43 -26
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-compaction.test.js +19 -0
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +4 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -12
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +1 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +4 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +20 -11
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +16 -3
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/event-bus.d.ts +5 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +6 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-controller.test.js +3 -3
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/input-normalization.test.d.ts +2 -0
- package/dist/core/input-normalization.test.d.ts.map +1 -0
- package/dist/core/input-normalization.test.js +75 -0
- package/dist/core/input-normalization.test.js.map +1 -0
- package/dist/core/loop-breaker.d.ts +38 -1
- package/dist/core/loop-breaker.d.ts.map +1 -1
- package/dist/core/loop-breaker.js +84 -2
- package/dist/core/loop-breaker.js.map +1 -1
- package/dist/core/loop-breaker.test.js +108 -1
- package/dist/core/loop-breaker.test.js.map +1 -1
- package/dist/core/message-images.d.ts +12 -0
- package/dist/core/message-images.d.ts.map +1 -0
- package/dist/core/message-images.js +52 -0
- package/dist/core/message-images.js.map +1 -0
- package/dist/core/message-images.test.d.ts +2 -0
- package/dist/core/message-images.test.d.ts.map +1 -0
- package/dist/core/message-images.test.js +62 -0
- package/dist/core/message-images.test.js.map +1 -0
- package/dist/core/project-discovery.d.ts +1 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +105 -53
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +29 -0
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +27 -7
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +257 -124
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +57 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +568 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/session-storage.test.d.ts +2 -0
- package/dist/core/session-storage.test.d.ts.map +1 -0
- package/dist/core/session-storage.test.js +269 -0
- package/dist/core/session-storage.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +7 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/sidecar-error-reporter.d.ts +12 -0
- package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.js +57 -0
- package/dist/core/sidecar-error-reporter.js.map +1 -0
- package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
- package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.test.js +61 -0
- package/dist/core/sidecar-error-reporter.test.js.map +1 -0
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +7 -0
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +26 -2
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +34 -0
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/verify-commands.d.ts.map +1 -1
- package/dist/core/verify-commands.js +1 -6
- package/dist/core/verify-commands.js.map +1 -1
- package/dist/core/verify-commands.test.js +1 -5
- package/dist/core/verify-commands.test.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +38 -0
- package/dist/core/workspace-guard.d.ts.map +1 -0
- package/dist/core/workspace-guard.js +112 -0
- package/dist/core/workspace-guard.js.map +1 -0
- package/dist/core/workspace-guard.test.d.ts +2 -0
- package/dist/core/workspace-guard.test.d.ts.map +1 -0
- package/dist/core/workspace-guard.test.js +86 -0
- package/dist/core/workspace-guard.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +9 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +11 -0
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -101
- package/dist/session.js.map +1 -1
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +35 -0
- package/dist/session.test.js.map +1 -0
- package/dist/system-prompt.d.ts +12 -0
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +86 -19
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +132 -8
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/bash.d.ts +3 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +37 -6
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +34 -1
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/edit.d.ts +2 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +7 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +7 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/exit-plan.d.ts.map +1 -1
- package/dist/tools/exit-plan.js +15 -4
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/exit-plan.test.d.ts +2 -0
- package/dist/tools/exit-plan.test.d.ts.map +1 -0
- package/dist/tools/exit-plan.test.js +72 -0
- package/dist/tools/exit-plan.test.js.map +1 -0
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +8 -3
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +6 -0
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +4 -2
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/source-path.d.ts.map +1 -1
- package/dist/tools/source-path.js +9 -0
- package/dist/tools/source-path.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +1 -1
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent-shared.test.js +21 -1
- package/dist/tools/subagent-shared.test.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +13 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write.d.ts +2 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +7 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +12 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +17 -5
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +10 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +10 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/Footer.test.js +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +5 -2
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +49 -8
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +2 -30
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/utils/http-body.d.ts +19 -0
- package/dist/utils/http-body.d.ts.map +1 -0
- package/dist/utils/http-body.js +58 -0
- package/dist/utils/http-body.js.map +1 -0
- package/dist/utils/http-body.test.d.ts +2 -0
- package/dist/utils/http-body.test.d.ts.map +1 -0
- package/dist/utils/http-body.test.js +68 -0
- package/dist/utils/http-body.test.js.map +1 -0
- package/dist/utils/text.d.ts +9 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +11 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +5 -5
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
-
import { DISPLAY_ITEM_CUSTOM_KIND } from "../../core/session-manager.js";
|
|
3
2
|
import { compactHistory } from "../item-helpers.js";
|
|
4
3
|
import { trimFlushedItems } from "../live-item-flush.js";
|
|
5
|
-
export function useTranscriptHistory({ terminalHistoryPrinter, terminalHistoryContext, writeStdout, enqueueStdout,
|
|
4
|
+
export function useTranscriptHistory({ terminalHistoryPrinter, terminalHistoryContext, writeStdout, enqueueStdout, sessionStore, history, setHistory, setLiveItems, compactHistoryItems = (items) => compactHistory(items), trimFlushItems = (items) => trimFlushedItems(items), }) {
|
|
6
5
|
const terminalHistoryContextRef = useRef(terminalHistoryContext);
|
|
7
6
|
const pendingHistoryFlushRef = useRef([]);
|
|
8
7
|
const drainedHistoryFlushRef = useRef([]);
|
|
9
|
-
const persistedDisplayItemIdsRef = useRef(new Set());
|
|
10
8
|
const streamedAssistantFlushRef = useRef({
|
|
11
9
|
flushedChars: 0,
|
|
12
10
|
text: "",
|
|
@@ -35,23 +33,6 @@ export function useTranscriptHistory({ terminalHistoryPrinter, terminalHistoryCo
|
|
|
35
33
|
// produced by the batched setLiveItems/generation updates below, which is
|
|
36
34
|
// also the write that shrinks the live frame. One write = no footer jump.
|
|
37
35
|
printHistoryItems(flushed, { reason: "flush" });
|
|
38
|
-
const sessionPath = sessionPathRef.current;
|
|
39
|
-
const sessionManager = sessionManagerRef.current;
|
|
40
|
-
if (sessionPath && sessionManager) {
|
|
41
|
-
for (const item of flushed) {
|
|
42
|
-
if (persistedDisplayItemIdsRef.current.has(item.id))
|
|
43
|
-
continue;
|
|
44
|
-
persistedDisplayItemIdsRef.current.add(item.id);
|
|
45
|
-
void sessionManager.appendEntry(sessionPath, {
|
|
46
|
-
type: "custom",
|
|
47
|
-
kind: DISPLAY_ITEM_CUSTOM_KIND,
|
|
48
|
-
data: { version: 1, item: persistDisplayItem ? persistDisplayItem(item) : item },
|
|
49
|
-
id: `display-${item.id}`,
|
|
50
|
-
parentId: null,
|
|
51
|
-
timestamp: new Date().toISOString(),
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
36
|
if (sessionStore) {
|
|
56
37
|
const queuedIds = new Set(items.map((item) => item.id));
|
|
57
38
|
sessionStore.liveItems = (sessionStore.liveItems ?? []).filter((item) => !queuedIds.has(item.id));
|
|
@@ -80,16 +61,7 @@ export function useTranscriptHistory({ terminalHistoryPrinter, terminalHistoryCo
|
|
|
80
61
|
const flushedIds = new Set(flushed.map((item) => item.id));
|
|
81
62
|
setLiveItems((prev) => prev.filter((item) => !flushedIds.has(item.id)));
|
|
82
63
|
setHistoryFlushGeneration((generation) => generation + 1);
|
|
83
|
-
}, [
|
|
84
|
-
compactHistoryItems,
|
|
85
|
-
persistDisplayItem,
|
|
86
|
-
printHistoryItems,
|
|
87
|
-
sessionManagerRef,
|
|
88
|
-
sessionPathRef,
|
|
89
|
-
sessionStore,
|
|
90
|
-
setLiveItems,
|
|
91
|
-
trimFlushItems,
|
|
92
|
-
]);
|
|
64
|
+
}, [compactHistoryItems, printHistoryItems, sessionStore, setLiveItems, trimFlushItems]);
|
|
93
65
|
useEffect(() => {
|
|
94
66
|
printHistoryItems(history, { reason: "history-effect" });
|
|
95
67
|
}, [history, printHistoryItems]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTranscriptHistory.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTranscriptHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useTranscriptHistory.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTranscriptHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type http from "node:http";
|
|
2
|
+
/**
|
|
3
|
+
* Hard cap on inbound HTTP request bodies for the app sidecar (baseline #8).
|
|
4
|
+
* The sidecar is localhost-only, but an unbounded body balloons RSS ~5.5x its
|
|
5
|
+
* size (a 100 MB POST measured at ~550 MB RSS). 10 MB is far above any
|
|
6
|
+
* legitimate prompt / settings / session payload.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MAX_HTTP_BODY_BYTES: number;
|
|
9
|
+
/**
|
|
10
|
+
* Read a request body into a string, aborting if it exceeds `maxBytes`.
|
|
11
|
+
*
|
|
12
|
+
* On overflow the socket is destroyed, a single `413` JSON response is sent
|
|
13
|
+
* (unless headers were already flushed), and the promise resolves `null` so the
|
|
14
|
+
* caller can short-circuit without double-responding. Socket errors also resolve
|
|
15
|
+
* `null` — call sites use `.then()` without `.catch()`, so rejecting would
|
|
16
|
+
* surface as an unhandled rejection.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readCappedBody(req: http.IncomingMessage, res: http.ServerResponse, maxBytes?: number): Promise<string | null>;
|
|
19
|
+
//# sourceMappingURL=http-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-body.d.ts","sourceRoot":"","sources":["../../src/utils/http-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,GAAE,MAA4B,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoCxB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hard cap on inbound HTTP request bodies for the app sidecar (baseline #8).
|
|
3
|
+
* The sidecar is localhost-only, but an unbounded body balloons RSS ~5.5x its
|
|
4
|
+
* size (a 100 MB POST measured at ~550 MB RSS). 10 MB is far above any
|
|
5
|
+
* legitimate prompt / settings / session payload.
|
|
6
|
+
*/
|
|
7
|
+
export const MAX_HTTP_BODY_BYTES = 10 * 1024 * 1024;
|
|
8
|
+
/**
|
|
9
|
+
* Read a request body into a string, aborting if it exceeds `maxBytes`.
|
|
10
|
+
*
|
|
11
|
+
* On overflow the socket is destroyed, a single `413` JSON response is sent
|
|
12
|
+
* (unless headers were already flushed), and the promise resolves `null` so the
|
|
13
|
+
* caller can short-circuit without double-responding. Socket errors also resolve
|
|
14
|
+
* `null` — call sites use `.then()` without `.catch()`, so rejecting would
|
|
15
|
+
* surface as an unhandled rejection.
|
|
16
|
+
*/
|
|
17
|
+
export function readCappedBody(req, res, maxBytes = MAX_HTTP_BODY_BYTES) {
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
const chunks = [];
|
|
20
|
+
let total = 0;
|
|
21
|
+
let aborted = false;
|
|
22
|
+
req.on("data", (c) => {
|
|
23
|
+
if (aborted)
|
|
24
|
+
return;
|
|
25
|
+
const buf = c;
|
|
26
|
+
total += buf.length;
|
|
27
|
+
if (total > maxBytes) {
|
|
28
|
+
aborted = true;
|
|
29
|
+
chunks.length = 0; // drop what we buffered so it can be GC'd
|
|
30
|
+
try {
|
|
31
|
+
if (!res.headersSent) {
|
|
32
|
+
res.writeHead(413, {
|
|
33
|
+
"content-type": "application/json",
|
|
34
|
+
"access-control-allow-origin": "*",
|
|
35
|
+
});
|
|
36
|
+
res.end(JSON.stringify({ error: "request body too large" }));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* response already gone */
|
|
41
|
+
}
|
|
42
|
+
req.destroy();
|
|
43
|
+
resolve(null);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
chunks.push(buf);
|
|
47
|
+
});
|
|
48
|
+
req.on("end", () => {
|
|
49
|
+
if (!aborted)
|
|
50
|
+
resolve(Buffer.concat(chunks).toString("utf-8"));
|
|
51
|
+
});
|
|
52
|
+
req.on("error", () => {
|
|
53
|
+
if (!aborted)
|
|
54
|
+
resolve(null);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=http-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-body.js","sourceRoot":"","sources":["../../src/utils/http-body.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAyB,EACzB,GAAwB,EACxB,WAAmB,mBAAmB;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACnB,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,GAAG,GAAG,CAAW,CAAC;YACxB,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC;YACpB,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACrB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,0CAA0C;gBAC7D,IAAI,CAAC;oBACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;wBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;4BACjB,cAAc,EAAE,kBAAkB;4BAClC,6BAA6B,EAAE,GAAG;yBACnC,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;gBACD,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-body.test.d.ts","sourceRoot":"","sources":["../../src/utils/http-body.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import { MAX_HTTP_BODY_BYTES, readCappedBody } from "./http-body.js";
|
|
4
|
+
// Spin up a real HTTP server whose handler pipes the request through
|
|
5
|
+
// readCappedBody, then POST bodies of various sizes and assert the cap.
|
|
6
|
+
function startServer(maxBytes) {
|
|
7
|
+
const results = [];
|
|
8
|
+
const server = http.createServer((req, res) => {
|
|
9
|
+
void readCappedBody(req, res, maxBytes).then((body) => {
|
|
10
|
+
results.push(body);
|
|
11
|
+
if (body === null)
|
|
12
|
+
return; // 413 already sent by readCappedBody
|
|
13
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
14
|
+
res.end(JSON.stringify({ bytes: body.length }));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
server.listen(0, "127.0.0.1", () => {
|
|
19
|
+
const { port } = server.address();
|
|
20
|
+
resolve({
|
|
21
|
+
url: `http://127.0.0.1:${port}`,
|
|
22
|
+
results,
|
|
23
|
+
close: () => new Promise((r) => server.close(() => r())),
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
describe("readCappedBody", () => {
|
|
29
|
+
let close = null;
|
|
30
|
+
afterEach(async () => {
|
|
31
|
+
await close?.();
|
|
32
|
+
close = null;
|
|
33
|
+
});
|
|
34
|
+
it("reads a normal body in full and resolves the string", async () => {
|
|
35
|
+
const srv = await startServer();
|
|
36
|
+
close = srv.close;
|
|
37
|
+
const resp = await fetch(`${srv.url}/x`, { method: "POST", body: "hello world" });
|
|
38
|
+
const json = (await resp.json());
|
|
39
|
+
expect(resp.status).toBe(200);
|
|
40
|
+
expect(json.bytes).toBe("hello world".length);
|
|
41
|
+
expect(srv.results.at(-1)).toBe("hello world");
|
|
42
|
+
});
|
|
43
|
+
it("rejects an over-cap body with 413 and resolves null", async () => {
|
|
44
|
+
const cap = 1024; // 1 KB cap for the test
|
|
45
|
+
const srv = await startServer(cap);
|
|
46
|
+
close = srv.close;
|
|
47
|
+
const big = "x".repeat(cap * 4); // 4 KB > cap
|
|
48
|
+
const resp = await fetch(`${srv.url}/x`, { method: "POST", body: big });
|
|
49
|
+
expect(resp.status).toBe(413);
|
|
50
|
+
const json = (await resp.json());
|
|
51
|
+
expect(json.error).toMatch(/too large/i);
|
|
52
|
+
// The handler observed null and never ran its success branch.
|
|
53
|
+
expect(srv.results.at(-1)).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it("accepts a body exactly at the cap", async () => {
|
|
56
|
+
const cap = 2048;
|
|
57
|
+
const srv = await startServer(cap);
|
|
58
|
+
close = srv.close;
|
|
59
|
+
const body = "y".repeat(cap);
|
|
60
|
+
const resp = await fetch(`${srv.url}/x`, { method: "POST", body });
|
|
61
|
+
expect(resp.status).toBe(200);
|
|
62
|
+
expect(srv.results.at(-1)).toBe(body);
|
|
63
|
+
});
|
|
64
|
+
it("exposes a 10 MB default cap", () => {
|
|
65
|
+
expect(MAX_HTTP_BODY_BYTES).toBe(10 * 1024 * 1024);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=http-body.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-body.test.js","sourceRoot":"","sources":["../../src/utils/http-body.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip a single leading UTF-8 byte-order mark (U+FEFF).
|
|
3
|
+
*
|
|
4
|
+
* Windows editors (Notepad, some VS Code configs) prepend a BOM; a BOM before
|
|
5
|
+
* `---` silently breaks frontmatter parsing in skills/agents/commands, and it
|
|
6
|
+
* pollutes instruction-file rendering. Applied at every instruction-file read.
|
|
7
|
+
*/
|
|
8
|
+
export declare function stripBom(text: string): string;
|
|
9
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip a single leading UTF-8 byte-order mark (U+FEFF).
|
|
3
|
+
*
|
|
4
|
+
* Windows editors (Notepad, some VS Code configs) prepend a BOM; a BOM before
|
|
5
|
+
* `---` silently breaks frontmatter parsing in skills/agents/commands, and it
|
|
6
|
+
* pollutes instruction-file rendering. Applied at every instruction-file read.
|
|
7
|
+
*/
|
|
8
|
+
export function stripBom(text) {
|
|
9
|
+
return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prestyj/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
|
|
6
6
|
"license": "MIT",
|
|
@@ -114,10 +114,10 @@
|
|
|
114
114
|
"typescript-language-server": "^5.3.0",
|
|
115
115
|
"wrap-ansi": "^10.0.0",
|
|
116
116
|
"zod": "^4.4.3",
|
|
117
|
-
"@prestyj/
|
|
118
|
-
"@prestyj/
|
|
119
|
-
"@prestyj/
|
|
120
|
-
"@prestyj/
|
|
117
|
+
"@prestyj/ai": "5.9.0",
|
|
118
|
+
"@prestyj/core": "5.9.0",
|
|
119
|
+
"@prestyj/agent": "5.9.0",
|
|
120
|
+
"@prestyj/pixel": "4.3.101"
|
|
121
121
|
},
|
|
122
122
|
"optionalDependencies": {
|
|
123
123
|
"@huggingface/transformers": "^3.6.0",
|