@rubytech/create-realagent-code 0.1.595 → 0.1.597

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 (193) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/routine-templates/dist/roster.d.ts +1 -1
  3. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  4. package/payload/platform/lib/routine-templates/dist/roster.js +22 -1
  5. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  6. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +0 -0
  7. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +16 -0
  8. package/payload/platform/lib/routine-templates/src/roster.ts +24 -1
  9. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +7 -6
  10. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +11 -0
  11. package/payload/platform/plugins/docs/references/admin-ui.md +6 -5
  12. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +102 -1
  13. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  14. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +0 -11
  15. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  16. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +125 -3
  17. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  18. package/payload/platform/plugins/scheduling/skills/routine-control/SKILL.md +4 -0
  19. package/payload/server/public/activity.html +6 -6
  20. package/payload/server/public/agents.html +5 -5
  21. package/payload/server/public/assets/{AdminLoginScreens-dBZJlMbp.js → AdminLoginScreens-B3W6J6Bl.js} +1 -1
  22. package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.br +0 -0
  23. package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.gz +0 -0
  24. package/payload/server/public/assets/{AdminShell-D94sgtsb.js → AdminShell-C3R-vMZ5.js} +1 -1
  25. package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.br +0 -0
  26. package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.gz +0 -0
  27. package/payload/server/public/assets/{activity-D6NEUvT7.js → activity-tzv68iBs.js} +1 -1
  28. package/payload/server/public/assets/activity-tzv68iBs.js.br +0 -0
  29. package/payload/server/public/assets/activity-tzv68iBs.js.gz +0 -0
  30. package/payload/server/public/assets/{admin-BluqXSKn.js → admin-CzW_9jm3.js} +1 -1
  31. package/payload/server/public/assets/admin-CzW_9jm3.js.br +0 -0
  32. package/payload/server/public/assets/admin-CzW_9jm3.js.gz +0 -0
  33. package/payload/server/public/assets/{agents-D_6V66dr.js → agents-DUZfeY3X.js} +1 -1
  34. package/payload/server/public/assets/agents-DUZfeY3X.js.br +0 -0
  35. package/payload/server/public/assets/agents-DUZfeY3X.js.gz +0 -0
  36. package/payload/server/public/assets/{browser-Bz9s6ztS.js → browser-DwLaXqjO.js} +1 -1
  37. package/payload/server/public/assets/browser-DwLaXqjO.js.br +0 -0
  38. package/payload/server/public/assets/browser-DwLaXqjO.js.gz +0 -0
  39. package/payload/server/public/assets/{calendar-D5OCrmwA.js → calendar-Cli8Qjl9.js} +1 -1
  40. package/payload/server/public/assets/calendar-Cli8Qjl9.js.br +0 -0
  41. package/payload/server/public/assets/calendar-Cli8Qjl9.js.gz +0 -0
  42. package/payload/server/public/assets/chat-ByAgBgm1.js +1 -0
  43. package/payload/server/public/assets/chat-ByAgBgm1.js.br +1 -0
  44. package/payload/server/public/assets/chat-ByAgBgm1.js.gz +0 -0
  45. package/payload/server/public/assets/chevron-left-BIYVnwvk.js +1 -0
  46. package/payload/server/public/assets/chevron-left-BIYVnwvk.js.br +0 -0
  47. package/payload/server/public/assets/clock-Dzy79hq3.js +1 -0
  48. package/payload/server/public/assets/clock-Dzy79hq3.js.br +0 -0
  49. package/payload/server/public/assets/clock-Dzy79hq3.js.gz +0 -0
  50. package/payload/server/public/assets/{copy-CXBu2lHL.js → copy-yhhwfEbQ.js} +1 -1
  51. package/payload/server/public/assets/copy-yhhwfEbQ.js.br +0 -0
  52. package/payload/server/public/assets/copy-yhhwfEbQ.js.gz +0 -0
  53. package/payload/server/public/assets/data-CsMMki2A.js +1 -0
  54. package/payload/server/public/assets/data-CsMMki2A.js.br +0 -0
  55. package/payload/server/public/assets/data-CsMMki2A.js.gz +0 -0
  56. package/payload/server/public/assets/{field-D4fXu_SP.js → field-jg0YQNDy.js} +1 -1
  57. package/payload/server/public/assets/field-jg0YQNDy.js.br +0 -0
  58. package/payload/server/public/assets/field-jg0YQNDy.js.gz +0 -0
  59. package/payload/server/public/assets/{file-text-BxZ1UMcQ.js → file-text-D0EdW7h4.js} +1 -1
  60. package/payload/server/public/assets/file-text-D0EdW7h4.js.br +0 -0
  61. package/payload/server/public/assets/file-text-D0EdW7h4.js.gz +0 -0
  62. package/payload/server/public/assets/{graph-DMleOCBZ.js → graph--AUr4uBc.js} +1 -1
  63. package/payload/server/public/assets/graph--AUr4uBc.js.br +0 -0
  64. package/payload/server/public/assets/graph--AUr4uBc.js.gz +0 -0
  65. package/payload/server/public/assets/{graph-labels-BHapdrTm.js → graph-labels-DM0CiAX1.js} +1 -1
  66. package/payload/server/public/assets/graph-labels-DM0CiAX1.js.br +0 -0
  67. package/payload/server/public/assets/graph-labels-DM0CiAX1.js.gz +0 -0
  68. package/payload/server/public/assets/{jsx-runtime-gqFnq1MC.css → jsx-runtime-lfcjzaWi.css} +1 -1
  69. package/payload/server/public/assets/jsx-runtime-lfcjzaWi.css.br +0 -0
  70. package/payload/server/public/assets/{jsx-runtime-gqFnq1MC.css.gz → jsx-runtime-lfcjzaWi.css.gz} +0 -0
  71. package/payload/server/public/assets/{operator-BpZTRiga.js → operator-CNYKStFX.js} +1 -1
  72. package/payload/server/public/assets/operator-CNYKStFX.js.br +0 -0
  73. package/payload/server/public/assets/operator-CNYKStFX.js.gz +0 -0
  74. package/payload/server/public/assets/{page-CsHWZZ0U.js → page-DSsEpl8J.js} +2 -2
  75. package/payload/server/public/assets/page-DSsEpl8J.js.br +0 -0
  76. package/payload/server/public/assets/page-DSsEpl8J.js.gz +0 -0
  77. package/payload/server/public/assets/{page-Dczx6CPP.js → page-DjhmwxnY.js} +1 -1
  78. package/payload/server/public/assets/page-DjhmwxnY.js.br +0 -0
  79. package/payload/server/public/assets/page-DjhmwxnY.js.gz +0 -0
  80. package/payload/server/public/assets/play-DhZlml5b.js +1 -0
  81. package/payload/server/public/assets/play-DhZlml5b.js.br +0 -0
  82. package/payload/server/public/assets/play-DhZlml5b.js.gz +0 -0
  83. package/payload/server/public/assets/{public-BzpELWaZ.js → public-7gXDqCog.js} +1 -1
  84. package/payload/server/public/assets/public-7gXDqCog.js.br +0 -0
  85. package/payload/server/public/assets/public-7gXDqCog.js.gz +0 -0
  86. package/payload/server/public/assets/{rotate-ccw-Bkpst1na.js → rotate-ccw-DhqNTPpo.js} +1 -1
  87. package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.br +0 -0
  88. package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.gz +0 -0
  89. package/payload/server/public/assets/{routines-Cmuf8pPP.js → routines-CWEuQ7Gl.js} +1 -1
  90. package/payload/server/public/assets/routines-CWEuQ7Gl.js.br +0 -0
  91. package/payload/server/public/assets/routines-CWEuQ7Gl.js.gz +0 -0
  92. package/payload/server/public/assets/{skills-Bfq3Pbw-.js → skills-pb_3BdOl.js} +1 -1
  93. package/payload/server/public/assets/skills-pb_3BdOl.js.br +0 -0
  94. package/payload/server/public/assets/skills-pb_3BdOl.js.gz +0 -0
  95. package/payload/server/public/assets/{tasks-nyWLrolq.js → tasks-BQm4boat.js} +1 -1
  96. package/payload/server/public/assets/tasks-BQm4boat.js.br +0 -0
  97. package/payload/server/public/assets/tasks-BQm4boat.js.gz +0 -0
  98. package/payload/server/public/assets/{triangle-alert-DkENIQJ6.js → triangle-alert-d7yjaIqv.js} +1 -1
  99. package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.br +0 -0
  100. package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.gz +0 -0
  101. package/payload/server/public/assets/{useCopyFeedback-DmNjbXe9.js → useCopyFeedback-CZ6Qhfkj.js} +1 -1
  102. package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.br +0 -0
  103. package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.gz +0 -0
  104. package/payload/server/public/assets/{useMediaQuery-DL-C1y_F.js → useMediaQuery-R1smYLx4.js} +1 -1
  105. package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.br +0 -0
  106. package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.gz +0 -0
  107. package/payload/server/public/assets/{useVoiceRecorder-DseLVULD.js → useVoiceRecorder-DM1v6sRa.js} +1 -1
  108. package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.br +0 -0
  109. package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.gz +0 -0
  110. package/payload/server/public/assets/{wrench-C7tdp6z9.js → wrench-DL1pbaCs.js} +1 -1
  111. package/payload/server/public/assets/wrench-DL1pbaCs.js.br +0 -0
  112. package/payload/server/public/assets/wrench-DL1pbaCs.js.gz +0 -0
  113. package/payload/server/public/browser.html +5 -5
  114. package/payload/server/public/calendar.html +8 -8
  115. package/payload/server/public/chat.html +14 -14
  116. package/payload/server/public/data.html +12 -12
  117. package/payload/server/public/field.html +3 -3
  118. package/payload/server/public/graph.html +10 -10
  119. package/payload/server/public/index.html +14 -14
  120. package/payload/server/public/operator.html +15 -15
  121. package/payload/server/public/public.html +14 -14
  122. package/payload/server/public/routines.html +8 -8
  123. package/payload/server/public/skills.html +6 -6
  124. package/payload/server/public/tasks.html +7 -7
  125. package/payload/server/server.js +161 -8
  126. package/payload/server/public/assets/AdminLoginScreens-dBZJlMbp.js.br +0 -0
  127. package/payload/server/public/assets/AdminLoginScreens-dBZJlMbp.js.gz +0 -0
  128. package/payload/server/public/assets/AdminShell-D94sgtsb.js.br +0 -0
  129. package/payload/server/public/assets/AdminShell-D94sgtsb.js.gz +0 -0
  130. package/payload/server/public/assets/activity-D6NEUvT7.js.br +0 -0
  131. package/payload/server/public/assets/activity-D6NEUvT7.js.gz +0 -0
  132. package/payload/server/public/assets/admin-BluqXSKn.js.br +0 -0
  133. package/payload/server/public/assets/admin-BluqXSKn.js.gz +0 -0
  134. package/payload/server/public/assets/agents-D_6V66dr.js.br +0 -0
  135. package/payload/server/public/assets/agents-D_6V66dr.js.gz +0 -0
  136. package/payload/server/public/assets/browser-Bz9s6ztS.js.br +0 -0
  137. package/payload/server/public/assets/browser-Bz9s6ztS.js.gz +0 -0
  138. package/payload/server/public/assets/calendar-D5OCrmwA.js.br +0 -0
  139. package/payload/server/public/assets/calendar-D5OCrmwA.js.gz +0 -0
  140. package/payload/server/public/assets/chat-CjlbEzZ-.js +0 -1
  141. package/payload/server/public/assets/chat-CjlbEzZ-.js.br +0 -1
  142. package/payload/server/public/assets/chat-CjlbEzZ-.js.gz +0 -0
  143. package/payload/server/public/assets/chevron-left-b_r2jNvg.js +0 -1
  144. package/payload/server/public/assets/chevron-left-b_r2jNvg.js.br +0 -0
  145. package/payload/server/public/assets/clock-D8tMbEZD.js +0 -1
  146. package/payload/server/public/assets/clock-D8tMbEZD.js.br +0 -0
  147. package/payload/server/public/assets/clock-D8tMbEZD.js.gz +0 -0
  148. package/payload/server/public/assets/copy-CXBu2lHL.js.br +0 -0
  149. package/payload/server/public/assets/copy-CXBu2lHL.js.gz +0 -0
  150. package/payload/server/public/assets/data-ChHg_Lq9.js +0 -1
  151. package/payload/server/public/assets/data-ChHg_Lq9.js.br +0 -0
  152. package/payload/server/public/assets/data-ChHg_Lq9.js.gz +0 -0
  153. package/payload/server/public/assets/field-D4fXu_SP.js.br +0 -0
  154. package/payload/server/public/assets/field-D4fXu_SP.js.gz +0 -0
  155. package/payload/server/public/assets/file-text-BxZ1UMcQ.js.br +0 -0
  156. package/payload/server/public/assets/file-text-BxZ1UMcQ.js.gz +0 -0
  157. package/payload/server/public/assets/graph-DMleOCBZ.js.br +0 -0
  158. package/payload/server/public/assets/graph-DMleOCBZ.js.gz +0 -0
  159. package/payload/server/public/assets/graph-labels-BHapdrTm.js.br +0 -0
  160. package/payload/server/public/assets/graph-labels-BHapdrTm.js.gz +0 -0
  161. package/payload/server/public/assets/jsx-runtime-gqFnq1MC.css.br +0 -0
  162. package/payload/server/public/assets/operator-BpZTRiga.js.br +0 -0
  163. package/payload/server/public/assets/operator-BpZTRiga.js.gz +0 -0
  164. package/payload/server/public/assets/page-CsHWZZ0U.js.br +0 -0
  165. package/payload/server/public/assets/page-CsHWZZ0U.js.gz +0 -0
  166. package/payload/server/public/assets/page-Dczx6CPP.js.br +0 -0
  167. package/payload/server/public/assets/page-Dczx6CPP.js.gz +0 -0
  168. package/payload/server/public/assets/play-D_xdb6gy.js +0 -1
  169. package/payload/server/public/assets/play-D_xdb6gy.js.br +0 -0
  170. package/payload/server/public/assets/play-D_xdb6gy.js.gz +0 -0
  171. package/payload/server/public/assets/public-BzpELWaZ.js.br +0 -0
  172. package/payload/server/public/assets/public-BzpELWaZ.js.gz +0 -0
  173. package/payload/server/public/assets/rotate-ccw-Bkpst1na.js.br +0 -0
  174. package/payload/server/public/assets/rotate-ccw-Bkpst1na.js.gz +0 -0
  175. package/payload/server/public/assets/routines-Cmuf8pPP.js.br +0 -0
  176. package/payload/server/public/assets/routines-Cmuf8pPP.js.gz +0 -0
  177. package/payload/server/public/assets/skills-Bfq3Pbw-.js.br +0 -0
  178. package/payload/server/public/assets/skills-Bfq3Pbw-.js.gz +0 -0
  179. package/payload/server/public/assets/tasks-nyWLrolq.js.br +0 -0
  180. package/payload/server/public/assets/tasks-nyWLrolq.js.gz +0 -0
  181. package/payload/server/public/assets/triangle-alert-DkENIQJ6.js.br +0 -0
  182. package/payload/server/public/assets/triangle-alert-DkENIQJ6.js.gz +0 -0
  183. package/payload/server/public/assets/useCopyFeedback-DmNjbXe9.js.br +0 -1
  184. package/payload/server/public/assets/useCopyFeedback-DmNjbXe9.js.gz +0 -0
  185. package/payload/server/public/assets/useMediaQuery-DL-C1y_F.js.br +0 -0
  186. package/payload/server/public/assets/useMediaQuery-DL-C1y_F.js.gz +0 -0
  187. package/payload/server/public/assets/useVoiceRecorder-DseLVULD.js.br +0 -0
  188. package/payload/server/public/assets/useVoiceRecorder-DseLVULD.js.gz +0 -0
  189. package/payload/server/public/assets/wrench-C7tdp6z9.js.br +0 -0
  190. package/payload/server/public/assets/wrench-C7tdp6z9.js.gz +0 -0
  191. /package/payload/server/public/assets/{jsx-runtime-BcrVQeV-.js → jsx-runtime-BtDK2X5t.js} +0 -0
  192. /package/payload/server/public/assets/{jsx-runtime-BcrVQeV-.js.br → jsx-runtime-BtDK2X5t.js.br} +0 -0
  193. /package/payload/server/public/assets/{jsx-runtime-BcrVQeV-.js.gz → jsx-runtime-BtDK2X5t.js.gz} +0 -0
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Skills — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/skills-Bfq3Pbw-.js"></script>
8
+ <script type="module" crossorigin src="/assets/skills-pb_3BdOl.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BcrVQeV-.js">
11
- <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DL-C1y_F.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D94sgtsb.js">
13
- <link rel="modulepreload" crossorigin href="/assets/file-text-BxZ1UMcQ.js">
14
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-gqFnq1MC.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BtDK2X5t.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-R1smYLx4.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-C3R-vMZ5.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/file-text-D0EdW7h4.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-lfcjzaWi.css">
15
15
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
16
16
  <link rel="stylesheet" href="/brand-defaults.css">
