@poolzin/pool-bot 2026.2.1 → 2026.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README-header.png +0 -0
  3. package/dist/acp/server.js +2 -0
  4. package/dist/agents/agent-paths.js +3 -1
  5. package/dist/agents/anthropic-payload-log.js +2 -2
  6. package/dist/agents/bash-tools.exec.js +1 -1
  7. package/dist/agents/bash-tools.shared.js +2 -1
  8. package/dist/agents/cache-trace.js +5 -5
  9. package/dist/agents/cli-runner.js +1 -1
  10. package/dist/agents/context.js +1 -1
  11. package/dist/agents/live-auth-keys.js +2 -2
  12. package/dist/agents/model-catalog.js +1 -1
  13. package/dist/agents/pi-embedded-runner/compact.js +7 -10
  14. package/dist/agents/pi-embedded-runner/model.js +1 -1
  15. package/dist/agents/pi-embedded-runner/session-manager-cache.js +1 -1
  16. package/dist/agents/pi-embedded-subscribe.raw-stream.js +2 -2
  17. package/dist/agents/sandbox/browser.js +5 -0
  18. package/dist/agents/shell-utils.js +1 -1
  19. package/dist/agents/skills/bundled-dir.js +1 -1
  20. package/dist/agents/synthetic-models.js +8 -0
  21. package/dist/agents/tools/image-tool.js +1 -1
  22. package/dist/agents/workspace.js +1 -1
  23. package/dist/auto-reply/envelope.js +52 -38
  24. package/dist/auto-reply/reply/get-reply.js +1 -1
  25. package/dist/auto-reply/reply/mentions.js +1 -1
  26. package/dist/build-info.json +2 -2
  27. package/dist/canvas-host/a2ui/index.html +28 -28
  28. package/dist/canvas-host/server.js +1 -1
  29. package/dist/channels/plugins/catalog.js +1 -1
  30. package/dist/cli/banner.js +12 -12
  31. package/dist/cli/browser-cli-manage.js +10 -10
  32. package/dist/cli/browser-cli.js +1 -1
  33. package/dist/cli/channel-options.js +1 -1
  34. package/dist/cli/cli-name.js +1 -1
  35. package/dist/cli/command-format.js +1 -1
  36. package/dist/cli/daemon-cli/install.js +1 -1
  37. package/dist/cli/daemon-cli/shared.js +8 -3
  38. package/dist/cli/daemon-cli/status.gather.js +2 -2
  39. package/dist/cli/daemon-cli/status.print.js +3 -3
  40. package/dist/cli/gateway-cli/dev.js +1 -1
  41. package/dist/cli/gateway-cli/run.js +11 -6
  42. package/dist/cli/gateway-cli/shared.js +1 -1
  43. package/dist/cli/node-cli/daemon.js +2 -1
  44. package/dist/cli/profile.js +10 -4
  45. package/dist/cli/program/help.js +1 -1
  46. package/dist/cli/program/preaction.js +1 -1
  47. package/dist/cli/program/register.agent.js +4 -4
  48. package/dist/cli/program/register.onboard.js +1 -1
  49. package/dist/cli/program/register.setup.js +1 -1
  50. package/dist/cli/program/register.subclis.js +2 -2
  51. package/dist/cli/route.js +1 -1
  52. package/dist/cli/tagline.js +8 -8
  53. package/dist/cli/update-cli.js +12 -10
  54. package/dist/commands/auth-choice-options.js +104 -33
  55. package/dist/commands/auth-choice.apply.oauth.js +1 -1
  56. package/dist/commands/configure.wizard.js +10 -10
  57. package/dist/commands/daemon-install-helpers.js +1 -1
  58. package/dist/commands/dashboard.js +1 -1
  59. package/dist/commands/doctor-format.js +3 -3
  60. package/dist/commands/doctor-gateway-daemon-flow.js +3 -3
  61. package/dist/commands/doctor-gateway-services.js +2 -2
  62. package/dist/commands/doctor-platform-notes.js +23 -8
  63. package/dist/commands/doctor-update.js +1 -1
  64. package/dist/commands/gateway-status/helpers.js +2 -2
  65. package/dist/commands/health.js +2 -2
  66. package/dist/commands/models/list.registry.js +1 -1
  67. package/dist/commands/node-daemon-install-helpers.js +1 -1
  68. package/dist/commands/onboard-helpers.js +6 -6
  69. package/dist/commands/status-all.js +2 -2
  70. package/dist/commands/status.gateway-probe.js +2 -2
  71. package/dist/commands/status.scan.js +2 -2
  72. package/dist/compat/legacy-names.js +2 -0
  73. package/dist/config/io.js +5 -3
  74. package/dist/config/paths.js +15 -14
  75. package/dist/config/schema.field-metadata.js +1 -1
  76. package/dist/config/schema.js +1 -1
  77. package/dist/config/sessions/store.js +1 -1
  78. package/dist/control-ui/assets/{index-CIRDm-Lu.css → index-CSfXd2LO.css} +1 -1
  79. package/dist/control-ui/assets/{index-CmNMuoem.js → index-HRr1grwl.js} +446 -413
  80. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -0
  81. package/dist/control-ui/index.html +4 -4
  82. package/dist/cron/isolated-agent/run.js +1 -0
  83. package/dist/daemon/inspect.js +1 -1
  84. package/dist/daemon/launchd.js +5 -5
  85. package/dist/daemon/node-service.js +14 -0
  86. package/dist/daemon/paths.js +2 -2
  87. package/dist/daemon/schtasks.js +6 -6
  88. package/dist/daemon/service-env.js +25 -5
  89. package/dist/daemon/systemd.js +6 -6
  90. package/dist/entry.js +3 -2
  91. package/dist/gateway/auth.js +3 -3
  92. package/dist/gateway/call.js +2 -2
  93. package/dist/gateway/server/ws-connection/message-handler.js +1 -1
  94. package/dist/gateway/server-browser.js +2 -2
  95. package/dist/gateway/server-constants.js +2 -2
  96. package/dist/gateway/server-cron.js +1 -1
  97. package/dist/gateway/server-discovery-runtime.js +2 -2
  98. package/dist/gateway/server-discovery.js +2 -2
  99. package/dist/gateway/server-reload-handlers.js +4 -4
  100. package/dist/gateway/server-runtime-config.js +2 -2
  101. package/dist/gateway/server-startup.js +4 -4
  102. package/dist/gateway/server.impl.js +3 -2
  103. package/dist/gateway/test-helpers.mocks.js +14 -7
  104. package/dist/gateway/test-helpers.server.js +60 -22
  105. package/dist/hooks/bundled-dir.js +1 -1
  106. package/dist/hooks/gmail-watcher.js +1 -1
  107. package/dist/infra/bonjour.js +1 -1
  108. package/dist/infra/diagnostic-flags.js +3 -2
  109. package/dist/infra/dotenv.js +1 -1
  110. package/dist/infra/format-time/format-datetime.js +1 -1
  111. package/dist/infra/gateway-lock.js +1 -1
  112. package/dist/infra/home-dir.js +1 -1
  113. package/dist/infra/path-env.js +2 -1
  114. package/dist/infra/restart.js +3 -3
  115. package/dist/infra/shell-env.js +3 -3
  116. package/dist/infra/state-migrations.js +3 -3
  117. package/dist/infra/system-presence.js +1 -1
  118. package/dist/infra/update-runner.js +1 -1
  119. package/dist/infra/widearea-dns.js +1 -1
  120. package/dist/macos/gateway-daemon.js +6 -4
  121. package/dist/macos/relay-smoke.js +1 -1
  122. package/dist/macos/relay.js +1 -1
  123. package/dist/media/image-ops.js +2 -2
  124. package/dist/media/store.js +2 -0
  125. package/dist/media-understanding/providers/image.js +1 -1
  126. package/dist/memory/batch-gemini.js +1 -1
  127. package/dist/memory/embeddings-gemini.js +1 -1
  128. package/dist/node-host/runner.js +3 -2
  129. package/dist/plugins/bundled-dir.js +1 -1
  130. package/dist/plugins/manifest-registry.js +2 -2
  131. package/dist/security/audit-extra.sync.js +1 -1
  132. package/dist/security/audit.js +3 -2
  133. package/dist/telegram/accounts.js +1 -1
  134. package/dist/telegram/bot-message-dispatch.js +6 -2
  135. package/dist/telegram/network-config.js +6 -4
  136. package/dist/test-helpers/state-dir-env.js +8 -0
  137. package/dist/tts/tts.js +1 -1
  138. package/dist/tui/gateway-chat.js +2 -1
  139. package/dist/utils.js +2 -2
  140. package/dist/version.js +1 -1
  141. package/dist/wizard/clack-prompter.js +9 -6
  142. package/dist/wizard/onboarding.finalize.js +1 -1
  143. package/dist/wizard/onboarding.js +2 -2
  144. package/extensions/googlechat/node_modules/.bin/poolbot +21 -0
  145. package/extensions/googlechat/package.json +2 -2
  146. package/extensions/line/node_modules/.bin/poolbot +21 -0
  147. package/extensions/line/package.json +1 -1
  148. package/extensions/matrix/node_modules/.bin/poolbot +21 -0
  149. package/extensions/matrix/package.json +1 -1
  150. package/extensions/memory-core/node_modules/.bin/poolbot +21 -0
  151. package/extensions/memory-core/package.json +4 -1
  152. package/extensions/twitch/node_modules/.bin/poolbot +21 -0
  153. package/extensions/twitch/package.json +1 -1
  154. package/package.json +183 -24
  155. package/dist/control-ui/assets/index-CmNMuoem.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Moltbot Canvas</title>
