agent-life-bridge 0.1.1
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/.env.example +20 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/bin/agent-life-bridge.mjs +13 -0
- package/config.example.json +130 -0
- package/config.multi-agent.example.json +88 -0
- package/dist/agents/agent-life-session-map-store.d.ts +21 -0
- package/dist/agents/agent-life-session-map-store.d.ts.map +1 -0
- package/dist/agents/agent-life-session-map-store.js +78 -0
- package/dist/agents/agent-life-session-map-store.js.map +1 -0
- package/dist/agents/agent-resolver.d.ts +12 -0
- package/dist/agents/agent-resolver.d.ts.map +1 -0
- package/dist/agents/agent-resolver.js +114 -0
- package/dist/agents/agent-resolver.js.map +1 -0
- package/dist/agents/agent-router.d.ts +8 -0
- package/dist/agents/agent-router.d.ts.map +1 -0
- package/dist/agents/agent-router.js +72 -0
- package/dist/agents/agent-router.js.map +1 -0
- package/dist/agents/cli-backends.d.ts +25 -0
- package/dist/agents/cli-backends.d.ts.map +1 -0
- package/dist/agents/cli-backends.js +252 -0
- package/dist/agents/cli-backends.js.map +1 -0
- package/dist/agents/cli-output.d.ts +43 -0
- package/dist/agents/cli-output.d.ts.map +1 -0
- package/dist/agents/cli-output.js +352 -0
- package/dist/agents/cli-output.js.map +1 -0
- package/dist/agents/cli-runner.d.ts +32 -0
- package/dist/agents/cli-runner.d.ts.map +1 -0
- package/dist/agents/cli-runner.js +861 -0
- package/dist/agents/cli-runner.js.map +1 -0
- package/dist/agents/cli-session-store.d.ts +53 -0
- package/dist/agents/cli-session-store.d.ts.map +1 -0
- package/dist/agents/cli-session-store.js +263 -0
- package/dist/agents/cli-session-store.js.map +1 -0
- package/dist/agents/codex-app-server-runtime.d.ts +80 -0
- package/dist/agents/codex-app-server-runtime.d.ts.map +1 -0
- package/dist/agents/codex-app-server-runtime.js +1049 -0
- package/dist/agents/codex-app-server-runtime.js.map +1 -0
- package/dist/agents/fch-runtime-context.d.ts +28 -0
- package/dist/agents/fch-runtime-context.d.ts.map +1 -0
- package/dist/agents/fch-runtime-context.js +65 -0
- package/dist/agents/fch-runtime-context.js.map +1 -0
- package/dist/agents/model-selection.d.ts +28 -0
- package/dist/agents/model-selection.d.ts.map +1 -0
- package/dist/agents/model-selection.js +40 -0
- package/dist/agents/model-selection.js.map +1 -0
- package/dist/agents/models-config.d.ts +28 -0
- package/dist/agents/models-config.d.ts.map +1 -0
- package/dist/agents/models-config.js +43 -0
- package/dist/agents/models-config.js.map +1 -0
- package/dist/channels/agent-life.d.ts +9 -0
- package/dist/channels/agent-life.d.ts.map +1 -0
- package/dist/channels/agent-life.js +407 -0
- package/dist/channels/agent-life.js.map +1 -0
- package/dist/channels/command-gating.d.ts +20 -0
- package/dist/channels/command-gating.d.ts.map +1 -0
- package/dist/channels/command-gating.js +43 -0
- package/dist/channels/command-gating.js.map +1 -0
- package/dist/channels/draft-stream-controls.d.ts +21 -0
- package/dist/channels/draft-stream-controls.d.ts.map +1 -0
- package/dist/channels/draft-stream-controls.js +43 -0
- package/dist/channels/draft-stream-controls.js.map +1 -0
- package/dist/channels/draft-stream-loop.d.ts +31 -0
- package/dist/channels/draft-stream-loop.d.ts.map +1 -0
- package/dist/channels/draft-stream-loop.js +60 -0
- package/dist/channels/draft-stream-loop.js.map +1 -0
- package/dist/channels/mention-gating.d.ts +18 -0
- package/dist/channels/mention-gating.d.ts.map +1 -0
- package/dist/channels/mention-gating.js +20 -0
- package/dist/channels/mention-gating.js.map +1 -0
- package/dist/channels/registry.d.ts +5 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +14 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/run-state-machine.d.ts +21 -0
- package/dist/channels/run-state-machine.d.ts.map +1 -0
- package/dist/channels/run-state-machine.js +41 -0
- package/dist/channels/run-state-machine.js.map +1 -0
- package/dist/channels/session-envelope.d.ts +5 -0
- package/dist/channels/session-envelope.d.ts.map +1 -0
- package/dist/channels/session-envelope.js +16 -0
- package/dist/channels/session-envelope.js.map +1 -0
- package/dist/channels/session-id.d.ts +3 -0
- package/dist/channels/session-id.d.ts.map +1 -0
- package/dist/channels/session-id.js +11 -0
- package/dist/channels/session-id.js.map +1 -0
- package/dist/channels/session.d.ts +18 -0
- package/dist/channels/session.d.ts.map +1 -0
- package/dist/channels/session.js +35 -0
- package/dist/channels/session.js.map +1 -0
- package/dist/channels/typing-lifecycle.d.ts +16 -0
- package/dist/channels/typing-lifecycle.d.ts.map +1 -0
- package/dist/channels/typing-lifecycle.js +31 -0
- package/dist/channels/typing-lifecycle.js.map +1 -0
- package/dist/cli/cmd-add-agent.d.ts +19 -0
- package/dist/cli/cmd-add-agent.d.ts.map +1 -0
- package/dist/cli/cmd-add-agent.js +362 -0
- package/dist/cli/cmd-add-agent.js.map +1 -0
- package/dist/cli/cmd-config.d.ts +3 -0
- package/dist/cli/cmd-config.d.ts.map +1 -0
- package/dist/cli/cmd-config.js +16 -0
- package/dist/cli/cmd-config.js.map +1 -0
- package/dist/cli/cmd-doctor.d.ts +3 -0
- package/dist/cli/cmd-doctor.d.ts.map +1 -0
- package/dist/cli/cmd-doctor.js +127 -0
- package/dist/cli/cmd-doctor.js.map +1 -0
- package/dist/cli/cmd-logs.d.ts +3 -0
- package/dist/cli/cmd-logs.d.ts.map +1 -0
- package/dist/cli/cmd-logs.js +26 -0
- package/dist/cli/cmd-logs.js.map +1 -0
- package/dist/cli/cmd-onboard.d.ts +5 -0
- package/dist/cli/cmd-onboard.d.ts.map +1 -0
- package/dist/cli/cmd-onboard.js +53 -0
- package/dist/cli/cmd-onboard.js.map +1 -0
- package/dist/cli/cmd-restart.d.ts +3 -0
- package/dist/cli/cmd-restart.d.ts.map +1 -0
- package/dist/cli/cmd-restart.js +22 -0
- package/dist/cli/cmd-restart.js.map +1 -0
- package/dist/cli/cmd-start.d.ts +19 -0
- package/dist/cli/cmd-start.d.ts.map +1 -0
- package/dist/cli/cmd-start.js +783 -0
- package/dist/cli/cmd-start.js.map +1 -0
- package/dist/cli/cmd-status.d.ts +3 -0
- package/dist/cli/cmd-status.d.ts.map +1 -0
- package/dist/cli/cmd-status.js +16 -0
- package/dist/cli/cmd-status.js.map +1 -0
- package/dist/cli/cmd-stop.d.ts +9 -0
- package/dist/cli/cmd-stop.d.ts.map +1 -0
- package/dist/cli/cmd-stop.js +59 -0
- package/dist/cli/cmd-stop.js.map +1 -0
- package/dist/cli/cmd-update.d.ts +3 -0
- package/dist/cli/cmd-update.d.ts.map +1 -0
- package/dist/cli/cmd-update.js +127 -0
- package/dist/cli/cmd-update.js.map +1 -0
- package/dist/cli/cmd-version.d.ts +4 -0
- package/dist/cli/cmd-version.d.ts.map +1 -0
- package/dist/cli/cmd-version.js +12 -0
- package/dist/cli/cmd-version.js.map +1 -0
- package/dist/cli/pid-file.d.ts +23 -0
- package/dist/cli/pid-file.d.ts.map +1 -0
- package/dist/cli/pid-file.js +136 -0
- package/dist/cli/pid-file.js.map +1 -0
- package/dist/cli/run-main.d.ts +16 -0
- package/dist/cli/run-main.d.ts.map +1 -0
- package/dist/cli/run-main.js +114 -0
- package/dist/cli/run-main.js.map +1 -0
- package/dist/cli/update-check.d.ts +15 -0
- package/dist/cli/update-check.d.ts.map +1 -0
- package/dist/cli/update-check.js +187 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/commands/prefix-router.d.ts +17 -0
- package/dist/commands/prefix-router.d.ts.map +1 -0
- package/dist/commands/prefix-router.js +79 -0
- package/dist/commands/prefix-router.js.map +1 -0
- package/dist/config/agent-dirs.d.ts +24 -0
- package/dist/config/agent-dirs.d.ts.map +1 -0
- package/dist/config/agent-dirs.js +71 -0
- package/dist/config/agent-dirs.js.map +1 -0
- package/dist/config/config.d.ts +4 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +42 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/default-config.d.ts +9 -0
- package/dist/config/default-config.d.ts.map +1 -0
- package/dist/config/default-config.js +94 -0
- package/dist/config/default-config.js.map +1 -0
- package/dist/config/env-vars.d.ts +15 -0
- package/dist/config/env-vars.d.ts.map +1 -0
- package/dist/config/env-vars.js +16 -0
- package/dist/config/env-vars.js.map +1 -0
- package/dist/config/merge-config.d.ts +7 -0
- package/dist/config/merge-config.d.ts.map +1 -0
- package/dist/config/merge-config.js +45 -0
- package/dist/config/merge-config.js.map +1 -0
- package/dist/config/paths.d.ts +25 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +31 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/zod-schema.d.ts +3114 -0
- package/dist/config/zod-schema.d.ts.map +1 -0
- package/dist/config/zod-schema.js +217 -0
- package/dist/config/zod-schema.js.map +1 -0
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +70 -0
- package/dist/entry.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +42 -0
- package/dist/logger.js.map +1 -0
- package/dist/types/index.d.ts +215 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages the streaming reply lifecycle:
|
|
3
|
+
* 1. First chunk → sendMessage (creates the message, gets message_id)
|
|
4
|
+
* 2. Subsequent chunks → editMessageText (updates in place, debounced)
|
|
5
|
+
* 3. On complete → final editMessageText with full content
|
|
6
|
+
*/
|
|
7
|
+
export class DraftStreamLoop {
|
|
8
|
+
messageId = null;
|
|
9
|
+
buffer = '';
|
|
10
|
+
debounceTimer = null;
|
|
11
|
+
opts;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.opts = {
|
|
14
|
+
debounceMs: 1000,
|
|
15
|
+
...opts,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async push(chunk) {
|
|
19
|
+
this.buffer += chunk;
|
|
20
|
+
if (this.messageId === null) {
|
|
21
|
+
// First chunk: send initial message, capture message_id
|
|
22
|
+
this.messageId = await this.opts.send(this.buffer);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Schedule debounced edit
|
|
26
|
+
this.scheduleEdit();
|
|
27
|
+
}
|
|
28
|
+
async complete() {
|
|
29
|
+
// Cancel pending debounce
|
|
30
|
+
if (this.debounceTimer) {
|
|
31
|
+
clearTimeout(this.debounceTimer);
|
|
32
|
+
this.debounceTimer = null;
|
|
33
|
+
}
|
|
34
|
+
// Final edit with complete content
|
|
35
|
+
if (this.messageId !== null && this.buffer) {
|
|
36
|
+
await this.opts.edit(this.messageId, this.buffer);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
scheduleEdit() {
|
|
40
|
+
if (this.debounceTimer)
|
|
41
|
+
return;
|
|
42
|
+
if (this.messageId === null)
|
|
43
|
+
return;
|
|
44
|
+
this.debounceTimer = setTimeout(async () => {
|
|
45
|
+
this.debounceTimer = null;
|
|
46
|
+
if (this.messageId !== null) {
|
|
47
|
+
try {
|
|
48
|
+
await this.opts.edit(this.messageId, this.buffer);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
this.opts.logger.warn({ err }, 'Failed to edit message in stream');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}, this.opts.debounceMs);
|
|
55
|
+
}
|
|
56
|
+
getBuffer() {
|
|
57
|
+
return this.buffer;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=draft-stream-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-stream-loop.js","sourceRoot":"","sources":["../../src/channels/draft-stream-loop.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IAClB,SAAS,GAAkB,IAAI,CAAA;IAC/B,MAAM,GAAG,EAAE,CAAA;IACX,aAAa,GAA0B,IAAI,CAAA;IAClC,IAAI,CAA2B;IAEhD,YAAY,IAAqB;QAC/B,IAAI,CAAC,IAAI,GAAG;YACV,UAAU,EAAE,IAAI;YAChB,GAAG,IAAI;SACR,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa;QACtB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;QAEpB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,wDAAwD;YACxD,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAClD,OAAM;QACR,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,0BAA0B;QAC1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC3B,CAAC;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAM;QAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAM;QAEnC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YACzB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;gBACnD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAA;gBACpE,CAAC;YACH,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC1B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects whether a message is directed at a specific bot via @mention.
|
|
3
|
+
* In group/multi_bot chats, agents should only respond when mentioned.
|
|
4
|
+
*/
|
|
5
|
+
export interface MentionGatingOpts {
|
|
6
|
+
/** The bot's username (without @) */
|
|
7
|
+
botUsername: string;
|
|
8
|
+
/** Chat type */
|
|
9
|
+
chatType: 'private' | 'group' | 'multi_bot';
|
|
10
|
+
/** Extracted @mentions from the message */
|
|
11
|
+
mentions: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function isMentioned(opts: MentionGatingOpts): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Strip @mention prefix from message text for cleaner agent input.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripMentions(text: string, mentions: string[]): string;
|
|
18
|
+
//# sourceMappingURL=mention-gating.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention-gating.d.ts","sourceRoot":"","sources":["../../src/channels/mention-gating.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB;IAChB,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAA;IAC3C,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAQtE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function isMentioned(opts) {
|
|
2
|
+
// In private chats, always respond
|
|
3
|
+
if (opts.chatType === 'private')
|
|
4
|
+
return true;
|
|
5
|
+
const botUsernameLower = opts.botUsername.toLowerCase();
|
|
6
|
+
return opts.mentions.some(m => m.toLowerCase() === botUsernameLower);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Strip @mention prefix from message text for cleaner agent input.
|
|
10
|
+
*/
|
|
11
|
+
export function stripMentions(text, mentions) {
|
|
12
|
+
let result = text;
|
|
13
|
+
for (const mention of mentions) {
|
|
14
|
+
// Escape special regex characters in username to prevent ReDoS
|
|
15
|
+
const escaped = mention.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
16
|
+
result = result.replace(new RegExp(`@${escaped}\\s*`, 'gi'), '');
|
|
17
|
+
}
|
|
18
|
+
return result.trim();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=mention-gating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention-gating.js","sourceRoot":"","sources":["../../src/channels/mention-gating.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,mCAAmC;IACnC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAE5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,CAAA;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAkB;IAC5D,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,+DAA+D;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ChannelPlugin } from '../types/index.js';
|
|
2
|
+
export declare function registerChannel(plugin: ChannelPlugin): void;
|
|
3
|
+
export declare function getChannel(id: string): ChannelPlugin | undefined;
|
|
4
|
+
export declare function getAllChannels(): ChannelPlugin[];
|
|
5
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAK3D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhE;AAED,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAEhD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const registry = new Map();
|
|
2
|
+
export function registerChannel(plugin) {
|
|
3
|
+
if (registry.has(plugin.id)) {
|
|
4
|
+
throw new Error(`Channel plugin "${plugin.id}" is already registered`);
|
|
5
|
+
}
|
|
6
|
+
registry.set(plugin.id, plugin);
|
|
7
|
+
}
|
|
8
|
+
export function getChannel(id) {
|
|
9
|
+
return registry.get(id);
|
|
10
|
+
}
|
|
11
|
+
export function getAllChannels() {
|
|
12
|
+
return Array.from(registry.values());
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAA;AAEjD,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAA;IACxE,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Logger } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Channel lifecycle states.
|
|
4
|
+
*
|
|
5
|
+
* Transitions:
|
|
6
|
+
* idle → connecting → polling → disconnected → connecting (retry loop)
|
|
7
|
+
* ↓
|
|
8
|
+
* stopped
|
|
9
|
+
*/
|
|
10
|
+
export type ChannelState = 'idle' | 'connecting' | 'polling' | 'disconnected' | 'stopped';
|
|
11
|
+
export type StateChangeHandler = (from: ChannelState, to: ChannelState) => void;
|
|
12
|
+
export declare class ChannelStateMachine {
|
|
13
|
+
private state;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly handlers;
|
|
16
|
+
constructor(logger: Logger);
|
|
17
|
+
getState(): ChannelState;
|
|
18
|
+
onStateChange(handler: StateChangeHandler): void;
|
|
19
|
+
transition(to: ChannelState): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=run-state-machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state-machine.d.ts","sourceRoot":"","sources":["../../src/channels/run-state-machine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAA;AAEzF,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;AAE/E,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;gBAExC,MAAM,EAAE,MAAM;IAI1B,QAAQ,IAAI,YAAY;IAIxB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIhD,UAAU,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;CAqBnC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class ChannelStateMachine {
|
|
2
|
+
state = 'idle';
|
|
3
|
+
logger;
|
|
4
|
+
handlers = [];
|
|
5
|
+
constructor(logger) {
|
|
6
|
+
this.logger = logger;
|
|
7
|
+
}
|
|
8
|
+
getState() {
|
|
9
|
+
return this.state;
|
|
10
|
+
}
|
|
11
|
+
onStateChange(handler) {
|
|
12
|
+
this.handlers.push(handler);
|
|
13
|
+
}
|
|
14
|
+
transition(to) {
|
|
15
|
+
const from = this.state;
|
|
16
|
+
// Validate transitions
|
|
17
|
+
const valid = TRANSITIONS[from];
|
|
18
|
+
if (!valid?.includes(to)) {
|
|
19
|
+
this.logger.warn({ from, to }, 'Invalid state transition attempted');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
this.state = to;
|
|
23
|
+
this.logger.info({ from, to }, 'Channel state transition');
|
|
24
|
+
for (const handler of this.handlers) {
|
|
25
|
+
try {
|
|
26
|
+
handler(from, to);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
this.logger.warn({ err }, 'State change handler error');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const TRANSITIONS = {
|
|
35
|
+
idle: ['connecting'],
|
|
36
|
+
connecting: ['polling', 'disconnected', 'stopped'],
|
|
37
|
+
polling: ['disconnected', 'stopped'],
|
|
38
|
+
disconnected: ['connecting', 'stopped'],
|
|
39
|
+
stopped: [],
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=run-state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state-machine.js","sourceRoot":"","sources":["../../src/channels/run-state-machine.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,mBAAmB;IACtB,KAAK,GAAiB,MAAM,CAAA;IACnB,MAAM,CAAQ;IACd,QAAQ,GAAyB,EAAE,CAAA;IAEpD,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,aAAa,CAAC,OAA2B;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;IAED,UAAU,CAAC,EAAgB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QAEvB,uBAAuB;QACvB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAA;QAE1D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,WAAW,GAAyC;IACxD,IAAI,EAAE,CAAC,YAAY,CAAC;IACpB,UAAU,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,CAAC;IAClD,OAAO,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC;IACpC,YAAY,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;IACvC,OAAO,EAAE,EAAE;CACZ,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SessionEnvelope } from '../types/index.js';
|
|
2
|
+
export type { SessionEnvelope };
|
|
3
|
+
export declare function makeSessionId(botToken: string, chatId: number | string, messageThreadId?: number): string;
|
|
4
|
+
export declare function isValidEnvelope(envelope: unknown): envelope is SessionEnvelope;
|
|
5
|
+
//# sourceMappingURL=session-envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-envelope.d.ts","sourceRoot":"","sources":["../../src/channels/session-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,eAAe,CAS9E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function makeSessionId(botToken, chatId, messageThreadId) {
|
|
2
|
+
if (typeof messageThreadId === 'number' && Number.isFinite(messageThreadId)) {
|
|
3
|
+
return `${botToken}:${chatId}:thread:${messageThreadId}`;
|
|
4
|
+
}
|
|
5
|
+
return `${botToken}:${chatId}`;
|
|
6
|
+
}
|
|
7
|
+
export function isValidEnvelope(envelope) {
|
|
8
|
+
if (!envelope || typeof envelope !== 'object')
|
|
9
|
+
return false;
|
|
10
|
+
const e = envelope;
|
|
11
|
+
return (typeof e.sessionId === 'string' &&
|
|
12
|
+
typeof e.source === 'object' &&
|
|
13
|
+
typeof e.content === 'object' &&
|
|
14
|
+
typeof e.meta === 'object');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=session-envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-envelope.js","sourceRoot":"","sources":["../../src/channels/session-envelope.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,MAAuB,EACvB,eAAwB;IAExB,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5E,OAAO,GAAG,QAAQ,IAAI,MAAM,WAAW,eAAe,EAAE,CAAA;IAC1D,CAAC;IACD,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3D,MAAM,CAAC,GAAG,QAAmC,CAAA;IAC7C,OAAO,CACL,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC3B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-id.d.ts","sourceRoot":"","sources":["../../src/channels/session-id.ts"],"names":[],"mappings":"AAIA,wBAAgB,wBAAwB,CAAC,GAAG,SAAa,GAAG,MAAM,CAIjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
const SESSION_ID_PATTERN = /^sess_[0-9a-z]{10,18}_[0-9A-Za-z_-]{8}$/;
|
|
3
|
+
export function generateRuntimeSessionId(now = Date.now()) {
|
|
4
|
+
const timestamp = Math.max(0, Math.floor(now)).toString(36).padStart(10, '0');
|
|
5
|
+
const randomPart = randomBytes(6).toString('base64url').slice(0, 8);
|
|
6
|
+
return `sess_${timestamp}_${randomPart}`;
|
|
7
|
+
}
|
|
8
|
+
export function isRuntimeSessionId(value) {
|
|
9
|
+
return SESSION_ID_PATTERN.test(value);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=session-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-id.js","sourceRoot":"","sources":["../../src/channels/session-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,kBAAkB,GAAG,yCAAyC,CAAA;AAEpE,MAAM,UAAU,wBAAwB,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnE,OAAO,QAAQ,SAAS,IAAI,UAAU,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Logger, SessionEnvelope } from '../types/index.js';
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
chatId: number | string;
|
|
5
|
+
chatType: 'private' | 'group' | 'multi_bot';
|
|
6
|
+
createdAt: number;
|
|
7
|
+
lastActivityAt: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class SessionManager {
|
|
10
|
+
private sessions;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(logger: Logger);
|
|
13
|
+
getOrCreate(envelope: SessionEnvelope): Session;
|
|
14
|
+
get(sessionId: string): Session | undefined;
|
|
15
|
+
delete(sessionId: string): void;
|
|
16
|
+
size(): number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/channels/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEhE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAA;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,MAAM;IAI1B,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO;IAoB/C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK/B,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class SessionManager {
|
|
2
|
+
sessions = new Map();
|
|
3
|
+
logger;
|
|
4
|
+
constructor(logger) {
|
|
5
|
+
this.logger = logger;
|
|
6
|
+
}
|
|
7
|
+
getOrCreate(envelope) {
|
|
8
|
+
const existing = this.sessions.get(envelope.sessionId);
|
|
9
|
+
if (existing) {
|
|
10
|
+
existing.lastActivityAt = Date.now();
|
|
11
|
+
return existing;
|
|
12
|
+
}
|
|
13
|
+
const session = {
|
|
14
|
+
id: envelope.sessionId,
|
|
15
|
+
chatId: envelope.source.chatId,
|
|
16
|
+
chatType: envelope.source.chatType,
|
|
17
|
+
createdAt: Date.now(),
|
|
18
|
+
lastActivityAt: Date.now(),
|
|
19
|
+
};
|
|
20
|
+
this.sessions.set(session.id, session);
|
|
21
|
+
this.logger.info({ sessionId: session.id, chatType: session.chatType }, 'New session created');
|
|
22
|
+
return session;
|
|
23
|
+
}
|
|
24
|
+
get(sessionId) {
|
|
25
|
+
return this.sessions.get(sessionId);
|
|
26
|
+
}
|
|
27
|
+
delete(sessionId) {
|
|
28
|
+
this.sessions.delete(sessionId);
|
|
29
|
+
this.logger.info({ sessionId }, 'Session deleted');
|
|
30
|
+
}
|
|
31
|
+
size() {
|
|
32
|
+
return this.sessions.size;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/channels/session.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC5B,MAAM,CAAQ;IAE/B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,WAAW,CAAC,QAAyB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACpC,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,QAAQ,CAAC,SAAS;YACtB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;YAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;YAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;SAC3B,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,qBAAqB,CAAC,CAAA;QAC9F,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,CAAC,CAAA;IACpD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAA;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from '../types/index.js';
|
|
2
|
+
export type SendTypingFn = () => Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Sends periodic "typing" indicators while an agent is working.
|
|
5
|
+
* Most platforms require the typing action to be re-sent every ~5s.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TypingLifecycle {
|
|
8
|
+
private timer;
|
|
9
|
+
private readonly sendTyping;
|
|
10
|
+
private readonly intervalMs;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(sendTyping: SendTypingFn, intervalMs?: number, logger?: Logger);
|
|
13
|
+
start(): void;
|
|
14
|
+
stop(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=typing-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typing-lifecycle.d.ts","sourceRoot":"","sources":["../../src/channels/typing-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;AAE9C;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,UAAU,EAAE,YAAY,EAAE,UAAU,SAAO,EAAE,MAAM,CAAC,EAAE,MAAM;IAMxE,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;CAMb"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sends periodic "typing" indicators while an agent is working.
|
|
3
|
+
* Most platforms require the typing action to be re-sent every ~5s.
|
|
4
|
+
*/
|
|
5
|
+
export class TypingLifecycle {
|
|
6
|
+
timer = null;
|
|
7
|
+
sendTyping;
|
|
8
|
+
intervalMs;
|
|
9
|
+
logger;
|
|
10
|
+
constructor(sendTyping, intervalMs = 4000, logger) {
|
|
11
|
+
this.sendTyping = sendTyping;
|
|
12
|
+
this.intervalMs = intervalMs;
|
|
13
|
+
this.logger = logger ?? { warn: () => { }, info: () => { } };
|
|
14
|
+
}
|
|
15
|
+
start() {
|
|
16
|
+
if (this.timer)
|
|
17
|
+
return;
|
|
18
|
+
// Send immediately, then repeat
|
|
19
|
+
this.sendTyping().catch(err => this.logger.warn({ err }, 'Failed to send typing indicator'));
|
|
20
|
+
this.timer = setInterval(() => {
|
|
21
|
+
this.sendTyping().catch(err => this.logger.warn({ err }, 'Failed to send typing indicator'));
|
|
22
|
+
}, this.intervalMs);
|
|
23
|
+
}
|
|
24
|
+
stop() {
|
|
25
|
+
if (this.timer) {
|
|
26
|
+
clearInterval(this.timer);
|
|
27
|
+
this.timer = null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=typing-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typing-lifecycle.js","sourceRoot":"","sources":["../../src/channels/typing-lifecycle.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAA0B,IAAI,CAAA;IAC1B,UAAU,CAAc;IACxB,UAAU,CAAQ;IAClB,MAAM,CAAQ;IAE/B,YAAY,UAAwB,EAAE,UAAU,GAAG,IAAI,EAAE,MAAe;QACtE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,IAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAwB,CAAA;IACnF,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAM;QACtB,gCAAgC;QAChC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC,CAAA;QAC5F,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC,CAAA;QAC9F,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IACrB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AppConfig } from '../config/zod-schema.js';
|
|
2
|
+
import type { CliArgs } from './run-main.js';
|
|
3
|
+
export interface AddAgentInput {
|
|
4
|
+
id: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
workspace?: string;
|
|
8
|
+
cliSessionId?: string;
|
|
9
|
+
default?: boolean;
|
|
10
|
+
accountId?: string;
|
|
11
|
+
account?: {
|
|
12
|
+
id: string;
|
|
13
|
+
gatewayUrl: string;
|
|
14
|
+
botToken: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare function addAgentToConfig(config: AppConfig, input: AddAgentInput): AppConfig;
|
|
18
|
+
export declare function cmdAddAgent(args: CliArgs): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=cmd-add-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-add-agent.d.ts","sourceRoot":"","sources":["../../src/cli/cmd-add-agent.ts"],"names":[],"mappings":"AAQA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAI5C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE;QACR,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AA0DD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,CA4FnF;AAyPD,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E9D"}
|