lastlight 0.4.0 → 0.6.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/.claude-plugin/marketplace.json +14 -0
- package/README.md +56 -6
- package/agent-context/rules.md +0 -38
- package/agent-context/soul.md +0 -11
- package/deploy/entrypoint.sh +21 -6
- package/deploy/sandbox-entrypoint.sh +1 -1
- package/dist/cli.js +24 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +13 -2
- package/dist/config.js +29 -9
- package/dist/config.js.map +1 -1
- package/dist/connectors/messaging/base.js +22 -9
- package/dist/connectors/messaging/base.js.map +1 -1
- package/dist/connectors/slack/connector.d.ts +62 -9
- package/dist/connectors/slack/connector.js +216 -63
- package/dist/connectors/slack/connector.js.map +1 -1
- package/dist/connectors/slack/connector.test.d.ts +1 -0
- package/dist/connectors/slack/connector.test.js +135 -0
- package/dist/connectors/slack/connector.test.js.map +1 -0
- package/dist/connectors/types.d.ts +7 -0
- package/dist/engine/agent-executor.d.ts +29 -144
- package/dist/engine/agent-executor.js +280 -962
- package/dist/engine/agent-executor.js.map +1 -1
- package/dist/engine/agent-executor.seam.test.d.ts +1 -0
- package/dist/engine/agent-executor.seam.test.js +57 -0
- package/dist/engine/agent-executor.seam.test.js.map +1 -0
- package/dist/engine/dispatcher.d.ts +13 -0
- package/dist/engine/dispatcher.js +26 -7
- package/dist/engine/dispatcher.js.map +1 -1
- package/dist/engine/dispatcher.test.js.map +1 -1
- package/dist/engine/executors/backends.d.ts +41 -0
- package/dist/engine/executors/backends.js +541 -0
- package/dist/engine/executors/backends.js.map +1 -0
- package/dist/engine/executors/shared.d.ts +189 -0
- package/dist/engine/executors/shared.js +612 -0
- package/dist/engine/executors/shared.js.map +1 -0
- package/dist/engine/message-batcher.d.ts +32 -0
- package/dist/engine/message-batcher.js +109 -0
- package/dist/engine/message-batcher.js.map +1 -0
- package/dist/engine/message-batcher.test.d.ts +1 -0
- package/dist/engine/message-batcher.test.js +109 -0
- package/dist/engine/message-batcher.test.js.map +1 -0
- package/dist/engine/profiles.d.ts +9 -0
- package/dist/engine/profiles.js.map +1 -1
- package/dist/evals-api.d.ts +24 -0
- package/dist/evals-api.js +22 -0
- package/dist/evals-api.js.map +1 -0
- package/dist/index.js +41 -4
- package/dist/index.js.map +1 -1
- package/dist/sandbox/command-exec.integration.test.d.ts +1 -0
- package/dist/sandbox/command-exec.integration.test.js +183 -0
- package/dist/sandbox/command-exec.integration.test.js.map +1 -0
- package/dist/sandbox/docker.d.ts +32 -0
- package/dist/sandbox/docker.js +109 -4
- package/dist/sandbox/docker.js.map +1 -1
- package/dist/sandbox/index.d.ts +1 -1
- package/dist/sandbox/index.js +1 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/smol.d.ts +162 -0
- package/dist/sandbox/smol.integration.test.d.ts +1 -0
- package/dist/sandbox/smol.integration.test.js +130 -0
- package/dist/sandbox/smol.integration.test.js.map +1 -0
- package/dist/sandbox/smol.js +485 -0
- package/dist/sandbox/smol.js.map +1 -0
- package/dist/skills-install.d.ts +12 -0
- package/dist/skills-install.js +179 -0
- package/dist/skills-install.js.map +1 -0
- package/dist/workflows/loader.test.js +83 -0
- package/dist/workflows/loader.test.js.map +1 -1
- package/dist/workflows/phase-executor.d.ts +28 -3
- package/dist/workflows/phase-executor.js +170 -45
- package/dist/workflows/phase-executor.js.map +1 -1
- package/dist/workflows/phase-executor.test.js +64 -1
- package/dist/workflows/phase-executor.test.js.map +1 -1
- package/dist/workflows/runner.test.js +32 -27
- package/dist/workflows/runner.test.js.map +1 -1
- package/dist/workflows/schema.d.ts +20 -0
- package/dist/workflows/schema.js +72 -2
- package/dist/workflows/schema.js.map +1 -1
- package/package.json +15 -3
- package/plugins/lastlight/.claude-plugin/plugin.json +12 -0
- package/plugins/lastlight/README.md +44 -0
- package/plugins/lastlight/skills/lastlight-client/SKILL.md +82 -0
- package/plugins/lastlight/skills/lastlight-evals/SKILL.md +97 -0
- package/plugins/lastlight/skills/lastlight-evals/references/instance-schema.md +84 -0
- package/plugins/lastlight/skills/lastlight-evals/references/models-json.md +42 -0
- package/plugins/lastlight/skills/lastlight-overlay/SKILL.md +72 -0
- package/plugins/lastlight/skills/lastlight-overlay/references/forking.md +55 -0
- package/plugins/lastlight/skills/lastlight-overlay/references/overlay-layout.md +52 -0
- package/plugins/lastlight/skills/lastlight-server/SKILL.md +124 -0
- package/plugins/lastlight/skills/lastlight-server/references/env-schema.md +103 -0
- package/plugins/lastlight/skills/lastlight-server/references/operations.md +60 -0
- package/sandbox.Dockerfile +7 -0
- package/skills/browser-qa/scripts/agent-browser.mjs +15 -0
- package/skills/demo/SKILL.md +45 -19
- package/skills/demo/scripts/compose-demo.sh +77 -39
- package/workflows/examples/bash-smoke.yaml +41 -0
- package/workflows/prompts/demo.md +27 -5
- package/workflows/qa-test.yaml +1 -1
- package/workflows/verify.yaml +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,iEAAiE;AACjE,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,yBAAyB;IACzB,4BAA4B;IAC5B,4BAA4B;IAC5B,uBAAuB;IACvB,sBAAsB;IACtB,8BAA8B;IAC9B,2BAA2B;IAC3B,wBAAwB;IACxB,iBAAiB;CAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { createHmac } from "crypto";
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import Database from "better-sqlite3";
|
|
5
|
+
import { SlackConnector, verifySlackSignature } from "./connector.js";
|
|
6
|
+
import { SessionManager } from "../messaging/session-manager.js";
|
|
7
|
+
function sign(secret, ts, body) {
|
|
8
|
+
return "v0=" + createHmac("sha256", secret).update(`v0:${ts}:${body}`).digest("hex");
|
|
9
|
+
}
|
|
10
|
+
describe("verifySlackSignature", () => {
|
|
11
|
+
const secret = "shhh-signing-secret";
|
|
12
|
+
const body = JSON.stringify({ type: "event_callback", event: { type: "message" } });
|
|
13
|
+
const now = 1_700_000_000_000; // fixed clock (ms)
|
|
14
|
+
const ts = String(Math.floor(now / 1000));
|
|
15
|
+
it("accepts a correctly signed, fresh request", () => {
|
|
16
|
+
expect(verifySlackSignature(body, ts, sign(secret, ts, body), secret, now)).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it("rejects a signature made with the wrong secret", () => {
|
|
19
|
+
expect(verifySlackSignature(body, ts, sign("other-secret", ts, body), secret, now)).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
it("rejects a tampered body", () => {
|
|
22
|
+
expect(verifySlackSignature(body + "x", ts, sign(secret, ts, body), secret, now)).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it("rejects a stale timestamp (replay protection)", () => {
|
|
25
|
+
const stale = String(Math.floor(now / 1000) - 600); // 10 minutes old
|
|
26
|
+
expect(verifySlackSignature(body, stale, sign(secret, stale, body), secret, now)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it("rejects missing signature or timestamp", () => {
|
|
29
|
+
expect(verifySlackSignature(body, "", "", secret, now)).toBe(false);
|
|
30
|
+
expect(verifySlackSignature(body, ts, "", secret, now)).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe("SlackConnector webhook receiver", () => {
|
|
34
|
+
const secret = "shhh-signing-secret";
|
|
35
|
+
let app;
|
|
36
|
+
let conn;
|
|
37
|
+
let db;
|
|
38
|
+
let events;
|
|
39
|
+
function headers(body) {
|
|
40
|
+
const ts = String(Math.floor(Date.now() / 1000));
|
|
41
|
+
return {
|
|
42
|
+
"content-type": "application/json",
|
|
43
|
+
"x-slack-request-timestamp": ts,
|
|
44
|
+
"x-slack-signature": sign(secret, ts, body),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const post = (body, hdrs) => app.request("/webhooks/slack", { method: "POST", headers: hdrs ?? headers(body), body });
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
app = new Hono();
|
|
50
|
+
db = new Database(":memory:");
|
|
51
|
+
const sm = new SessionManager(db);
|
|
52
|
+
conn = new SlackConnector({
|
|
53
|
+
botToken: "xoxb-test",
|
|
54
|
+
mode: "webhook",
|
|
55
|
+
signingSecret: secret,
|
|
56
|
+
honoApp: app,
|
|
57
|
+
allowedUsers: [],
|
|
58
|
+
botIdentifier: "",
|
|
59
|
+
}, sm);
|
|
60
|
+
// Stub the Web API client so nothing hits the network during processing.
|
|
61
|
+
conn.web = {
|
|
62
|
+
users: { info: async () => ({ user: { name: "alice" } }) },
|
|
63
|
+
assistant: { threads: { setStatus: async () => { } } },
|
|
64
|
+
reactions: { add: async () => { } },
|
|
65
|
+
chat: { postMessage: async () => ({ ts: "x" }), update: async () => { } },
|
|
66
|
+
};
|
|
67
|
+
events = [];
|
|
68
|
+
conn.on("event", (e) => events.push(e));
|
|
69
|
+
});
|
|
70
|
+
afterEach(() => db.close());
|
|
71
|
+
it("answers the url_verification handshake", async () => {
|
|
72
|
+
const body = JSON.stringify({ type: "url_verification", challenge: "abc123" });
|
|
73
|
+
const res = await post(body);
|
|
74
|
+
expect(res.status).toBe(200);
|
|
75
|
+
expect(await res.json()).toEqual({ challenge: "abc123" });
|
|
76
|
+
});
|
|
77
|
+
it("rejects a request with a bad signature", async () => {
|
|
78
|
+
const body = JSON.stringify({ type: "url_verification", challenge: "x" });
|
|
79
|
+
const res = await post(body, {
|
|
80
|
+
"content-type": "application/json",
|
|
81
|
+
"x-slack-request-timestamp": String(Math.floor(Date.now() / 1000)),
|
|
82
|
+
"x-slack-signature": "v0=deadbeef",
|
|
83
|
+
});
|
|
84
|
+
expect(res.status).toBe(401);
|
|
85
|
+
});
|
|
86
|
+
it("acks and emits an EventEnvelope for a DM message event", async () => {
|
|
87
|
+
const body = JSON.stringify({
|
|
88
|
+
type: "event_callback",
|
|
89
|
+
event_id: "Ev1",
|
|
90
|
+
event: { type: "message", channel: "D1", channel_type: "im", user: "U1", ts: "1.1", text: "hello" },
|
|
91
|
+
});
|
|
92
|
+
const res = await post(body);
|
|
93
|
+
expect(res.status).toBe(200);
|
|
94
|
+
// Processing is async (setImmediate) — let it run.
|
|
95
|
+
await new Promise((r) => setImmediate(r));
|
|
96
|
+
await new Promise((r) => setImmediate(r));
|
|
97
|
+
expect(events).toHaveLength(1);
|
|
98
|
+
expect(events[0].source).toBe("slack");
|
|
99
|
+
expect(events[0].body).toBe("hello");
|
|
100
|
+
});
|
|
101
|
+
it("dedupes Slack retries by event_id", async () => {
|
|
102
|
+
const body = JSON.stringify({
|
|
103
|
+
type: "event_callback",
|
|
104
|
+
event_id: "Ev-dup",
|
|
105
|
+
event: { type: "message", channel: "D1", channel_type: "im", user: "U1", ts: "2.2", text: "once" },
|
|
106
|
+
});
|
|
107
|
+
expect((await post(body)).status).toBe(200);
|
|
108
|
+
await new Promise((r) => setImmediate(r));
|
|
109
|
+
await new Promise((r) => setImmediate(r));
|
|
110
|
+
expect(events).toHaveLength(1);
|
|
111
|
+
// Same event_id again (a Slack retry) → acked but NOT reprocessed.
|
|
112
|
+
expect((await post(body)).status).toBe(200);
|
|
113
|
+
await new Promise((r) => setImmediate(r));
|
|
114
|
+
await new Promise((r) => setImmediate(r));
|
|
115
|
+
expect(events).toHaveLength(1);
|
|
116
|
+
});
|
|
117
|
+
it("ignores message subtypes and bot messages", async () => {
|
|
118
|
+
const edited = JSON.stringify({
|
|
119
|
+
type: "event_callback",
|
|
120
|
+
event_id: "Ev2",
|
|
121
|
+
event: { type: "message", subtype: "message_changed", channel: "D1", channel_type: "im", user: "U1", ts: "3.3", text: "edit" },
|
|
122
|
+
});
|
|
123
|
+
const bot = JSON.stringify({
|
|
124
|
+
type: "event_callback",
|
|
125
|
+
event_id: "Ev3",
|
|
126
|
+
event: { type: "message", channel: "D1", channel_type: "im", bot_id: "B1", ts: "4.4", text: "from a bot" },
|
|
127
|
+
});
|
|
128
|
+
await post(edited);
|
|
129
|
+
await post(bot);
|
|
130
|
+
await new Promise((r) => setImmediate(r));
|
|
131
|
+
await new Promise((r) => setImmediate(r));
|
|
132
|
+
expect(events).toHaveLength(0);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=connector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.test.js","sourceRoot":"","sources":["../../../src/connectors/slack/connector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,13 @@ export interface EventEnvelope {
|
|
|
33
33
|
raw: unknown;
|
|
34
34
|
/** Reply on the same platform/thread */
|
|
35
35
|
reply: (msg: string) => Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Re-assert a "thinking" indicator for this thread, if the platform has one.
|
|
38
|
+
* Called at the start of each turn so a batched burst that drains as multiple
|
|
39
|
+
* turns shows the indicator for every turn — the per-arrival show is cleared
|
|
40
|
+
* by the first turn's reply. No-op for sources without an indicator (CLI).
|
|
41
|
+
*/
|
|
42
|
+
typing?: () => Promise<void>;
|
|
36
43
|
/** Timestamp of the event */
|
|
37
44
|
timestamp: Date;
|
|
38
45
|
}
|
|
@@ -1,49 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
3
|
-
import { type ExecutorConfig, type ExecutionResult, type ExtensionStatusMap, type SkillsStatus, type GitSandboxAccess } from "./profiles.js";
|
|
4
|
-
/**
|
|
5
|
-
* Stage this phase's declared skills into a per-phase bundle directory at
|
|
6
|
-
* `<workspaceRoot>/.lastlight-skills/<phaseKey>/<basename>/` and return the
|
|
7
|
-
* staged skill dirs, so the caller can point pi at them explicitly (via
|
|
8
|
-
* `--skill` for docker or `skillPaths` for the in-process backends). Each
|
|
9
|
-
* skill is a directory containing SKILL.md plus any `scripts/` / `references/`
|
|
10
|
-
* / `assets/` — the whole tree comes along.
|
|
11
|
-
*
|
|
12
|
-
* Keyed by phase so concurrent phases in one workspace never touch each
|
|
13
|
-
* other's bundle: only the phase's own `<phaseKey>` subtree is cleared, so a
|
|
14
|
-
* clean slate per phase doesn't disturb a sibling phase mid-run.
|
|
15
|
-
*
|
|
16
|
-
* `mode` controls how each skill lands:
|
|
17
|
-
* - "symlink": one symlink per skill → host source. gondolin/none, where pi
|
|
18
|
-
* reads skill files host-side / through the cwd mount. Zero-copy.
|
|
19
|
-
* - "copy": recursive copy. docker, where the agent's tools run inside the
|
|
20
|
-
* container and host symlink targets wouldn't resolve; the copy lands
|
|
21
|
-
* under the bind-mounted workspace.
|
|
22
|
-
*
|
|
23
|
-
* Returns `undefined` when the phase declares no skills (after clearing its
|
|
24
|
-
* bundle), so a phase with no `skills:` gets no catalogue at all.
|
|
25
|
-
*/
|
|
26
|
-
export declare function stageSkillBundle(workspaceRoot: string, phaseKey: string, skillPaths: string[] | undefined, mode: "symlink" | "copy"): string[] | undefined;
|
|
27
|
-
/**
|
|
28
|
-
* Add `entry` to a checkout's local `.git/info/exclude` (idempotent) so the
|
|
29
|
-
* agent's own `git add`/`commit` can never pick it up. This file lives inside
|
|
30
|
-
* `.git/` — it is never tracked, committed, or pushed, and it leaves the repo's
|
|
31
|
-
* real `.gitignore` untouched; the exclusion applies only to this ephemeral
|
|
32
|
-
* sandbox checkout. Used for the gondolin backend, where the skill bundle must
|
|
33
|
-
* be staged under cwd (the only mounted dir) rather than as an out-of-repo
|
|
34
|
-
* sibling. No-op when `repoDir` isn't a git checkout (e.g. the workspace root).
|
|
35
|
-
*/
|
|
36
|
-
export declare function excludeFromGit(repoDir: string, entry: string): void;
|
|
37
|
-
/**
|
|
38
|
-
* Execute one workflow-phase agent task via agentic-pi.
|
|
39
|
-
*
|
|
40
|
-
* Sandbox backend (decided per call):
|
|
41
|
-
* 1. gondolin — agentic-pi's QEMU micro-VM. cwd is the host worktree,
|
|
42
|
-
* mounted at /workspace inside the VM.
|
|
43
|
-
* 2. docker — the legacy container path (`src/sandbox/docker.ts`). The
|
|
44
|
-
* entrypoint inside the container execs `agentic-pi run --sandbox none`.
|
|
45
|
-
* 3. none — agentic-pi in-process with cwd = the host worktree.
|
|
46
|
-
*/
|
|
1
|
+
import { type ExecutorConfig, type ExecutionResult, type GitSandboxAccess } from "./profiles.js";
|
|
2
|
+
export { RunResultAccumulator, stageSkillBundle, excludeFromGit, detectAccountError } from "./executors/shared.js";
|
|
47
3
|
export declare function executeAgent(prompt: string, config: ExecutorConfig, opts?: {
|
|
48
4
|
taskId?: string;
|
|
49
5
|
/**
|
|
@@ -54,105 +10,34 @@ export declare function executeAgent(prompt: string, config: ExecutorConfig, opt
|
|
|
54
10
|
onSessionId?: (sessionId: string) => void;
|
|
55
11
|
githubAccess?: GitSandboxAccess;
|
|
56
12
|
}): Promise<ExecutionResult>;
|
|
13
|
+
/** What a command phase runs. */
|
|
14
|
+
export type CommandSpec = {
|
|
15
|
+
kind: "bash";
|
|
16
|
+
command: string;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "script";
|
|
19
|
+
script: string;
|
|
20
|
+
runtime: "js" | "ts" | "python";
|
|
21
|
+
name: string;
|
|
22
|
+
};
|
|
57
23
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Usage accounting accumulates each assistant `message_end`'s `usage`
|
|
64
|
-
* rather than trusting the terminal `usage_snapshot`. pi's snapshot is
|
|
65
|
-
* derived from `getSessionStats()`, which recomputes from the *current*
|
|
66
|
-
* in-memory message window — auto-compaction replaces those messages with
|
|
67
|
-
* a summary, so the snapshot reports zero tokens/cost/turns the moment a
|
|
68
|
-
* phase compacts. The per-message events fire at finalization (before any
|
|
69
|
-
* compaction rebuild), so summing them is compaction-proof. `bestStats()`
|
|
70
|
-
* prefers the accumulation and falls back to the snapshot only when no
|
|
71
|
-
* per-message usage was observed.
|
|
24
|
+
* Execute a deterministic command/script. Mirrors {@link executeDocker} /
|
|
25
|
+
* {@link executeInProcess} for sandbox setup but runs `runCommand` (docker) or
|
|
26
|
+
* `spawnSync` (gondolin/none) instead of an agent, and writes a session jsonl
|
|
27
|
+
* so the output is visible in the dashboard + CLI.
|
|
72
28
|
*/
|
|
73
|
-
export declare
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
private snapshotStats?;
|
|
82
|
-
private messages;
|
|
83
|
-
private assistantMessages;
|
|
84
|
-
private userMessages;
|
|
85
|
-
private toolCalls;
|
|
86
|
-
private toolResults;
|
|
87
|
-
private msgInput;
|
|
88
|
-
private msgOutput;
|
|
89
|
-
private msgCacheRead;
|
|
90
|
-
private msgCacheWrite;
|
|
91
|
-
private msgCost;
|
|
92
|
-
private ext;
|
|
93
|
-
private skillsRaw?;
|
|
94
|
-
feed(r: Record<string, unknown>): void;
|
|
95
|
-
private accumulateUsage;
|
|
96
|
-
/** Stats summed from per-message usage, or undefined if none was seen. */
|
|
97
|
-
private accumulatedStats;
|
|
98
|
-
/**
|
|
99
|
-
* Prefer the per-message accumulation (compaction-proof) over pi's
|
|
100
|
-
* terminal `usage_snapshot`. Fall back to the snapshot only when the
|
|
101
|
-
* accumulation carries no token data — e.g. a provider that doesn't
|
|
102
|
-
* report per-message usage — so a non-compacted snapshot still wins.
|
|
103
|
-
*/
|
|
104
|
-
bestStats(): RunResult["stats"] | undefined;
|
|
105
|
-
build(exitCode: 0 | 1 | 2): RunResult;
|
|
106
|
-
/**
|
|
107
|
-
* Normalized extension status captured from `extension_status` events
|
|
108
|
-
* (file-search / github / web-search), or undefined if none reported.
|
|
109
|
-
* Decoupled from agentic-pi's `RunResult` type, which lags the runtime —
|
|
110
|
-
* the docker sandbox's agentic-pi emits file-search even when the harness's
|
|
111
|
-
* pinned `RunResult` type doesn't yet declare it.
|
|
112
|
-
*/
|
|
113
|
-
extensions(): ExtensionStatusMap | undefined;
|
|
114
|
-
/**
|
|
115
|
-
* Normalized skill-loading status from the gated `skills_status` event, or
|
|
116
|
-
* undefined if none was reported (agentic-pi suppresses it on a run that
|
|
117
|
-
* configured no skills and discovered none). The skill-loading counterpart
|
|
118
|
-
* to {@link extensions}.
|
|
119
|
-
*/
|
|
120
|
-
skills(): SkillsStatus | undefined;
|
|
121
|
-
/**
|
|
122
|
-
* The last tool result that came back with `isError: true`, including the
|
|
123
|
-
* failure text — or undefined if no tool errored. This is what turns a
|
|
124
|
-
* bare `error_tool` stop reason into a human-readable cause.
|
|
125
|
-
*/
|
|
126
|
-
toolError(): {
|
|
127
|
-
tool?: string;
|
|
128
|
-
message: string;
|
|
129
|
-
} | undefined;
|
|
29
|
+
export declare function executeCommand(spec: CommandSpec, config: ExecutorConfig, opts?: {
|
|
30
|
+
taskId?: string;
|
|
31
|
+
githubAccess?: GitSandboxAccess;
|
|
32
|
+
/** Per-step timeout in seconds. */
|
|
33
|
+
timeoutSeconds?: number;
|
|
34
|
+
/** Extra env forwarded into the command (e.g. upstream phase outputs). */
|
|
35
|
+
sandboxEnv?: Record<string, string>;
|
|
36
|
+
onSessionId?: (sessionId: string) => void;
|
|
130
37
|
/**
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* truncated (step-limit) rather than genuinely finished.
|
|
38
|
+
* Mirror the command output to a session jsonl (visible in the dashboard +
|
|
39
|
+
* CLI). Default true. Set false for internal checks like `until_bash` that
|
|
40
|
+
* shouldn't create a user-facing session log.
|
|
135
41
|
*/
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Detect a provider account error (out of credit, quota, rate-limited, bad key)
|
|
140
|
-
* that pi may have surfaced as plain text rather than a hard failure.
|
|
141
|
-
*
|
|
142
|
-
* Critically, on a **successful** run we scan ONLY the genuine provider-error
|
|
143
|
-
* channel (`agentErrorMessage`, which `extractAgentError` already turns into a
|
|
144
|
-
* non-success stopReason when set — so it's empty here). The agent's own output
|
|
145
|
-
* (`finalText`) and tool results (`fatalError`, `toolError`) are NOT scanned on
|
|
146
|
-
* success: a legitimate `verify`/`qa-test` report or a `curl` probing a 401
|
|
147
|
-
* endpoint routinely contains "unauthorized" / "rate limit" as part of the task
|
|
148
|
-
* itself, and folding that in would wrongly fail a genuinely successful run
|
|
149
|
-
* (and drop its report). Only on a failed run do we fold those in to label why.
|
|
150
|
-
*/
|
|
151
|
-
export declare function detectAccountError(opts: {
|
|
152
|
-
success: boolean;
|
|
153
|
-
fatalErrorMessage?: string;
|
|
154
|
-
agentErrorMessage?: string;
|
|
155
|
-
finalText?: string;
|
|
156
|
-
toolErrorText?: string;
|
|
157
|
-
}): boolean;
|
|
158
|
-
export type { DockerSandbox };
|
|
42
|
+
writeSession?: boolean;
|
|
43
|
+
}): Promise<ExecutionResult>;
|