6
+ <title>Poolbot Canvas</title>
7
7
  <script>
8
8
  (() => {
9
9
  try {
@@ -81,7 +81,7 @@
81
81
  backface-visibility: hidden;
82
82
  opacity: 0.45;
83
83
  pointer-events: none;
84
- animation: moltbot-grid-drift 140s ease-in-out infinite alternate;
84
+ animation: poolbot-grid-drift 140s ease-in-out infinite alternate;
85
85
  }
86
86
  :root[data-platform="android"] body::before {
87
87
  opacity: 0.8;
@@ -101,7 +101,7 @@
101
101
  backface-visibility: hidden;
102
102
  transform: translate3d(0, 0, 0);
103
103
  pointer-events: none;
104
- animation: moltbot-glow-drift 110s ease-in-out infinite alternate;
104
+ animation: poolbot-glow-drift 110s ease-in-out infinite alternate;
105
105
  }
106
106
  :root[data-platform="android"] body::after {
107
107
  opacity: 0.85;
@@ -116,7 +116,7 @@
116
116
  opacity: 0.7;
117
117
  }
118
118
  }
119
- @keyframes moltbot-grid-drift {
119
+ @keyframes poolbot-grid-drift {
120
120
  0% {
121
121
  transform: translate3d(-12px, 8px, 0) rotate(-7deg);
122
122
  opacity: 0.4;
@@ -130,7 +130,7 @@
130
130
  opacity: 0.42;
131
131
  }
132
132
  }
133
- @keyframes moltbot-glow-drift {
133
+ @keyframes poolbot-glow-drift {
134
134
  0% {
135
135
  transform: translate3d(-18px, 12px, 0) scale(1.02);
136
136
  opacity: 0.4;
@@ -153,14 +153,14 @@
153
153
  touch-action: none;
154
154
  z-index: 1;
155
155
  }
156
- :root[data-platform="android"] #moltbot-canvas {
156
+ :root[data-platform="android"] #poolbot-canvas {
157
157
  background:
158
158
  radial-gradient(1100px 800px at 20% 15%, rgba(42, 113, 255, 0.78), rgba(0, 0, 0, 0) 58%),
159
159
  radial-gradient(900px 650px at 82% 28%, rgba(255, 0, 138, 0.66), rgba(0, 0, 0, 0) 62%),
160
160
  radial-gradient(1000px 900px at 60% 88%, rgba(0, 209, 255, 0.58), rgba(0, 0, 0, 0) 62%),
161
161
  #141c33;
162
162
  }
163
- #moltbot-status {
163
+ #poolbot-status {
164
164
  position: fixed;
165
165
  inset: 0;
166
166
  display: none;
@@ -172,7 +172,7 @@
172
172
  pointer-events: none;
173
173
  z-index: 3;
174
174
  }
175
- #moltbot-status .card {
175
+ #poolbot-status .card {
176
176
  width: min(560px, 88vw);
177
177
  text-align: left;
178
178
  padding: 14px 16px 12px;
@@ -185,7 +185,7 @@
185
185
  -webkit-backdrop-filter: blur(18px) saturate(140%);
186
186
  backdrop-filter: blur(18px) saturate(140%);
187
187
  }
188
- #moltbot-status .title {
188
+ #poolbot-status .title {
189
189
  font:
190
190
  600 12px/1.2 -apple-system,
191
191
  BlinkMacSystemFont,
@@ -196,7 +196,7 @@
196
196
  text-transform: uppercase;
197
197
  color: rgba(255, 255, 255, 0.7);
198
198
  }
