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.
Files changed (195) hide show
  1. package/.env.example +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +350 -0
  4. package/bin/agent-life-bridge.mjs +13 -0
  5. package/config.example.json +130 -0
  6. package/config.multi-agent.example.json +88 -0
  7. package/dist/agents/agent-life-session-map-store.d.ts +21 -0
  8. package/dist/agents/agent-life-session-map-store.d.ts.map +1 -0
  9. package/dist/agents/agent-life-session-map-store.js +78 -0
  10. package/dist/agents/agent-life-session-map-store.js.map +1 -0
  11. package/dist/agents/agent-resolver.d.ts +12 -0
  12. package/dist/agents/agent-resolver.d.ts.map +1 -0
  13. package/dist/agents/agent-resolver.js +114 -0
  14. package/dist/agents/agent-resolver.js.map +1 -0
  15. package/dist/agents/agent-router.d.ts +8 -0
  16. package/dist/agents/agent-router.d.ts.map +1 -0
  17. package/dist/agents/agent-router.js +72 -0
  18. package/dist/agents/agent-router.js.map +1 -0
  19. package/dist/agents/cli-backends.d.ts +25 -0
  20. package/dist/agents/cli-backends.d.ts.map +1 -0
  21. package/dist/agents/cli-backends.js +252 -0
  22. package/dist/agents/cli-backends.js.map +1 -0
  23. package/dist/agents/cli-output.d.ts +43 -0
  24. package/dist/agents/cli-output.d.ts.map +1 -0
  25. package/dist/agents/cli-output.js +352 -0
  26. package/dist/agents/cli-output.js.map +1 -0
  27. package/dist/agents/cli-runner.d.ts +32 -0
  28. package/dist/agents/cli-runner.d.ts.map +1 -0
  29. package/dist/agents/cli-runner.js +861 -0
  30. package/dist/agents/cli-runner.js.map +1 -0
  31. package/dist/agents/cli-session-store.d.ts +53 -0
  32. package/dist/agents/cli-session-store.d.ts.map +1 -0
  33. package/dist/agents/cli-session-store.js +263 -0
  34. package/dist/agents/cli-session-store.js.map +1 -0
  35. package/dist/agents/codex-app-server-runtime.d.ts +80 -0
  36. package/dist/agents/codex-app-server-runtime.d.ts.map +1 -0
  37. package/dist/agents/codex-app-server-runtime.js +1049 -0
  38. package/dist/agents/codex-app-server-runtime.js.map +1 -0
  39. package/dist/agents/fch-runtime-context.d.ts +28 -0
  40. package/dist/agents/fch-runtime-context.d.ts.map +1 -0
  41. package/dist/agents/fch-runtime-context.js +65 -0
  42. package/dist/agents/fch-runtime-context.js.map +1 -0
  43. package/dist/agents/model-selection.d.ts +28 -0
  44. package/dist/agents/model-selection.d.ts.map +1 -0
  45. package/dist/agents/model-selection.js +40 -0
  46. package/dist/agents/model-selection.js.map +1 -0
  47. package/dist/agents/models-config.d.ts +28 -0
  48. package/dist/agents/models-config.d.ts.map +1 -0
  49. package/dist/agents/models-config.js +43 -0
  50. package/dist/agents/models-config.js.map +1 -0
  51. package/dist/channels/agent-life.d.ts +9 -0
  52. package/dist/channels/agent-life.d.ts.map +1 -0
  53. package/dist/channels/agent-life.js +407 -0
  54. package/dist/channels/agent-life.js.map +1 -0
  55. package/dist/channels/command-gating.d.ts +20 -0
  56. package/dist/channels/command-gating.d.ts.map +1 -0
  57. package/dist/channels/command-gating.js +43 -0
  58. package/dist/channels/command-gating.js.map +1 -0
  59. package/dist/channels/draft-stream-controls.d.ts +21 -0
  60. package/dist/channels/draft-stream-controls.d.ts.map +1 -0
  61. package/dist/channels/draft-stream-controls.js +43 -0
  62. package/dist/channels/draft-stream-controls.js.map +1 -0
  63. package/dist/channels/draft-stream-loop.d.ts +31 -0
  64. package/dist/channels/draft-stream-loop.d.ts.map +1 -0
  65. package/dist/channels/draft-stream-loop.js +60 -0
  66. package/dist/channels/draft-stream-loop.js.map +1 -0
  67. package/dist/channels/mention-gating.d.ts +18 -0
  68. package/dist/channels/mention-gating.d.ts.map +1 -0
  69. package/dist/channels/mention-gating.js +20 -0
  70. package/dist/channels/mention-gating.js.map +1 -0
  71. package/dist/channels/registry.d.ts +5 -0
  72. package/dist/channels/registry.d.ts.map +1 -0
  73. package/dist/channels/registry.js +14 -0
  74. package/dist/channels/registry.js.map +1 -0
  75. package/dist/channels/run-state-machine.d.ts +21 -0
  76. package/dist/channels/run-state-machine.d.ts.map +1 -0
  77. package/dist/channels/run-state-machine.js +41 -0
  78. package/dist/channels/run-state-machine.js.map +1 -0
  79. package/dist/channels/session-envelope.d.ts +5 -0
  80. package/dist/channels/session-envelope.d.ts.map +1 -0
  81. package/dist/channels/session-envelope.js +16 -0
  82. package/dist/channels/session-envelope.js.map +1 -0
  83. package/dist/channels/session-id.d.ts +3 -0
  84. package/dist/channels/session-id.d.ts.map +1 -0
  85. package/dist/channels/session-id.js +11 -0
  86. package/dist/channels/session-id.js.map +1 -0
  87. package/dist/channels/session.d.ts +18 -0
  88. package/dist/channels/session.d.ts.map +1 -0
  89. package/dist/channels/session.js +35 -0
  90. package/dist/channels/session.js.map +1 -0
  91. package/dist/channels/typing-lifecycle.d.ts +16 -0
  92. package/dist/channels/typing-lifecycle.d.ts.map +1 -0
  93. package/dist/channels/typing-lifecycle.js +31 -0
  94. package/dist/channels/typing-lifecycle.js.map +1 -0
  95. package/dist/cli/cmd-add-agent.d.ts +19 -0
  96. package/dist/cli/cmd-add-agent.d.ts.map +1 -0
  97. package/dist/cli/cmd-add-agent.js +362 -0
  98. package/dist/cli/cmd-add-agent.js.map +1 -0
  99. package/dist/cli/cmd-config.d.ts +3 -0
  100. package/dist/cli/cmd-config.d.ts.map +1 -0
  101. package/dist/cli/cmd-config.js +16 -0
  102. package/dist/cli/cmd-config.js.map +1 -0
  103. package/dist/cli/cmd-doctor.d.ts +3 -0
  104. package/dist/cli/cmd-doctor.d.ts.map +1 -0
  105. package/dist/cli/cmd-doctor.js +127 -0
  106. package/dist/cli/cmd-doctor.js.map +1 -0
  107. package/dist/cli/cmd-logs.d.ts +3 -0
  108. package/dist/cli/cmd-logs.d.ts.map +1 -0
  109. package/dist/cli/cmd-logs.js +26 -0
  110. package/dist/cli/cmd-logs.js.map +1 -0
  111. package/dist/cli/cmd-onboard.d.ts +5 -0
  112. package/dist/cli/cmd-onboard.d.ts.map +1 -0
  113. package/dist/cli/cmd-onboard.js +53 -0
  114. package/dist/cli/cmd-onboard.js.map +1 -0
  115. package/dist/cli/cmd-restart.d.ts +3 -0
  116. package/dist/cli/cmd-restart.d.ts.map +1 -0
  117. package/dist/cli/cmd-restart.js +22 -0
  118. package/dist/cli/cmd-restart.js.map +1 -0
  119. package/dist/cli/cmd-start.d.ts +19 -0
  120. package/dist/cli/cmd-start.d.ts.map +1 -0
  121. package/dist/cli/cmd-start.js +783 -0
  122. package/dist/cli/cmd-start.js.map +1 -0
  123. package/dist/cli/cmd-status.d.ts +3 -0
  124. package/dist/cli/cmd-status.d.ts.map +1 -0
  125. package/dist/cli/cmd-status.js +16 -0
  126. package/dist/cli/cmd-status.js.map +1 -0
  127. package/dist/cli/cmd-stop.d.ts +9 -0
  128. package/dist/cli/cmd-stop.d.ts.map +1 -0
  129. package/dist/cli/cmd-stop.js +59 -0
  130. package/dist/cli/cmd-stop.js.map +1 -0
  131. package/dist/cli/cmd-update.d.ts +3 -0
  132. package/dist/cli/cmd-update.d.ts.map +1 -0
  133. package/dist/cli/cmd-update.js +127 -0
  134. package/dist/cli/cmd-update.js.map +1 -0
  135. package/dist/cli/cmd-version.d.ts +4 -0
  136. package/dist/cli/cmd-version.d.ts.map +1 -0
  137. package/dist/cli/cmd-version.js +12 -0
  138. package/dist/cli/cmd-version.js.map +1 -0
  139. package/dist/cli/pid-file.d.ts +23 -0
  140. package/dist/cli/pid-file.d.ts.map +1 -0
  141. package/dist/cli/pid-file.js +136 -0
  142. package/dist/cli/pid-file.js.map +1 -0
  143. package/dist/cli/run-main.d.ts +16 -0
  144. package/dist/cli/run-main.d.ts.map +1 -0
  145. package/dist/cli/run-main.js +114 -0
  146. package/dist/cli/run-main.js.map +1 -0
  147. package/dist/cli/update-check.d.ts +15 -0
  148. package/dist/cli/update-check.d.ts.map +1 -0
  149. package/dist/cli/update-check.js +187 -0
  150. package/dist/cli/update-check.js.map +1 -0
  151. package/dist/commands/prefix-router.d.ts +17 -0
  152. package/dist/commands/prefix-router.d.ts.map +1 -0
  153. package/dist/commands/prefix-router.js +79 -0
  154. package/dist/commands/prefix-router.js.map +1 -0
  155. package/dist/config/agent-dirs.d.ts +24 -0
  156. package/dist/config/agent-dirs.d.ts.map +1 -0
  157. package/dist/config/agent-dirs.js +71 -0
  158. package/dist/config/agent-dirs.js.map +1 -0
  159. package/dist/config/config.d.ts +4 -0
  160. package/dist/config/config.d.ts.map +1 -0
  161. package/dist/config/config.js +42 -0
  162. package/dist/config/config.js.map +1 -0
  163. package/dist/config/default-config.d.ts +9 -0
  164. package/dist/config/default-config.d.ts.map +1 -0
  165. package/dist/config/default-config.js +94 -0
  166. package/dist/config/default-config.js.map +1 -0
  167. package/dist/config/env-vars.d.ts +15 -0
  168. package/dist/config/env-vars.d.ts.map +1 -0
  169. package/dist/config/env-vars.js +16 -0
  170. package/dist/config/env-vars.js.map +1 -0
  171. package/dist/config/merge-config.d.ts +7 -0
  172. package/dist/config/merge-config.d.ts.map +1 -0
  173. package/dist/config/merge-config.js +45 -0
  174. package/dist/config/merge-config.js.map +1 -0
  175. package/dist/config/paths.d.ts +25 -0
  176. package/dist/config/paths.d.ts.map +1 -0
  177. package/dist/config/paths.js +31 -0
  178. package/dist/config/paths.js.map +1 -0
  179. package/dist/config/zod-schema.d.ts +3114 -0
  180. package/dist/config/zod-schema.d.ts.map +1 -0
  181. package/dist/config/zod-schema.js +217 -0
  182. package/dist/config/zod-schema.js.map +1 -0
  183. package/dist/entry.d.ts +3 -0
  184. package/dist/entry.d.ts.map +1 -0
  185. package/dist/entry.js +70 -0
  186. package/dist/entry.js.map +1 -0
  187. package/dist/logger.d.ts +5 -0
  188. package/dist/logger.d.ts.map +1 -0
  189. package/dist/logger.js +42 -0
  190. package/dist/logger.js.map +1 -0
  191. package/dist/types/index.d.ts +215 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +2 -0
  194. package/dist/types/index.js.map +1 -0
  195. 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,3 @@
1
+ export declare function generateRuntimeSessionId(now?: number): string;
2
+ export declare function isRuntimeSessionId(value: string): boolean;
3
+ //# sourceMappingURL=session-id.d.ts.map
@@ -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"}