17
17
  </head>
@@ -5,14 +5,14 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Tasks — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/tasks-nyWLrolq.js"></script>
8
+ <script type="module" crossorigin src="/assets/tasks-BQm4boat.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BcrVQeV-.js">
11
- <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-DL-C1y_F.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-D94sgtsb.js">
13
- <link rel="modulepreload" crossorigin href="/assets/play-D_xdb6gy.js">
14
- <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-Bkpst1na.js">
15
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-gqFnq1MC.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BtDK2X5t.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/useMediaQuery-R1smYLx4.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-C3R-vMZ5.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/play-DhZlml5b.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/rotate-ccw-DhqNTPpo.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-lfcjzaWi.css">
16
16
  <link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
17
17
  <link rel="stylesheet" href="/brand-defaults.css">
18
18
  </head>
@@ -4248,6 +4248,26 @@ var CHANNEL_REPLY_DOCUMENT_TOOL = "mcp__channel__reply-document";
4248
4248
  var WA_SEND_PARTY_TOOL = "mcp__whatsapp-channel__send-to-party";
4249
4249
  var CHANNEL_SEND_PARTY_TOOL = "mcp__channel__send-to-party";
4250
4250
  var SEND_USER_FILE_TOOL = "SendUserFile";
4251
+ var TELEGRAM_CARD_TOOLS = /* @__PURE__ */ new Set([
4252
+ "mcp__telegram__telegram-card",
4253
+ "mcp__plugin_telegram_telegram__telegram-card"
4254
+ ]);
4255
+ function parseCardButtonsFromInput(input) {
4256
+ const rows = input?.buttons;
4257
+ if (!Array.isArray(rows)) return [];
4258
+ const out = [];
4259
+ for (const row of rows) {
4260
+ if (!Array.isArray(row)) continue;
4261
+ for (const b of row) {
4262
+ if (!b || typeof b !== "object") continue;
4263
+ const text = b.text;
4264
+ if (typeof text !== "string") continue;
4265
+ const data = b.callbackData;
4266
+ out.push({ text, data: typeof data === "string" ? data : null });
4267
+ }
4268
+ }
4269
+ return out;
4270
+ }
4251
4271
  var CLI_MARKER_PREFIXES = ["<local-command-", "<command-name>", "<command-message>"];
