lastlight 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -118
- package/agent-context/rules.md +62 -9
- package/agent-context/security.md +69 -0
- package/config/default.yaml +89 -0
- package/deploy/.env.production.example +20 -2
- package/deploy/entrypoint.sh +16 -17
- package/deploy/native/README.md +160 -0
- package/deploy/native/install.sh +110 -0
- package/deploy/native/lastlight.env.example +95 -0
- package/deploy/native/lastlight.service +50 -0
- package/deploy/sandbox-entrypoint.sh +59 -42
- package/dist/admin/auth.d.ts +1 -1
- package/dist/admin/auth.js +3 -1
- package/dist/admin/auth.js.map +1 -1
- package/dist/admin/chat-session-reader.d.ts +11 -14
- package/dist/admin/chat-session-reader.js +27 -51
- package/dist/admin/chat-session-reader.js.map +1 -1
- package/dist/admin/docker.d.ts +37 -0
- package/dist/admin/docker.js +86 -1
- package/dist/admin/docker.js.map +1 -1
- package/dist/admin/index.js +38 -3
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/log-search.test.d.ts +1 -0
- package/dist/admin/log-search.test.js +78 -0
- package/dist/admin/log-search.test.js.map +1 -0
- package/dist/admin/routes.d.ts +52 -3
- package/dist/admin/routes.js +780 -63
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/routes.test.js +680 -14
- package/dist/admin/routes.test.js.map +1 -1
- package/dist/admin/server-logs.test.d.ts +1 -0
- package/dist/admin/server-logs.test.js +58 -0
- package/dist/admin/server-logs.test.js.map +1 -0
- package/dist/admin/sessions.d.ts +26 -39
- package/dist/admin/sessions.js +86 -310
- package/dist/admin/sessions.js.map +1 -1
- package/dist/admin/sessions.test.d.ts +1 -0
- package/dist/admin/sessions.test.js +78 -0
- package/dist/admin/sessions.test.js.map +1 -0
- package/dist/admin/version.d.ts +15 -0
- package/dist/admin/version.js +73 -0
- package/dist/admin/version.js.map +1 -0
- package/dist/admin/version.test.d.ts +1 -0
- package/dist/admin/version.test.js +71 -0
- package/dist/admin/version.test.js.map +1 -0
- package/dist/cli-config.d.ts +55 -0
- package/dist/cli-config.js +119 -0
- package/dist/cli-config.js.map +1 -0
- package/dist/cli-config.test.d.ts +1 -0
- package/dist/cli-config.test.js +92 -0
- package/dist/cli-config.test.js.map +1 -0
- package/dist/cli-format.d.ts +19 -0
- package/dist/cli-format.js +107 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/cli-server.d.ts +73 -0
- package/dist/cli-server.js +347 -0
- package/dist/cli-server.js.map +1 -0
- package/dist/cli-server.test.d.ts +1 -0
- package/dist/cli-server.test.js +38 -0
- package/dist/cli-server.test.js.map +1 -0
- package/dist/cli-timeline.d.ts +35 -0
- package/dist/cli-timeline.js +373 -0
- package/dist/cli-timeline.js.map +1 -0
- package/dist/cli-timeline.test.d.ts +1 -0
- package/dist/cli-timeline.test.js +104 -0
- package/dist/cli-timeline.test.js.map +1 -0
- package/dist/cli.d.ts +0 -19
- package/dist/cli.js +910 -194
- package/dist/cli.js.map +1 -1
- package/dist/config-overlay.test.d.ts +1 -0
- package/dist/config-overlay.test.js +112 -0
- package/dist/config-overlay.test.js.map +1 -0
- package/dist/config-resolve.d.ts +28 -0
- package/dist/config-resolve.js +47 -0
- package/dist/config-resolve.js.map +1 -0
- package/dist/config-resolve.test.d.ts +1 -0
- package/dist/config-resolve.test.js +68 -0
- package/dist/config-resolve.test.js.map +1 -0
- package/dist/config.d.ts +62 -49
- package/dist/config.js +452 -76
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +201 -32
- package/dist/config.test.js.map +1 -1
- package/dist/connectors/github-webhook.js +83 -5
- package/dist/connectors/github-webhook.js.map +1 -1
- package/dist/connectors/github-webhook.test.d.ts +1 -0
- package/dist/connectors/github-webhook.test.js +156 -0
- package/dist/connectors/github-webhook.test.js.map +1 -0
- package/dist/connectors/messaging/session-manager.d.ts +18 -0
- package/dist/connectors/messaging/session-manager.js +83 -2
- package/dist/connectors/messaging/session-manager.js.map +1 -1
- package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
- package/dist/connectors/messaging/session-manager.test.js +144 -0
- package/dist/connectors/messaging/session-manager.test.js.map +1 -0
- package/dist/connectors/slack/connector.d.ts +9 -0
- package/dist/connectors/slack/connector.js +15 -0
- package/dist/connectors/slack/connector.js.map +1 -1
- package/dist/connectors/slack/mrkdwn.js +81 -0
- package/dist/connectors/slack/mrkdwn.js.map +1 -1
- package/dist/connectors/slack/mrkdwn.test.js +49 -0
- package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
- package/dist/connectors/types.d.ts +1 -1
- package/dist/cron/fanout.d.ts +33 -0
- package/dist/cron/fanout.js +55 -0
- package/dist/cron/fanout.js.map +1 -0
- package/dist/cron/fanout.test.d.ts +1 -0
- package/dist/cron/fanout.test.js +73 -0
- package/dist/cron/fanout.test.js.map +1 -0
- package/dist/cron/jobs.d.ts +5 -0
- package/dist/cron/jobs.js +10 -3
- package/dist/cron/jobs.js.map +1 -1
- package/dist/cron/scheduler.d.ts +12 -0
- package/dist/cron/scheduler.js +27 -1
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/engine/agent-executor.d.ts +158 -0
- package/dist/engine/agent-executor.js +1140 -0
- package/dist/engine/agent-executor.js.map +1 -0
- package/dist/engine/agent-executor.test.d.ts +1 -0
- package/dist/engine/agent-executor.test.js +395 -0
- package/dist/engine/agent-executor.test.js.map +1 -0
- package/dist/engine/chat-runner.d.ts +123 -0
- package/dist/engine/chat-runner.js +379 -0
- package/dist/engine/chat-runner.js.map +1 -0
- package/dist/engine/chat-runner.test.d.ts +1 -0
- package/dist/engine/chat-runner.test.js +104 -0
- package/dist/engine/chat-runner.test.js.map +1 -0
- package/dist/engine/chat-skills.d.ts +45 -0
- package/dist/engine/chat-skills.js +184 -0
- package/dist/engine/chat-skills.js.map +1 -0
- package/dist/engine/chat-skills.test.d.ts +1 -0
- package/dist/engine/chat-skills.test.js +20 -0
- package/dist/engine/chat-skills.test.js.map +1 -0
- package/dist/engine/chat.d.ts +20 -23
- package/dist/engine/chat.js +251 -155
- package/dist/engine/chat.js.map +1 -1
- package/dist/engine/chat.test.d.ts +1 -0
- package/dist/engine/chat.test.js +42 -0
- package/dist/engine/chat.test.js.map +1 -0
- package/dist/engine/classifier.d.ts +35 -2
- package/dist/engine/classifier.js +170 -31
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/classifier.test.d.ts +1 -0
- package/dist/engine/classifier.test.js +115 -0
- package/dist/engine/classifier.test.js.map +1 -0
- package/dist/engine/dispatcher.d.ts +60 -0
- package/dist/engine/dispatcher.js +601 -0
- package/dist/engine/dispatcher.js.map +1 -0
- package/dist/engine/dispatcher.test.d.ts +1 -0
- package/dist/engine/dispatcher.test.js +511 -0
- package/dist/engine/dispatcher.test.js.map +1 -0
- package/dist/engine/event-shim.d.ts +117 -0
- package/dist/engine/event-shim.js +435 -0
- package/dist/engine/event-shim.js.map +1 -0
- package/dist/engine/event-shim.test.d.ts +1 -0
- package/dist/engine/event-shim.test.js +194 -0
- package/dist/engine/event-shim.test.js.map +1 -0
- package/dist/engine/git-auth.d.ts +13 -17
- package/dist/engine/git-auth.js +99 -42
- package/dist/engine/git-auth.js.map +1 -1
- package/dist/engine/git-auth.test.d.ts +1 -0
- package/dist/engine/git-auth.test.js +117 -0
- package/dist/engine/git-auth.test.js.map +1 -0
- package/dist/engine/github-app-client.d.ts +7 -0
- package/dist/engine/github-app-client.js +16 -0
- package/dist/engine/github-app-client.js.map +1 -0
- package/dist/engine/github-app-client.test.d.ts +1 -0
- package/dist/engine/github-app-client.test.js +44 -0
- package/dist/engine/github-app-client.test.js.map +1 -0
- package/dist/engine/github-tools.d.ts +12 -0
- package/dist/engine/github-tools.js +261 -0
- package/dist/engine/github-tools.js.map +1 -0
- package/dist/engine/github.d.ts +1027 -43
- package/dist/engine/github.js +153 -14
- package/dist/engine/github.js.map +1 -1
- package/dist/engine/llm.d.ts +47 -0
- package/dist/engine/llm.js +221 -0
- package/dist/engine/llm.js.map +1 -0
- package/dist/engine/llm.test.d.ts +1 -0
- package/dist/engine/llm.test.js +189 -0
- package/dist/engine/llm.test.js.map +1 -0
- package/dist/engine/profiles.d.ts +249 -0
- package/dist/engine/profiles.js +42 -0
- package/dist/engine/profiles.js.map +1 -0
- package/dist/engine/router.d.ts +12 -6
- package/dist/engine/router.js +339 -81
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/router.test.js +428 -78
- package/dist/engine/router.test.js.map +1 -1
- package/dist/engine/screen.d.ts +41 -0
- package/dist/engine/screen.js +93 -0
- package/dist/engine/screen.js.map +1 -0
- package/dist/engine/screen.test.d.ts +1 -0
- package/dist/engine/screen.test.js +82 -0
- package/dist/engine/screen.test.js.map +1 -0
- package/dist/index.js +423 -437
- package/dist/index.js.map +1 -1
- package/dist/managed-repos.d.ts +7 -9
- package/dist/managed-repos.js +12 -15
- package/dist/managed-repos.js.map +1 -1
- package/dist/managed-repos.test.js +24 -19
- package/dist/managed-repos.test.js.map +1 -1
- package/dist/notify/index.d.ts +15 -0
- package/dist/notify/index.js +6 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/model.d.ts +57 -0
- package/dist/notify/model.js +89 -0
- package/dist/notify/model.js.map +1 -0
- package/dist/notify/model.test.d.ts +1 -0
- package/dist/notify/model.test.js +109 -0
- package/dist/notify/model.test.js.map +1 -0
- package/dist/notify/notifier.d.ts +17 -0
- package/dist/notify/notifier.js +87 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/notify/notifier.test.d.ts +1 -0
- package/dist/notify/notifier.test.js +100 -0
- package/dist/notify/notifier.test.js.map +1 -0
- package/dist/notify/render.d.ts +21 -0
- package/dist/notify/render.js +59 -0
- package/dist/notify/render.js.map +1 -0
- package/dist/notify/render.test.d.ts +1 -0
- package/dist/notify/render.test.js +65 -0
- package/dist/notify/render.test.js.map +1 -0
- package/dist/notify/transports/github.d.ts +26 -0
- package/dist/notify/transports/github.js +26 -0
- package/dist/notify/transports/github.js.map +1 -0
- package/dist/notify/transports/slack.d.ts +26 -0
- package/dist/notify/transports/slack.js +28 -0
- package/dist/notify/transports/slack.js.map +1 -0
- package/dist/notify/transports.test.d.ts +1 -0
- package/dist/notify/transports.test.js +71 -0
- package/dist/notify/transports.test.js.map +1 -0
- package/dist/notify/types.d.ts +95 -0
- package/dist/notify/types.js +16 -0
- package/dist/notify/types.js.map +1 -0
- package/dist/sandbox/docker-compose.test.d.ts +1 -0
- package/dist/sandbox/docker-compose.test.js +128 -0
- package/dist/sandbox/docker-compose.test.js.map +1 -0
- package/dist/sandbox/docker.d.ts +97 -9
- package/dist/sandbox/docker.js +192 -41
- package/dist/sandbox/docker.js.map +1 -1
- package/dist/sandbox/docker.test.d.ts +1 -0
- package/dist/sandbox/docker.test.js +137 -0
- package/dist/sandbox/docker.test.js.map +1 -0
- package/dist/sandbox/egress-allowlist.d.ts +69 -0
- package/dist/sandbox/egress-allowlist.js +164 -0
- package/dist/sandbox/egress-allowlist.js.map +1 -0
- package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
- package/dist/sandbox/egress-allowlist.test.js +65 -0
- package/dist/sandbox/egress-allowlist.test.js.map +1 -0
- package/dist/sandbox/egress-firewall-config.d.ts +127 -0
- package/dist/sandbox/egress-firewall-config.js +434 -0
- package/dist/sandbox/egress-firewall-config.js.map +1 -0
- package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
- package/dist/sandbox/egress-firewall-config.test.js +244 -0
- package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
- package/dist/sandbox/images.d.ts +23 -0
- package/dist/sandbox/images.js +55 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/index.d.ts +82 -3
- package/dist/sandbox/index.js +223 -93
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/index.test.d.ts +1 -0
- package/dist/sandbox/index.test.js +157 -0
- package/dist/sandbox/index.test.js.map +1 -0
- package/dist/session-log.d.ts +63 -0
- package/dist/session-log.js +290 -0
- package/dist/session-log.js.map +1 -0
- package/dist/session-log.test.d.ts +1 -0
- package/dist/session-log.test.js +85 -0
- package/dist/session-log.test.js.map +1 -0
- package/dist/setup.d.ts +31 -12
- package/dist/setup.js +516 -174
- package/dist/setup.js.map +1 -1
- package/dist/setup.test.js +138 -6
- package/dist/setup.test.js.map +1 -1
- package/dist/state/approval-store.d.ts +86 -0
- package/dist/state/approval-store.js +140 -0
- package/dist/state/approval-store.js.map +1 -0
- package/dist/state/build-assets.d.ts +50 -0
- package/dist/state/build-assets.js +154 -0
- package/dist/state/build-assets.js.map +1 -0
- package/dist/state/build-assets.test.d.ts +1 -0
- package/dist/state/build-assets.test.js +106 -0
- package/dist/state/build-assets.test.js.map +1 -0
- package/dist/state/db.d.ts +65 -333
- package/dist/state/db.js +112 -835
- package/dist/state/db.js.map +1 -1
- package/dist/state/db.test.js +127 -91
- package/dist/state/db.test.js.map +1 -1
- package/dist/state/execution-store.d.ts +257 -0
- package/dist/state/execution-store.js +527 -0
- package/dist/state/execution-store.js.map +1 -0
- package/dist/state/migrate.d.ts +15 -0
- package/dist/state/migrate.js +175 -0
- package/dist/state/migrate.js.map +1 -0
- package/dist/state/workflow-run-store.d.ts +195 -0
- package/dist/state/workflow-run-store.js +363 -0
- package/dist/state/workflow-run-store.js.map +1 -0
- package/dist/state/workflow-run-store.test.d.ts +1 -0
- package/dist/state/workflow-run-store.test.js +264 -0
- package/dist/state/workflow-run-store.test.js.map +1 -0
- package/dist/telemetry/index.d.ts +38 -0
- package/dist/telemetry/index.js +253 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/index.test.d.ts +1 -0
- package/dist/telemetry/index.test.js +73 -0
- package/dist/telemetry/index.test.js.map +1 -0
- package/dist/telemetry/pi-events.d.ts +12 -0
- package/dist/telemetry/pi-events.js +134 -0
- package/dist/telemetry/pi-events.js.map +1 -0
- package/dist/telemetry/pi-events.test.d.ts +1 -0
- package/dist/telemetry/pi-events.test.js +69 -0
- package/dist/telemetry/pi-events.test.js.map +1 -0
- package/dist/workflows/dag.d.ts +13 -1
- package/dist/workflows/dag.js +7 -3
- package/dist/workflows/dag.js.map +1 -1
- package/dist/workflows/dag.test.js +22 -0
- package/dist/workflows/dag.test.js.map +1 -1
- package/dist/workflows/golden-build.test.d.ts +1 -0
- package/dist/workflows/golden-build.test.js +45 -0
- package/dist/workflows/golden-build.test.js.map +1 -0
- package/dist/workflows/loader-overlay.test.d.ts +1 -0
- package/dist/workflows/loader-overlay.test.js +101 -0
- package/dist/workflows/loader-overlay.test.js.map +1 -0
- package/dist/workflows/loader.d.ts +36 -11
- package/dist/workflows/loader.js +311 -87
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loader.test.js +114 -10
- package/dist/workflows/loader.test.js.map +1 -1
- package/dist/workflows/loop-eval.js +2 -0
- package/dist/workflows/loop-eval.js.map +1 -1
- package/dist/workflows/loop-eval.test.js +14 -0
- package/dist/workflows/loop-eval.test.js.map +1 -1
- package/dist/workflows/phase-executor.d.ts +145 -0
- package/dist/workflows/phase-executor.js +691 -0
- package/dist/workflows/phase-executor.js.map +1 -0
- package/dist/workflows/phase-executor.test.d.ts +1 -0
- package/dist/workflows/phase-executor.test.js +434 -0
- package/dist/workflows/phase-executor.test.js.map +1 -0
- package/dist/workflows/phase-ref.d.ts +44 -0
- package/dist/workflows/phase-ref.js +78 -0
- package/dist/workflows/phase-ref.js.map +1 -0
- package/dist/workflows/phase-ref.test.d.ts +1 -0
- package/dist/workflows/phase-ref.test.js +24 -0
- package/dist/workflows/phase-ref.test.js.map +1 -0
- package/dist/workflows/resume.d.ts +5 -11
- package/dist/workflows/resume.js +88 -7
- package/dist/workflows/resume.js.map +1 -1
- package/dist/workflows/runner.d.ts +34 -27
- package/dist/workflows/runner.js +252 -930
- package/dist/workflows/runner.js.map +1 -1
- package/dist/workflows/runner.test.js +346 -35
- package/dist/workflows/runner.test.js.map +1 -1
- package/dist/workflows/schema.d.ts +52 -10
- package/dist/workflows/schema.js +147 -7
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/simple.d.ts +67 -3
- package/dist/workflows/simple.js +248 -87
- package/dist/workflows/simple.js.map +1 -1
- package/dist/workflows/simple.test.d.ts +1 -0
- package/dist/workflows/simple.test.js +107 -0
- package/dist/workflows/simple.test.js.map +1 -0
- package/dist/workflows/templates.d.ts +29 -0
- package/dist/workflows/templates.js +42 -4
- package/dist/workflows/templates.js.map +1 -1
- package/dist/workflows/templates.test.js +103 -0
- package/dist/workflows/templates.test.js.map +1 -1
- package/dist/workflows/triggers.d.ts +21 -0
- package/dist/workflows/triggers.js +44 -0
- package/dist/workflows/triggers.js.map +1 -0
- package/dist/workflows/verdict.d.ts +19 -0
- package/dist/workflows/verdict.js +30 -0
- package/dist/workflows/verdict.js.map +1 -0
- package/dist/workflows/verdict.test.d.ts +1 -0
- package/dist/workflows/verdict.test.js +44 -0
- package/dist/workflows/verdict.test.js.map +1 -0
- package/dist/worktree/manager.d.ts +1 -1
- package/dist/worktree/manager.js +14 -14
- package/dist/worktree/manager.js.map +1 -1
- package/dist/worktree/manager.test.d.ts +1 -0
- package/dist/worktree/manager.test.js +87 -0
- package/dist/worktree/manager.test.js.map +1 -0
- package/docker-compose.yml +206 -5
- package/package.json +19 -7
- package/sandbox.Dockerfile +97 -18
- package/skills/README.md +40 -0
- package/skills/browser-qa/SKILL.md +193 -0
- package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
- package/skills/building/SKILL.md +95 -0
- package/skills/chat/SKILL.md +30 -11
- package/skills/code-review/SKILL.md +59 -0
- package/skills/debug-production/SKILL.md +108 -0
- package/skills/demo/SKILL.md +194 -0
- package/skills/demo/scripts/compose-demo.sh +205 -0
- package/skills/issue-answer/SKILL.md +90 -0
- package/skills/issue-comment/SKILL.md +38 -24
- package/skills/issue-triage/SKILL.md +103 -37
- package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
- package/skills/pr-comment/SKILL.md +64 -0
- package/skills/pr-review/SKILL.md +65 -49
- package/skills/qa-test/SKILL.md +97 -0
- package/skills/repo-health/SKILL.md +48 -45
- package/skills/security-feedback/SKILL.md +173 -0
- package/skills/security-feedback/references/templates.md +77 -0
- package/skills/security-review/SKILL.md +213 -0
- package/skills/security-review/references/issue-format.md +302 -0
- package/skills/verify/SKILL.md +118 -0
- package/workflows/answer.yaml +37 -0
- package/workflows/build.yaml +32 -22
- package/workflows/cron-security.yaml +6 -0
- package/workflows/demo.yaml +55 -0
- package/workflows/explore.yaml +9 -0
- package/workflows/pr-comment.yaml +16 -0
- package/workflows/pr-fix.yaml +3 -0
- package/workflows/pr-review.yaml +4 -1
- package/workflows/prompts/answer.md +67 -0
- package/workflows/prompts/architect.md +24 -7
- package/workflows/prompts/demo.md +100 -0
- package/workflows/prompts/executor.md +29 -20
- package/workflows/prompts/explore-ask.md +51 -22
- package/workflows/prompts/explore-publish.md +2 -2
- package/workflows/prompts/explore-read.md +24 -10
- package/workflows/prompts/explore-synthesize.md +15 -8
- package/workflows/prompts/fix.md +9 -10
- package/workflows/prompts/guardrails.md +26 -8
- package/workflows/prompts/pr-fix.md +6 -7
- package/workflows/prompts/pr.md +11 -10
- package/workflows/prompts/qa-browser.md +95 -0
- package/workflows/prompts/qa-synth.md +44 -0
- package/workflows/prompts/qa-test.md +60 -0
- package/workflows/prompts/re-reviewer.md +8 -9
- package/workflows/prompts/reviewer.md +10 -9
- package/workflows/prompts/verify-browser.md +93 -0
- package/workflows/prompts/verify-synth.md +44 -0
- package/workflows/prompts/verify.md +63 -0
- package/workflows/qa-test.yaml +87 -0
- package/workflows/security-feedback.yaml +25 -0
- package/workflows/security-review.yaml +29 -0
- package/workflows/verify.yaml +85 -0
- package/deploy/mcp-config.tmpl.json +0 -14
- package/dist/cron/rate-limits.d.ts +0 -26
- package/dist/cron/rate-limits.js +0 -193
- package/dist/cron/rate-limits.js.map +0 -1
- package/dist/engine/executor.d.ts +0 -75
- package/dist/engine/executor.js +0 -292
- package/dist/engine/executor.js.map +0 -1
- package/mcp-github-app/package.json +0 -18
- package/mcp-github-app/src/auth.js +0 -66
- package/mcp-github-app/src/github.js +0 -371
- package/mcp-github-app/src/index.js +0 -534
- package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
- package/skills/github/DESCRIPTION.md +0 -3
- package/skills/github/codebase-inspection/SKILL.md +0 -115
- package/skills/github/github-auth/SKILL.md +0 -54
- package/skills/github/github-auth/scripts/gh-env.sh +0 -66
- package/skills/github/github-code-review/SKILL.md +0 -480
- package/skills/github/github-code-review/references/review-output-template.md +0 -74
- package/skills/github/github-issues/SKILL.md +0 -369
- package/skills/github/github-issues/templates/bug-report.md +0 -35
- package/skills/github/github-issues/templates/feature-request.md +0 -31
- package/skills/github/github-pr-workflow/SKILL.md +0 -395
- package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
- package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
- package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
- package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
- package/skills/github/github-repo-management/SKILL.md +0 -515
- package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
- package/skills/github-orchestrator/SKILL.md +0 -103
- package/skills/mcp/DESCRIPTION.md +0 -3
- package/skills/mcp/mcporter/SKILL.md +0 -122
- package/skills/mcp/native-mcp/SKILL.md +0 -356
- package/skills/software-development/architect/SKILL.md +0 -154
- package/skills/software-development/assure-guardrails/SKILL.md +0 -239
- package/skills/software-development/plan/SKILL.md +0 -64
- package/skills/software-development/requesting-code-review/SKILL.md +0 -291
- package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
- package/skills/software-development/systematic-debugging/SKILL.md +0 -366
- package/skills/software-development/test-driven-development/SKILL.md +0 -342
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { createHmac } from "crypto";
|
|
3
|
+
import { GitHubWebhookConnector } from "./github-webhook.js";
|
|
4
|
+
import { setRuntimeConfig, resetRuntimeConfigForTests, } from "../config.js";
|
|
5
|
+
const SECRET = "test-webhook-secret";
|
|
6
|
+
const BOT_LOGIN = "last-light[bot]";
|
|
7
|
+
const REPO = "acme/widgets";
|
|
8
|
+
function sign(body) {
|
|
9
|
+
return "sha256=" + createHmac("sha256", SECRET).update(body).digest("hex");
|
|
10
|
+
}
|
|
11
|
+
function connector() {
|
|
12
|
+
return new GitHubWebhookConnector({
|
|
13
|
+
port: 0,
|
|
14
|
+
webhookSecret: SECRET,
|
|
15
|
+
botLogin: BOT_LOGIN,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** POST a signed `pull_request` webhook and return the parsed JSON response. */
|
|
19
|
+
async function postPullRequest(conn, opts) {
|
|
20
|
+
const payload = {
|
|
21
|
+
action: opts.action,
|
|
22
|
+
repository: { full_name: REPO },
|
|
23
|
+
sender: { login: opts.senderLogin, type: opts.senderLogin.endsWith("[bot]") ? "Bot" : "User" },
|
|
24
|
+
pull_request: {
|
|
25
|
+
number: 109,
|
|
26
|
+
title: "Some change",
|
|
27
|
+
body: "",
|
|
28
|
+
labels: [],
|
|
29
|
+
user: { login: opts.authorLogin },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const body = JSON.stringify(payload);
|
|
33
|
+
const res = await conn.honoApp.request("/webhooks/github", {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: {
|
|
36
|
+
"x-hub-signature-256": sign(body),
|
|
37
|
+
"x-github-event": "pull_request",
|
|
38
|
+
"x-github-delivery": "test-delivery",
|
|
39
|
+
"content-type": "application/json",
|
|
40
|
+
},
|
|
41
|
+
body,
|
|
42
|
+
});
|
|
43
|
+
return { status: res.status, json: await res.json() };
|
|
44
|
+
}
|
|
45
|
+
describe("GitHubWebhookConnector — self-review guard", () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
setRuntimeConfig({ managedRepos: [REPO] });
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => resetRuntimeConfigForTests());
|
|
50
|
+
it("drops a PR the bot itself authored (opened)", async () => {
|
|
51
|
+
const { json } = await postPullRequest(connector(), {
|
|
52
|
+
action: "opened",
|
|
53
|
+
authorLogin: BOT_LOGIN,
|
|
54
|
+
senderLogin: BOT_LOGIN,
|
|
55
|
+
});
|
|
56
|
+
expect(json.filtered).toBe(true);
|
|
57
|
+
expect(json.reason).toBe("bot-authored PR (self-review)");
|
|
58
|
+
});
|
|
59
|
+
it("drops a bot-authored PR on synchronize too", async () => {
|
|
60
|
+
const { json } = await postPullRequest(connector(), {
|
|
61
|
+
action: "synchronize",
|
|
62
|
+
authorLogin: BOT_LOGIN,
|
|
63
|
+
senderLogin: BOT_LOGIN,
|
|
64
|
+
});
|
|
65
|
+
expect(json.filtered).toBe(true);
|
|
66
|
+
expect(json.reason).toBe("bot-authored PR (self-review)");
|
|
67
|
+
});
|
|
68
|
+
it("accepts a bot fix-commit (synchronize) on a HUMAN-authored PR — the re-review case", async () => {
|
|
69
|
+
// sender is the bot (it pushed the fix), but the PR author is a human:
|
|
70
|
+
// this must still flow through so branch protection gets a check on the
|
|
71
|
+
// new head SHA. The author-based guard must NOT fire here.
|
|
72
|
+
const { status, json } = await postPullRequest(connector(), {
|
|
73
|
+
action: "synchronize",
|
|
74
|
+
authorLogin: "a-human",
|
|
75
|
+
senderLogin: BOT_LOGIN,
|
|
76
|
+
});
|
|
77
|
+
expect(status).toBe(202);
|
|
78
|
+
expect(json.accepted).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
it("accepts a normal human-authored PR (opened)", async () => {
|
|
81
|
+
const { status, json } = await postPullRequest(connector(), {
|
|
82
|
+
action: "opened",
|
|
83
|
+
authorLogin: "a-human",
|
|
84
|
+
senderLogin: "a-human",
|
|
85
|
+
});
|
|
86
|
+
expect(status).toBe(202);
|
|
87
|
+
expect(json.accepted).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
/** POST a signed check_run/check_suite event; capture any emitted envelope. */
|
|
91
|
+
async function postCheckEvent(conn, event, opts) {
|
|
92
|
+
let emitted = null;
|
|
93
|
+
conn.on("event", (e) => { emitted = e; });
|
|
94
|
+
const prs = opts.prNumber ? [{ number: opts.prNumber, head: { ref: "feature" } }] : [];
|
|
95
|
+
const payload = {
|
|
96
|
+
action: opts.action,
|
|
97
|
+
repository: { full_name: REPO },
|
|
98
|
+
sender: { login: "a-human", type: "User" },
|
|
99
|
+
[event]: { id: 1, head_sha: "abc123", pull_requests: prs },
|
|
100
|
+
};
|
|
101
|
+
const body = JSON.stringify(payload);
|
|
102
|
+
const res = await conn.honoApp.request("/webhooks/github", {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: {
|
|
105
|
+
"x-hub-signature-256": sign(body),
|
|
106
|
+
"x-github-event": event,
|
|
107
|
+
"x-github-delivery": "test-delivery",
|
|
108
|
+
"content-type": "application/json",
|
|
109
|
+
},
|
|
110
|
+
body,
|
|
111
|
+
});
|
|
112
|
+
const json = await res.json();
|
|
113
|
+
// emission is scheduled via setImmediate — let it flush
|
|
114
|
+
await new Promise((r) => setImmediate(r));
|
|
115
|
+
return { status: res.status, json, emitted };
|
|
116
|
+
}
|
|
117
|
+
describe("GitHubWebhookConnector — re-run checks", () => {
|
|
118
|
+
beforeEach(() => {
|
|
119
|
+
setRuntimeConfig({ managedRepos: [REPO] });
|
|
120
|
+
});
|
|
121
|
+
afterEach(() => resetRuntimeConfigForTests());
|
|
122
|
+
it("maps check_run.rerequested to a pr.synchronize for the associated PR", async () => {
|
|
123
|
+
const { status, emitted } = await postCheckEvent(connector(), "check_run", {
|
|
124
|
+
action: "rerequested",
|
|
125
|
+
prNumber: 42,
|
|
126
|
+
});
|
|
127
|
+
expect(status).toBe(202);
|
|
128
|
+
expect(emitted).not.toBeNull();
|
|
129
|
+
expect(emitted.type).toBe("pr.synchronize");
|
|
130
|
+
expect(emitted.prNumber).toBe(42);
|
|
131
|
+
});
|
|
132
|
+
it("maps check_suite.rerequested to a pr.synchronize", async () => {
|
|
133
|
+
const { emitted } = await postCheckEvent(connector(), "check_suite", {
|
|
134
|
+
action: "rerequested",
|
|
135
|
+
prNumber: 7,
|
|
136
|
+
});
|
|
137
|
+
expect(emitted?.type).toBe("pr.synchronize");
|
|
138
|
+
expect(emitted?.prNumber).toBe(7);
|
|
139
|
+
});
|
|
140
|
+
it("ignores check_run.completed (only re-runs should trigger)", async () => {
|
|
141
|
+
const { json, emitted } = await postCheckEvent(connector(), "check_run", {
|
|
142
|
+
action: "completed",
|
|
143
|
+
prNumber: 42,
|
|
144
|
+
});
|
|
145
|
+
expect(json.filtered).toBe(true);
|
|
146
|
+
expect(emitted).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
it("ignores a rerequested check_run with no associated PR", async () => {
|
|
149
|
+
const { json, emitted } = await postCheckEvent(connector(), "check_run", {
|
|
150
|
+
action: "rerequested",
|
|
151
|
+
});
|
|
152
|
+
expect(json.filtered).toBe(true);
|
|
153
|
+
expect(emitted).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=github-webhook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-webhook.test.js","sourceRoot":"","sources":["../../src/connectors/github-webhook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,24 @@ export declare class SessionManager {
|
|
|
8
8
|
private db;
|
|
9
9
|
constructor(db: Database.Database);
|
|
10
10
|
private migrate;
|
|
11
|
+
/**
|
|
12
|
+
* One-shot migration: copy `messaging_sessions` rows into a table
|
|
13
|
+
* without the table-level UNIQUE constraint. `messaging_messages.session_id`
|
|
14
|
+
* has a foreign key to this table, so `DROP TABLE messaging_sessions`
|
|
15
|
+
* trips FK enforcement.
|
|
16
|
+
*
|
|
17
|
+
* Follows SQLite's official table-rebuild recipe
|
|
18
|
+
* (https://www.sqlite.org/lang_altertable.html#otheralter): toggle
|
|
19
|
+
* `foreign_keys` OFF *outside* a transaction, do the rebuild, run
|
|
20
|
+
* `foreign_key_check` to confirm no orphans, COMMIT, re-enable.
|
|
21
|
+
* `defer_foreign_keys` isn't enough — it pushes the check to COMMIT but
|
|
22
|
+
* still fails when the schema flux at rename-time is observed.
|
|
23
|
+
*
|
|
24
|
+
* `foreign_key_check` after the rebuild is belt-and-suspenders: if the
|
|
25
|
+
* copy somehow missed rows the messages reference, fail the migration
|
|
26
|
+
* loudly rather than commit a half-broken schema.
|
|
27
|
+
*/
|
|
28
|
+
private rebuildWithoutTableUnique;
|
|
11
29
|
/** Look up an existing session by id (used to read its agent_session_id). */
|
|
12
30
|
getSession(id: string): ConversationSession | null;
|
|
13
31
|
/** Get an existing active session or create a new one */
|
|
@@ -23,8 +23,7 @@ export class SessionManager {
|
|
|
23
23
|
created_at TEXT NOT NULL,
|
|
24
24
|
last_activity_at TEXT NOT NULL,
|
|
25
25
|
message_count INTEGER DEFAULT 0,
|
|
26
|
-
active INTEGER DEFAULT 1
|
|
27
|
-
UNIQUE(platform, channel_id, thread_id, user_id)
|
|
26
|
+
active INTEGER DEFAULT 1
|
|
28
27
|
);
|
|
29
28
|
|
|
30
29
|
CREATE TABLE IF NOT EXISTS messaging_messages (
|
|
@@ -41,6 +40,88 @@ export class SessionManager {
|
|
|
41
40
|
CREATE INDEX IF NOT EXISTS idx_msg_messages_session
|
|
42
41
|
ON messaging_messages(session_id, timestamp);
|
|
43
42
|
`);
|
|
43
|
+
// Older versions of this code put an unconditional
|
|
44
|
+
// `UNIQUE(platform, channel_id, thread_id, user_id)` on the table.
|
|
45
|
+
// That collides with the get-or-create flow: a stale (active=0) row
|
|
46
|
+
// for a returning user/thread would block the INSERT of a fresh
|
|
47
|
+
// session. Replace it with a partial unique index that only enforces
|
|
48
|
+
// the "one active session per key" invariant — the actually-desired
|
|
49
|
+
// semantic. Inactive rows from past sessions are allowed to pile up
|
|
50
|
+
// (deleted later by clearStale).
|
|
51
|
+
const tableSql = this.db
|
|
52
|
+
.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='messaging_sessions'`)
|
|
53
|
+
.get()?.sql ?? "";
|
|
54
|
+
if (tableSql.includes("UNIQUE(platform")) {
|
|
55
|
+
this.rebuildWithoutTableUnique();
|
|
56
|
+
}
|
|
57
|
+
this.db.exec(`
|
|
58
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_msg_sessions_unique_active
|
|
59
|
+
ON messaging_sessions(platform, channel_id, thread_id, user_id)
|
|
60
|
+
WHERE active = 1
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* One-shot migration: copy `messaging_sessions` rows into a table
|
|
65
|
+
* without the table-level UNIQUE constraint. `messaging_messages.session_id`
|
|
66
|
+
* has a foreign key to this table, so `DROP TABLE messaging_sessions`
|
|
67
|
+
* trips FK enforcement.
|
|
68
|
+
*
|
|
69
|
+
* Follows SQLite's official table-rebuild recipe
|
|
70
|
+
* (https://www.sqlite.org/lang_altertable.html#otheralter): toggle
|
|
71
|
+
* `foreign_keys` OFF *outside* a transaction, do the rebuild, run
|
|
72
|
+
* `foreign_key_check` to confirm no orphans, COMMIT, re-enable.
|
|
73
|
+
* `defer_foreign_keys` isn't enough — it pushes the check to COMMIT but
|
|
74
|
+
* still fails when the schema flux at rename-time is observed.
|
|
75
|
+
*
|
|
76
|
+
* `foreign_key_check` after the rebuild is belt-and-suspenders: if the
|
|
77
|
+
* copy somehow missed rows the messages reference, fail the migration
|
|
78
|
+
* loudly rather than commit a half-broken schema.
|
|
79
|
+
*/
|
|
80
|
+
rebuildWithoutTableUnique() {
|
|
81
|
+
console.log("[messaging] migrating messaging_sessions: dropping unconditional UNIQUE constraint");
|
|
82
|
+
const fkOriginal = this.db.pragma("foreign_keys", { simple: true });
|
|
83
|
+
this.db.pragma("foreign_keys = OFF");
|
|
84
|
+
try {
|
|
85
|
+
this.db.exec("BEGIN");
|
|
86
|
+
try {
|
|
87
|
+
this.db.exec(`
|
|
88
|
+
CREATE TABLE messaging_sessions__new (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
platform TEXT NOT NULL,
|
|
91
|
+
channel_id TEXT NOT NULL,
|
|
92
|
+
thread_id TEXT,
|
|
93
|
+
user_id TEXT NOT NULL,
|
|
94
|
+
agent_session_id TEXT,
|
|
95
|
+
created_at TEXT NOT NULL,
|
|
96
|
+
last_activity_at TEXT NOT NULL,
|
|
97
|
+
message_count INTEGER DEFAULT 0,
|
|
98
|
+
active INTEGER DEFAULT 1
|
|
99
|
+
);
|
|
100
|
+
INSERT INTO messaging_sessions__new
|
|
101
|
+
SELECT id, platform, channel_id, thread_id, user_id, agent_session_id,
|
|
102
|
+
created_at, last_activity_at, message_count, active
|
|
103
|
+
FROM messaging_sessions;
|
|
104
|
+
DROP TABLE messaging_sessions;
|
|
105
|
+
ALTER TABLE messaging_sessions__new RENAME TO messaging_sessions;
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_msg_sessions_lookup
|
|
107
|
+
ON messaging_sessions(platform, channel_id, thread_id, user_id);
|
|
108
|
+
`);
|
|
109
|
+
const violations = this.db.pragma("foreign_key_check");
|
|
110
|
+
if (violations.length > 0) {
|
|
111
|
+
throw new Error(`FK check failed after migration — ${violations.length} dangling reference(s): ` +
|
|
112
|
+
JSON.stringify(violations));
|
|
113
|
+
}
|
|
114
|
+
this.db.exec("COMMIT");
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
this.db.exec("ROLLBACK");
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
if (fkOriginal)
|
|
123
|
+
this.db.pragma("foreign_keys = ON");
|
|
124
|
+
}
|
|
44
125
|
}
|
|
45
126
|
/** Look up an existing session by id (used to read its agent_session_id). */
|
|
46
127
|
getSession(id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/connectors/messaging/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,EAAE,CAAoB;IAE9B,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/connectors/messaging/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import { SessionManager } from "./session-manager.js";
|
|
4
|
+
const KEY = {
|
|
5
|
+
platform: "slack",
|
|
6
|
+
channelId: "C123",
|
|
7
|
+
threadId: "thread-1",
|
|
8
|
+
userId: "U999",
|
|
9
|
+
};
|
|
10
|
+
describe("SessionManager", () => {
|
|
11
|
+
let db;
|
|
12
|
+
let manager;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
db = new Database(":memory:");
|
|
15
|
+
manager = new SessionManager(db);
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
db.close();
|
|
19
|
+
});
|
|
20
|
+
it("returns the same active session for the same key", () => {
|
|
21
|
+
const a = manager.getOrCreateSession(KEY);
|
|
22
|
+
const b = manager.getOrCreateSession(KEY);
|
|
23
|
+
expect(b.id).toBe(a.id);
|
|
24
|
+
expect(b.active).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it("creates a new session after the old one is deactivated", () => {
|
|
27
|
+
const a = manager.getOrCreateSession(KEY);
|
|
28
|
+
manager.deactivateSession(a.id);
|
|
29
|
+
const b = manager.getOrCreateSession(KEY);
|
|
30
|
+
expect(b.id).not.toBe(a.id);
|
|
31
|
+
expect(b.active).toBe(true);
|
|
32
|
+
// The old row should still exist (audit trail), just inactive — the
|
|
33
|
+
// partial unique index only forbids two ACTIVE rows for the same key.
|
|
34
|
+
const rows = db.prepare(`
|
|
35
|
+
SELECT id, active FROM messaging_sessions
|
|
36
|
+
WHERE platform = ? AND channel_id = ? AND thread_id = ? AND user_id = ?
|
|
37
|
+
ORDER BY created_at
|
|
38
|
+
`).all(KEY.platform, KEY.channelId, KEY.threadId, KEY.userId);
|
|
39
|
+
expect(rows).toHaveLength(2);
|
|
40
|
+
expect(rows.map((r) => r.active).sort()).toEqual([0, 1]);
|
|
41
|
+
});
|
|
42
|
+
it("migrates a legacy schema with FK-referencing messages without dropping them", () => {
|
|
43
|
+
// Reproduces the production crash: a DB carrying messaging_messages
|
|
44
|
+
// rows that point at messaging_sessions via FK fails DROP TABLE
|
|
45
|
+
// unless FK enforcement is deferred.
|
|
46
|
+
const legacy = new Database(":memory:");
|
|
47
|
+
legacy.pragma("foreign_keys = ON");
|
|
48
|
+
legacy.exec(`
|
|
49
|
+
CREATE TABLE messaging_sessions (
|
|
50
|
+
id TEXT PRIMARY KEY,
|
|
51
|
+
platform TEXT NOT NULL,
|
|
52
|
+
channel_id TEXT NOT NULL,
|
|
53
|
+
thread_id TEXT,
|
|
54
|
+
user_id TEXT NOT NULL,
|
|
55
|
+
agent_session_id TEXT,
|
|
56
|
+
created_at TEXT NOT NULL,
|
|
57
|
+
last_activity_at TEXT NOT NULL,
|
|
58
|
+
message_count INTEGER DEFAULT 0,
|
|
59
|
+
active INTEGER DEFAULT 1,
|
|
60
|
+
UNIQUE(platform, channel_id, thread_id, user_id)
|
|
61
|
+
);
|
|
62
|
+
CREATE TABLE messaging_messages (
|
|
63
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
64
|
+
session_id TEXT NOT NULL REFERENCES messaging_sessions(id),
|
|
65
|
+
role TEXT NOT NULL,
|
|
66
|
+
content TEXT NOT NULL,
|
|
67
|
+
timestamp TEXT NOT NULL,
|
|
68
|
+
platform_message_id TEXT
|
|
69
|
+
);
|
|
70
|
+
INSERT INTO messaging_sessions
|
|
71
|
+
(id, platform, channel_id, thread_id, user_id, created_at, last_activity_at, active)
|
|
72
|
+
VALUES ('sess-1', 'slack', 'C123', 't1', 'U1', '2026-01-01T00:00:00Z', '2026-01-01T00:00:00Z', 1);
|
|
73
|
+
INSERT INTO messaging_messages (session_id, role, content, timestamp)
|
|
74
|
+
VALUES ('sess-1', 'user', 'hi', '2026-01-01T00:00:01Z'),
|
|
75
|
+
('sess-1', 'assistant', 'hi back', '2026-01-01T00:00:02Z');
|
|
76
|
+
`);
|
|
77
|
+
// Migration should succeed without losing the FK-referenced rows.
|
|
78
|
+
new SessionManager(legacy);
|
|
79
|
+
const survivingMessages = legacy.prepare(`SELECT COUNT(*) AS n FROM messaging_messages WHERE session_id = 'sess-1'`).get();
|
|
80
|
+
expect(survivingMessages.n).toBe(2);
|
|
81
|
+
const survivingSession = legacy.prepare(`SELECT id FROM messaging_sessions WHERE id = 'sess-1'`).get();
|
|
82
|
+
expect(survivingSession).toBeDefined();
|
|
83
|
+
// And the FK is still enforced post-migration.
|
|
84
|
+
expect(() => legacy.prepare(`
|
|
85
|
+
INSERT INTO messaging_messages (session_id, role, content, timestamp)
|
|
86
|
+
VALUES (?, ?, ?, ?)
|
|
87
|
+
`).run("does-not-exist", "user", "x", "2026-01-01T00:00:03Z"))
|
|
88
|
+
.toThrow(/FOREIGN KEY/);
|
|
89
|
+
legacy.close();
|
|
90
|
+
});
|
|
91
|
+
it("migrates a legacy table that has the old unconditional UNIQUE constraint", () => {
|
|
92
|
+
// Spin up a DB pre-loaded with the old schema, then run the manager
|
|
93
|
+
// (which runs migrate()) and verify a fresh insert no longer collides.
|
|
94
|
+
const legacy = new Database(":memory:");
|
|
95
|
+
legacy.exec(`
|
|
96
|
+
CREATE TABLE messaging_sessions (
|
|
97
|
+
id TEXT PRIMARY KEY,
|
|
98
|
+
platform TEXT NOT NULL,
|
|
99
|
+
channel_id TEXT NOT NULL,
|
|
100
|
+
thread_id TEXT,
|
|
101
|
+
user_id TEXT NOT NULL,
|
|
102
|
+
agent_session_id TEXT,
|
|
103
|
+
created_at TEXT NOT NULL,
|
|
104
|
+
last_activity_at TEXT NOT NULL,
|
|
105
|
+
message_count INTEGER DEFAULT 0,
|
|
106
|
+
active INTEGER DEFAULT 1,
|
|
107
|
+
UNIQUE(platform, channel_id, thread_id, user_id)
|
|
108
|
+
);
|
|
109
|
+
INSERT INTO messaging_sessions
|
|
110
|
+
(id, platform, channel_id, thread_id, user_id, created_at, last_activity_at, active)
|
|
111
|
+
VALUES
|
|
112
|
+
('old-1', 'slack', 'C123', 'thread-1', 'U999', '2026-01-01T00:00:00Z', '2026-01-01T00:00:00Z', 0);
|
|
113
|
+
`);
|
|
114
|
+
// Sanity check: the legacy schema *would* reject a second insert.
|
|
115
|
+
expect(() => legacy.prepare(`
|
|
116
|
+
INSERT INTO messaging_sessions
|
|
117
|
+
(id, platform, channel_id, thread_id, user_id, created_at, last_activity_at)
|
|
118
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
119
|
+
`).run("dup", "slack", "C123", "thread-1", "U999", "2026-01-01T00:00:00Z", "2026-01-01T00:00:00Z"))
|
|
120
|
+
.toThrow(/UNIQUE/);
|
|
121
|
+
// Run the migration via a fresh SessionManager on the same DB.
|
|
122
|
+
const migrated = new SessionManager(legacy);
|
|
123
|
+
// The old row survives the migration.
|
|
124
|
+
const oldRow = legacy.prepare(`SELECT id FROM messaging_sessions WHERE id = 'old-1'`).get();
|
|
125
|
+
expect(oldRow).toBeDefined();
|
|
126
|
+
// And get-or-create now succeeds — old (active=0) row no longer blocks insert.
|
|
127
|
+
const fresh = migrated.getOrCreateSession(KEY);
|
|
128
|
+
expect(fresh.id).not.toBe("old-1");
|
|
129
|
+
expect(fresh.active).toBe(true);
|
|
130
|
+
legacy.close();
|
|
131
|
+
});
|
|
132
|
+
it("partial unique index still prevents two active rows for the same key", () => {
|
|
133
|
+
const a = manager.getOrCreateSession(KEY);
|
|
134
|
+
expect(a.active).toBe(true);
|
|
135
|
+
// Directly insert a second active row — should fail the partial index.
|
|
136
|
+
expect(() => db.prepare(`
|
|
137
|
+
INSERT INTO messaging_sessions
|
|
138
|
+
(id, platform, channel_id, thread_id, user_id, created_at, last_activity_at, active)
|
|
139
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 1)
|
|
140
|
+
`).run("dup", KEY.platform, KEY.channelId, KEY.threadId, KEY.userId, "2026-01-01T00:00:00Z", "2026-01-01T00:00:00Z"))
|
|
141
|
+
.toThrow(/UNIQUE/);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=session-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../../src/connectors/messaging/session-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,15 @@ export declare class SlackConnector extends MessagingConnector {
|
|
|
26
26
|
start(): Promise<void>;
|
|
27
27
|
stop(): Promise<void>;
|
|
28
28
|
sendMessage(channelId: string, threadId: string | null, text: string): Promise<string | void>;
|
|
29
|
+
/**
|
|
30
|
+
* Edit a previously-sent message in place (`chat.update`). Paired with the
|
|
31
|
+
* `ts` returned by `sendMessage`, this powers the single in-place status
|
|
32
|
+
* checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
|
|
33
|
+
* updates one message instead of flooding the thread. Note: `chat.update` is
|
|
34
|
+
* silent — it does not re-notify — so a separate terminal message is posted
|
|
35
|
+
* at the end for an actual ping.
|
|
36
|
+
*/
|
|
37
|
+
updateMessage(channelId: string, ts: string, text: string): Promise<void>;
|
|
29
38
|
addReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
|
|
30
39
|
showTyping(channelId: string, messageId: string, threadRootId: string): Promise<void>;
|
|
31
40
|
/** Clear the thinking status after processing completes */
|
|
@@ -53,6 +53,21 @@ export class SlackConnector extends MessagingConnector {
|
|
|
53
53
|
});
|
|
54
54
|
return result.ts;
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Edit a previously-sent message in place (`chat.update`). Paired with the
|
|
58
|
+
* `ts` returned by `sendMessage`, this powers the single in-place status
|
|
59
|
+
* checklist (see `src/notify/transports/slack.ts`) so a workflow's progress
|
|
60
|
+
* updates one message instead of flooding the thread. Note: `chat.update` is
|
|
61
|
+
* silent — it does not re-notify — so a separate terminal message is posted
|
|
62
|
+
* at the end for an actual ping.
|
|
63
|
+
*/
|
|
64
|
+
async updateMessage(channelId, ts, text) {
|
|
65
|
+
await this.app.client.chat.update({
|
|
66
|
+
channel: channelId,
|
|
67
|
+
ts,
|
|
68
|
+
text: markdownToSlackMrkdwn(text),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
56
71
|
async addReaction(channelId, messageId, emoji) {
|
|
57
72
|
try {
|
|
58
73
|
await this.app.client.reactions.add({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,80 @@
|
|
|
1
|
+
/** A line of dashes/colons separating a GFM table header from its body. */
|
|
2
|
+
const TABLE_DELIMITER = /^\s*\|?\s*:?-{1,}:?\s*(?:\|\s*:?-{1,}:?\s*)*\|?\s*$/;
|
|
3
|
+
/** A candidate table row — contains at least one unescaped pipe. */
|
|
4
|
+
function isTableRow(line) {
|
|
5
|
+
return line.includes("|") && line.trim() !== "";
|
|
6
|
+
}
|
|
7
|
+
/** Strip leading/trailing pipes and split a GFM row into trimmed cells. */
|
|
8
|
+
function splitTableCells(line) {
|
|
9
|
+
return line
|
|
10
|
+
.trim()
|
|
11
|
+
.replace(/^\||\|$/g, "")
|
|
12
|
+
.split("|")
|
|
13
|
+
.map((c) => c.trim());
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reduce inline markdown inside a table cell to plain text — the table is
|
|
17
|
+
* rendered in a monospace code block where `*`, `_`, backticks and link
|
|
18
|
+
* syntax wouldn't render, so they'd just be noise.
|
|
19
|
+
*/
|
|
20
|
+
function plainCell(cell) {
|
|
21
|
+
return cell
|
|
22
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, "$1 ($2)") // [text](url) → text (url)
|
|
23
|
+
.replace(/\*\*(.+?)\*\*/g, "$1")
|
|
24
|
+
.replace(/__(.+?)__/g, "$1")
|
|
25
|
+
.replace(/~~(.+?)~~/g, "$1")
|
|
26
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
27
|
+
.replace(/\*(.+?)\*/g, "$1");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Render a GFM table block (header row, delimiter row, then data rows) as an
|
|
31
|
+
* aligned monospace code block. Slack has no table mrkdwn, so a raw GFM table
|
|
32
|
+
* shows as a wall of pipes; a fixed-width block keeps columns legible.
|
|
33
|
+
*/
|
|
34
|
+
function renderSlackTable(block) {
|
|
35
|
+
// Drop the delimiter row (index 1); keep header + data.
|
|
36
|
+
const rows = block
|
|
37
|
+
.filter((_, idx) => idx !== 1)
|
|
38
|
+
.map((line) => splitTableCells(line).map(plainCell));
|
|
39
|
+
const colCount = Math.max(...rows.map((r) => r.length));
|
|
40
|
+
const widths = [];
|
|
41
|
+
for (let c = 0; c < colCount; c++) {
|
|
42
|
+
widths[c] = Math.max(...rows.map((r) => (r[c] ?? "").length));
|
|
43
|
+
}
|
|
44
|
+
const fmtRow = (r) => widths
|
|
45
|
+
.map((w, c) => (r[c] ?? "").padEnd(w))
|
|
46
|
+
.join(" ")
|
|
47
|
+
.replace(/\s+$/, "");
|
|
48
|
+
const lines = [fmtRow(rows[0]), widths.map((w) => "-".repeat(w)).join(" ")];
|
|
49
|
+
for (let r = 1; r < rows.length; r++)
|
|
50
|
+
lines.push(fmtRow(rows[r]));
|
|
51
|
+
return "```\n" + lines.join("\n") + "\n```";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find GFM tables (a row followed by a dash/colon delimiter line, then zero or
|
|
55
|
+
* more rows) and replace each with `render(block)`. Operates line-by-line so
|
|
56
|
+
* non-table content is untouched.
|
|
57
|
+
*/
|
|
58
|
+
function convertMarkdownTables(text, render) {
|
|
59
|
+
const lines = text.split("\n");
|
|
60
|
+
const out = [];
|
|
61
|
+
let i = 0;
|
|
62
|
+
while (i < lines.length) {
|
|
63
|
+
if (i + 1 < lines.length && isTableRow(lines[i]) && TABLE_DELIMITER.test(lines[i + 1])) {
|
|
64
|
+
const block = [lines[i], lines[i + 1]];
|
|
65
|
+
let j = i + 2;
|
|
66
|
+
while (j < lines.length && isTableRow(lines[j]))
|
|
67
|
+
block.push(lines[j++]);
|
|
68
|
+
out.push(render(block));
|
|
69
|
+
i = j;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
out.push(lines[i]);
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return out.join("\n");
|
|
77
|
+
}
|
|
1
78
|
/**
|
|
2
79
|
* Convert standard Markdown to Slack's mrkdwn format.
|
|
3
80
|
*
|
|
@@ -16,6 +93,10 @@ export function markdownToSlackMrkdwn(text) {
|
|
|
16
93
|
let out = text;
|
|
17
94
|
// 1. Extract fenced code blocks (strip language hints)
|
|
18
95
|
out = out.replace(/```[a-zA-Z]*\n([\s\S]*?)```/g, (_m, code) => hold("```\n" + code + "```"));
|
|
96
|
+
// 1b. Convert GFM tables to aligned monospace blocks (Slack has no table
|
|
97
|
+
// mrkdwn). Runs after fenced-block extraction so pipes inside code are
|
|
98
|
+
// left alone, and the result is held so later transforms don't touch it.
|
|
99
|
+
out = convertMarkdownTables(out, (block) => hold(renderSlackTable(block)));
|
|
19
100
|
// 2. Extract inline code
|
|
20
101
|
out = out.replace(/`([^`\n]+)`/g, (_m, code) => hold("`" + code + "`"));
|
|
21
102
|
// 3. Headers → bold (Slack has no header mrkdwn)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mrkdwn.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,kDAAkD;IAClD,SAAS,IAAI,CAAC,OAAe;QAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,SAAS,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,GAAG,GAAG,IAAI,CAAC;IAEf,uDAAuD;IACvD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IAE9F,yBAAyB;IACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IAExE,iDAAiD;IACjD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAE/C,yCAAyC;IACzC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC5C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAExC,oEAAoE;IACpE,gFAAgF;IAChF,gFAAgF;IAChF,yDAAyD;IAEzD,sCAAsC;IACtC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAExC,8DAA8D;IAC9D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IAE1D,qCAAqC;IACrC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAEzD,qCAAqC;IACrC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;IAEzD,2BAA2B;IAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEhF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"mrkdwn.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.ts"],"names":[],"mappings":"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"}
|