@jait/gateway 0.1.477 → 0.1.481

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 (157) hide show
  1. package/dist/channels/manager.d.ts +97 -0
  2. package/dist/channels/manager.d.ts.map +1 -0
  3. package/dist/channels/manager.js +278 -0
  4. package/dist/channels/manager.js.map +1 -0
  5. package/dist/channels/msteams/connector.d.ts +83 -0
  6. package/dist/channels/msteams/connector.d.ts.map +1 -0
  7. package/dist/channels/msteams/connector.js +413 -0
  8. package/dist/channels/msteams/connector.js.map +1 -0
  9. package/dist/channels/telegram/connector.d.ts +48 -0
  10. package/dist/channels/telegram/connector.d.ts.map +1 -0
  11. package/dist/channels/telegram/connector.js +127 -0
  12. package/dist/channels/telegram/connector.js.map +1 -0
  13. package/dist/channels/types.d.ts +74 -0
  14. package/dist/channels/types.d.ts.map +1 -0
  15. package/dist/channels/types.js +9 -0
  16. package/dist/channels/types.js.map +1 -0
  17. package/dist/channels/whatsapp/connector.d.ts +96 -0
  18. package/dist/channels/whatsapp/connector.d.ts.map +1 -0
  19. package/dist/channels/whatsapp/connector.js +189 -0
  20. package/dist/channels/whatsapp/connector.js.map +1 -0
  21. package/dist/db/migrations.d.ts.map +1 -1
  22. package/dist/db/migrations.js +15 -0
  23. package/dist/db/migrations.js.map +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +37 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/plugins/contracts.d.ts +3 -0
  28. package/dist/plugins/contracts.d.ts.map +1 -1
  29. package/dist/plugins/contracts.js.map +1 -1
  30. package/dist/plugins/manager.d.ts +3 -0
  31. package/dist/plugins/manager.d.ts.map +1 -1
  32. package/dist/plugins/manager.js +21 -0
  33. package/dist/plugins/manager.js.map +1 -1
  34. package/dist/plugins/manifest.d.ts +7 -0
  35. package/dist/plugins/manifest.d.ts.map +1 -1
  36. package/dist/plugins/manifest.js.map +1 -1
  37. package/dist/plugins/openclaw-adapter.d.ts.map +1 -1
  38. package/dist/plugins/openclaw-adapter.js +68 -6
  39. package/dist/plugins/openclaw-adapter.js.map +1 -1
  40. package/dist/routes/channels.d.ts +14 -0
  41. package/dist/routes/channels.d.ts.map +1 -0
  42. package/dist/routes/channels.js +77 -0
  43. package/dist/routes/channels.js.map +1 -0
  44. package/dist/routes/chat.d.ts +3 -0
  45. package/dist/routes/chat.d.ts.map +1 -1
  46. package/dist/routes/chat.js +94 -14
  47. package/dist/routes/chat.js.map +1 -1
  48. package/dist/routes/plugins.d.ts +2 -1
  49. package/dist/routes/plugins.d.ts.map +1 -1
  50. package/dist/routes/plugins.js +31 -3
  51. package/dist/routes/plugins.js.map +1 -1
  52. package/dist/routes/skills.d.ts +3 -3
  53. package/dist/routes/skills.d.ts.map +1 -1
  54. package/dist/routes/skills.js +42 -19
  55. package/dist/routes/skills.js.map +1 -1
  56. package/dist/routes/store.d.ts.map +1 -1
  57. package/dist/routes/store.js +9 -55
  58. package/dist/routes/store.js.map +1 -1
  59. package/dist/server.d.ts +1 -0
  60. package/dist/server.d.ts.map +1 -1
  61. package/dist/server.js +7 -1
  62. package/dist/server.js.map +1 -1
  63. package/dist/services/git.d.ts +9 -0
  64. package/dist/services/git.d.ts.map +1 -1
  65. package/dist/services/git.js +19 -4
  66. package/dist/services/git.js.map +1 -1
  67. package/dist/services/thread-router.d.ts +7 -0
  68. package/dist/services/thread-router.d.ts.map +1 -1
  69. package/dist/services/thread-router.js +41 -2
  70. package/dist/services/thread-router.js.map +1 -1
  71. package/dist/skills/index.d.ts +40 -2
  72. package/dist/skills/index.d.ts.map +1 -1
  73. package/dist/skills/index.js +135 -4
  74. package/dist/skills/index.js.map +1 -1
  75. package/dist/skills/install.d.ts +42 -0
  76. package/dist/skills/install.d.ts.map +1 -0
  77. package/dist/skills/install.js +94 -0
  78. package/dist/skills/install.js.map +1 -0
  79. package/dist/tools/homeassistant-tools.d.ts +18 -0
  80. package/dist/tools/homeassistant-tools.d.ts.map +1 -0
  81. package/dist/tools/homeassistant-tools.js +210 -0
  82. package/dist/tools/homeassistant-tools.js.map +1 -0
  83. package/dist/tools/index.d.ts +1 -0
  84. package/dist/tools/index.d.ts.map +1 -1
  85. package/dist/tools/index.js +1 -0
  86. package/dist/tools/index.js.map +1 -1
  87. package/dist/tools/prompts/prompt-registry.d.ts +2 -0
  88. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
  89. package/dist/tools/prompts/prompt-registry.js +10 -0
  90. package/dist/tools/prompts/prompt-registry.js.map +1 -1
  91. package/dist/tools/skill-tools.d.ts +46 -0
  92. package/dist/tools/skill-tools.d.ts.map +1 -0
  93. package/dist/tools/skill-tools.js +211 -0
  94. package/dist/tools/skill-tools.js.map +1 -0
  95. package/dist/tools/tool-names.d.ts +2 -0
  96. package/dist/tools/tool-names.d.ts.map +1 -1
  97. package/dist/tools/tool-names.js +3 -0
  98. package/dist/tools/tool-names.js.map +1 -1
  99. package/package.json +6 -2
  100. package/web-dist/assets/{_basePickBy-BlH3VSG_.js → _basePickBy-qZfmOA0w.js} +1 -1
  101. package/web-dist/assets/{_baseUniq-C76REEdE.js → _baseUniq-Bic_0Ku1.js} +1 -1
  102. package/web-dist/assets/{arc-Ci7Y5-uI.js → arc-CEc8Gtj6.js} +1 -1
  103. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CB1I42fi.js → architectureDiagram-2XIMDMQ5-BU1Io8ja.js} +1 -1
  104. package/web-dist/assets/{blockDiagram-WCTKOSBZ-Ck9FbYo9.js → blockDiagram-WCTKOSBZ-sCUOeM9Y.js} +1 -1
  105. package/web-dist/assets/{c4Diagram-IC4MRINW-CHW6f5Qe.js → c4Diagram-IC4MRINW-kYgaGoR6.js} +1 -1
  106. package/web-dist/assets/channel-BPhEc6il.js +1 -0
  107. package/web-dist/assets/{chunk-4BX2VUAB-BRGmnck_.js → chunk-4BX2VUAB-g9fQ-S69.js} +1 -1
  108. package/web-dist/assets/{chunk-55IACEB6-rETTuU6z.js → chunk-55IACEB6-Ct3rpton.js} +1 -1
  109. package/web-dist/assets/{chunk-FMBD7UC4-DktgxKPB.js → chunk-FMBD7UC4-BYYKYT48.js} +1 -1
  110. package/web-dist/assets/{chunk-JSJVCQXG-Dfliu4AK.js → chunk-JSJVCQXG-BsVoy3Ui.js} +1 -1
  111. package/web-dist/assets/{chunk-KX2RTZJC-S3sGjO49.js → chunk-KX2RTZJC-CicUJ_9h.js} +1 -1
  112. package/web-dist/assets/{chunk-NQ4KR5QH-DHscTcf9.js → chunk-NQ4KR5QH-Yvo4cuvD.js} +1 -1
  113. package/web-dist/assets/{chunk-QZHKN3VN-B-4VzoBj.js → chunk-QZHKN3VN-DrBpz-k_.js} +1 -1
  114. package/web-dist/assets/{chunk-WL4C6EOR-DZWybiNk.js → chunk-WL4C6EOR-D2_sBPE_.js} +1 -1
  115. package/web-dist/assets/classDiagram-VBA2DB6C-COYaHGot.js +1 -0
  116. package/web-dist/assets/classDiagram-v2-RAHNMMFH-COYaHGot.js +1 -0
  117. package/web-dist/assets/clone-DfJVhmv7.js +1 -0
  118. package/web-dist/assets/{cose-bilkent-S5V4N54A-B9xY0Kqy.js → cose-bilkent-S5V4N54A-BrtHBM6x.js} +1 -1
  119. package/web-dist/assets/{dagre-KLK3FWXG-DvVqKE-N.js → dagre-KLK3FWXG-BzrpmYZL.js} +1 -1
  120. package/web-dist/assets/{diagram-E7M64L7V-BFxtLr_J.js → diagram-E7M64L7V-BlNFSjWJ.js} +1 -1
  121. package/web-dist/assets/{diagram-IFDJBPK2-9oSdzt-l.js → diagram-IFDJBPK2-Dqsr0-8e.js} +1 -1
  122. package/web-dist/assets/{diagram-P4PSJMXO-CnefTtmg.js → diagram-P4PSJMXO-BqgEtSgl.js} +1 -1
  123. package/web-dist/assets/{erDiagram-INFDFZHY-B_jfKATM.js → erDiagram-INFDFZHY-DQKdSExU.js} +1 -1
  124. package/web-dist/assets/{flowDiagram-PKNHOUZH-H0hHU5_y.js → flowDiagram-PKNHOUZH-Dfb4F2Jr.js} +1 -1
  125. package/web-dist/assets/{ganttDiagram-A5KZAMGK-DvgDjtyk.js → ganttDiagram-A5KZAMGK-C9pvM7B0.js} +1 -1
  126. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-CfKN67ux.js → gitGraphDiagram-K3NZZRJ6-DF1ng26T.js} +1 -1
  127. package/web-dist/assets/{graph-QTTPZYmF.js → graph-B0qCsau1.js} +1 -1
  128. package/web-dist/assets/{index-B7NGRcGF.js → index-CbK7Sq05.js} +1 -1
  129. package/web-dist/assets/index-DFyEPY0C.js +1516 -0
  130. package/web-dist/assets/index-DgGQx1pV.css +32 -0
  131. package/web-dist/assets/{index-B2KqDTs1.js → index-bPwc_s9j.js} +1 -1
  132. package/web-dist/assets/{infoDiagram-LFFYTUFH-DfbwpZJy.js → infoDiagram-LFFYTUFH-DqktoSKY.js} +1 -1
  133. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-DFAbvEqY.js → ishikawaDiagram-PHBUUO56-BSD3bhDW.js} +1 -1
  134. package/web-dist/assets/{journeyDiagram-4ABVD52K-D7_IzKwt.js → journeyDiagram-4ABVD52K-C1XiiAHp.js} +1 -1
  135. package/web-dist/assets/{kanban-definition-K7BYSVSG-ZHQe-znY.js → kanban-definition-K7BYSVSG-Bnl3u8lM.js} +1 -1
  136. package/web-dist/assets/{layout-CMZdvQRl.js → layout-DuulVMp8.js} +1 -1
  137. package/web-dist/assets/{linear-B-QauWje.js → linear-BdWH0fqS.js} +1 -1
  138. package/web-dist/assets/{mindmap-definition-YRQLILUH-ivr0jipJ.js → mindmap-definition-YRQLILUH-CP7IM4ly.js} +1 -1
  139. package/web-dist/assets/{pieDiagram-SKSYHLDU-BocSJCkn.js → pieDiagram-SKSYHLDU-C2dg01pY.js} +1 -1
  140. package/web-dist/assets/{quadrantDiagram-337W2JSQ-CPufpGVV.js → quadrantDiagram-337W2JSQ-Ci0HHhZZ.js} +1 -1
  141. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-WXSlOcDd.js → requirementDiagram-Z7DCOOCP-Cpa6xzfS.js} +1 -1
  142. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BlMmJCU5.js → sankeyDiagram-WA2Y5GQK-YC0w4y3m.js} +1 -1
  143. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-D6tIU8do.js → sequenceDiagram-2WXFIKYE-DFR_JRAl.js} +1 -1
  144. package/web-dist/assets/{stateDiagram-RAJIS63D-DiKyETyd.js → stateDiagram-RAJIS63D-DjS0hYUM.js} +1 -1
  145. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DXwakUby.js +1 -0
  146. package/web-dist/assets/{timeline-definition-YZTLITO2-0HBRmTgM.js → timeline-definition-YZTLITO2-74ZokkIK.js} +1 -1
  147. package/web-dist/assets/{treemap-KZPCXAKY-DNlJvzbh.js → treemap-KZPCXAKY-B-TU24Ni.js} +1 -1
  148. package/web-dist/assets/{vennDiagram-LZ73GAT5-CttEpptN.js → vennDiagram-LZ73GAT5-DjG2mV1S.js} +1 -1
  149. package/web-dist/assets/{xychartDiagram-JWTSCODW-BlqNihqM.js → xychartDiagram-JWTSCODW-BgRI_wmA.js} +1 -1
  150. package/web-dist/index.html +2 -2
  151. package/web-dist/assets/channel-BnjEy0x0.js +0 -1
  152. package/web-dist/assets/classDiagram-VBA2DB6C-BMhQiG2d.js +0 -1
  153. package/web-dist/assets/classDiagram-v2-RAHNMMFH-BMhQiG2d.js +0 -1
  154. package/web-dist/assets/clone-Dvn132Py.js +0 -1
  155. package/web-dist/assets/index-DDA9TJcJ.js +0 -1504
  156. package/web-dist/assets/index-nl08IRlA.css +0 -32
  157. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-CwYz7g9Z.js +0 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Channel manager — lifecycle, persistence, and the inbound→agent→outbound pipeline.