199
- #moltbot-status .subtitle {
199
+ #poolbot-status .subtitle {
200
200
  margin-top: 8px;
201
201
  font:
202
202
  500 13px/1.45 -apple-system,
@@ -208,39 +208,39 @@
208
208
  white-space: pre-wrap;
209
209
  overflow-wrap: anywhere;
210
210
  }
211
- moltbot-a2ui-host {
211
+ poolbot-a2ui-host {
212
212
  display: block;
213
213
  height: 100%;
214
214
  position: fixed;
215
215
  inset: 0;
216
216
  z-index: 4;
217
- --moltbot-a2ui-inset-top: 28px;
218
- --moltbot-a2ui-inset-right: 0px;
219
- --moltbot-a2ui-inset-bottom: 0px;
220
- --moltbot-a2ui-inset-left: 0px;
221
- --moltbot-a2ui-scroll-pad-bottom: 0px;
222
- --moltbot-a2ui-status-top: calc(50% - 18px);
223
- --moltbot-a2ui-empty-top: 18px;
217
+ --poolbot-a2ui-inset-top: 28px;
218
+ --poolbot-a2ui-inset-right: 0px;
219
+ --poolbot-a2ui-inset-bottom: 0px;
220
+ --poolbot-a2ui-inset-left: 0px;
221
+ --poolbot-a2ui-scroll-pad-bottom: 0px;
222
+ --poolbot-a2ui-status-top: calc(50% - 18px);
223
+ --poolbot-a2ui-empty-top: 18px;
224
224
  }
225
225
  </style>
226
226
  </head>
227
227
  <body>
228
- <canvas id="moltbot-canvas"></canvas>
229
- <div id="moltbot-status">
228
+ <canvas id="poolbot-canvas"></canvas>
229
+ <div id="poolbot-status">
230
230
  <div class="card">
231
- <div class="title" id="moltbot-status-title">Ready</div>
232
- <div class="subtitle" id="moltbot-status-subtitle">Waiting for agent</div>
231
+ <div class="title" id="poolbot-status-title">Ready</div>
232
+ <div class="subtitle" id="poolbot-status-subtitle">Waiting for agent</div>
233
233
  </div>
234
234
  </div>
235
- <moltbot-a2ui-host></moltbot-a2ui-host>
235
+ <poolbot-a2ui-host></poolbot-a2ui-host>
236
236
  <script src="a2ui.bundle.js"></script>
237
237
  <script>
238
238
  (() => {
239
- const canvas = document.getElementById("moltbot-canvas");
239
+ const canvas = document.getElementById("poolbot-canvas");
240
240
  const ctx = canvas.getContext("2d");
241
- const statusEl = document.getElementById("moltbot-status");
242
- const titleEl = document.getElementById("moltbot-status-title");
243
- const subtitleEl = document.getElementById("moltbot-status-subtitle");
241
+ const statusEl = document.getElementById("poolbot-status");
242
+ const titleEl = document.getElementById("poolbot-status-title");
243
+ const subtitleEl = document.getElementById("poolbot-status-subtitle");
244
244
  const debugStatusEnabledByQuery = (() => {
245
245
  try {
246
246
  const params = new URLSearchParams(window.location.search);
@@ -278,7 +278,7 @@
278
278
  statusEl.style.display = "none";
279
279
  }
280
280
 
281
- window.__moltbot = {
281
+ window.__poolbot = {
282
282
  canvas,
283
283
  ctx,
284
284
  setDebugStatusEnabled,
@@ -151,7 +151,7 @@ async function resolveFilePath(rootReal, urlPath) {
151
151
  return await tryOpen(rel);
152
152
  }
153
153
  function isDisabledByEnv() {
154
- if (isTruthyEnvValue(process.env.CLAWDBOT_SKIP_CANVAS_HOST))
154
+ if (isTruthyEnvValue(process.env.POOLBOT_SKIP_CANVAS_HOST || process.env.CLAWDBOT_SKIP_CANVAS_HOST))
155
155
  return true;
156
156
  if (process.env.NODE_ENV === "test")
157
157
  return true;
@@ -14,7 +14,7 @@ const DEFAULT_CATALOG_PATHS = [
14
14
  path.join(CONFIG_DIR, "mpm", "catalog.json"),
15
15
  path.join(CONFIG_DIR, "plugins", "catalog.json"),
16
16
  ];
17
- const ENV_CATALOG_PATHS = ["CLAWDBOT_PLUGIN_CATALOG_PATHS", "CLAWDBOT_MPM_CATALOG_PATHS"];
17
+ const ENV_CATALOG_PATHS = ["POOLBOT_PLUGIN_CATALOG_PATHS", "POOLBOT_MPM_CATALOG_PATHS", "CLAWDBOT_PLUGIN_CATALOG_PATHS", "CLAWDBOT_MPM_CATALOG_PATHS"];
18
18
  function isRecord(value) {
19
19
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
20
20
  }
@@ -26,7 +26,7 @@ export function formatCliBannerLine(version, options = {}) {
26
26
  const rich = options.richTty ?? isRich();
27
27
  const cliName = resolveCliName(options.argv ?? process.argv, options.env);
28
28
  const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
29
- const prefix = "🦞 ";
29
+ const prefix = "🎱 ";
30
30
  const columns = options.columns ?? process.stdout.columns ?? 120;
31
31
  const plainFullLine = `${title} ${version} (${commitLabel}) — ${tagline}`;
32
32
  const fitsOnOneLine = visibleWidth(plainFullLine) <= columns;
@@ -46,12 +46,12 @@ export function formatCliBannerLine(version, options = {}) {
46
46
  return `${line1}\n${line2}`;
47
47
  }
48
48
  const LOBSTER_ASCII = [
49
- "░████░█░░░░░█████░█░░░█░███░░████░░████░░▀█▀",
50
- "█░░░░░█░░░░░█░░░█░█░█░█░█░░█░█░░░█░█░░░█░░█░",
51
- "█░░░░░█░░░░░█████░█░█░█░█░░█░████░░█░░░█░░█░",
52
- "█░░░░░█░░░░░█░░░█░█░█░█░█░░█░█░░█░░█░░░█░░█░",
53
- "░████░█████░█░░░█░░█░█░░███░░████░░░███░░░█░",
54
- " 🦞 FRESH DAILY 🦞",
49
+ "████░░░███░░░███░░█░░░░████░░░███░░▀█▀",
50
+ "█░░░█░█░░░█░█░░░█░█░░░░█░░░█░█░░░█░░█░",
51
+ "████░░█░░░█░█░░░█░█░░░░████░░█░░░█░░█░",
52
+ "█░░░░░█░░░█░█░░░█░█░░░░█░░░█░█░░░█░░█░",
53
+ "█░░░░░░███░░░███░░█████░████░░░███░░░█░",
54
+ " 🎱 RACK 'EM UP 🎱",
55
55
  ];
56
56
  export function formatCliBannerArt(options = {}) {
57
57
  const rich = options.richTty ?? isRich();
@@ -67,11 +67,11 @@ export function formatCliBannerArt(options = {}) {
67
67
  return theme.muted(ch);
68
68
  };
69
69
  const colored = LOBSTER_ASCII.map((line) => {
70
- if (line.includes("FRESH DAILY")) {
71
- return (theme.muted(" ") +
72
- theme.accent("🦞") +
73
- theme.info(" FRESH DAILY ") +
74
- theme.accent("🦞"));
70
+ if (line.includes("RACK 'EM UP")) {
71
+ return (theme.muted(" ") +
72
+ theme.accent("🎱") +
73
+ theme.info(" RACK 'EM UP ") +
74
+ theme.accent("🎱"));
75
75
  }
76
76
  return splitGraphemes(line).map(colorChar).join("");
77
77
  });
@@ -30,7 +30,7 @@ export function registerBrowserManageCommands(browser, parentOpts) {
30
30
  const detectedPath = status.detectedExecutablePath ?? status.executablePath;
31
31
  const detectedDisplay = detectedPath ? shortenHomePath(detectedPath) : "auto";
32
32
  defaultRuntime.log([
33
- `profile: ${status.profile ?? "clawd"}`,
33
+ `profile: ${status.profile ?? "poolbot"}`,
34
34
  `enabled: ${status.enabled}`,
35
35
  `running: ${status.running}`,
36
36
  `cdpPort: ${status.cdpPort}`,
@@ -64,8 +64,8 @@ export function registerBrowserManageCommands(browser, parentOpts) {
64
64
  defaultRuntime.log(JSON.stringify(status, null, 2));
65
65
  return;
66
66
  }
67
- const name = status.profile ?? "clawd";
68
- defaultRuntime.log(info(`🦞 browser [${name}] running: ${status.running}`));
67
+ const name = status.profile ?? "poolbot";
68
+ defaultRuntime.log(info(`🎱 browser [${name}] running: ${status.running}`));
69
69
  });
70
70
  });
71
71
  browser
@@ -89,8 +89,8 @@ export function registerBrowserManageCommands(browser, parentOpts) {
89
89
  defaultRuntime.log(JSON.stringify(status, null, 2));
90
90
  return;
91
91
  }
92
- const name = status.profile ?? "clawd";
93
- defaultRuntime.log(info(`🦞 browser [${name}] running: ${status.running}`));
92
+ const name = status.profile ?? "poolbot";
93
+ defaultRuntime.log(info(`🎱 browser [${name}] running: ${status.running}`));
94
94
  });
95
95
  });
96
96
  browser
@@ -110,11 +110,11 @@ export function registerBrowserManageCommands(browser, parentOpts) {
110
110
  return;
111
111
  }
112
112
  if (!result.moved) {
113
- defaultRuntime.log(info(`🦞 browser profile already missing.`));
113
+ defaultRuntime.log(info(`🎱 browser profile already missing.`));
114
114
  return;
115
115
  }
116
116
  const dest = result.to ?? result.from;
117
- defaultRuntime.log(info(`🦞 browser profile moved to Trash (${dest})`));
117
+ defaultRuntime.log(info(`🎱 browser profile moved to Trash (${dest})`));
118
118
  });
119
119
  });
120
120
  browser
@@ -374,7 +374,7 @@ export function registerBrowserManageCommands(browser, parentOpts) {
374
374
  return;
375
375
  }
376
376
  const loc = result.isRemote ? ` cdpUrl: ${result.cdpUrl}` : ` port: ${result.cdpPort}`;
377
- defaultRuntime.log(info(`🦞 Created profile "${result.profile}"\n${loc}\n color: ${result.color}${opts.driver === "extension" ? "\n driver: extension" : ""}`));
377
+ defaultRuntime.log(info(`🎱 Created profile "${result.profile}"\n${loc}\n color: ${result.color}${opts.driver === "extension" ? "\n driver: extension" : ""}`));
378
378
  });
