@geminixiang/mikan 1.0.0-beta.94 → 1.0.0-beta.96

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 (198) hide show
  1. package/CHANGELOG.md +432 -378
  2. package/README.md +31 -40
  3. package/dist/adapters/commands/login.js +1 -1
  4. package/dist/adapters/commands/login.js.map +1 -1
  5. package/dist/adapters/commands/registry.d.ts +1 -1
  6. package/dist/adapters/commands/registry.d.ts.map +1 -1
  7. package/dist/adapters/commands/registry.js +1 -2
  8. package/dist/adapters/commands/registry.js.map +1 -1
  9. package/dist/adapters/commands/types.d.ts +2 -4
  10. package/dist/adapters/commands/types.d.ts.map +1 -1
  11. package/dist/adapters/commands/types.js.map +1 -1
  12. package/dist/adapters/github/bot.js +1 -1
  13. package/dist/adapters/github/bot.js.map +1 -1
  14. package/dist/adapters/github/policy.d.ts +2 -9
  15. package/dist/adapters/github/policy.d.ts.map +1 -1
  16. package/dist/adapters/github/policy.js +18 -26
  17. package/dist/adapters/github/policy.js.map +1 -1
  18. package/dist/adapters/slack/bot.d.ts +2 -4
  19. package/dist/adapters/slack/bot.d.ts.map +1 -1
  20. package/dist/adapters/slack/bot.js +28 -56
  21. package/dist/adapters/slack/bot.js.map +1 -1
  22. package/dist/adapters/slack/socket-agent.d.ts +9 -0
  23. package/dist/adapters/slack/socket-agent.d.ts.map +1 -0
  24. package/dist/adapters/slack/socket-agent.js +17 -0
  25. package/dist/adapters/slack/socket-agent.js.map +1 -0
  26. package/dist/adapters/telegram/bot.d.ts +1 -0
  27. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  28. package/dist/adapters/telegram/bot.js +6 -1
  29. package/dist/adapters/telegram/bot.js.map +1 -1
  30. package/dist/adapters/telegram/types.d.ts +1 -0
  31. package/dist/adapters/telegram/types.d.ts.map +1 -1
  32. package/dist/adapters/telegram/types.js.map +1 -1
  33. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  34. package/dist/adapters/web/admin/portal.js +92 -173
  35. package/dist/adapters/web/admin/portal.js.map +1 -1
  36. package/dist/adapters/web/admin/types.d.ts +3 -8
  37. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  38. package/dist/adapters/web/admin/types.js.map +1 -1
  39. package/dist/adapters/web/server.d.ts +1 -1
  40. package/dist/adapters/web/server.d.ts.map +1 -1
  41. package/dist/adapters/web/server.js.map +1 -1
  42. package/dist/cli/arg-grammar.d.ts +1 -3
  43. package/dist/cli/arg-grammar.d.ts.map +1 -1
  44. package/dist/cli/arg-grammar.js +2 -20
  45. package/dist/cli/arg-grammar.js.map +1 -1
  46. package/dist/cli/boot.d.ts.map +1 -1
  47. package/dist/cli/boot.js +5 -11
  48. package/dist/cli/boot.js.map +1 -1
  49. package/dist/cli/migrate.d.ts.map +1 -1
  50. package/dist/cli/migrate.js +22 -7
  51. package/dist/cli/migrate.js.map +1 -1
  52. package/dist/cli/office.d.ts.map +1 -1
  53. package/dist/cli/office.js +3 -5
  54. package/dist/cli/office.js.map +1 -1
  55. package/dist/cli/onboard.js +18 -20
  56. package/dist/cli/onboard.js.map +1 -1
  57. package/dist/cli/types.d.ts +1 -2
  58. package/dist/cli/types.d.ts.map +1 -1
  59. package/dist/cli/types.js.map +1 -1
  60. package/dist/env-manifest.d.ts +2 -1
  61. package/dist/env-manifest.d.ts.map +1 -1
  62. package/dist/env-manifest.js +76 -47
  63. package/dist/env-manifest.js.map +1 -1
  64. package/dist/events/index.d.ts +5 -5
  65. package/dist/events/index.d.ts.map +1 -1
  66. package/dist/events/index.js +1 -7
  67. package/dist/events/index.js.map +1 -1
  68. package/dist/file-guards.d.ts +1 -0
  69. package/dist/file-guards.d.ts.map +1 -1
  70. package/dist/file-guards.js +4 -1
  71. package/dist/file-guards.js.map +1 -1
  72. package/dist/harness/execution-resolver.d.ts.map +1 -1
  73. package/dist/harness/execution-resolver.js +2 -8
  74. package/dist/harness/execution-resolver.js.map +1 -1
  75. package/dist/harness/http.d.ts +1 -2
  76. package/dist/harness/http.d.ts.map +1 -1
  77. package/dist/harness/http.js +3 -16
  78. package/dist/harness/http.js.map +1 -1
  79. package/dist/harness/jev.d.ts +2 -1
  80. package/dist/harness/jev.d.ts.map +1 -1
  81. package/dist/harness/jev.js.map +1 -1
  82. package/dist/harness/models.d.ts +2 -2
  83. package/dist/harness/models.d.ts.map +1 -1
  84. package/dist/harness/models.js +4 -6
  85. package/dist/harness/models.js.map +1 -1
  86. package/dist/harness/prompt.d.ts.map +1 -1
  87. package/dist/harness/prompt.js +0 -6
  88. package/dist/harness/prompt.js.map +1 -1
  89. package/dist/harness/runner.js +1 -2
  90. package/dist/harness/runner.js.map +1 -1
  91. package/dist/harness/session.d.ts +2 -9
  92. package/dist/harness/session.d.ts.map +1 -1
  93. package/dist/harness/session.js +3 -3
  94. package/dist/harness/session.js.map +1 -1
  95. package/dist/harness/tools/event.d.ts +0 -1
  96. package/dist/harness/tools/event.d.ts.map +1 -1
  97. package/dist/harness/tools/event.js +1 -7
  98. package/dist/harness/tools/event.js.map +1 -1
  99. package/dist/harness/types.d.ts +4 -4
  100. package/dist/harness/types.d.ts.map +1 -1
  101. package/dist/harness/types.js.map +1 -1
  102. package/dist/index.d.ts +8 -31
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +3 -15
  105. package/dist/index.js.map +1 -1
  106. package/dist/main.js +29 -41
  107. package/dist/main.js.map +1 -1
  108. package/dist/migrations/index.d.ts +0 -1
  109. package/dist/migrations/index.d.ts.map +1 -1
  110. package/dist/migrations/index.js +4 -10
  111. package/dist/migrations/index.js.map +1 -1
  112. package/dist/migrations/legacy-office-files.d.ts +3 -0
  113. package/dist/migrations/legacy-office-files.d.ts.map +1 -0
  114. package/dist/migrations/legacy-office-files.js +29 -0
  115. package/dist/migrations/legacy-office-files.js.map +1 -0
  116. package/dist/migrations/session-v3.d.ts +57 -0
  117. package/dist/migrations/session-v3.d.ts.map +1 -0
  118. package/dist/migrations/session-v3.js +93 -0
  119. package/dist/migrations/session-v3.js.map +1 -0
  120. package/dist/migrations/sessions-sqlite.d.ts.map +1 -1
  121. package/dist/migrations/sessions-sqlite.js +98 -54
  122. package/dist/migrations/sessions-sqlite.js.map +1 -1
  123. package/dist/observability/instrument.js +2 -5
  124. package/dist/observability/instrument.js.map +1 -1
  125. package/dist/observability/sentry.js +1 -1
  126. package/dist/observability/sentry.js.map +1 -1
  127. package/dist/office/projection.js +2 -2
  128. package/dist/office/projection.js.map +1 -1
  129. package/dist/runtime/conversation-runtime.js +9 -14
  130. package/dist/runtime/conversation-runtime.js.map +1 -1
  131. package/dist/runtime/types.d.ts +2 -7
  132. package/dist/runtime/types.d.ts.map +1 -1
  133. package/dist/runtime/types.js.map +1 -1
  134. package/dist/sandbox/identity.d.ts +0 -1
  135. package/dist/sandbox/identity.d.ts.map +1 -1
  136. package/dist/sandbox/identity.js +0 -3
  137. package/dist/sandbox/identity.js.map +1 -1
  138. package/dist/sandbox/registry.d.ts +1 -5
  139. package/dist/sandbox/registry.d.ts.map +1 -1
  140. package/dist/sandbox/registry.js +4 -13
  141. package/dist/sandbox/registry.js.map +1 -1
  142. package/dist/sandbox/types.d.ts +1 -5
  143. package/dist/sandbox/types.d.ts.map +1 -1
  144. package/dist/sandbox/types.js.map +1 -1
  145. package/dist/sessions/types.d.ts +1 -1
  146. package/dist/sessions/types.d.ts.map +1 -1
  147. package/dist/sessions/types.js.map +1 -1
  148. package/dist/settings/apply.d.ts +1 -1
  149. package/dist/settings/apply.d.ts.map +1 -1
  150. package/dist/settings/apply.js +4 -5
  151. package/dist/settings/apply.js.map +1 -1
  152. package/dist/settings/index.d.ts +59 -5
  153. package/dist/settings/index.d.ts.map +1 -1
  154. package/dist/settings/index.js +75 -54
  155. package/dist/settings/index.js.map +1 -1
  156. package/dist/types.d.ts +3 -28
  157. package/dist/types.d.ts.map +1 -1
  158. package/dist/types.js.map +1 -1
  159. package/dist/vault/index.d.ts.map +1 -1
  160. package/dist/vault/index.js +2 -15
  161. package/dist/vault/index.js.map +1 -1
  162. package/package.json +4 -17
  163. package/dist/cli/download.d.ts +0 -2
  164. package/dist/cli/download.d.ts.map +0 -1
  165. package/dist/cli/download.js +0 -84
  166. package/dist/cli/download.js.map +0 -1
  167. package/dist/harness/index.d.ts +0 -20
  168. package/dist/harness/index.d.ts.map +0 -1
  169. package/dist/harness/index.js +0 -14
  170. package/dist/harness/index.js.map +0 -1
  171. package/dist/migrations/dream-checkpoints.d.ts +0 -3
  172. package/dist/migrations/dream-checkpoints.d.ts.map +0 -1
  173. package/dist/migrations/dream-checkpoints.js +0 -23
  174. package/dist/migrations/dream-checkpoints.js.map +0 -1
  175. package/dist/migrations/private-office-dirs.d.ts +0 -3
  176. package/dist/migrations/private-office-dirs.d.ts.map +0 -1
  177. package/dist/migrations/private-office-dirs.js +0 -24
  178. package/dist/migrations/private-office-dirs.js.map +0 -1
  179. package/dist/migrations/session-files.d.ts +0 -28
  180. package/dist/migrations/session-files.d.ts.map +0 -1
  181. package/dist/migrations/session-files.js +0 -80
  182. package/dist/migrations/session-files.js.map +0 -1
  183. package/dist/migrations/session-v4.d.ts +0 -77
  184. package/dist/migrations/session-v4.d.ts.map +0 -1
  185. package/dist/migrations/session-v4.js +0 -177
  186. package/dist/migrations/session-v4.js.map +0 -1
  187. package/dist/migrations/sessions-v3.d.ts +0 -8
  188. package/dist/migrations/sessions-v3.d.ts.map +0 -1
  189. package/dist/migrations/sessions-v3.js +0 -350
  190. package/dist/migrations/sessions-v3.js.map +0 -1
  191. package/dist/sandbox/cloudflare.d.ts +0 -17
  192. package/dist/sandbox/cloudflare.d.ts.map +0 -1
  193. package/dist/sandbox/cloudflare.js +0 -142
  194. package/dist/sandbox/cloudflare.js.map +0 -1
  195. package/dist/sandbox/index.d.ts +0 -7
  196. package/dist/sandbox/index.d.ts.map +0 -1
  197. package/dist/sandbox/index.js +0 -6
  198. package/dist/sandbox/index.js.map +0 -1
