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/sandbox/sandbox.js
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import { join, relative } from "path";
|
|
2
|
-
import { mkdtempSync, mkdirSync, rmSync } from "fs";
|
|
3
|
-
import { tmpdir } from "os";
|
|
4
|
-
import { spawnSync } from "child_process";
|
|
5
|
-
import { createTaskSandbox, setupTaskWorktree, prePopulateWorkspace } from "./index.js";
|
|
6
|
-
import { SmolSandbox as SmolDriver, smolAvailable, SMOL_WORKSPACE_DIR } from "./smol.js";
|
|
7
|
-
import { ALLOW_ALL_SENTINEL } from "./egress-allowlist.js";
|
|
8
|
-
import { getDockerSandboxOtelEnv, getOtelEnvForSandbox } from "../telemetry/index.js";
|
|
9
|
-
import { DOCKER_WORKSPACE_DIR, SKILL_BUNDLE_ROOT, stageSkillBundle, excludeFromGit, applyEnv, } from "../engine/executors/shared.js";
|
|
10
|
-
/**
|
|
11
|
-
* Inner-run git identity, shared by every adapter's agent path. Takes the
|
|
12
|
-
* resolved bot login (e.g. `last-light[bot]` / `nearform-lastlight[bot]`) so
|
|
13
|
-
* agent commits are attributed to the actual App — including a `BOT_LOGIN`
|
|
14
|
-
* override, which the caller resolves before passing it here.
|
|
15
|
-
*/
|
|
16
|
-
export function agentGitIdentityEnv(botLogin) {
|
|
17
|
-
const login = botLogin;
|
|
18
|
-
return {
|
|
19
|
-
GIT_AUTHOR_NAME: login,
|
|
20
|
-
GIT_AUTHOR_EMAIL: `${login}@users.noreply.github.com`,
|
|
21
|
-
GIT_COMMITTER_NAME: login,
|
|
22
|
-
GIT_COMMITTER_EMAIL: `${login}@users.noreply.github.com`,
|
|
23
|
-
// /workspace is a host-UID bind mount into a different-UID guest; git refuses
|
|
24
|
-
// to operate without an explicit safe-directory. GIT_CONFIG_* avoids needing
|
|
25
|
-
// a writeable ~/.gitconfig.
|
|
26
|
-
GIT_CONFIG_COUNT: "1",
|
|
27
|
-
GIT_CONFIG_KEY_0: "safe.directory",
|
|
28
|
-
GIT_CONFIG_VALUE_0: "*",
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* The single factory replacing the `if (backend === …)` ladder. Given a
|
|
33
|
-
* backend and construction opts, returns the matching adapter. Docker's
|
|
34
|
-
* old null-fallback is now a thrown error from `provision` (the orchestrator's
|
|
35
|
-
* bracket surfaces it), so this never returns null.
|
|
36
|
-
*/
|
|
37
|
-
export function sandboxFor(backend, opts) {
|
|
38
|
-
switch (backend) {
|
|
39
|
-
case "docker":
|
|
40
|
-
return new DockerSandbox(opts);
|
|
41
|
-
case "smol":
|
|
42
|
-
return new SmolSandbox(opts);
|
|
43
|
-
case "gondolin":
|
|
44
|
-
return new InProcessSandbox("gondolin", opts);
|
|
45
|
-
case "none":
|
|
46
|
-
return new InProcessSandbox("none", opts);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// ── Docker adapter ──────────────────────────────────────────────────
|
|
50
|
-
/**
|
|
51
|
-
* Wraps the docker container driver ({@link DockerDriver}) + the
|
|
52
|
-
* `createTaskSandbox` provisioning helper. Egress is the strict/open coredns
|
|
53
|
-
* pair selected by `--dns`; the host constants live here.
|
|
54
|
-
*/
|
|
55
|
-
class DockerSandbox {
|
|
56
|
-
opts;
|
|
57
|
-
backend = "docker";
|
|
58
|
-
sbx;
|
|
59
|
-
agentCwd = DOCKER_WORKSPACE_DIR;
|
|
60
|
-
constructor(opts) {
|
|
61
|
-
this.opts = opts;
|
|
62
|
-
}
|
|
63
|
-
async provision(pre) {
|
|
64
|
-
// Strict allowlist by default; an `unrestricted_egress` phase points at the
|
|
65
|
-
// open coredns sidecar instead. IPs match docker-compose.yml's static
|
|
66
|
-
// assignments (see src/sandbox/egress-firewall-config.ts).
|
|
67
|
-
const dnsIp = this.opts.egress.unrestricted
|
|
68
|
-
? process.env.LASTLIGHT_DNS_OPEN || "172.30.0.11"
|
|
69
|
-
: process.env.LASTLIGHT_DNS_STRICT || "172.30.0.10";
|
|
70
|
-
const sbx = await createTaskSandbox({
|
|
71
|
-
taskId: this.opts.taskId,
|
|
72
|
-
stateDir: this.opts.stateDir,
|
|
73
|
-
sandboxDir: this.opts.sandboxDir,
|
|
74
|
-
env: this.opts.env,
|
|
75
|
-
prePopulate: pre,
|
|
76
|
-
dnsIp,
|
|
77
|
-
imageName: this.opts.imageName,
|
|
78
|
-
});
|
|
79
|
-
if (!sbx) {
|
|
80
|
-
throw new Error("LASTLIGHT_SANDBOX=docker but no docker sandbox was available. " +
|
|
81
|
-
"Install Docker and build the sandbox image, or set LASTLIGHT_SANDBOX=gondolin / none.");
|
|
82
|
-
}
|
|
83
|
-
this.sbx = sbx;
|
|
84
|
-
this.agentCwd = pre ? `${DOCKER_WORKSPACE_DIR}/${pre.repo}` : DOCKER_WORKSPACE_DIR;
|
|
85
|
-
return { hostWorkspaceDir: sbx.workDir, agentCwd: this.agentCwd };
|
|
86
|
-
}
|
|
87
|
-
stageSkills(phaseKey, skillPaths) {
|
|
88
|
-
if (!this.sbx)
|
|
89
|
-
throw new Error("DockerSandbox.stageSkills before provision");
|
|
90
|
-
// Copy (not symlink): the agent's tools run inside the container and host
|
|
91
|
-
// symlink targets wouldn't resolve there. Map host dests → in-container paths.
|
|
92
|
-
const staged = stageSkillBundle(this.sbx.workDir, phaseKey, skillPaths, "copy");
|
|
93
|
-
if (!staged)
|
|
94
|
-
return undefined;
|
|
95
|
-
return staged.map((d) => `${DOCKER_WORKSPACE_DIR}/${relative(this.sbx.workDir, d)}`);
|
|
96
|
-
}
|
|
97
|
-
sandboxPathFor(relPath) {
|
|
98
|
-
return `${DOCKER_WORKSPACE_DIR}/${relPath}`;
|
|
99
|
-
}
|
|
100
|
-
async runAgent(taskId, prompt, opts, onEvent) {
|
|
101
|
-
if (!this.sbx)
|
|
102
|
-
throw new Error("DockerSandbox.runAgent before provision");
|
|
103
|
-
await this.sbx.sandbox.runAgent(taskId, prompt, {
|
|
104
|
-
model: opts.model,
|
|
105
|
-
thinking: opts.thinking,
|
|
106
|
-
profile: opts.profile,
|
|
107
|
-
sandboxEnv: this.innerAgentEnv(opts.sandboxEnv),
|
|
108
|
-
agentCwd: opts.agentCwd,
|
|
109
|
-
skillDirs: opts.skillDirs,
|
|
110
|
-
webSearch: opts.webSearch,
|
|
111
|
-
webSearchProvider: opts.webSearchProvider,
|
|
112
|
-
onLine: parseLine(onEvent),
|
|
113
|
-
});
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
async runCommand(taskId, command, opts) {
|
|
117
|
-
if (!this.sbx)
|
|
118
|
-
throw new Error("DockerSandbox.runCommand before provision");
|
|
119
|
-
return this.sbx.sandbox.runCommand(taskId, command, {
|
|
120
|
-
cwd: opts.cwd,
|
|
121
|
-
sandboxEnv: opts.sandboxEnv,
|
|
122
|
-
timeoutSeconds: opts.timeoutSeconds,
|
|
123
|
-
onLine: () => { },
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
async dispose() {
|
|
127
|
-
if (this.sbx)
|
|
128
|
-
await this.sbx.cleanup();
|
|
129
|
-
}
|
|
130
|
-
/** Git identity + (inside-container) OTEL collector env. */
|
|
131
|
-
innerAgentEnv(base) {
|
|
132
|
-
const otel = this.opts.otel?.enabled && this.opts.otel.forwardToSandbox ? getDockerSandboxOtelEnv() : {};
|
|
133
|
-
return { ...otel, ...base };
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// ── smol adapter ────────────────────────────────────────────────────
|
|
137
|
-
/**
|
|
138
|
-
* Wraps the smolvm micro-VM driver ({@link SmolDriver}). Egress is native
|
|
139
|
-
* per-machine `--allow-host`; unrestricted → null (open). Provisioning boots
|
|
140
|
-
* the VM first, then probes the share-backed host dir before cloning into it.
|
|
141
|
-
*/
|
|
142
|
-
class SmolSandbox {
|
|
143
|
-
opts;
|
|
144
|
-
backend = "smol";
|
|
145
|
-
driver;
|
|
146
|
-
agentCwd = SMOL_WORKSPACE_DIR;
|
|
147
|
-
hostWorkspaceDir = "";
|
|
148
|
-
constructor(opts) {
|
|
149
|
-
this.opts = opts;
|
|
150
|
-
}
|
|
151
|
-
async provision(pre) {
|
|
152
|
-
if (!smolAvailable()) {
|
|
153
|
-
throw new Error("LASTLIGHT_SANDBOX=smol but the smolvm CLI is not available. " +
|
|
154
|
-
"Install smolvm (https://smolmachines.com) and start `smolvm serve`, " +
|
|
155
|
-
"or set LASTLIGHT_SANDBOX=docker / gondolin / none.");
|
|
156
|
-
}
|
|
157
|
-
// Boot FIRST (workspace dir mounted), then provision the probed share. No
|
|
158
|
-
// pre-clone here — see SmolSandbox.resolveHostWorkspace for why the mount
|
|
159
|
-
// source isn't always the share root.
|
|
160
|
-
const workDir = setupTaskWorktree({
|
|
161
|
-
taskId: this.opts.taskId,
|
|
162
|
-
stateDir: this.opts.stateDir,
|
|
163
|
-
sandboxDir: this.opts.sandboxDir,
|
|
164
|
-
});
|
|
165
|
-
this.driver = new SmolDriver({
|
|
166
|
-
env: this.opts.env,
|
|
167
|
-
allowHosts: this.opts.egress.unrestricted ? null : this.opts.egress.hosts,
|
|
168
|
-
});
|
|
169
|
-
const machine = await this.driver.create({ taskId: this.opts.taskId, worktreePath: workDir });
|
|
170
|
-
const hostWs = machine.hostWorkspace;
|
|
171
|
-
if (pre)
|
|
172
|
-
prePopulateWorkspace(hostWs, pre);
|
|
173
|
-
this.hostWorkspaceDir = hostWs;
|
|
174
|
-
this.agentCwd = pre ? `${SMOL_WORKSPACE_DIR}/${pre.repo}` : SMOL_WORKSPACE_DIR;
|
|
175
|
-
return { hostWorkspaceDir: hostWs, agentCwd: this.agentCwd };
|
|
176
|
-
}
|
|
177
|
-
stageSkills(phaseKey, skillPaths) {
|
|
178
|
-
const staged = stageSkillBundle(this.hostWorkspaceDir, phaseKey, skillPaths, "copy");
|
|
179
|
-
if (!staged)
|
|
180
|
-
return undefined;
|
|
181
|
-
return staged.map((d) => `${SMOL_WORKSPACE_DIR}/${relative(this.hostWorkspaceDir, d)}`);
|
|
182
|
-
}
|
|
183
|
-
sandboxPathFor(relPath) {
|
|
184
|
-
return `${SMOL_WORKSPACE_DIR}/${relPath}`;
|
|
185
|
-
}
|
|
186
|
-
async runAgent(taskId, prompt, opts, onEvent) {
|
|
187
|
-
if (!this.driver)
|
|
188
|
-
throw new Error("SmolSandbox.runAgent before provision");
|
|
189
|
-
await this.driver.runAgent(taskId, prompt, {
|
|
190
|
-
model: opts.model,
|
|
191
|
-
thinking: opts.thinking,
|
|
192
|
-
profile: opts.profile,
|
|
193
|
-
sandboxEnv: opts.sandboxEnv,
|
|
194
|
-
agentCwd: opts.agentCwd,
|
|
195
|
-
skillDirs: opts.skillDirs,
|
|
196
|
-
webSearch: opts.webSearch,
|
|
197
|
-
webSearchProvider: opts.webSearchProvider,
|
|
198
|
-
onLine: parseLine(onEvent),
|
|
199
|
-
});
|
|
200
|
-
return undefined;
|
|
201
|
-
}
|
|
202
|
-
async runCommand(taskId, command, opts) {
|
|
203
|
-
if (!this.driver)
|
|
204
|
-
throw new Error("SmolSandbox.runCommand before provision");
|
|
205
|
-
return this.driver.runCommand(taskId, command, {
|
|
206
|
-
cwd: opts.cwd,
|
|
207
|
-
sandboxEnv: opts.sandboxEnv,
|
|
208
|
-
timeoutSeconds: opts.timeoutSeconds,
|
|
209
|
-
onLine: () => { },
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
async dispose() {
|
|
213
|
-
if (this.driver)
|
|
214
|
-
await this.driver.destroy(this.opts.taskId);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
// ── In-process adapter (gondolin / none) ────────────────────────────
|
|
218
|
-
/**
|
|
219
|
-
* **One** adapter for the two in-process backends, parameterized by
|
|
220
|
-
* `mode: 'gondolin' | 'none'`. The two differ only in agentic-pi's `sandbox`
|
|
221
|
-
* arg and a `HOME` override. Owns the `applyEnv`/restore `process.env` splice
|
|
222
|
-
* and the lazy `import("agentic-pi")`.
|
|
223
|
-
*
|
|
224
|
-
* The `mode` flag is a **tombstone** for gondolin's planned removal — when
|
|
225
|
-
* gondolin is retired it collapses to single-mode `none`.
|
|
226
|
-
*/
|
|
227
|
-
class InProcessSandbox {
|
|
228
|
-
mode;
|
|
229
|
-
opts;
|
|
230
|
-
backend;
|
|
231
|
-
hostWorkspaceDir = "";
|
|
232
|
-
agentCwd = "";
|
|
233
|
-
constructor(mode, opts) {
|
|
234
|
-
this.mode = mode;
|
|
235
|
-
this.opts = opts;
|
|
236
|
-
this.backend = mode;
|
|
237
|
-
}
|
|
238
|
-
async provision(pre) {
|
|
239
|
-
const workDir = setupTaskWorktree({
|
|
240
|
-
taskId: this.opts.taskId,
|
|
241
|
-
stateDir: this.opts.stateDir,
|
|
242
|
-
sandboxDir: this.opts.sandboxDir,
|
|
243
|
-
prePopulate: pre,
|
|
244
|
-
});
|
|
245
|
-
this.hostWorkspaceDir = workDir;
|
|
246
|
-
// When pre-cloned, cwd is the checkout so the agent runs inside the repo
|
|
247
|
-
// with no `cd` preamble; otherwise the workspace root. `repoSubdir` lets a
|
|
248
|
-
// caller that pre-seeded a `<workspace>/<repo>/` checkout nest the cwd the
|
|
249
|
-
// same way without a clone (the evals harness) — workDir (the root) stays
|
|
250
|
-
// hostWorkspaceDir so AGENTS.md/skills remain siblings outside the repo.
|
|
251
|
-
if (pre) {
|
|
252
|
-
this.agentCwd = join(workDir, pre.repo);
|
|
253
|
-
}
|
|
254
|
-
else if (this.opts.repoSubdir) {
|
|
255
|
-
this.agentCwd = join(workDir, this.opts.repoSubdir);
|
|
256
|
-
mkdirSync(this.agentCwd, { recursive: true });
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
this.agentCwd = workDir;
|
|
260
|
-
}
|
|
261
|
-
return { hostWorkspaceDir: workDir, agentCwd: this.agentCwd };
|
|
262
|
-
}
|
|
263
|
-
stageSkills(phaseKey, skillPaths) {
|
|
264
|
-
// none: stage at the workspace ROOT (host FS fully visible), by symlink —
|
|
265
|
-
// the host resolves it and it's the cheap/CI path. gondolin mounts ONLY cwd
|
|
266
|
-
// into the guest, so its bundle is staged under the repo (inside the mount)
|
|
267
|
-
// AND must be COPIED, not symlinked: a symlink's target is the skill source
|
|
268
|
-
// in the install tree (outside cwd), which isn't mounted, so it would dangle
|
|
269
|
-
// in the guest and the agent couldn't read SKILL.md. Copying (dereferenced)
|
|
270
|
-
// lands the real files inside the mount, exactly as docker does. The bundle
|
|
271
|
-
// is added to the checkout's local `.git/info/exclude` so it's never committed.
|
|
272
|
-
const gondolin = this.mode === "gondolin";
|
|
273
|
-
const skillRoot = gondolin ? this.agentCwd : this.hostWorkspaceDir;
|
|
274
|
-
const staged = stageSkillBundle(skillRoot, phaseKey, skillPaths, gondolin ? "copy" : "symlink");
|
|
275
|
-
if (staged && gondolin)
|
|
276
|
-
excludeFromGit(this.agentCwd, SKILL_BUNDLE_ROOT);
|
|
277
|
-
return staged; // paths inside cwd → agentic-pi maps them into the guest's /workspace
|
|
278
|
-
}
|
|
279
|
-
sandboxPathFor(relPath) {
|
|
280
|
-
return join(this.hostWorkspaceDir, relPath);
|
|
281
|
-
}
|
|
282
|
-
async runAgent(_taskId, prompt, opts, onEvent) {
|
|
283
|
-
// agentic-pi reads its own env (provider keys, App PEM, …) from
|
|
284
|
-
// process.env. Splice in our scoped values for the call, then restore.
|
|
285
|
-
const restore = applyEnv(this.opts.env);
|
|
286
|
-
const allowedHttpHosts = this.opts.egress.unrestricted ? [ALLOW_ALL_SENTINEL] : this.opts.egress.hosts;
|
|
287
|
-
try {
|
|
288
|
-
// Loaded lazily: agentic-pi transitively poisons the global undici
|
|
289
|
-
// dispatcher on import, which would break the harness's own fetch. The
|
|
290
|
-
// dynamic import keeps the harness clean unless an in-process run happens.
|
|
291
|
-
const { run: agenticRun } = await import("agentic-pi");
|
|
292
|
-
return await agenticRun({
|
|
293
|
-
model: opts.model,
|
|
294
|
-
prompt,
|
|
295
|
-
thinking: opts.thinking,
|
|
296
|
-
profile: opts.profile,
|
|
297
|
-
authFile: opts.authFile,
|
|
298
|
-
githubApiBaseUrl: opts.githubApiBaseUrl,
|
|
299
|
-
sandbox: this.mode === "gondolin" ? "gondolin" : "none",
|
|
300
|
-
sandboxEnv: this.innerAgentEnv(opts.sandboxEnv),
|
|
301
|
-
cwd: opts.agentCwd,
|
|
302
|
-
noSession: true,
|
|
303
|
-
skillPaths: opts.skillDirs,
|
|
304
|
-
allowedHttpHosts,
|
|
305
|
-
webSearch: opts.webSearch === true,
|
|
306
|
-
webSearchProvider: opts.webSearchProvider,
|
|
307
|
-
onEvent,
|
|
308
|
-
onWarn: (msg) => console.warn(`[agentic] ${msg}`),
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
finally {
|
|
312
|
-
restore();
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
async runCommand(_taskId, command, opts) {
|
|
316
|
-
// gondolin / none run the command on the host worktree via spawnSync — the
|
|
317
|
-
// same degraded model those backends already used.
|
|
318
|
-
const proc = spawnSync("sh", ["-c", command], {
|
|
319
|
-
cwd: opts.cwd,
|
|
320
|
-
env: { ...process.env, ...this.opts.env, ...(opts.sandboxEnv ?? {}) },
|
|
321
|
-
encoding: "utf-8",
|
|
322
|
-
timeout: opts.timeoutSeconds * 1000,
|
|
323
|
-
maxBuffer: 256 * 1024 * 1024,
|
|
324
|
-
});
|
|
325
|
-
const exitCode = proc.status ?? (proc.signal ? 124 : 1);
|
|
326
|
-
return {
|
|
327
|
-
exitCode,
|
|
328
|
-
stdout: proc.stdout ?? "",
|
|
329
|
-
stderr: proc.stderr ?? "",
|
|
330
|
-
timedOut: proc.signal === "SIGTERM",
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
dispose() {
|
|
334
|
-
// No isolation primitive to tear down — the env splice is restored inside
|
|
335
|
-
// runAgent, and the worktree is reaped elsewhere.
|
|
336
|
-
}
|
|
337
|
-
/** Git identity + OTEL env + (gondolin only) a HOME override into the VM. */
|
|
338
|
-
innerAgentEnv(base) {
|
|
339
|
-
const otel = this.opts.otel?.enabled && this.opts.otel.forwardToSandbox ? getOtelEnvForSandbox() : {};
|
|
340
|
-
// gondolin: the VM user inherits HOME from the agentic-pi process (the
|
|
341
|
-
// host's HOME leaks in). Force HOME=/root so `git config --global` /
|
|
342
|
-
// `gh auth status` write to a real path inside the VM. none runs on the
|
|
343
|
-
// host — never override HOME.
|
|
344
|
-
const homeOverride = this.mode === "gondolin" ? { HOME: "/root", USER: "root", LOGNAME: "root" } : {};
|
|
345
|
-
return { ...otel, ...base, ...homeOverride };
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* In-memory `Sandbox` adapter for unit-testing the orchestrator without
|
|
350
|
-
* Docker/VMs. `provision()` returns a **real** `mkdtemp` workspace (so skill
|
|
351
|
-
* staging + artifact harvest run for real), `runAgent` replays a canned array
|
|
352
|
-
* of pi event records through `onEvent`, and it **records** the opts it
|
|
353
|
-
* received for assertions. Covers Last Light's orchestration, not agentic-pi's
|
|
354
|
-
* semantics.
|
|
355
|
-
*
|
|
356
|
-
* Inject it via the optional `sandboxFactory` on `executeAgent`/`executeCommand`
|
|
357
|
-
* — see {@link FakeSandbox.asFactory}.
|
|
358
|
-
*/
|
|
359
|
-
export class FakeSandbox {
|
|
360
|
-
behavior;
|
|
361
|
-
backend = "none";
|
|
362
|
-
// Recorded for assertions.
|
|
363
|
-
egress;
|
|
364
|
-
env;
|
|
365
|
-
hostWorkspaceDir = "";
|
|
366
|
-
agentCwd = "";
|
|
367
|
-
stagedSkillDirs;
|
|
368
|
-
receivedAgentOpts;
|
|
369
|
-
receivedCommandOpts;
|
|
370
|
-
receivedCommand;
|
|
371
|
-
provisionCalls = 0;
|
|
372
|
-
disposed = false;
|
|
373
|
-
constructor(behavior = {}) {
|
|
374
|
-
this.behavior = behavior;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Build a {@link SandboxFactory} that always returns THIS instance, capturing
|
|
378
|
-
* the construction opts (egress, env, backend) for later inspection.
|
|
379
|
-
*/
|
|
380
|
-
asFactory() {
|
|
381
|
-
return (backend, opts) => {
|
|
382
|
-
this.backend = backend;
|
|
383
|
-
this.egress = opts.egress;
|
|
384
|
-
this.env = opts.env;
|
|
385
|
-
return this;
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
async provision(pre) {
|
|
389
|
-
this.provisionCalls += 1;
|
|
390
|
-
const dir = mkdtempSync(join(tmpdir(), "fake-sbx-"));
|
|
391
|
-
this.hostWorkspaceDir = dir;
|
|
392
|
-
this.agentCwd = pre ? join(dir, pre.repo) : dir;
|
|
393
|
-
if (pre)
|
|
394
|
-
mkdirSync(this.agentCwd, { recursive: true });
|
|
395
|
-
return { hostWorkspaceDir: dir, agentCwd: this.agentCwd };
|
|
396
|
-
}
|
|
397
|
-
stageSkills(phaseKey, skillPaths) {
|
|
398
|
-
this.stagedSkillDirs = stageSkillBundle(this.hostWorkspaceDir, phaseKey, skillPaths, "symlink");
|
|
399
|
-
return this.stagedSkillDirs;
|
|
400
|
-
}
|
|
401
|
-
sandboxPathFor(relPath) {
|
|
402
|
-
return join(this.hostWorkspaceDir, relPath);
|
|
403
|
-
}
|
|
404
|
-
async runAgent(_taskId, _prompt, opts, onEvent) {
|
|
405
|
-
this.receivedAgentOpts = opts;
|
|
406
|
-
if (this.behavior.throwOnRunAgent)
|
|
407
|
-
throw asError(this.behavior.throwOnRunAgent);
|
|
408
|
-
for (const record of this.behavior.events ?? [])
|
|
409
|
-
onEvent(record);
|
|
410
|
-
return this.behavior.returnRunResult;
|
|
411
|
-
}
|
|
412
|
-
async runCommand(_taskId, command, opts) {
|
|
413
|
-
this.receivedCommand = command;
|
|
414
|
-
this.receivedCommandOpts = opts;
|
|
415
|
-
if (this.behavior.throwOnRunCommand)
|
|
416
|
-
throw asError(this.behavior.throwOnRunCommand);
|
|
417
|
-
return this.behavior.commandResult ?? { exitCode: 0, stdout: "", stderr: "", timedOut: false };
|
|
418
|
-
}
|
|
419
|
-
dispose() {
|
|
420
|
-
this.disposed = true;
|
|
421
|
-
try {
|
|
422
|
-
if (this.hostWorkspaceDir)
|
|
423
|
-
rmSync(this.hostWorkspaceDir, { recursive: true, force: true });
|
|
424
|
-
}
|
|
425
|
-
catch {
|
|
426
|
-
/* best effort */
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
// ── helpers ─────────────────────────────────────────────────────────
|
|
431
|
-
function asError(e) {
|
|
432
|
-
return e instanceof Error ? e : new Error(e);
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Wrap an `onEvent(record)` consumer as an `onLine(line)` handler for the
|
|
436
|
-
* subprocess (docker/smol) drivers: apply the cheap `{`-prefix guard, parse
|
|
437
|
-
* JSON, and forward the parsed record. Non-JSON / malformed lines are dropped.
|
|
438
|
-
*/
|
|
439
|
-
function parseLine(onEvent) {
|
|
440
|
-
return (line) => {
|
|
441
|
-
if (!line.startsWith("{"))
|
|
442
|
-
return;
|
|
443
|
-
let record;
|
|
444
|
-
try {
|
|
445
|
-
record = JSON.parse(line);
|
|
446
|
-
}
|
|
447
|
-
catch {
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
onEvent(record);
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
//# sourceMappingURL=sandbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/sandbox/sandbox.ts"],"names":[],"mappings":"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"}
|
package/dist/sandbox/smol.d.ts
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* smolvm sandbox manager — runs agent tasks inside local micro-VMs.
|
|
3
|
-
*
|
|
4
|
-
* Structural peer of {@link DockerSandbox}: Last Light owns the isolation
|
|
5
|
-
* boundary, bind-mounts the per-task workspace, runs `agentic-pi run --sandbox
|
|
6
|
-
* none` *inside* the machine, and parses the JSONL event stream exactly as the
|
|
7
|
-
* docker path does. Differences from docker:
|
|
8
|
-
*
|
|
9
|
-
* - **Isolation** is a real micro-VM (own kernel) via smolvm's host
|
|
10
|
-
* hypervisor (Apple Silicon Hypervisor.framework / Linux KVM), not a
|
|
11
|
-
* sibling container. No daemon, no Docker (smolvm drives the hypervisor
|
|
12
|
-
* directly).
|
|
13
|
-
* - **Egress** is enforced natively per-machine via `--allow-host` (sourced
|
|
14
|
-
* from `egress-allowlist.ts`), so this backend needs none of the coredns +
|
|
15
|
-
* nginx-egress sidecar stack. `--allow-host` implies `--net`; we always
|
|
16
|
-
* enable networking (the agent must reach the LLM provider).
|
|
17
|
-
* - **Secrets** (provider keys, GITHUB_TOKEN) are injected via smolvm's
|
|
18
|
-
* `--secret-env GUEST=HOST` so values never appear on the argv — the host
|
|
19
|
-
* env of the spawned `smolvm` process carries them; smolvm resolves them
|
|
20
|
-
* into the guest at start.
|
|
21
|
-
* - **Image** is whatever `SMOLVM_IMAGE` names. smolvm's `-I` accepts a
|
|
22
|
-
* registry ref OR a local `docker save` archive (`./img.tar`) / unpacked
|
|
23
|
-
* rootfs dir — the latter needs NO registry, so it works under the strict
|
|
24
|
-
* egress allowlist. The lastlight sandbox image (built locally by docker)
|
|
25
|
-
* is consumed offline via `docker save lastlight-sandbox:latest -o img.tar`
|
|
26
|
-
* then `SMOLVM_IMAGE=img.tar`. Archives are cached by hash; `start` resolves
|
|
27
|
-
* from cache, not the network.
|
|
28
|
-
*
|
|
29
|
-
* Driven via the **smolvm CLI** (`execFile`), verified against smolvm 1.2.5.
|
|
30
|
-
*
|
|
31
|
-
* Feasibility-spike scope (documented gaps vs docker):
|
|
32
|
-
* - We exec `agentic-pi` directly rather than running the sandbox image's
|
|
33
|
-
* entrypoint, so the entrypoint's git-credential-helper setup is skipped.
|
|
34
|
-
* Read-only profiles (agentic-pi's built-in github tools + minted
|
|
35
|
-
* GITHUB_TOKEN) work; repo-write `git push` from the workspace is out of
|
|
36
|
-
* scope here.
|
|
37
|
-
* - The workload runs VM-grade (root) by default; workspace writes land as
|
|
38
|
-
* root on the host bind mount. No shared package-manager cache, no SSRF
|
|
39
|
-
* metadata floor in unrestricted mode, no in-network OTEL collector.
|
|
40
|
-
* - The image (`SMOLVM_IMAGE`) must be resolvable by smolvm (a registry ref,
|
|
41
|
-
* or a local image it can load) — see the spike plan's verification steps.
|
|
42
|
-
*/
|
|
43
|
-
/**
|
|
44
|
-
* Where the per-task workspace is bind-mounted inside the guest. smolvm treats
|
|
45
|
-
* `/workspace` specially — a `-v <host>:/workspace` mount "takes priority" and
|
|
46
|
-
* the host share is used directly (instead of the VM's storage-disk workspace),
|
|
47
|
-
* which avoids the `virtiofs` carve-out other mount targets get. The probe in
|
|
48
|
-
* {@link SmolSandbox.resolveHostWorkspace} still confirms the actual host path.
|
|
49
|
-
*/
|
|
50
|
-
export declare const SMOL_WORKSPACE_DIR = "/workspace";
|
|
51
|
-
/** True when the smolvm CLI is invocable on this host. */
|
|
52
|
-
export declare function smolAvailable(): boolean;
|
|
53
|
-
export interface SmolSandboxConfig {
|
|
54
|
-
/** OCI image to boot (default: SMOLVM_IMAGE / lastlight-sandbox:latest). */
|
|
55
|
-
imageName?: string;
|
|
56
|
-
/**
|
|
57
|
-
* Env vars injected into in-guest commands (provider keys, GITHUB_TOKEN,
|
|
58
|
-
* OTEL…). Forwarded via `--secret-env` so values stay off the argv.
|
|
59
|
-
*/
|
|
60
|
-
env: Record<string, string>;
|
|
61
|
-
/** Timeout in seconds for an agent run (default 1800 = 30 min). */
|
|
62
|
-
timeoutSeconds?: number;
|
|
63
|
-
/**
|
|
64
|
-
* Egress allowlist (apex hostnames). Each becomes a repeated `--allow-host`.
|
|
65
|
-
* `null` → no allowlist (open egress, still `--net`); used for
|
|
66
|
-
* `unrestricted_egress` phases.
|
|
67
|
-
*/
|
|
68
|
-
allowHosts: string[] | null;
|
|
69
|
-
}
|
|
70
|
-
export interface SmolMachineInfo {
|
|
71
|
-
machineName: string;
|
|
72
|
-
/** Host dir passed to `-v` (the mount source). */
|
|
73
|
-
worktreePath: string;
|
|
74
|
-
/**
|
|
75
|
-
* Host dir that actually backs the guest workspace. smolvm's `-v` does not
|
|
76
|
-
* always share the source root directly — depending on version it carves a
|
|
77
|
-
* `<source>/virtiofs/<tag>` subdir and shares THAT. We probe for it after
|
|
78
|
-
* boot (see {@link SmolSandbox.resolveHostWorkspace}) so host-side staging
|
|
79
|
-
* (clone / AGENTS.md / skills) lands where the guest can see it, regardless
|
|
80
|
-
* of which mount semantics the installed smolvm uses.
|
|
81
|
-
*/
|
|
82
|
-
hostWorkspace: string;
|
|
83
|
-
}
|
|
84
|
-
export declare class SmolSandbox {
|
|
85
|
-
private config;
|
|
86
|
-
private machines;
|
|
87
|
-
constructor(config: SmolSandboxConfig);
|
|
88
|
-
/** Create + start a micro-VM with the workspace bind-mounted and egress locked. */
|
|
89
|
-
create(opts: {
|
|
90
|
-
taskId: string;
|
|
91
|
-
worktreePath: string;
|
|
92
|
-
}): Promise<SmolMachineInfo>;
|
|
93
|
-
/**
|
|
94
|
-
* Discover the host directory that backs the guest workspace mount. Writes a
|
|
95
|
-
* sentinel file from inside the guest at {@link SMOL_WORKSPACE_DIR}, then
|
|
96
|
-
* locates it under the mount source on the host — its parent dir is the
|
|
97
|
-
* host-side workspace root. Falls back to the source root if not found
|
|
98
|
-
* (e.g. a future smolvm that shares the source directly and the scan misses).
|
|
99
|
-
*/
|
|
100
|
-
private resolveHostWorkspace;
|
|
101
|
-
/** Wait until the machine can run a trivial command (boot completion). */
|
|
102
|
-
private waitForReady;
|
|
103
|
-
/**
|
|
104
|
-
* Run `agentic-pi run --sandbox none …` inside the machine. Mirrors
|
|
105
|
-
* {@link DockerSandbox.runAgent}: streams stdout line-by-line for the live
|
|
106
|
-
* shim and writes the prompt to the child's stdin (`-i`). The agentic-pi
|
|
107
|
-
* argv is passed directly after `--` (no `sh -c`), so no shell quoting.
|
|
108
|
-
*/
|
|
109
|
-
runAgent(taskId: string, prompt: string, opts?: {
|
|
110
|
-
model?: string;
|
|
111
|
-
thinking?: string;
|
|
112
|
-
profile?: string;
|
|
113
|
-
/** Forwarded to the inner agentic-pi run via its own `--sandbox-env`. */
|
|
114
|
-
sandboxEnv?: Record<string, string>;
|
|
115
|
-
agentCwd?: string;
|
|
116
|
-
webSearch?: boolean;
|
|
117
|
-
webSearchProvider?: "tavily" | "brave" | "exa";
|
|
118
|
-
skillDirs?: string[];
|
|
119
|
-
onLine?: (line: string) => void;
|
|
120
|
-
}): Promise<void>;
|
|
121
|
-
/**
|
|
122
|
-
* Run a deterministic shell command in the machine and resolve with its exit
|
|
123
|
-
* code + bounded output. Non-agent sibling of {@link runAgent}; powers
|
|
124
|
-
* `type: bash` / `type: script` phases. The command is a shell string, so it
|
|
125
|
-
* runs under `sh -c`.
|
|
126
|
-
*/
|
|
127
|
-
runCommand(taskId: string, command: string, opts?: {
|
|
128
|
-
cwd?: string;
|
|
129
|
-
/** Non-secret env forwarded via `-e KEY=VALUE` (e.g. LL_OUT_*, git identity). */
|
|
130
|
-
sandboxEnv?: Record<string, string>;
|
|
131
|
-
timeoutSeconds?: number;
|
|
132
|
-
onLine?: (line: string) => void;
|
|
133
|
-
}): Promise<{
|
|
134
|
-
exitCode: number;
|
|
135
|
-
stdout: string;
|
|
136
|
-
stderr: string;
|
|
137
|
-
timedOut: boolean;
|
|
138
|
-
}>;
|
|
139
|
-
/** Stop + delete the machine. */
|
|
140
|
-
destroy(taskId: string): Promise<void>;
|
|
141
|
-
/**
|
|
142
|
-
* The allowlist hosts that smolvm can actually use, in original order.
|
|
143
|
-
*
|
|
144
|
-
* smolvm resolves every `--allow-host` to its IP(s) AT VM START and aborts
|
|
145
|
-
* `create` if ANY entry fails to resolve. Our `egress-allowlist.ts` follows an
|
|
146
|
-
* apex+subdomain convention (e.g. `githubusercontent.com`), and some of those
|
|
147
|
-
* bare apexes have no A record — they'd abort the whole VM. So we pre-resolve
|
|
148
|
-
* here and drop the unresolvable ones.
|
|
149
|
-
*
|
|
150
|
-
* CAVEAT: unlike docker (SNI) / gondolin (hostname), smolvm's filter is
|
|
151
|
-
* IP-pinned at start — `--allow-host github.com` allows github.com's IPs only,
|
|
152
|
-
* NOT api.github.com or rotating CDN IPs. A faithful apex+subdomain policy
|
|
153
|
-
* would need each concrete subdomain enumerated; that's a spike gap.
|
|
154
|
-
*/
|
|
155
|
-
private resolvableAllowHosts;
|
|
156
|
-
/**
|
|
157
|
-
* Build `--secret-env GUEST=GUEST` flags for every machine-env var plus the
|
|
158
|
-
* child-process env that carries their values, so secrets (tokens, provider
|
|
159
|
-
* keys) reach the guest via smolvm's secret channel rather than the argv.
|
|
160
|
-
*/
|
|
161
|
-
private secretEnv;
|
|
162
|
-
}
|