@hardlydifficult/chat 1.1.24 → 1.1.25
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/README.md +22 -0
- package/dist/MessageTracker.d.ts +30 -0
- package/dist/MessageTracker.d.ts.map +1 -0
- package/dist/MessageTracker.js +41 -0
- package/dist/MessageTracker.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -155,6 +155,28 @@ Post a message that the specified user can dismiss by clicking the trash reactio
|
|
|
155
155
|
await channel.postDismissable("Build complete!", user.id);
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
+
### Message Tracker
|
|
159
|
+
|
|
160
|
+
Track posted messages by key for later editing. Useful for status messages that should be updated in-place (e.g., "Worker disconnected" → "Worker reconnected").
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
import { createMessageTracker } from "@hardlydifficult/chat";
|
|
164
|
+
|
|
165
|
+
const tracker = createMessageTracker((content) => channel.postMessage(content));
|
|
166
|
+
|
|
167
|
+
// Post and track by key
|
|
168
|
+
tracker.post("worker-1", "🔴 Worker disconnected: Server A");
|
|
169
|
+
|
|
170
|
+
// Later, edit the tracked message
|
|
171
|
+
const postedAt = tracker.getPostedAt("worker-1");
|
|
172
|
+
if (postedAt !== undefined) {
|
|
173
|
+
const downtime = Date.now() - postedAt.getTime();
|
|
174
|
+
tracker.edit("worker-1", `🟢 Worker reconnected: Server A (down for ${downtime}ms)`);
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`post()` is fire-and-forget. `edit()` handles the race where the edit arrives before the original post completes — it chains on the stored promise.
|
|
179
|
+
|
|
158
180
|
### Threads
|
|
159
181
|
|
|
160
182
|
Create a thread, post messages, and listen for replies. The `Thread` object is the primary interface — all threading internals are hidden.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Message } from "./Message";
|
|
2
|
+
/**
|
|
3
|
+
* Tracks posted messages by key for later editing.
|
|
4
|
+
*
|
|
5
|
+
* Useful for status messages that should be updated in-place rather than
|
|
6
|
+
* posting a new message (e.g., "Worker disconnected" → "Worker reconnected").
|
|
7
|
+
*/
|
|
8
|
+
export interface MessageTracker {
|
|
9
|
+
/** Post a message and track it by key for later editing. */
|
|
10
|
+
post(key: string, content: string): void;
|
|
11
|
+
/** Edit a previously tracked message. Returns false if key not found. */
|
|
12
|
+
edit(key: string, content: string): boolean;
|
|
13
|
+
/** Get the timestamp when a tracked message was posted. */
|
|
14
|
+
getPostedAt(key: string): Date | undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a message tracker that posts messages via the given function
|
|
18
|
+
* and allows editing them later by key.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const tracker = createMessageTracker((content) => channel.postMessage(content));
|
|
23
|
+
*
|
|
24
|
+
* tracker.post("worker-1", "🔴 Worker disconnected: Server A");
|
|
25
|
+
* // Later, when the worker reconnects:
|
|
26
|
+
* tracker.edit("worker-1", "🟢 Worker reconnected: Server A (down for 2m 5s)");
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function createMessageTracker(postFn: (content: string) => PromiseLike<Message>): MessageTracker;
|
|
30
|
+
//# sourceMappingURL=MessageTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageTracker.d.ts","sourceRoot":"","sources":["../src/MessageTracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,yEAAyE;IACzE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,2DAA2D;IAC3D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,GAChD,cAAc,CA6BhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMessageTracker = createMessageTracker;
|
|
4
|
+
/**
|
|
5
|
+
* Create a message tracker that posts messages via the given function
|
|
6
|
+
* and allows editing them later by key.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const tracker = createMessageTracker((content) => channel.postMessage(content));
|
|
11
|
+
*
|
|
12
|
+
* tracker.post("worker-1", "🔴 Worker disconnected: Server A");
|
|
13
|
+
* // Later, when the worker reconnects:
|
|
14
|
+
* tracker.edit("worker-1", "🟢 Worker reconnected: Server A (down for 2m 5s)");
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
function createMessageTracker(postFn) {
|
|
18
|
+
const entries = new Map();
|
|
19
|
+
return {
|
|
20
|
+
post(key, content) {
|
|
21
|
+
entries.set(key, { message: postFn(content), postedAt: new Date() });
|
|
22
|
+
},
|
|
23
|
+
edit(key, content) {
|
|
24
|
+
const entry = entries.get(key);
|
|
25
|
+
if (entry === undefined) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
entries.delete(key);
|
|
29
|
+
void Promise.resolve(entry.message)
|
|
30
|
+
.then((msg) => msg.update(content))
|
|
31
|
+
.catch(() => {
|
|
32
|
+
// Swallow — message may have been dismissed or deleted
|
|
33
|
+
});
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
36
|
+
getPostedAt(key) {
|
|
37
|
+
return entries.get(key)?.postedAt;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=MessageTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageTracker.js","sourceRoot":"","sources":["../src/MessageTracker.ts"],"names":[],"mappings":";;AA8BA,oDA+BC;AA5CD;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAClC,MAAiD;IAEjD,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IAEJ,OAAO;QACL,IAAI,CAAC,GAAG,EAAE,OAAO;YACf,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,OAAO;YACf,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;iBAChC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;iBAClC,KAAK,CAAC,GAAG,EAAE;gBACV,uDAAuD;YACzD,CAAC,CAAC,CAAC;YACL,OAAO,IAAI,CAAC;QACd,CAAC;QAED,WAAW,CAAC,GAAG;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { Message } from "./Message";
|
|
|
6
6
|
export { EditableStreamReply } from "./EditableStreamReply";
|
|
7
7
|
export { StreamingReply } from "./StreamingReply";
|
|
8
8
|
export { Thread } from "./Thread";
|
|
9
|
+
export { createMessageTracker, type MessageTracker } from "./MessageTracker";
|
|
9
10
|
export { DiscordChatClient } from "./discord";
|
|
10
11
|
export { SlackChatClient } from "./slack";
|
|
11
12
|
import { type ChatClient } from "./ChatClient";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAW/D"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SlackChatClient = exports.DiscordChatClient = exports.Thread = exports.StreamingReply = exports.EditableStreamReply = exports.Message = exports.Channel = exports.ChatClient = exports.MESSAGE_LIMITS = void 0;
|
|
3
|
+
exports.SlackChatClient = exports.DiscordChatClient = exports.createMessageTracker = exports.Thread = exports.StreamingReply = exports.EditableStreamReply = exports.Message = exports.Channel = exports.ChatClient = exports.MESSAGE_LIMITS = void 0;
|
|
4
4
|
exports.createChatClient = createChatClient;
|
|
5
5
|
// Constants
|
|
6
6
|
var constants_1 = require("./constants");
|
|
@@ -18,6 +18,8 @@ var StreamingReply_1 = require("./StreamingReply");
|
|
|
18
18
|
Object.defineProperty(exports, "StreamingReply", { enumerable: true, get: function () { return StreamingReply_1.StreamingReply; } });
|
|
19
19
|
var Thread_1 = require("./Thread");
|
|
20
20
|
Object.defineProperty(exports, "Thread", { enumerable: true, get: function () { return Thread_1.Thread; } });
|
|
21
|
+
var MessageTracker_1 = require("./MessageTracker");
|
|
22
|
+
Object.defineProperty(exports, "createMessageTracker", { enumerable: true, get: function () { return MessageTracker_1.createMessageTracker; } });
|
|
21
23
|
// Platform implementations
|
|
22
24
|
var discord_1 = require("./discord");
|
|
23
25
|
Object.defineProperty(exports, "DiscordChatClient", { enumerable: true, get: function () { return discord_1.DiscordChatClient; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AA6DA,4CAWC;AArDD,YAAY;AACZ,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAEvB,eAAe;AACf,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,mDAA6E;AAApE,sHAAA,oBAAoB,OAAA;AAE7B,2BAA2B;AAC3B,qCAA8C;AAArC,4GAAA,iBAAiB,OAAA;AAC1B,iCAA0C;AAAjC,wGAAA,eAAe,OAAA;AAIxB,uCAA8C;AAC9C,mCAA0C;AAG1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,gBAAgB,CAAC,MAAkB;IACjD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,IAAI,2BAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,OAAO;YACV,OAAO,IAAI,uBAAe,CAAC,MAAM,CAAC,CAAC;QACrC;YACE,MAAM,IAAI,KAAK,CACb,0BAA2B,MAA2B,CAAC,IAAI,EAAE,CAC9D,CAAC;IACN,CAAC;AACH,CAAC"}
|