@geminixiang/mikan 1.0.0-beta.95 → 1.0.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 (137) hide show
  1. package/CHANGELOG.md +387 -391
  2. package/README.md +33 -42
  3. package/dist/adapters/github/bot.js +1 -1
  4. package/dist/adapters/github/bot.js.map +1 -1
  5. package/dist/adapters/github/policy.d.ts +2 -9
  6. package/dist/adapters/github/policy.d.ts.map +1 -1
  7. package/dist/adapters/github/policy.js +18 -26
  8. package/dist/adapters/github/policy.js.map +1 -1
  9. package/dist/adapters/slack/bot.d.ts +2 -4
  10. package/dist/adapters/slack/bot.d.ts.map +1 -1
  11. package/dist/adapters/slack/bot.js +28 -56
  12. package/dist/adapters/slack/bot.js.map +1 -1
  13. package/dist/adapters/slack/socket-agent.d.ts +9 -0
  14. package/dist/adapters/slack/socket-agent.d.ts.map +1 -0
  15. package/dist/adapters/slack/socket-agent.js +17 -0
  16. package/dist/adapters/slack/socket-agent.js.map +1 -0
  17. package/dist/adapters/telegram/bot.d.ts +1 -0
  18. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  19. package/dist/adapters/telegram/bot.js +6 -1
  20. package/dist/adapters/telegram/bot.js.map +1 -1
  21. package/dist/adapters/telegram/types.d.ts +1 -0
  22. package/dist/adapters/telegram/types.d.ts.map +1 -1
  23. package/dist/adapters/telegram/types.js.map +1 -1
  24. package/dist/cli/arg-grammar.d.ts +1 -2
  25. package/dist/cli/arg-grammar.d.ts.map +1 -1
  26. package/dist/cli/arg-grammar.js +2 -17
  27. package/dist/cli/arg-grammar.js.map +1 -1
  28. package/dist/cli/boot.d.ts.map +1 -1
  29. package/dist/cli/boot.js +5 -11
  30. package/dist/cli/boot.js.map +1 -1
  31. package/dist/cli/migrate.d.ts.map +1 -1
  32. package/dist/cli/migrate.js +22 -7
  33. package/dist/cli/migrate.js.map +1 -1
  34. package/dist/cli/office.d.ts.map +1 -1
  35. package/dist/cli/office.js +3 -5
  36. package/dist/cli/office.js.map +1 -1
  37. package/dist/cli/onboard.js +18 -20
  38. package/dist/cli/onboard.js.map +1 -1
  39. package/dist/cli/types.d.ts +1 -2
  40. package/dist/cli/types.d.ts.map +1 -1
  41. package/dist/cli/types.js.map +1 -1
  42. package/dist/env-manifest.d.ts +2 -0
  43. package/dist/env-manifest.d.ts.map +1 -1
  44. package/dist/env-manifest.js +76 -43
  45. package/dist/env-manifest.js.map +1 -1
  46. package/dist/events/index.d.ts +5 -5
  47. package/dist/events/index.d.ts.map +1 -1
  48. package/dist/events/index.js +1 -7
  49. package/dist/events/index.js.map +1 -1
  50. package/dist/file-guards.d.ts +1 -0
  51. package/dist/file-guards.d.ts.map +1 -1
  52. package/dist/file-guards.js +4 -1
  53. package/dist/file-guards.js.map +1 -1
  54. package/dist/harness/execution-resolver.d.ts.map +1 -1
  55. package/dist/harness/execution-resolver.js +1 -7
  56. package/dist/harness/execution-resolver.js.map +1 -1
  57. package/dist/harness/http.d.ts +1 -2
  58. package/dist/harness/http.d.ts.map +1 -1
  59. package/dist/harness/http.js +3 -16
  60. package/dist/harness/http.js.map +1 -1
  61. package/dist/harness/jev.d.ts +2 -1
  62. package/dist/harness/jev.d.ts.map +1 -1
  63. package/dist/harness/jev.js.map +1 -1
  64. package/dist/harness/prompt.d.ts.map +1 -1
  65. package/dist/harness/prompt.js +0 -6
  66. package/dist/harness/prompt.js.map +1 -1
  67. package/dist/harness/session.d.ts +2 -9
  68. package/dist/harness/session.d.ts.map +1 -1
  69. package/dist/harness/session.js +3 -3
  70. package/dist/harness/session.js.map +1 -1
  71. package/dist/harness/tools/event.d.ts +0 -1
  72. package/dist/harness/tools/event.d.ts.map +1 -1
  73. package/dist/harness/tools/event.js +1 -7
  74. package/dist/harness/tools/event.js.map +1 -1
  75. package/dist/harness/types.d.ts +3 -3
  76. package/dist/harness/types.d.ts.map +1 -1
  77. package/dist/harness/types.js.map +1 -1
  78. package/dist/index.d.ts +8 -31
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +3 -15
  81. package/dist/index.js.map +1 -1
  82. package/dist/main.js +26 -36
  83. package/dist/main.js.map +1 -1
  84. package/dist/migrations/index.d.ts +0 -1
  85. package/dist/migrations/index.d.ts.map +1 -1
  86. package/dist/migrations/index.js +4 -4
  87. package/dist/migrations/index.js.map +1 -1
  88. package/dist/migrations/legacy-office-files.d.ts +3 -0
  89. package/dist/migrations/legacy-office-files.d.ts.map +1 -0
  90. package/dist/migrations/legacy-office-files.js +29 -0
  91. package/dist/migrations/legacy-office-files.js.map +1 -0
  92. package/dist/observability/instrument.js +2 -3
  93. package/dist/observability/instrument.js.map +1 -1
  94. package/dist/observability/sentry.js +1 -1
  95. package/dist/observability/sentry.js.map +1 -1
  96. package/dist/office/projection.js +2 -2
  97. package/dist/office/projection.js.map +1 -1
  98. package/dist/sandbox/identity.d.ts +0 -1
  99. package/dist/sandbox/identity.d.ts.map +1 -1
  100. package/dist/sandbox/identity.js +0 -3
  101. package/dist/sandbox/identity.js.map +1 -1
  102. package/dist/sandbox/registry.d.ts +1 -5
  103. package/dist/sandbox/registry.d.ts.map +1 -1
  104. package/dist/sandbox/registry.js +4 -13
  105. package/dist/sandbox/registry.js.map +1 -1
  106. package/dist/sandbox/types.d.ts +1 -5
  107. package/dist/sandbox/types.d.ts.map +1 -1
  108. package/dist/sandbox/types.js.map +1 -1
  109. package/dist/sessions/types.d.ts +1 -1
  110. package/dist/sessions/types.d.ts.map +1 -1
  111. package/dist/sessions/types.js.map +1 -1
  112. package/dist/settings/index.d.ts +56 -2
  113. package/dist/settings/index.d.ts.map +1 -1
  114. package/dist/settings/index.js +57 -37
  115. package/dist/settings/index.js.map +1 -1
  116. package/dist/types.d.ts +1 -25
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/types.js.map +1 -1
  119. package/dist/vault/index.js +1 -1
  120. package/dist/vault/index.js.map +1 -1
  121. package/package.json +4 -17
  122. package/dist/cli/download.d.ts +0 -2
  123. package/dist/cli/download.d.ts.map +0 -1
  124. package/dist/cli/download.js +0 -84
  125. package/dist/cli/download.js.map +0 -1
  126. package/dist/harness/index.d.ts +0 -20
  127. package/dist/harness/index.d.ts.map +0 -1
  128. package/dist/harness/index.js +0 -14
  129. package/dist/harness/index.js.map +0 -1
  130. package/dist/sandbox/cloudflare.d.ts +0 -17
  131. package/dist/sandbox/cloudflare.d.ts.map +0 -1
  132. package/dist/sandbox/cloudflare.js +0 -142
  133. package/dist/sandbox/cloudflare.js.map +0 -1
  134. package/dist/sandbox/index.d.ts +0 -7
  135. package/dist/sandbox/index.d.ts.map +0 -1
  136. package/dist/sandbox/index.js +0 -6
  137. package/dist/sandbox/index.js.map +0 -1
