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,527 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Owns every read/write against the `executions` table — the harness's
|
|
4
|
+
* append-only ledger of agent runs. The dashboard derives phase status from
|
|
5
|
+
* this table (primary source, ahead of the `phase_history` fallback), and the
|
|
6
|
+
* runner's resume path skips already-completed phases via {@link shouldRunPhase}.
|
|
7
|
+
*
|
|
8
|
+
* Carved out of the old `StateDb` god-class (issue #97). Constructed from the
|
|
9
|
+
* single shared `Database` so it sits in the same connection / transaction
|
|
10
|
+
* scope as the other stores.
|
|
11
|
+
*/
|
|
12
|
+
export class ExecutionStore {
|
|
13
|
+
db;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
recordStart(record) {
|
|
18
|
+
this.db.prepare(`
|
|
19
|
+
INSERT INTO executions (id, trigger_type, trigger_id, skill, repo, issue_number, started_at, workflow_run_id)
|
|
20
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
21
|
+
`).run(record.id, record.triggerType, record.triggerId, record.skill, record.repo, record.issueNumber, record.startedAt, record.workflowRunId ?? null);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Mid-run update: persist the agent session id as soon as the executor sees
|
|
25
|
+
* the stream-json `system/init` line. Lets the dashboard surface the live
|
|
26
|
+
* session log for an in-flight phase, not just for completed ones.
|
|
27
|
+
*/
|
|
28
|
+
recordSessionId(id, sessionId) {
|
|
29
|
+
this.db.prepare(`UPDATE executions SET session_id = ? WHERE id = ?`).run(sessionId, id);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Persist the final assistant text for a loop-iteration execution.
|
|
33
|
+
* Used by the runner when a scratch slot would otherwise inline the
|
|
34
|
+
* full LLM output into `workflow_runs.scratch` — the scratch entry
|
|
35
|
+
* stores `lastOutputExecutionId` and resolves the text through
|
|
36
|
+
* `getExecutionOutput` on read.
|
|
37
|
+
*/
|
|
38
|
+
recordOutputText(id, output) {
|
|
39
|
+
this.db.prepare(`UPDATE executions SET output_text = ? WHERE id = ?`).run(output, id);
|
|
40
|
+
}
|
|
41
|
+
/** Read the persisted output text for an execution, or null if none. */
|
|
42
|
+
getExecutionOutput(id) {
|
|
43
|
+
const row = this.db
|
|
44
|
+
.prepare(`SELECT output_text FROM executions WHERE id = ?`)
|
|
45
|
+
.get(id);
|
|
46
|
+
return row?.output_text ?? null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Most recent finished execution's `output_text` for a phase (`skill`), or
|
|
50
|
+
* null. Used by the reviewer loop on resume to re-derive a completed review's
|
|
51
|
+
* verdict from its persisted output (a dedup-`done` review must not be
|
|
52
|
+
* assumed APPROVED — it may have requested changes).
|
|
53
|
+
*/
|
|
54
|
+
getPhaseOutput(skill, triggerId, workflowRunId) {
|
|
55
|
+
const [scopeClause, scopeParam] = workflowRunId
|
|
56
|
+
? ["workflow_run_id = ?", workflowRunId]
|
|
57
|
+
: ["trigger_id = ?", triggerId];
|
|
58
|
+
const row = this.db.prepare(`
|
|
59
|
+
SELECT output_text FROM executions
|
|
60
|
+
WHERE skill = ? AND ${scopeClause} AND output_text IS NOT NULL
|
|
61
|
+
ORDER BY finished_at DESC
|
|
62
|
+
LIMIT 1
|
|
63
|
+
`).get(skill, scopeParam);
|
|
64
|
+
return row?.output_text ?? null;
|
|
65
|
+
}
|
|
66
|
+
recordFinish(id, result) {
|
|
67
|
+
this.db.prepare(`
|
|
68
|
+
UPDATE executions
|
|
69
|
+
SET finished_at = ?,
|
|
70
|
+
success = ?,
|
|
71
|
+
error = ?,
|
|
72
|
+
turns = ?,
|
|
73
|
+
duration_ms = ?,
|
|
74
|
+
session_id = COALESCE(?, session_id),
|
|
75
|
+
cost_usd = COALESCE(?, cost_usd),
|
|
76
|
+
input_tokens = COALESCE(?, input_tokens),
|
|
77
|
+
cache_creation_input_tokens = COALESCE(?, cache_creation_input_tokens),
|
|
78
|
+
cache_read_input_tokens = COALESCE(?, cache_read_input_tokens),
|
|
79
|
+
output_tokens = COALESCE(?, output_tokens),
|
|
80
|
+
api_duration_ms = COALESCE(?, api_duration_ms),
|
|
81
|
+
stop_reason = COALESCE(?, stop_reason),
|
|
82
|
+
extension_status = COALESCE(?, extension_status),
|
|
83
|
+
skills_status = COALESCE(?, skills_status)
|
|
84
|
+
WHERE id = ?
|
|
85
|
+
`).run(new Date().toISOString(), result.success ? 1 : 0, result.error, result.turns, result.durationMs, result.sessionId ?? null, result.costUsd ?? null, result.inputTokens ?? null, result.cacheCreationInputTokens ?? null, result.cacheReadInputTokens ?? null, result.outputTokens ?? null, result.apiDurationMs ?? null, result.stopReason ?? null, result.extensionStatus ?? null, result.skillsStatus ?? null, id);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Record a phase that the scheduler skipped because its trigger rule was
|
|
89
|
+
* not satisfied (a failed/skipped upstream cascaded down a chain). The
|
|
90
|
+
* executions ledger is the single source of truth the dashboard derives
|
|
91
|
+
* phase status from, so skips are written here too — as a finished,
|
|
92
|
+
* non-successful row (`success = 0`, `stop_reason = 'skipped'`). Because it
|
|
93
|
+
* is not `success = 1`, `shouldRunPhase` re-evaluates it on resume (the node
|
|
94
|
+
* will simply be re-skipped if the upstream is still failed).
|
|
95
|
+
*/
|
|
96
|
+
recordSkippedPhase(skill, triggerId, workflowRunId, repo) {
|
|
97
|
+
const now = new Date().toISOString();
|
|
98
|
+
const m = triggerId.match(/#(\d+)$/);
|
|
99
|
+
const issueNumber = m ? Number(m[1]) : null;
|
|
100
|
+
this.db.prepare(`
|
|
101
|
+
INSERT INTO executions
|
|
102
|
+
(id, trigger_type, trigger_id, skill, repo, issue_number, started_at, finished_at, success, error, stop_reason, workflow_run_id)
|
|
103
|
+
VALUES (?, 'webhook', ?, ?, ?, ?, ?, ?, 0, 'skipped: trigger rule not satisfied', 'skipped', ?)
|
|
104
|
+
`).run(randomUUID(), triggerId, skill, repo ?? null, issueNumber, now, now, workflowRunId ?? null);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* List chat threads aggregated from the executions table.
|
|
108
|
+
*
|
|
109
|
+
* Each row collapses every execution sharing a `trigger_id` (the messaging
|
|
110
|
+
* session id) into one summary so the dashboard's chat-sessions tab can
|
|
111
|
+
* show one card per Slack thread, not one per turn. Joined with
|
|
112
|
+
* `messaging_sessions` for the agent SDK session id (used to resolve to
|
|
113
|
+
* the on-disk jsonl when streaming messages) and with `messaging_messages`
|
|
114
|
+
* for the most recent assistant text (preview snippet).
|
|
115
|
+
*/
|
|
116
|
+
listChatThreads(limit) {
|
|
117
|
+
const rows = this.db.prepare(`
|
|
118
|
+
SELECT
|
|
119
|
+
e.trigger_id AS triggerId,
|
|
120
|
+
ms.agent_session_id AS agentSessionId,
|
|
121
|
+
ms.platform AS platform,
|
|
122
|
+
MIN(e.started_at) AS firstStartedAt,
|
|
123
|
+
MAX(COALESCE(e.finished_at, e.started_at)) AS lastActivityAt,
|
|
124
|
+
COUNT(*) AS turnCount,
|
|
125
|
+
SUM(COALESCE(e.cost_usd, 0)) AS totalCost,
|
|
126
|
+
SUM(COALESCE(e.input_tokens, 0)) AS inputTokens,
|
|
127
|
+
SUM(COALESCE(e.output_tokens, 0)) AS outputTokens,
|
|
128
|
+
SUM(COALESCE(e.cache_read_input_tokens, 0)) AS cacheReadTokens,
|
|
129
|
+
(
|
|
130
|
+
SELECT mm.content
|
|
131
|
+
FROM messaging_messages mm
|
|
132
|
+
WHERE mm.session_id = e.trigger_id AND mm.role = 'assistant'
|
|
133
|
+
ORDER BY mm.timestamp DESC
|
|
134
|
+
LIMIT 1
|
|
135
|
+
) AS lastAssistantContent
|
|
136
|
+
FROM executions e
|
|
137
|
+
LEFT JOIN messaging_sessions ms ON ms.id = e.trigger_id
|
|
138
|
+
WHERE e.skill = 'chat'
|
|
139
|
+
GROUP BY e.trigger_id
|
|
140
|
+
ORDER BY lastActivityAt DESC
|
|
141
|
+
LIMIT ?
|
|
142
|
+
`).all(limit);
|
|
143
|
+
return rows;
|
|
144
|
+
}
|
|
145
|
+
/** Look up a single chat thread by its messaging session id (= trigger_id). */
|
|
146
|
+
getChatThread(triggerId) {
|
|
147
|
+
const row = this.db.prepare(`
|
|
148
|
+
SELECT
|
|
149
|
+
e.trigger_id AS triggerId,
|
|
150
|
+
ms.agent_session_id AS agentSessionId,
|
|
151
|
+
ms.platform AS platform,
|
|
152
|
+
MIN(e.started_at) AS firstStartedAt,
|
|
153
|
+
MAX(COALESCE(e.finished_at, e.started_at)) AS lastActivityAt,
|
|
154
|
+
COUNT(*) AS turnCount,
|
|
155
|
+
SUM(COALESCE(e.cost_usd, 0)) AS totalCost,
|
|
156
|
+
SUM(COALESCE(e.input_tokens, 0)) AS inputTokens,
|
|
157
|
+
SUM(COALESCE(e.output_tokens, 0)) AS outputTokens,
|
|
158
|
+
SUM(COALESCE(e.cache_read_input_tokens, 0)) AS cacheReadTokens,
|
|
159
|
+
(
|
|
160
|
+
SELECT mm.content
|
|
161
|
+
FROM messaging_messages mm
|
|
162
|
+
WHERE mm.session_id = e.trigger_id AND mm.role = 'assistant'
|
|
163
|
+
ORDER BY mm.timestamp DESC
|
|
164
|
+
LIMIT 1
|
|
165
|
+
) AS lastAssistantContent
|
|
166
|
+
FROM executions e
|
|
167
|
+
LEFT JOIN messaging_sessions ms ON ms.id = e.trigger_id
|
|
168
|
+
WHERE e.skill = 'chat' AND e.trigger_id = ?
|
|
169
|
+
GROUP BY e.trigger_id
|
|
170
|
+
`).get(triggerId);
|
|
171
|
+
return row ?? null;
|
|
172
|
+
}
|
|
173
|
+
/** Check if a skill is currently running for a given trigger */
|
|
174
|
+
isRunning(skill, triggerId) {
|
|
175
|
+
const row = this.db.prepare(`
|
|
176
|
+
SELECT 1 FROM executions
|
|
177
|
+
WHERE skill = ? AND trigger_id = ? AND finished_at IS NULL
|
|
178
|
+
LIMIT 1
|
|
179
|
+
`).get(skill, triggerId);
|
|
180
|
+
return !!row;
|
|
181
|
+
}
|
|
182
|
+
/** Check if a skill has already completed successfully for a given trigger */
|
|
183
|
+
isCompleted(skill, triggerId) {
|
|
184
|
+
const row = this.db.prepare(`
|
|
185
|
+
SELECT 1 FROM executions
|
|
186
|
+
WHERE skill = ? AND trigger_id = ? AND success = 1
|
|
187
|
+
LIMIT 1
|
|
188
|
+
`).get(skill, triggerId);
|
|
189
|
+
return !!row;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if a phase should run: not currently running AND not already
|
|
193
|
+
* succeeded. When `workflowRunId` is provided, scopes the check to that
|
|
194
|
+
* specific run — a fresh re-trigger (new workflow_run_id) will see no
|
|
195
|
+
* matching rows and correctly return "run" even if a prior completed run
|
|
196
|
+
* for the same trigger exists. Omit `workflowRunId` for legacy callers
|
|
197
|
+
* (e.g. chat/status-report dedup) that want the old trigger-wide scope.
|
|
198
|
+
*/
|
|
199
|
+
shouldRunPhase(skill, triggerId, workflowRunId) {
|
|
200
|
+
const [scopeClause, scopeParam] = workflowRunId
|
|
201
|
+
? ["workflow_run_id = ?", workflowRunId]
|
|
202
|
+
: ["trigger_id = ?", triggerId];
|
|
203
|
+
const running = this.db.prepare(`
|
|
204
|
+
SELECT 1 FROM executions
|
|
205
|
+
WHERE skill = ? AND ${scopeClause} AND finished_at IS NULL
|
|
206
|
+
LIMIT 1
|
|
207
|
+
`).get(skill, scopeParam);
|
|
208
|
+
if (running)
|
|
209
|
+
return "running";
|
|
210
|
+
const done = this.db.prepare(`
|
|
211
|
+
SELECT 1 FROM executions
|
|
212
|
+
WHERE skill = ? AND ${scopeClause} AND success = 1
|
|
213
|
+
LIMIT 1
|
|
214
|
+
`).get(skill, scopeParam);
|
|
215
|
+
if (done)
|
|
216
|
+
return "done";
|
|
217
|
+
return "run";
|
|
218
|
+
}
|
|
219
|
+
/** Mark all stale "running" executions for a skill/trigger as failed.
|
|
220
|
+
* Called when we detect no matching Docker container is alive. */
|
|
221
|
+
markStaleAsFailed(skill, triggerId, workflowRunId) {
|
|
222
|
+
const [scopeClause, scopeParam] = workflowRunId
|
|
223
|
+
? ["workflow_run_id = ?", workflowRunId]
|
|
224
|
+
: ["trigger_id = ?", triggerId];
|
|
225
|
+
const result = this.db.prepare(`
|
|
226
|
+
UPDATE executions
|
|
227
|
+
SET finished_at = ?, success = 0, error = 'stale: container no longer running'
|
|
228
|
+
WHERE skill = ? AND ${scopeClause} AND finished_at IS NULL
|
|
229
|
+
`).run(new Date().toISOString(), skill, scopeParam);
|
|
230
|
+
return result.changes;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Mark every unfinished execution row for a trigger as failed, regardless
|
|
234
|
+
* of skill. Used by the boot-time recovery sweep to clear out phases that
|
|
235
|
+
* were running when the harness crashed/restarted, so the runner's dedup
|
|
236
|
+
* logic doesn't think they're still in flight.
|
|
237
|
+
*/
|
|
238
|
+
markAllStaleForTrigger(triggerId, reason) {
|
|
239
|
+
const result = this.db.prepare(`
|
|
240
|
+
UPDATE executions
|
|
241
|
+
SET finished_at = ?, success = 0, error = ?
|
|
242
|
+
WHERE trigger_id = ? AND finished_at IS NULL
|
|
243
|
+
`).run(new Date().toISOString(), reason, triggerId);
|
|
244
|
+
return result.changes;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Mark the most recent execution for a skill/trigger as failed.
|
|
248
|
+
* Used when the agent SDK reported success but the orchestrator decided
|
|
249
|
+
* the business outcome was a failure (e.g. guardrails BLOCKED, reviewer
|
|
250
|
+
* REQUEST_CHANGES). Without this, runPhase would skip the phase on the
|
|
251
|
+
* next run because the DB still says success=1.
|
|
252
|
+
*/
|
|
253
|
+
markLatestAsFailed(skill, triggerId, reason, workflowRunId) {
|
|
254
|
+
const [scopeClause, scopeParam] = workflowRunId
|
|
255
|
+
? ["workflow_run_id = ?", workflowRunId]
|
|
256
|
+
: ["trigger_id = ?", triggerId];
|
|
257
|
+
const result = this.db.prepare(`
|
|
258
|
+
UPDATE executions
|
|
259
|
+
SET success = 0, error = ?
|
|
260
|
+
WHERE id = (
|
|
261
|
+
SELECT id FROM executions
|
|
262
|
+
WHERE skill = ? AND ${scopeClause}
|
|
263
|
+
ORDER BY started_at DESC
|
|
264
|
+
LIMIT 1
|
|
265
|
+
)
|
|
266
|
+
`).run(reason, skill, scopeParam);
|
|
267
|
+
return result.changes;
|
|
268
|
+
}
|
|
269
|
+
/** Get recent executions for a skill */
|
|
270
|
+
recentExecutions(skill, limit = 10) {
|
|
271
|
+
return this.db.prepare(`
|
|
272
|
+
SELECT * FROM executions
|
|
273
|
+
WHERE skill = ?
|
|
274
|
+
ORDER BY started_at DESC
|
|
275
|
+
LIMIT ?
|
|
276
|
+
`).all(skill, limit);
|
|
277
|
+
}
|
|
278
|
+
/** Count consecutive failures for a skill (for cron failure tracking) */
|
|
279
|
+
consecutiveFailures(skill) {
|
|
280
|
+
const rows = this.db.prepare(`
|
|
281
|
+
SELECT success FROM executions
|
|
282
|
+
WHERE skill = ? AND finished_at IS NOT NULL
|
|
283
|
+
ORDER BY started_at DESC
|
|
284
|
+
LIMIT 10
|
|
285
|
+
`).all(skill);
|
|
286
|
+
let count = 0;
|
|
287
|
+
for (const row of rows) {
|
|
288
|
+
if (row.success === 0)
|
|
289
|
+
count++;
|
|
290
|
+
else
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
return count;
|
|
294
|
+
}
|
|
295
|
+
/** Get all executions with pagination */
|
|
296
|
+
allExecutions(limit = 100, offset = 0) {
|
|
297
|
+
return this.db.prepare(`
|
|
298
|
+
SELECT * FROM executions
|
|
299
|
+
ORDER BY started_at DESC
|
|
300
|
+
LIMIT ? OFFSET ?
|
|
301
|
+
`).all(limit, offset);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Free-text search across the `executions` ledger — matches `error`, `skill`,
|
|
305
|
+
* or `repo` against a substring (case-insensitive via SQLite's LIKE). Used by
|
|
306
|
+
* the `/admin/api/log-search` endpoint and the `lastlight logs search` CLI to
|
|
307
|
+
* find failing/relevant phases without SSHing to the box. Parameterized; the
|
|
308
|
+
* pattern is escaped so user input can't smuggle LIKE wildcards.
|
|
309
|
+
*/
|
|
310
|
+
searchErrors(query, limit = 50) {
|
|
311
|
+
const escaped = query.replace(/[\\%_]/g, (ch) => `\\${ch}`);
|
|
312
|
+
const pattern = `%${escaped}%`;
|
|
313
|
+
const rows = this.db.prepare(`
|
|
314
|
+
SELECT
|
|
315
|
+
id,
|
|
316
|
+
skill,
|
|
317
|
+
repo,
|
|
318
|
+
error,
|
|
319
|
+
success,
|
|
320
|
+
started_at AS startedAt,
|
|
321
|
+
finished_at AS finishedAt,
|
|
322
|
+
session_id AS sessionId,
|
|
323
|
+
workflow_run_id AS workflowRunId,
|
|
324
|
+
trigger_id AS triggerId
|
|
325
|
+
FROM executions
|
|
326
|
+
WHERE error LIKE ? ESCAPE '\\'
|
|
327
|
+
OR skill LIKE ? ESCAPE '\\'
|
|
328
|
+
OR repo LIKE ? ESCAPE '\\'
|
|
329
|
+
ORDER BY started_at DESC
|
|
330
|
+
LIMIT ?
|
|
331
|
+
`).all(pattern, pattern, pattern, limit);
|
|
332
|
+
return rows.map((r) => ({
|
|
333
|
+
id: r.id,
|
|
334
|
+
skill: r.skill,
|
|
335
|
+
repo: r.repo ?? undefined,
|
|
336
|
+
error: r.error ?? undefined,
|
|
337
|
+
success: r.success === null || r.success === undefined ? undefined : Boolean(r.success),
|
|
338
|
+
startedAt: r.startedAt,
|
|
339
|
+
finishedAt: r.finishedAt ?? undefined,
|
|
340
|
+
sessionId: r.sessionId ?? undefined,
|
|
341
|
+
workflowRunId: r.workflowRunId ?? undefined,
|
|
342
|
+
triggerId: r.triggerId,
|
|
343
|
+
}));
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get every execution recorded for a workflow run, with camelCase fields
|
|
347
|
+
* ready for the dashboard. Ordered by start time ascending so phases
|
|
348
|
+
* display in the order they ran. Scopes to a specific `workflow_run_id`
|
|
349
|
+
* when provided (preferred — isolates fresh re-triggers from prior runs);
|
|
350
|
+
* falls back to the legacy trigger-wide scope for rows written before the
|
|
351
|
+
* workflow_run_id column existed.
|
|
352
|
+
*/
|
|
353
|
+
getExecutionsForWorkflowRun(workflowRunId, triggerId, workflowName) {
|
|
354
|
+
const skillPattern = workflowName ? `${workflowName}:%` : "%:%";
|
|
355
|
+
const rows = this.db.prepare(`
|
|
356
|
+
SELECT
|
|
357
|
+
id,
|
|
358
|
+
trigger_type AS triggerType,
|
|
359
|
+
trigger_id AS triggerId,
|
|
360
|
+
skill,
|
|
361
|
+
repo,
|
|
362
|
+
issue_number AS issueNumber,
|
|
363
|
+
started_at AS startedAt,
|
|
364
|
+
finished_at AS finishedAt,
|
|
365
|
+
success,
|
|
366
|
+
error,
|
|
367
|
+
turns,
|
|
368
|
+
duration_ms AS durationMs,
|
|
369
|
+
session_id AS sessionId,
|
|
370
|
+
cost_usd AS costUsd,
|
|
371
|
+
input_tokens AS inputTokens,
|
|
372
|
+
cache_creation_input_tokens AS cacheCreationInputTokens,
|
|
373
|
+
cache_read_input_tokens AS cacheReadInputTokens,
|
|
374
|
+
output_tokens AS outputTokens,
|
|
375
|
+
api_duration_ms AS apiDurationMs,
|
|
376
|
+
stop_reason AS stopReason,
|
|
377
|
+
extension_status AS extensionStatus,
|
|
378
|
+
skills_status AS skillsStatus,
|
|
379
|
+
workflow_run_id AS workflowRunId
|
|
380
|
+
FROM executions
|
|
381
|
+
WHERE (workflow_run_id = ? OR (workflow_run_id IS NULL AND trigger_id = ?))
|
|
382
|
+
AND skill LIKE ?
|
|
383
|
+
ORDER BY started_at ASC
|
|
384
|
+
`).all(workflowRunId, triggerId, skillPattern);
|
|
385
|
+
return rows.map((r) => ({
|
|
386
|
+
id: r.id,
|
|
387
|
+
triggerType: r.triggerType,
|
|
388
|
+
triggerId: r.triggerId,
|
|
389
|
+
skill: r.skill,
|
|
390
|
+
repo: r.repo ?? undefined,
|
|
391
|
+
issueNumber: r.issueNumber ?? undefined,
|
|
392
|
+
startedAt: r.startedAt,
|
|
393
|
+
finishedAt: r.finishedAt ?? undefined,
|
|
394
|
+
success: r.success === null || r.success === undefined ? undefined : Boolean(r.success),
|
|
395
|
+
error: r.error ?? undefined,
|
|
396
|
+
turns: r.turns ?? undefined,
|
|
397
|
+
durationMs: r.durationMs ?? undefined,
|
|
398
|
+
sessionId: r.sessionId ?? undefined,
|
|
399
|
+
costUsd: r.costUsd ?? undefined,
|
|
400
|
+
inputTokens: r.inputTokens ?? undefined,
|
|
401
|
+
cacheCreationInputTokens: r.cacheCreationInputTokens ?? undefined,
|
|
402
|
+
cacheReadInputTokens: r.cacheReadInputTokens ?? undefined,
|
|
403
|
+
outputTokens: r.outputTokens ?? undefined,
|
|
404
|
+
apiDurationMs: r.apiDurationMs ?? undefined,
|
|
405
|
+
stopReason: r.stopReason ?? undefined,
|
|
406
|
+
extensionStatus: r.extensionStatus ?? undefined,
|
|
407
|
+
skillsStatus: r.skillsStatus ?? undefined,
|
|
408
|
+
workflowRunId: r.workflowRunId ?? undefined,
|
|
409
|
+
}));
|
|
410
|
+
}
|
|
411
|
+
/** Get currently running executions (no finished_at) */
|
|
412
|
+
runningExecutions() {
|
|
413
|
+
return this.db.prepare(`
|
|
414
|
+
SELECT * FROM executions
|
|
415
|
+
WHERE finished_at IS NULL
|
|
416
|
+
ORDER BY started_at DESC
|
|
417
|
+
`).all();
|
|
418
|
+
}
|
|
419
|
+
/** Aggregate execution stats */
|
|
420
|
+
executionStats() {
|
|
421
|
+
const today = new Date();
|
|
422
|
+
today.setHours(0, 0, 0, 0);
|
|
423
|
+
const todayIso = today.toISOString();
|
|
424
|
+
const total = this.db.prepare(`SELECT COUNT(*) as c FROM executions`).get().c;
|
|
425
|
+
const todayCount = this.db.prepare(`SELECT COUNT(*) as c FROM executions WHERE started_at >= ?`).get(todayIso).c;
|
|
426
|
+
const running = this.db.prepare(`SELECT COUNT(*) as c FROM executions WHERE finished_at IS NULL`).get().c;
|
|
427
|
+
const skillRows = this.db.prepare(`
|
|
428
|
+
SELECT skill, COUNT(*) as count,
|
|
429
|
+
SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as success,
|
|
430
|
+
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as fail
|
|
431
|
+
FROM executions GROUP BY skill
|
|
432
|
+
`).all();
|
|
433
|
+
const by_skill = {};
|
|
434
|
+
for (const r of skillRows) {
|
|
435
|
+
by_skill[r.skill] = { count: r.count, success: r.success, fail: r.fail };
|
|
436
|
+
}
|
|
437
|
+
const triggerRows = this.db.prepare(`
|
|
438
|
+
SELECT trigger_type, COUNT(*) as count FROM executions GROUP BY trigger_type
|
|
439
|
+
`).all();
|
|
440
|
+
const by_trigger = {};
|
|
441
|
+
for (const r of triggerRows) {
|
|
442
|
+
by_trigger[r.trigger_type] = r.count;
|
|
443
|
+
}
|
|
444
|
+
return { total_executions: total, today_count: todayCount, by_skill, by_trigger, running };
|
|
445
|
+
}
|
|
446
|
+
/** Daily aggregated stats for the last N days */
|
|
447
|
+
dailyStats(days) {
|
|
448
|
+
// Build the inclusive UTC date window: [today - (days-1), today].
|
|
449
|
+
// SQLite's date(started_at) returns a UTC YYYY-MM-DD string, so we
|
|
450
|
+
// generate the same format here to align keys.
|
|
451
|
+
const today = new Date();
|
|
452
|
+
const startUtc = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate() - (days - 1)));
|
|
453
|
+
const dateKeys = [];
|
|
454
|
+
for (let i = 0; i < days; i++) {
|
|
455
|
+
const d = new Date(startUtc);
|
|
456
|
+
d.setUTCDate(startUtc.getUTCDate() + i);
|
|
457
|
+
dateKeys.push(d.toISOString().slice(0, 10));
|
|
458
|
+
}
|
|
459
|
+
const rows = this.db.prepare(`
|
|
460
|
+
SELECT
|
|
461
|
+
date(started_at) AS date,
|
|
462
|
+
COUNT(*) AS executions,
|
|
463
|
+
SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) AS successes,
|
|
464
|
+
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) AS failures,
|
|
465
|
+
COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0) + COALESCE(SUM(cache_read_input_tokens), 0) AS totalTokens,
|
|
466
|
+
COALESCE(SUM(input_tokens), 0) AS inputTokens,
|
|
467
|
+
COALESCE(SUM(output_tokens), 0) AS outputTokens,
|
|
468
|
+
COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadTokens,
|
|
469
|
+
COALESCE(SUM(cost_usd), 0) AS costUsd
|
|
470
|
+
FROM executions
|
|
471
|
+
WHERE date(started_at) >= ?
|
|
472
|
+
GROUP BY date(started_at)
|
|
473
|
+
`).all(dateKeys[0]);
|
|
474
|
+
const byDate = new Map(rows.map((r) => [r.date, r]));
|
|
475
|
+
return dateKeys.map((date) => byDate.get(date) ?? {
|
|
476
|
+
date,
|
|
477
|
+
executions: 0,
|
|
478
|
+
successes: 0,
|
|
479
|
+
failures: 0,
|
|
480
|
+
totalTokens: 0,
|
|
481
|
+
inputTokens: 0,
|
|
482
|
+
outputTokens: 0,
|
|
483
|
+
cacheReadTokens: 0,
|
|
484
|
+
costUsd: 0,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
/** Hourly aggregated stats for the last N hours (UTC). Bucket key is `YYYY-MM-DDTHH`. */
|
|
488
|
+
hourlyStats(hours) {
|
|
489
|
+
const now = new Date();
|
|
490
|
+
const startUtc = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours() - (hours - 1)));
|
|
491
|
+
const hourKeys = [];
|
|
492
|
+
for (let i = 0; i < hours; i++) {
|
|
493
|
+
const d = new Date(startUtc);
|
|
494
|
+
d.setUTCHours(startUtc.getUTCHours() + i);
|
|
495
|
+
// YYYY-MM-DDTHH (matches strftime('%Y-%m-%dT%H', …))
|
|
496
|
+
hourKeys.push(d.toISOString().slice(0, 13));
|
|
497
|
+
}
|
|
498
|
+
const rows = this.db.prepare(`
|
|
499
|
+
SELECT
|
|
500
|
+
strftime('%Y-%m-%dT%H', started_at) AS date,
|
|
501
|
+
COUNT(*) AS executions,
|
|
502
|
+
SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) AS successes,
|
|
503
|
+
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) AS failures,
|
|
504
|
+
COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0) + COALESCE(SUM(cache_read_input_tokens), 0) AS totalTokens,
|
|
505
|
+
COALESCE(SUM(input_tokens), 0) AS inputTokens,
|
|
506
|
+
COALESCE(SUM(output_tokens), 0) AS outputTokens,
|
|
507
|
+
COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadTokens,
|
|
508
|
+
COALESCE(SUM(cost_usd), 0) AS costUsd
|
|
509
|
+
FROM executions
|
|
510
|
+
WHERE strftime('%Y-%m-%dT%H', started_at) >= ?
|
|
511
|
+
GROUP BY strftime('%Y-%m-%dT%H', started_at)
|
|
512
|
+
`).all(hourKeys[0]);
|
|
513
|
+
const byHour = new Map(rows.map((r) => [r.date, r]));
|
|
514
|
+
return hourKeys.map((date) => byHour.get(date) ?? {
|
|
515
|
+
date,
|
|
516
|
+
executions: 0,
|
|
517
|
+
successes: 0,
|
|
518
|
+
failures: 0,
|
|
519
|
+
totalTokens: 0,
|
|
520
|
+
inputTokens: 0,
|
|
521
|
+
outputTokens: 0,
|
|
522
|
+
cacheReadTokens: 0,
|
|
523
|
+
costUsd: 0,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=execution-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-store.js","sourceRoot":"","sources":["../../src/state/execution-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
/**
|
|
3
|
+
* Apply the full SQLite schema for the harness state DB.
|
|
4
|
+
*
|
|
5
|
+
* Centralized here (rather than on a store) because the three stores
|
|
6
|
+
* (`WorkflowRunStore` / `ApprovalStore` / `ExecutionStore`) all share a
|
|
7
|
+
* single `Database` connection and assume the schema already exists. `StateDb`
|
|
8
|
+
* is the construction root and calls this once at boot; tests that exercise a
|
|
9
|
+
* store directly construct a raw `Database`, call `migrate()`, then build the
|
|
10
|
+
* store on top.
|
|
11
|
+
*
|
|
12
|
+
* Every statement is idempotent (`IF NOT EXISTS` / additive `ALTER` guarded by
|
|
13
|
+
* try/catch) so it is safe to run on an existing DB.
|
|
14
|
+
*/
|
|
15
|
+
export declare function migrate(db: Database.Database): void;
|