@marifold/core 0.60.0

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 (310) hide show
  1. package/LICENSE +674 -0
  2. package/dist/agent/AgentEvents.d.ts +106 -0
  3. package/dist/agent/AgentEvents.d.ts.map +1 -0
  4. package/dist/agent/AgentEvents.js +3 -0
  5. package/dist/agent/AgentEvents.js.map +1 -0
  6. package/dist/agent/AgentHistory.d.ts +27 -0
  7. package/dist/agent/AgentHistory.d.ts.map +1 -0
  8. package/dist/agent/AgentHistory.js +42 -0
  9. package/dist/agent/AgentHistory.js.map +1 -0
  10. package/dist/agent/AgentRunner.d.ts +149 -0
  11. package/dist/agent/AgentRunner.d.ts.map +1 -0
  12. package/dist/agent/AgentRunner.js +727 -0
  13. package/dist/agent/AgentRunner.js.map +1 -0
  14. package/dist/agent/ApprovalPolicy.d.ts +71 -0
  15. package/dist/agent/ApprovalPolicy.d.ts.map +1 -0
  16. package/dist/agent/ApprovalPolicy.js +29 -0
  17. package/dist/agent/ApprovalPolicy.js.map +1 -0
  18. package/dist/agent/ControlBlockTools.d.ts +9 -0
  19. package/dist/agent/ControlBlockTools.d.ts.map +1 -0
  20. package/dist/agent/ControlBlockTools.js +49 -0
  21. package/dist/agent/ControlBlockTools.js.map +1 -0
  22. package/dist/agent/RunWorkspace.d.ts +92 -0
  23. package/dist/agent/RunWorkspace.d.ts.map +1 -0
  24. package/dist/agent/RunWorkspace.js +328 -0
  25. package/dist/agent/RunWorkspace.js.map +1 -0
  26. package/dist/agent/ScopedProcess.d.ts +35 -0
  27. package/dist/agent/ScopedProcess.d.ts.map +1 -0
  28. package/dist/agent/ScopedProcess.js +280 -0
  29. package/dist/agent/ScopedProcess.js.map +1 -0
  30. package/dist/agent/ToolRegistry.d.ts +80 -0
  31. package/dist/agent/ToolRegistry.d.ts.map +1 -0
  32. package/dist/agent/ToolRegistry.js +45 -0
  33. package/dist/agent/ToolRegistry.js.map +1 -0
  34. package/dist/agent/UserInput.d.ts +59 -0
  35. package/dist/agent/UserInput.d.ts.map +1 -0
  36. package/dist/agent/UserInput.js +203 -0
  37. package/dist/agent/UserInput.js.map +1 -0
  38. package/dist/agent/tools/AskUserTool.d.ts +71 -0
  39. package/dist/agent/tools/AskUserTool.d.ts.map +1 -0
  40. package/dist/agent/tools/AskUserTool.js +70 -0
  41. package/dist/agent/tools/AskUserTool.js.map +1 -0
  42. package/dist/agent/tools/DelegateTool.d.ts +49 -0
  43. package/dist/agent/tools/DelegateTool.d.ts.map +1 -0
  44. package/dist/agent/tools/DelegateTool.js +62 -0
  45. package/dist/agent/tools/DelegateTool.js.map +1 -0
  46. package/dist/agent/tools/InspectAttachmentTool.d.ts +25 -0
  47. package/dist/agent/tools/InspectAttachmentTool.d.ts.map +1 -0
  48. package/dist/agent/tools/InspectAttachmentTool.js +129 -0
  49. package/dist/agent/tools/InspectAttachmentTool.js.map +1 -0
  50. package/dist/agent/tools/PythonPackageTool.d.ts +26 -0
  51. package/dist/agent/tools/PythonPackageTool.d.ts.map +1 -0
  52. package/dist/agent/tools/PythonPackageTool.js +105 -0
  53. package/dist/agent/tools/PythonPackageTool.js.map +1 -0
  54. package/dist/agent/tools/ReadFileTool.d.ts +24 -0
  55. package/dist/agent/tools/ReadFileTool.d.ts.map +1 -0
  56. package/dist/agent/tools/ReadFileTool.js +112 -0
  57. package/dist/agent/tools/ReadFileTool.js.map +1 -0
  58. package/dist/agent/tools/ShellExecTool.d.ts +23 -0
  59. package/dist/agent/tools/ShellExecTool.d.ts.map +1 -0
  60. package/dist/agent/tools/ShellExecTool.js +75 -0
  61. package/dist/agent/tools/ShellExecTool.js.map +1 -0
  62. package/dist/agent/tools/WebSearchTool.d.ts +26 -0
  63. package/dist/agent/tools/WebSearchTool.d.ts.map +1 -0
  64. package/dist/agent/tools/WebSearchTool.js +52 -0
  65. package/dist/agent/tools/WebSearchTool.js.map +1 -0
  66. package/dist/agent/tools/WriteFileTool.d.ts +30 -0
  67. package/dist/agent/tools/WriteFileTool.d.ts.map +1 -0
  68. package/dist/agent/tools/WriteFileTool.js +155 -0
  69. package/dist/agent/tools/WriteFileTool.js.map +1 -0
  70. package/dist/app/AppActionResolver.d.ts +15 -0
  71. package/dist/app/AppActionResolver.d.ts.map +1 -0
  72. package/dist/app/AppActionResolver.js +98 -0
  73. package/dist/app/AppActionResolver.js.map +1 -0
  74. package/dist/app/AppSchema.d.ts +83 -0
  75. package/dist/app/AppSchema.d.ts.map +1 -0
  76. package/dist/app/AppSchema.js +17 -0
  77. package/dist/app/AppSchema.js.map +1 -0
  78. package/dist/app/AppStore.d.ts +14 -0
  79. package/dist/app/AppStore.d.ts.map +1 -0
  80. package/dist/app/AppStore.js +146 -0
  81. package/dist/app/AppStore.js.map +1 -0
  82. package/dist/app/AppValidator.d.ts +10 -0
  83. package/dist/app/AppValidator.d.ts.map +1 -0
  84. package/dist/app/AppValidator.js +503 -0
  85. package/dist/app/AppValidator.js.map +1 -0
  86. package/dist/app/SkillAppCompiler.d.ts +5 -0
  87. package/dist/app/SkillAppCompiler.d.ts.map +1 -0
  88. package/dist/app/SkillAppCompiler.js +632 -0
  89. package/dist/app/SkillAppCompiler.js.map +1 -0
  90. package/dist/app/SkillAppDsl.d.ts +93 -0
  91. package/dist/app/SkillAppDsl.d.ts.map +1 -0
  92. package/dist/app/SkillAppDsl.js +72 -0
  93. package/dist/app/SkillAppDsl.js.map +1 -0
  94. package/dist/app/SkillAppInstanceRegistry.d.ts +25 -0
  95. package/dist/app/SkillAppInstanceRegistry.d.ts.map +1 -0
  96. package/dist/app/SkillAppInstanceRegistry.js +218 -0
  97. package/dist/app/SkillAppInstanceRegistry.js.map +1 -0
  98. package/dist/app/SkillAppResolver.d.ts +12 -0
  99. package/dist/app/SkillAppResolver.d.ts.map +1 -0
  100. package/dist/app/SkillAppResolver.js +89 -0
  101. package/dist/app/SkillAppResolver.js.map +1 -0
  102. package/dist/app/SkillAppSchema.d.ts +116 -0
  103. package/dist/app/SkillAppSchema.d.ts.map +1 -0
  104. package/dist/app/SkillAppSchema.js +5 -0
  105. package/dist/app/SkillAppSchema.js.map +1 -0
  106. package/dist/channels/TelegramBridge.d.ts +103 -0
  107. package/dist/channels/TelegramBridge.d.ts.map +1 -0
  108. package/dist/channels/TelegramBridge.js +565 -0
  109. package/dist/channels/TelegramBridge.js.map +1 -0
  110. package/dist/channels/respond.d.ts +46 -0
  111. package/dist/channels/respond.d.ts.map +1 -0
  112. package/dist/channels/respond.js +41 -0
  113. package/dist/channels/respond.js.map +1 -0
  114. package/dist/config/ChatGptTokenRefresh.d.ts +18 -0
  115. package/dist/config/ChatGptTokenRefresh.d.ts.map +1 -0
  116. package/dist/config/ChatGptTokenRefresh.js +63 -0
  117. package/dist/config/ChatGptTokenRefresh.js.map +1 -0
  118. package/dist/config/ConfigBackup.d.ts +20 -0
  119. package/dist/config/ConfigBackup.d.ts.map +1 -0
  120. package/dist/config/ConfigBackup.js +197 -0
  121. package/dist/config/ConfigBackup.js.map +1 -0
  122. package/dist/config/ConfigLoader.d.ts +28 -0
  123. package/dist/config/ConfigLoader.d.ts.map +1 -0
  124. package/dist/config/ConfigLoader.js +335 -0
  125. package/dist/config/ConfigLoader.js.map +1 -0
  126. package/dist/config/ConfigManager.d.ts +55 -0
  127. package/dist/config/ConfigManager.d.ts.map +1 -0
  128. package/dist/config/ConfigManager.js +707 -0
  129. package/dist/config/ConfigManager.js.map +1 -0
  130. package/dist/config/ConfigSchema.d.ts +231 -0
  131. package/dist/config/ConfigSchema.d.ts.map +1 -0
  132. package/dist/config/ConfigSchema.js +15 -0
  133. package/dist/config/ConfigSchema.js.map +1 -0
  134. package/dist/config/GitHubCopilotAuth.d.ts +7 -0
  135. package/dist/config/GitHubCopilotAuth.d.ts.map +1 -0
  136. package/dist/config/GitHubCopilotAuth.js +40 -0
  137. package/dist/config/GitHubCopilotAuth.js.map +1 -0
  138. package/dist/config/MarifoldOpenAICompatProvider.d.ts +39 -0
  139. package/dist/config/MarifoldOpenAICompatProvider.d.ts.map +1 -0
  140. package/dist/config/MarifoldOpenAICompatProvider.js +158 -0
  141. package/dist/config/MarifoldOpenAICompatProvider.js.map +1 -0
  142. package/dist/config/OpenAICompatUrls.d.ts +7 -0
  143. package/dist/config/OpenAICompatUrls.d.ts.map +1 -0
  144. package/dist/config/OpenAICompatUrls.js +47 -0
  145. package/dist/config/OpenAICompatUrls.js.map +1 -0
  146. package/dist/config/ProviderFactory.d.ts +12 -0
  147. package/dist/config/ProviderFactory.d.ts.map +1 -0
  148. package/dist/config/ProviderFactory.js +61 -0
  149. package/dist/config/ProviderFactory.js.map +1 -0
  150. package/dist/config/ProviderInspector.d.ts +46 -0
  151. package/dist/config/ProviderInspector.d.ts.map +1 -0
  152. package/dist/config/ProviderInspector.js +356 -0
  153. package/dist/config/ProviderInspector.js.map +1 -0
  154. package/dist/config/ProviderRegistry.d.ts +19 -0
  155. package/dist/config/ProviderRegistry.d.ts.map +1 -0
  156. package/dist/config/ProviderRegistry.js +301 -0
  157. package/dist/config/ProviderRegistry.js.map +1 -0
  158. package/dist/config/XaiTokenRefresh.d.ts +15 -0
  159. package/dist/config/XaiTokenRefresh.d.ts.map +1 -0
  160. package/dist/config/XaiTokenRefresh.js +73 -0
  161. package/dist/config/XaiTokenRefresh.js.map +1 -0
  162. package/dist/errors/MarifoldError.d.ts +34 -0
  163. package/dist/errors/MarifoldError.d.ts.map +1 -0
  164. package/dist/errors/MarifoldError.js +100 -0
  165. package/dist/errors/MarifoldError.js.map +1 -0
  166. package/dist/images/ImageOptimizer.d.ts +34 -0
  167. package/dist/images/ImageOptimizer.d.ts.map +1 -0
  168. package/dist/images/ImageOptimizer.js +225 -0
  169. package/dist/images/ImageOptimizer.js.map +1 -0
  170. package/dist/index.d.ts +96 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +193 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/memory/MemoryControls.d.ts +26 -0
  175. package/dist/memory/MemoryControls.d.ts.map +1 -0
  176. package/dist/memory/MemoryControls.js +388 -0
  177. package/dist/memory/MemoryControls.js.map +1 -0
  178. package/dist/memory/MemoryStore.d.ts +122 -0
  179. package/dist/memory/MemoryStore.d.ts.map +1 -0
  180. package/dist/memory/MemoryStore.js +1096 -0
  181. package/dist/memory/MemoryStore.js.map +1 -0
  182. package/dist/profiles/ProfileManager.d.ts +139 -0
  183. package/dist/profiles/ProfileManager.d.ts.map +1 -0
  184. package/dist/profiles/ProfileManager.js +475 -0
  185. package/dist/profiles/ProfileManager.js.map +1 -0
  186. package/dist/profiles/ProfileResolver.d.ts +18 -0
  187. package/dist/profiles/ProfileResolver.d.ts.map +1 -0
  188. package/dist/profiles/ProfileResolver.js +280 -0
  189. package/dist/profiles/ProfileResolver.js.map +1 -0
  190. package/dist/runs/RunRegistry.d.ts +140 -0
  191. package/dist/runs/RunRegistry.d.ts.map +1 -0
  192. package/dist/runs/RunRegistry.js +432 -0
  193. package/dist/runs/RunRegistry.js.map +1 -0
  194. package/dist/runtime/MarifoldRuntime.d.ts +244 -0
  195. package/dist/runtime/MarifoldRuntime.d.ts.map +1 -0
  196. package/dist/runtime/MarifoldRuntime.js +1099 -0
  197. package/dist/runtime/MarifoldRuntime.js.map +1 -0
  198. package/dist/runtime/MarifoldTypes.d.ts +70 -0
  199. package/dist/runtime/MarifoldTypes.d.ts.map +1 -0
  200. package/dist/runtime/MarifoldTypes.js +3 -0
  201. package/dist/runtime/MarifoldTypes.js.map +1 -0
  202. package/dist/schedule/ScheduleStore.d.ts +60 -0
  203. package/dist/schedule/ScheduleStore.d.ts.map +1 -0
  204. package/dist/schedule/ScheduleStore.js +212 -0
  205. package/dist/schedule/ScheduleStore.js.map +1 -0
  206. package/dist/schedule/Scheduler.d.ts +28 -0
  207. package/dist/schedule/Scheduler.d.ts.map +1 -0
  208. package/dist/schedule/Scheduler.js +65 -0
  209. package/dist/schedule/Scheduler.js.map +1 -0
  210. package/dist/search/DuckDuckGoBackend.d.ts +18 -0
  211. package/dist/search/DuckDuckGoBackend.d.ts.map +1 -0
  212. package/dist/search/DuckDuckGoBackend.js +37 -0
  213. package/dist/search/DuckDuckGoBackend.js.map +1 -0
  214. package/dist/search/FirecrawlBackend.d.ts +28 -0
  215. package/dist/search/FirecrawlBackend.d.ts.map +1 -0
  216. package/dist/search/FirecrawlBackend.js +76 -0
  217. package/dist/search/FirecrawlBackend.js.map +1 -0
  218. package/dist/search/SearchBackend.d.ts +18 -0
  219. package/dist/search/SearchBackend.d.ts.map +1 -0
  220. package/dist/search/SearchBackend.js +24 -0
  221. package/dist/search/SearchBackend.js.map +1 -0
  222. package/dist/search/createSearchBackend.d.ts +16 -0
  223. package/dist/search/createSearchBackend.d.ts.map +1 -0
  224. package/dist/search/createSearchBackend.js +30 -0
  225. package/dist/search/createSearchBackend.js.map +1 -0
  226. package/dist/sessions/ResponseMetrics.d.ts +17 -0
  227. package/dist/sessions/ResponseMetrics.d.ts.map +1 -0
  228. package/dist/sessions/ResponseMetrics.js +3 -0
  229. package/dist/sessions/ResponseMetrics.js.map +1 -0
  230. package/dist/sessions/SessionResolver.d.ts +135 -0
  231. package/dist/sessions/SessionResolver.d.ts.map +1 -0
  232. package/dist/sessions/SessionResolver.js +1173 -0
  233. package/dist/sessions/SessionResolver.js.map +1 -0
  234. package/dist/skill/BuiltInSkillManager.d.ts +11 -0
  235. package/dist/skill/BuiltInSkillManager.d.ts.map +1 -0
  236. package/dist/skill/BuiltInSkillManager.js +98 -0
  237. package/dist/skill/BuiltInSkillManager.js.map +1 -0
  238. package/dist/skill/SkillInvocation.d.ts +30 -0
  239. package/dist/skill/SkillInvocation.d.ts.map +1 -0
  240. package/dist/skill/SkillInvocation.js +135 -0
  241. package/dist/skill/SkillInvocation.js.map +1 -0
  242. package/dist/skill/SkillSchema.d.ts +37 -0
  243. package/dist/skill/SkillSchema.d.ts.map +1 -0
  244. package/dist/skill/SkillSchema.js +26 -0
  245. package/dist/skill/SkillSchema.js.map +1 -0
  246. package/dist/skill/SkillStore.d.ts +41 -0
  247. package/dist/skill/SkillStore.d.ts.map +1 -0
  248. package/dist/skill/SkillStore.js +184 -0
  249. package/dist/skill/SkillStore.js.map +1 -0
  250. package/dist/skill/SkillTemplater.d.ts +19 -0
  251. package/dist/skill/SkillTemplater.d.ts.map +1 -0
  252. package/dist/skill/SkillTemplater.js +36 -0
  253. package/dist/skill/SkillTemplater.js.map +1 -0
  254. package/dist/skill/SkillValidator.d.ts +10 -0
  255. package/dist/skill/SkillValidator.d.ts.map +1 -0
  256. package/dist/skill/SkillValidator.js +131 -0
  257. package/dist/skill/SkillValidator.js.map +1 -0
  258. package/dist/skill/SkillVars.d.ts +10 -0
  259. package/dist/skill/SkillVars.d.ts.map +1 -0
  260. package/dist/skill/SkillVars.js +65 -0
  261. package/dist/skill/SkillVars.js.map +1 -0
  262. package/dist/skill/index.d.ts +10 -0
  263. package/dist/skill/index.d.ts.map +1 -0
  264. package/dist/skill/index.js +22 -0
  265. package/dist/skill/index.js.map +1 -0
  266. package/dist/skillapp/SkillAppActionResolver.d.ts +13 -0
  267. package/dist/skillapp/SkillAppActionResolver.d.ts.map +1 -0
  268. package/dist/skillapp/SkillAppActionResolver.js +95 -0
  269. package/dist/skillapp/SkillAppActionResolver.js.map +1 -0
  270. package/dist/skillapp/SkillAppSchema.d.ts +79 -0
  271. package/dist/skillapp/SkillAppSchema.d.ts.map +1 -0
  272. package/dist/skillapp/SkillAppSchema.js +20 -0
  273. package/dist/skillapp/SkillAppSchema.js.map +1 -0
  274. package/dist/skillapp/SkillAppStore.d.ts +11 -0
  275. package/dist/skillapp/SkillAppStore.d.ts.map +1 -0
  276. package/dist/skillapp/SkillAppStore.js +98 -0
  277. package/dist/skillapp/SkillAppStore.js.map +1 -0
  278. package/dist/skillapp/SkillAppValidator.d.ts +10 -0
  279. package/dist/skillapp/SkillAppValidator.d.ts.map +1 -0
  280. package/dist/skillapp/SkillAppValidator.js +522 -0
  281. package/dist/skillapp/SkillAppValidator.js.map +1 -0
  282. package/dist/tasks/TaskStore.d.ts +110 -0
  283. package/dist/tasks/TaskStore.d.ts.map +1 -0
  284. package/dist/tasks/TaskStore.js +371 -0
  285. package/dist/tasks/TaskStore.js.map +1 -0
  286. package/dist/util/fetchRetry.d.ts +11 -0
  287. package/dist/util/fetchRetry.d.ts.map +1 -0
  288. package/dist/util/fetchRetry.js +48 -0
  289. package/dist/util/fetchRetry.js.map +1 -0
  290. package/dist/util/idToken.d.ts +12 -0
  291. package/dist/util/idToken.d.ts.map +1 -0
  292. package/dist/util/idToken.js +32 -0
  293. package/dist/util/idToken.js.map +1 -0
  294. package/dist/util/proxy.d.ts +18 -0
  295. package/dist/util/proxy.d.ts.map +1 -0
  296. package/dist/util/proxy.js +28 -0
  297. package/dist/util/proxy.js.map +1 -0
  298. package/dist/workspace/Workspace.d.ts +9 -0
  299. package/dist/workspace/Workspace.d.ts.map +1 -0
  300. package/dist/workspace/Workspace.js +55 -0
  301. package/dist/workspace/Workspace.js.map +1 -0
  302. package/dist/workspace/WorkspaceInitializer.d.ts +40 -0
  303. package/dist/workspace/WorkspaceInitializer.d.ts.map +1 -0
  304. package/dist/workspace/WorkspaceInitializer.js +212 -0
  305. package/dist/workspace/WorkspaceInitializer.js.map +1 -0
  306. package/dist/workspace/WorkspacePaths.d.ts +11 -0
  307. package/dist/workspace/WorkspacePaths.d.ts.map +1 -0
  308. package/dist/workspace/WorkspacePaths.js +82 -0
  309. package/dist/workspace/WorkspacePaths.js.map +1 -0
  310. package/package.json +36 -0
