@geminixiang/mikan 1.0.0-beta.95 → 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 (137) hide show
  1. package/CHANGELOG.md +427 -388
  2. package/README.md +31 -40
  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
package/README.md CHANGED
@@ -9,8 +9,7 @@
9
9
 
10
10
  Self-hosted AI coding agent for organizations: every Slack channel and DM gets its own sandboxed workspace, credentials, and memory. Also speaks Telegram, Discord, and GitHub.
11
11
 
12
- > [!WARNING]
13
- > **Pre-1.0 status** — the overall framework stabilizes at 1.0.0. Until then, releases may change settings and on-disk data formats without migrations: upgrading between pre-1.0 versions can require resetting or manually adjusting existing state and workspace data.
12
+ Upgrading from 0.5.3? Follow [Upgrading from 0.5.3](src/content/docs/deployment.mdx#upgrading-from-053); `mikan migrate` converts the state in place.
14
13
 
15
14
  ## Architecture
16
15
 
@@ -24,7 +23,7 @@ mikan keeps the chat record, agent session, and execution runtime separate:
24
23
  - **Chat / conversation data** is the platform-facing record: `log.jsonl`, attachments, and conversation files.
25
24
  - **Session orchestration** turns platform events into agent runs, handles top-level/thread scopes, and persists structured context in host-only session files under the State dir.
26
25
  - **mikan agent harness** (`src/harness/`, built on pi-agent-core and pi-ai) owns run preparation, authorized prompts/tools, response presentation, and native Pi session integration. Pi handles the model/tool loop, persistence, compaction, retries, and cancellation.
27
- - **Sandbox runtime** is where tool commands execute: host, Docker container/image, or the experimental Cloudflare bridge.
26
+ - **Sandbox runtime** is where tool commands execute: host, or a Docker container or image.
28
27
  - **Vault** provides runtime credentials as env vars and mounted secret files.
29
28
 
30
29
  ## Features
@@ -32,12 +31,12 @@ mikan keeps the chat record, agent session, and execution runtime separate:
32
31
  - **Multi-platform** — Slack, Telegram, Discord, and GitHub adapters
33
32
  - **Concurrent conversations** — Slack threads, Discord replies/threads, and Telegram reply chains run as independent sessions
34
33
  - **Conversation offices** — one office directory and one sandbox runtime per conversation, with public/private visibility derived from the platform conversation type
35
- - **Sandbox execution** — host, shared container, per-conversation managed container, or Cloudflare bridge (experimental)
36
- - **Credential vaults** — `/login` stores credentials under `--state-dir` and injects env into sandbox runs
34
+ - **Sandbox execution** — host, shared container, or per-conversation managed container
35
+ - **Credential vaults** — `/login` stores credentials under `~/.mikan` and injects env into sandbox runs
37
36
  - **Web session viewer** — read-only web view of the current session via `session` / `/session`
38
37
  - **Persistent memory** — workspace-level and per-office `MEMORY.md`
39
38
  - **Skills** — drop CLI tools into `skills/`
40
- - **Events** — schedule one-shot or recurring tasks via JSON files
39
+ - **Events** — the agent schedules one-shot or recurring runs with its `event` tool
41
40
  - **Multi-provider** — any provider/model supported by `pi-ai`
42
41
 
43
42
  ## Requirements
@@ -63,17 +62,14 @@ Run mikan under [PM2](https://pm2.keymetrics.io/) so it stays up, restarts after
63
62
  ```bash
64
63
  npm i -g @geminixiang/mikan pm2
65
64
 
66
- # One-time setup: create the state directory and settings
67
- mikan --onboard --state-dir=~/.mikan
68
-
69
- # Secrets live in ~/.mikan/mikan.env (0600), outside any repo tree
70
- curl -o ~/.mikan/mikan.env https://raw.githubusercontent.com/geminixiang/mikan/main/deploy/pm2/mikan.env.example
71
- chmod 600 ~/.mikan/mikan.env # then fill in your tokens
65
+ # One-time setup: platform tokens, LLM provider, and sandbox mode,
66
+ # written to ~/.mikan/settings.json and ~/.mikan/mikan.env (0600)
67
+ mikan onboard
72
68
 
73
69
  # Pull the sandbox image the default deployment runs tools in
74
70
  docker pull ghcr.io/geminixiang/mikan-sandbox:latest
75
71
 
76
- # Grab the maintained ecosystem file (supervision only), edit `args`
72
+ # Grab the maintained ecosystem file (supervision only)
77
73
  curl -O https://raw.githubusercontent.com/geminixiang/mikan/main/deploy/pm2/ecosystem.config.cjs
78
74
 
79
75
  pm2 start ecosystem.config.cjs
@@ -81,13 +77,13 @@ pm2 save
81
77
  pm2 startup # run the printed command to enable boot autostart
82
78
  ```
83
79
 
84
- Each file has one job: `settings.json` holds behavior (model, sandbox limits, reply modes — the Admin surface), `~/.mikan/mikan.env` holds secrets and platform tokens, and `ecosystem.config.cjs` holds process supervision only. In `ecosystem.config.cjs`, point `args` at your state dir, sandbox mode, and working directory (`mikan --help` documents the flags):
80
+ Each file has one job: `settings.json` holds behavior (model, sandbox limits, reply modes — the Admin surface), `~/.mikan/mikan.env` holds secrets and platform tokens, and `ecosystem.config.cjs` holds process supervision only. mikan keeps all of them in `~/.mikan`. In `ecosystem.config.cjs`, `args` holds the sandbox mode and an optional working directory (`mikan --help` documents the flags):
85
81
 
86
82
  ```js
87
- args: "--state-dir=/srv/mikan/state --sandbox=image:ghcr.io/geminixiang/mikan-sandbox:latest /srv/mikan/workspace",
83
+ args: "--sandbox=image:ghcr.io/geminixiang/mikan-sandbox:latest",
88
84
  ```
89
85
 
90
- Set the platform tokens you need in `~/.mikan/mikan.env`; you can run multiple platforms at once. `mikan env` prints the full inventory and what is currently set:
86
+ To add a platform later, set its tokens in `~/.mikan/mikan.env`; you can run multiple platforms at once. `mikan env` prints the full inventory and what is currently set:
91
87
 
92
88
  ```bash
93
89
  SLACK_APP_TOKEN=xapp-...
@@ -96,18 +92,19 @@ TELEGRAM_BOT_TOKEN=123456:ABC-...
96
92
  DISCORD_BOT_TOKEN=MTI...
97
93
  GITHUB_AGENT_TOKEN=github_pat_...
98
94
  GITHUB_WEBHOOK_SECRET=...
99
- GITHUB_REPOS=acme/*
100
95
  ```
101
96
 
97
+ GitHub also needs the repositories it answers in, as `"github": { "repos": ["acme/*"] }` in `~/.mikan/settings.json`.
98
+
102
99
  Tail logs with `pm2 logs mikan`; upgrade with `npm i -g @geminixiang/mikan`, check `mikan migrate --sandbox=<mode> --dry-run` for pending State migrations, then `pm2 reload mikan`. See [the deployment guide](src/content/docs/deployment.mdx) for sandbox images, graceful shutdown, and the health endpoint.
103
100
 
104
101
  For a one-off foreground run, the same CLI works directly:
105
102
 
106
103
  ```bash
107
- mikan [--state-dir=~/.mikan] [--sandbox=<mode>] [<working-directory>]
104
+ mikan [--sandbox=<mode>] [<working-directory>]
108
105
  ```
109
106
 
110
- The working directory is optional: it defaults to `<state-dir>/workspace` (so `~/.mikan/workspace` with the default state dir) and is created on first run.
107
+ The working directory is optional: it defaults to `~/.mikan/workspace` and is created on first run.
111
108
 
112
109
  ## Platforms
113
110
 
@@ -120,18 +117,17 @@ Slack threads, Discord replies/threads, and Telegram reply chains are mapped to
120
117
 
121
118
  ## Sandbox
122
119
 
123
- | Mode | Description |
124
- | ------------------------- | ----------------------------------------------------------------------------- |
125
- | `host` (default) | Run on host; no vault env injection |
126
- | `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
127
- | `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
128
- | `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
120
+ | Mode | Description |
121
+ | ------------------ | ----------------------------------------------------------------------------- |
122
+ | `host` (default) | Run on host; no vault env injection |
123
+ | `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
124
+ | `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
129
125
 
130
126
  Each office is **public** or **private**, following the Slack conversation type: public channels are public — every other office can read them (read-only, under `/workspace/public/`) and they may write the shared `MEMORY.md` and `skills/`. Private channels, DMs, group DMs, and externally shared channels are private — visible only to themselves, reading shared knowledge and public offices without writing back. Unknown conversation kinds are private. The admin portal or `/pi-sandbox visibility private` can narrow a public channel; nothing can widen beyond Slack. Visibility governs data access only; execution isolation is unaffected.
131
127
 
132
- Only `image:*` enforces visibility. `host`, `container:*`, and `cloudflare:*` share one filesystem and are trusted deployments; a private office there is served with a logged warning.
128
+ Only `image:*` enforces visibility. `host` and `container:*` share one filesystem and are trusted deployments; a private office there is served with a logged warning.
133
129
 
134
- For routing, mounts, vault behavior, managed container details, and Cloudflare notes, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
130
+ For routing, mounts, vault behavior, and managed container details, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
135
131
 
136
132
  ## Chat commands
137
133
 
@@ -142,7 +138,7 @@ For routing, mounts, vault behavior, managed container details, and Cloudflare n
142
138
  | `/new` / `/pi-new` | Reset the current session |
143
139
  | `/model` / `/pi-model provider/model[:thinking]` | Switch the LLM for the current conversation |
144
140
  | `/sandbox` / `/pi-sandbox [boost\|visibility …]` | Show sandbox status, boost limits, or narrow office visibility |
145
- | `/pi-auto-reply <on\|off>` | Toggle mention-free replies for the current Slack channel |
141
+ | `/pi-auto-reply <on\|off\|jev>` | Set mention-free replies for the current Slack channel |
146
142
  | `/admin` / `/pi-admin` | Open the admin portal |
147
143
  | `stop` / `/stop` | Stop the current run (works on every platform) |
148
144
 
@@ -150,7 +146,7 @@ For routing, mounts, vault behavior, managed container details, and Cloudflare n
150
146
 
151
147
  ## Configuration
152
148
 
153
- mikan reads global settings from `<state-dir>/settings.json`; host-only per-conversation overrides live at `<state-dir>/conversations/<office-key>/settings.json`. Legacy workspace settings are migrated once, then ignored.
149
+ mikan reads global settings from `~/.mikan/settings.json`; host-only per-conversation overrides live at `~/.mikan/conversations/<office-key>/settings.json`. Legacy workspace settings are migrated once, then ignored.
154
150
 
155
151
  ```json
156
152
  {
@@ -167,19 +163,22 @@ See [src/content/docs/configuration.md](src/content/docs/configuration.md) for a
167
163
  ## Data layout
168
164
 
169
165
  ```text
170
- <state-dir>/
166
+ ~/.mikan/
171
167
  ├── settings.json
168
+ ├── mikan.env
169
+ ├── models.json
170
+ ├── migrations.json
172
171
  ├── office-registry.json
173
172
  ├── conversations/
174
173
  │ └── <office-key>/
175
174
  │ ├── settings.json
176
- │ └── sessions/
175
+ │ ├── sessions.db
176
+ │ └── events/
177
177
  └── vaults/
178
178
 
179
179
  <working-directory>/
180
180
  ├── MEMORY.md
181
181
  ├── skills/
182
- ├── events/
183
182
  ├── agents/
184
183
  └── <office-key>/
185
184
  ├── MEMORY.md
@@ -201,12 +200,6 @@ Office directories are named by office key (`v1-<platform>-<readable-id>-<hash>`
201
200
  - [Sandbox](src/content/docs/sandbox.mdx)
202
201
  - [Embedding mikan](deploy/examples/embedder/README.md) — build your own agent on the published package interface
203
202
 
204
- ## Slack: Download channel history
205
-
206
- ```bash
207
- mikan --download C0123456789
208
- ```
209
-
210
203
  ## Development
211
204
 
212
205
  ```bash
@@ -226,5 +219,3 @@ PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, commit sty
226
219
  ## License
227
220
 
228
221
  MIT — see [LICENSE](LICENSE).
229
-
230
- Slack auto-reply uses the conversation's `auto-reply` / `auto-reply.disabled` marker files. File contents are ignored: only the on/off marker name matters; rules and `llm.autoReply` judge-model settings remain retired.
@@ -205,7 +205,7 @@ export class GithubMessagingBot {
205
205
  if (trigger === null || !policy.triggers.has(trigger))
206
206
  return;
207
207
  if (!userIsAllowed(policy, activity.sender.login)) {
208
- log.logInfo(`GitHub: ignoring ${conversationId} from ${activity.sender.login} (not in GITHUB_USERS)`);
208
+ log.logInfo(`GitHub: ignoring ${conversationId} from ${activity.sender.login} (not in github.users)`);
209
209
  return;
210
210
  }
211
211
  if (!(await this.hasTriggerPermission(ref, activity.sender.login))) {
@@ -1 +1 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationLogMessage, RunAnswer } from \"../../types.js\";\nimport { appendBotResponseLog, appendOfficeLog } from \"../../office/log.js\";\nimport { existsSync } from \"node:fs\";\nimport type {\n MessagingBot,\n MessagingEventHandler,\n MessagingInfo,\n ConversationEvent,\n} from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { MessagingEventQueue, splitText } from \"../shared.js\";\nimport { matchMagicWord, processMessageIntake } from \"../intake.js\";\nimport { readGithubActivity } from \"./activity.js\";\nimport { GithubClient, GITHUB_MAX_COMMENT_LENGTH, githubRetry } from \"./client.js\";\nimport { createGithubAdapters } from \"./context.js\";\nimport { GithubOps } from \"./github-ops.js\";\nimport { permissionMeets, repoIsAllowed, userIsAllowed } from \"./policy.js\";\nimport {\n buildGithubConversationId,\n createConversationEvent,\n createOfficeAddress,\n parseGithubConversationId,\n} from \"../../office/index.js\";\nimport type { Office, GithubConversationRef } from \"../../office/types.js\";\nimport { GITHUB_ISSUE_BODY_TS, githubReviewCommentTs, parseReviewCommentTs } from \"./ids.js\";\nimport type {\n GithubActivity,\n GithubAgentIdentity,\n GithubApi,\n GithubBotConfig,\n GithubCapability,\n GithubEvent,\n GithubIssue,\n GithubReactionContent,\n GithubReviewAnchor,\n GithubTrigger,\n GithubWebhookDelivery,\n} from \"./types.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;\n\nconst BODY_TRIGGER_WINDOW_MS = 10 * 60 * 1000;\n\nexport const formatGithubContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nconst GITHUB_REACTIONS: Record<string, GithubReactionContent> = {\n \"+1\": \"+1\",\n thumbsup: \"+1\",\n \"-1\": \"-1\",\n thumbsdown: \"-1\",\n laugh: \"laugh\",\n smile: \"laugh\",\n confused: \"confused\",\n heart: \"heart\",\n hooray: \"hooray\",\n tada: \"hooray\",\n rocket: \"rocket\",\n eyes: \"eyes\",\n saluting_face: \"eyes\",\n};\n\ninterface IncomingItem {\n ref: GithubConversationRef;\n ts: string;\n user: string;\n text: string;\n createdAt: string;\n addressed: boolean;\n review?: GithubReviewAnchor;\n}\n\nconst MAX_DIFF_HUNK_CHARS = 1500;\nconst MAX_THREAD_TURNS = 10;\nconst MAX_THREAD_TURN_CHARS = 500;\n\nfunction bodyTriggerNote(activity: GithubActivity): string | null {\n switch (activity.kind) {\n case \"assigned\":\n return `[Assigned to you by @${activity.sender.login}]`;\n case \"review_requested\":\n return `[Review requested by @${activity.sender.login}]`;\n case \"opened\":\n case \"comment\":\n case \"review_comment\":\n return null;\n default:\n return activity.kind satisfies never;\n }\n}\n\nexport class GithubMessagingBot implements MessagingBot {\n private readonly client: GithubApi;\n private readonly handler: MessagingEventHandler;\n private readonly config: GithubBotConfig;\n readonly ops: GithubOps;\n private identity: GithubAgentIdentity | null = null;\n private queues = new Map<string, MessagingEventQueue>();\n private permissionCache = new Map<string, { allowed: boolean; expiresAt: number }>();\n private bodyTriggers = new Map<string, number>();\n private stopped = true;\n\n constructor(handler: MessagingEventHandler, config: GithubBotConfig, client?: GithubApi) {\n this.handler = handler;\n this.config = config;\n this.client = client ?? new GithubClient({ token: config.token });\n this.ops = new GithubOps(this.client);\n }\n\n get capabilities(): ReadonlySet<GithubCapability> {\n return this.config.policy.capabilities;\n }\n\n get agentIdentity(): GithubAgentIdentity | undefined {\n return this.identity ?? undefined;\n }\n\n async start(): Promise<void> {\n const user = await this.client.getAuthenticatedUser();\n this.identity = {\n login: user.login,\n email: `${user.id}+${user.login}@users.noreply.github.com`,\n };\n this.stopped = false;\n log.logConnected(\"GitHub\");\n log.logInfo(\n `GitHub bot started as @${user.login}, answering in ${this.config.policy.repos.join(\", \")}`,\n );\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n const ref = parseGithubConversationId(channel);\n const parts = splitText(text, GITHUB_MAX_COMMENT_LENGTH, formatGithubContinuation);\n const firstId = await this.postComment(ref, parts[0] ?? text);\n for (const part of parts.slice(1)) {\n await this.postComment(ref, part);\n }\n return String(firstId);\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n const ref = parseGithubConversationId(channel);\n await githubRetry(() => this.client.updateIssueComment(ref.owner, ref.repo, Number(ts), text));\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n const ref = parseGithubConversationId(channel);\n const content = GITHUB_REACTIONS[emoji.replace(/^:|:$/g, \"\")];\n if (!content) {\n throw new Error(\n `GitHub does not support reaction '${emoji}' (supported: ${Object.keys(GITHUB_REACTIONS).join(\", \")})`,\n );\n }\n const reviewCommentId = parseReviewCommentTs(messageTs);\n await githubRetry(() => {\n if (messageTs === GITHUB_ISSUE_BODY_TS) {\n return this.client.createIssueReaction(ref.owner, ref.repo, ref.number, content);\n }\n if (reviewCommentId !== null) {\n return this.client.createReviewCommentReaction(\n ref.owner,\n ref.repo,\n reviewCommentId,\n content,\n );\n }\n return this.client.createCommentReaction(ref.owner, ref.repo, Number(messageTs), content);\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n return this.getQueue(event.address.conversationId).offerEvent(event, () => {\n const context = createGithubAdapters(event as GithubEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"github\",\n trustModel: \"membership\",\n formattingGuide:\n \"## GitHub Formatting (GitHub Flavored Markdown)\\n\" +\n \"Standard Markdown plus tables, task lists, fenced code blocks, and ```suggestion blocks.\\n\" +\n \"Reference issues/PRs as #123 and users as @login (mentions notify people — use sparingly).\",\n channels: [],\n users: [],\n };\n }\n\n async postComment(ref: GithubConversationRef, text: string): Promise<number> {\n const comment = await githubRetry(() =>\n this.client.createIssueComment(ref.owner, ref.repo, ref.number, text),\n );\n return comment.id;\n }\n\n async deleteComment(ref: GithubConversationRef, commentId: number): Promise<void> {\n await githubRetry(() => this.client.deleteIssueComment(ref.owner, ref.repo, commentId));\n }\n\n logToFile(conversationId: string, entry: ConversationLogMessage): void {\n appendOfficeLog(this.office(conversationId), entry);\n }\n\n logBotResponse(\n conversationId: string,\n text: string,\n ts: string,\n threadTs?: string,\n { answer }: { answer?: RunAnswer } = {},\n ): void {\n appendBotResponseLog(this.office(conversationId), { text, ts, threadTs, answer });\n }\n\n private getQueue(conversationId: string): MessagingEventQueue {\n let queue = this.queues.get(conversationId);\n if (!queue) {\n queue = new MessagingEventQueue(\"GitHub\");\n this.queues.set(conversationId, queue);\n }\n return queue;\n }\n\n async receive(delivery: GithubWebhookDelivery): Promise<void> {\n if (this.stopped || !this.identity) return;\n const activity = readGithubActivity(delivery);\n if (!activity) return;\n try {\n await this.handleActivity(activity);\n } catch (err) {\n log.logWarning(\n `GitHub: failed to handle ${delivery.event} for ${activity.repo.owner}/${activity.repo.repo}#${activity.number}`,\n errorMessage(err),\n );\n }\n }\n\n private isAgent(login: string): boolean {\n return login.toLowerCase() === this.identity?.login.toLowerCase();\n }\n\n private triggerOf(activity: GithubActivity, conversationId: string): GithubTrigger | null {\n switch (activity.kind) {\n case \"assigned\":\n return activity.target !== null && this.isAgent(activity.target) ? \"assign\" : null;\n case \"review_requested\":\n return activity.target !== null && this.isAgent(activity.target) ? \"review\" : null;\n case \"opened\":\n return this.isMentioned(activity.text) ? \"mention\" : null;\n case \"comment\":\n case \"review_comment\":\n if (this.isMentioned(activity.text)) return \"mention\";\n return this.isParticipating(conversationId) ? \"followup\" : null;\n default:\n return activity.kind satisfies never;\n }\n }\n\n private claimBodyTrigger(conversationId: string): boolean {\n const now = Date.now();\n for (const [key, expiresAt] of this.bodyTriggers) {\n if (expiresAt <= now) this.bodyTriggers.delete(key);\n }\n if (this.bodyTriggers.has(conversationId)) return false;\n this.bodyTriggers.set(conversationId, now + BODY_TRIGGER_WINDOW_MS);\n return true;\n }\n\n private async handleActivity(activity: GithubActivity): Promise<void> {\n const { policy } = this.config;\n if (activity.sender.isBot || this.isAgent(activity.sender.login)) return;\n if (!repoIsAllowed(policy, activity.repo)) return;\n const ref = { owner: activity.repo.owner, repo: activity.repo.repo, number: activity.number };\n const conversationId = buildGithubConversationId(ref);\n const trigger = this.triggerOf(activity, conversationId);\n if (trigger === null || !policy.triggers.has(trigger)) return;\n if (!userIsAllowed(policy, activity.sender.login)) {\n log.logInfo(\n `GitHub: ignoring ${conversationId} from ${activity.sender.login} (not in GITHUB_USERS)`,\n );\n return;\n }\n if (!(await this.hasTriggerPermission(ref, activity.sender.login))) {\n log.logInfo(\n `GitHub: ignoring ${conversationId} from ${activity.sender.login} (below ${policy.minPermission} permission)`,\n );\n return;\n }\n if (activity.ts === GITHUB_ISSUE_BODY_TS && !this.claimBodyTrigger(conversationId)) return;\n const note = bodyTriggerNote(activity);\n await this.handleIncoming({\n ref,\n ts: activity.ts,\n user: activity.sender.login,\n text: note ? `${note}\\n\\n${activity.text}` : activity.text,\n createdAt: activity.createdAt,\n addressed: trigger !== \"followup\",\n review: activity.review,\n });\n }\n\n private mentionPattern(): RegExp | null {\n const login = this.identity?.login;\n return login ? new RegExp(`@${login}(?![\\\\w-])`, \"gi\") : null;\n }\n\n private isMentioned(text: string): boolean {\n const pattern = this.mentionPattern();\n return pattern ? pattern.test(text) : false;\n }\n\n private stripMention(text: string): string {\n const pattern = this.mentionPattern();\n return (pattern ? text.replace(pattern, \"\") : text).trim();\n }\n\n private office(conversationId: string): Office {\n return this.config.workspace.office(createOfficeAddress(\"github\", conversationId));\n }\n\n private isParticipating(conversationId: string): boolean {\n return existsSync(this.office(conversationId).logPath);\n }\n\n private async hasTriggerPermission(ref: GithubConversationRef, user: string): Promise<boolean> {\n const cacheKey = `${ref.owner}/${ref.repo}#${user.toLowerCase()}`;\n const cached = this.permissionCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt) return cached.allowed;\n let allowed: boolean;\n try {\n const role = await githubRetry(() =>\n this.client.getCollaboratorPermission(ref.owner, ref.repo, user),\n );\n allowed = permissionMeets(this.config.policy, role);\n } catch (err) {\n log.logWarning(\n `GitHub: permission lookup failed for ${user} on ${ref.owner}/${ref.repo}; denying trigger`,\n errorMessage(err),\n );\n return false;\n }\n this.permissionCache.set(cacheKey, {\n allowed,\n expiresAt: Date.now() + PERMISSION_CACHE_TTL_MS,\n });\n return allowed;\n }\n\n private async handleIncoming(item: IncomingItem): Promise<void> {\n const conversationId = buildGithubConversationId(item.ref);\n const participating = this.isParticipating(conversationId);\n const cleanedText = this.stripMention(item.text);\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind: \"shared\",\n messageId: item.ts,\n persistentTopLevel: true,\n });\n\n const messageText = item.review\n ? await this.formatReviewMessage(item.ref, item.review, cleanedText)\n : cleanedText;\n\n const eventBase = createConversationEvent({\n platform: \"github\",\n type: item.ts === GITHUB_ISSUE_BODY_TS ? \"issue\" : \"message\",\n conversationId,\n conversationKind: \"shared\",\n ts: item.ts,\n sessionKey,\n user: item.user,\n userName: item.user,\n text: messageText,\n }) as GithubEvent;\n\n await processMessageIntake({\n eventBase,\n addressed: true,\n magicWord: { text: cleanedText, addressed: item.addressed, scopeFallback: \"never\" },\n busyPolicy: \"queue\",\n logEntryBase: {\n date: item.createdAt,\n ts: item.ts,\n user: item.user,\n userName: item.user,\n text: messageText,\n isMessagingBot: false,\n },\n log: (entry) => {\n if (!participating && matchMagicWord(cleanedText) === \"stop\") return;\n this.logToFile(conversationId, entry);\n },\n processAttachments: async () => {\n if (!participating && item.ts !== GITHUB_ISSUE_BODY_TS) {\n await this.logIssueContext(item.ref, conversationId, item.createdAt);\n }\n return [];\n },\n queueKey: conversationId,\n enqueue: (queueKey, work) => this.getQueue(queueKey).admit(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createGithubAdapters(event, this),\n });\n }\n\n private async formatReviewMessage(\n ref: IncomingItem[\"ref\"],\n review: GithubReviewAnchor,\n cleanedText: string,\n ): Promise<string> {\n const location = review.line !== null ? `${review.path}:${review.line}` : review.path;\n const parts = [`[PR review comment ${githubReviewCommentTs(review.commentId)} on ${location}]`];\n if (review.diffHunk) {\n const hunk =\n review.diffHunk.length > MAX_DIFF_HUNK_CHARS\n ? `…${review.diffHunk.slice(-MAX_DIFF_HUNK_CHARS)}`\n : review.diffHunk;\n parts.push(`\\`\\`\\`diff\\n${hunk}\\n\\`\\`\\``);\n }\n if (review.inReplyToId !== undefined) {\n const turns = await this.reviewThreadContext(ref, review.inReplyToId, review.commentId);\n if (turns.length > 0) {\n parts.push(`Thread so far:\\n${turns.join(\"\\n\")}`);\n }\n }\n parts.push(cleanedText);\n return parts.join(\"\\n\");\n }\n\n private async reviewThreadContext(\n ref: GithubConversationRef,\n rootId: number,\n beforeId: number,\n ): Promise<string[]> {\n try {\n const all = await githubRetry(() =>\n this.client.listPullReviewComments(ref.owner, ref.repo, ref.number),\n );\n return all\n .filter(\n (comment) =>\n (comment.id === rootId || comment.in_reply_to_id === rootId) && comment.id < beforeId,\n )\n .slice(-MAX_THREAD_TURNS)\n .map((comment) => {\n const body =\n comment.body.length > MAX_THREAD_TURN_CHARS\n ? `${comment.body.slice(0, MAX_THREAD_TURN_CHARS)}…`\n : comment.body;\n return `@${comment.user.login}: ${body}`;\n });\n } catch (err) {\n log.logWarning(\n `GitHub: could not fetch review thread context for ${ref.owner}/${ref.repo}#${ref.number}`,\n errorMessage(err),\n );\n return [];\n }\n }\n\n private async logIssueContext(\n ref: GithubConversationRef,\n conversationId: string,\n triggerCreatedAt: string,\n ): Promise<void> {\n let issue: GithubIssue;\n try {\n issue = await githubRetry(() => this.client.getIssue(ref.owner, ref.repo, ref.number));\n } catch (err) {\n log.logWarning(\n `GitHub: could not fetch issue context for ${conversationId}`,\n errorMessage(err),\n );\n return;\n }\n const triggerMs = Date.parse(triggerCreatedAt);\n const contextDate = new Date((Number.isFinite(triggerMs) ? triggerMs : Date.now()) - 1000);\n this.logToFile(conversationId, {\n date: contextDate.toISOString(),\n ts: GITHUB_ISSUE_BODY_TS,\n user: issue.user.login,\n userName: issue.user.login,\n text: `# ${issue.title}\\n\\n${issue.body ?? \"\"}`.trim(),\n attachments: [],\n isMessagingBot: false,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationLogMessage, RunAnswer } from \"../../types.js\";\nimport { appendBotResponseLog, appendOfficeLog } from \"../../office/log.js\";\nimport { existsSync } from \"node:fs\";\nimport type {\n MessagingBot,\n MessagingEventHandler,\n MessagingInfo,\n ConversationEvent,\n} from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { MessagingEventQueue, splitText } from \"../shared.js\";\nimport { matchMagicWord, processMessageIntake } from \"../intake.js\";\nimport { readGithubActivity } from \"./activity.js\";\nimport { GithubClient, GITHUB_MAX_COMMENT_LENGTH, githubRetry } from \"./client.js\";\nimport { createGithubAdapters } from \"./context.js\";\nimport { GithubOps } from \"./github-ops.js\";\nimport { permissionMeets, repoIsAllowed, userIsAllowed } from \"./policy.js\";\nimport {\n buildGithubConversationId,\n createConversationEvent,\n createOfficeAddress,\n parseGithubConversationId,\n} from \"../../office/index.js\";\nimport type { Office, GithubConversationRef } from \"../../office/types.js\";\nimport { GITHUB_ISSUE_BODY_TS, githubReviewCommentTs, parseReviewCommentTs } from \"./ids.js\";\nimport type {\n GithubActivity,\n GithubAgentIdentity,\n GithubApi,\n GithubBotConfig,\n GithubCapability,\n GithubEvent,\n GithubIssue,\n GithubReactionContent,\n GithubReviewAnchor,\n GithubTrigger,\n GithubWebhookDelivery,\n} from \"./types.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;\n\nconst BODY_TRIGGER_WINDOW_MS = 10 * 60 * 1000;\n\nexport const formatGithubContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nconst GITHUB_REACTIONS: Record<string, GithubReactionContent> = {\n \"+1\": \"+1\",\n thumbsup: \"+1\",\n \"-1\": \"-1\",\n thumbsdown: \"-1\",\n laugh: \"laugh\",\n smile: \"laugh\",\n confused: \"confused\",\n heart: \"heart\",\n hooray: \"hooray\",\n tada: \"hooray\",\n rocket: \"rocket\",\n eyes: \"eyes\",\n saluting_face: \"eyes\",\n};\n\ninterface IncomingItem {\n ref: GithubConversationRef;\n ts: string;\n user: string;\n text: string;\n createdAt: string;\n addressed: boolean;\n review?: GithubReviewAnchor;\n}\n\nconst MAX_DIFF_HUNK_CHARS = 1500;\nconst MAX_THREAD_TURNS = 10;\nconst MAX_THREAD_TURN_CHARS = 500;\n\nfunction bodyTriggerNote(activity: GithubActivity): string | null {\n switch (activity.kind) {\n case \"assigned\":\n return `[Assigned to you by @${activity.sender.login}]`;\n case \"review_requested\":\n return `[Review requested by @${activity.sender.login}]`;\n case \"opened\":\n case \"comment\":\n case \"review_comment\":\n return null;\n default:\n return activity.kind satisfies never;\n }\n}\n\nexport class GithubMessagingBot implements MessagingBot {\n private readonly client: GithubApi;\n private readonly handler: MessagingEventHandler;\n private readonly config: GithubBotConfig;\n readonly ops: GithubOps;\n private identity: GithubAgentIdentity | null = null;\n private queues = new Map<string, MessagingEventQueue>();\n private permissionCache = new Map<string, { allowed: boolean; expiresAt: number }>();\n private bodyTriggers = new Map<string, number>();\n private stopped = true;\n\n constructor(handler: MessagingEventHandler, config: GithubBotConfig, client?: GithubApi) {\n this.handler = handler;\n this.config = config;\n this.client = client ?? new GithubClient({ token: config.token });\n this.ops = new GithubOps(this.client);\n }\n\n get capabilities(): ReadonlySet<GithubCapability> {\n return this.config.policy.capabilities;\n }\n\n get agentIdentity(): GithubAgentIdentity | undefined {\n return this.identity ?? undefined;\n }\n\n async start(): Promise<void> {\n const user = await this.client.getAuthenticatedUser();\n this.identity = {\n login: user.login,\n email: `${user.id}+${user.login}@users.noreply.github.com`,\n };\n this.stopped = false;\n log.logConnected(\"GitHub\");\n log.logInfo(\n `GitHub bot started as @${user.login}, answering in ${this.config.policy.repos.join(\", \")}`,\n );\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n const ref = parseGithubConversationId(channel);\n const parts = splitText(text, GITHUB_MAX_COMMENT_LENGTH, formatGithubContinuation);\n const firstId = await this.postComment(ref, parts[0] ?? text);\n for (const part of parts.slice(1)) {\n await this.postComment(ref, part);\n }\n return String(firstId);\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n const ref = parseGithubConversationId(channel);\n await githubRetry(() => this.client.updateIssueComment(ref.owner, ref.repo, Number(ts), text));\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n const ref = parseGithubConversationId(channel);\n const content = GITHUB_REACTIONS[emoji.replace(/^:|:$/g, \"\")];\n if (!content) {\n throw new Error(\n `GitHub does not support reaction '${emoji}' (supported: ${Object.keys(GITHUB_REACTIONS).join(\", \")})`,\n );\n }\n const reviewCommentId = parseReviewCommentTs(messageTs);\n await githubRetry(() => {\n if (messageTs === GITHUB_ISSUE_BODY_TS) {\n return this.client.createIssueReaction(ref.owner, ref.repo, ref.number, content);\n }\n if (reviewCommentId !== null) {\n return this.client.createReviewCommentReaction(\n ref.owner,\n ref.repo,\n reviewCommentId,\n content,\n );\n }\n return this.client.createCommentReaction(ref.owner, ref.repo, Number(messageTs), content);\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n return this.getQueue(event.address.conversationId).offerEvent(event, () => {\n const context = createGithubAdapters(event as GithubEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"github\",\n trustModel: \"membership\",\n formattingGuide:\n \"## GitHub Formatting (GitHub Flavored Markdown)\\n\" +\n \"Standard Markdown plus tables, task lists, fenced code blocks, and ```suggestion blocks.\\n\" +\n \"Reference issues/PRs as #123 and users as @login (mentions notify people — use sparingly).\",\n channels: [],\n users: [],\n };\n }\n\n async postComment(ref: GithubConversationRef, text: string): Promise<number> {\n const comment = await githubRetry(() =>\n this.client.createIssueComment(ref.owner, ref.repo, ref.number, text),\n );\n return comment.id;\n }\n\n async deleteComment(ref: GithubConversationRef, commentId: number): Promise<void> {\n await githubRetry(() => this.client.deleteIssueComment(ref.owner, ref.repo, commentId));\n }\n\n logToFile(conversationId: string, entry: ConversationLogMessage): void {\n appendOfficeLog(this.office(conversationId), entry);\n }\n\n logBotResponse(\n conversationId: string,\n text: string,\n ts: string,\n threadTs?: string,\n { answer }: { answer?: RunAnswer } = {},\n ): void {\n appendBotResponseLog(this.office(conversationId), { text, ts, threadTs, answer });\n }\n\n private getQueue(conversationId: string): MessagingEventQueue {\n let queue = this.queues.get(conversationId);\n if (!queue) {\n queue = new MessagingEventQueue(\"GitHub\");\n this.queues.set(conversationId, queue);\n }\n return queue;\n }\n\n async receive(delivery: GithubWebhookDelivery): Promise<void> {\n if (this.stopped || !this.identity) return;\n const activity = readGithubActivity(delivery);\n if (!activity) return;\n try {\n await this.handleActivity(activity);\n } catch (err) {\n log.logWarning(\n `GitHub: failed to handle ${delivery.event} for ${activity.repo.owner}/${activity.repo.repo}#${activity.number}`,\n errorMessage(err),\n );\n }\n }\n\n private isAgent(login: string): boolean {\n return login.toLowerCase() === this.identity?.login.toLowerCase();\n }\n\n private triggerOf(activity: GithubActivity, conversationId: string): GithubTrigger | null {\n switch (activity.kind) {\n case \"assigned\":\n return activity.target !== null && this.isAgent(activity.target) ? \"assign\" : null;\n case \"review_requested\":\n return activity.target !== null && this.isAgent(activity.target) ? \"review\" : null;\n case \"opened\":\n return this.isMentioned(activity.text) ? \"mention\" : null;\n case \"comment\":\n case \"review_comment\":\n if (this.isMentioned(activity.text)) return \"mention\";\n return this.isParticipating(conversationId) ? \"followup\" : null;\n default:\n return activity.kind satisfies never;\n }\n }\n\n private claimBodyTrigger(conversationId: string): boolean {\n const now = Date.now();\n for (const [key, expiresAt] of this.bodyTriggers) {\n if (expiresAt <= now) this.bodyTriggers.delete(key);\n }\n if (this.bodyTriggers.has(conversationId)) return false;\n this.bodyTriggers.set(conversationId, now + BODY_TRIGGER_WINDOW_MS);\n return true;\n }\n\n private async handleActivity(activity: GithubActivity): Promise<void> {\n const { policy } = this.config;\n if (activity.sender.isBot || this.isAgent(activity.sender.login)) return;\n if (!repoIsAllowed(policy, activity.repo)) return;\n const ref = { owner: activity.repo.owner, repo: activity.repo.repo, number: activity.number };\n const conversationId = buildGithubConversationId(ref);\n const trigger = this.triggerOf(activity, conversationId);\n if (trigger === null || !policy.triggers.has(trigger)) return;\n if (!userIsAllowed(policy, activity.sender.login)) {\n log.logInfo(\n `GitHub: ignoring ${conversationId} from ${activity.sender.login} (not in github.users)`,\n );\n return;\n }\n if (!(await this.hasTriggerPermission(ref, activity.sender.login))) {\n log.logInfo(\n `GitHub: ignoring ${conversationId} from ${activity.sender.login} (below ${policy.minPermission} permission)`,\n );\n return;\n }\n if (activity.ts === GITHUB_ISSUE_BODY_TS && !this.claimBodyTrigger(conversationId)) return;\n const note = bodyTriggerNote(activity);\n await this.handleIncoming({\n ref,\n ts: activity.ts,\n user: activity.sender.login,\n text: note ? `${note}\\n\\n${activity.text}` : activity.text,\n createdAt: activity.createdAt,\n addressed: trigger !== \"followup\",\n review: activity.review,\n });\n }\n\n private mentionPattern(): RegExp | null {\n const login = this.identity?.login;\n return login ? new RegExp(`@${login}(?![\\\\w-])`, \"gi\") : null;\n }\n\n private isMentioned(text: string): boolean {\n const pattern = this.mentionPattern();\n return pattern ? pattern.test(text) : false;\n }\n\n private stripMention(text: string): string {\n const pattern = this.mentionPattern();\n return (pattern ? text.replace(pattern, \"\") : text).trim();\n }\n\n private office(conversationId: string): Office {\n return this.config.workspace.office(createOfficeAddress(\"github\", conversationId));\n }\n\n private isParticipating(conversationId: string): boolean {\n return existsSync(this.office(conversationId).logPath);\n }\n\n private async hasTriggerPermission(ref: GithubConversationRef, user: string): Promise<boolean> {\n const cacheKey = `${ref.owner}/${ref.repo}#${user.toLowerCase()}`;\n const cached = this.permissionCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt) return cached.allowed;\n let allowed: boolean;\n try {\n const role = await githubRetry(() =>\n this.client.getCollaboratorPermission(ref.owner, ref.repo, user),\n );\n allowed = permissionMeets(this.config.policy, role);\n } catch (err) {\n log.logWarning(\n `GitHub: permission lookup failed for ${user} on ${ref.owner}/${ref.repo}; denying trigger`,\n errorMessage(err),\n );\n return false;\n }\n this.permissionCache.set(cacheKey, {\n allowed,\n expiresAt: Date.now() + PERMISSION_CACHE_TTL_MS,\n });\n return allowed;\n }\n\n private async handleIncoming(item: IncomingItem): Promise<void> {\n const conversationId = buildGithubConversationId(item.ref);\n const participating = this.isParticipating(conversationId);\n const cleanedText = this.stripMention(item.text);\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind: \"shared\",\n messageId: item.ts,\n persistentTopLevel: true,\n });\n\n const messageText = item.review\n ? await this.formatReviewMessage(item.ref, item.review, cleanedText)\n : cleanedText;\n\n const eventBase = createConversationEvent({\n platform: \"github\",\n type: item.ts === GITHUB_ISSUE_BODY_TS ? \"issue\" : \"message\",\n conversationId,\n conversationKind: \"shared\",\n ts: item.ts,\n sessionKey,\n user: item.user,\n userName: item.user,\n text: messageText,\n }) as GithubEvent;\n\n await processMessageIntake({\n eventBase,\n addressed: true,\n magicWord: { text: cleanedText, addressed: item.addressed, scopeFallback: \"never\" },\n busyPolicy: \"queue\",\n logEntryBase: {\n date: item.createdAt,\n ts: item.ts,\n user: item.user,\n userName: item.user,\n text: messageText,\n isMessagingBot: false,\n },\n log: (entry) => {\n if (!participating && matchMagicWord(cleanedText) === \"stop\") return;\n this.logToFile(conversationId, entry);\n },\n processAttachments: async () => {\n if (!participating && item.ts !== GITHUB_ISSUE_BODY_TS) {\n await this.logIssueContext(item.ref, conversationId, item.createdAt);\n }\n return [];\n },\n queueKey: conversationId,\n enqueue: (queueKey, work) => this.getQueue(queueKey).admit(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createGithubAdapters(event, this),\n });\n }\n\n private async formatReviewMessage(\n ref: IncomingItem[\"ref\"],\n review: GithubReviewAnchor,\n cleanedText: string,\n ): Promise<string> {\n const location = review.line !== null ? `${review.path}:${review.line}` : review.path;\n const parts = [`[PR review comment ${githubReviewCommentTs(review.commentId)} on ${location}]`];\n if (review.diffHunk) {\n const hunk =\n review.diffHunk.length > MAX_DIFF_HUNK_CHARS\n ? `…${review.diffHunk.slice(-MAX_DIFF_HUNK_CHARS)}`\n : review.diffHunk;\n parts.push(`\\`\\`\\`diff\\n${hunk}\\n\\`\\`\\``);\n }\n if (review.inReplyToId !== undefined) {\n const turns = await this.reviewThreadContext(ref, review.inReplyToId, review.commentId);\n if (turns.length > 0) {\n parts.push(`Thread so far:\\n${turns.join(\"\\n\")}`);\n }\n }\n parts.push(cleanedText);\n return parts.join(\"\\n\");\n }\n\n private async reviewThreadContext(\n ref: GithubConversationRef,\n rootId: number,\n beforeId: number,\n ): Promise<string[]> {\n try {\n const all = await githubRetry(() =>\n this.client.listPullReviewComments(ref.owner, ref.repo, ref.number),\n );\n return all\n .filter(\n (comment) =>\n (comment.id === rootId || comment.in_reply_to_id === rootId) && comment.id < beforeId,\n )\n .slice(-MAX_THREAD_TURNS)\n .map((comment) => {\n const body =\n comment.body.length > MAX_THREAD_TURN_CHARS\n ? `${comment.body.slice(0, MAX_THREAD_TURN_CHARS)}…`\n : comment.body;\n return `@${comment.user.login}: ${body}`;\n });\n } catch (err) {\n log.logWarning(\n `GitHub: could not fetch review thread context for ${ref.owner}/${ref.repo}#${ref.number}`,\n errorMessage(err),\n );\n return [];\n }\n }\n\n private async logIssueContext(\n ref: GithubConversationRef,\n conversationId: string,\n triggerCreatedAt: string,\n ): Promise<void> {\n let issue: GithubIssue;\n try {\n issue = await githubRetry(() => this.client.getIssue(ref.owner, ref.repo, ref.number));\n } catch (err) {\n log.logWarning(\n `GitHub: could not fetch issue context for ${conversationId}`,\n errorMessage(err),\n );\n return;\n }\n const triggerMs = Date.parse(triggerCreatedAt);\n const contextDate = new Date((Number.isFinite(triggerMs) ? triggerMs : Date.now()) - 1000);\n this.logToFile(conversationId, {\n date: contextDate.toISOString(),\n ts: GITHUB_ISSUE_BODY_TS,\n user: issue.user.login,\n userName: issue.user.login,\n text: `# ${issue.title}\\n\\n${issue.body ?? \"\"}`.trim(),\n attachments: [],\n isMessagingBot: false,\n });\n }\n}\n"]}
@@ -1,13 +1,6 @@
1
1
  import type { GithubPolicy, GithubRepoRef } from "./types.js";
2
- export interface GithubPolicyEnv {
3
- repos: string | undefined;
4
- publicRepos: string | undefined;
5
- users: string | undefined;
6
- minPermission: string | undefined;
7
- triggers: string | undefined;
8
- capabilities: string | undefined;
9
- }
10
- export declare function parseGithubPolicy(env: GithubPolicyEnv): GithubPolicy;
2
+ import type { GithubSettings } from "../../settings/index.js";
3
+ export declare function parseGithubPolicy(settings: GithubSettings | undefined): GithubPolicy;
11
4
  export declare function repoIsAllowed(policy: GithubPolicy, repo: GithubRepoRef & {
12
5
  private: boolean;
13
6
  }): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EACZ,aAAa,EAGd,MAAM,YAAY,CAAC;AAmBpB,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AA0BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,CA2BpE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAQT;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1E;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAGT"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EACZ,aAAa,EAGd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAiC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,YAAY,CAoCpF;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACzC,OAAO,CAQT;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1E;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAGT"}
@@ -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":"AASA,MAAM,eAAe,GAA6B,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE9F,MAAM,mBAAmB,GAAgC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE5E,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,mBAAmB,GAAuC,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAE/F,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD,SAAS,aAAa,CAAC,MAAqC;IAC1D,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,OAAO,CAAmB,GAAW,EAAE,OAAqB,EAAE,OAAiB;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,UAAU,GAAG,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAoC;IACpE,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,oCAAoC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/E,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,uCAAuC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO;QACL,KAAK;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;QAC1C,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACtC,aAAa,EAAE,aAAwC;QACvD,QAAQ,EACN,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC;YAC1B,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5E,YAAY,EAAE,OAAO,CACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CACrC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,IAA0C;IAE1C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,UAAU,KAAK,KAAK,IAAI,CAAC,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,KAAa;IAC/D,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,eAAe,CAAC,IAAoC,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAoB,EACpB,IAAgD;IAEhD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,OAAO,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACvD,CAAC","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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"}