@rubytech/create-maxy-code 0.1.592 → 0.1.593

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 (88) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +7 -3
  3. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  4. package/payload/platform/plugins/docs/references/internals.md +4 -2
  5. package/payload/platform/plugins/docs/references/telegram-guide.md +2 -0
  6. package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
  7. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +15 -2
  8. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
  9. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  10. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +7 -2
  11. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  12. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +125 -1
  13. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
  14. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +28 -0
  15. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
  16. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +72 -12
  17. package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
  18. package/payload/platform/plugins/telegram/PLUGIN.md +12 -5
  19. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js +31 -0
  20. package/payload/platform/plugins/telegram/mcp/dist/__tests__/ask-tool.test.js.map +1 -1
  21. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +30 -0
  22. package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -1
  23. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js +24 -0
  24. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-fetch-tool.test.js.map +1 -1
  25. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js +31 -0
  26. package/payload/platform/plugins/telegram/mcp/dist/__tests__/media-send-tool.test.js.map +1 -1
  27. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.d.ts +2 -0
  28. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.d.ts.map +1 -0
  29. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js +55 -0
  30. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js.map +1 -0
  31. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.d.ts +2 -0
  32. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.d.ts.map +1 -0
  33. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js +89 -0
  34. package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js.map +1 -0
  35. package/payload/platform/plugins/telegram/mcp/dist/index.js +13 -42
  36. package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
  37. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts +80 -0
  38. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts.map +1 -0
  39. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js +96 -0
  40. package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js.map +1 -0
  41. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts +5 -0
  42. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.d.ts.map +1 -1
  43. package/payload/platform/plugins/telegram/mcp/dist/tools/ask.js.map +1 -1
  44. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts +5 -0
  45. package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -1
  46. package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -1
  47. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts +5 -0
  48. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.d.ts.map +1 -1
  49. package/payload/platform/plugins/telegram/mcp/dist/tools/media-fetch.js.map +1 -1
  50. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts +5 -0
  51. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.d.ts.map +1 -1
  52. package/payload/platform/plugins/telegram/mcp/dist/tools/media-send.js.map +1 -1
  53. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts +5 -0
  54. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.d.ts.map +1 -1
  55. package/payload/platform/plugins/telegram/mcp/dist/tools/thread.js.map +1 -1
  56. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +37 -0
  57. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  58. package/payload/platform/services/claude-session-manager/dist/http-server.js +178 -13
  59. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  60. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.d.ts +13 -5
  61. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.d.ts.map +1 -1
  62. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.js +23 -9
  63. package/payload/platform/services/claude-session-manager/dist/rc-public-lockdown.js.map +1 -1
  64. package/payload/platform/services/claude-session-manager/dist/telegram-channel-mcp.d.ts +7 -4
  65. package/payload/platform/services/claude-session-manager/dist/telegram-channel-mcp.d.ts.map +1 -1
  66. package/payload/platform/services/claude-session-manager/dist/telegram-channel-mcp.js +5 -3
  67. package/payload/platform/services/claude-session-manager/dist/telegram-channel-mcp.js.map +1 -1
  68. package/payload/platform/services/claude-session-manager/dist/telegram-channel-store.d.ts +15 -1
  69. package/payload/platform/services/claude-session-manager/dist/telegram-channel-store.d.ts.map +1 -1
  70. package/payload/platform/services/claude-session-manager/dist/telegram-channel-store.js +16 -7
  71. package/payload/platform/services/claude-session-manager/dist/telegram-channel-store.js.map +1 -1
  72. package/payload/platform/services/claude-session-manager/dist/telegram-plugin-mcp.d.ts +28 -0
  73. package/payload/platform/services/claude-session-manager/dist/telegram-plugin-mcp.d.ts.map +1 -0
  74. package/payload/platform/services/claude-session-manager/dist/telegram-plugin-mcp.js +53 -0
  75. package/payload/platform/services/claude-session-manager/dist/telegram-plugin-mcp.js.map +1 -0
  76. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +9 -5
  77. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
  78. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +12 -6
  79. package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
  80. package/payload/platform/services/claude-session-manager/dist/webchat-channel-mcp.d.ts +7 -3
  81. package/payload/platform/services/claude-session-manager/dist/webchat-channel-mcp.d.ts.map +1 -1
  82. package/payload/platform/services/claude-session-manager/dist/webchat-channel-mcp.js +5 -1
  83. package/payload/platform/services/claude-session-manager/dist/webchat-channel-mcp.js.map +1 -1
  84. package/payload/platform/services/telegram-channel/dist/instructions.d.ts +14 -2
  85. package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
  86. package/payload/platform/services/telegram-channel/dist/instructions.js +34 -3
  87. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  88. package/payload/server/server.js +74 -9