3
+ *
4
+ * Connectors are registered once; the manager starts/stops them, persists their
5
+ * config, decides which inbound messages warrant a reply, runs the agent loop to
6
+ * produce that reply, and sends it back through the connector.
7
+ */
8
+ import type { SqliteDatabase } from "../db/sqlite-shim.js";
9
+ import type { ToolRegistry } from "../tools/registry.js";
10
+ import type { AuditWriter } from "../services/audit.js";
11
+ import { type LLMConfig, type AgentMessage } from "../tools/agent-loop.js";
12
+ import type { ChannelConfig, ChannelConnector, ChannelStatus, ChannelStatusDetail, InboundMessage } from "./types.js";
13
+ /** Produces an assistant reply for a conversation. Injectable for testing. */
14
+ export interface ReplyGenerator {
15
+ generate(history: AgentMessage[], ctx: {
16
+ channelId: string;
17
+ sessionId: string;
18
+ allowedTools: Set<string>;
19
+ }): Promise<string>;
20
+ }
21
+ export interface ChannelManagerDeps {
22
+ sqlite: SqliteDatabase;
23
+ /** Resolves the LLM config used for channel replies. */
24
+ resolveLLM: () => LLMConfig;
25
+ toolRegistry?: ToolRegistry;
26
+ audit?: AuditWriter;
27
+ projectRoot?: string;
28
+ /** Auth context for tool execution (per-user keys, backend, model). */
29
+ auth?: {
30
+ userId?: string;
31
+ apiKeys?: Record<string, string>;
32
+ jaitBackend?: string;
33
+ model?: string;
34
+ };
35
+ /** System prompt for the channel agent. */
36
+ systemPrompt?: string;
37
+ /** Max conversation messages to retain (excluding the system prompt). */
38
+ maxHistory?: number;
39
+ /** Override reply generation (defaults to the agent loop). */
40
+ replyGenerator?: ReplyGenerator;
41
+ log?: (msg: string, ...args: unknown[]) => void;
42
+ }
43
+ interface ManagedChannel {
44
+ connector: ChannelConnector;
45
+ status: ChannelStatus;
46
+ detail: ChannelStatusDetail;
47
+ }
48
+ /** Normalize a WhatsApp-style id to its bare number for allowlist comparison. */
49
+ export declare function normalizeSenderId(id: string): string;
50
+ /** Decide whether the agent should reply to an inbound message. */
51
+ export declare function shouldRespond(msg: InboundMessage, config: ChannelConfig): boolean;
52
+ export declare class ChannelManager {
53
+ private readonly deps;
54
+ private readonly channels;
55
+ /** Per-conversation message history (keyed by `${channelId}:${conversationId}`). */
56
+ private readonly histories;
57
+ /** Per-conversation serialization so messages are answered in order. */
58
+ private readonly locks;
59
+ private readonly replyGenerator;
60
+ constructor(deps: ChannelManagerDeps);
61
+ private log;
62
+ private ensureTable;
63
+ getConfig(id: string): ChannelConfig;
64
+ setConfig(id: string, patch: Partial<ChannelConfig>): ChannelConfig;
65
+ register(connector: ChannelConnector): void;
66
+ /** Remove a connector from the available channel list. Config is preserved. */
67
+ unregister(id: string): Promise<void>;
68
+ list(): {
69
+ id: string;
70
+ label: string;
71
+ status: ChannelStatus;
72
+ enabled: boolean;
73
+ qr: string | null;
74
+ config: ChannelConfig;
75
+ }[];
76
+ get(id: string): ManagedChannel | undefined;
77
+ /** Start a connector and persist enabled=true. */
78
+ start(id: string): Promise<void>;
79
+ /** Stop a connector and persist enabled=false. */
80
+ stop(id: string): Promise<void>;
81
+ /** Start every connector whose persisted config has enabled=true. */
82
+ startEnabled(): Promise<void>;
83
+ dispose(): Promise<void>;
84
+ private handleInbound;
85
+ private replyTo;
86
+ }
87
+ export declare class AgentLoopReplyGenerator implements ReplyGenerator {
88
+ private readonly deps;
89
+ constructor(deps: ChannelManagerDeps);
90
+ generate(history: AgentMessage[], ctx: {
91
+ channelId: string;
92
+ sessionId: string;
93
+ allowedTools: Set<string>;
94
+ }): Promise<string>;
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Channel manager — lifecycle, persistence, and the inbound→agent→outbound pipeline.
3
+ *
4
+ * Connectors are registered once; the manager starts/stops them, persists their
5
+ * config, decides which inbound messages warrant a reply, runs the agent loop to
6
+ * produce that reply, and sends it back through the connector.
7
+ */
8
+ import { runAgentLoop, buildToolSchemas, SteeringController, } from "../tools/agent-loop.js";
9
+ import { uuidv7 } from "../db/uuidv7.js";
10
+ const DEFAULT_SYSTEM_PROMPT = "You are Jait, a helpful AI assistant replying over a messaging channel (e.g. WhatsApp). " +
11
+ "Keep replies concise and conversational — they are read on a phone. " +
12
+ "Do not use markdown headings or code fences unless explicitly asked.";
13
+ const DEFAULT_MAX_HISTORY = 20;
14
+ /** Normalize a WhatsApp-style id to its bare number for allowlist comparison. */
15
+ export function normalizeSenderId(id) {
16
+ // "<number>@s.whatsapp.net" / "<number>:<device>@..." / "+<number>" → "<number>"
17
+ return id.split("@")[0].split(":")[0].replace(/[^0-9]/g, "");
18
+ }
19
+ /** Decide whether the agent should reply to an inbound message. */
20
+ export function shouldRespond(msg, config) {
21
+ // Never reply to our own outgoing messages to other people.
22
+ if (msg.fromMe && !msg.isSelfChat)
23
+ return false;
24
+ if (config.respondToAll)
25
+ return !msg.fromMe || msg.isSelfChat;
26
+ const allow = (config.allowedSenders ?? []).map(normalizeSenderId).filter(Boolean);
27
+ if (allow.length > 0) {
28
+ return allow.includes(normalizeSenderId(msg.senderId));
29
+ }
30
+ // No allowlist configured → only respond in the self-chat (safe default).
31
+ return msg.isSelfChat;
32
+ }
33
+ export class ChannelManager {
34
+ deps;
35
+ channels = new Map();
36
+ /** Per-conversation message history (keyed by `${channelId}:${conversationId}`). */
37
+ histories = new Map();
38
+ /** Per-conversation serialization so messages are answered in order. */
39
+ locks = new Map();
40
+ replyGenerator;
41
+ constructor(deps) {
42
+ this.deps = deps;
43
+ this.replyGenerator = deps.replyGenerator ?? new AgentLoopReplyGenerator(deps);
44
+ this.ensureTable();
45
+ }
46
+ log(msg, ...args) {
47
+ (this.deps.log ?? ((m, ...a) => console.log("[channels]", m, ...a)))(msg, ...args);
48
+ }
49
+ /* ── DB ─────────────────────────────────────────────────────────── */
50
+ ensureTable() {
51
+ this.deps.sqlite.exec(`
52
+ CREATE TABLE IF NOT EXISTS channels (
53
+ id TEXT PRIMARY KEY,
54
+ enabled INTEGER NOT NULL DEFAULT 0,
55
+ config TEXT NOT NULL DEFAULT '{}',
56
+ updated_at TEXT NOT NULL
57
+ )
58
+ `);
59
+ }
60
+ getConfig(id) {
61
+ const row = this.deps.sqlite
62
+ .prepare("SELECT enabled, config FROM channels WHERE id = ?")
63
+ .get(id);
64
+ if (!row)
65
+ return {};
66
+ const parsed = JSON.parse(row.config || "{}");
67
+ return { ...parsed, enabled: Boolean(row.enabled) };
68
+ }
69
+ setConfig(id, patch) {
70
+ const current = this.getConfig(id);
71
+ const next = { ...current, ...patch };
72
+ const enabled = next.enabled ? 1 : 0;
73
+ const { enabled: _e, ...rest } = next;
74
+ this.deps.sqlite
75
+ .prepare(`INSERT INTO channels (id, enabled, config, updated_at) VALUES (?, ?, ?, ?)
76
+ ON CONFLICT(id) DO UPDATE SET enabled = excluded.enabled, config = excluded.config, updated_at = excluded.updated_at`)
77
+ .run(id, enabled, JSON.stringify(rest), new Date().toISOString());
78
+ return next;
79
+ }
80
+ /* ── Registration / lifecycle ───────────────────────────────────── */
81
+ register(connector) {
82
+ const existing = this.channels.get(connector.id);
83
+ if (existing) {
84
+ if (existing.connector === connector)
85
+ return;
86
+ throw new Error(`Channel '${connector.id}' is already registered`);
87
+ }
88
+ this.channels.set(connector.id, { connector, status: "stopped", detail: {} });
89
+ }
90
+ /** Remove a connector from the available channel list. Config is preserved. */
91
+ async unregister(id) {
92
+ const managed = this.channels.get(id);
93
+ if (!managed)
94
+ return;
95
+ try {
96
+ await managed.connector.stop();
97
+ }
98
+ finally {
99
+ this.channels.delete(id);
100
+ }
101
+ }
102
+ list() {
103
+ return [...this.channels.values()].map((c) => {
104
+ const config = this.getConfig(c.connector.id);
105
+ return {
106
+ id: c.connector.id,
107
+ label: c.connector.label,
108
+ status: c.status,
109
+ enabled: Boolean(config.enabled),
110
+ qr: c.detail.qr ?? c.connector.currentQr(),
111
+ config,
112
+ };
113
+ });
114
+ }
115
+ get(id) {
116
+ return this.channels.get(id);
117
+ }
118
+ /** Start a connector and persist enabled=true. */
119
+ async start(id) {
120
+ const managed = this.channels.get(id);
121
+ if (!managed)
122
+ throw new Error(`Channel '${id}' not found`);
123
+ this.setConfig(id, { enabled: true });
124
+ if (managed.status === "connected" || managed.status === "connecting" || managed.status === "qr") {
125
+ return;
126
+ }
127
+ await managed.connector.start({
128
+ onInbound: (msg) => { void this.handleInbound(msg); },
129
+ onStatus: (status, detail) => {
130
+ managed.status = status;
131
+ managed.detail = detail ?? {};
132
+ this.log(`${id}: status=${status}${detail?.error ? ` error=${detail.error}` : ""}`);
133
+ },
134
+ });
135
+ }
136
+ /** Stop a connector and persist enabled=false. */
137
+ async stop(id) {
138
+ const managed = this.channels.get(id);
139
+ if (!managed)
140
+ throw new Error(`Channel '${id}' not found`);
141
+ this.setConfig(id, { enabled: false });
142
+ await managed.connector.stop();
143
+ managed.status = "stopped";
144
+ managed.detail = {};
145
+ }
146
+ /** Start every connector whose persisted config has enabled=true. */
147
+ async startEnabled() {
148
+ for (const { connector } of this.channels.values()) {
149
+ if (this.getConfig(connector.id).enabled) {
150
+ try {
151
+ await this.start(connector.id);
152
+ }
153
+ catch (err) {
154
+ this.log(`Failed to auto-start ${connector.id}:`, err);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ async dispose() {
160
+ for (const { connector } of this.channels.values()) {
161
+ try {
162
+ await connector.stop();
163
+ }
164
+ catch { /* best effort */ }
165
+ }
166
+ }
167
+ /* ── Inbound → agent → outbound ─────────────────────────────────── */
168
+ async handleInbound(msg) {
169
+ const managed = this.channels.get(msg.channelId);
170
+ if (!managed)
171
+ return;
172
+ if (!msg.text.trim())
173
+ return;
174
+ const config = this.getConfig(msg.channelId);
175
+ if (!shouldRespond(msg, config))
176
+ return;
177
+ const key = `${msg.channelId}:${msg.conversationId}`;
178
+ // Serialize replies per conversation.
179
+ const prev = this.locks.get(key) ?? Promise.resolve();
180
+ const next = prev
181
+ .catch(() => { })
182
+ .then(() => this.replyTo(managed, msg, config));
183
+ this.locks.set(key, next.then(() => { }, () => { }));
184
+ await next;
185
+ }
186
+ async replyTo(managed, msg, config) {
187
+ const key = `${msg.channelId}:${msg.conversationId}`;
188
+ const maxHistory = this.deps.maxHistory ?? DEFAULT_MAX_HISTORY;
189
+ let history = this.histories.get(key);
190
+ if (!history) {
191
+ history = [{ role: "system", content: this.deps.systemPrompt ?? DEFAULT_SYSTEM_PROMPT }];
192
+ this.histories.set(key, history);
193
+ }
194
+ history.push({ role: "user", content: msg.text });
195
+ // Resolve allowed tools (filtered to those that actually exist).
196
+ const allowedTools = new Set((config.tools ?? []).filter((t) => this.deps.toolRegistry?.has(t)));
197
+ try {
198
+ const reply = (await this.replyGenerator.generate(history, {
199
+ channelId: msg.channelId,
200
+ sessionId: `channel:${key}`,
201
+ allowedTools,
202
+ })).trim();
203
+ if (reply) {
204
+ history.push({ role: "assistant", content: reply });
205
+ // Trim history (keep system prompt + last N turns).
206
+ if (history.length > maxHistory + 1) {
207
+ const system = history[0];
208
+ this.histories.set(key, [system, ...history.slice(history.length - maxHistory)]);
209
+ }
210
+ await managed.connector.send({ conversationId: msg.conversationId, text: reply });
211
+ }
212
+ }
213
+ catch (err) {
214
+ this.log(`reply failed for ${key}:`, err);
215
+ try {
216
+ await managed.connector.send({
217
+ conversationId: msg.conversationId,
218
+ text: "⚠️ Sorry — I hit an error generating a reply.",
219
+ });
220
+ }
221
+ catch { /* connector may be down */ }
222
+ }
223
+ }
224
+ }
225
+ /* ------------------------------------------------------------------ */
226
+ /* Default reply generator — runs the agent loop */
227
+ /* ------------------------------------------------------------------ */
228
+ export class AgentLoopReplyGenerator {
229
+ deps;
230
+ constructor(deps) {
231
+ this.deps = deps;
232
+ }
233
+ async generate(history, ctx) {
234
+ const { toolRegistry, audit, auth } = this.deps;
235
+ const allowedTools = ctx.allowedTools;
236
+ const toolSchemas = toolRegistry && allowedTools.size > 0
237
+ ? buildToolSchemas(toolRegistry, allowedTools)
238
+ : [];
239
+ const hasTools = toolSchemas.length > 0;
240
+ const abort = new AbortController();
241
+ const steering = new SteeringController();
242
+ const executor = async (name, args, sid, _auth, onChunk, signal) => {
243
+ if (!allowedTools.has(name) || !toolRegistry) {
244
+ return { ok: false, message: `Tool '${name}' is not available to this channel` };
245
+ }
246
+ return toolRegistry.execute(name, args, {
247
+ sessionId: sid,
248
+ actionId: uuidv7(),
249
+ projectRoot: this.deps.projectRoot ?? process.cwd(),
250
+ requestedBy: `channel:${ctx.channelId}`,
251
+ userId: auth?.userId,
252
+ apiKeys: auth?.apiKeys,
253
+ jaitBackend: auth?.jaitBackend,
254
+ model: auth?.model,
255
+ onOutputChunk: onChunk,
256
+ signal,
257
+ }, audit);
258
+ };
259
+ const result = await runAgentLoop({
260
+ llm: this.deps.resolveLLM(),
261
+ history,
262
+ toolSchemas,
263
+ hasTools,
264
+ sessionId: ctx.sessionId,
265
+ auth: auth?.userId
266
+ ? { userId: auth.userId, apiKeys: auth.apiKeys, jaitBackend: auth.jaitBackend, model: auth.model }
267
+ : undefined,
268
+ abort,
269
+ maxRounds: hasTools ? 6 : 1,
270
+ maxRetries: 1,
271
+ parallel: true,
272
+ toolRegistry,
273
+ allowedTools: hasTools ? allowedTools : undefined,
274
+ }, executor, steering);
275
+ return result.content ?? "";
276
+ }
277
+ }
278
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { ChannelConnector, ChannelConnectorEvents, ChannelStatus, InboundMessage, OutboundMessage } from "../types.js";
2
+ interface MSTeamsAccount {
3
+ id?: string;
4
+ name?: string;
5
+ aadObjectId?: string;
6
+ role?: string;
7
+ }
8
+ interface MSTeamsActivity {
9
+ id?: string;
10
+ type?: string;
11
+ text?: string;
12
+ timestamp?: string;
13
+ serviceUrl?: string;
14
+ channelId?: string;
15
+ from?: MSTeamsAccount;
16
+ recipient?: MSTeamsAccount;
17
+ conversation?: {
18
+ id?: string;
19
+ conversationType?: string;
20
+ tenantId?: string;
21
+ };
22
+ channelData?: {
23
+ tenant?: {
24
+ id?: string;
25
+ };
26
+ };
27
+ locale?: string;
28
+ }
29
+ export interface MSTeamsConnectorDeps {
30
+ appId?: string;
31
+ appPassword?: string;
32
+ tenantId?: string;
33
+ host?: string;
34
+ port?: number;
35
+ path?: string;
36
+ maxBodyBytes?: number;
37
+ fetchImpl?: typeof fetch;
38
+ validateAuth?: (authorization: string, activity: MSTeamsActivity) => Promise<void>;
39
+ now?: () => number;
40
+ log?: (msg: string, ...args: unknown[]) => void;
41
+ }
42
+ export declare function decodeMSTeamsHtmlEntities(html: string): string;
43
+ export declare function msteamsHtmlToPlainText(html: string): string;
44
+ export declare function stripMSTeamsMentionTags(text: string): string;
45
+ export declare function isAllowedMSTeamsServiceUrl(serviceUrl: unknown): serviceUrl is string;
46
+ export declare function msteamsActivityToInbound(activity: MSTeamsActivity): InboundMessage | null;
47
+ export declare function validateMSTeamsAuthorization(params: {
48
+ authorization: string;
49
+ appId: string;
50
+ tenantId: string;
51
+ fetchImpl?: typeof fetch;
52
+ }): Promise<void>;
53
+ export declare class MSTeamsConnector implements ChannelConnector {
54
+ readonly id = "msteams";
55
+ readonly label = "Microsoft Teams";
56
+ private readonly deps;
57
+ private readonly host;
58
+ private readonly port;
59
+ private readonly path;
60
+ private readonly maxBodyBytes;
61
+ private _status;
62
+ private server;
63
+ private events;
64
+ private tokenCache;
65
+ private references;
66
+ constructor(deps?: MSTeamsConnectorDeps);
67
+ status(): ChannelStatus;
68
+ currentQr(): string | null;
69
+ listenPort(): number | null;
70
+ private log;
71
+ private now;
72
+ private fetch;
73
+ private credentials;
74
+ private setStatus;
75
+ start(events: ChannelConnectorEvents): Promise<void>;
76
+ stop(): Promise<void>;
77
+ send(msg: OutboundMessage): Promise<void>;
78
+ private handleRequest;
79
+ private validateAuth;
80
+ private botToken;
81
+ }
82
+ export {};
83
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../../src/channels/msteams/connector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAiBrB,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,YAAY,CAAC,EAAE;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1B,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqBD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACjD;AAgBD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS9D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,IAAI,MAAM,CAYpF;AAmBD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,cAAc,GAAG,IAAI,CAkBzF;AA2FD,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,KAAK,qBAAqB;IAEnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,UAAU,CAA6C;gBAEnD,IAAI,GAAE,oBAAyB;IAQ3C,MAAM,IAAI,aAAa;IACvB,SAAS,IAAI,MAAM,GAAG,IAAI;IAE1B,UAAU,IAAI,MAAM,GAAG,IAAI;IAK3B,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,SAAS;IAKX,KAAK,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAsCjC,aAAa;YAuCb,YAAY;YAoBZ,QAAQ;CAiCvB"}