pim-agent 0.12.0 → 0.13.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/package.json +2 -1
- package/packages/core/src/extensions/bash/MemoryCap.ts +128 -0
- package/packages/core/src/extensions/bash/format.ts +5 -0
- package/packages/core/src/extensions/bash/run.ts +15 -2
- package/packages/core/src/extensions/bash/schema.ts +2 -0
- package/packages/core/src/extensions/system-prompt/index.ts +2 -0
- package/packages/core/src/extensions/system-prompt/prompt.ts +12 -0
- package/packages/core/src/shared/Supervisor.ts +1 -0
- package/packages/web/dist/client/assets/abnfDiagram-O67JEVCF-CZ7V84ot.js +1 -0
- package/packages/web/dist/client/assets/arc-DiHGkUvc.js +1 -0
- package/packages/web/dist/client/assets/architecture-7GRP2DOG-HIzEIkwQ.js +1 -0
- package/packages/web/dist/client/assets/architectureDiagram-NJMV4G6O-XS5DhfJB.js +36 -0
- package/packages/web/dist/client/assets/array-BifhSqXX.js +1 -0
- package/packages/web/dist/client/assets/blockDiagram-BEXU5L5S-BCsgLvy1.js +140 -0
- package/packages/web/dist/client/assets/c4Diagram-YGBWAQC7-Bj9LcWNm.js +38 -0
- package/packages/web/dist/client/assets/channel-BCA6qe9I.js +1 -0
- package/packages/web/dist/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/packages/web/dist/client/assets/chunk-3FUC2YCW-BmDurFxp.js +2 -0
- package/packages/web/dist/client/assets/chunk-5DYCD2WN-DAjG-pqn.js +1 -0
- package/packages/web/dist/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/packages/web/dist/client/assets/chunk-742MDFTN-Bmxs5puY.js +1 -0
- package/packages/web/dist/client/assets/chunk-7INBJB4K-Di7kIxrQ.js +62 -0
- package/packages/web/dist/client/assets/chunk-7M6MHVWA-CSc8sR0b.js +213 -0
- package/packages/web/dist/client/assets/chunk-7PRAP22T-C8kd5QvY.js +1 -0
- package/packages/web/dist/client/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/packages/web/dist/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/packages/web/dist/client/assets/chunk-GTNCS2PH-DG2b2LYE.js +88 -0
- package/packages/web/dist/client/assets/chunk-GWA4HPMP-DdLaLQCu.js +1 -0
- package/packages/web/dist/client/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/packages/web/dist/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/packages/web/dist/client/assets/chunk-MBY4JIJT-C1j0yQlk.js +72 -0
- package/packages/web/dist/client/assets/chunk-NETBCI7D-Bfq9H74p.js +1 -0
- package/packages/web/dist/client/assets/chunk-O7XYJQB3-ZHvBmBO-.js +128 -0
- package/packages/web/dist/client/assets/chunk-UA2S7LBM-ku1JeHSK.js +1 -0
- package/packages/web/dist/client/assets/chunk-WEXAMYUT-BP1iga_7.js +1 -0
- package/packages/web/dist/client/assets/chunk-XXDRQBXY-BBeccPcX.js +1 -0
- package/packages/web/dist/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/packages/web/dist/client/assets/chunk-Z7XXMR3K-SMHZugaR.js +10 -0
- package/packages/web/dist/client/assets/chunk-ZIGJFQKS-CFU_JLG4.js +2 -0
- package/packages/web/dist/client/assets/classDiagram-v2-NBCMYWYE-CYviuQzJ.js +217 -0
- package/packages/web/dist/client/assets/core-DyHsgs5k.js +3 -0
- package/packages/web/dist/client/assets/cose-bilkent-JH36ORCC-9v2ZkJzo.js +1 -0
- package/packages/web/dist/client/assets/cynefin-OW5HDTMX-Bx5xRadi.js +1 -0
- package/packages/web/dist/client/assets/cynefinDiagram-VND7K2PF-BRfGDKqa.js +62 -0
- package/packages/web/dist/client/assets/cytoscape.esm-B-1iW2ft.js +321 -0
- package/packages/web/dist/client/assets/dagre-6A5THRUB-C4l-2L2e.js +4 -0
- package/packages/web/dist/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/packages/web/dist/client/assets/diagram-22UHCM2B-d_hQ3kyi.js +200 -0
- package/packages/web/dist/client/assets/diagram-3UASUU5V-DrEeguPI.js +24 -0
- package/packages/web/dist/client/assets/diagram-ATOU4E4O-BmfQ22pD.js +3 -0
- package/packages/web/dist/client/assets/diagram-CDSNMT55-BjVWjuPF.js +30 -0
- package/packages/web/dist/client/assets/diagram-MLGK6HIB-wDjk-O8i.js +24 -0
- package/packages/web/dist/client/assets/diagram-MPIPVDR6-DqXQFE1s.js +41 -0
- package/packages/web/dist/client/assets/dist-BddGOpie.js +1 -0
- package/packages/web/dist/client/assets/ebnfDiagram-ZINNZB2B-UB8kOITM.js +1 -0
- package/packages/web/dist/client/assets/elk-276RUBZZ-D4miYQnD.js +27 -0
- package/packages/web/dist/client/assets/erDiagram-OPXOYQCR--RXKv7KH.js +99 -0
- package/packages/web/dist/client/assets/eventmodeling-NTZA5JFV-l6SYFw1s.js +1 -0
- package/packages/web/dist/client/assets/flowDiagram-KWPJA3E3-CWW9qnqm.js +1 -0
- package/packages/web/dist/client/assets/ganttDiagram-FUAMR5RP-C0CFpE5x.js +292 -0
- package/packages/web/dist/client/assets/gitGraph-4MIJSDKK-VPL7nv2c.js +1 -0
- package/packages/web/dist/client/assets/gitGraphDiagram-X574FWY7-CgxJA-T8.js +106 -0
- package/packages/web/dist/client/assets/graphlib-DS17s2tU.js +1 -0
- package/packages/web/dist/client/assets/index-D9_XJLSc.css +1 -0
- package/packages/web/dist/client/assets/index-XTlTnQmx.js +47 -0
- package/packages/web/dist/client/assets/info-A6RAGUB7-P0-o68pj.js +1 -0
- package/packages/web/dist/client/assets/infoDiagram-VRGFBTTK-DFJZNRUP.js +2 -0
- package/packages/web/dist/client/assets/init-C-OQMol4.js +1 -0
- package/packages/web/dist/client/assets/ishikawaDiagram-OU5B5YK6-ZkyhNd1T.js +70 -0
- package/packages/web/dist/client/assets/journeyDiagram-ZHPQQLJL-DFevH8my.js +139 -0
- package/packages/web/dist/client/assets/kanban-definition-PNTS6WVX-l7e7ZZDC.js +89 -0
- package/packages/web/dist/client/assets/katex-ZlcWpGUi.js +257 -0
- package/packages/web/dist/client/assets/line-DO_s6Ujd.js +1 -0
- package/packages/web/dist/client/assets/linear-C4xH5PPc.js +1 -0
- package/packages/web/dist/client/assets/mermaid-parser.core-nQaTP3VY.js +7 -0
- package/packages/web/dist/client/assets/mermaid.core-Cz05yTZh.js +44 -0
- package/packages/web/dist/client/assets/mindmap-definition-NLK3R4M7-CHOEuHm2.js +96 -0
- package/packages/web/dist/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/packages/web/dist/client/assets/packet-AYTQ26CC-BH3ehPMo.js +1 -0
- package/packages/web/dist/client/assets/path-fybaL0A-.js +1 -0
- package/packages/web/dist/client/assets/pegDiagram-GJSIUBJH-CkWBLtad.js +1 -0
- package/packages/web/dist/client/assets/pie-WAS4IAKB-nNVEq3dx.js +1 -0
- package/packages/web/dist/client/assets/pieDiagram-5QR66LMP-DimUBAgN.js +39 -0
- package/packages/web/dist/client/assets/quadrantDiagram-O4NWA36T-BR0XpRGQ.js +7 -0
- package/packages/web/dist/client/assets/radar-RG4KPBEZ-paA-H3mb.js +1 -0
- package/packages/web/dist/client/assets/railroad-74A4TZTK-yEiKB3rz.js +1 -0
- package/packages/web/dist/client/assets/railroad-abnf-HS5TGJTU-mVQx9aVM.js +1 -0
- package/packages/web/dist/client/assets/railroad-ebnf-LZEXJU2U-CllXx1OJ.js +1 -0
- package/packages/web/dist/client/assets/railroad-peg-WCYAUIDC-BBD2Q5W_.js +1 -0
- package/packages/web/dist/client/assets/railroadDiagram-XR7U4H2S--TXe6rdU.js +1 -0
- package/packages/web/dist/client/assets/requirementDiagram-PLB6GJNP-DyqH36Za.js +84 -0
- package/packages/web/dist/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/packages/web/dist/client/assets/sankeyDiagram-IPEJSGJF-Bg6e3BlM.js +40 -0
- package/packages/web/dist/client/assets/sequenceDiagram-PO4LG4MO-ClGf85My.js +169 -0
- package/packages/web/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/packages/web/dist/client/assets/src-DF7hQfMh.js +1 -0
- package/packages/web/dist/client/assets/stateDiagram-v2-GCMORJYK-BK8TpxNo.js +291 -0
- package/packages/web/dist/client/assets/swimlanes-2SLR337P-DDnTIT9M.js +1 -0
- package/packages/web/dist/client/assets/swimlanesDiagram-TC7HE7FX-CM8UnP5t.js +8 -0
- package/packages/web/dist/client/assets/timeline-definition-EJHVYXUP-mBBbH3bk.js +120 -0
- package/packages/web/dist/client/assets/treeView-Q6P3EWNA-CTK7tRwR.js +1 -0
- package/packages/web/dist/client/assets/treemap-WGGIJYW6-vOI-Ef_m.js +1 -0
- package/packages/web/dist/client/assets/usecaseDiagram-POWQR4AR-COcii8x-.js +328 -0
- package/packages/web/dist/client/assets/vennDiagram-UO4OBE2U-D6kmDGpM.js +34 -0
- package/packages/web/dist/client/assets/wardley-WFR3VGLG-CtE2KI9r.js +1 -0
- package/packages/web/dist/client/assets/wardleyDiagram-VNRHLVJA-ncxNGWnW.js +78 -0
- package/packages/web/dist/client/assets/xychartDiagram-PMCCYNJV-DUvd2Qze.js +7 -0
- package/packages/web/dist/client/index.html +2 -2
- package/packages/web/dist/client/assets/core-DKI-ZG3V.js +0 -3
- package/packages/web/dist/client/assets/index-BCSESkyh.css +0 -1
- package/packages/web/dist/client/assets/index-BWUZzdeu.js +0 -45
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pim-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "A batteries-included distro of Pi, accessible in your terminal, browser and Telegram.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"@types/bun": "latest",
|
|
67
67
|
"happy-dom": "^20.14.0",
|
|
68
68
|
"highlight.js": "^11.12.0",
|
|
69
|
+
"mermaid": "^12.0.0",
|
|
69
70
|
"oxfmt": "0.67.0",
|
|
70
71
|
"oxlint": "^1.82.0",
|
|
71
72
|
"solid-js": "^2.0.0-rc.7",
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { totalmem } from "node:os";
|
|
3
|
+
|
|
4
|
+
export const MEMORY_LIMIT_VAR = "PIM_BASH_MEMORY_MAX";
|
|
5
|
+
const DEFAULT_SHARE_OF_RAM = 0.25;
|
|
6
|
+
const PROBE_LIMIT = 1024 ** 3;
|
|
7
|
+
const UNITS = { "": 1, K: 1024, M: 1024 ** 2, G: 1024 ** 3, T: 1024 ** 4 };
|
|
8
|
+
|
|
9
|
+
export type MemoryScope = {
|
|
10
|
+
readonly unit: string;
|
|
11
|
+
readonly limitBytes: number;
|
|
12
|
+
readonly argv: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
let supported: Promise<boolean> | null = null;
|
|
16
|
+
let owner: Promise<string | null> | null = null;
|
|
17
|
+
|
|
18
|
+
function limitBytes(): number | null {
|
|
19
|
+
const raw = process.env[MEMORY_LIMIT_VAR]?.trim();
|
|
20
|
+
if (raw === undefined || raw === "") {
|
|
21
|
+
return Math.floor(totalmem() * DEFAULT_SHARE_OF_RAM);
|
|
22
|
+
}
|
|
23
|
+
if (/^(off|infinity|0)$/i.test(raw)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const match = /^(\d+(?:\.\d+)?)\s*([KMGT]?)i?B?$/i.exec(raw);
|
|
27
|
+
if (!match) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`${MEMORY_LIMIT_VAR}=${raw} is not a size: use e.g. 8G or 512M, or off to disable the limit.`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
const unit = (match[2] ?? "").toUpperCase() as keyof typeof UNITS;
|
|
33
|
+
return Math.floor(Number(match[1]) * UNITS[unit]);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Whether a scope's MemoryMax is really enforced: without the memory controller delegated, systemd accepts it and ignores it. */
|
|
37
|
+
async function probe(): Promise<boolean> {
|
|
38
|
+
if (process.platform !== "linux") {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const proc = Bun.spawn({
|
|
43
|
+
cmd: [
|
|
44
|
+
"systemd-run",
|
|
45
|
+
"--user",
|
|
46
|
+
"--scope",
|
|
47
|
+
"--quiet",
|
|
48
|
+
"--expand-environment=no",
|
|
49
|
+
`--property=MemoryMax=${PROBE_LIMIT}`,
|
|
50
|
+
"--",
|
|
51
|
+
"sh",
|
|
52
|
+
"-c",
|
|
53
|
+
'read -r line < /proc/self/cgroup; cat "/sys/fs/cgroup${line#0::}/memory.max"',
|
|
54
|
+
],
|
|
55
|
+
stdout: "pipe",
|
|
56
|
+
stderr: "ignore",
|
|
57
|
+
});
|
|
58
|
+
const [out, code] = await Promise.all([
|
|
59
|
+
new Response(proc.stdout).text(),
|
|
60
|
+
proc.exited,
|
|
61
|
+
]);
|
|
62
|
+
return code === 0 && out.trim() === String(PROBE_LIMIT);
|
|
63
|
+
} catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** The user-manager service this process runs in, so a command's scope stops with it. */
|
|
69
|
+
async function findOwner(): Promise<string | null> {
|
|
70
|
+
try {
|
|
71
|
+
const cgroup = await readFile("/proc/self/cgroup", "utf8");
|
|
72
|
+
const path = cgroup.trim().split("\n").at(-1)?.split("::")[1] ?? "";
|
|
73
|
+
const unit = path.split("/").at(-1) ?? "";
|
|
74
|
+
const underUserManager = path.includes("/user@");
|
|
75
|
+
return underUserManager &&
|
|
76
|
+
unit.endsWith(".service") &&
|
|
77
|
+
!unit.startsWith("user@")
|
|
78
|
+
? unit
|
|
79
|
+
: null;
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The systemd-run prefix that puts one command in its own memory-capped scope, or null when it cannot be capped. */
|
|
86
|
+
async function scope(): Promise<MemoryScope | null> {
|
|
87
|
+
const limit = limitBytes();
|
|
88
|
+
if (limit === null || !(await (supported ??= probe()))) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const bindTo = await (owner ??= findOwner());
|
|
92
|
+
const unit = `pim-bash-${crypto.randomUUID().slice(0, 8)}.scope`;
|
|
93
|
+
return {
|
|
94
|
+
unit,
|
|
95
|
+
limitBytes: limit,
|
|
96
|
+
argv: [
|
|
97
|
+
"systemd-run",
|
|
98
|
+
"--user",
|
|
99
|
+
"--scope",
|
|
100
|
+
"--quiet",
|
|
101
|
+
"--expand-environment=no",
|
|
102
|
+
"--collect",
|
|
103
|
+
`--unit=${unit}`,
|
|
104
|
+
`--property=MemoryMax=${limit}`,
|
|
105
|
+
"--property=MemorySwapMax=0",
|
|
106
|
+
"--property=OOMPolicy=kill",
|
|
107
|
+
...(bindTo
|
|
108
|
+
? [`--property=BindsTo=${bindTo}`, `--property=After=${bindTo}`]
|
|
109
|
+
: []),
|
|
110
|
+
"--",
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function systemctl(args: readonly string[]): Promise<void> {
|
|
116
|
+
await Bun.spawn({
|
|
117
|
+
cmd: ["systemctl", "--user", ...args],
|
|
118
|
+
stdout: "ignore",
|
|
119
|
+
stderr: "ignore",
|
|
120
|
+
}).exited;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Ends whatever of a killed command is still in its scope, including a scope systemd never saw empty. */
|
|
124
|
+
async function stop(unit: string): Promise<void> {
|
|
125
|
+
await systemctl(["--no-block", "stop", unit]);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export const MemoryCap = { limitBytes, scope, stop };
|
|
@@ -37,6 +37,11 @@ export function formatResult(
|
|
|
37
37
|
lines.push("Aborted.");
|
|
38
38
|
} else if (result.timedOut) {
|
|
39
39
|
lines.push(`Timed out after ${timeoutMs} ms.`);
|
|
40
|
+
} else if (result.memoryLimitHit !== null) {
|
|
41
|
+
lines.push(
|
|
42
|
+
`Killed: most likely it exceeded the ${Format.bytes(result.memoryLimitHit)} memory limit for one command. ` +
|
|
43
|
+
"Retrying it unchanged will fail the same way; reduce its memory use (stream or batch the data, run fewer parallel workers)."
|
|
44
|
+
);
|
|
40
45
|
}
|
|
41
46
|
for (const label of STREAMS) {
|
|
42
47
|
const stream = result[label];
|
|
@@ -3,6 +3,7 @@ import { SpillCache } from "../../shared/SpillCache";
|
|
|
3
3
|
import { StreamCapture } from "./capture";
|
|
4
4
|
import { isErrorResult } from "./format";
|
|
5
5
|
import { normaliseStdoutImage } from "./image";
|
|
6
|
+
import { MemoryCap } from "./MemoryCap";
|
|
6
7
|
import {
|
|
7
8
|
type BashCommandResult,
|
|
8
9
|
type CapturedStream,
|
|
@@ -18,7 +19,8 @@ const COMMAND_VAR = "PIM_BASH_COMMAND";
|
|
|
18
19
|
// argv is what `pkill -f`/`pgrep -f` match, so a command naming its own target would
|
|
19
20
|
// signal this shell before its target. The env hands it over out of argv's reach, and
|
|
20
21
|
// the unset keeps it out of every child's environment too.
|
|
21
|
-
|
|
22
|
+
// The raised oom_score_adj makes the command, not the agent or the desktop, the kernel's first victim.
|
|
23
|
+
const RUNNER = `{ echo 500 > /proc/self/oom_score_adj; } 2>/dev/null; __pim_command=$${COMMAND_VAR}; unset ${COMMAND_VAR}; eval "$__pim_command"`;
|
|
22
24
|
|
|
23
25
|
export function killAllActiveBashGroups(sig: NodeJS.Signals = "SIGTERM"): void {
|
|
24
26
|
for (const pid of activePids) {
|
|
@@ -100,10 +102,11 @@ export async function runBashCommand(
|
|
|
100
102
|
const startedAt = Date.now();
|
|
101
103
|
const stdoutCap = new StreamCapture();
|
|
102
104
|
const stderrCap = new StreamCapture();
|
|
105
|
+
const scope = await MemoryCap.scope();
|
|
103
106
|
|
|
104
107
|
// setsid gives the tree its own process group (pgid == proc.pid) so the whole tree can be signalled.
|
|
105
108
|
const proc = Bun.spawn({
|
|
106
|
-
cmd: ["setsid", "bash", "-lc", RUNNER],
|
|
109
|
+
cmd: [...(scope?.argv ?? []), "setsid", "bash", "-lc", RUNNER],
|
|
107
110
|
cwd,
|
|
108
111
|
stdout: "pipe",
|
|
109
112
|
stderr: "pipe",
|
|
@@ -170,6 +173,9 @@ export async function runBashCommand(
|
|
|
170
173
|
} finally {
|
|
171
174
|
clearTimeout(sigkillTimer);
|
|
172
175
|
}
|
|
176
|
+
if (scope) {
|
|
177
|
+
await MemoryCap.stop(scope.unit);
|
|
178
|
+
}
|
|
173
179
|
}
|
|
174
180
|
|
|
175
181
|
exitCode = proc.exitCode ?? null;
|
|
@@ -207,6 +213,12 @@ export async function runBashCommand(
|
|
|
207
213
|
const stdout = stdoutCap.snapshot(sniffed !== null);
|
|
208
214
|
const stderr = stderrCap.snapshot();
|
|
209
215
|
|
|
216
|
+
// Under OOMPolicy=kill a limit hit is a SIGKILL of the whole scope; systemd's own Result for it is racy.
|
|
217
|
+
const memoryLimitHit =
|
|
218
|
+
scope !== null && signalCode === "SIGKILL" && !timedOut && !aborted
|
|
219
|
+
? scope.limitBytes
|
|
220
|
+
: null;
|
|
221
|
+
|
|
210
222
|
const [stdoutPath, stderrPath, stdoutImage] = await Promise.all([
|
|
211
223
|
spillIfTruncated(stdout, stdoutCap, "out"),
|
|
212
224
|
spillIfTruncated(stderr, stderrCap, "err"),
|
|
@@ -222,6 +234,7 @@ export async function runBashCommand(
|
|
|
222
234
|
stdoutImage,
|
|
223
235
|
timedOut,
|
|
224
236
|
aborted,
|
|
237
|
+
memoryLimitHit,
|
|
225
238
|
durationMs: Date.now() - startedAt,
|
|
226
239
|
};
|
|
227
240
|
}
|
|
@@ -43,6 +43,8 @@ export type BashCommandResult = {
|
|
|
43
43
|
readonly stdoutImage: NormalisedImage | null;
|
|
44
44
|
readonly timedOut: boolean;
|
|
45
45
|
readonly aborted: boolean;
|
|
46
|
+
/** The limit in bytes, set when the capped command was SIGKILLed without pim sending it. */
|
|
47
|
+
readonly memoryLimitHit: number | null;
|
|
46
48
|
readonly durationMs: number;
|
|
47
49
|
};
|
|
48
50
|
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
import type { Surface } from "../../shared/Surface";
|
|
6
6
|
import {
|
|
7
7
|
buildEnvironment,
|
|
8
|
+
buildFormatting,
|
|
8
9
|
buildInstructions,
|
|
9
10
|
formatDatetime,
|
|
10
11
|
leadWithSystemPrompt,
|
|
@@ -36,6 +37,7 @@ export default function (surface?: Surface): ExtensionFactory {
|
|
|
36
37
|
model: ctx.model,
|
|
37
38
|
surface,
|
|
38
39
|
});
|
|
40
|
+
options.sections.formatting = buildFormatting(surface);
|
|
39
41
|
});
|
|
40
42
|
pi.on("context_with_system", (event) => {
|
|
41
43
|
const messages = leadWithSystemPrompt(event.messages);
|
|
@@ -13,6 +13,13 @@ type EnvironmentOptions = {
|
|
|
13
13
|
readonly surface?: Surface;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
+
const FORMATTING: Readonly<Record<Surface, string>> = {
|
|
17
|
+
"web browser":
|
|
18
|
+
"Replies render as Markdown, and ```mermaid fences render as diagrams. Prefer a diagram over ASCII art for flows, sequences, state machines and structure.",
|
|
19
|
+
terminal: "",
|
|
20
|
+
Telegram: "",
|
|
21
|
+
};
|
|
22
|
+
|
|
16
23
|
type RunCommand = (cmd: ReadonlyArray<string>) => string | undefined;
|
|
17
24
|
|
|
18
25
|
type OsDescriptionOptions = {
|
|
@@ -71,6 +78,11 @@ export function buildEnvironment(opts: EnvironmentOptions): string {
|
|
|
71
78
|
].join("\n");
|
|
72
79
|
}
|
|
73
80
|
|
|
81
|
+
/** What the surface renders beyond plain text; empty, so pi omits the section, where that is nothing. */
|
|
82
|
+
export function buildFormatting(surface: Surface | undefined): string {
|
|
83
|
+
return surface === undefined ? "" : FORMATTING[surface];
|
|
84
|
+
}
|
|
85
|
+
|
|
74
86
|
export function describeOs(options: OsDescriptionOptions = {}): string {
|
|
75
87
|
if (options.platform === undefined && options.runCommand === undefined) {
|
|
76
88
|
cachedOs ??= computeOs(options);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e,t}from"./mermaid-parser.core-nQaTP3VY.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-DF7hQfMh.js";import"./chunk-O7XYJQB3-ZHvBmBO-.js";import{n as i,r as a,t as o}from"./chunk-GTNCS2PH-DG2b2LYE.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-Cz05yTZh.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-BddGOpie.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-FOHPRMQF-CoA4358r.js";import{M as e}from"./mermaid-parser.core-nQaTP3VY.js";export{e as createArchitectureServices};
|