@@ -8,6 +8,7 @@ import { COMMAND_MANIFEST } from "../commands/manifest.js";
8
8
  import { slackConversationAutoReplyMode, resolveConversationSettings, } from "../../settings/index.js";
9
9
  import { evaluateWithJev, JevNotConfiguredError } from "../../harness/jev.js";
10
10
  import * as log from "../../log.js";
11
+ import { SlackSocketAgent } from "./socket-agent.js";
11
12
  import { readTextFileNoFollowIfExists } from "../../file-guards.js";
12
13
  import { PRODUCT_NAME, formatForceStopped } from "../messages.js";
13
14
  import { MessagingEventQueue, MessagingIntakeTracker, AttachmentRejectedError, saveIncomingAttachments, writeResponseToFile, withRetry, } from "../shared.js";
@@ -257,6 +258,7 @@ export class SlackMessagingBot {
257
258
  new SocketModeClient({
258
259
  appToken: config.appToken,
259
260
  clientPingTimeout: 12_000,
261
+ clientOptions: { agent: new SlackSocketAgent() },
260
262
  });
261
263
  this.webClient = config.webApi ?? new WebClient(config.botToken, { fetch: config.fetch });
262
264
  this.statusClient = new WebClient(config.botToken, {
@@ -282,7 +284,14 @@ export class SlackMessagingBot {
282
284
  this.backfillChannelKinds();
283
285
  this.startupTs = (Date.now() / 1000).toFixed(6);
284
286
  this.setupEventHandlers();
285
- await this.socketClient.start();
287
+ try {
288
+ await this.socketClient.start();
289
+ }
290
+ catch (error) {
291
+ if (this.stopped)
292
+ return;
293
+ throw error;
294
+ }
286
295
  log.logConnected("Slack");
287
296
  void this.backfillAllChannels(this.startupTs).catch((error) => {
288
297
  log.logWarning("Slack backfill failed", String(error));
@@ -399,55 +408,6 @@ export class SlackMessagingBot {
399
408
  return channelId;
400
409
  });
401
410
  }
402
- async fetchHistory(channel, options) {
403
- const limit = Math.min(Math.max(options?.limit ?? 200, 1), 999);
404
- const threadTs = options?.threadTs;
405
- return slackRetry(async () => {
406
- const result = threadTs
407
- ? await this.webClient.conversations.replies({
408
- channel,
409
- ts: threadTs,
410
- oldest: options?.oldest || undefined,
411
- inclusive: options?.oldest ? false : undefined,
412
- limit,
413
- })
414
- : await this.webClient.conversations.history({
415
- channel,
416
- oldest: options?.oldest || undefined,
417
- inclusive: options?.oldest ? false : undefined,
418
- limit,
419
- });
420
- const messages = (result.messages ?? []);
421
- const mapped = messages
422
- .filter((msg) => !!msg.ts)
423
- .filter((msg) => msg.ts !== threadTs)
424
- .map((msg) => {
425
- const user = msg.user ? this.users.get(msg.user) : undefined;
426
- const message = {
427
- ts: msg.ts,
428
- text: unescapeSlackText(msg.text ?? ""),
429
- isBot: !!msg.bot_id || msg.subtype === "bot_message" || user?.isBot === true,
430
- };
431
- if (msg.thread_ts && msg.thread_ts !== msg.ts)
432
- message.threadTs = msg.thread_ts;
433
- if (msg.user)
434
- message.userId = msg.user;
435
- if (user)
436
- message.userName = user.userName;
437
- return message;
438
- });
439
- return threadTs ? mapped : mapped.toReversed();
440
- });
441
- }
442
- async listUsers() {
443
- await slackRetry(() => this.fetchUsers());
444
- return this.getAllUsers().map((user) => ({
445
- id: user.id,
446
- userName: user.userName,
447
- displayName: user.displayName,
448
- isBot: user.isBot === true,
449
- }));
450
- }
451
411
  async updateMessage(channel, ts, text) {
452
412
  return slackRetry(async () => {
453
413
  const payload = { channel, ts, ...renderSlackBlocks(this.resolveMentions(text)) };
@@ -1059,14 +1019,22 @@ export class SlackMessagingBot {
1059
1019
  await this.handler.handleEvent(event, this, context);
1060
1020
  }
1061
1021
  setupEventHandlers() {
1062
- this.socketClient.on("disconnect", (err) => {
1063
- log.logWarning("Slack socket disconnect", err ? String(err) : "");
1064
- });
1065
1022
  this.socketClient.on("error", (err) => {
1066
1023
  log.logWarning("Slack socket error", err ? String(err) : "");
1067
1024
  });
1068
- this.socketClient.on("unable_to_socket_mode_start", (err) => {
1069
- log.logWarning("Slack socket unable_to_start", err ? String(err) : "");
1025
+ let connectionLostAt;
1026
+ this.socketClient.on("close", () => {
1027
+ if (this.stopped || connectionLostAt !== undefined)
1028
+ return;
1029
+ connectionLostAt = Date.now();
1030
+ log.logWarning("Slack connection lost; reconnecting");
1031
+ });
1032
+ this.socketClient.on("connected", () => {
1033
+ if (connectionLostAt === undefined)
1034
+ return;
1035
+ const seconds = Math.round((Date.now() - connectionLostAt) / 1000);
1036
+ connectionLostAt = undefined;
1037
+ log.logInfo(`Slack reconnected after ${seconds}s`);
1070
1038
  });
1071
1039
  const on = (event, handle) => this.socketClient.on(event, (payload) => this.intake.run(() => handle(withLoggedAck(event, payload))));
1072
1040
  on("app_mention", (payload) => this.handleAppMention(payload));
@@ -1378,7 +1346,11 @@ export class SlackMessagingBot {
1378
1346
  return;
1379
1347
  }
1380
1348
  ack();
1381
- const sessionKey = action.value ?? action.action_id.replace("force_stop_", "").replace(/_/g, ":");
1349
+ const sessionKey = action.value;
1350
+ if (!sessionKey) {
1351
+ log.logWarning("[Force Stop] Ignored a button without a session key", action.action_id);
1352
+ return;
1353
+ }
1382
1354
  const userId = body.user?.id;
1383
1355
  const channelId = body.container?.channel_id || conversationIdOf(sessionKey);
1384
1356
  log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);