@poolzin/pool-bot 2026.1.39 → 2026.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/assets/chrome-extension/README.md +3 -3
  2. package/assets/chrome-extension/background.js +5 -5
  3. package/assets/chrome-extension/manifest.json +3 -3
  4. package/assets/chrome-extension/options.html +4 -4
  5. package/assets/chrome-extension/options.js +1 -1
  6. package/dist/acp/client.js +3 -3
  7. package/dist/acp/types.js +1 -1
  8. package/dist/agents/agent-paths.js +3 -3
  9. package/dist/agents/auth-profiles/paths.js +3 -3
  10. package/dist/agents/cli-runner/helpers.js +1 -1
  11. package/dist/agents/cli-runner.js +2 -2
  12. package/dist/agents/cloudflare-ai-gateway.js +31 -0
  13. package/dist/agents/compaction.js +16 -2
  14. package/dist/agents/context-window-guard.js +13 -10
  15. package/dist/agents/context.js +4 -4
  16. package/dist/agents/docs-path.js +1 -1
  17. package/dist/agents/minimax-vlm.js +1 -1
  18. package/dist/agents/model-auth.js +12 -1
  19. package/dist/agents/model-catalog.js +4 -4
  20. package/dist/agents/model-selection.js +10 -4
  21. package/dist/agents/models-config.js +3 -3
  22. package/dist/agents/models-config.providers.js +147 -39
  23. package/dist/agents/pi-embedded-helpers/openai.js +1 -1
  24. package/dist/agents/pi-embedded-runner/compact.js +8 -8
  25. package/dist/agents/pi-embedded-runner/model.js +2 -2
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
  27. package/dist/agents/pi-embedded-runner/run.js +4 -4
  28. package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
  29. package/dist/agents/pi-embedded-runner/utils.js +1 -1
  30. package/dist/agents/pi-model-discovery.js +10 -0
  31. package/dist/agents/pi-tool-definition-adapter.js +50 -9
  32. package/dist/agents/pi-tools.before-tool-call.js +67 -0
  33. package/dist/agents/pi-tools.js +10 -5
  34. package/dist/agents/pi-tools.read.js +2 -2
  35. package/dist/agents/session-file-repair.js +83 -0
  36. package/dist/agents/session-transcript-repair.js +68 -0
  37. package/dist/agents/skills/frontmatter.js +1 -1
  38. package/dist/agents/skills/workspace.js +2 -2
  39. package/dist/agents/system-prompt.js +28 -4
  40. package/dist/agents/together-models.js +127 -0
  41. package/dist/agents/tool-images.js +1 -1
  42. package/dist/agents/tool-policy.js +1 -1
  43. package/dist/agents/tools/browser-tool.js +3 -3
  44. package/dist/agents/tools/image-tool.js +2 -2
  45. package/dist/agents/tools/memory-tool.js +93 -5
  46. package/dist/agents/tools/web-search.js +1 -1
  47. package/dist/auto-reply/commands-registry.data.js +1 -1
  48. package/dist/auto-reply/reply/commands-context-report.js +2 -2
  49. package/dist/auto-reply/reply/commands-session.js +2 -2
  50. package/dist/auto-reply/reply/get-reply-run.js +14 -4
  51. package/dist/auto-reply/reply/groups.js +1 -1
  52. package/dist/auto-reply/reply/inbound-context.js +4 -0
  53. package/dist/auto-reply/reply/inbound-meta.js +130 -0
  54. package/dist/auto-reply/reply/untrusted-context.js +15 -0
  55. package/dist/auto-reply/status.js +1 -1
  56. package/dist/browser/client-fetch.js +1 -1
  57. package/dist/browser/config.js +1 -1
  58. package/dist/browser/extension-relay.js +3 -3
  59. package/dist/browser/server-context.js +2 -2
  60. package/dist/build-info.json +3 -3
  61. package/dist/canvas-host/a2ui.js +3 -3
  62. package/dist/channels/plugins/catalog.js +2 -2
  63. package/dist/channels/plugins/onboarding/imessage.js +1 -1
  64. package/dist/channels/plugins/onboarding/signal.js +1 -1
  65. package/dist/channels/plugins/onboarding/slack.js +4 -4
  66. package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
  67. package/dist/channels/plugins/pairing-message.js +1 -1
  68. package/dist/cli/browser-cli-extension.js +2 -2
  69. package/dist/cli/docs-cli.js +1 -1
  70. package/dist/cli/gateway-cli/dev.js +1 -1
  71. package/dist/cli/memory-cli.js +25 -15
  72. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  73. package/dist/cli/plugins-cli.js +1 -1
  74. package/dist/cli/run-main.js +2 -2
  75. package/dist/cli/security-cli.js +1 -1
  76. package/dist/cli/tagline.js +1 -1
  77. package/dist/cli/update-cli.js +4 -4
  78. package/dist/cli/webhooks-cli.js +5 -5
  79. package/dist/commands/agents.commands.add.js +1 -1
  80. package/dist/commands/auth-choice.apply.api-providers.js +305 -17
  81. package/dist/commands/auth-choice.apply.js +4 -1
  82. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  83. package/dist/commands/auth-choice.apply.xai.js +63 -0
  84. package/dist/commands/auth-choice.preferred-provider.js +7 -1
  85. package/dist/commands/configure.wizard.js +1 -1
  86. package/dist/commands/dashboard.js +1 -1
  87. package/dist/commands/docs.js +1 -1
  88. package/dist/commands/doctor-gateway-services.js +3 -3
  89. package/dist/commands/doctor-update.js +3 -3
  90. package/dist/commands/doctor.js +1 -1
  91. package/dist/commands/models/list.probe.js +2 -2
  92. package/dist/commands/models/list.registry.js +4 -4
  93. package/dist/commands/models/list.status-command.js +2 -2
  94. package/dist/commands/onboard-auth.config-core.js +366 -28
  95. package/dist/commands/onboard-auth.credentials.js +71 -9
  96. package/dist/commands/onboard-auth.js +3 -3
  97. package/dist/commands/onboard-auth.models.js +26 -24
  98. package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
  99. package/dist/commands/status-all/report-lines.js +1 -1
  100. package/dist/commands/status.command.js +1 -1
  101. package/dist/commands/uninstall.js +3 -3
  102. package/dist/compat/legacy-names.js +1 -1
  103. package/dist/config/io.js +3 -3
  104. package/dist/config/schema.js +1 -1
  105. package/dist/config/types.memory.js +1 -0
  106. package/dist/config/version.js +4 -4
  107. package/dist/daemon/constants.js +7 -7
  108. package/dist/daemon/inspect.js +6 -6
  109. package/dist/daemon/systemd-unit.js +1 -1
  110. package/dist/gateway/live-image-probe.js +1 -66
  111. package/dist/gateway/openai-http.js +2 -2
  112. package/dist/gateway/openresponses-http.js +4 -4
  113. package/dist/gateway/server-discovery.js +2 -2
  114. package/dist/gateway/server-http.js +1 -1
  115. package/dist/gateway/server.impl.js +2 -2
  116. package/dist/hooks/frontmatter.js +1 -1
  117. package/dist/hooks/hooks-status.js +1 -1
  118. package/dist/hooks/install.js +2 -2
  119. package/dist/hooks/loader.js +1 -1
  120. package/dist/hooks/workspace.js +3 -3
  121. package/dist/index.js +2 -2
  122. package/dist/infra/bonjour.js +3 -3
  123. package/dist/infra/path-env.js +3 -3
  124. package/dist/infra/provider-usage.fetch.minimax.js +1 -1
  125. package/dist/infra/restart.js +1 -1
  126. package/dist/infra/tailscale.js +1 -1
  127. package/dist/macos/relay.js +2 -2
  128. package/dist/media/input-files.js +1 -1
  129. package/dist/media/mime.js +4 -0
  130. package/dist/media/png-encode.js +74 -0
  131. package/dist/media-understanding/providers/image.js +2 -2
  132. package/dist/memory/backend-config.js +207 -0
  133. package/dist/memory/embeddings.js +1 -1
  134. package/dist/memory/manager.js +1 -0
  135. package/dist/memory/types.js +1 -0
  136. package/dist/node-host/runner.js +2 -2
  137. package/dist/pairing/pairing-messages.js +1 -1
  138. package/dist/plugins/discovery.js +1 -1
  139. package/dist/plugins/install.js +2 -2
  140. package/dist/plugins/update.js +1 -1
  141. package/dist/security/audit.js +2 -2
  142. package/dist/shared/text/reasoning-tags.js +52 -7
  143. package/dist/tailscale/detect.js +146 -0
  144. package/dist/telegram/bot-message-context.js +1 -1
  145. package/dist/test-helpers/workspace.js +11 -0
  146. package/dist/test-utils/channel-plugins.js +82 -0
  147. package/dist/test-utils/ports.js +73 -0
  148. package/dist/utils/shell-argv.js +61 -0
  149. package/dist/utils.js +10 -0
  150. package/dist/web/qr-image.js +1 -61
  151. package/dist/wizard/onboarding.finalize.js +7 -7
  152. package/dist/wizard/onboarding.js +3 -3
  153. package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
  154. package/docs/_config.yml +2 -2
  155. package/docs/_layouts/default.html +9 -9
  156. package/docs/concepts/typebox.md +1 -1
  157. package/docs/docs.json +1 -1
  158. package/docs/northflank.mdx +7 -7
  159. package/docs/railway.mdx +3 -3
  160. package/docs/render.mdx +5 -5
  161. package/docs/start/lore.md +2 -2
  162. package/extensions/bluebubbles/index.ts +2 -2
  163. package/extensions/bluebubbles/package.json +1 -1
  164. package/extensions/bluebubbles/src/accounts.ts +8 -8
  165. package/extensions/bluebubbles/src/actions.test.ts +22 -22
  166. package/extensions/bluebubbles/src/actions.ts +5 -5
  167. package/extensions/bluebubbles/src/attachments.ts +2 -2
  168. package/extensions/bluebubbles/src/channel.ts +16 -16
  169. package/extensions/bluebubbles/src/chat.ts +2 -2
  170. package/extensions/bluebubbles/src/media-send.ts +2 -2
  171. package/extensions/bluebubbles/src/monitor.test.ts +46 -46
  172. package/extensions/bluebubbles/src/monitor.ts +5 -5
  173. package/extensions/bluebubbles/src/onboarding.ts +7 -7
  174. package/extensions/bluebubbles/src/reactions.ts +2 -2
  175. package/extensions/bluebubbles/src/send.ts +2 -2
  176. package/extensions/copilot-proxy/README.md +1 -1
  177. package/extensions/copilot-proxy/package.json +1 -1
  178. package/extensions/diagnostics-otel/index.ts +2 -2
  179. package/extensions/diagnostics-otel/package.json +1 -1
  180. package/extensions/diagnostics-otel/src/service.ts +3 -3
  181. package/extensions/discord/index.ts +2 -2
  182. package/extensions/discord/package.json +1 -1
  183. package/extensions/google-antigravity-auth/README.md +1 -1
  184. package/extensions/google-antigravity-auth/index.ts +1 -1
  185. package/extensions/google-antigravity-auth/package.json +1 -1
  186. package/extensions/google-gemini-cli-auth/README.md +1 -1
  187. package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
  188. package/extensions/google-gemini-cli-auth/package.json +1 -1
  189. package/extensions/googlechat/index.ts +3 -3
  190. package/extensions/googlechat/package.json +1 -1
  191. package/extensions/googlechat/src/accounts.ts +8 -8
  192. package/extensions/googlechat/src/actions.ts +6 -6
  193. package/extensions/googlechat/src/channel.ts +21 -21
  194. package/extensions/googlechat/src/monitor.ts +8 -8
  195. package/extensions/googlechat/src/onboarding.ts +10 -10
  196. package/extensions/imessage/index.ts +2 -2
  197. package/extensions/imessage/package.json +1 -1
  198. package/extensions/line/index.ts +2 -2
  199. package/extensions/line/package.json +1 -1
  200. package/extensions/line/src/card-command.ts +2 -2
  201. package/extensions/line/src/channel.logout.test.ts +4 -4
  202. package/extensions/line/src/channel.sendPayload.test.ts +8 -8
  203. package/extensions/line/src/channel.ts +3 -3
  204. package/extensions/llm-task/README.md +3 -3
  205. package/extensions/llm-task/index.ts +2 -2
  206. package/extensions/llm-task/package.json +1 -1
  207. package/extensions/llm-task/src/llm-task-tool.ts +4 -4
  208. package/extensions/lobster/README.md +6 -6
  209. package/extensions/lobster/index.ts +2 -2
  210. package/extensions/lobster/src/lobster-tool.test.ts +4 -4
  211. package/extensions/lobster/src/lobster-tool.ts +2 -2
  212. package/extensions/matrix/index.ts +2 -2
  213. package/extensions/matrix/package.json +1 -1
  214. package/extensions/matrix/src/matrix/client/config.ts +1 -1
  215. package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
  216. package/extensions/matrix/src/onboarding.ts +1 -1
  217. package/extensions/mattermost/index.ts +2 -2
  218. package/extensions/mattermost/package.json +1 -1
  219. package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
  220. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
  221. package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
  222. package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
  223. package/extensions/mattermost/src/onboarding.ts +2 -2
  224. package/extensions/memory-core/index.ts +2 -2
  225. package/extensions/memory-core/package.json +1 -1
  226. package/extensions/memory-lancedb/index.ts +3 -3
  227. package/extensions/memory-lancedb/package.json +1 -1
  228. package/extensions/msteams/index.ts +2 -2
  229. package/extensions/msteams/package.json +1 -1
  230. package/extensions/msteams/src/channel.directory.test.ts +2 -2
  231. package/extensions/msteams/src/channel.ts +2 -2
  232. package/extensions/msteams/src/graph-upload.ts +4 -4
  233. package/extensions/msteams/src/monitor-handler.ts +2 -2
  234. package/extensions/msteams/src/monitor.ts +2 -2
  235. package/extensions/msteams/src/onboarding.ts +9 -9
  236. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  237. package/extensions/msteams/src/send-context.ts +2 -2
  238. package/extensions/msteams/src/send.ts +4 -4
  239. package/extensions/nextcloud-talk/index.ts +2 -2
  240. package/extensions/nextcloud-talk/package.json +1 -1
  241. package/extensions/nextcloud-talk/src/channel.ts +7 -7
  242. package/extensions/nextcloud-talk/src/inbound.ts +7 -7
  243. package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
  244. package/extensions/nostr/README.md +2 -2
  245. package/extensions/nostr/index.ts +5 -5
  246. package/extensions/nostr/package.json +1 -1
  247. package/extensions/nostr/src/types.ts +4 -4
  248. package/extensions/open-prose/index.ts +2 -2
  249. package/extensions/qwen-portal-auth/README.md +1 -1
  250. package/extensions/signal/index.ts +2 -2
  251. package/extensions/signal/package.json +1 -1
  252. package/extensions/slack/index.ts +2 -2
  253. package/extensions/slack/package.json +1 -1
  254. package/extensions/telegram/index.ts +2 -2
  255. package/extensions/telegram/package.json +1 -1
  256. package/extensions/telegram/src/channel.ts +2 -2
  257. package/extensions/tlon/README.md +2 -2
  258. package/extensions/tlon/index.ts +2 -2
  259. package/extensions/tlon/package.json +1 -1
  260. package/extensions/tlon/src/channel.ts +13 -13
  261. package/extensions/tlon/src/monitor/index.ts +3 -3
  262. package/extensions/tlon/src/onboarding.ts +3 -3
  263. package/extensions/tlon/src/types.ts +3 -3
  264. package/extensions/twitch/README.md +1 -1
  265. package/extensions/twitch/index.ts +2 -2
  266. package/extensions/twitch/package.json +1 -1
  267. package/extensions/twitch/src/config.ts +3 -3
  268. package/extensions/twitch/src/monitor.ts +3 -3
  269. package/extensions/twitch/src/onboarding.ts +9 -9
  270. package/extensions/twitch/src/outbound.test.ts +2 -2
  271. package/extensions/twitch/src/plugin.test.ts +2 -2
  272. package/extensions/twitch/src/plugin.ts +8 -8
  273. package/extensions/twitch/src/send.test.ts +2 -2
  274. package/extensions/twitch/src/send.ts +4 -4
  275. package/extensions/twitch/src/token.test.ts +8 -8
  276. package/extensions/twitch/src/token.ts +3 -3
  277. package/extensions/twitch/src/twitch-client.ts +3 -3
  278. package/extensions/twitch/src/types.ts +3 -3
  279. package/extensions/twitch/src/utils/markdown.ts +1 -1
  280. package/extensions/voice-call/README.md +3 -3
  281. package/extensions/voice-call/package.json +1 -1
  282. package/extensions/voice-call/src/core-bridge.ts +2 -2
  283. package/extensions/voice-call/src/response-generator.ts +1 -1
  284. package/extensions/whatsapp/index.ts +2 -2
  285. package/extensions/whatsapp/package.json +1 -1
  286. package/extensions/zalo/README.md +1 -1
  287. package/extensions/zalo/index.ts +2 -2
  288. package/extensions/zalo/package.json +1 -1
  289. package/extensions/zalo/src/accounts.ts +8 -8
  290. package/extensions/zalo/src/actions.ts +4 -4
  291. package/extensions/zalo/src/channel.directory.test.ts +2 -2
  292. package/extensions/zalo/src/channel.ts +18 -18
  293. package/extensions/zalo/src/monitor.ts +9 -9
  294. package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
  295. package/extensions/zalo/src/onboarding.ts +24 -24
  296. package/extensions/zalo/src/send.ts +2 -2
  297. package/extensions/zalouser/README.md +2 -2
  298. package/extensions/zalouser/index.ts +2 -2
  299. package/extensions/zalouser/package.json +1 -1
  300. package/extensions/zalouser/src/accounts.ts +9 -9
  301. package/extensions/zalouser/src/channel.ts +24 -24
  302. package/extensions/zalouser/src/monitor.ts +4 -4
  303. package/extensions/zalouser/src/onboarding.ts +28 -28
  304. package/package.json +13 -251
  305. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  306. package/skills/tmux/scripts/find-sessions.sh +1 -1
  307. package/CHANGELOG.md +0 -102
  308. package/README-header.png +0 -0
  309. package/git-hooks/pre-commit +0 -4
  310. package/scripts/format-staged.js +0 -148
  311. package/scripts/postinstall.js +0 -300
  312. package/scripts/setup-git-hooks.js +0 -96
