@code-yeongyu/senpi 2026.8.30 → 2026.8.31

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 (331) hide show
  1. package/CHANGELOG.md +142 -2
  2. package/README.md +3 -0
  3. package/dist/core/agent-session.d.ts +28 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +161 -14
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  8. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  9. package/dist/core/compaction/compaction-execution.js +121 -0
  10. package/dist/core/compaction/compaction-execution.js.map +1 -0
  11. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  12. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  13. package/dist/core/compaction/compaction-settings.js +17 -0
  14. package/dist/core/compaction/compaction-settings.js.map +1 -0
  15. package/dist/core/compaction/compaction.d.ts +13 -26
  16. package/dist/core/compaction/compaction.d.ts.map +1 -1
  17. package/dist/core/compaction/compaction.js +7 -136
  18. package/dist/core/compaction/compaction.js.map +1 -1
  19. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  20. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  21. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  22. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  23. package/dist/core/compaction-settings-access.d.ts +19 -0
  24. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  25. package/dist/core/compaction-settings-access.js +10 -0
  26. package/dist/core/compaction-settings-access.js.map +1 -0
  27. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  28. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  29. package/dist/core/compaction-settings-resolver.js +46 -0
  30. package/dist/core/compaction-settings-resolver.js.map +1 -0
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +9 -1
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +10 -3
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +18 -0
  36. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  37. package/dist/core/extensions/builtin/compaction/context-pipeline.js +32 -0
  38. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  39. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +1 -1
  40. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +8 -2
  42. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  43. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  44. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  45. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  46. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  47. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  48. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  50. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
  52. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
  54. package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
  55. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  56. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  58. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  60. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/index.js +148 -150
  62. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  64. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  66. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  68. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  69. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  70. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  71. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
  72. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
  73. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
  74. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  76. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  78. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  79. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  80. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  82. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +46 -0
  83. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/compaction/orchestration.js +103 -0
  85. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  86. package/dist/core/extensions/builtin/compaction/policy.d.ts +12 -2
  87. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/compaction/policy.js +52 -26
  89. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  90. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  91. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  93. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  94. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  95. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  97. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  98. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +23 -0
  99. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/compaction/speculative-summary.js +132 -0
  101. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  102. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  103. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/speculative.js +21 -197
  105. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  106. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +24 -0
  107. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  108. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +25 -0
  109. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  110. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +27 -0
  111. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/compaction/tool-admission.js +56 -0
  113. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  114. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts +5 -0
  115. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts.map +1 -0
  116. package/dist/core/extensions/builtin/hooks/trust-state-json.js +76 -0
  117. package/dist/core/extensions/builtin/hooks/trust-state-json.js.map +1 -0
  118. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts +7 -1
  119. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/hooks/trust-storage.js +60 -8
  121. package/dist/core/extensions/builtin/hooks/trust-storage.js.map +1 -1
  122. package/dist/core/extensions/builtin/hooks/trust.d.ts +1 -2
  123. package/dist/core/extensions/builtin/hooks/trust.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/hooks/trust.js +1 -72
  125. package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
  127. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
  129. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  130. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/ttsr/index.js +4 -0
  132. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  133. package/dist/core/extensions/builtin/ttsr/manager.d.ts +2 -0
  134. package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/ttsr/manager.js +28 -1
  136. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  137. package/dist/core/extensions/runner.d.ts +5 -0
  138. package/dist/core/extensions/runner.d.ts.map +1 -1
  139. package/dist/core/extensions/runner.js +7 -0
  140. package/dist/core/extensions/runner.js.map +1 -1
  141. package/dist/core/retry-fallback/controller.d.ts +14 -0
  142. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  143. package/dist/core/retry-fallback/controller.js +33 -3
  144. package/dist/core/retry-fallback/controller.js.map +1 -1
  145. package/dist/core/retry-fallback/log.js +1 -1
  146. package/dist/core/retry-fallback/log.js.map +1 -1
  147. package/dist/core/sdk.d.ts.map +1 -1
  148. package/dist/core/sdk.js +5 -0
  149. package/dist/core/sdk.js.map +1 -1
  150. package/dist/core/session-activity.d.ts +47 -0
  151. package/dist/core/session-activity.d.ts.map +1 -0
  152. package/dist/core/session-activity.js +58 -0
  153. package/dist/core/session-activity.js.map +1 -0
  154. package/dist/core/session-manager.d.ts +8 -12
  155. package/dist/core/session-manager.d.ts.map +1 -1
  156. package/dist/core/session-manager.js +118 -7
  157. package/dist/core/session-manager.js.map +1 -1
  158. package/dist/core/session-resident-store.d.ts +8 -1
  159. package/dist/core/session-resident-store.d.ts.map +1 -1
  160. package/dist/core/session-resident-store.js +12 -5
  161. package/dist/core/session-resident-store.js.map +1 -1
  162. package/dist/core/settings-manager.d.ts +8 -85
  163. package/dist/core/settings-manager.d.ts.map +1 -1
  164. package/dist/core/settings-manager.js +9 -17
  165. package/dist/core/settings-manager.js.map +1 -1
  166. package/dist/core/settings-public-types.d.ts +11 -0
  167. package/dist/core/settings-public-types.d.ts.map +1 -0
  168. package/dist/core/settings-public-types.js +2 -0
  169. package/dist/core/settings-public-types.js.map +1 -0
  170. package/dist/core/settings-shapes.d.ts +36 -0
  171. package/dist/core/settings-shapes.d.ts.map +1 -0
  172. package/dist/core/settings-shapes.js +2 -0
  173. package/dist/core/settings-shapes.js.map +1 -0
  174. package/dist/core/shared-host-policy.d.ts +6 -0
  175. package/dist/core/shared-host-policy.d.ts.map +1 -0
  176. package/dist/core/shared-host-policy.js +7 -0
  177. package/dist/core/shared-host-policy.js.map +1 -0
  178. package/dist/core/terminal-settings.d.ts +22 -0
  179. package/dist/core/terminal-settings.d.ts.map +1 -0
  180. package/dist/core/terminal-settings.js +2 -0
  181. package/dist/core/terminal-settings.js.map +1 -0
  182. package/dist/index.d.ts +1 -1
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +1 -1
  185. package/dist/index.js.map +1 -1
  186. package/dist/main.d.ts.map +1 -1
  187. package/dist/main.js +17 -5
  188. package/dist/main.js.map +1 -1
  189. package/dist/modes/app-server/daemon.js +3 -3
  190. package/dist/modes/app-server/daemon.js.map +1 -1
  191. package/dist/modes/index.d.ts +1 -1
  192. package/dist/modes/index.d.ts.map +1 -1
  193. package/dist/modes/index.js +1 -1
  194. package/dist/modes/index.js.map +1 -1
  195. package/dist/modes/interactive/interactive-host-runtime.d.ts +84 -1
  196. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  197. package/dist/modes/interactive/interactive-host-runtime.js +435 -112
  198. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  199. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  200. package/dist/modes/interactive/interactive-mode.js +24 -0
  201. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  202. package/dist/modes/rpc/connection-handler.d.ts +12 -5
  203. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  204. package/dist/modes/rpc/connection-handler.js +173 -23
  205. package/dist/modes/rpc/connection-handler.js.map +1 -1
  206. package/dist/modes/rpc/custom-capability.d.ts +1 -0
  207. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  208. package/dist/modes/rpc/custom-capability.js +1 -0
  209. package/dist/modes/rpc/custom-capability.js.map +1 -1
  210. package/dist/modes/rpc/host-ensure.d.ts +17 -0
  211. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  212. package/dist/modes/rpc/host-ensure.js +67 -16
  213. package/dist/modes/rpc/host-ensure.js.map +1 -1
  214. package/dist/modes/rpc/host-lifecycle.d.ts +39 -0
  215. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  216. package/dist/modes/rpc/host-lifecycle.js +80 -15
  217. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  218. package/dist/modes/rpc/multi-session-host.d.ts +38 -0
  219. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  220. package/dist/modes/rpc/multi-session-host.js +55 -5
  221. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  222. package/dist/modes/rpc/ownership-safe-lock.d.ts +14 -0
  223. package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -0
  224. package/dist/modes/rpc/ownership-safe-lock.js +87 -0
  225. package/dist/modes/rpc/ownership-safe-lock.js.map +1 -0
  226. package/dist/modes/rpc/rpc-client.d.ts +13 -2
  227. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  228. package/dist/modes/rpc/rpc-client.js +38 -11
  229. package/dist/modes/rpc/rpc-client.js.map +1 -1
  230. package/dist/modes/rpc/rpc-types.d.ts +21 -3
  231. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  232. package/dist/modes/rpc/rpc-types.js +1 -0
  233. package/dist/modes/rpc/rpc-types.js.map +1 -1
  234. package/dist/modes/rpc/session-binding.d.ts +2 -1
  235. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  236. package/dist/modes/rpc/session-binding.js +1 -0
  237. package/dist/modes/rpc/session-binding.js.map +1 -1
  238. package/dist/modes/rpc/session-command-router.d.ts +54 -1
  239. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  240. package/dist/modes/rpc/session-command-router.js +174 -2
  241. package/dist/modes/rpc/session-command-router.js.map +1 -1
  242. package/dist/modes/rpc/session-event-writer.d.ts +18 -0
  243. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  244. package/dist/modes/rpc/session-event-writer.js +88 -8
  245. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  246. package/dist/modes/rpc/session-registry.d.ts +11 -1
  247. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  248. package/dist/modes/rpc/session-registry.js +25 -0
  249. package/dist/modes/rpc/session-registry.js.map +1 -1
  250. package/dist/modes/rpc/widget-line-renderer.d.ts +17 -0
  251. package/dist/modes/rpc/widget-line-renderer.d.ts.map +1 -0
  252. package/dist/modes/rpc/widget-line-renderer.js +73 -0
  253. package/dist/modes/rpc/widget-line-renderer.js.map +1 -0
  254. package/dist/utils/fs-watch.d.ts.map +1 -1
  255. package/dist/utils/fs-watch.js +11 -2
  256. package/dist/utils/fs-watch.js.map +1 -1
  257. package/docs/app-server.md +2 -2
  258. package/docs/containerization.md +2 -2
  259. package/docs/development.md +7 -7
  260. package/docs/extensions.md +4 -4
  261. package/docs/grok-neo.md +1 -1
  262. package/docs/index.md +1 -1
  263. package/docs/packages.md +2 -2
  264. package/docs/quickstart.md +4 -4
  265. package/docs/release-guide.md +21 -21
  266. package/docs/rpc.md +78 -5
  267. package/docs/sdk.md +1 -1
  268. package/docs/skills.md +2 -2
  269. package/docs/terminal-tools.md +1 -1
  270. package/docs/termux.md +1 -1
  271. package/docs/tui.md +1 -1
  272. package/examples/AGENTS.md +1 -1
  273. package/examples/sdk/README.md +1 -1
  274. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +40 -0
  275. package/node_modules/@code-yeongyu/senpi-codemode/README.md +2 -2
  276. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  277. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/skill-contribution.ts +71 -0
  278. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +3 -1
  279. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/SKILL.md +44 -0
  280. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/breaking-changes.md +75 -0
  281. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/build.md +114 -0
  282. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/dev-tooling.md +34 -0
  283. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/http-networking.md +113 -0
  284. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/install.md +93 -0
  285. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/node-compat-platforms.md +36 -0
  286. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/performance.md +33 -0
  287. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/runtime-apis.md +156 -0
  288. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/security.md +52 -0
  289. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/test.md +103 -0
  290. package/node_modules/@earendil-works/pi-agent-core/README.md +3 -0
  291. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  292. package/node_modules/@earendil-works/pi-ai/README.md +6 -3
  293. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +24 -7
  295. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  296. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +7 -0
  297. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  298. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +316 -2
  299. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts +4 -0
  301. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts.map +1 -1
  302. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js +23 -0
  303. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
  304. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +24 -0
  305. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +20 -2
  307. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  311. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  312. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
  313. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
  314. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
  315. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
  316. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
  317. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
  318. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
  319. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
  320. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
  321. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  322. package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
  323. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  324. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  325. package/node_modules/@earendil-works/pi-telemetry/README.md +6 -3
  326. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  327. package/node_modules/@earendil-works/pi-tui/README.md +5 -4
  328. package/node_modules/@earendil-works/pi-tui/native/darwin/README.md +2 -2
  329. package/node_modules/@earendil-works/pi-tui/native/win32/README.md +2 -2
  330. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  331. package/package.json +7 -7