@@ -10,50 +10,42 @@ const PERMISSION_RANK = {
10
10
  };
11
11
  const TRIGGER_PERMISSIONS = ["write", "maintain", "admin"];
12
12
  const REPO_PATTERN = /^[\w.-]+\/(?:\*|[\w.-]+)$/;
13
- function splitList(value) {
14
- return (value ?? "")
15
- .split(",")
16
- .map((entry) => entry.trim().toLowerCase())
17
- .filter(Boolean);
13
+ function normalizeList(values) {
14
+ return (values ?? []).map((entry) => entry.trim().toLowerCase()).filter(Boolean);
18
15
  }
19
- function pickAll(name, allowed, entries) {
16
+ function pickAll(key, allowed, entries) {
20
17
  const unknown = entries.filter((entry) => !allowed.includes(entry));
21
18
  if (unknown.length > 0) {
22
- throw new Error(`${name} has unknown value(s) ${unknown.join(", ")}; use ${allowed.join(", ")}`);
19
+ throw new Error(`github.${key} has unknown value(s) ${unknown.join(", ")}; use ${allowed.join(", ")}`);
23
20
  }
24
21
  return new Set(entries);
25
22
  }
26
- function parseBoolean(name, value) {
27
- const normalized = (value ?? "false").trim().toLowerCase();
28
- if (normalized === "true")
29
- return true;
30
- if (normalized === "false")
31
- return false;
32
- throw new Error(`${name} must be true or false`);
33
- }
34
- export function parseGithubPolicy(env) {
35
- const repos = splitList(env.repos);
23
+ export function parseGithubPolicy(settings) {
24
+ if (settings?.repos === undefined) {
25
+ throw new Error("GitHub is configured but has no repositories. Set github.repos in ~/.mikan/settings.json to owner/repo or owner/* entries.");
26
+ }
27
+ const repos = normalizeList(settings.repos);
36
28
  if (repos.length === 0) {
37
- throw new Error("GITHUB_REPOS must list at least one owner/repo or owner/*");
29
+ throw new Error("github.repos must list at least one owner/repo or owner/*");
38
30
  }
39
31
  const invalidRepos = repos.filter((entry) => !REPO_PATTERN.test(entry));
40
32
  if (invalidRepos.length > 0) {
41
- throw new Error(`GITHUB_REPOS has invalid entries ${invalidRepos.join(", ")}; use owner/repo or owner/*`);
33
+ throw new Error(`github.repos has invalid entries ${invalidRepos.join(", ")}; use owner/repo or owner/*`);
42
34
  }
43
- const minPermission = (env.minPermission ?? "write").trim().toLowerCase();
35
+ const minPermission = (settings.minPermission ?? "write").trim().toLowerCase();
44
36
  if (!TRIGGER_PERMISSIONS.includes(minPermission)) {
45
- throw new Error(`GITHUB_MIN_PERMISSION must be one of ${TRIGGER_PERMISSIONS.join(", ")}`);
37
+ throw new Error(`github.minPermission must be one of ${TRIGGER_PERMISSIONS.join(", ")}`);
46
38
  }
47
- const users = splitList(env.users);
39
+ const users = normalizeList(settings.users);
48
40
  return {
49
41
  repos,
50
- publicRepos: parseBoolean("GITHUB_PUBLIC_REPOS", env.publicRepos),
42
+ publicRepos: settings.publicRepos ?? false,
51
43
  users: users.length > 0 ? users : null,
52
44
  minPermission: minPermission,
53
- triggers: env.triggers === undefined
45
+ triggers: settings.triggers === undefined
54
46
  ? new Set(GITHUB_TRIGGERS)
55
- : pickAll("GITHUB_TRIGGERS", GITHUB_TRIGGERS, splitList(env.triggers)),
56
- capabilities: pickAll("GITHUB_CAPABILITIES", GITHUB_CAPABILITIES, splitList(env.capabilities)),
47
+ : pickAll("triggers", GITHUB_TRIGGERS, normalizeList(settings.triggers)),
48
+ capabilities: pickAll("capabilities", GITHUB_CAPABILITIES, normalizeList(settings.capabilities)),
57
49
  };
58
50
  }
59
51
  export function repoIsAllowed(policy, repo) {
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n GithubCapability,\n GithubPolicy,\n GithubRepoRef,\n GithubTrigger,\n GithubTriggerPermission,\n} from \"./types.js\";\n\nconst GITHUB_TRIGGERS: readonly GithubTrigger[] = [\"mention\", \"assign\", \"review\", \"followup\"];\n\nconst GITHUB_CAPABILITIES: readonly GithubCapability[] = [\"triage\", \"push\"];\n\nconst PERMISSION_RANK = {\n none: 0,\n read: 1,\n triage: 2,\n write: 3,\n maintain: 4,\n admin: 5,\n};\n\nconst TRIGGER_PERMISSIONS: readonly GithubTriggerPermission[] = [\"write\", \"maintain\", \"admin\"];\n\nconst REPO_PATTERN = /^[\\w.-]+\\/(?:\\*|[\\w.-]+)$/;\n\nexport interface GithubPolicyEnv {\n repos: string | undefined;\n publicRepos: string | undefined;\n users: string | undefined;\n minPermission: string | undefined;\n triggers: string | undefined;\n capabilities: string | undefined;\n}\n\nfunction splitList(value: string | undefined): string[] {\n return (value ?? \"\")\n .split(\",\")\n .map((entry) => entry.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction pickAll<T extends string>(name: string, allowed: readonly T[], entries: string[]): Set<T> {\n const unknown = entries.filter((entry) => !(allowed as readonly string[]).includes(entry));\n if (unknown.length > 0) {\n throw new Error(\n `${name} has unknown value(s) ${unknown.join(\", \")}; use ${allowed.join(\", \")}`,\n );\n }\n return new Set(entries as T[]);\n}\n\nfunction parseBoolean(name: string, value: string | undefined): boolean {\n const normalized = (value ?? \"false\").trim().toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n throw new Error(`${name} must be true or false`);\n}\n\nexport function parseGithubPolicy(env: GithubPolicyEnv): GithubPolicy {\n const repos = splitList(env.repos);\n if (repos.length === 0) {\n throw new Error(\"GITHUB_REPOS must list at least one owner/repo or owner/*\");\n }\n const invalidRepos = repos.filter((entry) => !REPO_PATTERN.test(entry));\n if (invalidRepos.length > 0) {\n throw new Error(\n `GITHUB_REPOS has invalid entries ${invalidRepos.join(\", \")}; use owner/repo or owner/*`,\n );\n }\n const minPermission = (env.minPermission ?? \"write\").trim().toLowerCase();\n if (!(TRIGGER_PERMISSIONS as readonly string[]).includes(minPermission)) {\n throw new Error(`GITHUB_MIN_PERMISSION must be one of ${TRIGGER_PERMISSIONS.join(\", \")}`);\n }\n const users = splitList(env.users);\n return {\n repos,\n publicRepos: parseBoolean(\"GITHUB_PUBLIC_REPOS\", env.publicRepos),\n users: users.length > 0 ? users : null,\n minPermission: minPermission as GithubTriggerPermission,\n triggers:\n env.triggers === undefined\n ? new Set(GITHUB_TRIGGERS)\n : pickAll(\"GITHUB_TRIGGERS\", GITHUB_TRIGGERS, splitList(env.triggers)),\n capabilities: pickAll(\"GITHUB_CAPABILITIES\", GITHUB_CAPABILITIES, splitList(env.capabilities)),\n };\n}\n\nexport function repoIsAllowed(\n policy: GithubPolicy,\n repo: GithubRepoRef & { private: boolean },\n): boolean {\n if (!repo.private && !policy.publicRepos) return false;\n const owner = repo.owner.toLowerCase();\n const name = repo.repo.toLowerCase();\n return policy.repos.some((entry) => {\n const [entryOwner, entryName] = entry.split(\"/\");\n return entryOwner === owner && (entryName === \"*\" || entryName === name);\n });\n}\n\nexport function userIsAllowed(policy: GithubPolicy, login: string): boolean {\n return policy.users === null || policy.users.includes(login.toLowerCase());\n}\n\nfunction rankOfPermission(name: string): number {\n return PERMISSION_RANK[name as keyof typeof PERMISSION_RANK] ?? 0;\n}\n\nexport function permissionMeets(\n policy: GithubPolicy,\n role: { permission: string; role_name?: string },\n): boolean {\n const rank = Math.max(rankOfPermission(role.role_name ?? \"\"), rankOfPermission(role.permission));\n return rank >= PERMISSION_RANK[policy.minPermission];\n}\n"]}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n GithubCapability,\n GithubPolicy,\n GithubRepoRef,\n GithubTrigger,\n GithubTriggerPermission,\n} from \"./types.js\";\nimport type { GithubSettings } from \"../../settings/index.js\";\n\nconst GITHUB_TRIGGERS: readonly GithubTrigger[] = [\"mention\", \"assign\", \"review\", \"followup\"];\n\nconst GITHUB_CAPABILITIES: readonly GithubCapability[] = [\"triage\", \"push\"];\n\nconst PERMISSION_RANK = {\n none: 0,\n read: 1,\n triage: 2,\n write: 3,\n maintain: 4,\n admin: 5,\n};\n\nconst TRIGGER_PERMISSIONS: readonly GithubTriggerPermission[] = [\"write\", \"maintain\", \"admin\"];\n\nconst REPO_PATTERN = /^[\\w.-]+\\/(?:\\*|[\\w.-]+)$/;\n\nfunction normalizeList(values: readonly string[] | undefined): string[] {\n return (values ?? []).map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction pickAll<T extends string>(key: string, allowed: readonly T[], entries: string[]): Set<T> {\n const unknown = entries.filter((entry) => !(allowed as readonly string[]).includes(entry));\n if (unknown.length > 0) {\n throw new Error(\n `github.${key} has unknown value(s) ${unknown.join(\", \")}; use ${allowed.join(\", \")}`,\n );\n }\n return new Set(entries as T[]);\n}\n\nexport function parseGithubPolicy(settings: GithubSettings | undefined): GithubPolicy {\n if (settings?.repos === undefined) {\n throw new Error(\n \"GitHub is configured but has no repositories. Set github.repos in ~/.mikan/settings.json to owner/repo or owner/* entries.\",\n );\n }\n const repos = normalizeList(settings.repos);\n if (repos.length === 0) {\n throw new Error(\"github.repos must list at least one owner/repo or owner/*\");\n }\n const invalidRepos = repos.filter((entry) => !REPO_PATTERN.test(entry));\n if (invalidRepos.length > 0) {\n throw new Error(\n `github.repos has invalid entries ${invalidRepos.join(\", \")}; use owner/repo or owner/*`,\n );\n }\n const minPermission = (settings.minPermission ?? \"write\").trim().toLowerCase();\n if (!(TRIGGER_PERMISSIONS as readonly string[]).includes(minPermission)) {\n throw new Error(`github.minPermission must be one of ${TRIGGER_PERMISSIONS.join(\", \")}`);\n }\n const users = normalizeList(settings.users);\n return {\n repos,\n publicRepos: settings.publicRepos ?? false,\n users: users.length > 0 ? users : null,\n minPermission: minPermission as GithubTriggerPermission,\n triggers:\n settings.triggers === undefined\n ? new Set(GITHUB_TRIGGERS)\n : pickAll(\"triggers\", GITHUB_TRIGGERS, normalizeList(settings.triggers)),\n capabilities: pickAll(\n \"capabilities\",\n GITHUB_CAPABILITIES,\n normalizeList(settings.capabilities),\n ),\n };\n}\n\nexport function repoIsAllowed(\n policy: GithubPolicy,\n repo: GithubRepoRef & { private: boolean },\n): boolean {\n if (!repo.private && !policy.publicRepos) return false;\n const owner = repo.owner.toLowerCase();\n const name = repo.repo.toLowerCase();\n return policy.repos.some((entry) => {\n const [entryOwner, entryName] = entry.split(\"/\");\n return entryOwner === owner && (entryName === \"*\" || entryName === name);\n });\n}\n\nexport function userIsAllowed(policy: GithubPolicy, login: string): boolean {\n return policy.users === null || policy.users.includes(login.toLowerCase());\n}\n\nfunction rankOfPermission(name: string): number {\n return PERMISSION_RANK[name as keyof typeof PERMISSION_RANK] ?? 0;\n}\n\nexport function permissionMeets(\n policy: GithubPolicy,\n role: { permission: string; role_name?: string },\n): boolean {\n const rank = Math.max(rankOfPermission(role.role_name ?? \"\"), rankOfPermission(role.permission));\n return rank >= PERMISSION_RANK[policy.minPermission];\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ConversationLogMessage, RunAnswer } from "../../types.js";
2
- import type { MessagingBot, ConversationEvent, MessagingEventHandler, MessagingInfo, PlatformHistoryMessage, PlatformHistoryOptions, PlatformUserInfo } from "../../types.js";
2
+ import type { MessagingBot, ConversationEvent, MessagingEventHandler, MessagingInfo } from "../../types.js";
3
3
  import type { EventScheduler } from "../../events/scheduler.js";
4
4
  import type { SlackChannel, SlackMessagingBotOptions, SlackUser, SuggestedPrompt } from "./types.js";
5
5
  import type { SlackPersonaIdentity } from "./persona.js";
@@ -54,9 +54,7 @@ export declare class SlackMessagingBot implements MessagingBot {
54
54
  postPrivateDiagnostic(conversationId: string, userId: string, text: string, options?: {
55
55
  style?: "muted" | "error";
56
56
  }): Promise<void>;
57
- openDirectConversation(userId: string): Promise<string>;
58
- fetchHistory(channel: string, options?: PlatformHistoryOptions): Promise<PlatformHistoryMessage[]>;
59
- listUsers(): Promise<PlatformUserInfo[]>;
57
+ private openDirectConversation;
60
58
  updateMessage(channel: string, ts: string, text: string): Promise<void>;
61
59
  tryReserveStreamStart(): boolean;
62
60
  startMessageStream(channel: string, text: string, threadTs?: string, recipientUserId?: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
@@ -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}`);