@@ -1,300 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { spawnSync } from "node:child_process";
4
- import { fileURLToPath } from "node:url";
5
- import { setupGitHooks } from "./setup-git-hooks.js";
6
-
7
- function detectPackageManager(ua = process.env.npm_config_user_agent ?? "") {
8
- // Examples:
9
- // - "pnpm/10.23.0 npm/? node/v22.21.1 darwin arm64"
10
- // - "npm/10.9.4 node/v22.12.0 linux x64"
11
- // - "bun/1.2.2"
12
- const normalized = String(ua).trim();
13
- if (normalized.startsWith("pnpm/")) return "pnpm";
14
- if (normalized.startsWith("bun/")) return "bun";
15
- if (normalized.startsWith("npm/")) return "npm";
16
- if (normalized.startsWith("yarn/")) return "yarn";
17
- return "unknown";
18
- }
19
-
20
- function shouldApplyPnpmPatchedDependenciesFallback(pm = detectPackageManager()) {
21
- // pnpm already applies pnpm.patchedDependencies itself; re-applying would fail.
22
- return pm !== "pnpm";
23
- }
24
-
25
- function getRepoRoot() {
26
- const here = path.dirname(fileURLToPath(import.meta.url));
27
- return path.resolve(here, "..");
28
- }
29
-
30
- function ensureExecutable(targetPath) {
31
- if (process.platform === "win32") return;
32
- if (!fs.existsSync(targetPath)) return;
33
- try {
34
- const mode = fs.statSync(targetPath).mode & 0o777;
35
- if (mode & 0o100) return;
36
- fs.chmodSync(targetPath, 0o755);
37
- } catch (err) {
38
- console.warn(`[postinstall] chmod failed: ${err}`);
39
- }
40
- }
41
-
42
- function hasGit(repoRoot) {
43
- const result = spawnSync("git", ["--version"], { cwd: repoRoot, stdio: "ignore" });
44
- return result.status === 0;
45
- }
46
-
47
- function extractPackageName(key) {
48
- if (key.startsWith("@")) {
49
- const idx = key.indexOf("@", 1);
50
- if (idx === -1) return key;
51
- return key.slice(0, idx);
52
- }
53
- const idx = key.lastIndexOf("@");
54
- if (idx <= 0) return key;
55
- return key.slice(0, idx);
56
- }
57
-
58
- function stripPrefix(p) {
59
- if (p.startsWith("a/") || p.startsWith("b/")) return p.slice(2);
60
- return p;
61
- }
62
-
63
- function parseRange(segment) {
64
- // segment: "-12,5" or "+7"
65
- const [startRaw, countRaw] = segment.slice(1).split(",");
66
- const start = Number.parseInt(startRaw, 10);
67
- const count = countRaw ? Number.parseInt(countRaw, 10) : 1;
68
- if (Number.isNaN(start) || Number.isNaN(count)) {
69
- throw new Error(`invalid hunk range: ${segment}`);
70
- }
71
- return { start, count };
72
- }
73
-
74
- function parsePatch(patchText) {
75
- const lines = patchText.split("\n");
76
- const files = [];
77
- let i = 0;
78
-
79
- while (i < lines.length) {
80
- if (!lines[i].startsWith("diff --git ")) {
81
- i += 1;
82
- continue;
83
- }
84
-
85
- const file = { oldPath: null, newPath: null, hunks: [] };
86
- i += 1;
87
-
88
- // Skip index line(s)
89
- while (i < lines.length && lines[i].startsWith("index ")) i += 1;
90
-
91
- if (i < lines.length && lines[i].startsWith("--- ")) {
92
- file.oldPath = stripPrefix(lines[i].slice(4).trim());
93
- i += 1;
94
- }
95
- if (i < lines.length && lines[i].startsWith("+++ ")) {
96
- file.newPath = stripPrefix(lines[i].slice(4).trim());
97
- i += 1;
98
- }
99
-
100
- while (i < lines.length && lines[i].startsWith("@@")) {
101
- const header = lines[i];
102
- const match = /^@@\s+(-\d+(?:,\d+)?)\s+(\+\d+(?:,\d+)?)\s+@@/.exec(header);
103
- if (!match) throw new Error(`invalid hunk header: ${header}`);
104
- const oldRange = parseRange(match[1]);
105
- const newRange = parseRange(match[2]);
106
- i += 1;
107
-
108
- const hunkLines = [];
109
- while (i < lines.length) {
110
- const line = lines[i];
111
- if (line.startsWith("@@") || line.startsWith("diff --git ")) break;
112
- if (line === "") {
113
- i += 1;
114
- continue;
115
- }
116
- if (line.startsWith("\")) {
117
- i += 1;
118
- continue;
119
- }
120
- hunkLines.push(line);
121
- i += 1;
122
- }
123
-
124
- file.hunks.push({
125
- oldStart: oldRange.start,
126
- oldLines: oldRange.count,
127
- newStart: newRange.start,
128
- newLines: newRange.count,
129
- lines: hunkLines,
130
- });
131
- }
132
-
133
- if (file.newPath && file.hunks.length > 0) {
134
- files.push(file);
135
- }
136
- }
137
-
138
- return files;
139
- }
140
-
141
- function readFileLines(targetPath) {
142
- if (!fs.existsSync(targetPath)) {
143
- throw new Error(`target file missing: ${targetPath}`);
144
- }
145
- const raw = fs.readFileSync(targetPath, "utf-8");
146
- const hasTrailingNewline = raw.endsWith("\n");
147
- const parts = raw.split("\n");
148
- if (hasTrailingNewline) parts.pop();
149
- return { lines: parts, hasTrailingNewline };
150
- }
151
-
152
- function writeFileLines(targetPath, lines, hadTrailingNewline) {
153
- const content = lines.join("\n") + (hadTrailingNewline ? "\n" : "");
154
- fs.writeFileSync(targetPath, content, "utf-8");
155
- }
156
-
157
- function applyHunk(lines, hunk, offset) {
158
- let cursor = hunk.oldStart - 1 + offset;
159
- const expected = [];
160
- for (const raw of hunk.lines) {
161
- const marker = raw[0];
162
- if (marker === " " || marker === "+") {
163
- expected.push(raw.slice(1));
164
- }
165
- }
166
- if (cursor >= 0 && cursor + expected.length <= lines.length) {
167
- let alreadyApplied = true;
168
- for (let i = 0; i < expected.length; i += 1) {
169
- if (lines[cursor + i] !== expected[i]) {
170
- alreadyApplied = false;
171
- break;
172
- }
173
- }
174
- if (alreadyApplied) {
175
- const delta = hunk.newLines - hunk.oldLines;
176
- return offset + delta;
177
- }
178
- }
179
-
180
- for (const raw of hunk.lines) {
181
- const marker = raw[0];
182
- const text = raw.slice(1);
183
- if (marker === " ") {
184
- if (lines[cursor] !== text) {
185
- throw new Error(
186
- `context mismatch at line ${cursor + 1}: expected "${text}", found "${lines[cursor] ?? "<eof>"}"`,
187
- );
188
- }
189
- cursor += 1;
190
- } else if (marker === "-") {
191
- if (lines[cursor] !== text) {
192
- throw new Error(
193
- `delete mismatch at line ${cursor + 1}: expected "${text}", found "${lines[cursor] ?? "<eof>"}"`,
194
- );
195
- }
196
- lines.splice(cursor, 1);
197
- } else if (marker === "+") {
198
- lines.splice(cursor, 0, text);
199
- cursor += 1;
200
- } else {
201
- throw new Error(`unexpected hunk marker: ${marker}`);
202
- }
203
- }
204
-
205
- const delta = hunk.newLines - hunk.oldLines;
206
- return offset + delta;
207
- }
208
-
209
- function applyPatchToFile(targetDir, filePatch) {
210
- if (filePatch.newPath === "/dev/null") {
211
- // deletion not needed for our patches
212
- return;
213
- }
214
- const relPath = stripPrefix(filePatch.newPath ?? filePatch.oldPath ?? "");
215
- const targetPath = path.join(targetDir, relPath);
216
- const { lines, hasTrailingNewline } = readFileLines(targetPath);
217
-
218
- let offset = 0;
219
- for (const hunk of filePatch.hunks) {
220
- offset = applyHunk(lines, hunk, offset);
221
- }
222
-
223
- writeFileLines(targetPath, lines, hasTrailingNewline);
224
- }
225
-
226
- function applyPatchSet({ patchText, targetDir }) {
227
- let resolvedTarget = path.resolve(targetDir);
228
- if (!fs.existsSync(resolvedTarget) || !fs.statSync(resolvedTarget).isDirectory()) {
229
- console.warn(`[postinstall] skip missing target: ${resolvedTarget}`);
230
- return;
231
- }
232
- resolvedTarget = fs.realpathSync(resolvedTarget);
233
-
234
- const files = parsePatch(patchText);
235
- if (files.length === 0) return;
236
-
237
- for (const filePatch of files) {
238
- applyPatchToFile(resolvedTarget, filePatch);
239
- }
240
- }
241
-
242
- function applyPatchFile({ patchPath, targetDir }) {
243
- const absPatchPath = path.resolve(patchPath);
244
- if (!fs.existsSync(absPatchPath)) {
245
- throw new Error(`missing patch: ${absPatchPath}`);
246
- }
247
- const patchText = fs.readFileSync(absPatchPath, "utf-8");
248
- applyPatchSet({ patchText, targetDir });
249
- }
250
-
251
- function main() {
252
- const repoRoot = getRepoRoot();
253
- process.chdir(repoRoot);
254
-
255
- ensureExecutable(path.join(repoRoot, "dist", "entry.js"));
256
- setupGitHooks({ repoRoot });
257
-
258
- if (!shouldApplyPnpmPatchedDependenciesFallback()) {
259
- return;
260
- }
261
-
262
- const pkgPath = path.join(repoRoot, "package.json");
263
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
264
- const patched = pkg?.pnpm?.patchedDependencies ?? {};
265
-
266
- // Bun does not support pnpm.patchedDependencies. Apply these patch files to
267
- // node_modules packages as a best-effort compatibility layer.
268
- for (const [key, relPatchPath] of Object.entries(patched)) {
269
- if (typeof relPatchPath !== "string" || !relPatchPath.trim()) continue;
270
- const pkgName = extractPackageName(String(key));
271
- if (!pkgName) continue;
272
- applyPatchFile({
273
- targetDir: path.join("node_modules", ...pkgName.split("/")),
274
- patchPath: relPatchPath,
275
- });
276
- }
277
- }
278
-
279
- try {
280
- const skip =
281
- process.env.CLAWDBOT_SKIP_POSTINSTALL === "1" ||
282
- process.env.VITEST === "true" ||
283
- process.env.NODE_ENV === "test";
284
-
285
- if (!skip) {
286
- main();
287
- }
288
- } catch (err) {
289
- console.error(String(err));
290
- process.exit(1);
291
- }
292
-
293
- export {
294
- applyPatchFile,
295
- applyPatchSet,
296
- applyPatchToFile,
297
- detectPackageManager,
298
- parsePatch,
299
- shouldApplyPnpmPatchedDependenciesFallback,
300
- };
@@ -1,96 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { spawnSync } from "node:child_process";
4
- import { fileURLToPath } from "node:url";
5
-
6
- const DEFAULT_HOOKS_PATH = "git-hooks";
7
- const PRE_COMMIT_HOOK = "pre-commit";
8
-
9
- function getRepoRoot() {
10
- const here = path.dirname(fileURLToPath(import.meta.url));
11
- return path.resolve(here, "..");
12
- }
13
-
14
- function runGitCommand(args, options = {}) {
15
- return spawnSync("git", args, {
16
- cwd: options.cwd,
17
- encoding: "utf-8",
18
- stdio: options.stdio ?? "pipe",
19
- });
20
- }
21
-
22
- function ensureExecutable(targetPath) {
23
- if (process.platform === "win32") return;
24
- if (!fs.existsSync(targetPath)) return;
25
- try {
26
- const mode = fs.statSync(targetPath).mode & 0o777;
27
- if (mode & 0o100) return;
28
- fs.chmodSync(targetPath, 0o755);
29
- } catch (err) {
30
- console.warn(`[setup-git-hooks] chmod failed: ${err}`);
31
- }
32
- }
33
-
34
- function isGitAvailable({ repoRoot = getRepoRoot(), runGit = runGitCommand } = {}) {
35
- const result = runGit(["--version"], { cwd: repoRoot, stdio: "ignore" });
36
- return result.status === 0;
37
- }
38
-
39
- function isGitRepo({ repoRoot = getRepoRoot(), runGit = runGitCommand } = {}) {
40
- const result = runGit(["rev-parse", "--is-inside-work-tree"], {
41
- cwd: repoRoot,
42
- stdio: "pipe",
43
- });
44
- if (result.status !== 0) return false;
45
- return String(result.stdout ?? "").trim() === "true";
46
- }
47
-
48
- function setHooksPath({
49
- repoRoot = getRepoRoot(),
50
- hooksPath = DEFAULT_HOOKS_PATH,
51
- runGit = runGitCommand,
52
- } = {}) {
53
- const result = runGit(["config", "core.hooksPath", hooksPath], {
54
- cwd: repoRoot,
55
- stdio: "ignore",
56
- });
57
- return result.status === 0;
58
- }
59
-
60
- function setupGitHooks({
61
- repoRoot = getRepoRoot(),
62
- hooksPath = DEFAULT_HOOKS_PATH,
63
- runGit = runGitCommand,
64
- } = {}) {
65
- if (!isGitAvailable({ repoRoot, runGit })) {
66
- return { ok: false, reason: "git-missing" };
67
- }
68
-
69
- if (!isGitRepo({ repoRoot, runGit })) {
70
- return { ok: false, reason: "not-repo" };
71
- }
72
-
73
- if (!setHooksPath({ repoRoot, hooksPath, runGit })) {
74
- return { ok: false, reason: "config-failed" };
75
- }
76
-
77
- ensureExecutable(path.join(repoRoot, hooksPath, PRE_COMMIT_HOOK));
78
-
79
- return { ok: true };
80
- }
81
-
82
- export {
83
- DEFAULT_HOOKS_PATH,
84
- PRE_COMMIT_HOOK,
85
- ensureExecutable,
86
- getRepoRoot,
87
- isGitAvailable,
88
- isGitRepo,
89
- runGitCommand,
90
- setHooksPath,
91
- setupGitHooks,
92
- };
93
-
94
- if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
95
- setupGitHooks();
96
- }