379
379
  });
380
380
  browser
@@ -393,8 +393,8 @@ export function registerBrowserManageCommands(browser, parentOpts) {
393
393
  return;
394
394
  }
395
395
  const msg = result.deleted
396
- ? `🦞 Deleted profile "${result.profile}" (user data removed)`
397
- : `🦞 Deleted profile "${result.profile}" (no user data found)`;
396
+ ? `🎱 Deleted profile "${result.profile}" (user data removed)`
397
+ : `🎱 Deleted profile "${result.profile}" (no user data found)`;
398
398
  defaultRuntime.log(info(msg));
399
399
  });
400
400
  });
@@ -16,7 +16,7 @@ import { addGatewayClientOptions } from "./gateway-rpc.js";
16
16
  export function registerBrowserCli(program) {
17
17
  const browser = program
18
18
  .command("browser")
19
- .description("Manage clawd's dedicated browser (Chrome/Chromium)")
19
+ .description("Manage poolbot's dedicated browser (Chrome/Chromium)")
20
20
  .option("--browser-profile <name>", "Browser profile name (default from config)")
21
21
  .option("--json", "Output machine-readable JSON", false)
22
22
  .addHelpText("after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([...browserCoreExamples, ...browserActionExamples].map((cmd) => [cmd, ""]), true)}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/browser", "docs.molt.bot/cli/browser")}\n`)
@@ -17,7 +17,7 @@ function dedupe(values) {
17
17
  export function resolveCliChannelOptions() {
18
18
  const catalog = listChannelPluginCatalogEntries().map((entry) => entry.id);
19
19
  const base = dedupe([...CHAT_CHANNEL_ORDER, ...catalog]);
20
- if (isTruthyEnvValue(process.env.CLAWDBOT_EAGER_CHANNEL_OPTIONS)) {
20
+ if (isTruthyEnvValue(process.env.POOLBOT_EAGER_CHANNEL_OPTIONS || process.env.CLAWDBOT_EAGER_CHANNEL_OPTIONS)) {
21
21
  ensurePluginRegistryLoaded();
22
22
  const pluginIds = listChannelPlugins().map((plugin) => plugin.id);
23
23
  return dedupe([...base, ...pluginIds]);
@@ -4,7 +4,7 @@ export const LEGACY_CLI_NAME = "poolbot";
4
4
  const KNOWN_CLI_NAMES = new Set([DEFAULT_CLI_NAME, LEGACY_CLI_NAME]);
5
5
  const CLI_PREFIX_RE = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(poolbot|poolbot)\b/;
6
6
  export function resolveCliName(argv = process.argv, env = process.env) {
7
- const override = env.MOLTBOT_CLI_NAME?.trim() || env.CLAWDBOT_CLI_NAME?.trim();
7
+ const override = env.POOLBOT_CLI_NAME?.trim() || env.MOLTBOT_CLI_NAME?.trim() || env.CLAWDBOT_CLI_NAME?.trim();
8
8
  if (override)
9
9
  return override;
10
10
  const argv1 = argv[1];
@@ -6,7 +6,7 @@ const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/;
6
6
  export function formatCliCommand(command, env = process.env) {
7
7
  const cliName = resolveCliName(undefined, env);
8
8
  const normalizedCommand = replaceCliName(command, cliName);
9
- const profile = normalizeProfileName(env.CLAWDBOT_PROFILE);
9
+ const profile = normalizeProfileName(env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE);
10
10
  if (!profile)
11
11
  return normalizedCommand;
12
12
  if (!CLI_PREFIX_RE.test(normalizedCommand))
@@ -73,7 +73,7 @@ export async function runDaemonInstall(opts) {
73
73
  const { programArguments, workingDirectory, environment } = await buildGatewayInstallPlan({
74
74
  env: process.env,
75
75
  port,
76
- token: opts.token || cfg.gateway?.auth?.token || process.env.CLAWDBOT_GATEWAY_TOKEN,
76
+ token: opts.token || cfg.gateway?.auth?.token || process.env.POOLBOT_GATEWAY_TOKEN || process.env.CLAWDBOT_GATEWAY_TOKEN,
77
77
  runtime: runtimeRaw,
78
78
  warn: (message) => {
79
79
  if (json)
@@ -45,6 +45,11 @@ export function pickProbeHostForBind(bindMode, tailnetIPv4, customBindHost) {
45
45
  return "127.0.0.1";
46
46
  }
47
47
  const SAFE_DAEMON_ENV_KEYS = [
48
+ "POOLBOT_STATE_DIR",
49
+ "POOLBOT_CONFIG_PATH",
50
+ "POOLBOT_PROFILE",
51
+ "POOLBOT_GATEWAY_PORT",
52
+ "POOLBOT_NIX_MODE",
48
53
  "MOLTBOT_STATE_DIR",
49
54
  "MOLTBOT_CONFIG_PATH",
50
55
  "CLAWDBOT_PROFILE",
@@ -129,11 +134,11 @@ export function renderRuntimeHints(runtime, env = process.env) {
129
134
  hints.push(`Launchd stderr (if installed): ${logs.stderrPath}`);
130
135
  }
131
136
  else if (process.platform === "linux") {
132
- const unit = resolveGatewaySystemdServiceName(env.CLAWDBOT_PROFILE);
137
+ const unit = resolveGatewaySystemdServiceName(env.POOLBOT_PROFILE ?? env.CLAWDBOT_PROFILE);
133
138
  hints.push(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`);
