@pasko70/pibo 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +183 -183
  2. package/context/codex-base-prompt.md +148 -148
  3. package/context/compute-worker.md +23 -23
  4. package/context/pibo-compaction-prompt.md +100 -100
  5. package/context/pibo-native-tooling.md +18 -18
  6. package/context/pibo-system-prompt.md +77 -77
  7. package/dist/apps/chat/agent-store.js +82 -82
  8. package/dist/apps/chat/data/project-service.js +166 -166
  9. package/dist/apps/chat/data/read-state-service.js +18 -18
  10. package/dist/apps/chat/data/timeline-query-service.js +8 -8
  11. package/dist/apps/chat/model-catalog.js +5 -1
  12. package/dist/apps/chat/static-assets.js +853 -853
  13. package/dist/apps/chat/workflow-persistence.js +255 -255
  14. package/dist/apps/chat-ui/assets/{dist-7YaJd19a.js → dist-B2BEpL7n.js} +1 -1
  15. package/dist/apps/chat-ui/assets/{dist-CiYeO8nN.js → dist-BAGS_xkV.js} +1 -1
  16. package/dist/apps/chat-ui/assets/{dist-BIvPnn_C.js → dist-BAXNalar.js} +1 -1
  17. package/dist/apps/chat-ui/assets/{dist-CjSI6y5z.js → dist-BwUvs6Ph.js} +1 -1
  18. package/dist/apps/chat-ui/assets/{dist-Ubstha8t.js → dist-C0zsJ8II.js} +1 -1
  19. package/dist/apps/chat-ui/assets/{dist-KXCMNKIL.js → dist-C3PnEkhb.js} +1 -1
  20. package/dist/apps/chat-ui/assets/{dist-CVQU42Fn.js → dist-CYPL-B2Z.js} +1 -1
  21. package/dist/apps/chat-ui/assets/{dist-BbNE72h8.js → dist-CiDSXgtg.js} +1 -1
  22. package/dist/apps/chat-ui/assets/{dist-D7TCkoFT.js → dist-DnACFKyO.js} +1 -1
  23. package/dist/apps/chat-ui/assets/{dist-ChSZNqKE.js → dist-ZB1-ui2y.js} +1 -1
  24. package/dist/apps/chat-ui/assets/{dist-8Noo5eCN.js → dist-vKlxFkTa.js} +1 -1
  25. package/dist/apps/chat-ui/assets/{index-CmxtUVG1.js → index-0x7tuTNX.js} +3 -3
  26. package/dist/apps/chat-ui/assets/{index-C25VYnyb.css → index-B-qaya1G.css} +1 -1
  27. package/dist/apps/chat-ui/index.html +18 -18
  28. package/dist/apps/chat-ui/manifest.webmanifest +25 -25
  29. package/dist/apps/chat-ui/sw.js +41 -41
  30. package/dist/apps/chat-vscode-web/index.html +12 -12
  31. package/dist/apps/cli-ui/cliSessionsCommand.js +23 -23
  32. package/dist/apps/context-files-ui/index.html +11 -11
  33. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  34. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.4.2.vsix +0 -0
  35. package/dist/bin/pibo.js +0 -0
  36. package/dist/bin/rg.js +0 -0
  37. package/dist/cli.js +35 -35
  38. package/dist/compute/cli.js +54 -54
  39. package/dist/core/runtime.js +2 -0
  40. package/dist/core/session-router.js +1 -0
  41. package/dist/cron/cli.js +15 -15
  42. package/dist/cron/store.js +49 -49
  43. package/dist/data/cli.js +23 -23
  44. package/dist/data/event-log.js +23 -23
  45. package/dist/data/message-store.js +20 -20
  46. package/dist/data/navigation-store.js +9 -9
  47. package/dist/data/observation-store.js +4 -4
  48. package/dist/data/payload-store.js +17 -17
  49. package/dist/data/schema.js +429 -429
  50. package/dist/data/session-store.js +4 -4
  51. package/dist/data/telemetry-queries.js +54 -54
  52. package/dist/data/telemetry.js +156 -156
  53. package/dist/debug/events.js +12 -12
  54. package/dist/debug/failures.js +6 -6
  55. package/dist/debug/index.js +207 -207
  56. package/dist/debug/messages.js +6 -6
  57. package/dist/debug/pty.js +124 -124
  58. package/dist/debug/session.js +29 -29
  59. package/dist/debug/tools.js +5 -5
  60. package/dist/debug/web-snapshot-browser-scripts.js +294 -294
  61. package/dist/debug/web-streaming-browser-library.js +925 -925
  62. package/dist/debug/web-streaming-browser-scripts.js +232 -232
  63. package/dist/debug/web-streaming-provider-telemetry.js +4 -4
  64. package/dist/debug/web.js +93 -93
  65. package/dist/gateway/cli.js +19 -19
  66. package/dist/mcp/config-command.js +53 -53
  67. package/dist/mcp/index.js +21 -21
  68. package/dist/mcp/registry.js +11 -11
  69. package/dist/pi-packages/cli.js +11 -11
  70. package/dist/plugins/context-files-store.js +110 -110
  71. package/dist/plugins/context-files.js +4 -4
  72. package/dist/providers/glm.js +59 -0
  73. package/dist/ralph/cli.js +18 -18
  74. package/dist/ralph/templates.js +140 -140
  75. package/dist/reliability/store.js +226 -226
  76. package/dist/sessions/pibo-data-store.js +16 -16
  77. package/dist/sessions/sqlite-store.js +53 -53
  78. package/dist/setup/cli.js +58 -58
  79. package/dist/tools/agent-browser-wrapper.js +80 -80
  80. package/dist/tools/browser-use-cdp.js +12 -12
  81. package/dist/tools/browser-use-wrapper.js +762 -762
  82. package/dist/tools/guides.js +455 -455
  83. package/dist/tools/index.js +99 -99
  84. package/dist/tools/runtime/node-worker-source.js +205 -205
  85. package/dist/tools/runtime/python-worker-source.js +177 -177
  86. package/dist/vscode/cli.js +9 -9
  87. package/dist/web-annotations/cdp.js +900 -900
  88. package/dist/web-annotations/store.js +96 -96
  89. package/docs/README.md +23 -23
  90. package/docs/ops/install-developer-host.md +112 -112
  91. package/docs/ops/install-user-host.md +96 -96
  92. package/docs/ops/upgrade-user-to-developer-host.md +69 -69
  93. package/docs/ops/vscode-extension-release.md +160 -160
  94. package/package.json +1 -1
  95. package/skills/builtin/pi-agent-harness/SKILL.md +319 -319
  96. package/skills/builtin/pi-agent-harness/agents/openai.yaml +4 -4
  97. package/skills/builtin/pibo-docker-system/SKILL.md +170 -170
  98. package/skills/builtin/pibo-spec-writing/SKILL.md +330 -330
  99. package/skills/builtin/prd/SKILL.md +143 -143
  100. package/skills/builtin/ralph-loop/SKILL.md +359 -359
  101. package/skills/builtin/ralph-prd-json/SKILL.md +123 -123
  102. package/skills/builtin/skill-creator/LICENSE.txt +201 -201
  103. package/skills/builtin/skill-creator/SKILL.md +513 -513
  104. package/skills/builtin/skill-creator/agents/analyzer.md +274 -274
  105. package/skills/builtin/skill-creator/agents/comparator.md +202 -202
  106. package/skills/builtin/skill-creator/agents/grader.md +223 -223
  107. package/skills/builtin/skill-creator/assets/eval_review.html +146 -146
  108. package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -471
  109. package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -1325
  110. package/skills/builtin/skill-creator/references/schemas.md +430 -430
  111. package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -401
  112. package/skills/builtin/skill-creator/scripts/generate_report.py +326 -326
  113. package/skills/builtin/skill-creator/scripts/improve_description.py +247 -247
  114. package/skills/builtin/skill-creator/scripts/package_skill.py +136 -136
  115. package/skills/builtin/skill-creator/scripts/quick_validate.py +102 -102
  116. package/skills/builtin/skill-creator/scripts/run_eval.py +310 -310
  117. package/skills/builtin/skill-creator/scripts/run_loop.py +328 -328
  118. package/skills/builtin/skill-creator/scripts/utils.py +47 -47
  119. package/skills/builtin/web-annotations/SKILL.md +93 -93
  120. package/src/mcp/LICENSE.mcp-cli +21 -21
  121. package/dist/apps/vscode-artifacts/pibo-vscode-1.3.0.vsix +0 -0
  122. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.3.3.vsix +0 -0
  123. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.3.4.vsix +0 -0
  124. package/dist/apps/vscode-artifacts/pibo-vscode-ext-1.3.5.vsix +0 -0
  125. package/dist/core/shared-app.js +0 -17
  126. package/dist/data/final-app-space-cutover-migration.js +0 -728
  127. package/dist/data/shared-app-migration.js +0 -757
  128. package/dist/session-ui/ownerViewModel.js +0 -27
  129. package/dist/shared-app.js +0 -4