@@ -0,0 +1,565 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TelegramBridge = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const promises_1 = require("fs/promises");
6
+ const path_1 = require("path");
7
+ const core_1 = require("@priest-ai/core");
8
+ const proxy_1 = require("../util/proxy");
9
+ const respond_1 = require("./respond");
10
+ const TELEGRAM_API_BASE = 'https://api.telegram.org';
11
+ const TELEGRAM_FILE_BASE = 'https://api.telegram.org/file';
12
+ const LONG_POLL_SECONDS = 25;
13
+ const POLL_OVERHEAD_MS = 10_000; // client timeout beyond the server-side long-poll
14
+ const SEND_TIMEOUT_MS = 30_000;
15
+ const FILE_TIMEOUT_MS = 120_000; // uploads/downloads may be large
16
+ const ERROR_BACKOFF_MS = 3_000;
17
+ const MAX_MESSAGE_CHARS = 4096; // Telegram's per-message limit
18
+ const APPROVAL_TIMEOUT_MS = 5 * 60 * 1000; // auto-deny if the user never taps
19
+ const OUTBOX_SENT_DIR = 'sent'; // delivered files are moved here to keep them
20
+ const IMAGE_EXTS = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp']);
21
+ const DOWNLOAD_ATTEMPTS = 3; // Telegram downloads can transiently fail behind a proxy
22
+ // Injected atop the agent's system prompt so it knows the outbox mechanics.
23
+ const OUTBOX_INSTRUCTIONS = [
24
+ 'You are speaking to the user over Telegram. Any file you write to the current working directory is automatically delivered to them as a file/photo attachment — so to send or give the user a file, just write it here (these writes need no approval). You CAN send files this way; never tell the user you cannot.',
25
+ ];
26
+ const USAGE = [
27
+ 'marifold bot — commands:',
28
+ '/agent — agent mode (can use tools; asks before risky ones)',
29
+ '/chat — plain chat mode (no tools)',
30
+ '/think on|off — thinking mode (for providers that support it)',
31
+ '/new — start a fresh session',
32
+ '/help — show this help',
33
+ '',
34
+ 'Send me a file or photo and I\'ll keep it in your inbox. Ask me to make a',
35
+ 'file (e.g. "write a poem and send the .md") and I\'ll send it back.',
36
+ ].join('\n');
37
+ /**
38
+ * Long-poll Telegram bridge, hosted inside `marifold service`. Reads messages
39
+ * via getUpdates, runs the allowlisted sender's turn through `respond()` under
40
+ * the configured profile, and sends the reply back. **Attended in agent mode:**
41
+ * tool approvals prompt the user with inline buttons and the run waits for the
42
+ * tap. Single-user / one-turn-at-a-time. Network calls go through the proxy
43
+ * (Telegram is often blocked).
44
+ */
45
+ class TelegramBridge {
46
+ /** Profile the bot runs as — surfaced so the service can report it. */
47
+ profile;
48
+ runtime;
49
+ token;
50
+ config;
51
+ profileDir;
52
+ log;
53
+ fetchImpl;
54
+ chatModes = new Map();
55
+ chatEpoch = new Map();
56
+ chatThink = new Map();
57
+ // Path of the most recently received file per chat, injected into the next
58
+ // turn so "use/save the file I sent" reaches the agent.
59
+ lastInbox = new Map();
60
+ // Session grants (mirror the TUI): once the user chooses "always"/"trust" we
61
+ // stop re-prompting for that kind/folder for the bridge's lifetime.
62
+ grantedKinds = new Set();
63
+ trustedFolders = [];
64
+ offset = 0;
65
+ running = false;
66
+ busy = false; // one text turn at a time
67
+ pendingApproval;
68
+ abort;
69
+ constructor(deps) {
70
+ this.runtime = deps.runtime;
71
+ this.token = deps.token;
72
+ this.config = deps.config;
73
+ this.profile = deps.config.profile;
74
+ this.profileDir = (0, path_1.join)(deps.profilesDir, deps.config.profile);
75
+ this.log = deps.log;
76
+ this.fetchImpl = deps.fetchImpl ?? fetch;
77
+ }
78
+ outboxDir() {
79
+ return (0, path_1.join)(this.profileDir, 'outbox');
80
+ }
81
+ inboxDir() {
82
+ return (0, path_1.join)(this.profileDir, 'inbox');
83
+ }
84
+ start() {
85
+ if (this.running)
86
+ return;
87
+ this.running = true;
88
+ this.abort = new AbortController();
89
+ this.log?.(`Telegram bridge started (profile ${this.profile}, default ${this.config.defaultMode} mode, ${this.config.allowlist.length} allowed user(s)).`);
90
+ void this.loop();
91
+ }
92
+ stop() {
93
+ this.running = false;
94
+ this.abort?.abort();
95
+ }
96
+ async loop() {
97
+ while (this.running) {
98
+ try {
99
+ for (const update of await this.getUpdates()) {
100
+ if (!this.running)
101
+ break;
102
+ this.offset = update.update_id + 1;
103
+ // Detached: a turn may block on an approval whose callback_query only
104
+ // arrives via a later getUpdates — awaiting here would deadlock.
105
+ void this.handleUpdate(update).catch(error => this.log?.(`Telegram update error: ${errorMessage(error)}`));
106
+ }
107
+ }
108
+ catch (error) {
109
+ if (!this.running)
110
+ break; // aborted by stop()
111
+ this.log?.(`Telegram poll error: ${errorMessage(error)}`);
112
+ await this.sleep(ERROR_BACKOFF_MS);
113
+ }
114
+ }
115
+ }
116
+ /** Route a single update. Public for testing; the loop is the only other
117
+ * caller. Non-text messages and non-allowlisted senders are ignored. */
118
+ async handleUpdate(update) {
119
+ if (update.callback_query) {
120
+ await this.handleCallback(update.callback_query);
121
+ return;
122
+ }
123
+ const message = update.message;
124
+ const chatId = message?.chat?.id;
125
+ const fromId = message?.from?.id;
126
+ if (chatId === undefined || !message)
127
+ return;
128
+ if (fromId === undefined || !this.config.allowlist.includes(fromId)) {
129
+ this.log?.(`Ignored message from non-allowlisted user ${fromId ?? '?'}`);
130
+ return;
131
+ }
132
+ // File attachments → save to the inbox (kept for later use).
133
+ const file = fileRef(message);
134
+ if (file) {
135
+ await this.receiveFile(chatId, file);
136
+ return;
137
+ }
138
+ const text = typeof message.text === 'string' ? message.text.trim() : '';
139
+ if (!text)
140
+ return;
141
+ if (text.startsWith('/')) {
142
+ await this.handleCommand(chatId, text);
143
+ return;
144
+ }
145
+ if (this.busy) {
146
+ await this.sendMessage(chatId, '⏳ Still working on your previous message — one at a time.');
147
+ return;
148
+ }
149
+ this.busy = true;
150
+ try {
151
+ await this.runTurn(chatId, text);
152
+ }
153
+ finally {
154
+ this.busy = false;
155
+ }
156
+ }
157
+ async handleCommand(chatId, text) {
158
+ const command = text.split(/\s+/, 1)[0].toLowerCase();
159
+ switch (command) {
160
+ case '/start':
161
+ case '/help':
162
+ await this.sendMessage(chatId, USAGE);
163
+ return;
164
+ case '/chat':
165
+ this.chatModes.set(chatId, 'chat');
166
+ await this.sendMessage(chatId, 'Switched to chat mode.');
167
+ return;
168
+ case '/agent':
169
+ this.chatModes.set(chatId, 'agent');
170
+ await this.sendMessage(chatId, 'Switched to agent mode.');
171
+ return;
172
+ case '/new':
173
+ this.chatEpoch.set(chatId, (this.chatEpoch.get(chatId) ?? 0) + 1);
174
+ await this.sendMessage(chatId, 'Started a new session.');
175
+ return;
176
+ case '/think': {
177
+ const arg = text.split(/\s+/)[1]?.toLowerCase();
178
+ if (arg !== 'on' && arg !== 'off') {
179
+ await this.sendMessage(chatId, 'Usage: /think on | /think off');
180
+ return;
181
+ }
182
+ const on = arg === 'on';
183
+ this.chatThink.set(chatId, on);
184
+ let note = `Thinking mode ${on ? 'on' : 'off'}.`;
185
+ if (on && !this.runtime.profileSupportsThink(this.profile)) {
186
+ note += `\n\n⚠️ This profile's provider doesn't honor thinking mode (only bailian, alibaba_cloud, and Ollama do), so it will have no effect.`;
187
+ }
188
+ await this.sendMessage(chatId, note);
189
+ return;
190
+ }
191
+ default:
192
+ await this.sendMessage(chatId, `Unknown command ${command}.\n\n${USAGE}`);
193
+ }
194
+ }
195
+ async runTurn(chatId, prompt) {
196
+ const mode = this.chatModes.get(chatId) ?? this.config.defaultMode;
197
+ const epoch = this.chatEpoch.get(chatId) ?? 0;
198
+ const sessionId = epoch ? `tg-${chatId}-${epoch}` : `tg-${chatId}`;
199
+ // Offer a just-received file to this turn (once), so "use the file I sent"
200
+ // reaches the agent.
201
+ const recentFile = this.lastInbox.get(chatId);
202
+ this.lastInbox.delete(chatId);
203
+ const fullPrompt = recentFile ? `${prompt}\n\n[A file the user just sent is saved at: ${recentFile}]` : prompt;
204
+ // Agent runs work inside the profile's outbox (trusted → writes there don't
205
+ // prompt); whatever it leaves there is delivered afterwards.
206
+ const outbox = this.outboxDir();
207
+ if (mode === 'agent')
208
+ await (0, promises_1.mkdir)(outbox, { recursive: true }).catch(() => undefined);
209
+ let reply;
210
+ try {
211
+ const result = await (0, respond_1.respond)(this.runtime, {
212
+ profile: this.profile,
213
+ mode,
214
+ prompt: fullPrompt,
215
+ sessionId,
216
+ think: this.chatThink.get(chatId) ?? undefined,
217
+ ...(mode === 'agent'
218
+ ? {
219
+ approvalHandler: request => this.requestApproval(chatId, request),
220
+ cwd: outbox,
221
+ trustedFolders: [outbox],
222
+ instructions: OUTBOX_INSTRUCTIONS,
223
+ }
224
+ : {}),
225
+ });
226
+ let text = result.text;
227
+ if (result.denied.length > 0)
228
+ text += `${text ? '\n\n' : ''}(Couldn't run: ${result.denied.join(', ')} — denied.)`;
229
+ if (result.ok) {
230
+ reply = text || '(no response)';
231
+ }
232
+ else if (text) {
233
+ reply = `⚠️ (Didn't fully finish.)\n\n${text}`;
234
+ }
235
+ else {
236
+ reply = '⚠️ I couldn\'t finish that — the run stopped early (a step may have been denied, timed out, or hit the step limit). Try rephrasing, or send /new to reset.';
237
+ }
238
+ }
239
+ catch (error) {
240
+ this.log?.(`Telegram turn failed (chat ${chatId}): ${errorMessage(error)}`);
241
+ reply = `⚠️ Error: ${errorMessage(error)}`;
242
+ }
243
+ await this.sendMessage(chatId, reply);
244
+ if (mode === 'agent')
245
+ await this.deliverOutbox(chatId);
246
+ }
247
+ // ── Inbox / outbox ────────────────────────────────────────────────────────
248
+ /** Download a received file into the profile's inbox and remember it for the
249
+ * next turn. */
250
+ async receiveFile(chatId, file) {
251
+ try {
252
+ const inbox = this.inboxDir();
253
+ await (0, promises_1.mkdir)(inbox, { recursive: true });
254
+ const dest = await uniquePath((0, path_1.join)(inbox, sanitizeName(file.name)));
255
+ const bytes = await this.downloadFile(file.fileId);
256
+ await (0, promises_1.writeFile)(dest, bytes);
257
+ this.lastInbox.set(chatId, dest);
258
+ await this.sendMessage(chatId, `📎 Saved to your inbox: ${dest}`);
259
+ }
260
+ catch (error) {
261
+ this.log?.(`Telegram inbox save failed (chat ${chatId}): ${errorMessage(error)}`);
262
+ await this.sendMessage(chatId, `⚠️ Couldn't save that file: ${errorMessage(error)}`);
263
+ }
264
+ }
265
+ /** Send every file the agent left in the outbox, then move each to outbox/sent/. */
266
+ async deliverOutbox(chatId) {
267
+ const outbox = this.outboxDir();
268
+ let entries;
269
+ try {
270
+ entries = (await (0, promises_1.readdir)(outbox, { withFileTypes: true })).filter(e => e.isFile()).map(e => e.name);
271
+ }
272
+ catch {
273
+ return; // no outbox yet
274
+ }
275
+ if (entries.length === 0)
276
+ return;
277
+ const sentDir = (0, path_1.join)(outbox, OUTBOX_SENT_DIR);
278
+ await (0, promises_1.mkdir)(sentDir, { recursive: true }).catch(() => undefined);
279
+ for (const name of entries) {
280
+ const filePath = (0, path_1.join)(outbox, name);
281
+ try {
282
+ await this.sendFile(chatId, filePath, IMAGE_EXTS.has((0, path_1.extname)(name).toLowerCase()));
283
+ await (0, promises_1.rename)(filePath, await uniquePath((0, path_1.join)(sentDir, name)));
284
+ }
285
+ catch (error) {
286
+ this.log?.(`Telegram outbox delivery failed for ${name}: ${errorMessage(error)}`);
287
+ }
288
+ }
289
+ }
290
+ async downloadFile(fileId) {
291
+ const info = await this.call('getFile', { file_id: fileId }, SEND_TIMEOUT_MS);
292
+ if (!info.file_path)
293
+ throw new Error('Telegram getFile returned no file_path');
294
+ const url = `${TELEGRAM_FILE_BASE}/bot${this.token}/${info.file_path}`;
295
+ // Downloads through a proxy can transiently "fetch failed" — retry a few times.
296
+ let lastError;
297
+ for (let attempt = 1; attempt <= DOWNLOAD_ATTEMPTS; attempt++) {
298
+ const link = (0, core_1.createLinkedAbort)(FILE_TIMEOUT_MS, this.abort?.signal);
299
+ const init = { signal: link.signal };
300
+ const dispatcher = (0, proxy_1.proxyDispatcher)();
301
+ if (dispatcher)
302
+ init.dispatcher = dispatcher;
303
+ try {
304
+ const response = await this.fetchImpl(url, init);
305
+ if (!response.ok)
306
+ throw new Error(`download HTTP ${response.status}`);
307
+ return Buffer.from(await response.arrayBuffer());
308
+ }
309
+ catch (error) {
310
+ lastError = error;
311
+ if (attempt < DOWNLOAD_ATTEMPTS)
312
+ await this.sleep(ERROR_BACKOFF_MS);
313
+ }
314
+ finally {
315
+ link.dispose();
316
+ }
317
+ }
318
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
319
+ }
320
+ /** Upload a local file via sendDocument/sendPhoto (multipart). */
321
+ async sendFile(chatId, filePath, asPhoto) {
322
+ const method = asPhoto ? 'sendPhoto' : 'sendDocument';
323
+ const field = asPhoto ? 'photo' : 'document';
324
+ const form = new FormData();
325
+ form.append('chat_id', String(chatId));
326
+ form.append(field, new Blob([await (0, promises_1.readFile)(filePath)]), (0, path_1.basename)(filePath));
327
+ const link = (0, core_1.createLinkedAbort)(FILE_TIMEOUT_MS, this.abort?.signal);
328
+ const init = { method: 'POST', body: form, signal: link.signal };
329
+ const dispatcher = (0, proxy_1.proxyDispatcher)();
330
+ if (dispatcher)
331
+ init.dispatcher = dispatcher;
332
+ try {
333
+ const response = await this.fetchImpl(`${TELEGRAM_API_BASE}/bot${this.token}/${method}`, init);
334
+ const data = await response.json();
335
+ if (!data.ok)
336
+ throw new Error(`Telegram ${method} failed: ${data.description ?? `HTTP ${response.status}`}`);
337
+ }
338
+ finally {
339
+ link.dispose();
340
+ }
341
+ }
342
+ // ── Approval over Telegram ────────────────────────────────────────────────
343
+ /** ApprovalHandler: prompt the user with inline buttons and wait for the tap.
344
+ * "Always"/"Trust" also persist to the profile (future runs) and to the
345
+ * session (no re-prompt this run). */
346
+ async requestApproval(chatId, request) {
347
+ if (!request.escalated && this.grantedKinds.has(request.kind))
348
+ return { approved: true };
349
+ if (request.persistable !== false
350
+ && request.escalated
351
+ && request.escalatedPath
352
+ && isInsideAny(request.escalatedPath, this.trustedFolders)) {
353
+ return { approved: true };
354
+ }
355
+ const token = (0, crypto_1.randomUUID)();
356
+ const alwaysButton = request.escalatedPath
357
+ ? { text: '🛡 Trust folder', callback_data: `appr:${token}:trust` }
358
+ : { text: `🛡 Always allow ${request.kind}`, callback_data: `appr:${token}:always` };
359
+ const keyboard = {
360
+ inline_keyboard: [
361
+ [{ text: '✅ Allow once', callback_data: `appr:${token}:once` }],
362
+ ...(request.persistable === false ? [] : [[alwaysButton]]),
363
+ [{ text: '❌ Deny', callback_data: `appr:${token}:deny` }],
364
+ ],
365
+ };
366
+ const promptText = `🔧 The agent wants to run:\n${request.summary}\n(${request.tool} · ${request.kind})`;
367
+ // Register the waiter before sending, so a fast callback_query can't arrive
368
+ // before pendingApproval is set.
369
+ const approval = this.awaitApproval(token);
370
+ const messageId = await this.sendMessage(chatId, promptText, keyboard);
371
+ const action = await approval;
372
+ await this.finalizeApprovalMessage(chatId, messageId, promptText, action);
373
+ switch (action) {
374
+ case 'deny':
375
+ return { approved: false, reason: 'denied via Telegram' };
376
+ case 'timeout':
377
+ return { approved: false, reason: 'no response to the approval prompt' };
378
+ case 'trust': {
379
+ if (request.persistable === false)
380
+ return { approved: false, reason: 'this capability cannot be trusted persistently' };
381
+ const folder = (0, path_1.dirname)(request.escalatedPath);
382
+ if (!this.trustedFolders.includes(folder))
383
+ this.trustedFolders.push(folder);
384
+ try {
385
+ this.runtime.addProfileTrustedFolder(this.profile, folder);
386
+ }
387
+ catch (error) {
388
+ this.log?.(`Could not persist trusted folder: ${errorMessage(error)}`);
389
+ }
390
+ return { approved: true };
391
+ }
392
+ case 'always':
393
+ if (request.persistable === false)
394
+ return { approved: false, reason: 'this capability cannot be allowed persistently' };
395
+ this.grantedKinds.add(request.kind);
396
+ try {
397
+ this.runtime.setProfileAgentApproval(this.profile, request.kind, 'allow');
398
+ }
399
+ catch (error) {
400
+ this.log?.(`Could not persist approval: ${errorMessage(error)}`);
401
+ }
402
+ return { approved: true };
403
+ default: // 'once'
404
+ return { approved: true };
405
+ }
406
+ }
407
+ awaitApproval(token) {
408
+ return new Promise(resolveAction => {
409
+ const timer = setTimeout(() => {
410
+ if (this.pendingApproval?.token === token) {
411
+ this.pendingApproval = undefined;
412
+ resolveAction('timeout');
413
+ }
414
+ }, APPROVAL_TIMEOUT_MS);
415
+ this.pendingApproval = {
416
+ token,
417
+ resolve: action => {
418
+ clearTimeout(timer);
419
+ resolveAction(action);
420
+ },
421
+ };
422
+ });
423
+ }
424
+ async handleCallback(callback) {
425
+ const fromId = callback.from?.id;
426
+ // Ack the tap so Telegram clears the button's spinner (best-effort).
427
+ void this.call('answerCallbackQuery', { callback_query_id: callback.id }, SEND_TIMEOUT_MS).catch(() => undefined);
428
+ if (fromId === undefined || !this.config.allowlist.includes(fromId))
429
+ return;
430
+ const [, token, action] = (callback.data ?? '').split(':');
431
+ const pending = this.pendingApproval;
432
+ if (pending && pending.token === token && isApprovalAction(action)) {
433
+ this.pendingApproval = undefined;
434
+ pending.resolve(action);
435
+ }
436
+ }
437
+ async finalizeApprovalMessage(chatId, messageId, promptText, action) {
438
+ if (messageId === undefined)
439
+ return;
440
+ const label = action === 'deny' ? '❌ Denied'
441
+ : action === 'timeout' ? '⌛ No response — denied'
442
+ : action === 'trust' ? '🛡 Trusted this folder — allowed'
443
+ : action === 'always' ? '🛡 Always allowed'
444
+ : '✅ Allowed once';
445
+ // Replace the buttons with the outcome (best-effort — a stale edit is harmless).
446
+ await this.call('editMessageText', {
447
+ chat_id: chatId,
448
+ message_id: messageId,
449
+ text: `${promptText}\n\n→ ${label}`,
450
+ }, SEND_TIMEOUT_MS).catch(() => undefined);
451
+ }
452
+ // ── Telegram transport ────────────────────────────────────────────────────
453
+ async getUpdates() {
454
+ const result = await this.call('getUpdates', { offset: this.offset, timeout: LONG_POLL_SECONDS, allowed_updates: ['message', 'callback_query'] }, LONG_POLL_SECONDS * 1000 + POLL_OVERHEAD_MS);
455
+ return Array.isArray(result) ? result : [];
456
+ }
457
+ /** Send text (chunked at Telegram's limit). Returns the message id carrying the
458
+ * optional inline keyboard (attached to the final chunk), for later editing. */
459
+ async sendMessage(chatId, text, replyMarkup) {
460
+ const chunks = chunkText(text, MAX_MESSAGE_CHARS);
461
+ let keyboardMessageId;
462
+ for (let i = 0; i < chunks.length; i++) {
463
+ const params = { chat_id: chatId, text: chunks[i] };
464
+ const isLast = i === chunks.length - 1;
465
+ if (replyMarkup && isLast)
466
+ params.reply_markup = replyMarkup;
467
+ const sent = await this.call('sendMessage', params, SEND_TIMEOUT_MS);
468
+ if (replyMarkup && isLast)
469
+ keyboardMessageId = sent?.message_id;
470
+ }
471
+ return keyboardMessageId;
472
+ }
473
+ async call(method, params, timeoutMs) {
474
+ const link = (0, core_1.createLinkedAbort)(timeoutMs, this.abort?.signal);
475
+ const init = {
476
+ method: 'POST',
477
+ headers: { 'Content-Type': 'application/json' },
478
+ body: JSON.stringify(params),
479
+ signal: link.signal,
480
+ };
481
+ const dispatcher = (0, proxy_1.proxyDispatcher)();
482
+ if (dispatcher)
483
+ init.dispatcher = dispatcher;
484
+ try {
485
+ const response = await this.fetchImpl(`${TELEGRAM_API_BASE}/bot${this.token}/${method}`, init);
486
+ const data = await response.json();
487
+ if (!data.ok)
488
+ throw new Error(`Telegram ${method} failed: ${data.description ?? `HTTP ${response.status}`}`);
489
+ return data.result;
490
+ }
491
+ finally {
492
+ link.dispose();
493
+ }
494
+ }
495
+ sleep(ms) {
496
+ return new Promise(resolveSleep => setTimeout(resolveSleep, ms));
497
+ }
498
+ }
499
+ exports.TelegramBridge = TelegramBridge;
500
+ /** The downloadable attachment on a message (document preferred; else the
501
+ * largest photo size), or undefined for a plain/text message. */
502
+ function fileRef(message) {
503
+ if (message.document?.file_id) {
504
+ return { fileId: message.document.file_id, name: message.document.file_name || `file_${Date.now()}` };
505
+ }
506
+ const photo = message.photo;
507
+ if (photo && photo.length > 0) {
508
+ return { fileId: photo[photo.length - 1].file_id, name: `photo_${Date.now()}.jpg` }; // largest size is last
509
+ }
510
+ return undefined;
511
+ }
512
+ /** Reduce a Telegram-provided name to a safe basename. */
513
+ function sanitizeName(name) {
514
+ return (0, path_1.basename)(name).replace(/[^A-Za-z0-9._-]/g, '_') || `file_${Date.now()}`;
515
+ }
516
+ /** First non-colliding path: foo.md, foo-1.md, foo-2.md, … */
517
+ async function uniquePath(desired) {
518
+ const ext = (0, path_1.extname)(desired);
519
+ const stem = (0, path_1.join)((0, path_1.dirname)(desired), (0, path_1.basename)(desired, ext));
520
+ let candidate = desired;
521
+ for (let n = 1; await pathExists(candidate); n++)
522
+ candidate = `${stem}-${n}${ext}`;
523
+ return candidate;
524
+ }
525
+ async function pathExists(target) {
526
+ try {
527
+ await (0, promises_1.access)(target);
528
+ return true;
529
+ }
530
+ catch {
531
+ return false;
532
+ }
533
+ }
534
+ function isApprovalAction(value) {
535
+ return value === 'once' || value === 'trust' || value === 'always' || value === 'deny';
536
+ }
537
+ /** True when `target` is inside one of `folders` (or equals it). */
538
+ function isInsideAny(target, folders) {
539
+ const resolved = (0, path_1.resolve)(target);
540
+ return folders.some(folder => {
541
+ const base = (0, path_1.resolve)(folder);
542
+ return resolved === base || resolved.startsWith(base + path_1.sep);
543
+ });
544
+ }
545
+ /** Split into Telegram-sized chunks, preferring newline boundaries. */
546
+ function chunkText(text, max) {
547
+ if (text.length <= max)
548
+ return [text];
549
+ const chunks = [];
550
+ let rest = text;
551
+ while (rest.length > max) {
552
+ let cut = rest.lastIndexOf('\n', max);
553
+ if (cut <= 0)
554
+ cut = max;
555
+ chunks.push(rest.slice(0, cut));
556
+ rest = rest.slice(cut).replace(/^\n/, '');
557
+ }
558
+ if (rest.length > 0)
559
+ chunks.push(rest);
560
+ return chunks;
561
+ }
562
+ function errorMessage(error) {
563
+ return error instanceof Error ? error.message : String(error);
564
+ }
565
+ //# sourceMappingURL=TelegramBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramBridge.js","sourceRoot":"","sources":["../../src/channels/TelegramBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { MarifoldRuntime } from '../runtime/MarifoldRuntime';
2
+ import { ProfileMode } from '../config/ConfigSchema';
3
+ import { ApprovalHandler } from '../agent/ApprovalPolicy';
4
+ export interface RespondRequest {
5
+ /** Profile whose model + permissions the reply runs under. */
6
+ profile: string;
7
+ /** Chat (one-shot stream) or agent (tool loop). */
8
+ mode: ProfileMode;
9
+ /** The user's message. */
10
+ prompt: string;
11
+ /** Stable conversation id (e.g. `tg-<chat_id>`) so history persists per chat. */
12
+ sessionId: string;
13
+ /** Resolves `ask` approvals (agent mode). When present the run is *attended* —
14
+ * the channel prompts the user (e.g. Telegram inline buttons). When absent,
15
+ * `ask` degrades to deny (unattended). */
16
+ approvalHandler?: ApprovalHandler;
17
+ /** Working directory for agent file/shell tools (e.g. a channel's outbox). */
18
+ cwd?: string;
19
+ /** Extra run filesystem capabilities; external folders still prompt. */
20
+ trustedFolders?: string[];
21
+ /** Authoritative instructions injected atop the system prompt (e.g. telling
22
+ * the agent that files it writes are delivered to the user). */
23
+ instructions?: string[];
24
+ /** Thinking mode (honored by think-capable providers). */
25
+ think?: boolean;
26
+ }
27
+ export interface RespondResult {
28
+ /** The assistant's final text, ready to send back over the channel. */
29
+ text: string;
30
+ /** False when an agent run did not finish cleanly (error / max-iterations /
31
+ * cancelled) — so the channel can say "the run failed" instead of sending an
32
+ * empty or half-finished message. Always true for chat. */
33
+ ok: boolean;
34
+ /** Tool kinds/names the agent could not run (denied by policy in this
35
+ * unattended context), so the channel can note what it couldn't do. */
36
+ denied: string[];
37
+ }
38
+ /**
39
+ * Run one turn for a messaging channel (Telegram, Slack, …) and collect a
40
+ * plain-text reply. **Channel-agnostic:** without an `approvalHandler` the agent
41
+ * run is unattended (`ask` degrades to deny — the profile's `allow` rules and
42
+ * `trusted_folders` govern); with one, the channel prompts the user to approve.
43
+ * Presentation/formatting (chunking, markdown) belongs to the channel bridge.
44
+ */
45
+ export declare function respond(runtime: MarifoldRuntime, request: RespondRequest): Promise<RespondResult>;
46
+ //# sourceMappingURL=respond.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/channels/respond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,IAAI,EAAE,WAAW,CAAC;IAClB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB;;8CAE0C;IAC1C,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;oEACgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb;;+DAE2D;IAC3D,EAAE,EAAE,OAAO,CAAC;IACZ;2EACuE;IACvE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2BvG"}