@pasko70/pibo 1.9.2 → 1.9.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.
- package/README.md +183 -183
- package/context/codex-base-prompt.md +148 -148
- package/context/compute-worker.md +23 -23
- package/context/pibo-compaction-prompt.md +100 -100
- package/context/pibo-native-tooling.md +18 -18
- package/context/pibo-system-prompt.md +77 -77
- package/dist/apps/chat/agent-store.js +248 -248
- package/dist/apps/chat/data/project-service.js +168 -168
- package/dist/apps/chat/data/read-state-service.js +18 -18
- package/dist/apps/chat/data/session-query-service.js +25 -25
- package/dist/apps/chat/data/timeline-query-service.js +14 -14
- package/dist/apps/chat/static-assets.js +854 -854
- package/dist/apps/chat/workflow-persistence.js +255 -255
- package/dist/apps/chat-ui/assets/{dist-5GM30SQK.js → dist-5WHjqNrY.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Cge8JklW.js → dist-BJBNSAIH.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-C-5u2QIS.js → dist-C3liNPZJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BWbWIOcD.js → dist-CW6FHEaw.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CjYtD7ZT.js → dist-CaNlj6v6.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BYKMZlI0.js → dist-Cne74s6i.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-9lsp1UpA.js → dist-DvKZv20v.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DFhhiR8M.js → dist-FYH7vzrh.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Etxmpyxg.js → dist-f5KioIwL.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-2KdPXbMT.js → dist-hWrpj7SE.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Idz5kzy8.js → dist-jAuO8_bV.js} +1 -1
- package/dist/apps/chat-ui/assets/{index-BqD_bm7z.js → index-Bf29pJph.js} +29 -29
- package/dist/apps/chat-ui/index.html +17 -17
- package/dist/apps/chat-ui/manifest.webmanifest +25 -25
- package/dist/apps/chat-ui/sw.js +47 -47
- package/dist/apps/chat-vscode-web/assets/index-BAMxIaI_.js +41 -0
- package/dist/apps/chat-vscode-web/index.html +13 -13
- package/dist/apps/cli-ui/cliSessionsCommand.js +23 -23
- package/dist/apps/context-files-ui/index.html +11 -11
- package/dist/cli.js +39 -39
- package/dist/compute/cli.js +54 -54
- package/dist/core/session-router.js +5 -2
- package/dist/cron/cli.js +15 -15
- package/dist/cron/store.js +49 -49
- package/dist/data/cli.js +23 -23
- package/dist/data/event-log.js +23 -23
- package/dist/data/message-store.js +20 -20
- package/dist/data/navigation-store.js +9 -9
- package/dist/data/observation-store.js +4 -4
- package/dist/data/payload-store.js +17 -17
- package/dist/data/schema.js +431 -431
- package/dist/data/session-store.js +4 -4
- package/dist/data/telemetry-queries.js +54 -54
- package/dist/data/telemetry.js +197 -197
- package/dist/debug/events.js +12 -12
- package/dist/debug/failures.js +6 -6
- package/dist/debug/index.js +227 -227
- package/dist/debug/messages.js +6 -6
- package/dist/debug/pty.js +124 -124
- package/dist/debug/session.js +29 -29
- package/dist/debug/tools.js +5 -5
- package/dist/debug/web-snapshot-browser-scripts.js +294 -294
- package/dist/debug/web-streaming-browser-library.js +925 -925
- package/dist/debug/web-streaming-browser-scripts.js +232 -232
- package/dist/debug/web-streaming-provider-telemetry.js +4 -4
- package/dist/debug/web.js +93 -93
- package/dist/gateway/cli.js +19 -19
- package/dist/mcp/config-command.js +53 -53
- package/dist/mcp/index.js +21 -21
- package/dist/mcp/registry.js +11 -11
- package/dist/pi-packages/cli.js +11 -11
- package/dist/plugins/context-files-store.js +110 -110
- package/dist/plugins/context-files.js +4 -4
- package/dist/ralph/cli.js +18 -18
- package/dist/ralph/templates.js +140 -140
- package/dist/reliability/store.js +226 -226
- package/dist/session-ui/sessionActivity.js +30 -0
- package/dist/sessions/pibo-data-store.js +16 -16
- package/dist/sessions/sqlite-store.js +53 -53
- package/dist/setup/cli.js +58 -58
- package/dist/signals/projector.js +26 -11
- package/dist/signals/registry.js +41 -0
- package/dist/tools/agent-browser-wrapper.js +80 -80
- package/dist/tools/browser-use-cdp.js +12 -12
- package/dist/tools/browser-use-wrapper.js +762 -762
- package/dist/tools/guides.js +538 -538
- package/dist/tools/index.js +99 -99
- package/dist/tools/runtime/node-worker-source.js +205 -205
- package/dist/tools/runtime/python-worker-source.js +177 -177
- package/dist/vscode/cli.js +9 -9
- package/dist/web-annotations/cdp.js +900 -900
- package/dist/web-annotations/store.js +96 -96
- package/docs/README.md +23 -23
- package/docs/ops/install-developer-host.md +112 -112
- package/docs/ops/install-user-host.md +96 -96
- package/docs/ops/upgrade-user-to-developer-host.md +69 -69
- package/docs/ops/vscode-extension-release.md +160 -160
- package/package.json +95 -95
- package/skills/builtin/graphify/SKILL.md +52 -52
- package/skills/builtin/pi-agent-harness/SKILL.md +319 -319
- package/skills/builtin/pi-agent-harness/agents/openai.yaml +4 -4
- package/skills/builtin/pibo-docker-system/SKILL.md +170 -170
- package/skills/builtin/pibo-spec-writing/SKILL.md +330 -330
- package/skills/builtin/prd/SKILL.md +143 -143
- package/skills/builtin/ralph-loop/SKILL.md +359 -359
- package/skills/builtin/ralph-prd-json/SKILL.md +123 -123
- package/skills/builtin/skill-creator/LICENSE.txt +201 -201
- package/skills/builtin/skill-creator/SKILL.md +513 -513
- package/skills/builtin/skill-creator/agents/analyzer.md +274 -274
- package/skills/builtin/skill-creator/agents/comparator.md +202 -202
- package/skills/builtin/skill-creator/agents/grader.md +223 -223
- package/skills/builtin/skill-creator/assets/eval_review.html +146 -146
- package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -471
- package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -1325
- package/skills/builtin/skill-creator/references/schemas.md +430 -430
- package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -401
- package/skills/builtin/skill-creator/scripts/generate_report.py +326 -326
- package/skills/builtin/skill-creator/scripts/improve_description.py +247 -247
- package/skills/builtin/skill-creator/scripts/package_skill.py +136 -136
- package/skills/builtin/skill-creator/scripts/quick_validate.py +102 -102
- package/skills/builtin/skill-creator/scripts/run_eval.py +310 -310
- package/skills/builtin/skill-creator/scripts/run_loop.py +328 -328
- package/skills/builtin/skill-creator/scripts/utils.py +47 -47
- package/skills/builtin/web-annotations/SKILL.md +93 -93
- package/src/mcp/LICENSE.mcp-cli +21 -21
- package/dist/apps/chat-vscode-web/assets/index-Cst9OUkC.js +0 -41
- package/dist/session-ui/activeTurn.js +0 -126
package/dist/tools/index.js
CHANGED
|
@@ -202,31 +202,31 @@ function parseNonNegativeInteger(value) {
|
|
|
202
202
|
return parsed;
|
|
203
203
|
}
|
|
204
204
|
function printBrowserUseDiscovery() {
|
|
205
|
-
console.log(`pibo tools browser-use - browser-use helpers
|
|
206
|
-
|
|
207
|
-
Start:
|
|
208
|
-
eval "$(pibo tools env browser-use)"
|
|
209
|
-
|
|
210
|
-
Commands:
|
|
211
|
-
targets List Chrome CDP targets with Chat auth hints
|
|
212
|
-
attach-chat Export the best existing authenticated Chat target
|
|
213
|
-
auth-template path Print the default authenticated template profile path
|
|
214
|
-
auth-template env Print shell exports for preparing the auth template profile
|
|
215
|
-
lease acquire Acquire an isolated authenticated browser slot
|
|
216
|
-
lease list List authenticated browser slots
|
|
217
|
-
lease release <id> Release one browser slot
|
|
218
|
-
lease reap-stale Release expired or dead browser slots
|
|
219
|
-
pool status Show read-only managed browser-pool status
|
|
220
|
-
pool reap Reap an idle managed browser pool
|
|
221
|
-
health Check browser-use health and report issues
|
|
222
|
-
|
|
223
|
-
Next:
|
|
224
|
-
pibo tools show browser-use
|
|
225
|
-
pibo tools guide browser-use browser-use
|
|
226
|
-
pibo tools browser-use targets
|
|
227
|
-
pibo tools browser-use auth-template env
|
|
228
|
-
pibo tools browser-use lease acquire
|
|
229
|
-
pibo tools browser-use pool status
|
|
205
|
+
console.log(`pibo tools browser-use - browser-use helpers
|
|
206
|
+
|
|
207
|
+
Start:
|
|
208
|
+
eval "$(pibo tools env browser-use)"
|
|
209
|
+
|
|
210
|
+
Commands:
|
|
211
|
+
targets List Chrome CDP targets with Chat auth hints
|
|
212
|
+
attach-chat Export the best existing authenticated Chat target
|
|
213
|
+
auth-template path Print the default authenticated template profile path
|
|
214
|
+
auth-template env Print shell exports for preparing the auth template profile
|
|
215
|
+
lease acquire Acquire an isolated authenticated browser slot
|
|
216
|
+
lease list List authenticated browser slots
|
|
217
|
+
lease release <id> Release one browser slot
|
|
218
|
+
lease reap-stale Release expired or dead browser slots
|
|
219
|
+
pool status Show read-only managed browser-pool status
|
|
220
|
+
pool reap Reap an idle managed browser pool
|
|
221
|
+
health Check browser-use health and report issues
|
|
222
|
+
|
|
223
|
+
Next:
|
|
224
|
+
pibo tools show browser-use
|
|
225
|
+
pibo tools guide browser-use browser-use
|
|
226
|
+
pibo tools browser-use targets
|
|
227
|
+
pibo tools browser-use auth-template env
|
|
228
|
+
pibo tools browser-use lease acquire
|
|
229
|
+
pibo tools browser-use pool status
|
|
230
230
|
pibo tools browser-use pool reap --json`);
|
|
231
231
|
}
|
|
232
232
|
function getBrowserPoolStatusIdentity(options) {
|
|
@@ -577,62 +577,62 @@ async function printBrowserUseHealth(status, json = false) {
|
|
|
577
577
|
}
|
|
578
578
|
}
|
|
579
579
|
function printAgentBrowserDiscovery() {
|
|
580
|
-
console.log(`pibo tools agent-browser - Agent Browser helpers
|
|
581
|
-
|
|
582
|
-
Start:
|
|
583
|
-
eval "$(pibo tools env agent-browser)"
|
|
584
|
-
|
|
585
|
-
Commands:
|
|
586
|
-
health Check Agent Browser health and report issues
|
|
587
|
-
sessions List upstream Agent Browser sessions
|
|
588
|
-
targets List Chrome CDP targets with Chat auth hints
|
|
589
|
-
attach-chat Export the best existing authenticated Chat target
|
|
590
|
-
auth-template path Print the default authenticated template profile path
|
|
591
|
-
auth-template env Print shell exports for preparing the auth template profile
|
|
592
|
-
lease acquire Acquire an isolated authenticated browser slot
|
|
593
|
-
lease list List authenticated browser slots
|
|
594
|
-
lease release <id> Release one browser slot
|
|
595
|
-
lease reap-stale Release expired browser slots
|
|
596
|
-
|
|
597
|
-
Next:
|
|
598
|
-
pibo tools show agent-browser
|
|
599
|
-
pibo tools guide agent-browser agent-browser
|
|
600
|
-
pibo tools agent-browser health
|
|
580
|
+
console.log(`pibo tools agent-browser - Agent Browser helpers
|
|
581
|
+
|
|
582
|
+
Start:
|
|
583
|
+
eval "$(pibo tools env agent-browser)"
|
|
584
|
+
|
|
585
|
+
Commands:
|
|
586
|
+
health Check Agent Browser health and report issues
|
|
587
|
+
sessions List upstream Agent Browser sessions
|
|
588
|
+
targets List Chrome CDP targets with Chat auth hints
|
|
589
|
+
attach-chat Export the best existing authenticated Chat target
|
|
590
|
+
auth-template path Print the default authenticated template profile path
|
|
591
|
+
auth-template env Print shell exports for preparing the auth template profile
|
|
592
|
+
lease acquire Acquire an isolated authenticated browser slot
|
|
593
|
+
lease list List authenticated browser slots
|
|
594
|
+
lease release <id> Release one browser slot
|
|
595
|
+
lease reap-stale Release expired browser slots
|
|
596
|
+
|
|
597
|
+
Next:
|
|
598
|
+
pibo tools show agent-browser
|
|
599
|
+
pibo tools guide agent-browser agent-browser
|
|
600
|
+
pibo tools agent-browser health
|
|
601
601
|
pibo tools agent-browser lease acquire`);
|
|
602
602
|
}
|
|
603
603
|
function printRalphDiscovery() {
|
|
604
|
-
console.log(`pibo tools ralph - Ralph job helpers
|
|
605
|
-
|
|
606
|
-
Commands:
|
|
607
|
-
pibo ralph templates --json
|
|
608
|
-
pibo ralph add --template <id> --room <room-id> --start --json
|
|
609
|
-
pibo ralph list --all --json
|
|
610
|
-
pibo ralph runs --job <job-id> --json
|
|
611
|
-
pibo ralph stop <job-id>
|
|
612
|
-
pibo ralph cancel <job-id>
|
|
613
|
-
|
|
614
|
-
Next:
|
|
615
|
-
pibo tools guide ralph ralph
|
|
604
|
+
console.log(`pibo tools ralph - Ralph job helpers
|
|
605
|
+
|
|
606
|
+
Commands:
|
|
607
|
+
pibo ralph templates --json
|
|
608
|
+
pibo ralph add --template <id> --room <room-id> --start --json
|
|
609
|
+
pibo ralph list --all --json
|
|
610
|
+
pibo ralph runs --job <job-id> --json
|
|
611
|
+
pibo ralph stop <job-id>
|
|
612
|
+
pibo ralph cancel <job-id>
|
|
613
|
+
|
|
614
|
+
Next:
|
|
615
|
+
pibo tools guide ralph ralph
|
|
616
616
|
pibo ralph templates`);
|
|
617
617
|
}
|
|
618
618
|
function printToolsDiscovery() {
|
|
619
|
-
console.log(`pibo tools - curated CLI tools
|
|
620
|
-
|
|
621
|
-
Commands:
|
|
622
|
-
list List curated tools
|
|
623
|
-
installed List installed tools
|
|
624
|
-
show <name> Show one tool
|
|
625
|
-
install <name> Install one tool
|
|
626
|
-
doctor <name> Check one tool
|
|
627
|
-
guides <name> List tool guides
|
|
628
|
-
guide <name> [guide] Print one guide
|
|
629
|
-
path <name> Print executable path
|
|
630
|
-
env <name> Print shell exports
|
|
631
|
-
browser-use Browser-use auth slots and helper commands
|
|
632
|
-
agent-browser Agent Browser sessions, targets, and auth slots
|
|
633
|
-
ralph Ralph job helper commands
|
|
634
|
-
|
|
635
|
-
Next:
|
|
619
|
+
console.log(`pibo tools - curated CLI tools
|
|
620
|
+
|
|
621
|
+
Commands:
|
|
622
|
+
list List curated tools
|
|
623
|
+
installed List installed tools
|
|
624
|
+
show <name> Show one tool
|
|
625
|
+
install <name> Install one tool
|
|
626
|
+
doctor <name> Check one tool
|
|
627
|
+
guides <name> List tool guides
|
|
628
|
+
guide <name> [guide] Print one guide
|
|
629
|
+
path <name> Print executable path
|
|
630
|
+
env <name> Print shell exports
|
|
631
|
+
browser-use Browser-use auth slots and helper commands
|
|
632
|
+
agent-browser Agent Browser sessions, targets, and auth slots
|
|
633
|
+
ralph Ralph job helper commands
|
|
634
|
+
|
|
635
|
+
Next:
|
|
636
636
|
pibo tools list`);
|
|
637
637
|
}
|
|
638
638
|
export async function runToolsCli(argv = process.argv) {
|
|
@@ -790,10 +790,10 @@ export async function runToolsCli(argv = process.argv) {
|
|
|
790
790
|
.command('auth-template')
|
|
791
791
|
.description('Manage the Agent Browser authenticated template profile')
|
|
792
792
|
.action(() => {
|
|
793
|
-
console.log(`pibo tools agent-browser auth-template
|
|
794
|
-
|
|
795
|
-
Commands:
|
|
796
|
-
path Print the default authenticated template profile path
|
|
793
|
+
console.log(`pibo tools agent-browser auth-template
|
|
794
|
+
|
|
795
|
+
Commands:
|
|
796
|
+
path Print the default authenticated template profile path
|
|
797
797
|
env Print shell exports for preparing the auth template profile`);
|
|
798
798
|
});
|
|
799
799
|
agentAuthTemplate
|
|
@@ -814,12 +814,12 @@ Commands:
|
|
|
814
814
|
.command('lease')
|
|
815
815
|
.description('Acquire and manage isolated Agent Browser slots')
|
|
816
816
|
.action(() => {
|
|
817
|
-
console.log(`pibo tools agent-browser lease
|
|
818
|
-
|
|
819
|
-
Commands:
|
|
820
|
-
acquire Acquire an isolated authenticated browser slot
|
|
821
|
-
list List authenticated browser slots
|
|
822
|
-
release <id> Release one browser slot
|
|
817
|
+
console.log(`pibo tools agent-browser lease
|
|
818
|
+
|
|
819
|
+
Commands:
|
|
820
|
+
acquire Acquire an isolated authenticated browser slot
|
|
821
|
+
list List authenticated browser slots
|
|
822
|
+
release <id> Release one browser slot
|
|
823
823
|
reap-stale Release expired browser slots`);
|
|
824
824
|
});
|
|
825
825
|
agentLease
|
|
@@ -911,10 +911,10 @@ Commands:
|
|
|
911
911
|
.command('pool')
|
|
912
912
|
.description('Inspect and reap the managed browser pool')
|
|
913
913
|
.action(() => {
|
|
914
|
-
console.log(`pibo tools browser-use pool
|
|
915
|
-
|
|
916
|
-
Commands:
|
|
917
|
-
status Show read-only managed browser-pool status
|
|
914
|
+
console.log(`pibo tools browser-use pool
|
|
915
|
+
|
|
916
|
+
Commands:
|
|
917
|
+
status Show read-only managed browser-pool status
|
|
918
918
|
reap Reap an idle managed browser pool`);
|
|
919
919
|
});
|
|
920
920
|
pool
|
|
@@ -942,10 +942,10 @@ Commands:
|
|
|
942
942
|
.command('auth-template')
|
|
943
943
|
.description('Manage the browser-use authenticated template profile')
|
|
944
944
|
.action(() => {
|
|
945
|
-
console.log(`pibo tools browser-use auth-template
|
|
946
|
-
|
|
947
|
-
Commands:
|
|
948
|
-
path Print the default authenticated template profile path
|
|
945
|
+
console.log(`pibo tools browser-use auth-template
|
|
946
|
+
|
|
947
|
+
Commands:
|
|
948
|
+
path Print the default authenticated template profile path
|
|
949
949
|
env Print shell exports for preparing the auth template profile`);
|
|
950
950
|
});
|
|
951
951
|
authTemplate
|
|
@@ -964,12 +964,12 @@ Commands:
|
|
|
964
964
|
.command('lease')
|
|
965
965
|
.description('Acquire and manage isolated authenticated browser-use slots')
|
|
966
966
|
.action(() => {
|
|
967
|
-
console.log(`pibo tools browser-use lease
|
|
968
|
-
|
|
969
|
-
Commands:
|
|
970
|
-
acquire Acquire an isolated authenticated browser slot
|
|
971
|
-
list List authenticated browser slots
|
|
972
|
-
release <id> Release one browser slot
|
|
967
|
+
console.log(`pibo tools browser-use lease
|
|
968
|
+
|
|
969
|
+
Commands:
|
|
970
|
+
acquire Acquire an isolated authenticated browser slot
|
|
971
|
+
list List authenticated browser slots
|
|
972
|
+
release <id> Release one browser slot
|
|
973
973
|
reap-stale Release expired or dead browser slots`);
|
|
974
974
|
});
|
|
975
975
|
lease
|
|
@@ -1,206 +1,206 @@
|
|
|
1
|
-
export const NODE_RUNTIME_WORKER_SOURCE = String.raw `
|
|
2
|
-
const vm = require("node:vm");
|
|
3
|
-
const util = require("node:util");
|
|
4
|
-
|
|
5
|
-
let currentOutput = null;
|
|
6
|
-
|
|
7
|
-
function bounded(value, maxBytes = 8192) {
|
|
8
|
-
const text = String(value);
|
|
9
|
-
const bytes = Buffer.byteLength(text, "utf8");
|
|
10
|
-
if (bytes <= maxBytes) return text;
|
|
11
|
-
return Buffer.from(text, "utf8").subarray(0, maxBytes).toString("utf8") + "\n...<truncated>";
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function safeInspect(value, maxBytes = 4096) {
|
|
15
|
-
try {
|
|
16
|
-
return bounded(util.inspect(value, { depth: 3, maxArrayLength: 50, breakLength: 120 }), maxBytes);
|
|
17
|
-
} catch (error) {
|
|
18
|
-
return "<inspect failed: " + (error?.name || "Error") + ": " + (error?.message || String(error)) + ">";
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function summarize(value, maxBytes = 4096) {
|
|
23
|
-
const type = value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
|
|
24
|
-
const result = { type, repr: safeInspect(value, maxBytes) };
|
|
25
|
-
try {
|
|
26
|
-
if (value != null && typeof value.length === "number") result.length = value.length;
|
|
27
|
-
if (Array.isArray(value)) result.length = value.length;
|
|
28
|
-
if (value && typeof value === "object") {
|
|
29
|
-
const keys = Object.keys(value).slice(0, 50);
|
|
30
|
-
if (keys.length > 0) result.keys = keys;
|
|
31
|
-
}
|
|
32
|
-
} catch {}
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function errorSummary(error) {
|
|
37
|
-
const stack = error && error.stack ? String(error.stack) : String(error);
|
|
38
|
-
const out = {
|
|
39
|
-
name: error && error.name ? String(error.name) : "Error",
|
|
40
|
-
message: error && error.message ? String(error.message) : String(error),
|
|
41
|
-
stack,
|
|
42
|
-
};
|
|
43
|
-
const match = stack.match(/<pibo-runtime>:(\d+):(\d+)/) || stack.match(/evalmachine\.<anonymous>:(\d+):(\d+)/);
|
|
44
|
-
if (match) {
|
|
45
|
-
out.line = Number(match[1]);
|
|
46
|
-
out.column = Number(match[2]);
|
|
47
|
-
}
|
|
48
|
-
return out;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function appendStdout(chunk) {
|
|
52
|
-
if (currentOutput) currentOutput.stdout += String(chunk);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function appendStderr(chunk) {
|
|
56
|
-
if (currentOutput) currentOutput.stderr += String(chunk);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const processProxy = new Proxy(process, {
|
|
60
|
-
get(target, prop, receiver) {
|
|
61
|
-
if (prop === "stdout") return { write: (chunk) => { appendStdout(chunk); return true; } };
|
|
62
|
-
if (prop === "stderr") return { write: (chunk) => { appendStderr(chunk); return true; } };
|
|
63
|
-
return Reflect.get(target, prop, receiver);
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
const consoleProxy = {
|
|
68
|
-
log: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
69
|
-
info: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
70
|
-
debug: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
71
|
-
warn: (...args) => appendStderr(util.format(...args) + "\n"),
|
|
72
|
-
error: (...args) => appendStderr(util.format(...args) + "\n"),
|
|
73
|
-
dir: (value, options) => appendStdout(util.inspect(value, options) + "\n"),
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const context = vm.createContext({
|
|
77
|
-
console: consoleProxy,
|
|
78
|
-
require,
|
|
79
|
-
process: processProxy,
|
|
80
|
-
Buffer,
|
|
81
|
-
URL,
|
|
82
|
-
URLSearchParams,
|
|
83
|
-
TextEncoder,
|
|
84
|
-
TextDecoder,
|
|
85
|
-
setTimeout,
|
|
86
|
-
clearTimeout,
|
|
87
|
-
setInterval,
|
|
88
|
-
clearInterval,
|
|
89
|
-
setImmediate,
|
|
90
|
-
clearImmediate,
|
|
91
|
-
queueMicrotask,
|
|
92
|
-
});
|
|
93
|
-
context.global = context;
|
|
94
|
-
context.globalThis = context;
|
|
95
|
-
|
|
96
|
-
async function execute(req) {
|
|
97
|
-
const mode = req.mode || "exec";
|
|
98
|
-
const code = req.code || "";
|
|
99
|
-
const output = { stdout: "", stderr: "" };
|
|
100
|
-
currentOutput = output;
|
|
101
|
-
try {
|
|
102
|
-
const value = await (async () => {
|
|
103
|
-
if (mode === "eval") {
|
|
104
|
-
return await vm.runInContext(code, context, { filename: "<pibo-runtime>", timeout: Number(req.timeoutMs || 30000) });
|
|
105
|
-
}
|
|
106
|
-
const result = vm.runInContext(code, context, { filename: "<pibo-runtime>", timeout: Number(req.timeoutMs || 30000) });
|
|
107
|
-
if (result && typeof result.then === "function") await result;
|
|
108
|
-
return undefined;
|
|
109
|
-
})();
|
|
110
|
-
return {
|
|
111
|
-
id: req.id,
|
|
112
|
-
status: "ok",
|
|
113
|
-
stdout: output.stdout,
|
|
114
|
-
stderr: output.stderr,
|
|
115
|
-
result: value === undefined ? null : summarize(value),
|
|
116
|
-
};
|
|
117
|
-
} catch (error) {
|
|
118
|
-
return {
|
|
119
|
-
id: req.id,
|
|
120
|
-
status: "error",
|
|
121
|
-
stdout: output.stdout,
|
|
122
|
-
stderr: output.stderr,
|
|
123
|
-
error: errorSummary(error),
|
|
124
|
-
};
|
|
125
|
-
} finally {
|
|
126
|
-
currentOutput = null;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async function inspectValue(req) {
|
|
131
|
-
const expression = req.expression || "";
|
|
132
|
-
const what = req.what || "summary";
|
|
133
|
-
const maxBytes = Number(req.maxBytes || 8192);
|
|
134
|
-
try {
|
|
135
|
-
const value = await vm.runInContext(expression, context, { filename: "<pibo-runtime>", timeout: 15000 });
|
|
136
|
-
const result = { id: req.id, status: "ok" };
|
|
137
|
-
if (what === "summary" || what === "all") result.summary = summarize(value, maxBytes);
|
|
138
|
-
if (what === "signature" || what === "all") result.signature = typeof value === "function" ? bounded(value.toString().split("{")[0].trim(), maxBytes) : "<signature unavailable>";
|
|
139
|
-
if (what === "members" || what === "all") {
|
|
140
|
-
const members = new Set();
|
|
141
|
-
for (const key of Reflect.ownKeys(Object(value))) members.add(String(key));
|
|
142
|
-
const proto = value == null ? undefined : Object.getPrototypeOf(value);
|
|
143
|
-
if (proto) for (const key of Reflect.ownKeys(proto)) members.add(String(key));
|
|
144
|
-
result.members = [...members].slice(0, 200);
|
|
145
|
-
}
|
|
146
|
-
if (what === "source" || what === "all") result.source = typeof value === "function" ? bounded(value.toString(), maxBytes) : "<source unavailable>";
|
|
147
|
-
if (what === "doc" || what === "all") result.doc = "";
|
|
148
|
-
return result;
|
|
149
|
-
} catch (error) {
|
|
150
|
-
return { id: req.id, status: "error", error: errorSummary(error) };
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function listVars(req) {
|
|
155
|
-
const includePrivate = Boolean(req.includePrivate);
|
|
156
|
-
const maxItems = Number(req.maxItems || 100);
|
|
157
|
-
const maxBytes = Number(req.maxBytes || 4096);
|
|
158
|
-
const hidden = new Set(["console", "require", "process", "Buffer", "URL", "URLSearchParams", "TextEncoder", "TextDecoder", "global", "globalThis"]);
|
|
159
|
-
const variables = [];
|
|
160
|
-
for (const name of Object.keys(context).sort()) {
|
|
161
|
-
if (hidden.has(name)) continue;
|
|
162
|
-
if (!includePrivate && name.startsWith("_")) continue;
|
|
163
|
-
variables.push({ name, summary: summarize(context[name], maxBytes) });
|
|
164
|
-
if (variables.length >= maxItems) break;
|
|
165
|
-
}
|
|
166
|
-
return { id: req.id, status: "ok", variables, truncated: variables.length >= maxItems };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function writeResponse(resp) {
|
|
170
|
-
process.stdout.write(JSON.stringify(resp) + "\n");
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async function handle(req) {
|
|
174
|
-
if (req.type === "exec") return await execute(req);
|
|
175
|
-
if (req.type === "inspect") return await inspectValue(req);
|
|
176
|
-
if (req.type === "vars") return listVars(req);
|
|
177
|
-
if (req.type === "shutdown") return { id: req.id, status: "ok", shutdown: true };
|
|
178
|
-
return { id: req.id, status: "error", error: { name: "RuntimeProtocolError", message: "unknown request type " + req.type } };
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
async function main() {
|
|
182
|
-
writeResponse({ id: "ready", status: "ready" });
|
|
183
|
-
let buffer = "";
|
|
184
|
-
process.stdin.setEncoding("utf8");
|
|
185
|
-
process.stdin.on("data", async (chunk) => {
|
|
186
|
-
buffer += chunk;
|
|
187
|
-
let index;
|
|
188
|
-
while ((index = buffer.indexOf("\n")) >= 0) {
|
|
189
|
-
const line = buffer.slice(0, index);
|
|
190
|
-
buffer = buffer.slice(index + 1);
|
|
191
|
-
if (!line.trim()) continue;
|
|
192
|
-
let req;
|
|
193
|
-
try {
|
|
194
|
-
req = JSON.parse(line);
|
|
195
|
-
const resp = await handle(req);
|
|
196
|
-
writeResponse(resp);
|
|
197
|
-
if (resp.shutdown) process.exit(0);
|
|
198
|
-
} catch (error) {
|
|
199
|
-
writeResponse({ id: req?.id, status: "error", error: errorSummary(error) });
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
main();
|
|
1
|
+
export const NODE_RUNTIME_WORKER_SOURCE = String.raw `
|
|
2
|
+
const vm = require("node:vm");
|
|
3
|
+
const util = require("node:util");
|
|
4
|
+
|
|
5
|
+
let currentOutput = null;
|
|
6
|
+
|
|
7
|
+
function bounded(value, maxBytes = 8192) {
|
|
8
|
+
const text = String(value);
|
|
9
|
+
const bytes = Buffer.byteLength(text, "utf8");
|
|
10
|
+
if (bytes <= maxBytes) return text;
|
|
11
|
+
return Buffer.from(text, "utf8").subarray(0, maxBytes).toString("utf8") + "\n...<truncated>";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function safeInspect(value, maxBytes = 4096) {
|
|
15
|
+
try {
|
|
16
|
+
return bounded(util.inspect(value, { depth: 3, maxArrayLength: 50, breakLength: 120 }), maxBytes);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
return "<inspect failed: " + (error?.name || "Error") + ": " + (error?.message || String(error)) + ">";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function summarize(value, maxBytes = 4096) {
|
|
23
|
+
const type = value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
|
|
24
|
+
const result = { type, repr: safeInspect(value, maxBytes) };
|
|
25
|
+
try {
|
|
26
|
+
if (value != null && typeof value.length === "number") result.length = value.length;
|
|
27
|
+
if (Array.isArray(value)) result.length = value.length;
|
|
28
|
+
if (value && typeof value === "object") {
|
|
29
|
+
const keys = Object.keys(value).slice(0, 50);
|
|
30
|
+
if (keys.length > 0) result.keys = keys;
|
|
31
|
+
}
|
|
32
|
+
} catch {}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function errorSummary(error) {
|
|
37
|
+
const stack = error && error.stack ? String(error.stack) : String(error);
|
|
38
|
+
const out = {
|
|
39
|
+
name: error && error.name ? String(error.name) : "Error",
|
|
40
|
+
message: error && error.message ? String(error.message) : String(error),
|
|
41
|
+
stack,
|
|
42
|
+
};
|
|
43
|
+
const match = stack.match(/<pibo-runtime>:(\d+):(\d+)/) || stack.match(/evalmachine\.<anonymous>:(\d+):(\d+)/);
|
|
44
|
+
if (match) {
|
|
45
|
+
out.line = Number(match[1]);
|
|
46
|
+
out.column = Number(match[2]);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function appendStdout(chunk) {
|
|
52
|
+
if (currentOutput) currentOutput.stdout += String(chunk);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function appendStderr(chunk) {
|
|
56
|
+
if (currentOutput) currentOutput.stderr += String(chunk);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const processProxy = new Proxy(process, {
|
|
60
|
+
get(target, prop, receiver) {
|
|
61
|
+
if (prop === "stdout") return { write: (chunk) => { appendStdout(chunk); return true; } };
|
|
62
|
+
if (prop === "stderr") return { write: (chunk) => { appendStderr(chunk); return true; } };
|
|
63
|
+
return Reflect.get(target, prop, receiver);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const consoleProxy = {
|
|
68
|
+
log: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
69
|
+
info: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
70
|
+
debug: (...args) => appendStdout(util.format(...args) + "\n"),
|
|
71
|
+
warn: (...args) => appendStderr(util.format(...args) + "\n"),
|
|
72
|
+
error: (...args) => appendStderr(util.format(...args) + "\n"),
|
|
73
|
+
dir: (value, options) => appendStdout(util.inspect(value, options) + "\n"),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const context = vm.createContext({
|
|
77
|
+
console: consoleProxy,
|
|
78
|
+
require,
|
|
79
|
+
process: processProxy,
|
|
80
|
+
Buffer,
|
|
81
|
+
URL,
|
|
82
|
+
URLSearchParams,
|
|
83
|
+
TextEncoder,
|
|
84
|
+
TextDecoder,
|
|
85
|
+
setTimeout,
|
|
86
|
+
clearTimeout,
|
|
87
|
+
setInterval,
|
|
88
|
+
clearInterval,
|
|
89
|
+
setImmediate,
|
|
90
|
+
clearImmediate,
|
|
91
|
+
queueMicrotask,
|
|
92
|
+
});
|
|
93
|
+
context.global = context;
|
|
94
|
+
context.globalThis = context;
|
|
95
|
+
|
|
96
|
+
async function execute(req) {
|
|
97
|
+
const mode = req.mode || "exec";
|
|
98
|
+
const code = req.code || "";
|
|
99
|
+
const output = { stdout: "", stderr: "" };
|
|
100
|
+
currentOutput = output;
|
|
101
|
+
try {
|
|
102
|
+
const value = await (async () => {
|
|
103
|
+
if (mode === "eval") {
|
|
104
|
+
return await vm.runInContext(code, context, { filename: "<pibo-runtime>", timeout: Number(req.timeoutMs || 30000) });
|
|
105
|
+
}
|
|
106
|
+
const result = vm.runInContext(code, context, { filename: "<pibo-runtime>", timeout: Number(req.timeoutMs || 30000) });
|
|
107
|
+
if (result && typeof result.then === "function") await result;
|
|
108
|
+
return undefined;
|
|
109
|
+
})();
|
|
110
|
+
return {
|
|
111
|
+
id: req.id,
|
|
112
|
+
status: "ok",
|
|
113
|
+
stdout: output.stdout,
|
|
114
|
+
stderr: output.stderr,
|
|
115
|
+
result: value === undefined ? null : summarize(value),
|
|
116
|
+
};
|
|
117
|
+
} catch (error) {
|
|
118
|
+
return {
|
|
119
|
+
id: req.id,
|
|
120
|
+
status: "error",
|
|
121
|
+
stdout: output.stdout,
|
|
122
|
+
stderr: output.stderr,
|
|
123
|
+
error: errorSummary(error),
|
|
124
|
+
};
|
|
125
|
+
} finally {
|
|
126
|
+
currentOutput = null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function inspectValue(req) {
|
|
131
|
+
const expression = req.expression || "";
|
|
132
|
+
const what = req.what || "summary";
|
|
133
|
+
const maxBytes = Number(req.maxBytes || 8192);
|
|
134
|
+
try {
|
|
135
|
+
const value = await vm.runInContext(expression, context, { filename: "<pibo-runtime>", timeout: 15000 });
|
|
136
|
+
const result = { id: req.id, status: "ok" };
|
|
137
|
+
if (what === "summary" || what === "all") result.summary = summarize(value, maxBytes);
|
|
138
|
+
if (what === "signature" || what === "all") result.signature = typeof value === "function" ? bounded(value.toString().split("{")[0].trim(), maxBytes) : "<signature unavailable>";
|
|
139
|
+
if (what === "members" || what === "all") {
|
|
140
|
+
const members = new Set();
|
|
141
|
+
for (const key of Reflect.ownKeys(Object(value))) members.add(String(key));
|
|
142
|
+
const proto = value == null ? undefined : Object.getPrototypeOf(value);
|
|
143
|
+
if (proto) for (const key of Reflect.ownKeys(proto)) members.add(String(key));
|
|
144
|
+
result.members = [...members].slice(0, 200);
|
|
145
|
+
}
|
|
146
|
+
if (what === "source" || what === "all") result.source = typeof value === "function" ? bounded(value.toString(), maxBytes) : "<source unavailable>";
|
|
147
|
+
if (what === "doc" || what === "all") result.doc = "";
|
|
148
|
+
return result;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
return { id: req.id, status: "error", error: errorSummary(error) };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function listVars(req) {
|
|
155
|
+
const includePrivate = Boolean(req.includePrivate);
|
|
156
|
+
const maxItems = Number(req.maxItems || 100);
|
|
157
|
+
const maxBytes = Number(req.maxBytes || 4096);
|
|
158
|
+
const hidden = new Set(["console", "require", "process", "Buffer", "URL", "URLSearchParams", "TextEncoder", "TextDecoder", "global", "globalThis"]);
|
|
159
|
+
const variables = [];
|
|
160
|
+
for (const name of Object.keys(context).sort()) {
|
|
161
|
+
if (hidden.has(name)) continue;
|
|
162
|
+
if (!includePrivate && name.startsWith("_")) continue;
|
|
163
|
+
variables.push({ name, summary: summarize(context[name], maxBytes) });
|
|
164
|
+
if (variables.length >= maxItems) break;
|
|
165
|
+
}
|
|
166
|
+
return { id: req.id, status: "ok", variables, truncated: variables.length >= maxItems };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function writeResponse(resp) {
|
|
170
|
+
process.stdout.write(JSON.stringify(resp) + "\n");
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function handle(req) {
|
|
174
|
+
if (req.type === "exec") return await execute(req);
|
|
175
|
+
if (req.type === "inspect") return await inspectValue(req);
|
|
176
|
+
if (req.type === "vars") return listVars(req);
|
|
177
|
+
if (req.type === "shutdown") return { id: req.id, status: "ok", shutdown: true };
|
|
178
|
+
return { id: req.id, status: "error", error: { name: "RuntimeProtocolError", message: "unknown request type " + req.type } };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function main() {
|
|
182
|
+
writeResponse({ id: "ready", status: "ready" });
|
|
183
|
+
let buffer = "";
|
|
184
|
+
process.stdin.setEncoding("utf8");
|
|
185
|
+
process.stdin.on("data", async (chunk) => {
|
|
186
|
+
buffer += chunk;
|
|
187
|
+
let index;
|
|
188
|
+
while ((index = buffer.indexOf("\n")) >= 0) {
|
|
189
|
+
const line = buffer.slice(0, index);
|
|
190
|
+
buffer = buffer.slice(index + 1);
|
|
191
|
+
if (!line.trim()) continue;
|
|
192
|
+
let req;
|
|
193
|
+
try {
|
|
194
|
+
req = JSON.parse(line);
|
|
195
|
+
const resp = await handle(req);
|
|
196
|
+
writeResponse(resp);
|
|
197
|
+
if (resp.shutdown) process.exit(0);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
writeResponse({ id: req?.id, status: "error", error: errorSummary(error) });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
main();
|
|
206
206
|
`;
|