4252
4272
  var HARNESS_LIFECYCLE_PREFIXES = ["<task-notification>"];
4253
4273
  var CC_IMAGE_VISION_HINT = /^\[Image:[^\]]*Multiply coordinates by [\d.]+ to map to original image\.\]$/;
@@ -4410,6 +4430,14 @@ function assistantTurns(content, ts, promoteFinal = false, erroredIds = /* @__PU
4410
4430
  } else {
4411
4431
  out.push({ kind: "agent-file", files, caption, ts });
4412
4432
  }
4433
+ } else if (b.type === "tool_use" && typeof b.name === "string" && TELEGRAM_CARD_TOOLS.has(b.name)) {
4434
+ const input = b.input ?? {};
4435
+ out.push({
4436
+ kind: "telegram-card",
4437
+ text: typeof input.text === "string" ? input.text : "",
4438
+ buttons: parseCardButtonsFromInput(b.input),
4439
+ ts
4440
+ });
4413
4441
  } else if (b.type === "tool_use" && typeof b.name === "string") {
4414
4442
  out.push({ kind: "tool-call", name: b.name, input: b.input ?? null, ts });
4415
4443
  }
@@ -7153,6 +7181,20 @@ function transcriptBoundary(sessionKey) {
7153
7181
  return { transcriptOffset: null, bounded: false };
7154
7182
  }
7155
7183
  }
7184
+ function composeDeliveredText(prompt, deliveredMessages) {
7185
+ if (!Array.isArray(deliveredMessages) || deliveredMessages.length === 0) return prompt;
7186
+ const lines = deliveredMessages.map((m) => {
7187
+ const r = m ?? {};
7188
+ const who = typeof r.senderName === "string" && r.senderName.trim() !== "" ? r.senderName : String(r.senderId ?? "unknown");
7189
+ const when = typeof r.createdAt === "string" ? r.createdAt : "";
7190
+ const text = typeof r.body === "string" ? r.body : "";
7191
+ return `- ${who} (${when}): ${text}`;
7192
+ });
7193
+ return `${prompt}
7194
+
7195
+ ## Messages since the last check
7196
+ ${lines.join("\n")}`;
7197
+ }
7156
7198
  function createScheduleInjectRoutes(deps) {
7157
7199
  const app81 = new Hono();
7158
7200
  app81.post("/", async (c) => {
@@ -7181,6 +7223,7 @@ function createScheduleInjectRoutes(deps) {
7181
7223
  const eventAccountId = typeof body.accountId === "string" && body.accountId.length > 0 ? body.accountId : null;
7182
7224
  const destination = typeof body.destination === "string" ? body.destination : "";
7183
7225
  const prompt = typeof body.prompt === "string" ? body.prompt : "";
7226
+ const injectedText = composeDeliveredText(prompt, body.deliveredMessages);
7184
7227
  const eventId = typeof body.eventId === "string" ? body.eventId : "";
7185
7228
  const scheduleProvenance = parseScheduleProvenance(body.scheduleProvenance);
7186
7229
  if (channel !== "whatsapp" && channel !== "telegram" || !destination || !prompt) {
@@ -7323,7 +7366,7 @@ function createScheduleInjectRoutes(deps) {
7323
7366
  // Task 2619 — a scheduled dispatch is always role:'admin' (see above),
7324
7367
  // so it names no specialist card.
7325
7368
  specialist: null,
7326
- text: prompt,
7369
+ text: injectedText,
7327
7370
  // Task 2489 — a scheduled inject carries no inbound file by
7328
7371
  // construction: there is no message to have attached one.
7329
7372
  media: [],
@@ -15010,6 +15053,7 @@ function foldPatches(rows, uploadsBase) {
15010
15053
  if (metas.length > 0) patch.attachments = [...patch.attachments ?? [], ...metas];
15011
15054
  }
15012
15055
  if (row.body !== void 0) patch.text = row.body;
15056
+ if (row.buttons) patch.buttons = row.buttons;
15013
15057
  if (row.deleted === true) patch.deleted = true;
15014
15058
  out.set(row.targetMessageId, patch);
15015
15059
  }
@@ -15026,6 +15070,9 @@ function toTurn(r, patch) {
15026
15070
  origin: r.origin,
15027
15071
  messageId: r.messageId,
15028
15072
  ...patch?.attachments ? { attachments: patch.attachments } : {},
15073
+ // Task 2677 — the card's button labels: the edit patch wins, else the row's
15074
+ // own. Spread, so an ordinary message row carries no key.
15075
+ ...patch?.buttons ?? r.buttons ? { buttons: patch?.buttons ?? r.buttons } : {},
15029
15076
  // Task 2615 — spread, so a turn nobody deleted carries no key at all and
15030
15077
  // every pre-2615 frame stays byte-identical. The BODY is kept: Telegram
15031
15078
  // sends none on a deletion, so the stored body is the only account anywhere
@@ -15084,20 +15131,24 @@ app6.get("/gate-probe", (c) => {
15084
15131
  return resolution === "scope" ? c.json({ error: "that telegram bot belongs to another account", reason: "account-scope" }, 403) : c.json({ error: "no such telegram bot", reason: "unknown-bot" }, 404);
15085
15132
  }
15086
15133
  }
15134
+ const since = c.req.query("since")?.trim() || null;
15087
15135
  const all = [...readConversationSummaries2(accountId).keys()];
15088
15136
  const keys = botId === null ? all : all.filter((k) => parseTelegramChannelKey(k)?.botId === botId);
15089
15137
  let newestInboundAt = null;
15138
+ const messages = [];
15090
15139
  for (const channelKey of keys) {
15091
15140
  for (const row of readRows(accountId, channelKey)) {
15092
15141
  if (isUpdateRecord(row)) continue;
15093
15142
  if (row.origin !== "inbound") continue;
15094
15143
  if (newestInboundAt === null || row.createdAt > newestInboundAt) newestInboundAt = row.createdAt;
15144
+ if (since !== null && row.createdAt > since) messages.push(row);
15095
15145
  }
15096
15146
  }
15147
+ messages.sort((a, b) => a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0);
15097
15148
  console.log(
15098
15149
  `${TAG24} op=gate-probe accountId=${accountId.slice(0, 8)} botId=${botId ?? "all"} resolution=${resolution} conversations=${keys.length} ofAccount=${all.length} newestInboundAt=${newestInboundAt ?? "null"}`
15099
15150
  );
15100
- return c.json({ newestInboundAt });
15151
+ return c.json(since === null ? { newestInboundAt } : { newestInboundAt, messages });
15101
15152
  });
15102
15153
  app6.get("/store-backfill", requireAdminSession, (c) => {
15103
15154
  const v = validate(c.req.query("accountId"), c.req.query("channelKey"));
@@ -40092,7 +40143,11 @@ function startEmitter(opts) {
40092
40143
  if (pre && Array.isArray(pre.content)) {
40093
40144
  for (const block of pre.content) {
40094
40145
  if (block?.type === "tool_use" && typeof block.name === "string") {
40095
- opts.onToolUse(block.name);
40146
+ opts.onToolUse({
40147
+ name: block.name,
40148
+ input: block.input,
40149
+ id: typeof block.id === "string" ? block.id : ""
40150
+ });
40096
40151
  }
40097
40152
  }
40098
40153
  }
@@ -40127,6 +40182,19 @@ function startEmitter(opts) {
40127
40182
  }
40128
40183
  }
40129
40184
  }
40185
+ if (opts.onToolResult && !suppressing) {
40186
+ const umsg = event.message;
40187
+ if (umsg && Array.isArray(umsg.content)) {
40188
+ for (const block of umsg.content) {
40189
+ if (block?.type !== "tool_result" || typeof block.tool_use_id !== "string") continue;
40190
+ opts.onToolResult({
40191
+ toolUseId: block.tool_use_id,
40192
+ text: toolResultText(block.content),
40193
+ isError: block.is_error === true
40194
+ });
40195
+ }
40196
+ }
40197
+ }
40130
40198
  if (!suppressing) opts.onTurnStart?.(classifyTurnStart(event));
40131
40199
  firedFileTools = [];
40132
40200
  continue;
@@ -41648,7 +41716,7 @@ var sessions3 = /* @__PURE__ */ new Map();
41648
41716
  function entry2(sessionId) {
41649
41717
  let e = sessions3.get(sessionId);
41650
41718
  if (!e) {
41651
- e = { armed: 0, suppressed: 0, delivered: 0 };
41719
+ e = { armed: 0, suppressed: 0, delivered: 0, persisted: 0 };
41652
41720
  sessions3.set(sessionId, e);
41653
41721
  }
41654
41722
  return e;
@@ -41663,23 +41731,50 @@ function noteCardDelivered(sessionId) {
41663
41731
  const e = sessions3.get(sessionId);
41664
41732
  if (e && e.armed > 0) e.delivered += 1;
41665
41733
  }
41734
+ function noteCardPersisted(sessionId) {
41735
+ const e = sessions3.get(sessionId);
41736
+ if (e && e.armed > 0) e.persisted += 1;
41737
+ }
41666
41738
  function cardCensusLines() {
41667
41739
  let armed2 = 0;
41668
41740
  let suppressed = 0;
41669
41741
  let delivered = 0;
41742
+ let persisted = 0;
41670
41743
  for (const e of sessions3.values()) {
41671
41744
  armed2 += e.armed;
41672
41745
  suppressed += e.suppressed;
41673
41746
  delivered += e.delivered;
41747
+ persisted += e.persisted;
41674
41748
  }
41675
41749
  const silent = Math.max(0, armed2 - suppressed - delivered);
41676
41750
  return [
41677
- `[telegram-card-suppression-census] sessions=${sessions3.size} armed=${armed2} suppressed=${suppressed} silent-turns=${silent}`
41751
+ `[telegram-card-suppression-census] sessions=${sessions3.size} armed=${armed2} suppressed=${suppressed} silent-turns=${silent} persisted=${persisted}`
41678
41752
  ];
41679
41753
  }
41680
41754
 
41681
41755
  // app/lib/telegram/gateway/native-file-follower.ts
41682
41756
  var TELEGRAM_CARD_TOOL = "mcp__telegram__telegram-card";
41757
+ var CARD_TOOL_NAMES = /* @__PURE__ */ new Set([
41758
+ "mcp__telegram__telegram-card",
41759
+ "mcp__plugin_telegram_telegram__telegram-card"
41760
+ ]);
41761
+ var CARD_RESULT_RE = /card-result: outcome=(sent|edited|unchanged|none) messageId=(\d+|none)/;
41762
+ function parseCardButtons(input) {
41763
+ const rows = input?.buttons;
41764
+ if (!Array.isArray(rows)) return [];
41765
+ const out = [];
41766
+ for (const row of rows) {
41767
+ if (!Array.isArray(row)) continue;
41768
+ for (const b of row) {
41769
+ if (!b || typeof b !== "object") continue;
41770
+ const text = b.text;
41771
+ if (typeof text !== "string") continue;
41772
+ const data = b.callbackData;
41773
+ out.push({ text, data: typeof data === "string" ? data : null });
41774
+ }
41775
+ }
41776
+ return out;
41777
+ }
41683
41778
  var CHAT_ACTION_REFRESH_MS = 4e3;
41684
41779
  function startTelegramNativeFileFollower(input) {
41685
41780
  const entry3 = {
@@ -41700,6 +41795,9 @@ function startTelegramNativeFileFollower(input) {
41700
41795
  // The chat id the document is addressed to (set per spawn from the inbound).
41701
41796
  replyTarget: input.chatId
41702
41797
  };
41798
+ const pendingCards = /* @__PURE__ */ new Map();
41799
+ const channelKey = input.senderId;
41800
+ const numericSenderId = parseTelegramChannelKey(channelKey)?.senderId ?? input.chatId;
41703
41801
  let lastChatActionAt = Number.NEGATIVE_INFINITY;
41704
41802
  let turnOpen = false;
41705
41803
  let cardSentThisTurn = false;
@@ -41778,12 +41876,67 @@ function startTelegramNativeFileFollower(input) {
41778
41876
  // CARD_SHAPE and card.ts always issues sendMessage or editMessageText
41779
41877
  // before it reaches the optional answerCallbackQuery, so there is no card
41780
41878
  // call that posts nothing and no bare acknowledgement to keep the text for.
41781
- onToolUse: (name) => {
41782
- if (name !== TELEGRAM_CARD_TOOL) return;
41879
+ onToolUse: (tool) => {
41880
+ if (CARD_TOOL_NAMES.has(tool.name) && tool.id) {
41881
+ const text = tool.input?.text;
41882
+ pendingCards.set(tool.id, {
41883
+ text: typeof text === "string" ? text : "",
41884
+ buttons: parseCardButtons(tool.input)
41885
+ });
41886
+ }
41887
+ if (tool.name !== TELEGRAM_CARD_TOOL) return;
41783
41888
  cardSentThisTurn = true;
41784
41889
  noteCardArmed(input.sessionId);
41785
41890
  console.error(
41786
- `[telegram-public] op=card-armed sessionId=${input.sessionId.slice(0, 8)} tool=${name}`
41891
+ `[telegram-public] op=card-armed sessionId=${input.sessionId.slice(0, 8)} tool=${tool.name}`
41892
+ );
41893
+ },
41894
+ // Task 2677 — the card's send outcome and message id arrive here, parsed out
41895
+ // of the result text card.ts encoded them into. On a confirmed send write one
41896
+ // outbound store row keyed by the card message id; on an edit patch that same
41897
+ // row (Telegram reuses the id for an edit); unchanged/none write nothing.
41898
+ onToolResult: ({ toolUseId, text }) => {
41899
+ const pending = pendingCards.get(toolUseId);
41900
+ if (!pending) return;
41901
+ pendingCards.delete(toolUseId);
41902
+ const m = CARD_RESULT_RE.exec(text);
41903
+ if (!m) return;
41904
+ const outcome = m[1];
41905
+ const messageId = m[2];
41906
+ if (outcome !== "sent" && outcome !== "edited" || messageId === "none") return;
41907
+ const at = (/* @__PURE__ */ new Date()).toISOString();
41908
+ const rowId = `telegram:${input.accountId}:${channelKey}:card:${messageId}`;
41909
+ if (outcome === "sent") {
41910
+ appendMessage2(input.accountId, {
41911
+ messageId: rowId,
41912
+ sessionId: input.sessionId,
41913
+ dateSent: at,
41914
+ body: pending.text,
41915
+ fromMe: true,
41916
+ senderId: numericSenderId,
41917
+ senderName: null,
41918
+ chatId: input.chatId,
41919
+ channelKey,
41920
+ // Telegram row scope is not consumed for rendering or routing (only
41921
+ // WhatsApp rows feed the operator-conversations scope counter); 'admin'
41922
+ // matches the operator-surface intent of the card row.
41923
+ scope: "admin",
41924
+ origin: "agent",
41925
+ ...pending.buttons.length > 0 ? { buttons: pending.buttons } : {},
41926
+ createdAt: at
41927
+ });
41928
+ } else {
41929
+ appendUpdate(input.accountId, channelKey, {
41930
+ kind: "update",
41931
+ targetMessageId: rowId,
41932
+ body: pending.text,
41933
+ ...pending.buttons.length > 0 ? { buttons: pending.buttons } : {},
41934
+ createdAt: at
41935
+ });
41936
+ }
41937
+ noteCardPersisted(input.sessionId);
41938
+ console.error(
41939
+ `[telegram-adaptor] op=card-persisted sessionId=${input.sessionId.slice(0, 8)} messageId=${messageId} outcome=${outcome} buttons=${pending.buttons.length}`
41787
41940
  );
41788
41941
  },
41789
41942
  // Task 2521 — the answer reaches every bound door through the one fan-out.
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-BcrVQeV-.js";import"./useMediaQuery-DL-C1y_F.js";import"./useVoiceRecorder-DseLVULD.js";import"./AdminShell-D94sgtsb.js";import{n}from"./page-CsHWZZ0U.js";import"./useCopyFeedback-DmNjbXe9.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- =`��i�ez��1����Ʋ hۏ�(ɻ8N1��2+f}��x�t��ɝ�|��&| ��������_������T���(D`���Z�_
@@ -1 +0,0 @@
1
- import{Z as e}from"./useMediaQuery-DL-C1y_F.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
@@ -1 +0,0 @@
1
- import{Z as e}from"./useMediaQuery-DL-C1y_F.js";var t=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]);export{t};
@@ -1 +0,0 @@
1
- import{n as e,t}from"./jsx-runtime-BcrVQeV-.js";import"./useMediaQuery-DL-C1y_F.js";import"./useVoiceRecorder-DseLVULD.js";import{t as n}from"./page-Dczx6CPP.js";import"./graph-labels-BHapdrTm.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- import{Z as e}from"./useMediaQuery-DL-C1y_F.js";var t=e(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]);export{t};
@@ -1 +0,0 @@
1
- `d����