@hasna/conversations 0.2.31 → 0.2.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.js CHANGED
@@ -14928,7 +14928,7 @@ var init_presence = __esm(() => {
14928
14928
  var require_package = __commonJS((exports, module) => {
14929
14929
  module.exports = {
14930
14930
  name: "@hasna/conversations",
14931
- version: "0.2.31",
14931
+ version: "0.2.32",
14932
14932
  description: "Real-time CLI messaging for AI agents",
14933
14933
  type: "module",
14934
14934
  bin: {
@@ -46969,6 +46969,16 @@ var init_channel = __esm(() => {
46969
46969
  function sleep2(ms) {
46970
46970
  return new Promise((resolve) => setTimeout(resolve, ms));
46971
46971
  }
46972
+ function parseOptionalDelayMs(value) {
46973
+ return typeof value === "number" && value >= 0 ? value : undefined;
46974
+ }
46975
+ function normalizeTmuxTargets(rawTargets) {
46976
+ const normalized = rawTargets.map((target) => String(target).trim());
46977
+ if (normalized.some((target) => target.length === 0)) {
46978
+ throw new Error("targets must not contain empty values");
46979
+ }
46980
+ return normalized;
46981
+ }
46972
46982
  function registerTmuxTools(server) {
46973
46983
  server.registerTool("tmux_send", {
46974
46984
  description: "Send a message to a tmux window (e.g. another agent's Claude Code session). " + "Pastes the text literally, waits for the pane to be idle, hits Enter, then verifies the message was submitted. " + "Retries up to N times on failure.",
@@ -46989,7 +46999,7 @@ function registerTmuxTools(server) {
46989
46999
  }
46990
47000
  try {
46991
47001
  const result = await tmuxSend(target.trim(), message, {
46992
- delayMs: typeof delay_ms === "number" && delay_ms > 0 ? delay_ms : undefined,
47002
+ delayMs: parseOptionalDelayMs(delay_ms),
46993
47003
  retries: typeof retries === "number" && retries > 0 ? retries : undefined,
46994
47004
  verify: verify !== false
46995
47005
  });
@@ -47021,14 +47031,20 @@ function registerTmuxTools(server) {
47021
47031
  return { content: [{ type: "text", text: "message cannot be empty" }], isError: true };
47022
47032
  }
47023
47033
  const stagger = typeof stagger_ms === "number" && stagger_ms >= 0 ? stagger_ms : 500;
47024
- const results = new Array(targets.length);
47025
- await Promise.all(targets.map(async (rawTarget, i) => {
47026
- const target = String(rawTarget).trim();
47034
+ let normalizedTargets;
47035
+ try {
47036
+ normalizedTargets = normalizeTmuxTargets(targets);
47037
+ } catch (err) {
47038
+ const msg = err instanceof Error ? err.message : String(err);
47039
+ return { content: [{ type: "text", text: msg }], isError: true };
47040
+ }
47041
+ const results = new Array(normalizedTargets.length);
47042
+ await Promise.all(normalizedTargets.map(async (target, i) => {
47027
47043
  if (i > 0 && stagger > 0)
47028
47044
  await sleep2(stagger * i);
47029
47045
  try {
47030
47046
  const result = await tmuxSend(target, message, {
47031
- delayMs: typeof delay_ms === "number" && delay_ms > 0 ? delay_ms : undefined,
47047
+ delayMs: parseOptionalDelayMs(delay_ms),
47032
47048
  retries: typeof retries === "number" && retries > 0 ? retries : undefined,
47033
47049
  verify: verify !== false
47034
47050
  });
package/bin/mcp.js CHANGED
@@ -44157,6 +44157,16 @@ async function tmuxSend(target, message, opts = {}) {
44157
44157
  function sleep2(ms) {
44158
44158
  return new Promise((resolve) => setTimeout(resolve, ms));
44159
44159
  }
44160
+ function parseOptionalDelayMs(value) {
44161
+ return typeof value === "number" && value >= 0 ? value : undefined;
44162
+ }
44163
+ function normalizeTmuxTargets(rawTargets) {
44164
+ const normalized = rawTargets.map((target) => String(target).trim());
44165
+ if (normalized.some((target) => target.length === 0)) {
44166
+ throw new Error("targets must not contain empty values");
44167
+ }
44168
+ return normalized;
44169
+ }
44160
44170
  function registerTmuxTools(server) {
44161
44171
  server.registerTool("tmux_send", {
44162
44172
  description: "Send a message to a tmux window (e.g. another agent's Claude Code session). " + "Pastes the text literally, waits for the pane to be idle, hits Enter, then verifies the message was submitted. " + "Retries up to N times on failure.",
@@ -44177,7 +44187,7 @@ function registerTmuxTools(server) {
44177
44187
  }
44178
44188
  try {
44179
44189
  const result = await tmuxSend(target.trim(), message, {
44180
- delayMs: typeof delay_ms === "number" && delay_ms > 0 ? delay_ms : undefined,
44190
+ delayMs: parseOptionalDelayMs(delay_ms),
44181
44191
  retries: typeof retries === "number" && retries > 0 ? retries : undefined,
44182
44192
  verify: verify !== false
44183
44193
  });
@@ -44209,14 +44219,20 @@ function registerTmuxTools(server) {
44209
44219
  return { content: [{ type: "text", text: "message cannot be empty" }], isError: true };
44210
44220
  }
44211
44221
  const stagger = typeof stagger_ms === "number" && stagger_ms >= 0 ? stagger_ms : 500;
44212
- const results = new Array(targets.length);
44213
- await Promise.all(targets.map(async (rawTarget, i) => {
44214
- const target = String(rawTarget).trim();
44222
+ let normalizedTargets;
44223
+ try {
44224
+ normalizedTargets = normalizeTmuxTargets(targets);
44225
+ } catch (err) {
44226
+ const msg = err instanceof Error ? err.message : String(err);
44227
+ return { content: [{ type: "text", text: msg }], isError: true };
44228
+ }
44229
+ const results = new Array(normalizedTargets.length);
44230
+ await Promise.all(normalizedTargets.map(async (target, i) => {
44215
44231
  if (i > 0 && stagger > 0)
44216
44232
  await sleep2(stagger * i);
44217
44233
  try {
44218
44234
  const result = await tmuxSend(target, message, {
44219
- delayMs: typeof delay_ms === "number" && delay_ms > 0 ? delay_ms : undefined,
44235
+ delayMs: parseOptionalDelayMs(delay_ms),
44220
44236
  retries: typeof retries === "number" && retries > 0 ? retries : undefined,
44221
44237
  verify: verify !== false
44222
44238
  });
@@ -44240,7 +44256,7 @@ function registerTmuxTools(server) {
44240
44256
  // package.json
44241
44257
  var package_default = {
44242
44258
  name: "@hasna/conversations",
44243
- version: "0.2.31",
44259
+ version: "0.2.32",
44244
44260
  description: "Real-time CLI messaging for AI agents",
44245
44261
  type: "module",
44246
44262
  bin: {
@@ -5,4 +5,6 @@
5
5
  * smart paste → wait → Enter → verify behavior.
6
6
  */
7
7
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export declare function parseOptionalDelayMs(value: unknown): number | undefined;
9
+ export declare function normalizeTmuxTargets(rawTargets: unknown[]): string[];
8
10
  export declare function registerTmuxTools(server: McpServer): void;
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/conversations",
3
- "version": "0.2.31",
3
+ "version": "0.2.32",
4
4
  "description": "Real-time CLI messaging for AI agents",
5
5
  "type": "module",
6
6
  "bin": {