@@ -198,31 +198,31 @@ function parseNonNegativeInteger(value) {
198
198
  return parsed;
199
199
  }
200
200
  function printBrowserUseDiscovery() {
201
- console.log(`pibo tools browser-use - browser-use helpers
202
-
203
- Start:
204
- eval "$(pibo tools env browser-use)"
205
-
206
- Commands:
207
- targets List Chrome CDP targets with Chat auth hints
208
- attach-chat Export the best existing authenticated Chat target
209
- auth-template path Print the default authenticated template profile path
210
- auth-template env Print shell exports for preparing the auth template profile
211
- lease acquire Acquire an isolated authenticated browser slot
212
- lease list List authenticated browser slots
213
- lease release <id> Release one browser slot
214
- lease reap-stale Release expired or dead browser slots
215
- pool status Show read-only managed browser-pool status
216
- pool reap Reap an idle managed browser pool
217
- health Check browser-use health and report issues
218
-
219
- Next:
220
- pibo tools show browser-use
221
- pibo tools guide browser-use browser-use
222
- pibo tools browser-use targets
223
- pibo tools browser-use auth-template env
224
- pibo tools browser-use lease acquire
225
- pibo tools browser-use pool status
201
+ console.log(`pibo tools browser-use - browser-use helpers
202
+
203
+ Start:
204
+ eval "$(pibo tools env browser-use)"
205
+
206
+ Commands:
207
+ targets List Chrome CDP targets with Chat auth hints
208
+ attach-chat Export the best existing authenticated Chat target
209
+ auth-template path Print the default authenticated template profile path
210
+ auth-template env Print shell exports for preparing the auth template profile
211
+ lease acquire Acquire an isolated authenticated browser slot
212
+ lease list List authenticated browser slots
213
+ lease release <id> Release one browser slot
214
+ lease reap-stale Release expired or dead browser slots
215
+ pool status Show read-only managed browser-pool status
216
+ pool reap Reap an idle managed browser pool
217
+ health Check browser-use health and report issues
218
+
219
+ Next:
220
+ pibo tools show browser-use
221
+ pibo tools guide browser-use browser-use
222
+ pibo tools browser-use targets
223
+ pibo tools browser-use auth-template env
224
+ pibo tools browser-use lease acquire
225
+ pibo tools browser-use pool status
226
226
  pibo tools browser-use pool reap --json`);
227
227
  }
228
228
  function getBrowserPoolStatusIdentity(options) {
@@ -573,62 +573,62 @@ async function printBrowserUseHealth(status, json = false) {
573
573
  }
574
574
  }
575
575
  function printAgentBrowserDiscovery() {
576
- console.log(`pibo tools agent-browser - Agent Browser helpers
577
-
578
- Start:
579
- eval "$(pibo tools env agent-browser)"
580
-
581
- Commands:
582
- health Check Agent Browser health and report issues
583
- sessions List upstream Agent Browser sessions
584
- targets List Chrome CDP targets with Chat auth hints
585
- attach-chat Export the best existing authenticated Chat target
586
- auth-template path Print the default authenticated template profile path
587
- auth-template env Print shell exports for preparing the auth template profile
588
- lease acquire Acquire an isolated authenticated browser slot
589
- lease list List authenticated browser slots
590
- lease release <id> Release one browser slot
591
- lease reap-stale Release expired browser slots
592
-
593
- Next:
594
- pibo tools show agent-browser
595
- pibo tools guide agent-browser agent-browser
596
- pibo tools agent-browser health
576
+ console.log(`pibo tools agent-browser - Agent Browser helpers
577
+
578
+ Start:
579
+ eval "$(pibo tools env agent-browser)"
580
+
581
+ Commands:
582
+ health Check Agent Browser health and report issues
583
+ sessions List upstream Agent Browser sessions
584
+ targets List Chrome CDP targets with Chat auth hints
585
+ attach-chat Export the best existing authenticated Chat target
586
+ auth-template path Print the default authenticated template profile path
587
+ auth-template env Print shell exports for preparing the auth template profile
588
+ lease acquire Acquire an isolated authenticated browser slot
589
+ lease list List authenticated browser slots
590
+ lease release <id> Release one browser slot
591
+ lease reap-stale Release expired browser slots
592
+
593
+ Next:
594
+ pibo tools show agent-browser
595
+ pibo tools guide agent-browser agent-browser
596
+ pibo tools agent-browser health
597
597
  pibo tools agent-browser lease acquire`);
598
598
  }
599
599
  function printRalphDiscovery() {
600
- console.log(`pibo tools ralph - Ralph job helpers
601
-
602
- Commands:
603
- pibo ralph templates --json
604
- pibo ralph add --template <id> --room <room-id> --start --json
605
- pibo ralph list --all --json
606
- pibo ralph runs --job <job-id> --json
607
- pibo ralph stop <job-id>
608
- pibo ralph cancel <job-id>
609
-
610
- Next:
611
- pibo tools guide ralph ralph
600
+ console.log(`pibo tools ralph - Ralph job helpers
601
+
602
+ Commands:
603
+ pibo ralph templates --json
604
+ pibo ralph add --template <id> --room <room-id> --start --json
605
+ pibo ralph list --all --json
606
+ pibo ralph runs --job <job-id> --json
607
+ pibo ralph stop <job-id>
608
+ pibo ralph cancel <job-id>
609
+
610
+ Next:
611
+ pibo tools guide ralph ralph
612
612
  pibo ralph templates`);
613
613
  }
614
614
  function printToolsDiscovery() {
615
- console.log(`pibo tools - curated CLI tools
616
-
617
- Commands:
618
- list List curated tools
619
- installed List installed tools
620
- show <name> Show one tool
621
- install <name> Install one tool
622
- doctor <name> Check one tool
623
- guides <name> List tool guides
624
- guide <name> [guide] Print one guide
625
- path <name> Print executable path
626
- env <name> Print shell exports
627
- browser-use Browser-use auth slots and helper commands
628
- agent-browser Agent Browser sessions, targets, and auth slots
629
- ralph Ralph job helper commands
630
-
631
- Next:
615
+ console.log(`pibo tools - curated CLI tools
616
+
617
+ Commands:
618
+ list List curated tools
619
+ installed List installed tools
620
+ show <name> Show one tool
621
+ install <name> Install one tool
622
+ doctor <name> Check one tool
623
+ guides <name> List tool guides
624
+ guide <name> [guide] Print one guide
625
+ path <name> Print executable path
626
+ env <name> Print shell exports
627
+ browser-use Browser-use auth slots and helper commands
628
+ agent-browser Agent Browser sessions, targets, and auth slots
629
+ ralph Ralph job helper commands
630
+
631
+ Next:
632
632
  pibo tools list`);
633
633
  }
634
634
  export async function runToolsCli(argv = process.argv) {
@@ -786,10 +786,10 @@ export async function runToolsCli(argv = process.argv) {
786
786
  .command('auth-template')
787
787
  .description('Manage the Agent Browser authenticated template profile')
788
788
  .action(() => {
789
- console.log(`pibo tools agent-browser auth-template
790
-
791
- Commands:
792
- path Print the default authenticated template profile path
789
+ console.log(`pibo tools agent-browser auth-template
790
+
791
+ Commands:
792
+ path Print the default authenticated template profile path
793
793
  env Print shell exports for preparing the auth template profile`);
794
794
  });
795
795
  agentAuthTemplate
@@ -810,12 +810,12 @@ Commands:
810
810
  .command('lease')
811
811
  .description('Acquire and manage isolated Agent Browser slots')
812
812
  .action(() => {
813
- console.log(`pibo tools agent-browser lease
814
-
815
- Commands:
816
- acquire Acquire an isolated authenticated browser slot
817
- list List authenticated browser slots
818
- release <id> Release one browser slot
813
+ console.log(`pibo tools agent-browser lease
814
+
815
+ Commands:
816
+ acquire Acquire an isolated authenticated browser slot
817
+ list List authenticated browser slots
818
+ release <id> Release one browser slot
819
819
  reap-stale Release expired browser slots`);
820
820
  });
821
821
  agentLease
@@ -907,10 +907,10 @@ Commands:
907
907
  .command('pool')
908
908
  .description('Inspect and reap the managed browser pool')
909
909
  .action(() => {
910
- console.log(`pibo tools browser-use pool
911
-
912
- Commands:
913
- status Show read-only managed browser-pool status
910
+ console.log(`pibo tools browser-use pool
911
+
912
+ Commands:
913
+ status Show read-only managed browser-pool status
914
914
  reap Reap an idle managed browser pool`);
915
915
  });
916
916
  pool
@@ -938,10 +938,10 @@ Commands:
938
938
  .command('auth-template')
939
939
  .description('Manage the browser-use authenticated template profile')
940
940
  .action(() => {
941
- console.log(`pibo tools browser-use auth-template
942
-
943
- Commands:
944
- path Print the default authenticated template profile path
941
+ console.log(`pibo tools browser-use auth-template
942
+
943
+ Commands:
944
+ path Print the default authenticated template profile path
945
945
  env Print shell exports for preparing the auth template profile`);
946
946
  });
947
947
  authTemplate
@@ -960,12 +960,12 @@ Commands:
960
960
  .command('lease')
961
961
  .description('Acquire and manage isolated authenticated browser-use slots')
962
962
  .action(() => {
963
- console.log(`pibo tools browser-use lease
964
-
965
- Commands:
966
- acquire Acquire an isolated authenticated browser slot
967
- list List authenticated browser slots
968
- release <id> Release one browser slot
963
+ console.log(`pibo tools browser-use lease
964
+
965
+ Commands:
966
+ acquire Acquire an isolated authenticated browser slot
967
+ list List authenticated browser slots
968
+ release <id> Release one browser slot
969
969
  reap-stale Release expired or dead browser slots`);
970
970
  });
971
971
  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
  `;