@@ -7177,11 +7177,29 @@ function createScheduleInjectRoutes(deps) {
7177
7177
  console.error(`${TAG6} op=schedule-telegram-reject eventId=${eventId} destination=${destination} reason=unresolved-effective-account`);
7178
7178
  return c.json({ ok: false, error: "unresolved-effective-account" }, 403);
7179
7179
  }
7180
- if (resolution.kind === "ambiguous") {
7181
- console.error(`${TAG6} op=telegram-destination-ambiguous eventId=${eventId} destination=${destination} accounts=${resolution.count} dispatched=no`);
7182
- return c.json({ ok: false, error: "telegram-destination-ambiguous" }, 403);
7180
+ let claimant;
7181
+ if (resolution.kind === "one") {
7182
+ claimant = resolution;
7183
+ } else {
7184
+ const mine = resolution.claimants.filter((c2) => c2.accountId === eventAccountId);
7185
+ if (mine.length === 0) {
7186
+ console.error(
7187
+ `${TAG6} op=event-account-scope-mismatch eventId=${eventId} eventAccount=${eventAccountId ?? "-"} effectiveAccount=none claimants=${resolution.claimants.length} destination=${destination} dispatched=no`
7188
+ );
7189
+ return c.json({ ok: false, error: "event-account-scope-mismatch" }, 403);
7190
+ }
7191
+ if (mine.length > 1) {
7192
+ console.error(
7193
+ `${TAG6} op=telegram-destination-ambiguous eventId=${eventId} destination=${destination} accounts=${mine.length} scope=within-account dispatched=no`
7194
+ );
7195
+ return c.json({ ok: false, error: "telegram-destination-ambiguous" }, 403);
7196
+ }
7197
+ claimant = mine[0];
7198
+ console.error(
7199
+ `${TAG6} op=telegram-destination-narrowed eventId=${eventId} destination=${destination} claimants=${resolution.claimants.length} account=${claimant.accountId} botId=${claimant.botId}`
7200
+ );
7183
7201
  }
7184
- const { accountId: effectiveAccount, botId, botToken } = resolution;
7202
+ const { accountId: effectiveAccount, botId, botToken } = claimant;
7185
7203
  console.error(`${TAG6} op=effective-account eventId=${eventId} effectiveAccount=${effectiveAccount} botId=${botId}`);
7186
7204
  if (eventAccountId === null || eventAccountId !== effectiveAccount) {
7187
7205
  console.error(`${TAG6} op=event-account-scope-mismatch eventId=${eventId} eventAccount=${eventAccountId ?? "-"} effectiveAccount=${effectiveAccount} destination=${destination} dispatched=no`);
@@ -7189,8 +7207,8 @@ function createScheduleInjectRoutes(deps) {
7189
7207
  }
7190
7208
  const sendVerdict = checkTelegramChatSend({
7191
7209
  chatId: Number(destination),
7192
- allowChannels: resolution.allowChannels,
7193
- allowGroups: resolution.allowGroups
7210
+ allowChannels: claimant.allowChannels,
7211
+ allowGroups: claimant.allowGroups
7194
7212
  });
7195
7213
  console.error(
7196
7214
  `[telegram-outbound] op=channel-send botId=${botId} chatId=${destination} allowed=${sendVerdict.allowed ? "yes" : "no"} reason=${sendVerdict.reason} messageId=none`
@@ -39977,6 +39995,16 @@ function startEmitter(opts) {
39977
39995
  }
39978
39996
  continue;
39979
39997
  }
39998
+ if (opts.onToolUse && !suppressing && event.type === "assistant") {
39999
+ const pre = event.message;
40000
+ if (pre && Array.isArray(pre.content)) {
40001
+ for (const block of pre.content) {
40002
+ if (block?.type === "tool_use" && typeof block.name === "string") {
40003
+ opts.onToolUse(block.name);
40004
+ }
40005
+ }
40006
+ }
40007
+ }
39980
40008
  for (const answer of answers.push(line)) {
39981
40009
  if (suppressing) {
39982
40010
  discardedAnswers += 1;
@@ -41215,7 +41243,17 @@ function buildTelegramSpawnRequest(input) {
41215
41243
  // session resolve under that account, not the manager's boot-time house
41216
41244
  // default. Mirror of the WhatsApp builder.
41217
41245
  targetAccountId: input.accountId,
41218
- telegramChannel: { senderId: channelKey, gatewayUrl: input.gatewayUrl, serverPath: input.serverPath },
41246
+ // Task 2666 the pin travels with the channel binding. Sent on EVERY role,
41247
+ // not just public: the manager grants the rich tool surface only on
41248
+ // role:'public', and putting a role branch here would be a second place
41249
+ // that has to be kept in step with the manager's own gate.
41250
+ telegramChannel: {
41251
+ senderId: channelKey,
41252
+ gatewayUrl: input.gatewayUrl,
41253
+ serverPath: input.serverPath,
41254
+ botId: input.botId,
41255
+ chatId: input.chatId
41256
+ },
41219
41257
  logContext: `channel=telegram-native role=${input.role} botId=${input.botId} senderId=${input.senderId}`
41220
41258
  };
41221
41259
  }
@@ -41239,6 +41277,10 @@ function buildTelegramEnsureSession(deps) {
41239
41277
  gatewayUrl: input.gatewayUrl,
41240
41278
  serverPath: input.serverPath,
41241
41279
  botId: input.botId,
41280
+ // Task 2666 — the chat the public spawn's tools are pinned to. The same
41281
+ // value handed to the file follower below, so a group answers into the
41282
+ // group and a business chat into the customer's chat.
41283
+ chatId: input.chatId,
41242
41284
  // Task 2615 — the builder keys both the channel key and the session id on
41243
41285
  // this when present, instead of on the sender.
41244
41286
  businessChatId: input.businessChatId ?? null,
@@ -41510,6 +41552,7 @@ function runTelegramPresenceCensus() {
41510
41552
  }
41511
41553
 
41512
41554
  // app/lib/telegram/gateway/native-file-follower.ts
41555
+ var TELEGRAM_CARD_TOOL = "mcp__telegram__telegram-card";
41513
41556
  var CHAT_ACTION_REFRESH_MS = 4e3;
41514
41557
  function startTelegramNativeFileFollower(input) {
41515
41558
  const entry2 = {
@@ -41532,6 +41575,7 @@ function startTelegramNativeFileFollower(input) {
41532
41575
  };
41533
41576
  let lastChatActionAt = Number.NEGATIVE_INFINITY;
41534
41577
  let turnOpen = false;
41578
+ let cardSentThisTurn = false;
41535
41579
  let heartbeat = null;
41536
41580
  const send = (driver2) => {
41537
41581
  lastChatActionAt = Date.now();
@@ -41568,6 +41612,7 @@ function startTelegramNativeFileFollower(input) {
41568
41612
  };
41569
41613
  const onTurnComplete = () => {
41570
41614
  turnOpen = false;
41615
+ cardSentThisTurn = false;
41571
41616
  if (input.backgroundActive?.() === true) return;
41572
41617
  stopHeartbeat();
41573
41618
  lastChatActionAt = Number.NEGATIVE_INFINITY;
@@ -41596,10 +41641,30 @@ function startTelegramNativeFileFollower(input) {
41596
41641
  onActivity,
41597
41642
  onTurnComplete,
41598
41643
  onTurnStart,
41644
+ // Task 2666 — which tools this turn used. Only `telegram-card` matters: it
41645
+ // posts the answer's own words WITH its buttons, so delivering the turn's
41646
+ // final text beside it shows the visitor the same answer twice. A poll or a
41647
+ // photo is a separate object and its accompanying sentence is usually the
41648
+ // part that explains what it is, so those are left alone.
41649
+ //
41650
+ // Every card call posts or edits a message: `text` is required in
41651
+ // CARD_SHAPE and card.ts always issues sendMessage or editMessageText
41652
+ // before it reaches the optional answerCallbackQuery, so there is no card
41653
+ // call that posts nothing and no bare acknowledgement to keep the text for.
41654
+ onToolUse: (name) => {
41655
+ if (name === TELEGRAM_CARD_TOOL) cardSentThisTurn = true;
41656
+ },
41599
41657
  // Task 2521 — the answer reaches every bound door through the one fan-out.
41600
41658
  // Ungated by design: whatever woke the turn, the reader and the chats show
41601
- // the same thing.
41659
+ // the same thing. Task 2666 adds the one exception above.
41602
41660
  onAnswer: async (answer) => {
41661
+ if (cardSentThisTurn) {
41662
+ cardSentThisTurn = false;
41663
+ console.error(
41664
+ `[telegram-public] op=text-suppressed sessionId=${input.sessionId.slice(0, 8)} messageId=${answer.messageId} reason=card-sent`
41665
+ );
41666
+ return;
41667
+ }
41603
41668
  const targets = input.fanTargets?.() ?? [];
41604
41669
  if (targets.length === 0) return;
41605
41670
  noteAnswer(input.sessionId, answer.messageId);
@@ -43481,7 +43546,7 @@ var scheduleInjectRoutes = createScheduleInjectRoutes({
43481
43546
  }
43482
43547
  }
43483
43548
  if (hits.length === 0) return { kind: "none" };
43484
- if (hits.length > 1) return { kind: "ambiguous", count: hits.length };
43549
+ if (hits.length > 1) return { kind: "ambiguous", claimants: hits };
43485
43550
  return { kind: "one", ...hits[0] };
43486
43551
  }
43487
43552
  // Task 2078 — the same binding the live inbound resolves. Without it a