@@ -0,0 +1,71 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const BUN_SKILL_BASE_DIR = dirname(fileURLToPath(import.meta.url));
6
+
7
+ let loggedMissingBunSkill = false;
8
+
9
+ export const BUN_SKILL_MIN_VERSION = "1.4.0";
10
+
11
+ /** Reads the js eval kernel's bun version; undefined on a node kernel. */
12
+ export type BunKernelVersionSource = () => string | undefined;
13
+
14
+ const kernelBunVersion: BunKernelVersionSource = () => process.versions.bun;
15
+
16
+ /**
17
+ * True when the version is at least `BUN_SKILL_MIN_VERSION`: parses the leading
18
+ * `<major>.<minor>` integers of the string and gates on major > 1 || (major === 1 && minor >= 4).
19
+ * Unparseable or missing versions never enable the skill.
20
+ */
21
+ export function bunVersionSupportsSkill(version: string | undefined): boolean {
22
+ if (version === undefined) return false;
23
+ const match = /^(\d+)\.(\d+)/.exec(version);
24
+ if (match === null) return false;
25
+ const major = Number.parseInt(match[1]!, 10);
26
+ const minor = Number.parseInt(match[2]!, 10);
27
+ return major > 1 || (major === 1 && minor >= 4);
28
+ }
29
+
30
+ /** Absolute path of the bundled bun-1-4 SKILL.md, or undefined (logged once) when it is not shipped. */
31
+ export function bundledBunSkillPath(baseDir: string = BUN_SKILL_BASE_DIR): string | undefined {
32
+ const candidate = join(baseDir, "..", "skill", "bun-1-4", "SKILL.md");
33
+ if (existsSync(candidate)) return candidate;
34
+ if (!loggedMissingBunSkill) {
35
+ loggedMissingBunSkill = true;
36
+ console.debug(`[senpi-codemode] bundled bun-1-4 skill not found at ${candidate}; skipping contribution`);
37
+ }
38
+ return undefined;
39
+ }
40
+
41
+ /**
42
+ * Builds the `resources_discover` handler that contributes the bundled bun-1-4 skill
43
+ * only when the in-process js eval kernel itself runs bun >= 1.4 (`process.versions.bun`).
44
+ * A node kernel never receives the skill, regardless of any bun binary on PATH.
45
+ */
46
+ export function createBunSkillDiscoverHandler(
47
+ getKernelBunVersion: BunKernelVersionSource = kernelBunVersion,
48
+ baseDir?: string,
49
+ ): () => { skillPaths: string[] } | undefined {
50
+ return () => {
51
+ if (!bunVersionSupportsSkill(getKernelBunVersion())) return undefined;
52
+ const skillPath = bundledBunSkillPath(baseDir);
53
+ return skillPath === undefined ? undefined : { skillPaths: [skillPath] };
54
+ };
55
+ }
56
+
57
+ export function registerBunSkillContribution(
58
+ pi: {
59
+ on(
60
+ event: "resources_discover",
61
+ handler: (
62
+ event: unknown,
63
+ ctx: unknown,
64
+ ) => Promise<{ skillPaths?: string[] } | undefined> | { skillPaths?: string[] } | undefined,
65
+ ): void;
66
+ },
67
+ getKernelBunVersion?: BunKernelVersionSource,
68
+ baseDir?: string,
69
+ ): void {
70
+ pi.on("resources_discover", createBunSkillDiscoverHandler(getKernelBunVersion, baseDir));
71
+ }
@@ -16,6 +16,7 @@ import {
16
16
  import { jsRuntimeInfo, jsRuntimeLabel } from "./extension/runtime-info.ts";
17
17
  import type { CodemodeSessionManager, CreateCodemodeSessionManagerOptions } from "./extension/session-manager.ts";
18
18
  import { SessionManagerProxy } from "./extension/session-manager-proxy.ts";
19
+ import { registerBunSkillContribution } from "./extension/skill-contribution.ts";
19
20
  import { WAKE_SOURCE_STATE_EVENT, type WakeSourceState } from "./extension/wake-source-state.ts";
20
21
  import { EvalDetachedCellManager, type EvalDetachedCellStatusEntry } from "./tool/detached-cell-manager.ts";
21
22
  import {
@@ -40,7 +41,7 @@ type CodemodeEvent = SessionLifecycleEvent | "model_select";
40
41
  export interface CodemodeExtensionAPI {
41
42
  registerTool(tool: ReturnType<typeof createEvalTool>): void;
42
43
  registerRemovedToolHint(name: string, hint: string): void;
43
- on(event: CodemodeEvent, handler: (event: unknown, ctx: ExtensionContext) => Promise<void> | void): void;
44
+ on(event: CodemodeEvent | "resources_discover", handler: (event: unknown, ctx: ExtensionContext) => unknown): void;
44
45
  executeTool: AgentExecuteTool;
45
46
  getActiveTools(): string[];
46
47
  getAllTools(): readonly EvalSchemaToolInfo[];
@@ -168,6 +169,7 @@ export default function senpiCodemode(pi: CodemodeExtensionAPI, options: SenpiCo
168
169
  "wait",
169
170
  'wait was removed; detached eval cells notify when complete. Use eval({ action: "peek"|"stop", cell_id }) to inspect or stop one.',
170
171
  );
172
+ registerBunSkillContribution(pi);
171
173
 
172
174
  pi.on("session_start", async (event, ctx) => {
173
175
  const previousCells = activeCells;
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: bun-1-4
3
+ description: "MUST USE whenever writing or running JavaScript/TypeScript with Bun — including JS through the eval tool, bun -e one-liners, scratch scripts, servers, CLIs, tests, bundling, or package management. Bun 1.4 replaced 15+ npm deps with builtins: consult BEFORE npm-installing sharp, puppeteer/playwright (scraping), marked, node-cron, node-pty, concurrently, serve-static, tar, json5, fast-xml-parser, string-width — Bun ships it. Triggers: bun, Bun.serve, bun test, bun build, bun install, bun run, JS 스크립트, 번들링, 이미지 리사이즈, 헤드리스 브라우저, 크론, PTY, eval js."
4
+ ---
5
+
6
+ # Bun 1.4 — Use the Builtins First
7
+
8
+ Bun 1.4 (2026) ships builtins that replace most utility npm packages. **Before adding a dependency or writing a workaround, check the capability map below — if Bun ships it, use the builtin.** This skill is loaded because this session's `eval` js kernel runs Bun >= 1.4; on other machines or pinned projects, confirm with `bun --version` ([v1.3.x]/[v1.4.0] tags in the references give exact minimums). Release post: <https://bun.com/blog/bun-v1.4>
9
+
10
+ ## Capability map — what you can do now
11
+
12
+ | You want to... | Use | Replaces | Ref = `references/<name>.md` |
13
+ |---|---|---|---|
14
+ | Resize/convert/rotate images | `Bun.file(p).image().resize().webp().write()` | sharp | runtime-apis |
15
+ | Headless browser: navigate, click, screenshot, evaluate, CDP | `new Bun.WebView()` | puppeteer, playwright (scraping) | runtime-apis |
16
+ | Markdown → HTML / React / ANSI | `Bun.markdown.html() / .react() / .render()` | marked, react-markdown | runtime-apis |
17
+ | Schedule cron jobs | `Bun.cron()` | node-cron | runtime-apis |
18
+ | Drive a PTY (bash, vim, TUIs) from JS | `Bun.spawn([...], { terminal })` | node-pty | runtime-apis |
19
+ | Run package scripts concurrently, glob-matched | `bun run --parallel "build:*"` | concurrently, npm-run-all | runtime-apis |
20
+ | Parse JSON5 / JSONL / JSONC / XML / TOML; tarballs | `Bun.JSON5/.JSONL/.JSONC/.XML/.TOML`, `Bun.Archive` | json5, ndjson, jsonc-parser, fast-xml-parser, @iarna/toml, tar | runtime-apis |
21
+ | ANSI-aware terminal text: width, slice, wrap | `Bun.stringWidth()`, `Bun.sliceAnsi()`, `Bun.wrapAnsi()` | string-width, slice-ansi, wrap-ansi | runtime-apis |
22
+ | Call C libraries 3x faster, plain strings back | `bun:ffi` (`buffer_length`, `cstring`) | — | runtime-apis |
23
+ | Serve a static dir (ETag/Range/304 handled) | `Bun.serve({ routes: { "/x/*": { dir } } })` | express.static, serve-static, sirv | http-networking |
24
+ | HTTP/3 server; `fetch` protocol/compress/proxy | `http3: true`, `fetch(url, { protocol, compress, proxy })` | — | http-networking |
25
+ | Tests across CPU workers / CI shards / changed files / flaky retry | `bun test --parallel --shard=1/3 --changed=main --retry` | jest/vitest infra | test |
26
+ | Kill "passes alone, fails in suite" bugs | `bun test --isolate` | vitest default behavior | test |
27
+ | React Compiler auto-memoization | `bun build --react-compiler` | babel-plugin-react-compiler | build |
28
+ | Embed assets/dirs into a single-file executable | `bun build --compile --asset ./public` | pkg hacks | build |
29
+ | Compile-time feature flags, in-memory bundling, metafile | `bun:bundle feature()`, `files:{}`, `metafile: true` | esbuild define/plugins | build |
30
+ | Diff package versions, fix vulns, dedupe/prune, license audit | `bun pm diff`, `bun audit fix`, `bun dedupe`, `bun prune`, `bun pm licenses` | npm-diff, npm audit fix | install |
31
+ | 7x faster CI installs (global virtual store) | `linker = "isolated"` in bunfig.toml | pnpm store | install |
32
+ | Profile CPU/heap/bundle as grep-able Markdown | `bun --cpu-prof-md`, `--heap-prof-md`, `bun build --metafile-md` | Chrome DevTools round-trip | dev-tooling |
33
+ | Native REPL; render Markdown in terminal | `bun repl`, `bun ./README.md` | node repl, glow | runtime-apis |
34
+ | Run Playwright, vitest, Next.js 16, OpenTelemetry, dd-trace | they now just work | Node.js | node-compat-platforms |
35
+
36
+ Free wins (no code change): 2x lower CPU, 13-48% less server memory, 2-2.5x faster startup — full numbers in [performance](references/performance.md).
37
+
38
+ ## Operating rules
39
+
40
+ 1. **Eval-first.** The `eval` js kernel runs on Bun (that is why this skill is present): call `Bun.*` APIs directly inside js cells. Reach for `bash` or a spawned `bun <file>` / `bun -e` only for CLI surfaces (`bun test`, `bun build`, `bun pm`) or work that needs a separate process.
41
+ 2. **Builtin-first.** The Replaces column above is a ban list for new dependencies, in production code, test helpers, and one-off scripts alike.
42
+ 3. **Read the matching reference before using an unfamiliar API** — signatures and caveats (e.g. `Bun.markdown` HTML is unsanitized, HTTP/3 is experimental) live there, not here.
43
+ 4. **Upgrading a project to 1.4 or debugging behavior that changed?** Read [breaking-changes](references/breaking-changes.md) first — YAML/TOML strictness, `.xml`/`.css` import semantics, `Bun.$` globbing, fetch header combining, and WebSocket close timing all changed.
44
+ 5. **TLS errors after upgrade are usually intentional** — 1.4 tightened certificate verification across `fetch`, `tls.connect`, `Bun.connect`, `RedisClient`. See [security](references/security.md) before loosening anything.
@@ -0,0 +1,75 @@
1
+ # Upgrading to Bun 1.4 — Behavior Changes
2
+
3
+ Blog: [#upgrading-to-1-4](https://bun.com/blog/bun-v1.4#upgrading-to-1-4). Most code is unaffected. Scan the Top 5, then the table for whatever subsystem you touched.
4
+
5
+ ## Top 5 most likely to bite
6
+
7
+ 1. **Node.js 26**: `NODE_MODULE_VERSION` is 147 (native addons need a 147 build); `res.writeHeader()` removed → use `res.writeHead()`; paused-mode `readable.read()` returns ONE chunk → loop until `null`.
8
+ 2. **New monorepos default to the isolated linker** (`configVersion: 1`). Existing lockfiles keep hoisted. Opt out: `linker = "hoisted"` in bunfig.toml.
9
+ 3. **Bun invoked as `node`** (`bun --bun`, `bunx --bun`, node symlink) no longer loads `.env` files. Pass `--env-file` to keep them.
10
+ 4. **`Bun.YAML` is YAML 1.2**: `yes`/`no`/`on`/`off` are strings. GitHub Actions `on:` parses as `"on"`.
11
+ 5. **`Bun.TOML` / `bunfig.toml` are strict**: unquoted strings, missing newlines, ints past `MAX_SAFE_INTEGER` → `SyntaxError` at startup. Quote your values.
12
+
13
+ ## Module resolution / loaders
14
+
15
+ | Change | Migration |
16
+ |---|---|
17
+ | `.xml` imports return the parsed document (was: file path) | `--loader .xml:file` to keep the path |
18
+ | `.css` imports at runtime export `{}` (was: absolute path) | — |
19
+ | `import "."` / `".."` resolve as directories (index/main), matching Node | name the sibling file explicitly |
20
+ | `"jsx": "react-jsx"` emits `jsx` (was: `jsxDEV` unless production) | use `"react-jsxdev"` for the dev runtime |
21
+ | `useDefineForClassFields: false` now honored like tsc | remove the option to keep old output |
22
+
23
+ ## Bun APIs
24
+
25
+ | Change | Migration |
26
+ |---|---|
27
+ | `Bun.$` globs only patterns written in the template — `${...}` interpolated globs are literal | write the pattern in the template: `` $`echo **/*` `` |
28
+ | `Bun.cron.parse()` / in-process `Bun.cron()` use LOCAL time (was UTC) | pass `{ tz: "UTC" }` |
29
+ | `Bun.Socket#setKeepAlive(true, delay)`: `delay` is milliseconds now | pass ms, not seconds |
30
+ | `Bun.mmap({ offset })`: view starts at `offset` exactly (was page-rounded) | remove `offset % pageSize` compensation |
31
+ | `bun:ffi`: `cstring` values are plain strings; `CString` has no `.ptr` | keep the original pointer to free |
32
+ | `Bun.serve({ inspector })` removed | `bun --inspect` |
33
+ | `server.publish()`/`ws.publish()` return `0` (dropped) / `-1` (backpressure) | treat 0/-1 specially |
34
+ | `server.stop()` waits for in-flight requests, closes idle connections | `stop(true)` to force |
35
+ | `Bun.sql`: MySQL `DATETIME`/`TIMESTAMP` decoded as UTC; MariaDB 10.5+ JSON columns parsed to objects | remove offset corrections and `JSON.parse()` calls |
36
+ | `Bun.randomUUIDv7()`, `Bun.udpSocket()`, `Bun.password`, `Bun.spawn` timeout/killSignal/argv0 | invalid inputs now throw instead of silently clamping |
37
+
38
+ ## fetch / WebSocket / HTTP
39
+
40
+ | Change | Migration |
41
+ |---|---|
42
+ | Duplicate headers combined with `, ` per Fetch spec (was: last wins) | parse combined values |
43
+ | `clone()` throws after body read (`Body is disturbed or locked`) | clone BEFORE reading |
44
+ | Network errors are `TypeError` (`.code` still set); failed body read sets `bodyUsed` | retry with a NEW fetch() |
45
+ | `redirect: "error"` rejects only on 301/302/303/307/308 (304 resolves now) | — |
46
+ | global `WebSocket` no longer accepts `agent` (ws module's does) | import from "ws" |
47
+ | `WebSocket#close()` queues the close event — `readyState` is CLOSING when it returns | await the `close` event |
48
+ | `close()`/`ping()`/`pong()` validate codes/reason/payload sizes | shorten/fix values |
49
+ | Handshake fails (1002) when requested subprotocol isn't negotiated | fix server echo or drop `protocols` |
50
+
51
+ ## node: modules
52
+
53
+ | Change | Migration |
54
+ |---|---|
55
+ | `fs.rmdir` rejects `{ recursive: true }` | `fs.rm(path, { recursive: true, force: true })` |
56
+ | `dns.lookup()` uses the system resolver (getaddrinfo) on Linux — split-DNS/VPN names now resolve | `Bun.dns.lookup(name, { backend: "c-ares" })` for old behavior |
57
+ | fs/dns/pbkdf2 callback exceptions are `uncaughtException` (was unhandledRejection) | move the handler |
58
+ | `dgram`: second `bind()` and post-`close()` calls throw synchronously | try/catch |
59
+ | `tls.createServer({ requestCert: true })` rejects unverified client certs by default | `rejectUnauthorized: false` to admit them |
60
+ | `X509Certificate` serial/modulus are UPPERCASE hex | normalize case when pinning |
61
+ | `child_process.spawn()` ignores `options.encoding` (always Buffers) | `child.stdout.setEncoding()` |
62
+ | `process.title` defaults to `argv[0]`; warnings print as `(node:PID) [CODE] ...` | — |
63
+
64
+ ## bun test
65
+
66
+ - `jest.resetAllMocks()` drops implementations (matches Jest) — use `clearAllMocks()` for history-only.
67
+ - `toContain()` uses `===` (not `Object.is`); `toEqual()` compares Temporal by value.
68
+
69
+ ## Misc
70
+
71
+ - x64 builds are baseline-only (no more separate haswell build; `-baseline` URLs still work).
72
+ - `Temporal` defined by default (`BUN_JSC_useTemporal=0` to disable).
73
+ - `bun.lock` is `lockfileVersion: 2`; nested/version-scoped overrides produce v3 (older Bun can't read v3).
74
+ - `bun feedback` removed; `Bun.password.hash()` argon2 requires `memoryCost >= 8`.
75
+ - Full exhaustive list: [Other behavior changes](https://bun.com/blog/bun-v1.4#other-behavior-changes) and the [Changelog](https://bun.com/blog/bun-v1.4#changelog).
@@ -0,0 +1,114 @@
1
+ # bun build / Bun.build() in 1.4
2
+
3
+ ## Built-in React Compiler [v1.4.0]
4
+
5
+ Blog: [#built-in-react-compiler](https://bun.com/blog/bun-v1.4#built-in-react-compiler)
6
+
7
+ ```ts
8
+ await Bun.build({ entrypoints: ["./src/index.tsx"], outdir: "./dist", reactCompiler: true });
9
+ // or: bun build --react-compiler
10
+ ```
11
+
12
+ React's auto-memoization compiler runs inside Bun's parser — no Babel/SWC round-trip. On ~860 components: +71ms build cost, ~20x faster than the Babel plugin (9.15s); full `--compile` build 3.6x faster.
13
+
14
+ ## Barrel import optimization [v1.3.10]
15
+
16
+ Blog: [#barrel-import-optimization](https://bun.com/blog/bun-v1.4#barrel-import-optimization)
17
+
18
+ ```ts
19
+ await Bun.build({ entrypoints: ["./src/index.tsx"], optimizeImports: ["antd", "@mui/material"] });
20
+ ```
21
+
22
+ `import { Button } from "antd"` skips the hundreds of files behind names you didn't import. Automatic for packages with `"sideEffects": false`; opt others in with `optimizeImports`.
23
+
24
+ ## Compile-time feature flags: bun:bundle [v1.3.5]
25
+
26
+ Blog: [#compile-time-feature-flags-with-bun-bundle](https://bun.com/blog/bun-v1.4#compile-time-feature-flags-with-bun-bundle)
27
+
28
+ ```ts
29
+ import { feature } from "bun:bundle";
30
+ if (feature("SUPER_SECRET")) { console.log("enabled"); }
31
+ // bun build --feature=SUPER_SECRET index.ts (also works in bun run and bun test)
32
+ // Bun.build({ features: ["SUPER_SECRET"] })
33
+ ```
34
+
35
+ Becomes `true`/`false` at build time; dead branch removed.
36
+
37
+ ## In-memory files [v1.3.6]
38
+
39
+ Blog: [#in-memory-files-in-bun-build](https://bun.com/blog/bun-v1.4#in-memory-files-in-bun-build)
40
+
41
+ ```ts
42
+ await Bun.build({
43
+ entrypoints: ["/app/index.ts"],
44
+ files: {
45
+ "/app/index.ts": `import { greet } from "./greet.ts"; console.log(greet("World"));`,
46
+ "/app/greet.ts": `export function greet(n: string) { return "Hello, " + n; }`,
47
+ },
48
+ });
49
+ ```
50
+
51
+ Strings, Blobs, or TypedArrays; virtual paths override disk. Ideal for codegen and stubbing modules in tests.
52
+
53
+ ## Single-file HTML [v1.3.10]
54
+
55
+ Blog: [#single-file-html-with-compile-target-browser](https://bun.com/blog/bun-v1.4#single-file-html-with-compile-target-browser)
56
+
57
+ ```bash
58
+ bun build ./index.html --compile --target=browser --outdir=dist
59
+ # → dist/index.html — every script/stylesheet/asset inlined, opens from file://
60
+ ```
61
+
62
+ ## --asset: embed files/dirs into executables [v1.4.0]
63
+
64
+ Blog: [#asset](https://bun.com/blog/bun-v1.4#asset)
65
+
66
+ ```bash
67
+ bun build ./build/index.js --compile \
68
+ --asset ./build/client --asset ./build/prerendered \
69
+ --outfile server
70
+ ./server # every route + static asset served from the binary
71
+ ```
72
+
73
+ Keeps original filenames; `path.join(import.meta.dir, ...)` works. `node:fs` treats `/$bunfs/` as a real tree (`existsSync`, `readdirSync` recursive/withFileTypes, ...), so static-file servers run unmodified inside the binary.
74
+
75
+ ## Bytecode for ES modules [v1.3.9]
76
+
77
+ Blog: [#bytecode-compilation-for-es-modules](https://bun.com/blog/bun-v1.4#bytecode-compilation-for-es-modules)
78
+
79
+ `--bytecode --format=esm` (requires `--compile`) enables top-level await, `import.meta`, dynamic imports, and code splitting in bytecode-compiled binaries (previously CJS-only).
80
+
81
+ ## metafile: true and --metafile-md [v1.3.6 / v1.3.8]
82
+
83
+ Blog: [#metafile-true](https://bun.com/blog/bun-v1.4#metafile-true), [#metafile-md](https://bun.com/blog/bun-v1.4#metafile-md)
84
+
85
+ ```ts
86
+ const result = await Bun.build({ entrypoints: ["./index.js"], metafile: true });
87
+ result.metafile.inputs; result.metafile.outputs; // esbuild metafile format — works with esbuild.github.io/analyze
88
+ ```
89
+
90
+ ```bash
91
+ bun build entry.js --metafile-md=analysis.md --outdir=dist # Markdown bundle report: largest modules,
92
+ # per-entry breakdowns, dependency chains — grep it or hand to an LLM
93
+ ```
94
+
95
+ ## Standard TC39 decorators [v1.3.10]
96
+
97
+ Blog: [#standard-tc39-decorators](https://bun.com/blog/bun-v1.4#standard-tc39-decorators)
98
+
99
+ ```ts
100
+ function logged(value, { kind, name }) {
101
+ if (kind === "method") return function (...args) { console.log(`calling ${name}`); return value.call(this, ...args); };
102
+ }
103
+ class C { @logged greet() {} }
104
+ ```
105
+
106
+ Active when `experimentalDecorators` is off in tsconfig. Classes, methods, fields, accessors, private members; passes esbuild's decorator test suite.
107
+
108
+ ## Code splitting: 14x faster on huge graphs [v1.4.0]
109
+
110
+ Reachability walk is now BFS O(V+E); a 20,000-module DAG links in 320ms (was 4.65s). Tree-shaking/TLA/CSS-order passes use explicit stacks, so linear chains of thousands of modules link without stack growth.
111
+
112
+ ## Compile gotcha (v1.3.4 change)
113
+
114
+ `bun build --compile` binaries no longer auto-load `tsconfig.json` / `package.json` from the runtime cwd. Opt back in with `--compile-autoload-tsconfig` / `--compile-autoload-package-json`. `.env` and `bunfig.toml` still auto-load.
@@ -0,0 +1,34 @@
1
+ # Bun 1.4 Dev Tooling & Observability
2
+
3
+ Blog: [#dev-tooling](https://bun.com/blog/bun-v1.4#dev-tooling), [#observability](https://bun.com/blog/bun-v1.4#observability)
4
+
5
+ ## Markdown profilers — built for terminals and LLMs
6
+
7
+ ```bash
8
+ bun --cpu-prof-md ./app.ts # CPU profile as Markdown: hot functions by self time,
9
+ # call tree, who-calls-whom. grep it, paste into a bug or an LLM.
10
+ bun --heap-prof-md ./app.ts # heap profile as Markdown: total size, types by retained size,
11
+ # largest objects, retention chains. Includes grep recipes in the header.
12
+ bun build ./src/index.ts --outdir ./dist --metafile-md=./dist/meta.md # bundle-size analysis as Markdown
13
+ ```
14
+
15
+ - `bun --cpu-prof` / `--heap-prof` still write `.cpuprofile` / V8-compatible `.heapsnapshot` for Chrome DevTools / VS Code.
16
+ - `BUN_CPU_PROFILE=1` turns on the CPU profiler for a process you cannot pass flags to (e.g. a framework-spawned worker).
17
+ - **Agent workflow: when a Bun process is slow or leaking, run the `-md` variants and read the report directly — no DevTools round-trip.**
18
+
19
+ ## Async stack traces [v1.4.0]
20
+
21
+ Errors from async native APIs (`fs.promises`, `Bun.file()`, S3, DNS, crypto, `fetch`) point at the `await` in your code, not native frames.
22
+
23
+ ## Process lifetime & env flags
24
+
25
+ ```bash
26
+ bun --no-orphans app.ts # exit when parent dies; SIGKILL every descendant on exit (Linux/macOS/Windows)
27
+ bun --no-env-file app.ts # skip automatic .env loading (or env = false in bunfig.toml) — use in prod/CI
28
+ ```
29
+
30
+ ## APM / tracing works now
31
+
32
+ - **`node:inspector`**: a `Session` can start/stop CPU profiles while the app runs (`Profiler.start`/`Profiler.stop`).
33
+ - **Datadog**: `dd-trace` traces requests; `@datadog/pprof` profiles continuously (required V8 C++ APIs implemented).
34
+ - **OpenTelemetry**: `@opentelemetry/instrumentation-http` and `-fs` export spans; `shimmer` and `require-in-the-middle` can patch bundled code.
@@ -0,0 +1,113 @@
1
+ # Bun 1.4 HTTP & Networking
2
+
3
+ ## Serve files & folders (replaces express.static, serve-static, sirv) [v1.4.0]
4
+
5
+ Docs: <https://bun.com/docs/runtime/http/routing> · Blog: [#serve-files-folders](https://bun.com/blog/bun-v1.4#serve-files-folders)
6
+
7
+ ```ts
8
+ Bun.serve({
9
+ routes: {
10
+ "/static/*": { dir: "./public" },
11
+ },
12
+ });
13
+ ```
14
+
15
+ - Files stream with `sendfile`; `Content-Type`, `ETag`, `Last-Modified`, `304`, and `Range` handled automatically; `index.html` served for directories.
16
+ - Path traversal is blocked: paths normalized, and on Linux files open with `openat2` + `O_RESOLVE_BENEATH` so symlinks can't escape the directory.
17
+
18
+ ## Range and conditional requests [v1.3.13, improved v1.4.0]
19
+
20
+ Blog: [#range-and-conditional-requests](https://bun.com/blog/bun-v1.4#range-and-conditional-requests)
21
+
22
+ ```ts
23
+ Bun.serve({
24
+ routes: { "/video.mp4": new Response(Bun.file("./video.mp4")) },
25
+ });
26
+ // curl -H 'Range: bytes=0-1023' → 206 Partial Content
27
+ // curl -H 'If-None-Match: "..."' → 304 Not Modified
28
+ ```
29
+
30
+ Static routes and `Bun.file()` bodies handle `Range` (206), `If-None-Match`/`If-Modified-Since` (304), `If-Match`/`If-Unmodified-Since` (412). Video seeking and resumable downloads work out of the box.
31
+
32
+ ## HTTP/3 in Bun.serve() — EXPERIMENTAL [v1.3.14, improved v1.4.0]
33
+
34
+ Docs: <https://bun.com/docs/runtime/http/server> · Blog: [#http-3-in-bun-serve-experimental](https://bun.com/blog/bun-v1.4#http-3-in-bun-serve-experimental)
35
+
36
+ ```ts
37
+ Bun.serve({
38
+ port: 443,
39
+ tls: { /* cert, key */ },
40
+ http3: true, // also listen on UDP/443
41
+ // h1: false, // optional: HTTP/3 only
42
+ fetch(req) { return new Response("hi"); },
43
+ });
44
+ ```
45
+
46
+ - HTTP/1.1 keeps working over TCP; `Alt-Svc` header advertises H3 so browsers upgrade themselves. 2.7x faster than HTTPS/1.1 on static routes.
47
+ - **Do not ship `http3: true` to production yet**: 0-RTT resumption disabled, `server.upgrade()` returns `false` over H3, `unix:` sockets skip the H3 listener.
48
+
49
+ ## HTTP/2 & HTTP/3 in fetch() — EXPERIMENTAL [v1.3.14, improved v1.4.0]
50
+
51
+ Blog: [#http-2-http-3-in-fetch-experimental](https://bun.com/blog/bun-v1.4#http-2-http-3-in-fetch-experimental)
52
+
53
+ ```ts
54
+ const [a, b] = await Promise.all([
55
+ fetch(url1, { protocol: "http2" }), // concurrent same-origin requests share one connection
56
+ fetch(url2, { protocol: "http2" }),
57
+ ]);
58
+ const res = await fetch(url3, { protocol: "http3" });
59
+ ```
60
+
61
+ - Redirects, decompression, streaming behave as over HTTP/1.1.
62
+ - Global opt-in: `BUN_FEATURE_FLAG_EXPERIMENTAL_HTTP2_CLIENT=1` or `--experimental-http3-fetch` (Bun remembers per-origin H3 support).
63
+
64
+ ## fetch() request compression [v1.4.0]
65
+
66
+ Blog: [#fetch-request-compression](https://bun.com/blog/bun-v1.4#fetch-request-compression)
67
+
68
+ ```ts
69
+ await fetch(url, {
70
+ method: "POST",
71
+ body: largeJsonString,
72
+ compress: "gzip", // or true, "deflate", "br", "zstd", { encoding, level }
73
+ });
74
+ ```
75
+
76
+ Buffered bodies (string, ArrayBuffer, TypedArray, Blob) are compressed and `Content-Encoding`/`Content-Length` set automatically; streaming bodies pass through unchanged.
77
+
78
+ ## fetch() proxy headers [v1.3.4]
79
+
80
+ Blog: [#fetch-proxy-headers](https://bun.com/blog/bun-v1.4#fetch-proxy-headers)
81
+
82
+ ```ts
83
+ await fetch(url, {
84
+ proxy: {
85
+ url: "http://proxy.example.com:8080",
86
+ headers: { "Proxy-Authorization": "Bearer token" },
87
+ },
88
+ });
89
+ ```
90
+
91
+ ## TLS session resumption + connection reuse [v1.3.10-v1.4.0]
92
+
93
+ Blog: [#tls-session-resumption](https://bun.com/blog/bun-v1.4#tls-session-resumption), [#connection-reuse](https://bun.com/blog/bun-v1.4#connection-reuse)
94
+
95
+ - Second cold connection to an origin resumes at 1 RTT (32-entry per-origin LRU of BoringSSL client sessions).
96
+ - `fetch()` reuses connections through HTTPS proxies and for requests with custom TLS options (client cert, custom CA). No code change needed.
97
+
98
+ ## HTML routes: sourcemaps off in production [v1.4.0]
99
+
100
+ Blog: [#html-routes-sourcemaps-disabled-in-production](https://bun.com/blog/bun-v1.4#html-routes-sourcemaps-disabled-in-production)
101
+
102
+ Production `Bun.serve` no longer serves sourcemaps for HTML routes (dev mode still does). Override in `bunfig.toml`:
103
+
104
+ ```toml
105
+ [serve.static]
106
+ sourcemap = "linked"
107
+ ```
108
+
109
+ ## Server lifecycle changes worth knowing (v1.4)
110
+
111
+ - `server.stop()` now closes idle keep-alive connections immediately, waits for in-flight responses, and resolves when the last connection closes. `server.stop(true)` force-closes stalled ones.
112
+ - `server.publish()` / `ws.publish()` return `0` (dropped/no subscribers) or `-1` (backpressure) instead of always the byte count.
113
+ - Per-method route objects (`{ GET }`) answer `HEAD` with the GET handler automatically.
@@ -0,0 +1,93 @@
1
+ # bun install & package management in 1.4
2
+
3
+ ## Global virtual store: up to 7x faster installs [v1.3.14]
4
+
5
+ Blog: [#global-virtual-store-up-to-7x-faster-installs](https://bun.com/blog/bun-v1.4#global-virtual-store-up-to-7x-faster-installs)
6
+
7
+ ```toml
8
+ # bunfig.toml
9
+ [install]
10
+ linker = "isolated"
11
+ ```
12
+
13
+ With the isolated linker, packages extract once into Bun's global cache and are symlinked into `node_modules/.bun/` (one `symlink()` per package instead of one `clonefileat()`). Warm-cache CI installs of 1,400 packages: 7x faster. Opt-in for existing projects; **new monorepos default to isolated** (see below).
14
+
15
+ ## New subcommands [v1.4.0]
16
+
17
+ Blog anchors: [#bun-pm-diff](https://bun.com/blog/bun-v1.4#bun-pm-diff), [#bun-audit-fix](https://bun.com/blog/bun-v1.4#bun-audit-fix), [#bun-dedupe](https://bun.com/blog/bun-v1.4#bun-dedupe), [#bun-prune](https://bun.com/blog/bun-v1.4#bun-prune), [#bun-pm-licenses](https://bun.com/blog/bun-v1.4#bun-pm-licenses)
18
+
19
+ ```bash
20
+ bun pm diff react # lockfile version → latest; un-minifies before diffing;
21
+ bun pm diff react@18.2.0 19.0.0 # summary flags new install scripts + new child_process/fs/net/vm imports
22
+ bun pm diff ./vendored-pkg pkg@2.1.0
23
+
24
+ bun audit fix # upgrade vulnerable packages to safe versions; --latest allows majors; --dry-run
25
+ bun dedupe # collapse duplicate versions in bun.lock; --check fails CI on dupes
26
+ bun prune --production # delete node_modules entries not in bun.lock; --production drops devDeps
27
+ bun pm licenses --prod --json # dependency license inventory
28
+ ```
29
+
30
+ Docker pattern: build with devDeps, ship without:
31
+
32
+ ```dockerfile
33
+ RUN bun install --frozen-lockfile
34
+ COPY . .
35
+ RUN bun run build
36
+ RUN bun prune --production
37
+ ```
38
+
39
+ ## bun update: transitive + patterns [v1.4.0]
40
+
41
+ Blog: [#bun-update-updates-transitive-dependencies](https://bun.com/blog/bun-v1.4#bun-update-updates-transitive-dependencies)
42
+
43
+ ```bash
44
+ bun update # now updates deps-of-deps too
45
+ bun update zod # updates zod everywhere it appears
46
+ bun update '@types/*' --latest
47
+ ```
48
+
49
+ `bun update <name>` errors (exit 1) if nothing depends on it (no longer silently adds).
50
+
51
+ ## Monorepo: --filter and --catalog [v1.4.0]
52
+
53
+ Blog: [#bun-add-filter](https://bun.com/blog/bun-v1.4#bun-add-filter), [#bun-add-catalog](https://bun.com/blog/bun-v1.4#bun-add-catalog)
54
+
55
+ ```bash
56
+ bun add zod --filter api # add to one workspace from the repo root
57
+ bun run --filter 'web...' build # web + its dependencies; '...web' = its dependents
58
+ bun add react --catalog # add to root catalog, write "catalog:" in the workspace
59
+ ```
60
+
61
+ Plain `bun add x` in a workspace whose default catalog lists `x` writes `catalog:` automatically.
62
+
63
+ ## Nested overrides [v1.4.0]
64
+
65
+ Blog: [#nested-overrides](https://bun.com/blog/bun-v1.4#nested-overrides)
66
+
67
+ ```json
68
+ {
69
+ "overrides": {
70
+ "express": { "qs": "6.13.0" },
71
+ "lodash@<4.17.21": "4.17.21"
72
+ }
73
+ }
74
+ ```
75
+
76
+ npm nested form, yarn `a/b`, pnpm `a>b` all work; overrides can be version-scoped. Lockfiles using these become `lockfileVersion: 3` (older Bun can't read them).
77
+
78
+ ## Supply-chain hardening
79
+
80
+ - **Lockfile integrity** [v1.3.10]: `bun.lock` records SHA-512 for GitHub and tarball deps, like npm packages.
81
+ - **`trustedDependencies` auto-trust is npm-registry-only** [v1.3.5]: a `git:`/`github:`/`file:` package named `esbuild` gets NO trust from the default list — list it yourself. Names match exactly (not by hash).
82
+ - **`nativeDependencies`** [v1.3.2]: for packages shipping prebuilt binaries as per-platform optionalDependencies, Bun links the right binary directly instead of running postinstall. **`ignoreScripts`** skips a package's lifecycle scripts even if trusted.
83
+
84
+ ```json
85
+ { "nativeDependencies": ["esbuild"], "ignoreScripts": ["sharp"] }
86
+ ```
87
+
88
+ ## Defaults changed in 1.4 (see also breaking-changes.md)
89
+
90
+ - New monorepos default to `linker: "isolated"` (`configVersion: 1` in bun.lock). Existing lockfiles keep hoisted. Pin `linker = "hoisted"` to opt out.
91
+ - `bun.lock` is `lockfileVersion: 2`: out-of-registry tarballs need integrity hashes; git entries validated against path traversal. Run `bun install` to migrate.
92
+ - A project's `bunfig.toml` now overrides `.npmrc` for the same key.
93
+ - `bun init` writes `typescript ^7`; non-TTY `bun init` behaves as `-y`.
@@ -0,0 +1,36 @@
1
+ # Node.js Compatibility & Platforms (Bun 1.4)
2
+
3
+ Blog: [#node-js-compatibility](https://bun.com/blog/bun-v1.4#node-js-compatibility), [#platforms](https://bun.com/blog/bun-v1.4#platforms) · Live tracker: <https://bun.com/node-test-suite>
4
+
5
+ Bun 1.4 reports **Node.js 26** (`process.versions.modules` = 147). 3,743 Node test-suite files pass (+1,517 since 1.3). `node:http`, `node:fs`, `node:cluster`, `node:timers`, `node:zlib`, `node:vm`, `node:stream` pass 97% of Node's own tests; `node:quic` 99%; `node:events`, `node:trace_events`, `node:sqlite` 100%.
6
+
7
+ ## Big frameworks/tools that now run on Bun
8
+
9
+ - **Playwright** [v1.4.0]: `connectOverCDP()`, `playwright test` with config, `--ui`, Chromium on Windows.
10
+ - **Next.js 16** [v1.3.2]: `bun --bun next build` works on 16.3 with Turbopack + React Compiler.
11
+ - **vitest** [v1.4.0]: runs under Bun including `--coverage`, threads and forks pools.
12
+ - **OpenTelemetry** [v1.4.0]: http/fs instrumentation export spans; shimmer + require-in-the-middle patch bundled code.
13
+ - **dd-trace** [v1.4.0]: traces + `@datadog/pprof` continuous profiling (V8 C++ APIs implemented).
14
+
15
+ ## Newly working packages
16
+
17
+ Nuxt (`nuxt dev` HMR + DevTools), testcontainers/dockerode (`container.exec()`), https-proxy-agent / socks-proxy-agent, crawlee (proxy-chain), @grpc/grpc-js + ConnectRPC (behind Envoy/ALB), amqplib (RabbitMQ), @aws-sdk/client-s3 streaming uploads, TypeORM (tsconfig decorator settings), nock, Fastify `inject()` / light-my-request, happy-dom, piscina.
18
+
19
+ ## New Node.js APIs in Bun
20
+
21
+ - `worker_threads`: `resourceLimits`, `stdout`, `stderr`, `eval` options.
22
+ - ws: `'upgrade'` and `'unexpected-response'` events.
23
+ - `socket.upgradeTLS({ isServer: true })`: server-side STARTTLS.
24
+ - `node:cluster` shares listening sockets between workers.
25
+ - `node:repl`, `node:trace_events`, `node:domain`: implemented.
26
+
27
+ ## Platforms
28
+
29
+ | Platform | Status |
30
+ |---|---|
31
+ | FreeBSD x86_64/aarch64 [v1.3.14] | Official native builds; full runtime on stock FreeBSD 14.3+ (native port, not Linux compat layer) |
32
+ | Windows ARM64 [v1.3.7] | Native builds (Surface, Snapdragon X, Ampere) |
33
+ | Android aarch64/x64 [v1.4.0] | Experimental builds with every release |
34
+ | Linux glibc 2.17 [v1.3.13] | Minimum dropped from 2.26 — RHEL/CentOS 7, Amazon Linux 1 work; kernel minimum 3.10 (`memfd_create` fallback) |
35
+ | Windows | Sub-15ms timers (no 15.6ms tick rounding); runs in AppContainer; read-only directories OK |
36
+ | TypeScript 7 | `bun init` templates + `@types/bun` are TS7-ready; `bun init` writes `typescript ^7` |
@@ -0,0 +1,33 @@
1
+ # Bun 1.4 Performance
2
+
3
+ Blog: [#production](https://bun.com/blog/bun-v1.4#production), [#faster](https://bun.com/blog/bun-v1.4#faster)
4
+
5
+ All of this is free — no code changes. Use these numbers when justifying a Bun 1.4 upgrade.
6
+
7
+ ## Production footprint
8
+
9
+ - **Allocator unified**: JavaScriptCore now uses mimalloc (extended with partial page clearing, an idle-time scavenger thread, lazy zeroing).
10
+ - **CPU**: Claude Code production CPU dropped 2x (p99 24%→10%, p50 5.8%→2.5%); hello-world idle CPU 5x lower.
11
+ - **Memory under load** (1M requests): fastify −48% (120MB), Express −46% (92MB), node:http −40% (81MB), Elysia −40%, Next.js −28%, Bun.serve −20% (36MB). Next.js App Router SSR that grew unbounded in 1.3 settles at 238MB (Node: 410MB).
12
+ - **Startup**: Windows 15.5ms (2.5x faster, was 39ms; Node 40ms); Linux 5.1ms (2x faster; Node 27.2ms) with peak memory 14.6MB vs Node 44.5MB.
13
+ - **Binary size**: Linux/Windows ~17% smaller (77MB Linux x64).
14
+
15
+ ## Runtime speedups (WebKit pin bumped 39 times = ~8 months of JSC work)
16
+
17
+ | What | Improvement |
18
+ |---|---|
19
+ | `new URL()` | up to 4.6x faster (75ns vs Node 232ns); `url.href` 5ns |
20
+ | RegExp (JSC-vs-V8 gap fixed) | `marked.parse()` 138x faster (912ms→6ms on 80KB); `isbot` 200x faster |
21
+ | `node:zlib` → zlib-ng | decompression ~20% faster across the board; peak memory 25-35MB lower; runtime CPU dispatch |
22
+ | `Buffer.from(str, "hex")` | 8x faster (SIMD); `"base64url"` 46x faster |
23
+ | Source map decoding | 3.1x faster (SIMD); 24x faster than Node on a 9.5MB map |
24
+ | Promises (JSC rewrite) | 1.5-2.4x faster; `await` resolved 84ns; 1M pending promises: 251MB peak (was 668MB), settle 12.5ms (was 39ms) |
25
+
26
+ ## Streams, bodies, backpressure
27
+
28
+ The Production section of the blog also covers stream/body handling and backpressure improvements in `Bun.serve` — notably `server.publish()`/`ws.publish()` now report drops (`0`) and backpressure (`-1`) honestly; see [http-networking](http-networking.md).
29
+
30
+ ## Windows-specific
31
+
32
+ - Timers no longer round to the 15.6ms system tick: `setTimeout(fn, 1)` fires in ~1.4ms.
33
+ - Startup 2.5x faster; runs inside an AppContainer sandbox; works on read-only directories/shares.