@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 +22 -6
- package/bin/mcp.js +22 -6
- package/dist/mcp/tools/tmux.d.ts +2 -0
- package/dist/mcp/tools/tmux.test.d.ts +1 -0
- package/package.json +1 -1
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.
|
|
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:
|
|
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
|
-
|
|
47025
|
-
|
|
47026
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
44213
|
-
|
|
44214
|
-
|
|
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:
|
|
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.
|
|
44259
|
+
version: "0.2.32",
|
|
44244
44260
|
description: "Real-time CLI messaging for AI agents",
|
|
44245
44261
|
type: "module",
|
|
44246
44262
|
bin: {
|
package/dist/mcp/tools/tmux.d.ts
CHANGED
|
@@ -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 {};
|