lastlight 0.15.0 → 0.16.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 +71 -692
- package/dist/cli-config.js.map +1 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +26 -1
- package/dist/{cli/cli-server.js → cli-server.js} +40 -5
- package/dist/cli-server.js.map +1 -0
- package/dist/cli-timeline.js.map +1 -0
- package/dist/{cli/cli.js → cli.js} +4 -3
- package/dist/cli.js.map +1 -0
- package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
- package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
- package/dist/fork-cli.js.map +1 -0
- package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
- package/dist/oauth-cli.js.map +1 -0
- package/dist/{cli/setup.js → setup.js} +10 -4
- package/dist/setup.js.map +1 -0
- package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
- package/dist/{cli/skills-install.js → skills-install.js} +6 -2
- package/dist/skills-install.js.map +1 -0
- package/package.json +20 -65
- package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
- package/agent-context/rules.md +0 -80
- package/agent-context/security.md +0 -69
- package/agent-context/soul.md +0 -21
- package/config/default.yaml +0 -119
- package/deploy/.env.production.example +0 -100
- package/deploy/entrypoint.sh +0 -82
- package/deploy/native/README.md +0 -160
- package/deploy/native/install.sh +0 -110
- package/deploy/native/lastlight.env.example +0 -95
- package/deploy/native/lastlight.service +0 -50
- package/deploy/sandbox-entrypoint.sh +0 -93
- package/dist/admin/auth.d.ts +0 -51
- package/dist/admin/auth.js +0 -121
- package/dist/admin/auth.js.map +0 -1
- package/dist/admin/chat-session-reader.d.ts +0 -39
- package/dist/admin/chat-session-reader.js +0 -84
- package/dist/admin/chat-session-reader.js.map +0 -1
- package/dist/admin/docker.d.ts +0 -61
- package/dist/admin/docker.js +0 -187
- package/dist/admin/docker.js.map +0 -1
- package/dist/admin/index.d.ts +0 -9
- package/dist/admin/index.js +0 -59
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/routes.d.ts +0 -81
- package/dist/admin/routes.js +0 -1381
- package/dist/admin/routes.js.map +0 -1
- package/dist/admin/sessions.d.ts +0 -89
- package/dist/admin/sessions.js +0 -204
- package/dist/admin/sessions.js.map +0 -1
- package/dist/admin/tail.d.ts +0 -12
- package/dist/admin/tail.js +0 -145
- package/dist/admin/tail.js.map +0 -1
- package/dist/admin/version.d.ts +0 -22
- package/dist/admin/version.js +0 -92
- package/dist/admin/version.js.map +0 -1
- package/dist/cli/cli-config.js.map +0 -1
- package/dist/cli/cli-format.js.map +0 -1
- package/dist/cli/cli-server.js.map +0 -1
- package/dist/cli/cli-timeline.js.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/fork-cli.js.map +0 -1
- package/dist/cli/oauth-cli.js.map +0 -1
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/skills-install.js.map +0 -1
- package/dist/config/config-resolve.d.ts +0 -28
- package/dist/config/config-resolve.js +0 -47
- package/dist/config/config-resolve.js.map +0 -1
- package/dist/config/config.d.ts +0 -157
- package/dist/config/config.js +0 -581
- package/dist/config/config.js.map +0 -1
- package/dist/config/core-pin.d.ts +0 -16
- package/dist/config/core-pin.js +0 -85
- package/dist/config/core-pin.js.map +0 -1
- package/dist/config/overlay-assets.d.ts +0 -20
- package/dist/config/overlay-assets.js +0 -114
- package/dist/config/overlay-assets.js.map +0 -1
- package/dist/config/overlay-bootstrap.d.ts +0 -44
- package/dist/config/overlay-bootstrap.js +0 -304
- package/dist/config/overlay-bootstrap.js.map +0 -1
- package/dist/connectors/github-webhook.d.ts +0 -45
- package/dist/connectors/github-webhook.js +0 -321
- package/dist/connectors/github-webhook.js.map +0 -1
- package/dist/connectors/index.d.ts +0 -18
- package/dist/connectors/index.js +0 -41
- package/dist/connectors/index.js.map +0 -1
- package/dist/connectors/messaging/base.d.ts +0 -42
- package/dist/connectors/messaging/base.js +0 -139
- package/dist/connectors/messaging/base.js.map +0 -1
- package/dist/connectors/messaging/delivery.d.ts +0 -14
- package/dist/connectors/messaging/delivery.js +0 -38
- package/dist/connectors/messaging/delivery.js.map +0 -1
- package/dist/connectors/messaging/index.d.ts +0 -4
- package/dist/connectors/messaging/index.js +0 -4
- package/dist/connectors/messaging/index.js.map +0 -1
- package/dist/connectors/messaging/session-manager.d.ts +0 -53
- package/dist/connectors/messaging/session-manager.js +0 -255
- package/dist/connectors/messaging/session-manager.js.map +0 -1
- package/dist/connectors/messaging/types.d.ts +0 -58
- package/dist/connectors/messaging/types.js +0 -7
- package/dist/connectors/messaging/types.js.map +0 -1
- package/dist/connectors/slack/connector.d.ts +0 -100
- package/dist/connectors/slack/connector.js +0 -341
- package/dist/connectors/slack/connector.js.map +0 -1
- package/dist/connectors/slack/index.d.ts +0 -2
- package/dist/connectors/slack/index.js +0 -3
- package/dist/connectors/slack/index.js.map +0 -1
- package/dist/connectors/slack/mrkdwn.d.ts +0 -8
- package/dist/connectors/slack/mrkdwn.js +0 -123
- package/dist/connectors/slack/mrkdwn.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -61
- package/dist/connectors/types.js +0 -2
- package/dist/connectors/types.js.map +0 -1
- package/dist/cron/fanout.d.ts +0 -33
- package/dist/cron/fanout.js +0 -55
- package/dist/cron/fanout.js.map +0 -1
- package/dist/cron/jobs.d.ts +0 -18
- package/dist/cron/jobs.js +0 -37
- package/dist/cron/jobs.js.map +0 -1
- package/dist/cron/scheduler.d.ts +0 -45
- package/dist/cron/scheduler.js +0 -105
- package/dist/cron/scheduler.js.map +0 -1
- package/dist/engine/agent-executor.d.ts +0 -34
- package/dist/engine/agent-executor.js +0 -246
- package/dist/engine/agent-executor.js.map +0 -1
- package/dist/engine/chat/chat-runner.d.ts +0 -132
- package/dist/engine/chat/chat-runner.js +0 -424
- package/dist/engine/chat/chat-runner.js.map +0 -1
- package/dist/engine/chat/chat-skills.d.ts +0 -45
- package/dist/engine/chat/chat-skills.js +0 -184
- package/dist/engine/chat/chat-skills.js.map +0 -1
- package/dist/engine/chat/chat.d.ts +0 -54
- package/dist/engine/chat/chat.js +0 -316
- package/dist/engine/chat/chat.js.map +0 -1
- package/dist/engine/chat/message-batcher.d.ts +0 -32
- package/dist/engine/chat/message-batcher.js +0 -109
- package/dist/engine/chat/message-batcher.js.map +0 -1
- package/dist/engine/dispatcher.d.ts +0 -73
- package/dist/engine/dispatcher.js +0 -663
- package/dist/engine/dispatcher.js.map +0 -1
- package/dist/engine/event-shim.d.ts +0 -117
- package/dist/engine/event-shim.js +0 -435
- package/dist/engine/event-shim.js.map +0 -1
- package/dist/engine/executors/orchestrator.d.ts +0 -81
- package/dist/engine/executors/orchestrator.js +0 -365
- package/dist/engine/executors/orchestrator.js.map +0 -1
- package/dist/engine/executors/shared.d.ts +0 -189
- package/dist/engine/executors/shared.js +0 -616
- package/dist/engine/executors/shared.js.map +0 -1
- package/dist/engine/github/git-auth.d.ts +0 -62
- package/dist/engine/github/git-auth.js +0 -161
- package/dist/engine/github/git-auth.js.map +0 -1
- package/dist/engine/github/github-app-client.d.ts +0 -23
- package/dist/engine/github/github-app-client.js +0 -33
- package/dist/engine/github/github-app-client.js.map +0 -1
- package/dist/engine/github/github-tools.d.ts +0 -18
- package/dist/engine/github/github-tools.js +0 -263
- package/dist/engine/github/github-tools.js.map +0 -1
- package/dist/engine/github/github.d.ts +0 -1193
- package/dist/engine/github/github.js +0 -357
- package/dist/engine/github/github.js.map +0 -1
- package/dist/engine/github/profiles.d.ts +0 -279
- package/dist/engine/github/profiles.js +0 -42
- package/dist/engine/github/profiles.js.map +0 -1
- package/dist/engine/github/review-poster.d.ts +0 -98
- package/dist/engine/github/review-poster.js +0 -177
- package/dist/engine/github/review-poster.js.map +0 -1
- package/dist/engine/llm.d.ts +0 -79
- package/dist/engine/llm.js +0 -269
- package/dist/engine/llm.js.map +0 -1
- package/dist/engine/oauth.d.ts +0 -43
- package/dist/engine/oauth.js +0 -103
- package/dist/engine/oauth.js.map +0 -1
- package/dist/engine/router.d.ts +0 -29
- package/dist/engine/router.js +0 -680
- package/dist/engine/router.js.map +0 -1
- package/dist/engine/screen/classifier.d.ts +0 -93
- package/dist/engine/screen/classifier.js +0 -215
- package/dist/engine/screen/classifier.js.map +0 -1
- package/dist/engine/screen/screen.d.ts +0 -41
- package/dist/engine/screen/screen.js +0 -93
- package/dist/engine/screen/screen.js.map +0 -1
- package/dist/evals-api.d.ts +0 -24
- package/dist/evals-api.js +0 -22
- package/dist/evals-api.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -923
- package/dist/index.js.map +0 -1
- package/dist/managed-repos.d.ts +0 -30
- package/dist/managed-repos.js +0 -72
- package/dist/managed-repos.js.map +0 -1
- package/dist/notify/index.d.ts +0 -15
- package/dist/notify/index.js +0 -6
- package/dist/notify/index.js.map +0 -1
- package/dist/notify/model.d.ts +0 -57
- package/dist/notify/model.js +0 -89
- package/dist/notify/model.js.map +0 -1
- package/dist/notify/notifier.d.ts +0 -17
- package/dist/notify/notifier.js +0 -87
- package/dist/notify/notifier.js.map +0 -1
- package/dist/notify/render.d.ts +0 -21
- package/dist/notify/render.js +0 -59
- package/dist/notify/render.js.map +0 -1
- package/dist/notify/transports/github.d.ts +0 -26
- package/dist/notify/transports/github.js +0 -26
- package/dist/notify/transports/github.js.map +0 -1
- package/dist/notify/transports/slack.d.ts +0 -26
- package/dist/notify/transports/slack.js +0 -28
- package/dist/notify/transports/slack.js.map +0 -1
- package/dist/notify/types.d.ts +0 -95
- package/dist/notify/types.js +0 -16
- package/dist/notify/types.js.map +0 -1
- package/dist/providers.d.ts +0 -125
- package/dist/providers.js +0 -279
- package/dist/providers.js.map +0 -1
- package/dist/sandbox/docker.d.ts +0 -180
- package/dist/sandbox/docker.js +0 -517
- package/dist/sandbox/docker.js.map +0 -1
- package/dist/sandbox/egress-allowlist.d.ts +0 -74
- package/dist/sandbox/egress-allowlist.js +0 -164
- package/dist/sandbox/egress-allowlist.js.map +0 -1
- package/dist/sandbox/egress-firewall-config.d.ts +0 -127
- package/dist/sandbox/egress-firewall-config.js +0 -434
- package/dist/sandbox/egress-firewall-config.js.map +0 -1
- package/dist/sandbox/images.d.ts +0 -23
- package/dist/sandbox/images.js +0 -55
- package/dist/sandbox/images.js.map +0 -1
- package/dist/sandbox/index.d.ts +0 -112
- package/dist/sandbox/index.js +0 -332
- package/dist/sandbox/index.js.map +0 -1
- package/dist/sandbox/sandbox.d.ts +0 -214
- package/dist/sandbox/sandbox.js +0 -453
- package/dist/sandbox/sandbox.js.map +0 -1
- package/dist/sandbox/smol.d.ts +0 -162
- package/dist/sandbox/smol.js +0 -485
- package/dist/sandbox/smol.js.map +0 -1
- package/dist/session-log.d.ts +0 -63
- package/dist/session-log.js +0 -290
- package/dist/session-log.js.map +0 -1
- package/dist/state/approval-store.d.ts +0 -88
- package/dist/state/approval-store.js +0 -149
- package/dist/state/approval-store.js.map +0 -1
- package/dist/state/build-assets.d.ts +0 -50
- package/dist/state/build-assets.js +0 -154
- package/dist/state/build-assets.js.map +0 -1
- package/dist/state/db.d.ts +0 -81
- package/dist/state/db.js +0 -155
- package/dist/state/db.js.map +0 -1
- package/dist/state/execution-store.d.ts +0 -257
- package/dist/state/execution-store.js +0 -527
- package/dist/state/execution-store.js.map +0 -1
- package/dist/state/migrate.d.ts +0 -15
- package/dist/state/migrate.js +0 -175
- package/dist/state/migrate.js.map +0 -1
- package/dist/state/workflow-run-store.d.ts +0 -216
- package/dist/state/workflow-run-store.js +0 -403
- package/dist/state/workflow-run-store.js.map +0 -1
- package/dist/telemetry/index.d.ts +0 -38
- package/dist/telemetry/index.js +0 -253
- package/dist/telemetry/index.js.map +0 -1
- package/dist/telemetry/pi-events.d.ts +0 -12
- package/dist/telemetry/pi-events.js +0 -134
- package/dist/telemetry/pi-events.js.map +0 -1
- package/dist/workflows/dag.d.ts +0 -37
- package/dist/workflows/dag.js +0 -118
- package/dist/workflows/dag.js.map +0 -1
- package/dist/workflows/loader.d.ts +0 -53
- package/dist/workflows/loader.js +0 -421
- package/dist/workflows/loader.js.map +0 -1
- package/dist/workflows/loop-eval.d.ts +0 -28
- package/dist/workflows/loop-eval.js +0 -74
- package/dist/workflows/loop-eval.js.map +0 -1
- package/dist/workflows/phase-executor.d.ts +0 -215
- package/dist/workflows/phase-executor.js +0 -1144
- package/dist/workflows/phase-executor.js.map +0 -1
- package/dist/workflows/phase-ref.d.ts +0 -50
- package/dist/workflows/phase-ref.js +0 -91
- package/dist/workflows/phase-ref.js.map +0 -1
- package/dist/workflows/resume.d.ts +0 -58
- package/dist/workflows/resume.js +0 -313
- package/dist/workflows/resume.js.map +0 -1
- package/dist/workflows/runner.d.ts +0 -63
- package/dist/workflows/runner.js +0 -364
- package/dist/workflows/runner.js.map +0 -1
- package/dist/workflows/schema.d.ts +0 -344
- package/dist/workflows/schema.js +0 -460
- package/dist/workflows/schema.js.map +0 -1
- package/dist/workflows/simple.d.ts +0 -90
- package/dist/workflows/simple.js +0 -393
- package/dist/workflows/simple.js.map +0 -1
- package/dist/workflows/target-policy.d.ts +0 -74
- package/dist/workflows/target-policy.js +0 -80
- package/dist/workflows/target-policy.js.map +0 -1
- package/dist/workflows/templates.d.ts +0 -88
- package/dist/workflows/templates.js +0 -127
- package/dist/workflows/templates.js.map +0 -1
- package/dist/workflows/triggers.d.ts +0 -21
- package/dist/workflows/triggers.js +0 -45
- package/dist/workflows/triggers.js.map +0 -1
- package/dist/workflows/verdict.d.ts +0 -19
- package/dist/workflows/verdict.js +0 -30
- package/dist/workflows/verdict.js.map +0 -1
- package/dist/worktree/manager.d.ts +0 -43
- package/dist/worktree/manager.js +0 -127
- package/dist/worktree/manager.js.map +0 -1
- package/docker-compose.yml +0 -274
- package/sandbox.Dockerfile +0 -68
- package/skills/README.md +0 -42
- package/skills/browser-qa/SKILL.md +0 -208
- package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
- package/skills/building/SKILL.md +0 -95
- package/skills/chat/SKILL.md +0 -36
- package/skills/code-review/SKILL.md +0 -82
- package/skills/debug-production/SKILL.md +0 -108
- package/skills/demo/SKILL.md +0 -228
- package/skills/demo/scripts/compose-demo.sh +0 -243
- package/skills/issue-answer/SKILL.md +0 -91
- package/skills/issue-comment/SKILL.md +0 -49
- package/skills/issue-triage/SKILL.md +0 -149
- package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
- package/skills/pr-comment/SKILL.md +0 -64
- package/skills/pr-review/SKILL.md +0 -148
- package/skills/pr-review/references/findings-schema.md +0 -89
- package/skills/qa-test/SKILL.md +0 -97
- package/skills/repo-health/SKILL.md +0 -67
- package/skills/security-feedback/SKILL.md +0 -173
- package/skills/security-feedback/references/templates.md +0 -77
- package/skills/security-review/SKILL.md +0 -215
- package/skills/security-review/references/issue-format.md +0 -302
- package/skills/verify/SKILL.md +0 -118
- package/workflows/answer.yaml +0 -44
- package/workflows/build.yaml +0 -129
- package/workflows/cron-health.yaml +0 -6
- package/workflows/cron-review.yaml +0 -8
- package/workflows/cron-security.yaml +0 -6
- package/workflows/cron-triage.yaml +0 -8
- package/workflows/demo.yaml +0 -62
- package/workflows/examples/bash-smoke.yaml +0 -41
- package/workflows/examples/parallel-review.yaml +0 -36
- package/workflows/examples/tdd-loop.yaml +0 -17
- package/workflows/explore.yaml +0 -80
- package/workflows/issue-comment.yaml +0 -15
- package/workflows/issue-triage.yaml +0 -22
- package/workflows/pr-comment.yaml +0 -16
- package/workflows/pr-fix.yaml +0 -17
- package/workflows/pr-review.yaml +0 -50
- package/workflows/prompts/answer.md +0 -68
- package/workflows/prompts/architect.md +0 -44
- package/workflows/prompts/classifier.md +0 -60
- package/workflows/prompts/classify-adds-info.md +0 -17
- package/workflows/prompts/demo.md +0 -125
- package/workflows/prompts/executor.md +0 -42
- package/workflows/prompts/explore-ask.md +0 -99
- package/workflows/prompts/explore-publish.md +0 -31
- package/workflows/prompts/explore-read.md +0 -120
- package/workflows/prompts/explore-synthesize.md +0 -88
- package/workflows/prompts/fix.md +0 -18
- package/workflows/prompts/guardrails.md +0 -96
- package/workflows/prompts/pr-fix.md +0 -26
- package/workflows/prompts/pr.md +0 -39
- package/workflows/prompts/qa-browser.md +0 -95
- package/workflows/prompts/qa-synth.md +0 -44
- package/workflows/prompts/qa-test.md +0 -60
- package/workflows/prompts/re-reviewer.md +0 -33
- package/workflows/prompts/reviewer.md +0 -60
- package/workflows/prompts/verify-browser.md +0 -93
- package/workflows/prompts/verify-synth.md +0 -44
- package/workflows/prompts/verify.md +0 -63
- package/workflows/qa-test.yaml +0 -94
- package/workflows/repo-health.yaml +0 -15
- package/workflows/security-feedback.yaml +0 -25
- package/workflows/security-review.yaml +0 -37
- package/workflows/verify.yaml +0 -93
- /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
- /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
- /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
- /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
- /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
- /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
- /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
- /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
- /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
package/dist/admin/auth.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
const TOKEN_TTL_SECONDS = 60 * 60 * 24 * 30; // 30 days
|
|
3
|
-
/**
|
|
4
|
-
* Grace window past `exp` in which a token can still be *refreshed* (but not
|
|
5
|
-
* used to authenticate a normal request). Lets an active user whose token
|
|
6
|
-
* lapsed briefly slide their session forward via the refresh route instead of
|
|
7
|
-
* being bounced back through a full login. Beyond this, they must re-login.
|
|
8
|
-
*/
|
|
9
|
-
export const REFRESH_GRACE_SECONDS = 60 * 60 * 24 * 7; // 7 days
|
|
10
|
-
export function createToken(secret, method) {
|
|
11
|
-
const payload = { exp: Math.floor(Date.now() / 1000) + TOKEN_TTL_SECONDS };
|
|
12
|
-
if (method)
|
|
13
|
-
payload.method = method;
|
|
14
|
-
const payloadB64 = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
15
|
-
const sig = crypto.createHmac("sha256", secret).update(payloadB64).digest("base64url");
|
|
16
|
-
return `${payloadB64}.${sig}`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Verify the HMAC signature and return the decoded payload, or null if the
|
|
20
|
-
* signature is invalid / the payload is unparseable. Does NOT check expiry —
|
|
21
|
-
* that's the caller's job (strict for auth, lenient for refresh).
|
|
22
|
-
*/
|
|
23
|
-
function verifySignature(token, secret) {
|
|
24
|
-
const parts = token.split(".");
|
|
25
|
-
if (parts.length !== 2)
|
|
26
|
-
return null;
|
|
27
|
-
const [payloadB64, sig] = parts;
|
|
28
|
-
const expectedSig = crypto.createHmac("sha256", secret).update(payloadB64).digest("base64url");
|
|
29
|
-
if (expectedSig.length !== sig.length ||
|
|
30
|
-
!crypto.timingSafeEqual(Buffer.from(expectedSig), Buffer.from(sig))) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
return decodeToken(token);
|
|
34
|
-
}
|
|
35
|
-
export function verifyToken(token, secret) {
|
|
36
|
-
const payload = verifySignature(token, secret);
|
|
37
|
-
if (!payload)
|
|
38
|
-
return false;
|
|
39
|
-
return Math.floor(Date.now() / 1000) < payload.exp;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Like `verifyToken`, but also accepts a token that expired within the last
|
|
43
|
-
* `REFRESH_GRACE_SECONDS`. Used ONLY by the refresh route so a briefly-lapsed
|
|
44
|
-
* session can be renewed. The signature must still be valid (we minted it), so
|
|
45
|
-
* this can't be forged.
|
|
46
|
-
*/
|
|
47
|
-
export function verifyTokenForRefresh(token, secret) {
|
|
48
|
-
const payload = verifySignature(token, secret);
|
|
49
|
-
if (!payload)
|
|
50
|
-
return false;
|
|
51
|
-
return Math.floor(Date.now() / 1000) < payload.exp + REFRESH_GRACE_SECONDS;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Decode a token's payload WITHOUT verifying its signature or expiry — used to
|
|
55
|
-
* carry the login `method` across a refresh. Callers that need authenticity
|
|
56
|
-
* must still gate on `verifyToken` (the refresh route runs behind
|
|
57
|
-
* `authMiddleware`, which does exactly that). Returns null if unparseable.
|
|
58
|
-
*/
|
|
59
|
-
export function decodeToken(token) {
|
|
60
|
-
const parts = token.split(".");
|
|
61
|
-
if (parts.length !== 2)
|
|
62
|
-
return null;
|
|
63
|
-
try {
|
|
64
|
-
const payload = JSON.parse(Buffer.from(parts[0], "base64url").toString("utf8"));
|
|
65
|
-
if (typeof payload.exp !== "number")
|
|
66
|
-
return null;
|
|
67
|
-
const method = payload.method;
|
|
68
|
-
return {
|
|
69
|
-
exp: payload.exp,
|
|
70
|
-
method: method === "password" || method === "slack" || method === "github" ? method : undefined,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Whether any login method is configured — an admin password OR a working OAuth
|
|
79
|
-
* provider. The single source of truth for "is auth on", shared by the admin
|
|
80
|
-
* dashboard and the `/api/*` trigger routes so they can't drift. The GitHub
|
|
81
|
-
* gate, like the OAuth route, also requires an allowed-org to be set.
|
|
82
|
-
*/
|
|
83
|
-
export function authIsEnabled(opts) {
|
|
84
|
-
const slack = Boolean(opts.slackOAuthClientId && opts.slackOAuthClientSecret);
|
|
85
|
-
const github = Boolean(opts.githubOAuthClientId && opts.githubOAuthClientSecret && opts.githubAllowedOrg);
|
|
86
|
-
return Boolean(opts.adminPassword) || slack || github;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Gate the admin API. `enabled` should be true when ANY login method is
|
|
90
|
-
* configured — an admin password OR a working OAuth provider. Gating only on
|
|
91
|
-
* the password (the old behaviour) left the dashboard fully open whenever the
|
|
92
|
-
* password was cleared, even with Slack/GitHub OAuth set up.
|
|
93
|
-
*/
|
|
94
|
-
export function authMiddleware(enabled, secret) {
|
|
95
|
-
return async (c, next) => {
|
|
96
|
-
if (!enabled)
|
|
97
|
-
return next();
|
|
98
|
-
const path = new URL(c.req.url).pathname;
|
|
99
|
-
// Let login + health + OAuth routes through
|
|
100
|
-
if (path.endsWith("/login") ||
|
|
101
|
-
path.endsWith("/token/refresh") ||
|
|
102
|
-
path.endsWith("/health") ||
|
|
103
|
-
path.endsWith("/auth-required") ||
|
|
104
|
-
path.endsWith("/oauth/slack/authorize") ||
|
|
105
|
-
path.endsWith("/oauth/slack/callback") ||
|
|
106
|
-
path.endsWith("/oauth/github/authorize") ||
|
|
107
|
-
path.endsWith("/oauth/github/callback")) {
|
|
108
|
-
return next();
|
|
109
|
-
}
|
|
110
|
-
const header = c.req.header("Authorization");
|
|
111
|
-
let token = header?.startsWith("Bearer ") ? header.slice(7) : undefined;
|
|
112
|
-
// EventSource can't set headers — allow token via query param
|
|
113
|
-
if (!token)
|
|
114
|
-
token = c.req.query("token") ?? undefined;
|
|
115
|
-
if (!token || !verifyToken(token, secret)) {
|
|
116
|
-
return c.json({ error: "unauthorized" }, 401);
|
|
117
|
-
}
|
|
118
|
-
return next();
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=auth.js.map
|
package/dist/admin/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/admin/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { StateDb } from "../state/db.js";
|
|
2
|
-
import { SessionLog, type JsonlMessage } from "../session-log.js";
|
|
3
|
-
import type { SessionSource, SessionMeta } from "./sessions.js";
|
|
4
|
-
/**
|
|
5
|
-
* DB-backed chat-session reader. Drop-in replacement for SessionReader on
|
|
6
|
-
* the chat path: same public surface (`mountSessionRoutes` works against it
|
|
7
|
-
* unchanged), but listing comes from the executions table grouped by Slack
|
|
8
|
-
* thread, and message reads target the single jsonl file owned by that
|
|
9
|
-
* thread's pi-ai session id. SessionLog owns the on-disk CHAT_PROJECT_SLUG
|
|
10
|
-
* path resolution, so this reader does not scan unrelated `agent-*.jsonl`
|
|
11
|
-
* sidechain files from other in-process Agent SDK runs.
|
|
12
|
-
*
|
|
13
|
-
* Conceptual mapping:
|
|
14
|
-
* - SessionMeta.id ← messaging_session.id (= Slack thread / executions.trigger_id)
|
|
15
|
-
* - jsonl on disk ← SessionLog CHAT_PROJECT_SLUG file for
|
|
16
|
-
* messaging_sessions.agent_session_id
|
|
17
|
-
*/
|
|
18
|
-
export declare class ChatSessionReader implements SessionSource {
|
|
19
|
-
private db;
|
|
20
|
-
private sessionLog;
|
|
21
|
-
constructor(db: StateDb, sessionsHomeDir: string);
|
|
22
|
-
constructor(db: StateDb, sessionLog: SessionLog);
|
|
23
|
-
/** All chat thread ids (= Slack threads) that have at least one chat execution. */
|
|
24
|
-
listSessionIds(): string[];
|
|
25
|
-
exists(id: string): boolean;
|
|
26
|
-
getSessionMeta(id: string): Promise<SessionMeta | null>;
|
|
27
|
-
read(id: string): Promise<Array<{
|
|
28
|
-
index: number;
|
|
29
|
-
msg: JsonlMessage;
|
|
30
|
-
}>>;
|
|
31
|
-
/**
|
|
32
|
-
* Resolve a thread id to its on-disk Agent SDK jsonl. Returns null if
|
|
33
|
-
* the thread has no agent_session_id yet (pre-resume) or the jsonl file
|
|
34
|
-
* doesn't exist on disk (deleted, rotated, or written by a different
|
|
35
|
-
* Agent SDK installation).
|
|
36
|
-
*/
|
|
37
|
-
getFilePath(id: string): string | null;
|
|
38
|
-
normalizeRawLine(raw: Record<string, unknown>): JsonlMessage[];
|
|
39
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { CHAT_PROJECT_SLUG, SessionLog, } from "../session-log.js";
|
|
2
|
-
/**
|
|
3
|
-
* DB-backed chat-session reader. Drop-in replacement for SessionReader on
|
|
4
|
-
* the chat path: same public surface (`mountSessionRoutes` works against it
|
|
5
|
-
* unchanged), but listing comes from the executions table grouped by Slack
|
|
6
|
-
* thread, and message reads target the single jsonl file owned by that
|
|
7
|
-
* thread's pi-ai session id. SessionLog owns the on-disk CHAT_PROJECT_SLUG
|
|
8
|
-
* path resolution, so this reader does not scan unrelated `agent-*.jsonl`
|
|
9
|
-
* sidechain files from other in-process Agent SDK runs.
|
|
10
|
-
*
|
|
11
|
-
* Conceptual mapping:
|
|
12
|
-
* - SessionMeta.id ← messaging_session.id (= Slack thread / executions.trigger_id)
|
|
13
|
-
* - jsonl on disk ← SessionLog CHAT_PROJECT_SLUG file for
|
|
14
|
-
* messaging_sessions.agent_session_id
|
|
15
|
-
*/
|
|
16
|
-
export class ChatSessionReader {
|
|
17
|
-
db;
|
|
18
|
-
sessionLog;
|
|
19
|
-
constructor(db, sessionsHomeDirOrLog) {
|
|
20
|
-
this.db = db;
|
|
21
|
-
this.sessionLog = typeof sessionsHomeDirOrLog === "string"
|
|
22
|
-
? new SessionLog(sessionsHomeDirOrLog)
|
|
23
|
-
: sessionsHomeDirOrLog;
|
|
24
|
-
}
|
|
25
|
-
/** All chat thread ids (= Slack threads) that have at least one chat execution. */
|
|
26
|
-
listSessionIds() {
|
|
27
|
-
// Soft cap at 500 — anything older than that almost certainly won't be
|
|
28
|
-
// surfaced after the dashboard's per-tab filters anyway.
|
|
29
|
-
return this.db.executions.listChatThreads(500).map((t) => t.triggerId);
|
|
30
|
-
}
|
|
31
|
-
exists(id) {
|
|
32
|
-
return this.db.executions.getChatThread(id) !== null;
|
|
33
|
-
}
|
|
34
|
-
async getSessionMeta(id) {
|
|
35
|
-
const t = this.db.executions.getChatThread(id);
|
|
36
|
-
if (!t)
|
|
37
|
-
return null;
|
|
38
|
-
const startedAt = new Date(t.firstStartedAt).getTime() / 1000;
|
|
39
|
-
const lastMessageAt = new Date(t.lastActivityAt).getTime() / 1000;
|
|
40
|
-
// sessionType "chat" lets the dashboard SessionFilters show a chat
|
|
41
|
-
// chip and gives the user a meaningful label.
|
|
42
|
-
return {
|
|
43
|
-
id,
|
|
44
|
-
source: "chat",
|
|
45
|
-
sessionType: "chat",
|
|
46
|
-
model: null,
|
|
47
|
-
started_at: Number.isNaN(startedAt) ? Date.now() / 1000 : startedAt,
|
|
48
|
-
last_message_at: Number.isNaN(lastMessageAt) ? null : lastMessageAt,
|
|
49
|
-
message_count: t.turnCount,
|
|
50
|
-
tool_call_count: 0,
|
|
51
|
-
conversation_message_count: t.turnCount,
|
|
52
|
-
last_assistant_content: t.lastAssistantContent,
|
|
53
|
-
agentIds: [],
|
|
54
|
-
platform: t.platform,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
async read(id) {
|
|
58
|
-
const thread = this.db.executions.getChatThread(id);
|
|
59
|
-
if (!thread?.agentSessionId)
|
|
60
|
-
return [];
|
|
61
|
-
return this.sessionLog.readNormalizedSession("chat", thread.agentSessionId, {
|
|
62
|
-
includeAgents: false,
|
|
63
|
-
skipEmptySystem: true,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Resolve a thread id to its on-disk Agent SDK jsonl. Returns null if
|
|
68
|
-
* the thread has no agent_session_id yet (pre-resume) or the jsonl file
|
|
69
|
-
* doesn't exist on disk (deleted, rotated, or written by a different
|
|
70
|
-
* Agent SDK installation).
|
|
71
|
-
*/
|
|
72
|
-
getFilePath(id) {
|
|
73
|
-
const thread = this.db.executions.getChatThread(id);
|
|
74
|
-
if (!thread || !thread.agentSessionId)
|
|
75
|
-
return null;
|
|
76
|
-
return this.sessionLog.pathForProject(CHAT_PROJECT_SLUG, thread.agentSessionId, {
|
|
77
|
-
requireExists: true,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
normalizeRawLine(raw) {
|
|
81
|
-
return this.sessionLog.normalizeLine(raw);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=chat-session-reader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session-reader.js","sourceRoot":"","sources":["../../src/admin/chat-session-reader.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/docker.d.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
export interface ContainerInfo {
|
|
2
|
-
id: string;
|
|
3
|
-
name: string;
|
|
4
|
-
status: string;
|
|
5
|
-
created: string;
|
|
6
|
-
taskId: string | null;
|
|
7
|
-
image: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ContainerStats {
|
|
10
|
-
name: string;
|
|
11
|
-
cpuPercent: number;
|
|
12
|
-
memUsageBytes: number;
|
|
13
|
-
memLimitBytes: number;
|
|
14
|
-
memPercent: number;
|
|
15
|
-
}
|
|
16
|
-
export declare function killContainer(containerName: string): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* Snapshot CPU/memory for every container whose name starts with `lastlight-`
|
|
19
|
-
* (the agent itself plus any active sandboxes). Uses `docker stats --no-stream`
|
|
20
|
-
* so each call is one read of cgroup counters — slower than a metadata lookup
|
|
21
|
-
* but still ~sub-second on a small fleet.
|
|
22
|
-
*/
|
|
23
|
-
export declare function getContainerStats(): Promise<ContainerStats[]>;
|
|
24
|
-
export declare function listRunningContainers(): Promise<ContainerInfo[]>;
|
|
25
|
-
export interface ServerContainer {
|
|
26
|
-
name: string;
|
|
27
|
-
/** Short label derived from the compose name: lastlight-<service>-<n>. */
|
|
28
|
-
service: string;
|
|
29
|
-
status: string;
|
|
30
|
-
image: string;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Every `lastlight-*` container (the agent plus the egress sidecars,
|
|
34
|
-
* otel-collector, dozzle, and any live sandboxes) — running or stopped. Used
|
|
35
|
-
* by the server-logs endpoints so an operator can read the harness/docker logs
|
|
36
|
-
* over the admin API instead of SSHing to the host.
|
|
37
|
-
*/
|
|
38
|
-
export declare function listServerContainers(): Promise<ServerContainer[]>;
|
|
39
|
-
/**
|
|
40
|
-
* Resolve a requested container (by full name OR short service label) to a real
|
|
41
|
-
* `lastlight-*` container name, validated against the live list. Returns null
|
|
42
|
-
* if nothing matches — callers reject the request, so an arbitrary container
|
|
43
|
-
* name can never reach `docker logs`. With no request, defaults to the agent.
|
|
44
|
-
*/
|
|
45
|
-
export declare function resolveServerContainer(requested?: string): Promise<string | null>;
|
|
46
|
-
/**
|
|
47
|
-
* One-shot `docker logs` for a container, newest `tail` lines. `--timestamps`
|
|
48
|
-
* lets us interleave the container's stdout and stderr (captured on separate
|
|
49
|
-
* fds) back into chronological order — RFC3339 prefixes sort lexically.
|
|
50
|
-
*/
|
|
51
|
-
export declare function getContainerLogs(name: string, opts?: {
|
|
52
|
-
tail?: number;
|
|
53
|
-
since?: string;
|
|
54
|
-
}): Promise<string[]>;
|
|
55
|
-
/**
|
|
56
|
-
* Follow `docker logs -f` for a container, invoking `onLine` per line from both
|
|
57
|
-
* stdout and stderr. Returns a stop function that kills the child process.
|
|
58
|
-
*/
|
|
59
|
-
export declare function streamContainerLogs(name: string, opts: {
|
|
60
|
-
tail?: number;
|
|
61
|
-
}, onLine: (line: string) => void): () => void;
|
package/dist/admin/docker.js
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { execFile, spawn } from "node:child_process";
|
|
2
|
-
import { promisify } from "node:util";
|
|
3
|
-
const exec = promisify(execFile);
|
|
4
|
-
export async function killContainer(containerName) {
|
|
5
|
-
await exec("docker", ["rm", "-f", containerName]);
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Snapshot CPU/memory for every container whose name starts with `lastlight-`
|
|
9
|
-
* (the agent itself plus any active sandboxes). Uses `docker stats --no-stream`
|
|
10
|
-
* so each call is one read of cgroup counters — slower than a metadata lookup
|
|
11
|
-
* but still ~sub-second on a small fleet.
|
|
12
|
-
*/
|
|
13
|
-
export async function getContainerStats() {
|
|
14
|
-
try {
|
|
15
|
-
const { stdout } = await exec("docker", [
|
|
16
|
-
"stats",
|
|
17
|
-
"--no-stream",
|
|
18
|
-
"--format", "{{json .}}",
|
|
19
|
-
]);
|
|
20
|
-
if (!stdout.trim())
|
|
21
|
-
return [];
|
|
22
|
-
return stdout
|
|
23
|
-
.trim()
|
|
24
|
-
.split("\n")
|
|
25
|
-
.map((line) => JSON.parse(line))
|
|
26
|
-
.filter((c) => (c.Name ?? "").startsWith("lastlight"))
|
|
27
|
-
.map((c) => {
|
|
28
|
-
const name = c.Name ?? "";
|
|
29
|
-
const cpuPercent = parsePercent(c.CPUPerc);
|
|
30
|
-
const memPercent = parsePercent(c.MemPerc);
|
|
31
|
-
const [usage, limit] = parseMemUsage(c.MemUsage);
|
|
32
|
-
return {
|
|
33
|
-
name,
|
|
34
|
-
cpuPercent,
|
|
35
|
-
memUsageBytes: usage,
|
|
36
|
-
memLimitBytes: limit,
|
|
37
|
-
memPercent,
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return [];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function parsePercent(raw) {
|
|
46
|
-
if (!raw)
|
|
47
|
-
return 0;
|
|
48
|
-
const n = parseFloat(raw.replace("%", "").trim());
|
|
49
|
-
return Number.isFinite(n) ? n : 0;
|
|
50
|
-
}
|
|
51
|
-
// Docker formats memory like "123.4MiB / 7.7GiB" — convert each side to bytes.
|
|
52
|
-
function parseMemUsage(raw) {
|
|
53
|
-
if (!raw)
|
|
54
|
-
return [0, 0];
|
|
55
|
-
const parts = raw.split("/").map((p) => p.trim());
|
|
56
|
-
return [parseSize(parts[0] ?? ""), parseSize(parts[1] ?? "")];
|
|
57
|
-
}
|
|
58
|
-
function parseSize(raw) {
|
|
59
|
-
const m = raw.match(/^([\d.]+)\s*([KMGT]?i?B)$/i);
|
|
60
|
-
if (!m)
|
|
61
|
-
return 0;
|
|
62
|
-
const value = parseFloat(m[1]);
|
|
63
|
-
const unit = m[2].toLowerCase();
|
|
64
|
-
const multipliers = {
|
|
65
|
-
b: 1,
|
|
66
|
-
kb: 1e3, mb: 1e6, gb: 1e9, tb: 1e12,
|
|
67
|
-
kib: 1024, mib: 1024 ** 2, gib: 1024 ** 3, tib: 1024 ** 4,
|
|
68
|
-
};
|
|
69
|
-
return value * (multipliers[unit] ?? 1);
|
|
70
|
-
}
|
|
71
|
-
export async function listRunningContainers() {
|
|
72
|
-
try {
|
|
73
|
-
const { stdout } = await exec("docker", [
|
|
74
|
-
"ps",
|
|
75
|
-
"--filter", "name=lastlight-sandbox",
|
|
76
|
-
"--format", "{{json .}}",
|
|
77
|
-
]);
|
|
78
|
-
if (!stdout.trim())
|
|
79
|
-
return [];
|
|
80
|
-
return stdout
|
|
81
|
-
.trim()
|
|
82
|
-
.split("\n")
|
|
83
|
-
.map((line) => {
|
|
84
|
-
const c = JSON.parse(line);
|
|
85
|
-
const name = c.Names ?? c.Name ?? "";
|
|
86
|
-
// Parse taskId from: lastlight-sandbox-{taskId}-{uuid}
|
|
87
|
-
const match = name.match(/^lastlight-sandbox-(.+?)-[a-f0-9]{8}$/);
|
|
88
|
-
return {
|
|
89
|
-
id: c.ID ?? "",
|
|
90
|
-
name,
|
|
91
|
-
status: c.Status ?? "",
|
|
92
|
-
created: c.CreatedAt ?? c.RunningFor ?? "",
|
|
93
|
-
taskId: match?.[1] ?? null,
|
|
94
|
-
image: c.Image ?? "",
|
|
95
|
-
};
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
return [];
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Every `lastlight-*` container (the agent plus the egress sidecars,
|
|
104
|
-
* otel-collector, dozzle, and any live sandboxes) — running or stopped. Used
|
|
105
|
-
* by the server-logs endpoints so an operator can read the harness/docker logs
|
|
106
|
-
* over the admin API instead of SSHing to the host.
|
|
107
|
-
*/
|
|
108
|
-
export async function listServerContainers() {
|
|
109
|
-
try {
|
|
110
|
-
const { stdout } = await exec("docker", [
|
|
111
|
-
"ps", "-a",
|
|
112
|
-
"--filter", "name=lastlight-",
|
|
113
|
-
"--format", "{{json .}}",
|
|
114
|
-
]);
|
|
115
|
-
if (!stdout.trim())
|
|
116
|
-
return [];
|
|
117
|
-
return stdout.trim().split("\n").map((line) => {
|
|
118
|
-
const c = JSON.parse(line);
|
|
119
|
-
const name = c.Names ?? c.Name ?? "";
|
|
120
|
-
return {
|
|
121
|
-
name,
|
|
122
|
-
service: name.replace(/^lastlight-/, "").replace(/-\d+$/, ""),
|
|
123
|
-
status: c.Status ?? "",
|
|
124
|
-
image: c.Image ?? "",
|
|
125
|
-
};
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Resolve a requested container (by full name OR short service label) to a real
|
|
134
|
-
* `lastlight-*` container name, validated against the live list. Returns null
|
|
135
|
-
* if nothing matches — callers reject the request, so an arbitrary container
|
|
136
|
-
* name can never reach `docker logs`. With no request, defaults to the agent.
|
|
137
|
-
*/
|
|
138
|
-
export async function resolveServerContainer(requested) {
|
|
139
|
-
const containers = await listServerContainers();
|
|
140
|
-
if (requested) {
|
|
141
|
-
const hit = containers.find((c) => c.name === requested || c.service === requested);
|
|
142
|
-
return hit?.name ?? null;
|
|
143
|
-
}
|
|
144
|
-
const agent = containers.find((c) => c.service === "agent" || c.name.includes("-agent-"));
|
|
145
|
-
return agent?.name ?? containers[0]?.name ?? null;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* One-shot `docker logs` for a container, newest `tail` lines. `--timestamps`
|
|
149
|
-
* lets us interleave the container's stdout and stderr (captured on separate
|
|
150
|
-
* fds) back into chronological order — RFC3339 prefixes sort lexically.
|
|
151
|
-
*/
|
|
152
|
-
export async function getContainerLogs(name, opts = {}) {
|
|
153
|
-
const args = ["logs", "--timestamps", "--tail", String(opts.tail ?? 200)];
|
|
154
|
-
if (opts.since)
|
|
155
|
-
args.push("--since", opts.since);
|
|
156
|
-
args.push(name);
|
|
157
|
-
const { stdout, stderr } = await exec("docker", args, { maxBuffer: 32 * 1024 * 1024 });
|
|
158
|
-
const lines = [
|
|
159
|
-
...(stdout ? stdout.split("\n") : []),
|
|
160
|
-
...(stderr ? stderr.split("\n") : []),
|
|
161
|
-
].filter((l) => l.length > 0);
|
|
162
|
-
lines.sort((a, b) => a.slice(0, 30).localeCompare(b.slice(0, 30)));
|
|
163
|
-
return lines;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Follow `docker logs -f` for a container, invoking `onLine` per line from both
|
|
167
|
-
* stdout and stderr. Returns a stop function that kills the child process.
|
|
168
|
-
*/
|
|
169
|
-
export function streamContainerLogs(name, opts, onLine) {
|
|
170
|
-
const child = spawn("docker", [
|
|
171
|
-
"logs", "-f", "--timestamps", "--tail", String(opts.tail ?? 200), name,
|
|
172
|
-
]);
|
|
173
|
-
const handle = (buf) => {
|
|
174
|
-
for (const line of buf.toString().split("\n"))
|
|
175
|
-
if (line)
|
|
176
|
-
onLine(line);
|
|
177
|
-
};
|
|
178
|
-
child.stdout?.on("data", handle);
|
|
179
|
-
child.stderr?.on("data", handle);
|
|
180
|
-
return () => {
|
|
181
|
-
try {
|
|
182
|
-
child.kill("SIGKILL");
|
|
183
|
-
}
|
|
184
|
-
catch { /* already dead */ }
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=docker.js.map
|
package/dist/admin/docker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/admin/docker.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/index.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Hono } from "hono";
|
|
2
|
-
import type { StateDb } from "../state/db.js";
|
|
3
|
-
import { type AdminConfig } from "./routes.js";
|
|
4
|
-
export { type AdminConfig } from "./routes.js";
|
|
5
|
-
/**
|
|
6
|
-
* Mount admin routes and dashboard static files onto the given Hono app.
|
|
7
|
-
* This mounts directly so paths like /admin/assets/* resolve correctly.
|
|
8
|
-
*/
|
|
9
|
-
export declare function mountAdmin(app: Hono, db: StateDb, config: AdminConfig): void;
|
package/dist/admin/index.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { serveStatic } from "@hono/node-server/serve-static";
|
|
2
|
-
import { SessionReader } from "./sessions.js";
|
|
3
|
-
import { ChatSessionReader } from "./chat-session-reader.js";
|
|
4
|
-
import { createAdminRoutes, binaryMimeForArtifact, rangeResponse } from "./routes.js";
|
|
5
|
-
import { SessionLog } from "../session-log.js";
|
|
6
|
-
import { BuildAssetStore } from "../state/build-assets.js";
|
|
7
|
-
/**
|
|
8
|
-
* Mount admin routes and dashboard static files onto the given Hono app.
|
|
9
|
-
* This mounts directly so paths like /admin/assets/* resolve correctly.
|
|
10
|
-
*/
|
|
11
|
-
export function mountAdmin(app, db, config) {
|
|
12
|
-
const sessionLog = new SessionLog(config.sessionsDir);
|
|
13
|
-
const sessions = new SessionReader(sessionLog, "sandbox");
|
|
14
|
-
// Chat is DB-backed: list comes from `executions` grouped by trigger_id
|
|
15
|
-
// (the Slack thread), and message reads target the single jsonl owned by
|
|
16
|
-
// that thread's agent_session_id rather than scanning every file in -app.
|
|
17
|
-
const chatSessions = new ChatSessionReader(db, sessionLog);
|
|
18
|
-
const apiRoutes = createAdminRoutes(db, sessions, chatSessions, config);
|
|
19
|
-
// PUBLIC, unauthenticated, MEDIA-ONLY artifact route — registered on the
|
|
20
|
-
// PARENT app BEFORE the `/admin/api` sub-app so it never enters that sub-app's
|
|
21
|
-
// `authMiddleware`. Browser-QA screenshots AND `/demo` videos embedded in a
|
|
22
|
-
// GitHub comment must be fetchable with no login: GitHub's image proxy fetches
|
|
23
|
-
// <img> screenshots, and a viewer's browser streams <video> (sending `Range`
|
|
24
|
-
// requests — hence rangeResponse). Non-media docs 404, so text handoff docs
|
|
25
|
-
// (architect-plan.md, status.md, …) are NEVER exposed here — they stay behind
|
|
26
|
-
// auth at `/admin/api/artifacts/*`. `BuildAssetStore`'s per-segment validation
|
|
27
|
-
// blocks path traversal on every param.
|
|
28
|
-
// NOTE: this makes screenshots/videos of the served app publicly reachable by
|
|
29
|
-
// URL — acceptable for public repos; revisit (visibility check / signed token)
|
|
30
|
-
// before enabling for private repos.
|
|
31
|
-
const publicArtifactStore = config.buildAssetsDir
|
|
32
|
-
? new BuildAssetStore(config.buildAssetsDir)
|
|
33
|
-
: null;
|
|
34
|
-
app.get("/admin/api/public/artifacts/:owner/:repo/:key/:doc", (c) => {
|
|
35
|
-
if (!publicArtifactStore)
|
|
36
|
-
return c.json({ error: "build-assets store not configured" }, 404);
|
|
37
|
-
const { owner, repo, key, doc } = c.req.param();
|
|
38
|
-
const mime = binaryMimeForArtifact(doc);
|
|
39
|
-
if (!mime)
|
|
40
|
-
return c.json({ error: `not found: ${doc}` }, 404); // media-only gate
|
|
41
|
-
try {
|
|
42
|
-
const buf = publicArtifactStore.readBuffer({ owner, repo, issueKey: key }, doc);
|
|
43
|
-
if (buf === undefined)
|
|
44
|
-
return c.json({ error: `not found: ${doc}` }, 404);
|
|
45
|
-
return rangeResponse(c.req.header("range"), buf, mime, "public, max-age=300");
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
return c.json({ error: err instanceof Error ? err.message : String(err) }, 400);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
// API at /admin/api/*
|
|
52
|
-
app.route("/admin/api", apiRoutes);
|
|
53
|
-
// Static dashboard assets at /admin/*
|
|
54
|
-
app.use("/admin/*", serveStatic({ root: "dashboard/dist", rewriteRequestPath: (p) => p.replace(/^\/admin/, "") }));
|
|
55
|
-
// SPA fallback — serve index.html for any /admin/* that didn't match above
|
|
56
|
-
app.get("/admin/*", serveStatic({ root: "dashboard/dist", path: "index.html" }));
|
|
57
|
-
app.get("/admin", serveStatic({ root: "dashboard/dist", path: "index.html" }));
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=index.js.map
|
package/dist/admin/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
|