134
139
  }
135
140
  else if (process.platform === "win32") {
136
- const task = resolveGatewayWindowsTaskName(env.CLAWDBOT_PROFILE);
141
+ const task = resolveGatewayWindowsTaskName(env.POOLBOT_PROFILE ?? env.CLAWDBOT_PROFILE);
137
142
  hints.push(`Logs: schtasks /Query /TN "${task}" /V /FO LIST`);
138
143
  }
139
144
  }
@@ -144,7 +149,7 @@ export function renderGatewayServiceStartHints(env = process.env) {
144
149
  formatCliCommand("poolbot gateway install", env),
145
150
  formatCliCommand("poolbot gateway", env),
146
151
  ];
147
- const profile = env.CLAWDBOT_PROFILE;
152
+ const profile = env.POOLBOT_PROFILE ?? env.CLAWDBOT_PROFILE;
148
153
  switch (process.platform) {
149
154
  case "darwin": {
150
155
  const label = resolveGatewayLaunchAgentLabel(profile);
@@ -106,10 +106,10 @@ export async function gatherDaemonStatus(opts) {
106
106
  ? await probeGatewayStatus({
107
107
  url: probeUrl,
108
108
  token: opts.rpc.token ||
109
- mergedDaemonEnv.CLAWDBOT_GATEWAY_TOKEN ||
109
+ mergedDaemonEnv.POOLBOT_GATEWAY_TOKEN || mergedDaemonEnv.CLAWDBOT_GATEWAY_TOKEN ||
110
110
  daemonCfg.gateway?.auth?.token,
111
111
  password: opts.rpc.password ||
112
- mergedDaemonEnv.CLAWDBOT_GATEWAY_PASSWORD ||
112
+ mergedDaemonEnv.POOLBOT_GATEWAY_PASSWORD || mergedDaemonEnv.CLAWDBOT_GATEWAY_PASSWORD ||
113
113
  daemonCfg.gateway?.auth?.password,
114
114
  timeoutMs,
115
115
  json: opts.rpc.json,
@@ -95,7 +95,7 @@ export function printDaemonStatus(status, opts) {
95
95
  }
96
96
  if (status.config.mismatch) {
97
97
  defaultRuntime.error(errorText("Root cause: CLI and service are using different config paths (likely a profile/state-dir mismatch)."));
98
- defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand("poolbot gateway install --force")}\` from the same --profile / CLAWDBOT_STATE_DIR you expect.`));
98
+ defaultRuntime.error(errorText(`Fix: rerun \`${formatCliCommand("poolbot gateway install --force")}\` from the same --profile / POOLBOT_STATE_DIR you expect.`));
99
99
  }
100
100
  spacer();
101
101
  }
@@ -176,7 +176,7 @@ export function printDaemonStatus(status, opts) {
176
176
  }
177
177
  if (service.runtime?.cachedLabel) {
178
178
  const env = (service.command?.environment ?? process.env);
179
- const labelValue = resolveGatewayLaunchAgentLabel(env.CLAWDBOT_PROFILE);
179
+ const labelValue = resolveGatewayLaunchAgentLabel(env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE);
180
180
  defaultRuntime.error(errorText(`LaunchAgent label cached but plist missing. Clear with: launchctl bootout gui/$UID/${labelValue}`));
181
181
  defaultRuntime.error(errorText(`Then reinstall: ${formatCliCommand("poolbot gateway install")}`));
182
182
  spacer();
@@ -203,7 +203,7 @@ export function printDaemonStatus(status, opts) {
203
203
  }
204
204
  if (process.platform === "linux") {
205
205
  const env = (service.command?.environment ?? process.env);
206
- const unit = resolveGatewaySystemdServiceName(env.CLAWDBOT_PROFILE);
206
+ const unit = resolveGatewaySystemdServiceName(env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE);
207
207
  defaultRuntime.error(errorText(`Logs: journalctl --user -u ${unit}.service -n 200 --no-pager`));
208
208
  }
209
209
  else if (process.platform === "darwin") {
@@ -27,7 +27,7 @@ async function loadDevTemplate(name, fallback) {
27
27
  }
28
28
  const resolveDevWorkspaceDir = (env = process.env) => {
29
29
  const baseDir = resolveDefaultAgentWorkspaceDir(env, os.homedir);
30
- const profile = env.CLAWDBOT_PROFILE?.trim().toLowerCase();
30
+ const profile = (env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE)?.trim().toLowerCase();
31
31
  if (profile === "dev")
32
32
  return baseDir;
33
33
  return `${baseDir}-${DEV_AGENT_WORKSPACE_SUFFIX}`;
@@ -16,7 +16,7 @@ import { runGatewayLoop } from "./run-loop.js";
16
16
  import { describeUnknownError, extractGatewayMiskeys, maybeExplainGatewayServiceStop, parsePort, toOptionString, } from "./shared.js";
17
17
  const gatewayLog = createSubsystemLogger("gateway");
18
18
  async function runGatewayCommand(opts) {
19
- const isDevProfile = process.env.CLAWDBOT_PROFILE?.trim().toLowerCase() === "dev";
19
+ const isDevProfile = (process.env.POOLBOT_PROFILE || process.env.CLAWDBOT_PROFILE)?.trim().toLowerCase() === "dev";
20
20
  const devMode = Boolean(opts.dev) || isDevProfile;
21
21
  if (opts.reset && !devMode) {
22
22
  defaultRuntime.error("Use --reset with --dev.");
@@ -27,6 +27,7 @@ async function runGatewayCommand(opts) {
27
27
  setVerbose(Boolean(opts.verbose));
28
28
  if (opts.claudeCliLogs) {
29
29
  setConsoleSubsystemFilter(["agent/claude-cli"]);
30
+ process.env.POOLBOT_CLAUDE_CLI_LOG_OUTPUT = "1";
30
31
  process.env.CLAWDBOT_CLAUDE_CLI_LOG_OUTPUT = "1";
31
32
  }
32
33
  const wsLogRaw = (opts.compact ? "compact" : opts.wsLog);
@@ -40,10 +41,12 @@ async function runGatewayCommand(opts) {
40
41
  }
41
42
  setGatewayWsLogStyle(wsLogStyle);
42
43
  if (opts.rawStream) {
44
+ process.env.POOLBOT_RAW_STREAM = "1";
43
45
  process.env.CLAWDBOT_RAW_STREAM = "1";
44
46
  }
45
47
  const rawStreamPath = toOptionString(opts.rawStreamPath);
46
48
  if (rawStreamPath) {
49
+ process.env.POOLBOT_RAW_STREAM_PATH = rawStreamPath;
47
50
  process.env.CLAWDBOT_RAW_STREAM_PATH = rawStreamPath;
48
51
  }
49
52
  if (devMode) {
@@ -90,8 +93,10 @@ async function runGatewayCommand(opts) {
90
93
  }
91
94
  if (opts.token) {
92
95
  const token = toOptionString(opts.token);
93
- if (token)
96
+ if (token) {
97
+ process.env.POOLBOT_GATEWAY_TOKEN = token;
94
98
  process.env.CLAWDBOT_GATEWAY_TOKEN = token;
99
+ }
95
100
  }
96
101
  const authModeRaw = toOptionString(opts.auth);
97
102
  const authMode = authModeRaw === "token" || authModeRaw === "password" ? authModeRaw : null;
@@ -165,7 +170,7 @@ async function runGatewayCommand(opts) {
165
170
  if (resolvedAuthMode === "token" && !hasToken && !resolvedAuth.allowTailscale) {
166
171
  defaultRuntime.error([
167
172
  "Gateway auth is set to token, but no token is configured.",
168
- "Set gateway.auth.token (or CLAWDBOT_GATEWAY_TOKEN), or pass --token.",
173
+ "Set gateway.auth.token (or POOLBOT_GATEWAY_TOKEN), or pass --token.",
169
174
  ...authHints,
170
175
  ]
171
176
  .filter(Boolean)
@@ -176,7 +181,7 @@ async function runGatewayCommand(opts) {
176
181
  if (resolvedAuthMode === "password" && !hasPassword) {
177
182
  defaultRuntime.error([
178
183
  "Gateway auth is set to password, but no password is configured.",
179
- "Set gateway.auth.password (or CLAWDBOT_GATEWAY_PASSWORD), or pass --password.",
184
+ "Set gateway.auth.password (or POOLBOT_GATEWAY_PASSWORD), or pass --password.",
180
185
  ...authHints,
181
186
  ]
182
187
  .filter(Boolean)
@@ -187,7 +192,7 @@ async function runGatewayCommand(opts) {
187
192
  if (bind !== "loopback" && !hasSharedSecret) {
188
193
  defaultRuntime.error([
189
194
  `Refusing to bind gateway to ${bind} without auth.`,
190
- "Set gateway.auth.token/password (or CLAWDBOT_GATEWAY_TOKEN/CLAWDBOT_GATEWAY_PASSWORD) or pass --token/--password.",
195
+ "Set gateway.auth.token/password (or POOLBOT_GATEWAY_TOKEN/POOLBOT_GATEWAY_PASSWORD) or pass --token/--password.",
191
196
  ...authHints,
192
197
  ]
193
198
  .filter(Boolean)
@@ -244,7 +249,7 @@ export function addGatewayRunCommand(cmd) {
244
249
  return cmd
245
250
  .option("--port <port>", "Port for the gateway WebSocket")
246
251
  .option("--bind <mode>", 'Bind mode ("loopback"|"lan"|"tailnet"|"auto"|"custom"). Defaults to config gateway.bind (or loopback).')
247
- .option("--token <token>", "Shared token required in connect.params.auth.token (default: CLAWDBOT_GATEWAY_TOKEN env if set)")
252
+ .option("--token <token>", "Shared token required in connect.params.auth.token (default: POOLBOT_GATEWAY_TOKEN env if set)")
248
253
  .option("--auth <mode>", 'Gateway auth mode ("token"|"password")')
249
254
  .option("--password <password>", "Password for auth mode=password")
250
255
  .option("--tailscale <mode>", 'Tailscale exposure mode ("off"|"serve"|"funnel")')
@@ -60,7 +60,7 @@ export function extractGatewayMiskeys(parsed) {
60
60
  return { hasGatewayToken, hasRemoteToken };
61
61
  }
62
62
  export function renderGatewayServiceStopHints(env = process.env) {
63
- const profile = env.CLAWDBOT_PROFILE;
63
+ const profile = env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE;
64
64
  switch (process.platform) {
65
65
  case "darwin":
66
66
  return [
@@ -463,7 +463,8 @@ export async function runNodeDaemonStatus(opts = {}) {
463
463
  };
464
464
  const hintEnv = {
465
465
  ...baseEnv,
466
- CLAWDBOT_LOG_PREFIX: baseEnv.CLAWDBOT_LOG_PREFIX ?? "node",
466
+ POOLBOT_LOG_PREFIX: baseEnv.POOLBOT_LOG_PREFIX || baseEnv.CLAWDBOT_LOG_PREFIX || "node",
467
+ CLAWDBOT_LOG_PREFIX: baseEnv.POOLBOT_LOG_PREFIX || baseEnv.CLAWDBOT_LOG_PREFIX || "node",
467
468
  };
468
469
  if (runtime?.missingUnit) {
469
470
  defaultRuntime.error(errorText("Service unit not found."));
@@ -73,14 +73,20 @@ export function applyCliProfileEnv(params) {
73
73
  if (!profile)
74
74
  return;
75
75
  // Convenience only: fill defaults, never override explicit env values.
76
+ env.POOLBOT_PROFILE = profile;
76
77
  env.CLAWDBOT_PROFILE = profile;
77
- const stateDir = env.CLAWDBOT_STATE_DIR?.trim() || resolveProfileStateDir(profile, homedir);
78
+ const stateDir = env.POOLBOT_STATE_DIR?.trim() || env.CLAWDBOT_STATE_DIR?.trim() || resolveProfileStateDir(profile, homedir);
79
+ if (!env.POOLBOT_STATE_DIR?.trim())
80
+ env.POOLBOT_STATE_DIR = stateDir;
78
81
  if (!env.CLAWDBOT_STATE_DIR?.trim())
79
82
  env.CLAWDBOT_STATE_DIR = stateDir;
80
- if (!env.CLAWDBOT_CONFIG_PATH?.trim()) {
81
- env.CLAWDBOT_CONFIG_PATH = path.join(stateDir, "poolbot.json");
83
+ if (!env.POOLBOT_CONFIG_PATH?.trim() && !env.CLAWDBOT_CONFIG_PATH?.trim()) {
84
+ const configPath = path.join(stateDir, "poolbot.json");
85
+ env.POOLBOT_CONFIG_PATH = configPath;
86
+ env.CLAWDBOT_CONFIG_PATH = configPath;
82
87
  }
83
- if (profile === "dev" && !env.CLAWDBOT_GATEWAY_PORT?.trim()) {
88
+ if (profile === "dev" && !env.POOLBOT_GATEWAY_PORT?.trim() && !env.CLAWDBOT_GATEWAY_PORT?.trim()) {
89
+ env.POOLBOT_GATEWAY_PORT = "19001";
84
90
  env.CLAWDBOT_GATEWAY_PORT = "19001";
85
91
  }
86
92
  }
@@ -28,7 +28,7 @@ export function configureProgramHelp(program, ctx) {
28
28
  .description("")
29
29
  .version(ctx.programVersion)
30
30
  .option("--dev", "Dev profile: isolate state under ~/.poolbot-dev, default gateway port 19001, and shift derived ports (browser/canvas)")
31
- .option("--profile <name>", "Use a named profile (isolates CLAWDBOT_STATE_DIR/CLAWDBOT_CONFIG_PATH under ~/.poolbot-<name>)");
31
+ .option("--profile <name>", "Use a named profile (isolates POOLBOT_STATE_DIR/POOLBOT_CONFIG_PATH under ~/.poolbot-<name>)");
32
32
  program.option("--no-color", "Disable ANSI colors", false);
33
33
  program.configureHelp({
34
34
  optionTerm: (option) => theme.option(option.flags),
@@ -26,7 +26,7 @@ export function registerPreActionHooks(program, programVersion) {
26
26
  if (hasHelpOrVersion(argv))
27
27
  return;
28
28
  const commandPath = getCommandPath(argv, 2);
29
- const hideBanner = isTruthyEnvValue(process.env.CLAWDBOT_HIDE_BANNER) ||
29
+ const hideBanner = isTruthyEnvValue(process.env.POOLBOT_HIDE_BANNER || process.env.CLAWDBOT_HIDE_BANNER) ||
30
30
  commandPath[0] === "update" ||
31
31
  (commandPath[0] === "plugins" && commandPath[1] === "update");
32
32
  if (!hideBanner) {
@@ -116,11 +116,11 @@ ${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.molt.bot/cli/agent"
116
116
  .addHelpText("after", () => `
117
117
  ${theme.heading("Examples:")}
118
118
  ${formatHelpExamples([
119
- ['poolbot agents set-identity --agent main --name "Clawd" --emoji "🦞"', "Set name + emoji."],
120
- ["poolbot agents set-identity --agent main --avatar avatars/clawd.png", "Set avatar path."],
121
- ["poolbot agents set-identity --workspace ~/clawd --from-identity", "Load from IDENTITY.md."],
119
+ ['poolbot agents set-identity --agent main --name "Pool" --emoji "🎱"', "Set name + emoji."],
120
+ ["poolbot agents set-identity --agent main --avatar avatars/pool.png", "Set avatar path."],
121
+ ["poolbot agents set-identity --workspace ~/poolbot --from-identity", "Load from IDENTITY.md."],
122
122
  [
123
- "poolbot agents set-identity --identity-file ~/clawd/IDENTITY.md --agent main",
123
+ "poolbot agents set-identity --identity-file ~/poolbot/IDENTITY.md --agent main",
124
124
  "Use a specific IDENTITY.md.",
125
125
  ],
126
126
  ])}
@@ -23,7 +23,7 @@ export function registerOnboardCommand(program) {
23
23
  .command("onboard")
24
24
  .description("Interactive wizard to set up the gateway, workspace, and skills")
25
25
  .addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/onboard", "docs.molt.bot/cli/onboard")}\n`)
26
- .option("--workspace <dir>", "Agent workspace directory (default: ~/clawd)")
26
+ .option("--workspace <dir>", "Agent workspace directory (default: ~/poolbot)")
27
27
  .option("--reset", "Reset config + credentials + sessions + workspace before running wizard")
28
28
  .option("--non-interactive", "Run without prompts", false)
29
29
  .option("--accept-risk", "Acknowledge that agents are powerful and full system access is risky (required for --non-interactive)", false)
@@ -10,7 +10,7 @@ export function registerSetupCommand(program) {
10
10
  .command("setup")
11
11
  .description("Initialize ~/.poolbot/poolbot.json and the agent workspace")
12
12
  .addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/setup", "docs.molt.bot/cli/setup")}\n`)
13
- .option("--workspace <dir>", "Agent workspace directory (default: ~/clawd; stored as agents.defaults.workspace)")
13
+ .option("--workspace <dir>", "Agent workspace directory (default: ~/poolbot; stored as agents.defaults.workspace)")
14
14
  .option("--wizard", "Run the interactive onboarding wizard", false)
15
15
  .option("--non-interactive", "Run the wizard without prompts", false)
16
16
  .option("--mode <mode>", "Wizard mode: local|remote")
@@ -2,14 +2,14 @@ import { isTruthyEnvValue } from "../../infra/env.js";
2
2
  import { buildParseArgv, getPrimaryCommand, hasHelpOrVersion } from "../argv.js";
3
3
  import { resolveActionArgs } from "./helpers.js";
4
4
  const shouldRegisterPrimaryOnly = (argv) => {
5
- if (isTruthyEnvValue(process.env.CLAWDBOT_DISABLE_LAZY_SUBCOMMANDS))
5
+ if (isTruthyEnvValue(process.env.POOLBOT_DISABLE_LAZY_SUBCOMMANDS || process.env.CLAWDBOT_DISABLE_LAZY_SUBCOMMANDS))
6
6
  return false;
7
7
  if (hasHelpOrVersion(argv))
8
8
  return false;
9
9
  return true;
10
10
  };
11
11
  const shouldEagerRegisterSubcommands = (_argv) => {
12
- return isTruthyEnvValue(process.env.CLAWDBOT_DISABLE_LAZY_SUBCOMMANDS);
12
+ return isTruthyEnvValue(process.env.POOLBOT_DISABLE_LAZY_SUBCOMMANDS || process.env.CLAWDBOT_DISABLE_LAZY_SUBCOMMANDS);
13
13
  };
14
14
  const loadConfig = async () => {
15
15
  const mod = await import("../../config/config.js");
package/dist/cli/route.js CHANGED
@@ -14,7 +14,7 @@ async function prepareRoutedCommand(params) {
14
14
  }
15
15
  }
16
16
  export async function tryRouteCli(argv) {
17
- if (isTruthyEnvValue(process.env.CLAWDBOT_DISABLE_ROUTE_FIRST))
17
+ if (isTruthyEnvValue(process.env.POOLBOT_DISABLE_ROUTE_FIRST || process.env.CLAWDBOT_DISABLE_ROUTE_FIRST))
18
18
  return false;
19
19
  if (hasHelpOrVersion(argv))
20
20
  return false;