lastlight 0.1.15 → 0.2.1
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 +377 -432
- 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 +30 -1
- package/dist/setup.js +241 -25
- 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 -9
- 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
|
@@ -61,5 +61,54 @@ describe('markdownToSlackMrkdwn', () => {
|
|
|
61
61
|
const result = markdownToSlackMrkdwn(input);
|
|
62
62
|
expect(result).toBe('<https://img.example.com|alt> and <https://link.example.com|text>');
|
|
63
63
|
});
|
|
64
|
+
describe('GFM tables', () => {
|
|
65
|
+
it('renders a table as an aligned monospace code block', () => {
|
|
66
|
+
const input = [
|
|
67
|
+
'| Feature | Last Light | Eve |',
|
|
68
|
+
'|---------|-----------|-----|',
|
|
69
|
+
'| Scope | maintenance agent | framework |',
|
|
70
|
+
'| Hosting | self-hosted | managed |',
|
|
71
|
+
].join('\n');
|
|
72
|
+
const result = markdownToSlackMrkdwn(input);
|
|
73
|
+
// Wrapped in a code block so Slack renders it fixed-width.
|
|
74
|
+
expect(result.startsWith('```')).toBe(true);
|
|
75
|
+
expect(result.trimEnd().endsWith('```')).toBe(true);
|
|
76
|
+
// Header present, GFM delimiter pipes gone.
|
|
77
|
+
expect(result).toContain('Feature');
|
|
78
|
+
expect(result).toContain('Last Light');
|
|
79
|
+
expect(result).not.toContain('|');
|
|
80
|
+
// The header label and the row value below it start at the same column.
|
|
81
|
+
const lines = result.split('\n');
|
|
82
|
+
const headerLine = lines.find((l) => l.includes('Last Light'));
|
|
83
|
+
const rowLine = lines.find((l) => l.includes('maintenance agent'));
|
|
84
|
+
expect(rowLine.indexOf('maintenance agent')).toBe(headerLine.indexOf('Last Light'));
|
|
85
|
+
});
|
|
86
|
+
it('aligns columns to the widest cell', () => {
|
|
87
|
+
const input = '| A | Bbbbb |\n|---|---|\n| ccccc | d |';
|
|
88
|
+
const result = markdownToSlackMrkdwn(input);
|
|
89
|
+
// "A" padded to width of "ccccc"; two-space gutter between columns.
|
|
90
|
+
expect(result).toContain('A Bbbbb');
|
|
91
|
+
expect(result).toContain('ccccc d');
|
|
92
|
+
});
|
|
93
|
+
it('strips inline markdown inside cells', () => {
|
|
94
|
+
const input = '| Name | Link |\n|---|---|\n| **bold** | [docs](https://x.io) |';
|
|
95
|
+
const result = markdownToSlackMrkdwn(input);
|
|
96
|
+
expect(result).toContain('bold');
|
|
97
|
+
expect(result).not.toContain('**bold**');
|
|
98
|
+
expect(result).toContain('docs (https://x.io)');
|
|
99
|
+
});
|
|
100
|
+
it('leaves pipe characters inside fenced code blocks alone', () => {
|
|
101
|
+
const input = '```\n| not | a | table |\n|---|---|---|\n```';
|
|
102
|
+
const result = markdownToSlackMrkdwn(input);
|
|
103
|
+
expect(result).toContain('| not | a | table |');
|
|
104
|
+
});
|
|
105
|
+
it('only converts the table, leaving surrounding prose intact', () => {
|
|
106
|
+
const input = 'Here is the comparison:\n\n| X | Y |\n|---|---|\n| 1 | 2 |\n\nThanks!';
|
|
107
|
+
const result = markdownToSlackMrkdwn(input);
|
|
108
|
+
expect(result).toContain('Here is the comparison:');
|
|
109
|
+
expect(result).toContain('Thanks!');
|
|
110
|
+
expect(result).toContain('```');
|
|
111
|
+
});
|
|
112
|
+
});
|
|
64
113
|
});
|
|
65
114
|
//# sourceMappingURL=mrkdwn.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mrkdwn.test.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mrkdwn.test.js","sourceRoot":"","sources":["../../../src/connectors/slack/mrkdwn.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ export interface EventEnvelope {
|
|
|
36
36
|
/** Timestamp of the event */
|
|
37
37
|
timestamp: Date;
|
|
38
38
|
}
|
|
39
|
-
export type EventType = "issue.opened" | "issue.reopened" | "issue.closed" | "pr.opened" | "pr.closed" | "pr.merged" | "comment.created" | "pr_review.submitted" | "pr_review_comment.created" | "message";
|
|
39
|
+
export type EventType = "issue.opened" | "issue.reopened" | "issue.closed" | "pr.opened" | "pr.synchronize" | "pr.reopened" | "pr.closed" | "pr.merged" | "comment.created" | "pr_review.submitted" | "pr_review_comment.created" | "message";
|
|
40
40
|
/**
|
|
41
41
|
* Connector interface — all event sources implement this.
|
|
42
42
|
* The core engine registers a handler via on('event', ...) and
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron fan-out: when a cron job context contains a `repos` array, dispatch
|
|
3
|
+
* one workflow run per repo instead of passing the array through to a single
|
|
4
|
+
* dispatch that expects `context.repo` (singular).
|
|
5
|
+
*
|
|
6
|
+
* Each per-repo run gets its own workflow_runs row, taskId, sandbox, and
|
|
7
|
+
* trigger id, so failures are isolated and the existing per-run resume
|
|
8
|
+
* machinery works unchanged.
|
|
9
|
+
*
|
|
10
|
+
* Concurrency is bounded so 100 repo scans don't spin 100 concurrent
|
|
11
|
+
* sandboxes — default is 3, tunable per call.
|
|
12
|
+
*/
|
|
13
|
+
export type CronDispatcher = (workflow: string, context: Record<string, unknown>) => Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
error?: string;
|
|
16
|
+
paused?: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
export interface FanOutResult {
|
|
19
|
+
/** Number of dispatch calls actually made */
|
|
20
|
+
dispatched: number;
|
|
21
|
+
/** Number that returned !success and !paused (or threw) */
|
|
22
|
+
failures: number;
|
|
23
|
+
}
|
|
24
|
+
export interface FanOutOptions {
|
|
25
|
+
/** Max concurrent dispatches. Default 3. */
|
|
26
|
+
concurrency?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Dispatch a cron-scheduled workflow, fanning out over `context.repos` when
|
|
30
|
+
* present. When absent, behaves like a single dispatch. Always stamps
|
|
31
|
+
* `_triggerType: "cron"` on the outgoing context.
|
|
32
|
+
*/
|
|
33
|
+
export declare function dispatchCronWorkflow(workflowName: string, context: Record<string, unknown>, dispatch: CronDispatcher, options?: FanOutOptions): Promise<FanOutResult>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron fan-out: when a cron job context contains a `repos` array, dispatch
|
|
3
|
+
* one workflow run per repo instead of passing the array through to a single
|
|
4
|
+
* dispatch that expects `context.repo` (singular).
|
|
5
|
+
*
|
|
6
|
+
* Each per-repo run gets its own workflow_runs row, taskId, sandbox, and
|
|
7
|
+
* trigger id, so failures are isolated and the existing per-run resume
|
|
8
|
+
* machinery works unchanged.
|
|
9
|
+
*
|
|
10
|
+
* Concurrency is bounded so 100 repo scans don't spin 100 concurrent
|
|
11
|
+
* sandboxes — default is 3, tunable per call.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Dispatch a cron-scheduled workflow, fanning out over `context.repos` when
|
|
15
|
+
* present. When absent, behaves like a single dispatch. Always stamps
|
|
16
|
+
* `_triggerType: "cron"` on the outgoing context.
|
|
17
|
+
*/
|
|
18
|
+
export async function dispatchCronWorkflow(workflowName, context, dispatch, options = {}) {
|
|
19
|
+
const base = { ...context, _triggerType: "cron" };
|
|
20
|
+
const rawRepos = base.repos;
|
|
21
|
+
if (!Array.isArray(rawRepos)) {
|
|
22
|
+
const result = await runOne(dispatch, workflowName, base);
|
|
23
|
+
return { dispatched: 1, failures: result ? 0 : 1 };
|
|
24
|
+
}
|
|
25
|
+
const { repos: _drop, ...rest } = base;
|
|
26
|
+
const repos = rawRepos.filter((r) => typeof r === "string" && r.length > 0);
|
|
27
|
+
if (repos.length === 0) {
|
|
28
|
+
return { dispatched: 0, failures: 0 };
|
|
29
|
+
}
|
|
30
|
+
const concurrency = Math.max(1, options.concurrency ?? 3);
|
|
31
|
+
let dispatched = 0;
|
|
32
|
+
let failures = 0;
|
|
33
|
+
for (let i = 0; i < repos.length; i += concurrency) {
|
|
34
|
+
const batch = repos.slice(i, i + concurrency);
|
|
35
|
+
const results = await Promise.allSettled(batch.map((repo) => runOne(dispatch, workflowName, { ...rest, repo })));
|
|
36
|
+
for (const r of results) {
|
|
37
|
+
dispatched++;
|
|
38
|
+
const ok = r.status === "fulfilled" && r.value === true;
|
|
39
|
+
if (!ok)
|
|
40
|
+
failures++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { dispatched, failures };
|
|
44
|
+
}
|
|
45
|
+
async function runOne(dispatch, workflowName, context) {
|
|
46
|
+
try {
|
|
47
|
+
const result = await dispatch(workflowName, context);
|
|
48
|
+
return !!(result.success || result.paused);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error(`[cron-fanout] ${workflowName} dispatch threw for ${String(context.repo ?? "<no repo>")}:`, err);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=fanout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout.js","sourceRoot":"","sources":["../../src/cron/fanout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,YAAoB,EACpB,OAAgC,EAChC,QAAwB,EACxB,UAAyB,EAAE;IAE3B,MAAM,IAAI,GAA4B,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;IAE5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,KAAK,GAAI,QAAsB,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAC1D,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CACvE,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;YACxD,IAAI,CAAC,EAAE;gBAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,QAAwB,EACxB,YAAoB,EACpB,OAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,iBAAiB,YAAY,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,EAC1F,GAAG,CACJ,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { dispatchCronWorkflow } from "./fanout.js";
|
|
3
|
+
describe("dispatchCronWorkflow", () => {
|
|
4
|
+
it("dispatches once when context has no repos[]", async () => {
|
|
5
|
+
const dispatch = vi.fn().mockResolvedValue({ success: true });
|
|
6
|
+
const res = await dispatchCronWorkflow("repo-health", { repo: "cliftonc/lastlight", mode: "report" }, dispatch);
|
|
7
|
+
expect(dispatch).toHaveBeenCalledTimes(1);
|
|
8
|
+
expect(dispatch).toHaveBeenCalledWith("repo-health", expect.objectContaining({
|
|
9
|
+
repo: "cliftonc/lastlight",
|
|
10
|
+
mode: "report",
|
|
11
|
+
_triggerType: "cron",
|
|
12
|
+
}));
|
|
13
|
+
expect(res).toEqual({ dispatched: 1, failures: 0 });
|
|
14
|
+
});
|
|
15
|
+
it("fans out one dispatch per repo, stripping repos[] and injecting singular repo", async () => {
|
|
16
|
+
const dispatch = vi.fn().mockResolvedValue({ success: true });
|
|
17
|
+
const repos = ["cliftonc/a", "cliftonc/b", "cliftonc/c"];
|
|
18
|
+
const res = await dispatchCronWorkflow("security-review", { repos, mode: "scan", deliverSlackSummary: true }, dispatch);
|
|
19
|
+
expect(dispatch).toHaveBeenCalledTimes(3);
|
|
20
|
+
const passedRepos = dispatch.mock.calls.map((c) => c[1].repo);
|
|
21
|
+
expect(passedRepos.sort()).toEqual(repos.sort());
|
|
22
|
+
for (const call of dispatch.mock.calls) {
|
|
23
|
+
const ctx = call[1];
|
|
24
|
+
expect(ctx.repos).toBeUndefined(); // fan-out strips the array
|
|
25
|
+
expect(ctx._triggerType).toBe("cron");
|
|
26
|
+
expect(ctx.mode).toBe("scan");
|
|
27
|
+
expect(ctx.deliverSlackSummary).toBe(true);
|
|
28
|
+
}
|
|
29
|
+
expect(res).toEqual({ dispatched: 3, failures: 0 });
|
|
30
|
+
});
|
|
31
|
+
it("returns zero dispatches when repos[] is empty", async () => {
|
|
32
|
+
const dispatch = vi.fn().mockResolvedValue({ success: true });
|
|
33
|
+
const res = await dispatchCronWorkflow("security-review", { repos: [] }, dispatch);
|
|
34
|
+
expect(dispatch).not.toHaveBeenCalled();
|
|
35
|
+
expect(res).toEqual({ dispatched: 0, failures: 0 });
|
|
36
|
+
});
|
|
37
|
+
it("counts dispatch failures but isolates them (Promise.allSettled)", async () => {
|
|
38
|
+
const dispatch = vi.fn()
|
|
39
|
+
.mockResolvedValueOnce({ success: true })
|
|
40
|
+
.mockResolvedValueOnce({ success: false, error: "boom" })
|
|
41
|
+
.mockRejectedValueOnce(new Error("sandbox exploded"));
|
|
42
|
+
const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a", "cliftonc/b", "cliftonc/c"] }, dispatch, { concurrency: 3 });
|
|
43
|
+
expect(dispatch).toHaveBeenCalledTimes(3);
|
|
44
|
+
expect(res).toEqual({ dispatched: 3, failures: 2 });
|
|
45
|
+
});
|
|
46
|
+
it("counts paused runs as non-failures", async () => {
|
|
47
|
+
const dispatch = vi.fn().mockResolvedValue({ success: true, paused: true });
|
|
48
|
+
const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a"] }, dispatch);
|
|
49
|
+
expect(res).toEqual({ dispatched: 1, failures: 0 });
|
|
50
|
+
});
|
|
51
|
+
it("bounds concurrency — never more than N dispatches in flight", async () => {
|
|
52
|
+
let inFlight = 0;
|
|
53
|
+
let peakInFlight = 0;
|
|
54
|
+
const dispatch = vi.fn().mockImplementation(async () => {
|
|
55
|
+
inFlight++;
|
|
56
|
+
peakInFlight = Math.max(peakInFlight, inFlight);
|
|
57
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
58
|
+
inFlight--;
|
|
59
|
+
return { success: true };
|
|
60
|
+
});
|
|
61
|
+
const repos = Array.from({ length: 10 }, (_, i) => `cliftonc/repo-${i}`);
|
|
62
|
+
const res = await dispatchCronWorkflow("security-review", { repos }, dispatch, { concurrency: 3 });
|
|
63
|
+
expect(res).toEqual({ dispatched: 10, failures: 0 });
|
|
64
|
+
expect(peakInFlight).toBeLessThanOrEqual(3);
|
|
65
|
+
});
|
|
66
|
+
it("drops non-string entries from repos[] silently", async () => {
|
|
67
|
+
const dispatch = vi.fn().mockResolvedValue({ success: true });
|
|
68
|
+
const res = await dispatchCronWorkflow("security-review", { repos: ["cliftonc/a", 42, null, "", "cliftonc/b"] }, dispatch);
|
|
69
|
+
expect(dispatch).toHaveBeenCalledTimes(2);
|
|
70
|
+
expect(res).toEqual({ dispatched: 2, failures: 0 });
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=fanout.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanout.test.js","sourceRoot":"","sources":["../../src/cron/fanout.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cron/jobs.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CronJob } from "./scheduler.js";
|
|
2
|
+
import type { StateDb } from "../state/db.js";
|
|
2
3
|
/**
|
|
3
4
|
* Get cron jobs based on configuration.
|
|
4
5
|
*
|
|
@@ -7,7 +8,11 @@ import type { CronJob } from "./scheduler.js";
|
|
|
7
8
|
* which is invoked on each tick. When webhooks are enabled
|
|
8
9
|
* (WEBHOOK_SECRET is set), jobs with `condition.unless: webhooksEnabled`
|
|
9
10
|
* are filtered out — those are handled in real-time via webhook events.
|
|
11
|
+
*
|
|
12
|
+
* When `db` is supplied, cron_overrides rows applied: disabled jobs are
|
|
13
|
+
* dropped and schedule overrides replace the YAML schedule.
|
|
10
14
|
*/
|
|
11
15
|
export declare function getJobs(opts?: {
|
|
12
16
|
webhooksEnabled?: boolean;
|
|
17
|
+
db?: StateDb;
|
|
13
18
|
}): CronJob[];
|
package/dist/cron/jobs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getManagedRepos } from "../managed-repos.js";
|
|
2
2
|
import { getCronWorkflows } from "../workflows/loader.js";
|
|
3
3
|
/**
|
|
4
4
|
* Get cron jobs based on configuration.
|
|
@@ -8,6 +8,9 @@ import { getCronWorkflows } from "../workflows/loader.js";
|
|
|
8
8
|
* which is invoked on each tick. When webhooks are enabled
|
|
9
9
|
* (WEBHOOK_SECRET is set), jobs with `condition.unless: webhooksEnabled`
|
|
10
10
|
* are filtered out — those are handled in real-time via webhook events.
|
|
11
|
+
*
|
|
12
|
+
* When `db` is supplied, cron_overrides rows applied: disabled jobs are
|
|
13
|
+
* dropped and schedule overrides replace the YAML schedule.
|
|
11
14
|
*/
|
|
12
15
|
export function getJobs(opts) {
|
|
13
16
|
const jobs = [];
|
|
@@ -16,13 +19,17 @@ export function getJobs(opts) {
|
|
|
16
19
|
if (opts?.webhooksEnabled) {
|
|
17
20
|
cronDefs = cronDefs.filter((def) => def.condition?.unless !== "webhooksEnabled");
|
|
18
21
|
}
|
|
22
|
+
const overrides = opts?.db?.getAllCronOverrides() ?? new Map();
|
|
19
23
|
for (const def of cronDefs) {
|
|
24
|
+
const override = overrides.get(def.name);
|
|
25
|
+
if (override && !override.enabled)
|
|
26
|
+
continue;
|
|
20
27
|
jobs.push({
|
|
21
28
|
name: def.name,
|
|
22
|
-
schedule: def.schedule,
|
|
29
|
+
schedule: override?.schedule || def.schedule,
|
|
23
30
|
workflow: def.workflow,
|
|
24
31
|
// Merge managed repos into the context the workflow receives
|
|
25
|
-
context: { repos:
|
|
32
|
+
context: { repos: getManagedRepos(), ...def.context },
|
|
26
33
|
});
|
|
27
34
|
}
|
|
28
35
|
return jobs;
|
package/dist/cron/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/cron/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/cron/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,IAAkD;IACxE,MAAM,IAAI,GAAc,EAAE,CAAC;IAE3B,IAAI,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAElC,mBAAmB;IACnB,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;QAC1B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,iBAAiB,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,SAAS;QAC5C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ;YAC5C,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,6DAA6D;YAC7D,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/cron/scheduler.d.ts
CHANGED
|
@@ -28,6 +28,18 @@ export declare class CronScheduler {
|
|
|
28
28
|
register(job: CronJob): void;
|
|
29
29
|
/** Register a lightweight direct handler (no skill/sandbox overhead) */
|
|
30
30
|
registerDirect(job: DirectCronJob): void;
|
|
31
|
+
/** Whether a cron with this name is currently registered. */
|
|
32
|
+
has(name: string): boolean;
|
|
33
|
+
/** Stop and remove a single cron. No-op if not registered. */
|
|
34
|
+
unregister(name: string): void;
|
|
35
|
+
/** Replace an existing cron with a new schedule/context. Equivalent to unregister + register. */
|
|
36
|
+
update(job: CronJob): void;
|
|
37
|
+
/** Snapshot of registered jobs with the croner-computed next-run timestamp. */
|
|
38
|
+
list(): Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
schedule: string;
|
|
41
|
+
nextRun: Date | null;
|
|
42
|
+
}>;
|
|
31
43
|
/** Stop all cron jobs */
|
|
32
44
|
stopAll(): void;
|
|
33
45
|
}
|
package/dist/cron/scheduler.js
CHANGED
|
@@ -30,7 +30,7 @@ export class CronScheduler {
|
|
|
30
30
|
catch (err) {
|
|
31
31
|
console.error(`[cron] ${job.name} failed:`, err.message);
|
|
32
32
|
// Check consecutive failures (tracked under the workflow name)
|
|
33
|
-
const failures = this.db.consecutiveFailures(job.workflow);
|
|
33
|
+
const failures = this.db.executions.consecutiveFailures(job.workflow);
|
|
34
34
|
const max = job.maxFailures || 3;
|
|
35
35
|
if (failures >= max) {
|
|
36
36
|
console.error(`[cron] ALERT: ${job.name} has failed ${failures} times consecutively`);
|
|
@@ -67,6 +67,32 @@ export class CronScheduler {
|
|
|
67
67
|
this.jobs.set(job.name, cronJob);
|
|
68
68
|
console.log(`[cron] Registered: ${job.name} (${job.schedule})`);
|
|
69
69
|
}
|
|
70
|
+
/** Whether a cron with this name is currently registered. */
|
|
71
|
+
has(name) {
|
|
72
|
+
return this.jobs.has(name);
|
|
73
|
+
}
|
|
74
|
+
/** Stop and remove a single cron. No-op if not registered. */
|
|
75
|
+
unregister(name) {
|
|
76
|
+
const job = this.jobs.get(name);
|
|
77
|
+
if (!job)
|
|
78
|
+
return;
|
|
79
|
+
job.stop();
|
|
80
|
+
this.jobs.delete(name);
|
|
81
|
+
console.log(`[cron] Stopped: ${name}`);
|
|
82
|
+
}
|
|
83
|
+
/** Replace an existing cron with a new schedule/context. Equivalent to unregister + register. */
|
|
84
|
+
update(job) {
|
|
85
|
+
this.unregister(job.name);
|
|
86
|
+
this.register(job);
|
|
87
|
+
}
|
|
88
|
+
/** Snapshot of registered jobs with the croner-computed next-run timestamp. */
|
|
89
|
+
list() {
|
|
90
|
+
return Array.from(this.jobs.entries()).map(([name, cronJob]) => ({
|
|
91
|
+
name,
|
|
92
|
+
schedule: cronJob.getPattern() ?? "",
|
|
93
|
+
nextRun: cronJob.nextRun(),
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
70
96
|
/** Stop all cron jobs */
|
|
71
97
|
stopAll() {
|
|
72
98
|
for (const [name, job] of this.jobs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAsB9B;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,GAAsB,IAAI,GAAG,EAAE,CAAC;IACpC,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACjC,EAAE,CAAU;IACZ,MAAM,CAAiB;IAE/B,YAAY,EAAW,EAAE,MAAsB;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,GAAY;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAChD,6CAA6C;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,qCAAqC,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEzD,+DAA+D;gBAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/cron/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAsB9B;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,GAAsB,IAAI,GAAG,EAAE,CAAC;IACpC,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACjC,EAAE,CAAU;IACZ,MAAM,CAAiB;IAE/B,YAAY,EAAW,EAAE,MAAsB;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,GAAY;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAChD,6CAA6C;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,qCAAqC,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEzD,+DAA+D;gBAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;gBACjC,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;oBACpB,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,eAAe,QAAQ,sBAAsB,CAAC,CAAC;oBACtF,gDAAgD;gBAClD,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,wEAAwE;IACxE,cAAc,CAAC,GAAkB;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAChD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3D,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,6DAA6D;IAC7D,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,8DAA8D;IAC9D,UAAU,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,iGAAiG;IACjG,MAAM,CAAC,GAAY;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,+EAA+E;IAC/E,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,yBAAyB;IACzB,OAAO;QACL,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { RunResult } from "agentic-pi";
|
|
2
|
+
import { type DockerSandbox } from "../sandbox/index.js";
|
|
3
|
+
import { type ExecutorConfig, type ExecutionResult, type ExtensionStatusMap, type SkillsStatus, type GitSandboxAccess } from "./profiles.js";
|
|
4
|
+
/**
|
|
5
|
+
* Stage this phase's declared skills into a per-phase bundle directory at
|
|
6
|
+
* `<workspaceRoot>/.lastlight-skills/<phaseKey>/<basename>/` and return the
|
|
7
|
+
* staged skill dirs, so the caller can point pi at them explicitly (via
|
|
8
|
+
* `--skill` for docker or `skillPaths` for the in-process backends). Each
|
|
9
|
+
* skill is a directory containing SKILL.md plus any `scripts/` / `references/`
|
|
10
|
+
* / `assets/` — the whole tree comes along.
|
|
11
|
+
*
|
|
12
|
+
* Keyed by phase so concurrent phases in one workspace never touch each
|
|
13
|
+
* other's bundle: only the phase's own `<phaseKey>` subtree is cleared, so a
|
|
14
|
+
* clean slate per phase doesn't disturb a sibling phase mid-run.
|
|
15
|
+
*
|
|
16
|
+
* `mode` controls how each skill lands:
|
|
17
|
+
* - "symlink": one symlink per skill → host source. gondolin/none, where pi
|
|
18
|
+
* reads skill files host-side / through the cwd mount. Zero-copy.
|
|
19
|
+
* - "copy": recursive copy. docker, where the agent's tools run inside the
|
|
20
|
+
* container and host symlink targets wouldn't resolve; the copy lands
|
|
21
|
+
* under the bind-mounted workspace.
|
|
22
|
+
*
|
|
23
|
+
* Returns `undefined` when the phase declares no skills (after clearing its
|
|
24
|
+
* bundle), so a phase with no `skills:` gets no catalogue at all.
|
|
25
|
+
*/
|
|
26
|
+
export declare function stageSkillBundle(workspaceRoot: string, phaseKey: string, skillPaths: string[] | undefined, mode: "symlink" | "copy"): string[] | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Add `entry` to a checkout's local `.git/info/exclude` (idempotent) so the
|
|
29
|
+
* agent's own `git add`/`commit` can never pick it up. This file lives inside
|
|
30
|
+
* `.git/` — it is never tracked, committed, or pushed, and it leaves the repo's
|
|
31
|
+
* real `.gitignore` untouched; the exclusion applies only to this ephemeral
|
|
32
|
+
* sandbox checkout. Used for the gondolin backend, where the skill bundle must
|
|
33
|
+
* be staged under cwd (the only mounted dir) rather than as an out-of-repo
|
|
34
|
+
* sibling. No-op when `repoDir` isn't a git checkout (e.g. the workspace root).
|
|
35
|
+
*/
|
|
36
|
+
export declare function excludeFromGit(repoDir: string, entry: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Execute one workflow-phase agent task via agentic-pi.
|
|
39
|
+
*
|
|
40
|
+
* Sandbox backend (decided per call):
|
|
41
|
+
* 1. gondolin — agentic-pi's QEMU micro-VM. cwd is the host worktree,
|
|
42
|
+
* mounted at /workspace inside the VM.
|
|
43
|
+
* 2. docker — the legacy container path (`src/sandbox/docker.ts`). The
|
|
44
|
+
* entrypoint inside the container execs `agentic-pi run --sandbox none`.
|
|
45
|
+
* 3. none — agentic-pi in-process with cwd = the host worktree.
|
|
46
|
+
*/
|
|
47
|
+
export declare function executeAgent(prompt: string, config: ExecutorConfig, opts?: {
|
|
48
|
+
taskId?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Fired as soon as the run gets a session id. Used to persist the id
|
|
51
|
+
* onto the in-flight executions row so the dashboard can deep-link
|
|
52
|
+
* the running phase to its live JSONL.
|
|
53
|
+
*/
|
|
54
|
+
onSessionId?: (sessionId: string) => void;
|
|
55
|
+
githubAccess?: GitSandboxAccess;
|
|
56
|
+
}): Promise<ExecutionResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Build a RunResult-shaped tally from the JSONL event stream emitted by
|
|
59
|
+
* `agentic-pi run` inside the docker sandbox. Mirrors what agentic-pi's
|
|
60
|
+
* own `run()` function does in-process — minimum viable subset of
|
|
61
|
+
* fields the executor cares about.
|
|
62
|
+
*
|
|
63
|
+
* Usage accounting accumulates each assistant `message_end`'s `usage`
|
|
64
|
+
* rather than trusting the terminal `usage_snapshot`. pi's snapshot is
|
|
65
|
+
* derived from `getSessionStats()`, which recomputes from the *current*
|
|
66
|
+
* in-memory message window — auto-compaction replaces those messages with
|
|
67
|
+
* a summary, so the snapshot reports zero tokens/cost/turns the moment a
|
|
68
|
+
* phase compacts. The per-message events fire at finalization (before any
|
|
69
|
+
* compaction rebuild), so summing them is compaction-proof. `bestStats()`
|
|
70
|
+
* prefers the accumulation and falls back to the snapshot only when no
|
|
71
|
+
* per-message usage was observed.
|
|
72
|
+
*/
|
|
73
|
+
export declare class RunResultAccumulator {
|
|
74
|
+
private sessionId?;
|
|
75
|
+
private finalText;
|
|
76
|
+
private agentEnded;
|
|
77
|
+
private toolErrors;
|
|
78
|
+
private lastToolError?;
|
|
79
|
+
private lastAssistantHadToolCall;
|
|
80
|
+
private fatalError?;
|
|
81
|
+
private snapshotStats?;
|
|
82
|
+
private messages;
|
|
83
|
+
private assistantMessages;
|
|
84
|
+
private userMessages;
|
|
85
|
+
private toolCalls;
|
|
86
|
+
private toolResults;
|
|
87
|
+
private msgInput;
|
|
88
|
+
private msgOutput;
|
|
89
|
+
private msgCacheRead;
|
|
90
|
+
private msgCacheWrite;
|
|
91
|
+
private msgCost;
|
|
92
|
+
private ext;
|
|
93
|
+
private skillsRaw?;
|
|
94
|
+
feed(r: Record<string, unknown>): void;
|
|
95
|
+
private accumulateUsage;
|
|
96
|
+
/** Stats summed from per-message usage, or undefined if none was seen. */
|
|
97
|
+
private accumulatedStats;
|
|
98
|
+
/**
|
|
99
|
+
* Prefer the per-message accumulation (compaction-proof) over pi's
|
|
100
|
+
* terminal `usage_snapshot`. Fall back to the snapshot only when the
|
|
101
|
+
* accumulation carries no token data — e.g. a provider that doesn't
|
|
102
|
+
* report per-message usage — so a non-compacted snapshot still wins.
|
|
103
|
+
*/
|
|
104
|
+
bestStats(): RunResult["stats"] | undefined;
|
|
105
|
+
build(exitCode: 0 | 1 | 2): RunResult;
|
|
106
|
+
/**
|
|
107
|
+
* Normalized extension status captured from `extension_status` events
|
|
108
|
+
* (file-search / github / web-search), or undefined if none reported.
|
|
109
|
+
* Decoupled from agentic-pi's `RunResult` type, which lags the runtime —
|
|
110
|
+
* the docker sandbox's agentic-pi emits file-search even when the harness's
|
|
111
|
+
* pinned `RunResult` type doesn't yet declare it.
|
|
112
|
+
*/
|
|
113
|
+
extensions(): ExtensionStatusMap | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Normalized skill-loading status from the gated `skills_status` event, or
|
|
116
|
+
* undefined if none was reported (agentic-pi suppresses it on a run that
|
|
117
|
+
* configured no skills and discovered none). The skill-loading counterpart
|
|
118
|
+
* to {@link extensions}.
|
|
119
|
+
*/
|
|
120
|
+
skills(): SkillsStatus | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* The last tool result that came back with `isError: true`, including the
|
|
123
|
+
* failure text — or undefined if no tool errored. This is what turns a
|
|
124
|
+
* bare `error_tool` stop reason into a human-readable cause.
|
|
125
|
+
*/
|
|
126
|
+
toolError(): {
|
|
127
|
+
tool?: string;
|
|
128
|
+
message: string;
|
|
129
|
+
} | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* True iff the run's final assistant turn ended on a tool call — meaning
|
|
132
|
+
* the agent intended to keep going but the loop stopped before it could
|
|
133
|
+
* respond to the tool result and write its answer. The signal a run was
|
|
134
|
+
* truncated (step-limit) rather than genuinely finished.
|
|
135
|
+
*/
|
|
136
|
+
endedOnToolCall(): boolean;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Detect a provider account error (out of credit, quota, rate-limited, bad key)
|
|
140
|
+
* that pi may have surfaced as plain text rather than a hard failure.
|
|
141
|
+
*
|
|
142
|
+
* Critically, on a **successful** run we scan ONLY the genuine provider-error
|
|
143
|
+
* channel (`agentErrorMessage`, which `extractAgentError` already turns into a
|
|
144
|
+
* non-success stopReason when set — so it's empty here). The agent's own output
|
|
145
|
+
* (`finalText`) and tool results (`fatalError`, `toolError`) are NOT scanned on
|
|
146
|
+
* success: a legitimate `verify`/`qa-test` report or a `curl` probing a 401
|
|
147
|
+
* endpoint routinely contains "unauthorized" / "rate limit" as part of the task
|
|
148
|
+
* itself, and folding that in would wrongly fail a genuinely successful run
|
|
149
|
+
* (and drop its report). Only on a failed run do we fold those in to label why.
|
|
150
|
+
*/
|
|
151
|
+
export declare function detectAccountError(opts: {
|
|
152
|
+
success: boolean;
|
|
153
|
+
fatalErrorMessage?: string;
|
|
154
|
+
agentErrorMessage?: string;
|
|
155
|
+
finalText?: string;
|
|
156
|
+
toolErrorText?: string;
|
|
157
|
+
}): boolean;
|
|
158
|
+
export type { DockerSandbox };
|