@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.78
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.
- package/CHANGELOG.md +39 -0
- package/dist/adapters/commands/login.d.ts.map +1 -1
- package/dist/adapters/commands/login.js +0 -9
- package/dist/adapters/commands/login.js.map +1 -1
- package/dist/adapters/commands/manifest.d.ts +0 -19
- package/dist/adapters/commands/manifest.d.ts.map +1 -1
- package/dist/adapters/commands/manifest.js +0 -34
- package/dist/adapters/commands/manifest.js.map +1 -1
- package/dist/adapters/commands/model.d.ts +0 -5
- package/dist/adapters/commands/model.d.ts.map +1 -1
- package/dist/adapters/commands/model.js +0 -5
- package/dist/adapters/commands/model.js.map +1 -1
- package/dist/adapters/commands/new.d.ts.map +1 -1
- package/dist/adapters/commands/new.js +0 -2
- package/dist/adapters/commands/new.js.map +1 -1
- package/dist/adapters/commands/registry.d.ts +0 -1
- package/dist/adapters/commands/registry.d.ts.map +1 -1
- package/dist/adapters/commands/registry.js +0 -8
- package/dist/adapters/commands/registry.js.map +1 -1
- package/dist/adapters/commands/session-view.d.ts.map +1 -1
- package/dist/adapters/commands/session-view.js +0 -2
- package/dist/adapters/commands/session-view.js.map +1 -1
- package/dist/adapters/commands/types.d.ts +0 -29
- package/dist/adapters/commands/types.d.ts.map +1 -1
- package/dist/adapters/commands/types.js.map +1 -1
- package/dist/adapters/commands/utils.d.ts +0 -3
- package/dist/adapters/commands/utils.d.ts.map +1 -1
- package/dist/adapters/commands/utils.js +0 -3
- package/dist/adapters/commands/utils.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +0 -4
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +5 -41
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/components.d.ts +0 -23
- package/dist/adapters/discord/components.d.ts.map +1 -1
- package/dist/adapters/discord/components.js +0 -23
- package/dist/adapters/discord/components.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +1 -11
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/format.d.ts +0 -1
- package/dist/adapters/discord/format.d.ts.map +1 -1
- package/dist/adapters/discord/format.js +0 -37
- package/dist/adapters/discord/format.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +0 -44
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +1 -120
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts +0 -57
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +0 -59
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +1 -8
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +0 -55
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +0 -59
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/ids.d.ts +0 -27
- package/dist/adapters/github/ids.d.ts.map +1 -1
- package/dist/adapters/github/ids.js +0 -29
- package/dist/adapters/github/ids.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +0 -25
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +0 -49
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/tool-pack.d.ts +0 -10
- package/dist/adapters/github/tool-pack.d.ts.map +1 -1
- package/dist/adapters/github/tool-pack.js +0 -10
- package/dist/adapters/github/tool-pack.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts +0 -6
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +0 -7
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/tools/issue.d.ts +0 -5
- package/dist/adapters/github/tools/issue.d.ts.map +1 -1
- package/dist/adapters/github/tools/issue.js +0 -5
- package/dist/adapters/github/tools/issue.js.map +1 -1
- package/dist/adapters/github/tools/pr.d.ts +0 -7
- package/dist/adapters/github/tools/pr.d.ts.map +1 -1
- package/dist/adapters/github/tools/pr.js +0 -7
- package/dist/adapters/github/tools/pr.js.map +1 -1
- package/dist/adapters/github/tools/read.d.ts +0 -6
- package/dist/adapters/github/tools/read.d.ts.map +1 -1
- package/dist/adapters/github/tools/read.js +0 -8
- package/dist/adapters/github/tools/read.js.map +1 -1
- package/dist/adapters/github/tools/review-reply.d.ts +0 -5
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
- package/dist/adapters/github/tools/review-reply.js +0 -5
- package/dist/adapters/github/tools/review-reply.js.map +1 -1
- package/dist/adapters/github/tools/sync.d.ts +0 -6
- package/dist/adapters/github/tools/sync.d.ts.map +1 -1
- package/dist/adapters/github/tools/sync.js +0 -6
- package/dist/adapters/github/tools/sync.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -88
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/github/webhook.d.ts +0 -13
- package/dist/adapters/github/webhook.d.ts.map +1 -1
- package/dist/adapters/github/webhook.js +0 -16
- package/dist/adapters/github/webhook.js.map +1 -1
- package/dist/adapters/index.d.ts +3 -4
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/intake.d.ts +0 -17
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +6 -32
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/markdown-tables.d.ts +0 -10
- package/dist/adapters/markdown-tables.d.ts.map +1 -1
- package/dist/adapters/markdown-tables.js +1 -42
- package/dist/adapters/markdown-tables.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +3 -25
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/shared.d.ts +0 -57
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +0 -71
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +0 -49
- package/dist/adapters/slack/assistant.d.ts.map +1 -1
- package/dist/adapters/slack/assistant.js +0 -97
- package/dist/adapters/slack/assistant.js.map +1 -1
- package/dist/adapters/slack/auto-reply-context.d.ts +0 -7
- package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -1
- package/dist/adapters/slack/auto-reply-context.js +0 -7
- package/dist/adapters/slack/auto-reply-context.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +0 -9
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +0 -20
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +0 -116
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +7 -231
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/context.d.ts.map +1 -1
- package/dist/adapters/slack/context.js +1 -3
- package/dist/adapters/slack/context.js.map +1 -1
- package/dist/adapters/slack/jev-context.d.ts +0 -13
- package/dist/adapters/slack/jev-context.d.ts.map +1 -1
- package/dist/adapters/slack/jev-context.js +0 -12
- package/dist/adapters/slack/jev-context.js.map +1 -1
- package/dist/adapters/slack/markdown.d.ts +0 -1
- package/dist/adapters/slack/markdown.d.ts.map +1 -1
- package/dist/adapters/slack/markdown.js +0 -5
- package/dist/adapters/slack/markdown.js.map +1 -1
- package/dist/adapters/slack/persona.d.ts +0 -9
- package/dist/adapters/slack/persona.d.ts.map +1 -1
- package/dist/adapters/slack/persona.js +0 -9
- package/dist/adapters/slack/persona.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -45
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/session.d.ts +2 -1
- package/dist/adapters/slack/session.d.ts.map +1 -1
- package/dist/adapters/slack/session.js +2 -2
- package/dist/adapters/slack/session.js.map +1 -1
- package/dist/adapters/slack/stream-limits.d.ts +0 -25
- package/dist/adapters/slack/stream-limits.d.ts.map +1 -1
- package/dist/adapters/slack/stream-limits.js +0 -34
- package/dist/adapters/slack/stream-limits.js.map +1 -1
- package/dist/adapters/slack/task-intent.d.ts +0 -13
- package/dist/adapters/slack/task-intent.d.ts.map +1 -1
- package/dist/adapters/slack/task-intent.js +0 -7
- package/dist/adapters/slack/task-intent.js.map +1 -1
- package/dist/adapters/slack/task-status.d.ts +0 -1
- package/dist/adapters/slack/task-status.d.ts.map +1 -1
- package/dist/adapters/slack/task-status.js +1 -9
- package/dist/adapters/slack/task-status.js.map +1 -1
- package/dist/adapters/slack/tool-pack.d.ts +0 -6
- package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
- package/dist/adapters/slack/tool-pack.js +0 -6
- package/dist/adapters/slack/tool-pack.js.map +1 -1
- package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
- package/dist/adapters/slack/tools/blockkit.js +0 -11
- package/dist/adapters/slack/tools/blockkit.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +0 -19
- package/dist/adapters/slack/types.d.ts.map +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/slack/update-diagnostics.d.ts +0 -1
- package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
- package/dist/adapters/slack/update-diagnostics.js +1 -7
- package/dist/adapters/slack/update-diagnostics.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +0 -6
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +1 -50
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +1 -8
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +0 -57
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/client-assets.d.ts +4 -0
- package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
- package/dist/adapters/web/admin/client-assets.js +1765 -0
- package/dist/adapters/web/admin/client-assets.js.map +1 -0
- package/dist/adapters/web/admin/portal.d.ts +0 -10
- package/dist/adapters/web/admin/portal.d.ts.map +1 -1
- package/dist/adapters/web/admin/portal.js +6 -1909
- package/dist/adapters/web/admin/portal.js.map +1 -1
- package/dist/adapters/web/admin/types.d.ts +0 -3
- package/dist/adapters/web/admin/types.d.ts.map +1 -1
- package/dist/adapters/web/admin/types.js.map +1 -1
- package/dist/adapters/web/login/oauth.d.ts.map +1 -1
- package/dist/adapters/web/login/oauth.js +3 -7
- package/dist/adapters/web/login/oauth.js.map +1 -1
- package/dist/adapters/web/login/portal.d.ts +0 -10
- package/dist/adapters/web/login/portal.d.ts.map +1 -1
- package/dist/adapters/web/login/portal.js +4 -37
- package/dist/adapters/web/login/portal.js.map +1 -1
- package/dist/adapters/web/login/types.d.ts +0 -5
- package/dist/adapters/web/login/types.d.ts.map +1 -1
- package/dist/adapters/web/login/types.js.map +1 -1
- package/dist/adapters/web/portal-shell.d.ts +0 -12
- package/dist/adapters/web/portal-shell.d.ts.map +1 -1
- package/dist/adapters/web/portal-shell.js +8 -25
- package/dist/adapters/web/portal-shell.js.map +1 -1
- package/dist/adapters/web/server.d.ts +0 -1
- package/dist/adapters/web/server.d.ts.map +1 -1
- package/dist/adapters/web/server.js +0 -2
- package/dist/adapters/web/server.js.map +1 -1
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
- package/dist/adapters/web/session-view/portal.js +13 -24
- package/dist/adapters/web/session-view/portal.js.map +1 -1
- package/dist/adapters/web/session-view/types.d.ts.map +1 -1
- package/dist/adapters/web/session-view/types.js.map +1 -1
- package/dist/adapters/web/token-store.d.ts +0 -2
- package/dist/adapters/web/token-store.d.ts.map +1 -1
- package/dist/adapters/web/token-store.js +0 -2
- package/dist/adapters/web/token-store.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +0 -3
- package/dist/cli/arg-grammar.d.ts.map +1 -1
- package/dist/cli/arg-grammar.js +0 -3
- package/dist/cli/arg-grammar.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +3 -12
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/download.d.ts.map +1 -1
- package/dist/cli/download.js +2 -6
- package/dist/cli/download.js.map +1 -1
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +0 -31
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.d.ts +0 -2
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +0 -30
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/process-lifecycle.d.ts +0 -5
- package/dist/cli/process-lifecycle.d.ts.map +1 -1
- package/dist/cli/process-lifecycle.js +0 -6
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/sandbox.d.ts +3 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +79 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sessions.d.ts.map +1 -1
- package/dist/cli/sessions.js +0 -11
- package/dist/cli/sessions.js.map +1 -1
- package/dist/cli/types.d.ts +2 -6
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/env-manifest.d.ts +0 -21
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +0 -11
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +0 -51
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +0 -42
- package/dist/events/index.js.map +1 -1
- package/dist/events/scheduler.d.ts +0 -8
- package/dist/events/scheduler.d.ts.map +1 -1
- package/dist/events/scheduler.js +0 -8
- package/dist/events/scheduler.js.map +1 -1
- package/dist/file-guards.d.ts +0 -15
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +2 -26
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-env.d.ts +0 -15
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +4 -55
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/http.d.ts +0 -12
- package/dist/harness/http.d.ts.map +1 -1
- package/dist/harness/http.js +0 -34
- package/dist/harness/http.js.map +1 -1
- package/dist/harness/index.d.ts +4 -7
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +4 -7
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/jev.d.ts +0 -28
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js +0 -45
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/mcp-result.d.ts +20 -0
- package/dist/harness/mcp-result.d.ts.map +1 -0
- package/dist/harness/mcp-result.js +171 -0
- package/dist/harness/mcp-result.js.map +1 -0
- package/dist/harness/mcp.d.ts +0 -19
- package/dist/harness/mcp.d.ts.map +1 -1
- package/dist/harness/mcp.js +7 -66
- package/dist/harness/mcp.js.map +1 -1
- package/dist/harness/models.d.ts +0 -19
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +0 -52
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/open-connector.d.ts +0 -12
- package/dist/harness/open-connector.d.ts.map +1 -1
- package/dist/harness/open-connector.js +0 -22
- package/dist/harness/open-connector.js.map +1 -1
- package/dist/harness/presenter.d.ts +1 -0
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +16 -66
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts +0 -11
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +1 -18
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +8 -28
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +11 -28
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +100 -38
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/skills.d.ts +0 -22
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +0 -20
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/subagent-profiles.d.ts +0 -4
- package/dist/harness/subagent-profiles.d.ts.map +1 -1
- package/dist/harness/subagent-profiles.js +0 -29
- package/dist/harness/subagent-profiles.js.map +1 -1
- package/dist/harness/subagent.d.ts +0 -25
- package/dist/harness/subagent.d.ts.map +1 -1
- package/dist/harness/subagent.js +1 -70
- package/dist/harness/subagent.js.map +1 -1
- package/dist/harness/tools/event.d.ts.map +1 -1
- package/dist/harness/tools/event.js +0 -9
- package/dist/harness/tools/event.js.map +1 -1
- package/dist/harness/tools/generate-image.d.ts +0 -6
- package/dist/harness/tools/generate-image.d.ts.map +1 -1
- package/dist/harness/tools/generate-image.js.map +1 -1
- package/dist/harness/tools/host-fn-tool.d.ts +0 -17
- package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
- package/dist/harness/tools/host-fn-tool.js +0 -16
- package/dist/harness/tools/host-fn-tool.js.map +1 -1
- package/dist/harness/tools/index.d.ts +1 -7
- package/dist/harness/tools/index.d.ts.map +1 -1
- package/dist/harness/tools/index.js +3 -14
- package/dist/harness/tools/index.js.map +1 -1
- package/dist/harness/tools/jev-browser.d.ts +4 -94
- package/dist/harness/tools/jev-browser.d.ts.map +1 -1
- package/dist/harness/tools/jev-browser.js +203 -92
- package/dist/harness/tools/jev-browser.js.map +1 -1
- package/dist/harness/tools/jev.d.ts +0 -8
- package/dist/harness/tools/jev.d.ts.map +1 -1
- package/dist/harness/tools/jev.js +0 -11
- package/dist/harness/tools/jev.js.map +1 -1
- package/dist/harness/tools/pi-tools.d.ts +1 -11
- package/dist/harness/tools/pi-tools.d.ts.map +1 -1
- package/dist/harness/tools/pi-tools.js +1 -30
- package/dist/harness/tools/pi-tools.js.map +1 -1
- package/dist/harness/tools/react.d.ts +0 -5
- package/dist/harness/tools/react.d.ts.map +1 -1
- package/dist/harness/tools/react.js +0 -5
- package/dist/harness/tools/react.js.map +1 -1
- package/dist/harness/tools/secret-redaction.d.ts +0 -25
- package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
- package/dist/harness/tools/secret-redaction.js +3 -36
- package/dist/harness/tools/secret-redaction.js.map +1 -1
- package/dist/harness/tools/subagent.d.ts +0 -34
- package/dist/harness/tools/subagent.d.ts.map +1 -1
- package/dist/harness/tools/subagent.js +0 -92
- package/dist/harness/tools/subagent.js.map +1 -1
- package/dist/harness/tools/task.d.ts +0 -1
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +0 -1
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/harness/tools/types.d.ts +0 -16
- package/dist/harness/tools/types.d.ts.map +1 -1
- package/dist/harness/tools/types.js.map +1 -1
- package/dist/harness/types.d.ts +1 -77
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +0 -13
- package/dist/log.js.map +1 -1
- package/dist/main.js +7 -52
- package/dist/main.js.map +1 -1
- package/dist/memory-capture/index.d.ts +16 -0
- package/dist/memory-capture/index.d.ts.map +1 -0
- package/dist/memory-capture/index.js +194 -0
- package/dist/memory-capture/index.js.map +1 -0
- package/dist/memory-capture/types.d.ts +27 -0
- package/dist/memory-capture/types.d.ts.map +1 -0
- package/dist/memory-capture/types.js.map +1 -0
- package/dist/observability/index.d.ts +0 -9
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +0 -9
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/instrument.js +0 -5
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/otel.js +0 -1
- package/dist/observability/otel.js.map +1 -1
- package/dist/observability/sentry.d.ts +0 -18
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +0 -36
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +1 -10
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +0 -76
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +4 -154
- package/dist/office/index.js.map +1 -1
- package/dist/office/projection.d.ts +0 -29
- package/dist/office/projection.d.ts.map +1 -1
- package/dist/office/projection.js +5 -41
- package/dist/office/projection.js.map +1 -1
- package/dist/office/types.d.ts +0 -66
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +22 -83
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +0 -10
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +0 -12
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -29
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +2 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +21 -15
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +0 -2
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/identity.d.ts +0 -28
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +0 -28
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/index.d.ts +0 -18
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +2 -19
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/layout.d.ts +7 -0
- package/dist/sandbox/layout.d.ts.map +1 -0
- package/dist/sandbox/layout.js +13 -0
- package/dist/sandbox/layout.js.map +1 -0
- package/dist/sandbox/provisioner.d.ts +24 -65
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +213 -125
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sandbox/types.d.ts +0 -39
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +2 -5
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +31 -31
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +0 -6
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +1 -33
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/history-line.d.ts +0 -20
- package/dist/sessions/history-line.d.ts.map +1 -1
- package/dist/sessions/history-line.js +0 -20
- package/dist/sessions/history-line.js.map +1 -1
- package/dist/sessions/migrate-common.d.ts +0 -15
- package/dist/sessions/migrate-common.d.ts.map +1 -1
- package/dist/sessions/migrate-common.js +0 -19
- package/dist/sessions/migrate-common.js.map +1 -1
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
- package/dist/sessions/migrate-pi-084.js +0 -7
- package/dist/sessions/migrate-pi-084.js.map +1 -1
- package/dist/sessions/migrate-v3.d.ts +0 -7
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +1 -67
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/session-key.d.ts +3 -17
- package/dist/sessions/session-key.d.ts.map +1 -1
- package/dist/sessions/session-key.js +8 -35
- package/dist/sessions/session-key.js.map +1 -1
- package/dist/sessions/session-store.d.ts +1 -7
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +8 -50
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/store.d.ts +0 -60
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +0 -113
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +0 -17
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.d.ts +0 -6
- package/dist/settings/apply.d.ts.map +1 -1
- package/dist/settings/apply.js +0 -29
- package/dist/settings/apply.js.map +1 -1
- package/dist/settings/index.d.ts +0 -53
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +0 -77
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/migrate.d.ts +0 -5
- package/dist/settings/migrate.d.ts.map +1 -1
- package/dist/settings/migrate.js +0 -17
- package/dist/settings/migrate.js.map +1 -1
- package/dist/types.d.ts +9 -159
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +2 -36
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +135 -65
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +0 -15
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/dream/index.d.ts +0 -20
- package/dist/dream/index.d.ts.map +0 -1
- package/dist/dream/index.js +0 -264
- package/dist/dream/index.js.map +0 -1
- package/dist/dream/types.d.ts +0 -30
- package/dist/dream/types.d.ts.map +0 -1
- package/dist/dream/types.js.map +0 -1
- /package/dist/{dream → memory-capture}/types.js +0 -0
|
@@ -3,16 +3,13 @@ import { resolveChatSessionKey } from "../../sessions/session-key.js";
|
|
|
3
3
|
import { createProgressiveRenderer, formatMarkdownToolResult } from "../progressive-renderer.js";
|
|
4
4
|
import { DISCORD_V2_TEXT_LIMIT } from "./components.js";
|
|
5
5
|
import { formatDiscordMarkdown } from "./format.js";
|
|
6
|
-
// Components V2 allows 4000 characters across a message's text, against 2000
|
|
7
|
-
// for classic content — the reason for using it at all. The margin leaves room
|
|
8
|
-
// for the working indicator and for the continuation marker on a split.
|
|
9
6
|
const MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;
|
|
10
7
|
const formatDiscordContinuation = (partNum) => `*(continued ${partNum})*`;
|
|
11
8
|
function isDiscordMessageReference(id) {
|
|
12
9
|
return typeof id === "string" && id !== "" && !id.startsWith("event:");
|
|
13
10
|
}
|
|
14
11
|
export function createDiscordAdapters(event, bot) {
|
|
15
|
-
const conversationId = event.conversationId;
|
|
12
|
+
const conversationId = event.address.conversationId;
|
|
16
13
|
const channelId = conversationId;
|
|
17
14
|
const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;
|
|
18
15
|
const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;
|
|
@@ -36,7 +33,6 @@ export function createDiscordAdapters(event, bot) {
|
|
|
36
33
|
attachments: event.attachments,
|
|
37
34
|
threadTs: event.thread_ts,
|
|
38
35
|
});
|
|
39
|
-
// The bot's getMessagingInfo() is the single authority for platform info.
|
|
40
36
|
const platform = bot.getMessagingInfo();
|
|
41
37
|
function postFirst(text) {
|
|
42
38
|
if (threadTargetId)
|
|
@@ -53,14 +49,10 @@ export function createDiscordAdapters(event, bot) {
|
|
|
53
49
|
workingIndicator: " ...",
|
|
54
50
|
supportsDeltas: true,
|
|
55
51
|
typing: {
|
|
56
|
-
// Send immediately and repeat every 8s (Discord clears indicator after ~10s)
|
|
57
52
|
send: () => bot.sendTyping(channelId),
|
|
58
53
|
intervalMs: 8000,
|
|
59
54
|
stopOnSend: true,
|
|
60
55
|
},
|
|
61
|
-
// The last step before sending: the model writes standard markdown, and
|
|
62
|
-
// the parts Discord cannot render are converted here rather than by
|
|
63
|
-
// constraining what the model may write.
|
|
64
56
|
prepareSource: (text) => formatDiscordMarkdown(text),
|
|
65
57
|
formatToolResult: formatMarkdownToolResult,
|
|
66
58
|
responseErrorContext: (responseId) => ({
|
|
@@ -76,8 +68,6 @@ export function createDiscordAdapters(event, bot) {
|
|
|
76
68
|
}),
|
|
77
69
|
post: postFirst,
|
|
78
70
|
update: (id, text) => bot.updateMessageRaw(channelId, id, text),
|
|
79
|
-
// Returns the id so the renderer can edit this overflow message on the
|
|
80
|
-
// next redraw instead of posting another copy of the tail.
|
|
81
71
|
postExtra: async (text, responseId) => {
|
|
82
72
|
if (threadTargetId)
|
|
83
73
|
return bot.postInThread(channelId, threadTargetId, text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAA4B,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage, type ConversationContext } from \"../index.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer, formatMarkdownToolResult } from \"../progressive-renderer.js\";\nimport { DISCORD_V2_TEXT_LIMIT } from \"./components.js\";\nimport { formatDiscordMarkdown } from \"./format.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\nconst MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): ConversationContext {\n const conversationId = event.address.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n const platform = bot.getMessagingInfo();\n\n function postFirst(text: string): Promise<string> {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n return bot.postMessage(channelId, text);\n }\n\n const { responder } = createProgressiveRenderer({\n label: \"Discord\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatDiscordContinuation,\n errorPrefix: \"*Error:* \",\n workingIndicator: \" ...\",\n supportsDeltas: true,\n typing: {\n send: () => bot.sendTyping(channelId),\n intervalMs: 8000,\n stopOnSend: true,\n },\n prepareSource: (text) => formatDiscordMarkdown(text),\n formatToolResult: formatMarkdownToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }),\n post: postFirst,\n update: (id, text) => bot.updateMessageRaw(channelId, id, text),\n postExtra: async (text, responseId) => {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n if (responseId !== null) return bot.postReply(channelId, responseId, text);\n return bot.postMessage(channelId, text);\n },\n delete: (id) => bot.deleteMessageRaw(channelId, id),\n logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),\n react: replyTargetId ? (emoji) => bot.addReaction(channelId, replyTargetId, emoji) : undefined,\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AAyDA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -1,27 +1,6 @@
|
|
|
1
1
|
import { extractMarkdownTables, normalizeMarkdownTables, renderMonospaceTable, } from "../markdown-tables.js";
|
|
2
|
-
/**
|
|
3
|
-
* Discord-side presentation of a response.
|
|
4
|
-
*
|
|
5
|
-
* The model writes standard markdown for every platform; making it write
|
|
6
|
-
* Discord-flavoured markdown instead would trade one platform's rendering for
|
|
7
|
-
* another's, and Discord is the one that renders the least. So the conversion
|
|
8
|
-
* belongs here, at the last step before sending.
|
|
9
|
-
*
|
|
10
|
-
* Discord renders most of what we emit — headings, lists, quotes, fenced code
|
|
11
|
-
* with highlighting, links, spoilers, and its own `-#` subtext. What it does
|
|
12
|
-
* not render is handled below, each verified against the real client rather
|
|
13
|
-
* than against the docs.
|
|
14
|
-
*/
|
|
15
|
-
/** Fence tables at this width or less; wider ones wrap and look worse aligned. */
|
|
16
2
|
const MAX_FENCED_TABLE_WIDTH = 120;
|
|
17
|
-
/** Stand-in for a horizontal rule, which Discord has no syntax for. */
|
|
18
3
|
const RULE = "─".repeat(30);
|
|
19
|
-
/**
|
|
20
|
-
* Replace GFM tables with aligned, fenced equivalents.
|
|
21
|
-
*
|
|
22
|
-
* Prose is sliced verbatim around each table rather than re-serialized, so
|
|
23
|
-
* everything Discord already renders correctly passes through untouched.
|
|
24
|
-
*/
|
|
25
4
|
function convertTables(source) {
|
|
26
5
|
const normalized = normalizeMarkdownTables(source);
|
|
27
6
|
const tables = extractMarkdownTables(normalized);
|
|
@@ -33,8 +12,6 @@ function convertTables(source) {
|
|
|
33
12
|
for (const table of tables) {
|
|
34
13
|
out.push(...lines.slice(cursor, table.startLine));
|
|
35
14
|
const rendered = renderMonospaceTable(table);
|
|
36
|
-
// Too wide to align: Discord soft-wraps inside a fence and the columns
|
|
37
|
-
// scatter, which is worse than the pipes. Leave those as they came.
|
|
38
15
|
if (rendered.split("\n").reduce((max, line) => Math.max(max, line.length), 0) >
|
|
39
16
|
MAX_FENCED_TABLE_WIDTH) {
|
|
40
17
|
out.push(...lines.slice(table.startLine, table.endLine));
|
|
@@ -47,13 +24,6 @@ function convertTables(source) {
|
|
|
47
24
|
out.push(...lines.slice(cursor));
|
|
48
25
|
return out.join("\n");
|
|
49
26
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Line-level rewrites for constructs Discord ignores, applied outside fenced
|
|
52
|
-
* code so a code sample keeps whatever it contains.
|
|
53
|
-
*
|
|
54
|
-
* Runs after table conversion because that step maps source line numbers, and
|
|
55
|
-
* a rewrite that changed the line count first would misplace every table.
|
|
56
|
-
*/
|
|
57
27
|
function convertUnsupportedSyntax(source) {
|
|
58
28
|
let inFence = false;
|
|
59
29
|
return source
|
|
@@ -65,19 +35,12 @@ function convertUnsupportedSyntax(source) {
|
|
|
65
35
|
}
|
|
66
36
|
if (inFence)
|
|
67
37
|
return line;
|
|
68
|
-
// A horizontal rule renders as its own literal dashes. Discord has no
|
|
69
|
-
// rule syntax, so draw one — dropping the line would lose the section
|
|
70
|
-
// break the author meant.
|
|
71
38
|
if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line))
|
|
72
39
|
return RULE;
|
|
73
|
-
// Discord does not render markdown images: `` arrives as a
|
|
74
|
-
// stray "!" followed by a link, and the image never appears. A bare URL
|
|
75
|
-
// *does* auto-embed, so emit that and keep the alt text above it.
|
|
76
40
|
return line.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (_match, alt, url) => alt.trim() ? `${alt}\n${url}` : url);
|
|
77
41
|
})
|
|
78
42
|
.join("\n");
|
|
79
43
|
}
|
|
80
|
-
/** Everything Discord cannot render, converted to something it can. */
|
|
81
44
|
export function formatDiscordMarkdown(source) {
|
|
82
45
|
return convertUnsupportedSyntax(convertTables(source));
|
|
83
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,UAAU,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,IACE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzE,sBAAsB,EACtB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3D,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CACtF,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CACpC,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,wBAAwB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import {\n extractMarkdownTables,\n normalizeMarkdownTables,\n renderMonospaceTable,\n} from \"../markdown-tables.js\";\n\nconst MAX_FENCED_TABLE_WIDTH = 120;\n\nconst RULE = \"─\".repeat(30);\n\nfunction convertTables(source: string): string {\n const normalized = normalizeMarkdownTables(source);\n const tables = extractMarkdownTables(normalized);\n if (tables.length === 0) return source;\n\n const lines = normalized.split(\"\\n\");\n const out: string[] = [];\n let cursor = 0;\n\n for (const table of tables) {\n out.push(...lines.slice(cursor, table.startLine));\n const rendered = renderMonospaceTable(table);\n if (\n rendered.split(\"\\n\").reduce((max, line) => Math.max(max, line.length), 0) >\n MAX_FENCED_TABLE_WIDTH\n ) {\n out.push(...lines.slice(table.startLine, table.endLine));\n } else {\n out.push(\"```\", rendered, \"```\");\n }\n cursor = table.endLine;\n }\n out.push(...lines.slice(cursor));\n\n return out.join(\"\\n\");\n}\n\nfunction convertUnsupportedSyntax(source: string): string {\n let inFence = false;\n return source\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n\n if (/^\\s*(-{3,}|\\*{3,}|_{3,})\\s*$/.test(line)) return RULE;\n\n return line.replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g, (_match, alt: string, url: string) =>\n alt.trim() ? `${alt}\\n${url}` : url,\n );\n })\n .join(\"\\n\");\n}\n\nexport function formatDiscordMarkdown(source: string): string {\n return convertUnsupportedSyntax(convertTables(source));\n}\n"]}
|
|
@@ -8,7 +8,6 @@ export declare class GithubMessagingBot implements MessagingBot {
|
|
|
8
8
|
private readonly client;
|
|
9
9
|
private readonly handler;
|
|
10
10
|
private readonly config;
|
|
11
|
-
/** Host-side backend for the github_* tool pack; standalone from polling. */
|
|
12
11
|
readonly ops: GithubOps;
|
|
13
12
|
private appSlug;
|
|
14
13
|
private botEmail;
|
|
@@ -35,68 +34,25 @@ export declare class GithubMessagingBot implements MessagingBot {
|
|
|
35
34
|
logToFile(conversationId: string, entry: object): void;
|
|
36
35
|
logBotResponse(conversationId: string, text: string, ts: string): void;
|
|
37
36
|
private getQueue;
|
|
38
|
-
/**
|
|
39
|
-
* Webhook poke: run a poll soon. Debounced so a burst of deliveries costs
|
|
40
|
-
* one tick; a poke landing mid-poll marks it pending and the tick re-runs,
|
|
41
|
-
* because the in-flight pass may already be past the poked repo's feeds.
|
|
42
|
-
*/
|
|
43
37
|
requestPoll(debounceMs?: number): void;
|
|
44
|
-
/** One poll tick over every watched repo. Public for tests. */
|
|
45
38
|
poll(): Promise<void>;
|
|
46
39
|
private pollWatchedRepos;
|
|
47
40
|
private pollRepo;
|
|
48
|
-
/**
|
|
49
|
-
* One feed's watermark advance — the same discipline for all three feeds:
|
|
50
|
-
* bump the cursor on any fresher updated_at, then let the id watermark plus
|
|
51
|
-
* the creation baseline decide what actually triggers (edits re-surface old
|
|
52
|
-
* items with a fresh updated_at). Bot-authored items advance the watermark
|
|
53
|
-
* without triggering.
|
|
54
|
-
*/
|
|
55
41
|
private advanceFeed;
|
|
56
42
|
private loadSyncState;
|
|
57
|
-
/** The persisted form of the current watermarks; the test/inspection surface. */
|
|
58
43
|
syncStateSnapshot(): GithubSyncState;
|
|
59
44
|
private persistSyncState;
|
|
60
|
-
/** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
|
|
61
45
|
private mentionPattern;
|
|
62
46
|
private isMentioned;
|
|
63
47
|
private stripMention;
|
|
64
|
-
/** The Conversation office for a GitHub conversation id (one PR/issue). */
|
|
65
48
|
private office;
|
|
66
49
|
private isParticipating;
|
|
67
|
-
/**
|
|
68
|
-
* True when `user` holds at least write permission on the repo. Fails
|
|
69
|
-
* closed: a failed lookup denies the trigger (and logs) rather than
|
|
70
|
-
* letting an unverified commenter drive the agent.
|
|
71
|
-
*/
|
|
72
50
|
private hasTriggerPermission;
|
|
73
51
|
private handleIncoming;
|
|
74
|
-
/**
|
|
75
|
-
* First contact: log the issue title/body ahead of the comment so the
|
|
76
|
-
* session history starts with what the thread is about. The clone is
|
|
77
|
-
* (re)attempted on every trigger while ./repo is missing — a no-op once
|
|
78
|
-
* it exists — so a failed first clone (e.g. App permissions granted
|
|
79
|
-
* later) heals on the next mention instead of wedging the conversation.
|
|
80
|
-
*/
|
|
81
52
|
private prepareConversation;
|
|
82
|
-
/**
|
|
83
|
-
* Decorates an inline review comment with its diff anchor and (for replies)
|
|
84
|
-
* the thread's earlier turns, so the agent knows which code the feedback is
|
|
85
|
-
* about without hunting through the PR. The rc-<id> in the header is what
|
|
86
|
-
* github_review_reply takes to answer in-thread.
|
|
87
|
-
*/
|
|
88
53
|
private formatReviewMessage;
|
|
89
|
-
/**
|
|
90
|
-
* Earlier turns of one review thread (root + replies before the trigger),
|
|
91
|
-
* newest-truncated. Fail-soft: context is a nicety, the trigger is not.
|
|
92
|
-
*/
|
|
93
54
|
private reviewThreadContext;
|
|
94
55
|
private logIssueContext;
|
|
95
|
-
/**
|
|
96
|
-
* Clone the conversation's repo into its dir (bind-mounted into the
|
|
97
|
-
* sandbox) using an ephemeral contents:read token that never leaves the
|
|
98
|
-
* host. Non-fatal: a failed clone degrades to the pre-clone experience.
|
|
99
|
-
*/
|
|
100
56
|
private ensureRepoClone;
|
|
101
57
|
}
|
|
102
58
|
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAY9E,OAAO,EAAE,YAAY,EAA0C,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAgC,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU1E,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAKrB,eAAe,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,21 +20,12 @@ const SyncStateSchema = Type.Object({
|
|
|
20
20
|
cursor: Type.String(),
|
|
21
21
|
seenComments: Type.Array(Type.Number()),
|
|
22
22
|
seenIssues: Type.Array(Type.Number()),
|
|
23
|
-
// Optional: state files written before review-comment polling must keep
|
|
24
|
-
// loading — a schema failure re-baselines and silently drops dedup state.
|
|
25
23
|
seenReviewComments: Type.Optional(Type.Array(Type.Number())),
|
|
26
24
|
})),
|
|
27
25
|
});
|
|
28
|
-
/**
|
|
29
|
-
* Re-fetch this far behind the cursor each poll. Dedup is by id (the
|
|
30
|
-
* watermark), so the overlap only costs bandwidth and closes the boundary
|
|
31
|
-
* races of a bare `since` timestamp (DESIGN.md § Event source).
|
|
32
|
-
*/
|
|
33
26
|
const POLL_OVERLAP_MS = 5 * 60 * 1000;
|
|
34
27
|
const MAX_SEEN_IDS = 5000;
|
|
35
|
-
/** Webhook pokes within this window collapse into one poll tick. */
|
|
36
28
|
const REQUEST_POLL_DEBOUNCE_MS = 1500;
|
|
37
|
-
/** Effective role → rank, for the trigger-permission gate. */
|
|
38
29
|
const PERMISSION_RANK = {
|
|
39
30
|
none: 0,
|
|
40
31
|
read: 1,
|
|
@@ -43,20 +34,12 @@ const PERMISSION_RANK = {
|
|
|
43
34
|
maintain: 4,
|
|
44
35
|
admin: 5,
|
|
45
36
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Commenters need write or better to trigger the agent. Fixed, not a config
|
|
48
|
-
* knob: it guards public repos (anyone can comment there), and the people who
|
|
49
|
-
* ask an agent to change code are exactly the people with push access.
|
|
50
|
-
*/
|
|
51
37
|
const REQUIRED_TRIGGER_RANK = PERMISSION_RANK.write;
|
|
52
|
-
/** Rank for an arbitrary API-reported permission name; unknown names rank 0. */
|
|
53
38
|
function rankOfPermission(name) {
|
|
54
39
|
return PERMISSION_RANK[name] ?? 0;
|
|
55
40
|
}
|
|
56
|
-
/** Permission lookups are cached this long per repo+user. */
|
|
57
41
|
const PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
58
42
|
export const formatGithubContinuation = (partNum) => `*(continued ${partNum})*`;
|
|
59
|
-
/** Slack-style emoji short names → GitHub reaction content values. */
|
|
60
43
|
const GITHUB_REACTIONS = {
|
|
61
44
|
"+1": "+1",
|
|
62
45
|
thumbsup: "+1",
|
|
@@ -71,9 +54,6 @@ const GITHUB_REACTIONS = {
|
|
|
71
54
|
rocket: "rocket",
|
|
72
55
|
eyes: "eyes",
|
|
73
56
|
};
|
|
74
|
-
// Repo refs are lowercased at every entry point (env config here, the
|
|
75
|
-
// installation API in start()) so conversation ids and sync-state keys never
|
|
76
|
-
// depend on how a repo's name was spelled — GitHub is case-insensitive.
|
|
77
57
|
function parseRepoList(repos) {
|
|
78
58
|
return repos.map((entry) => {
|
|
79
59
|
const [owner, repo, ...rest] = entry.split("/");
|
|
@@ -83,7 +63,6 @@ function parseRepoList(repos) {
|
|
|
83
63
|
return { owner: owner.toLowerCase(), repo: repo.toLowerCase() };
|
|
84
64
|
});
|
|
85
65
|
}
|
|
86
|
-
/** Sets iterate in insertion order; drop the oldest ids once over the cap. */
|
|
87
66
|
function pruneSeen(seen) {
|
|
88
67
|
if (seen.size <= MAX_SEEN_IDS)
|
|
89
68
|
return;
|
|
@@ -94,7 +73,6 @@ function pruneSeen(seen) {
|
|
|
94
73
|
seen.delete(id);
|
|
95
74
|
}
|
|
96
75
|
}
|
|
97
|
-
/** Issue number from a comment's `issue_url` (…/repos/o/r/issues/42). */
|
|
98
76
|
function issueNumberFromUrl(issueUrl) {
|
|
99
77
|
const match = /\/issues\/(\d+)$/.exec(issueUrl);
|
|
100
78
|
if (!match) {
|
|
@@ -102,7 +80,6 @@ function issueNumberFromUrl(issueUrl) {
|
|
|
102
80
|
}
|
|
103
81
|
return Number(match[1]);
|
|
104
82
|
}
|
|
105
|
-
/** PR number from a review comment's `pull_request_url` (…/repos/o/r/pulls/42). */
|
|
106
83
|
function prNumberFromUrl(pullRequestUrl) {
|
|
107
84
|
const match = /\/pulls\/(\d+)$/.exec(pullRequestUrl);
|
|
108
85
|
if (!match) {
|
|
@@ -110,7 +87,6 @@ function prNumberFromUrl(pullRequestUrl) {
|
|
|
110
87
|
}
|
|
111
88
|
return Number(match[1]);
|
|
112
89
|
}
|
|
113
|
-
/** Keep the tail: a review comment anchors to the hunk's final lines. */
|
|
114
90
|
const MAX_DIFF_HUNK_CHARS = 1500;
|
|
115
91
|
const MAX_THREAD_TURNS = 10;
|
|
116
92
|
const MAX_THREAD_TURN_CHARS = 500;
|
|
@@ -139,16 +115,10 @@ export class GithubMessagingBot {
|
|
|
139
115
|
});
|
|
140
116
|
this.ops = new GithubOps(this.client, { workspace: config.workspace });
|
|
141
117
|
}
|
|
142
|
-
// ==========================================================================
|
|
143
|
-
// Public API (implements MessagingBot)
|
|
144
|
-
// ==========================================================================
|
|
145
118
|
async start() {
|
|
146
119
|
this.stopped = false;
|
|
147
120
|
this.stopping = false;
|
|
148
121
|
this.appSlug = await this.client.getAppSlug();
|
|
149
|
-
// Canonical noreply author email (<user-id>+<login>@users.noreply.github.com)
|
|
150
|
-
// so the bot's commits link to its avatar/profile; degrade to a plain
|
|
151
|
-
// noreply spelling when the lookup fails.
|
|
152
122
|
try {
|
|
153
123
|
const botUserId = await this.client.getUserId(`${this.appSlug}[bot]`);
|
|
154
124
|
this.botEmail = `${botUserId}+${this.appSlug}[bot]@users.noreply.github.com`;
|
|
@@ -166,8 +136,6 @@ export class GithubMessagingBot {
|
|
|
166
136
|
if (this.watchedRepos.length === 0) {
|
|
167
137
|
log.logWarning("GitHub: installation has no repositories; nothing to poll");
|
|
168
138
|
}
|
|
169
|
-
// Restore persisted watermarks; a repo watched for the first time gets a
|
|
170
|
-
// baseline of "now" so history never triggers (DESIGN.md § Event source).
|
|
171
139
|
const persisted = this.loadSyncState();
|
|
172
140
|
const now = new Date().toISOString();
|
|
173
141
|
for (const repo of this.watchedRepos) {
|
|
@@ -251,7 +219,7 @@ export class GithubMessagingBot {
|
|
|
251
219
|
enqueueEvent(event) {
|
|
252
220
|
if (this.stopped)
|
|
253
221
|
return false;
|
|
254
|
-
const conversationId = event.conversationId;
|
|
222
|
+
const conversationId = event.address.conversationId;
|
|
255
223
|
const queue = this.getQueue(conversationId);
|
|
256
224
|
if (queue.size() >= 5) {
|
|
257
225
|
log.logWarning(`Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`);
|
|
@@ -274,9 +242,6 @@ export class GithubMessagingBot {
|
|
|
274
242
|
users: [],
|
|
275
243
|
};
|
|
276
244
|
}
|
|
277
|
-
// ==========================================================================
|
|
278
|
-
// Internal helpers (used by context.ts)
|
|
279
|
-
// ==========================================================================
|
|
280
245
|
async postComment(ref, text) {
|
|
281
246
|
const comment = await githubRetry(() => this.client.createIssueComment(ref.owner, ref.repo, ref.number, text));
|
|
282
247
|
return comment.id;
|
|
@@ -290,9 +255,6 @@ export class GithubMessagingBot {
|
|
|
290
255
|
logBotResponse(conversationId, text, ts) {
|
|
291
256
|
appendBotResponseLog(this.office(conversationId), text, ts);
|
|
292
257
|
}
|
|
293
|
-
// ==========================================================================
|
|
294
|
-
// Private - polling
|
|
295
|
-
// ==========================================================================
|
|
296
258
|
getQueue(conversationId) {
|
|
297
259
|
let queue = this.queues.get(conversationId);
|
|
298
260
|
if (!queue) {
|
|
@@ -301,11 +263,6 @@ export class GithubMessagingBot {
|
|
|
301
263
|
}
|
|
302
264
|
return queue;
|
|
303
265
|
}
|
|
304
|
-
/**
|
|
305
|
-
* Webhook poke: run a poll soon. Debounced so a burst of deliveries costs
|
|
306
|
-
* one tick; a poke landing mid-poll marks it pending and the tick re-runs,
|
|
307
|
-
* because the in-flight pass may already be past the poked repo's feeds.
|
|
308
|
-
*/
|
|
309
266
|
requestPoll(debounceMs = REQUEST_POLL_DEBOUNCE_MS) {
|
|
310
267
|
if (this.stopped || this.stopping)
|
|
311
268
|
return;
|
|
@@ -321,7 +278,6 @@ export class GithubMessagingBot {
|
|
|
321
278
|
}, debounceMs);
|
|
322
279
|
this.requestPollTimer.unref();
|
|
323
280
|
}
|
|
324
|
-
/** One poll tick over every watched repo. Public for tests. */
|
|
325
281
|
async poll() {
|
|
326
282
|
if (this.stopped || this.stopping)
|
|
327
283
|
return;
|
|
@@ -362,9 +318,6 @@ export class GithubMessagingBot {
|
|
|
362
318
|
return false;
|
|
363
319
|
const since = new Date(Date.parse(state.cursor) - POLL_OVERLAP_MS).toISOString();
|
|
364
320
|
let changed = false;
|
|
365
|
-
// Comment activity also bumps the parent issue's updated_at, so the issues
|
|
366
|
-
// list mostly echoes the comments list; only issues *created* since the
|
|
367
|
-
// baseline are new conversations (their body is the first message).
|
|
368
321
|
const issues = (await this.client.listIssuesSince(repo.owner, repo.repo, since)) ?? [];
|
|
369
322
|
changed =
|
|
370
323
|
(await this.advanceFeed(state, state.seenIssues, issues, (issue) => ({
|
|
@@ -384,9 +337,6 @@ export class GithubMessagingBot {
|
|
|
384
337
|
text: comment.body,
|
|
385
338
|
createdAt: comment.created_at,
|
|
386
339
|
}))) || changed;
|
|
387
|
-
// Inline PR review comments live in their own endpoint and id space; the
|
|
388
|
-
// same watermark discipline applies. The bot's own thread replies (the
|
|
389
|
-
// github_review_reply tool) re-surface here and are dropped as Bot-authored.
|
|
390
340
|
const reviewComments = (await this.client.listPullReviewCommentsSince(repo.owner, repo.repo, since)) ?? [];
|
|
391
341
|
changed =
|
|
392
342
|
(await this.advanceFeed(state, state.seenReviewComments, reviewComments, (comment) => ({
|
|
@@ -409,13 +359,6 @@ export class GithubMessagingBot {
|
|
|
409
359
|
pruneSeen(state.seenReviewComments);
|
|
410
360
|
return changed;
|
|
411
361
|
}
|
|
412
|
-
/**
|
|
413
|
-
* One feed's watermark advance — the same discipline for all three feeds:
|
|
414
|
-
* bump the cursor on any fresher updated_at, then let the id watermark plus
|
|
415
|
-
* the creation baseline decide what actually triggers (edits re-surface old
|
|
416
|
-
* items with a fresh updated_at). Bot-authored items advance the watermark
|
|
417
|
-
* without triggering.
|
|
418
|
-
*/
|
|
419
362
|
async advanceFeed(state, seen, items, toIncoming) {
|
|
420
363
|
let changed = false;
|
|
421
364
|
for (const item of items) {
|
|
@@ -433,21 +376,15 @@ export class GithubMessagingBot {
|
|
|
433
376
|
}
|
|
434
377
|
return changed;
|
|
435
378
|
}
|
|
436
|
-
// ==========================================================================
|
|
437
|
-
// Private - watermark persistence
|
|
438
|
-
// ==========================================================================
|
|
439
379
|
loadSyncState() {
|
|
440
380
|
try {
|
|
441
381
|
return readJsonSchemaFileIfExists(this.config.syncStatePath, SyncStateSchema, (detail) => `Malformed GitHub sync state at ${this.config.syncStatePath}: ${detail}`);
|
|
442
382
|
}
|
|
443
383
|
catch (err) {
|
|
444
|
-
// A bad state file re-baselines (history won't trigger) rather than
|
|
445
|
-
// blocking startup; the next persist overwrites it.
|
|
446
384
|
log.logWarning("GitHub: ignoring unreadable sync state", err instanceof Error ? err.message : String(err));
|
|
447
385
|
return undefined;
|
|
448
386
|
}
|
|
449
387
|
}
|
|
450
|
-
/** The persisted form of the current watermarks; the test/inspection surface. */
|
|
451
388
|
syncStateSnapshot() {
|
|
452
389
|
const state = { repos: {} };
|
|
453
390
|
for (const [repoKey, watermark] of this.repoState) {
|
|
@@ -465,10 +402,6 @@ export class GithubMessagingBot {
|
|
|
465
402
|
ensureDirExists(dirname(this.config.syncStatePath));
|
|
466
403
|
atomicWritePrivateFile(this.config.syncStatePath, JSON.stringify(this.syncStateSnapshot()));
|
|
467
404
|
}
|
|
468
|
-
// ==========================================================================
|
|
469
|
-
// Private - triggering
|
|
470
|
-
// ==========================================================================
|
|
471
|
-
/** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
|
|
472
405
|
mentionPattern() {
|
|
473
406
|
return this.appSlug ? new RegExp(`@${this.appSlug}(?![\\w-])`, "gi") : null;
|
|
474
407
|
}
|
|
@@ -480,18 +413,12 @@ export class GithubMessagingBot {
|
|
|
480
413
|
const pattern = this.mentionPattern();
|
|
481
414
|
return (pattern ? text.replace(pattern, "") : text).trim();
|
|
482
415
|
}
|
|
483
|
-
/** The Conversation office for a GitHub conversation id (one PR/issue). */
|
|
484
416
|
office(conversationId) {
|
|
485
417
|
return this.config.workspace.office(createOfficeAddress("github", conversationId));
|
|
486
418
|
}
|
|
487
419
|
isParticipating(conversationId) {
|
|
488
420
|
return existsSync(this.office(conversationId).logPath);
|
|
489
421
|
}
|
|
490
|
-
/**
|
|
491
|
-
* True when `user` holds at least write permission on the repo. Fails
|
|
492
|
-
* closed: a failed lookup denies the trigger (and logs) rather than
|
|
493
|
-
* letting an unverified commenter drive the agent.
|
|
494
|
-
*/
|
|
495
422
|
async hasTriggerPermission(ref, user) {
|
|
496
423
|
const cacheKey = `${ref.owner}/${ref.repo}#${user}`;
|
|
497
424
|
const cached = this.permissionCache.get(cacheKey);
|
|
@@ -501,8 +428,6 @@ export class GithubMessagingBot {
|
|
|
501
428
|
let rank;
|
|
502
429
|
try {
|
|
503
430
|
const role = await githubRetry(() => this.client.getCollaboratorPermission(ref.owner, ref.repo, user));
|
|
504
|
-
// Custom role_name values are unrankable; the legacy permission field
|
|
505
|
-
// still carries their closest standard mapping, so take the stronger.
|
|
506
431
|
rank = Math.max(rankOfPermission(role.role_name ?? ""), rankOfPermission(role.permission));
|
|
507
432
|
}
|
|
508
433
|
catch (err) {
|
|
@@ -519,13 +444,8 @@ export class GithubMessagingBot {
|
|
|
519
444
|
const conversationId = buildGithubConversationId(item.ref);
|
|
520
445
|
const mentioned = this.isMentioned(item.text);
|
|
521
446
|
const participating = this.isParticipating(conversationId);
|
|
522
|
-
// Narrow trigger (DESIGN.md): only threads the bot is mentioned in or
|
|
523
|
-
// already participates in. Everything else is ignored without logging so
|
|
524
|
-
// busy repos don't grow conversation dirs for untouched issues.
|
|
525
447
|
if (!mentioned && !participating)
|
|
526
448
|
return;
|
|
527
|
-
// Permission gate: on public repos anyone can comment, so a mention from
|
|
528
|
-
// anyone below write permission is ignored entirely (no log, no state).
|
|
529
449
|
if (!(await this.hasTriggerPermission(item.ref, item.user))) {
|
|
530
450
|
log.logInfo(`GitHub: ignoring ${conversationId} comment from ${item.user} (below write permission)`);
|
|
531
451
|
return;
|
|
@@ -554,7 +474,6 @@ export class GithubMessagingBot {
|
|
|
554
474
|
await processMessageIntake({
|
|
555
475
|
eventBase,
|
|
556
476
|
addressed: true,
|
|
557
|
-
// Match on the user-typed text, not the review-decorated messageText.
|
|
558
477
|
magicWord: { text: cleanedText, addressed: mentioned, scopeFallback: "never" },
|
|
559
478
|
busyPolicy: "queue",
|
|
560
479
|
logEntryBase: {
|
|
@@ -565,18 +484,11 @@ export class GithubMessagingBot {
|
|
|
565
484
|
text: messageText,
|
|
566
485
|
isMessagingBot: false,
|
|
567
486
|
},
|
|
568
|
-
// log.jsonl existence is the participation authority for this adapter:
|
|
569
|
-
// a first-contact magic word ("@bot stop" on an untouched issue) must
|
|
570
|
-
// not materialize the log, or every later comment from any writer
|
|
571
|
-
// would be treated as addressed to a conversation the bot never joined.
|
|
572
487
|
log: (entry) => {
|
|
573
488
|
if (!participating && matchMagicWord(cleanedText) === "stop")
|
|
574
489
|
return;
|
|
575
490
|
this.logToFile(conversationId, entry);
|
|
576
491
|
},
|
|
577
|
-
// GitHub has no attachments; the prep hook is used to lay down the
|
|
578
|
-
// issue context and repo clone only for messages that will dispatch,
|
|
579
|
-
// and before the comment itself is logged.
|
|
580
492
|
processAttachments: async () => {
|
|
581
493
|
await this.prepareConversation(item, conversationId, participating);
|
|
582
494
|
return [];
|
|
@@ -588,19 +500,10 @@ export class GithubMessagingBot {
|
|
|
588
500
|
createContext: (event) => createGithubAdapters(event, this),
|
|
589
501
|
});
|
|
590
502
|
}
|
|
591
|
-
/**
|
|
592
|
-
* First contact: log the issue title/body ahead of the comment so the
|
|
593
|
-
* session history starts with what the thread is about. The clone is
|
|
594
|
-
* (re)attempted on every trigger while ./repo is missing — a no-op once
|
|
595
|
-
* it exists — so a failed first clone (e.g. App permissions granted
|
|
596
|
-
* later) heals on the next mention instead of wedging the conversation.
|
|
597
|
-
*/
|
|
598
503
|
async prepareConversation(item, conversationId, participating) {
|
|
599
504
|
let isPrHint = item.isPr;
|
|
600
505
|
if (!participating && item.ts !== GITHUB_ISSUE_BODY_TS) {
|
|
601
506
|
const issue = await this.logIssueContext(item.ref, conversationId, item.createdAt);
|
|
602
|
-
// Only comments arrive without the PR-ness hint; review comments carry
|
|
603
|
-
// isPr: true (they only exist on PRs) and that knowledge is authoritative.
|
|
604
507
|
if (issue && isPrHint === undefined)
|
|
605
508
|
isPrHint = Boolean(issue.pull_request);
|
|
606
509
|
}
|
|
@@ -609,12 +512,6 @@ export class GithubMessagingBot {
|
|
|
609
512
|
await this.ensureRepoClone(item.ref, conversationId, isPr);
|
|
610
513
|
}
|
|
611
514
|
}
|
|
612
|
-
/**
|
|
613
|
-
* Decorates an inline review comment with its diff anchor and (for replies)
|
|
614
|
-
* the thread's earlier turns, so the agent knows which code the feedback is
|
|
615
|
-
* about without hunting through the PR. The rc-<id> in the header is what
|
|
616
|
-
* github_review_reply takes to answer in-thread.
|
|
617
|
-
*/
|
|
618
515
|
async formatReviewMessage(item, cleanedText) {
|
|
619
516
|
const review = item.review;
|
|
620
517
|
const location = review.line !== null ? `${review.path}:${review.line}` : review.path;
|
|
@@ -634,10 +531,6 @@ export class GithubMessagingBot {
|
|
|
634
531
|
parts.push(cleanedText);
|
|
635
532
|
return parts.join("\n");
|
|
636
533
|
}
|
|
637
|
-
/**
|
|
638
|
-
* Earlier turns of one review thread (root + replies before the trigger),
|
|
639
|
-
* newest-truncated. Fail-soft: context is a nicety, the trigger is not.
|
|
640
|
-
*/
|
|
641
534
|
async reviewThreadContext(ref, rootId, beforeId) {
|
|
642
535
|
try {
|
|
643
536
|
const all = await githubRetry(() => this.client.listPullReviewComments(ref.owner, ref.repo, ref.number));
|
|
@@ -665,10 +558,6 @@ export class GithubMessagingBot {
|
|
|
665
558
|
log.logWarning(`GitHub: could not fetch issue context for ${conversationId}`, err instanceof Error ? err.message : String(err));
|
|
666
559
|
return null;
|
|
667
560
|
}
|
|
668
|
-
// Dated just before the triggering comment, NOT issue.created_at: history
|
|
669
|
-
// sync date-sorts entries and drops anything older than its recency
|
|
670
|
-
// window, so an old issue's real creation date would silently evict the
|
|
671
|
-
// one message that says what the thread is about.
|
|
672
561
|
const triggerMs = Date.parse(triggerCreatedAt);
|
|
673
562
|
const contextDate = new Date((Number.isFinite(triggerMs) ? triggerMs : Date.now()) - 1000);
|
|
674
563
|
this.logToFile(conversationId, {
|
|
@@ -682,14 +571,6 @@ export class GithubMessagingBot {
|
|
|
682
571
|
});
|
|
683
572
|
return issue;
|
|
684
573
|
}
|
|
685
|
-
// ==========================================================================
|
|
686
|
-
// Repo clone
|
|
687
|
-
// ==========================================================================
|
|
688
|
-
/**
|
|
689
|
-
* Clone the conversation's repo into its dir (bind-mounted into the
|
|
690
|
-
* sandbox) using an ephemeral contents:read token that never leaves the
|
|
691
|
-
* host. Non-fatal: a failed clone degrades to the pre-clone experience.
|
|
692
|
-
*/
|
|
693
574
|
async ensureRepoClone(ref, conversationId, isPr) {
|
|
694
575
|
const office = this.office(conversationId);
|
|
695
576
|
const dir = conversationRepoDir(office);
|