@nookplot/runtime 0.5.99 → 0.5.105
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/dist/__tests__/autonomous.guardrails.test.d.ts +2 -0
- package/dist/__tests__/autonomous.guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.guardrails.test.js +215 -0
- package/dist/__tests__/autonomous.guardrails.test.js.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts +2 -0
- package/dist/__tests__/autonomous.hooks.test.d.ts.map +1 -0
- package/dist/__tests__/autonomous.hooks.test.js +107 -0
- package/dist/__tests__/autonomous.hooks.test.js.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.episodicHook.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js +160 -0
- package/dist/__tests__/chatEngine.episodicHook.test.js.map +1 -0
- package/dist/__tests__/chatEngine.test.d.ts +2 -0
- package/dist/__tests__/chatEngine.test.d.ts.map +1 -0
- package/dist/__tests__/chatEngine.test.js +482 -0
- package/dist/__tests__/chatEngine.test.js.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts +2 -0
- package/dist/__tests__/conversation/compactionMemory.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/compactionMemory.test.js +447 -0
- package/dist/__tests__/conversation/compactionMemory.test.js.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts +2 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.d.ts.map +1 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js +79 -0
- package/dist/__tests__/conversation/modelThresholdsParity.test.js.map +1 -0
- package/dist/__tests__/guardrails.test.d.ts +2 -0
- package/dist/__tests__/guardrails.test.d.ts.map +1 -0
- package/dist/__tests__/guardrails.test.js +236 -0
- package/dist/__tests__/guardrails.test.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +9 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +188 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/querySegmentation.test.d.ts +2 -0
- package/dist/__tests__/querySegmentation.test.d.ts.map +1 -0
- package/dist/__tests__/querySegmentation.test.js +187 -0
- package/dist/__tests__/querySegmentation.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +13 -0
- package/dist/__tests__/sandbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox.test.js +413 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/wakeUpStack.test.d.ts +2 -0
- package/dist/__tests__/wakeUpStack.test.d.ts.map +1 -0
- package/dist/__tests__/wakeUpStack.test.js +239 -0
- package/dist/__tests__/wakeUpStack.test.js.map +1 -0
- package/dist/actionCatalog.generated.d.ts.map +1 -1
- package/dist/actionCatalog.generated.js +0 -5
- package/dist/actionCatalog.generated.js.map +1 -1
- package/dist/autonomous.d.ts +3 -0
- package/dist/autonomous.d.ts.map +1 -1
- package/dist/autonomous.js +108 -7
- package/dist/autonomous.js.map +1 -1
- package/dist/chat/chatEngine.d.ts +15 -0
- package/dist/chat/chatEngine.d.ts.map +1 -1
- package/dist/chat/chatEngine.js +59 -34
- package/dist/chat/chatEngine.js.map +1 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1 -0
- package/dist/connection.js.map +1 -1
- package/dist/conversation/compactionMemory.d.ts +124 -0
- package/dist/conversation/compactionMemory.d.ts.map +1 -0
- package/dist/conversation/compactionMemory.js +379 -0
- package/dist/conversation/compactionMemory.js.map +1 -0
- package/dist/conversation/conversationLogStore.d.ts +111 -0
- package/dist/conversation/conversationLogStore.d.ts.map +1 -0
- package/dist/conversation/conversationLogStore.js +248 -0
- package/dist/conversation/conversationLogStore.js.map +1 -0
- package/dist/conversation/conversationMemory.d.ts +59 -0
- package/dist/conversation/conversationMemory.d.ts.map +1 -0
- package/dist/conversation/conversationMemory.js +32 -0
- package/dist/conversation/conversationMemory.js.map +1 -0
- package/dist/conversation/index.d.ts +16 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/index.js +5 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/modelLimits.d.ts +43 -0
- package/dist/conversation/modelLimits.d.ts.map +1 -0
- package/dist/conversation/modelLimits.js +67 -0
- package/dist/conversation/modelLimits.js.map +1 -0
- package/dist/defaultGuardrails.d.ts +21 -0
- package/dist/defaultGuardrails.d.ts.map +1 -0
- package/dist/defaultGuardrails.js +90 -0
- package/dist/defaultGuardrails.js.map +1 -0
- package/dist/episodicMemoryHook.d.ts +39 -0
- package/dist/episodicMemoryHook.d.ts.map +1 -0
- package/dist/episodicMemoryHook.js +58 -0
- package/dist/episodicMemoryHook.js.map +1 -0
- package/dist/guardrails.d.ts +182 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +277 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/hooks.d.ts +162 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +91 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +38 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -3
- package/dist/index.js.map +1 -1
- package/dist/knowledgeContext.d.ts +15 -1
- package/dist/knowledgeContext.d.ts.map +1 -1
- package/dist/knowledgeContext.js +26 -3
- package/dist/knowledgeContext.js.map +1 -1
- package/dist/memory.d.ts +15 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +14 -0
- package/dist/memory.js.map +1 -1
- package/dist/querySegmentation.d.ts +54 -0
- package/dist/querySegmentation.d.ts.map +1 -0
- package/dist/querySegmentation.js +80 -0
- package/dist/querySegmentation.js.map +1 -0
- package/dist/sandbox.d.ts +156 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +425 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/signalActionMap.d.ts +19 -0
- package/dist/signalActionMap.d.ts.map +1 -1
- package/dist/signalActionMap.js +33 -0
- package/dist/signalActionMap.js.map +1 -1
- package/dist/types.d.ts +25 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/wakeUpStack.d.ts +94 -0
- package/dist/wakeUpStack.d.ts.map +1 -0
- package/dist/wakeUpStack.js +215 -0
- package/dist/wakeUpStack.js.map +1 -0
- package/package.json +1 -1
package/dist/sandbox.js
ADDED
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox — abstract base for agent-local code execution.
|
|
3
|
+
*
|
|
4
|
+
* `LocalSandbox` runs commands directly on the host (no isolation, dev only).
|
|
5
|
+
* `DockerSandbox` spawns a long-lived container and shells out to `docker exec`
|
|
6
|
+
* for each call. Both share the same surface so callers can swap them via:
|
|
7
|
+
*
|
|
8
|
+
* const sandbox = process.env.NODE_ENV === "production"
|
|
9
|
+
* ? await DockerSandbox.create({ image: "python:3.12.7-slim" })
|
|
10
|
+
* : await LocalSandbox.create();
|
|
11
|
+
*
|
|
12
|
+
* Sandboxes are AGENT-LOCAL — they are never registered in `ACTION_CATALOG`
|
|
13
|
+
* and never reachable over the network. `asTools()` returns local tool specs
|
|
14
|
+
* an agent can hand to its LLM, but the dispatch happens entirely in-process.
|
|
15
|
+
*
|
|
16
|
+
* Adversarial defaults (DockerSandbox):
|
|
17
|
+
* - `--network none` unless `allowNetwork: true`.
|
|
18
|
+
* - `--cpus 1 --memory 512m` unless overridden.
|
|
19
|
+
* - Mounts only under the caller's cwd unless `allowAnyMount: true`.
|
|
20
|
+
* - Mounts are read-only unless `readonly: false` is set per-mount.
|
|
21
|
+
* - Default image is `python:3.12.7-slim` — pinned minor to resist tag
|
|
22
|
+
* re-publish; callers running untrusted code at scale should override to
|
|
23
|
+
* a digest (`python@sha256:…`) for true immutability.
|
|
24
|
+
* - `close()` is idempotent and actually removes the container.
|
|
25
|
+
*
|
|
26
|
+
* @module sandbox
|
|
27
|
+
*/
|
|
28
|
+
import { spawn } from "node:child_process";
|
|
29
|
+
import { promises as fs, realpathSync } from "node:fs";
|
|
30
|
+
import path from "node:path";
|
|
31
|
+
// ── Argv-injection guards ────────────────────────────────────
|
|
32
|
+
//
|
|
33
|
+
// These validators exist because `SandboxOptions` flows into a `docker run`
|
|
34
|
+
// argv. Even though we use array-form spawn (no shell), Docker itself parses
|
|
35
|
+
// flags, and some fields (env values, image names) can be weaponized if
|
|
36
|
+
// callers ever pipe untrusted input through. All are defense-in-depth — the
|
|
37
|
+
// sandbox is agent-local and caller-constructed today.
|
|
38
|
+
/** POSIX env var name: `[A-Za-z_][A-Za-z0-9_]*`. Rejects anything that could
|
|
39
|
+
* confuse shells or POSIX env-parsers in the container. */
|
|
40
|
+
const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
41
|
+
/** Docker image reference: letters/digits/`._/:@-`, must start with an
|
|
42
|
+
* alphanumeric so it never looks like a flag to `docker run`. */
|
|
43
|
+
const DOCKER_IMAGE_RE = /^[A-Za-z0-9][A-Za-z0-9._/:@-]*$/;
|
|
44
|
+
function assertEnvPair(key, value) {
|
|
45
|
+
if (!ENV_KEY_RE.test(key)) {
|
|
46
|
+
throw new Error(`DockerSandbox: invalid env key '${key}' (must match ${ENV_KEY_RE.source})`);
|
|
47
|
+
}
|
|
48
|
+
if (value.includes("\n") || value.includes("\0")) {
|
|
49
|
+
throw new Error(`DockerSandbox: env value for '${key}' contains newline or NUL`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function assertImage(image) {
|
|
53
|
+
if (!DOCKER_IMAGE_RE.test(image)) {
|
|
54
|
+
throw new Error(`DockerSandbox: invalid image '${image}' (must match ${DOCKER_IMAGE_RE.source})`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Default Docker image. Pinned to a specific patch version + `slim` variant:
|
|
59
|
+
* - `slim` reduces attack surface (no build toolchain, no compilers).
|
|
60
|
+
* - Pinning to `3.12.7` resists the "tag re-publish" supply-chain vector
|
|
61
|
+
* where a fresh push to `python:3.12` replaces the content behind the tag.
|
|
62
|
+
*
|
|
63
|
+
* Callers running untrusted code at scale SHOULD override with a digest pin:
|
|
64
|
+
* new DockerSandbox({ image: "python@sha256:<digest>" })
|
|
65
|
+
*
|
|
66
|
+
* Bump this default when Python ships a meaningful security release; the
|
|
67
|
+
* argv-injection regex for `image` still requires leading alphanumeric.
|
|
68
|
+
*/
|
|
69
|
+
export const DEFAULT_SANDBOX_IMAGE = "python:3.12.7-slim";
|
|
70
|
+
// ── Base ─────────────────────────────────────────────────────
|
|
71
|
+
export class Sandbox {
|
|
72
|
+
/** Run a Python script via stdin. */
|
|
73
|
+
async python(script) {
|
|
74
|
+
return this.exec(["python3", "-"], { input: script });
|
|
75
|
+
}
|
|
76
|
+
/** Run a shell command. */
|
|
77
|
+
async sh(command) {
|
|
78
|
+
return this.exec(["sh", "-c", command]);
|
|
79
|
+
}
|
|
80
|
+
/** Returns local tool specs callers can pass to their LLM tool list. */
|
|
81
|
+
asTools() {
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
name: "python",
|
|
85
|
+
description: "Run a Python 3 script in the sandbox. Returns stdout.",
|
|
86
|
+
parameters: {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: {
|
|
89
|
+
script: { type: "string", description: "Python source to execute." },
|
|
90
|
+
},
|
|
91
|
+
required: ["script"],
|
|
92
|
+
},
|
|
93
|
+
invoke: async (args) => this.python(String(args.script ?? "")),
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "sh",
|
|
97
|
+
description: "Run a shell command in the sandbox. Returns stdout.",
|
|
98
|
+
parameters: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
command: { type: "string", description: "Shell command line." },
|
|
102
|
+
},
|
|
103
|
+
required: ["command"],
|
|
104
|
+
},
|
|
105
|
+
invoke: async (args) => this.sh(String(args.command ?? "")),
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ── LocalSandbox (no isolation; dev / tests only) ────────────
|
|
111
|
+
/**
|
|
112
|
+
* Silence the dev-only warning when set truthy. Escape hatch for test harnesses
|
|
113
|
+
* or intentionally-unsafe prototypes that don't want log noise. Production
|
|
114
|
+
* agents should never set this — use {@link DockerSandbox} instead.
|
|
115
|
+
*/
|
|
116
|
+
const LOCAL_SANDBOX_SILENCE_ENV = "NOOKPLOT_LOCAL_SANDBOX_SILENCE";
|
|
117
|
+
function emitLocalSandboxWarning() {
|
|
118
|
+
const env = process.env;
|
|
119
|
+
if (env.NODE_ENV === "test")
|
|
120
|
+
return;
|
|
121
|
+
if (env[LOCAL_SANDBOX_SILENCE_ENV])
|
|
122
|
+
return;
|
|
123
|
+
// Keep the message terse — it prints on every `create()` and that's fine:
|
|
124
|
+
// a production agent creating many LocalSandboxes is itself a bug signal.
|
|
125
|
+
console.warn("[LocalSandbox] No process isolation — commands run directly on the host. " +
|
|
126
|
+
"Use DockerSandbox for untrusted code in production. " +
|
|
127
|
+
`Silence with ${LOCAL_SANDBOX_SILENCE_ENV}=1.`);
|
|
128
|
+
}
|
|
129
|
+
export class LocalSandbox extends Sandbox {
|
|
130
|
+
env;
|
|
131
|
+
cwd;
|
|
132
|
+
closed = false;
|
|
133
|
+
constructor(opts = {}) {
|
|
134
|
+
super();
|
|
135
|
+
this.env = { ...opts.env };
|
|
136
|
+
this.cwd = process.cwd();
|
|
137
|
+
}
|
|
138
|
+
static async create(opts = {}) {
|
|
139
|
+
emitLocalSandboxWarning();
|
|
140
|
+
return new LocalSandbox(opts);
|
|
141
|
+
}
|
|
142
|
+
async exec(cmd, opts = {}) {
|
|
143
|
+
if (this.closed)
|
|
144
|
+
throw new Error("LocalSandbox: closed");
|
|
145
|
+
if (cmd.length === 0)
|
|
146
|
+
throw new Error("LocalSandbox: empty command");
|
|
147
|
+
const [bin, ...args] = cmd;
|
|
148
|
+
return runProcess(bin, args, {
|
|
149
|
+
input: opts.input,
|
|
150
|
+
cwd: opts.cwd ?? this.cwd,
|
|
151
|
+
env: { ...process.env, ...this.env, ...(opts.env ?? {}) },
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async put(localPath, sandboxPath) {
|
|
155
|
+
if (this.closed)
|
|
156
|
+
throw new Error("LocalSandbox: closed");
|
|
157
|
+
await fs.mkdir(path.dirname(sandboxPath), { recursive: true });
|
|
158
|
+
await fs.copyFile(localPath, sandboxPath);
|
|
159
|
+
}
|
|
160
|
+
async get(sandboxPath, localPath) {
|
|
161
|
+
if (this.closed)
|
|
162
|
+
throw new Error("LocalSandbox: closed");
|
|
163
|
+
await fs.mkdir(path.dirname(localPath), { recursive: true });
|
|
164
|
+
await fs.copyFile(sandboxPath, localPath);
|
|
165
|
+
return localPath;
|
|
166
|
+
}
|
|
167
|
+
endpoint(_port) {
|
|
168
|
+
throw new Error("LocalSandbox: endpoint() unsupported (no port mapping)");
|
|
169
|
+
}
|
|
170
|
+
async close() {
|
|
171
|
+
this.closed = true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export class DockerSandbox extends Sandbox {
|
|
175
|
+
opts;
|
|
176
|
+
internal;
|
|
177
|
+
constructor(opts, internal) {
|
|
178
|
+
super();
|
|
179
|
+
this.opts = {
|
|
180
|
+
...opts,
|
|
181
|
+
image: opts.image ?? DEFAULT_SANDBOX_IMAGE,
|
|
182
|
+
cpus: opts.cpus ?? 1,
|
|
183
|
+
memory: opts.memory ?? "512m",
|
|
184
|
+
};
|
|
185
|
+
this.internal = internal;
|
|
186
|
+
}
|
|
187
|
+
/** Spin up a long-lived container. Throws if Docker is unreachable. */
|
|
188
|
+
static async create(opts = {}) {
|
|
189
|
+
const dockerBin = opts.dockerBin ?? "docker";
|
|
190
|
+
const image = opts.image ?? DEFAULT_SANDBOX_IMAGE;
|
|
191
|
+
const cpus = opts.cpus ?? 1;
|
|
192
|
+
const memory = opts.memory ?? "512m";
|
|
193
|
+
DockerSandbox.validateMounts(opts.mounts ?? [], opts.allowAnyMount === true);
|
|
194
|
+
const args = DockerSandbox.buildRunArgs({
|
|
195
|
+
image,
|
|
196
|
+
cpus,
|
|
197
|
+
memory,
|
|
198
|
+
ports: opts.ports,
|
|
199
|
+
env: opts.env,
|
|
200
|
+
mounts: opts.mounts,
|
|
201
|
+
allowNetwork: opts.allowNetwork === true,
|
|
202
|
+
});
|
|
203
|
+
const containerIdRaw = await runProcess(dockerBin, args, {});
|
|
204
|
+
const containerId = containerIdRaw.trim();
|
|
205
|
+
if (!containerId) {
|
|
206
|
+
throw new Error("DockerSandbox: docker run returned empty container id");
|
|
207
|
+
}
|
|
208
|
+
const hostPortByContainer = await DockerSandbox.discoverPorts(dockerBin, containerId, Object.keys(opts.ports ?? {}).map((p) => Number(p)));
|
|
209
|
+
return new DockerSandbox(opts, {
|
|
210
|
+
containerId,
|
|
211
|
+
hostPortByContainer,
|
|
212
|
+
dockerBin,
|
|
213
|
+
closed: false,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/** Reattach to an existing container by id. */
|
|
217
|
+
static async connect(containerId, opts = {}) {
|
|
218
|
+
const dockerBin = opts.dockerBin ?? "docker";
|
|
219
|
+
const inspect = await runProcess(dockerBin, ["inspect", "--format", "{{.State.Running}}", containerId], {});
|
|
220
|
+
if (inspect.trim() !== "true") {
|
|
221
|
+
throw new Error(`DockerSandbox: container ${containerId} is not running`);
|
|
222
|
+
}
|
|
223
|
+
const hostPortByContainer = await DockerSandbox.discoverPorts(dockerBin, containerId, Object.keys(opts.ports ?? {}).map((p) => Number(p)));
|
|
224
|
+
return new DockerSandbox(opts, {
|
|
225
|
+
containerId,
|
|
226
|
+
hostPortByContainer,
|
|
227
|
+
dockerBin,
|
|
228
|
+
closed: false,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/** Visible for tests — does NOT execute docker. */
|
|
232
|
+
static buildRunArgs(opts) {
|
|
233
|
+
assertImage(opts.image);
|
|
234
|
+
const args = [
|
|
235
|
+
"run",
|
|
236
|
+
"-d",
|
|
237
|
+
"--rm",
|
|
238
|
+
"--cpus",
|
|
239
|
+
String(opts.cpus),
|
|
240
|
+
"--memory",
|
|
241
|
+
opts.memory,
|
|
242
|
+
];
|
|
243
|
+
if (!opts.allowNetwork)
|
|
244
|
+
args.push("--network", "none");
|
|
245
|
+
for (const [containerPortStr, hostPort] of Object.entries(opts.ports ?? {})) {
|
|
246
|
+
const containerPort = Number(containerPortStr);
|
|
247
|
+
if (hostPort === null || hostPort === undefined) {
|
|
248
|
+
args.push("-p", `${containerPort}`);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
args.push("-p", `${hostPort}:${containerPort}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
for (const [key, value] of Object.entries(opts.env ?? {})) {
|
|
255
|
+
assertEnvPair(key, value);
|
|
256
|
+
args.push("-e", `${key}=${value}`);
|
|
257
|
+
}
|
|
258
|
+
for (const mount of opts.mounts ?? []) {
|
|
259
|
+
// Default to read-only. Writes require explicit `readonly: false`.
|
|
260
|
+
// Undefined/true/missing → ro; only `false` opts into rw. This closes
|
|
261
|
+
// the "untrusted code writes back to the host" path by default.
|
|
262
|
+
const flag = mount.readonly === false ? "rw" : "ro";
|
|
263
|
+
args.push("-v", `${path.resolve(mount.host)}:${mount.container}:${flag}`);
|
|
264
|
+
}
|
|
265
|
+
// `assertImage` above rejects leading-dash image names, so positional
|
|
266
|
+
// placement of `image` cannot be mis-parsed as a docker-run flag.
|
|
267
|
+
args.push(opts.image, "sleep", "infinity");
|
|
268
|
+
return args;
|
|
269
|
+
}
|
|
270
|
+
static validateMounts(mounts, allowAny) {
|
|
271
|
+
if (allowAny)
|
|
272
|
+
return;
|
|
273
|
+
// Use realpath on BOTH sides so a symlink inside cwd pointing outside it
|
|
274
|
+
// cannot slip past the check. Matches the Python side's behavior.
|
|
275
|
+
let cwd;
|
|
276
|
+
try {
|
|
277
|
+
cwd = realpathSync(process.cwd());
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
cwd = path.resolve(process.cwd());
|
|
281
|
+
}
|
|
282
|
+
for (const mount of mounts) {
|
|
283
|
+
const abs = path.resolve(mount.host);
|
|
284
|
+
let resolved;
|
|
285
|
+
try {
|
|
286
|
+
resolved = realpathSync(abs);
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Path doesn't exist yet — fall back to the lexical resolution.
|
|
290
|
+
resolved = abs;
|
|
291
|
+
}
|
|
292
|
+
const rel = path.relative(cwd, resolved);
|
|
293
|
+
const escapes = rel === ".." || rel.startsWith(`..${path.sep}`) || path.isAbsolute(rel);
|
|
294
|
+
if (escapes) {
|
|
295
|
+
throw new Error(`DockerSandbox: mount '${mount.host}' resolves outside cwd; pass allowAnyMount: true to override`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
static async discoverPorts(dockerBin, containerId, requestedContainerPorts) {
|
|
300
|
+
const out = new Map();
|
|
301
|
+
for (const containerPort of requestedContainerPorts) {
|
|
302
|
+
try {
|
|
303
|
+
const raw = await runProcess(dockerBin, ["port", containerId, String(containerPort)], {});
|
|
304
|
+
// Format: "0.0.0.0:54321\n" — take the first line and the port after the colon.
|
|
305
|
+
const first = raw.split(/\r?\n/)[0]?.trim() ?? "";
|
|
306
|
+
const colon = first.lastIndexOf(":");
|
|
307
|
+
if (colon >= 0) {
|
|
308
|
+
const hostPort = Number(first.slice(colon + 1));
|
|
309
|
+
if (Number.isFinite(hostPort))
|
|
310
|
+
out.set(containerPort, hostPort);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
// Port not exposed — skip; endpoint() will throw with a clear message.
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return out;
|
|
318
|
+
}
|
|
319
|
+
async exec(cmd, opts = {}) {
|
|
320
|
+
if (this.internal.closed)
|
|
321
|
+
throw new Error("DockerSandbox: closed");
|
|
322
|
+
if (cmd.length === 0)
|
|
323
|
+
throw new Error("DockerSandbox: empty command");
|
|
324
|
+
const args = ["exec"];
|
|
325
|
+
if (opts.input !== undefined)
|
|
326
|
+
args.push("-i");
|
|
327
|
+
if (opts.cwd)
|
|
328
|
+
args.push("-w", opts.cwd);
|
|
329
|
+
for (const [k, v] of Object.entries(opts.env ?? {})) {
|
|
330
|
+
args.push("-e", `${k}=${v}`);
|
|
331
|
+
}
|
|
332
|
+
args.push(this.internal.containerId, ...cmd);
|
|
333
|
+
return runProcess(this.internal.dockerBin, args, { input: opts.input });
|
|
334
|
+
}
|
|
335
|
+
async put(localPath, sandboxPath) {
|
|
336
|
+
if (this.internal.closed)
|
|
337
|
+
throw new Error("DockerSandbox: closed");
|
|
338
|
+
await runProcess(this.internal.dockerBin, ["cp", localPath, `${this.internal.containerId}:${sandboxPath}`], {});
|
|
339
|
+
}
|
|
340
|
+
async get(sandboxPath, localPath) {
|
|
341
|
+
if (this.internal.closed)
|
|
342
|
+
throw new Error("DockerSandbox: closed");
|
|
343
|
+
await fs.mkdir(path.dirname(localPath), { recursive: true });
|
|
344
|
+
await runProcess(this.internal.dockerBin, ["cp", `${this.internal.containerId}:${sandboxPath}`, localPath], {});
|
|
345
|
+
return localPath;
|
|
346
|
+
}
|
|
347
|
+
endpoint(port) {
|
|
348
|
+
const hostPort = this.internal.hostPortByContainer.get(port);
|
|
349
|
+
if (hostPort === undefined) {
|
|
350
|
+
throw new Error(`DockerSandbox: port ${port} not mapped`);
|
|
351
|
+
}
|
|
352
|
+
return `localhost:${hostPort}`;
|
|
353
|
+
}
|
|
354
|
+
/** Idempotent. Force-removes the container and marks closed. */
|
|
355
|
+
async close() {
|
|
356
|
+
if (this.internal.closed)
|
|
357
|
+
return;
|
|
358
|
+
this.internal.closed = true;
|
|
359
|
+
try {
|
|
360
|
+
await runProcess(this.internal.dockerBin, ["rm", "-f", this.internal.containerId], {});
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
// Container may already be gone (e.g. --rm fired). Closed flag still
|
|
364
|
+
// flipped, so subsequent calls short-circuit. Leaving a leaked container
|
|
365
|
+
// would be a security bug — but `rm -f` is the strongest guarantee
|
|
366
|
+
// available from this side; failures here mean Docker itself is wedged.
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/** Test inspection — container id assigned at create. */
|
|
370
|
+
get containerId() {
|
|
371
|
+
return this.internal.containerId;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/** Spawn a process, capture stdout. Throws on non-zero exit. */
|
|
375
|
+
function runProcess(bin, args, opts) {
|
|
376
|
+
return new Promise((resolve, reject) => {
|
|
377
|
+
const spawnOpts = {
|
|
378
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
379
|
+
};
|
|
380
|
+
if (opts.cwd)
|
|
381
|
+
spawnOpts.cwd = opts.cwd;
|
|
382
|
+
if (opts.env)
|
|
383
|
+
spawnOpts.env = opts.env;
|
|
384
|
+
const child = spawn(bin, args, spawnOpts);
|
|
385
|
+
const stdoutChunks = [];
|
|
386
|
+
const stderrChunks = [];
|
|
387
|
+
child.stdout?.on("data", (chunk) => stdoutChunks.push(chunk));
|
|
388
|
+
child.stderr?.on("data", (chunk) => stderrChunks.push(chunk));
|
|
389
|
+
child.on("error", reject);
|
|
390
|
+
child.on("close", (code) => {
|
|
391
|
+
const stdout = Buffer.concat(stdoutChunks).toString("utf8");
|
|
392
|
+
const stderr = Buffer.concat(stderrChunks).toString("utf8");
|
|
393
|
+
if (code === 0) {
|
|
394
|
+
resolve(stdout);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
const detail = stderr.trim() || stdout.trim() || "(no output)";
|
|
398
|
+
reject(new Error(`${bin} exited ${code}: ${detail}`));
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
if (opts.input !== undefined && child.stdin) {
|
|
402
|
+
child.stdin.end(opts.input);
|
|
403
|
+
}
|
|
404
|
+
else if (child.stdin) {
|
|
405
|
+
child.stdin.end();
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
/** Sentinel for downstream code that wants to detect a sandbox at the type
|
|
410
|
+
* level without importing the abstract class directly. */
|
|
411
|
+
export function isSandbox(value) {
|
|
412
|
+
return value instanceof Sandbox;
|
|
413
|
+
}
|
|
414
|
+
/** Returns true if `docker version` succeeds. Useful for callers that want
|
|
415
|
+
* to fall back to `LocalSandbox` when Docker is unavailable. */
|
|
416
|
+
export async function isDockerAvailable(dockerBin = "docker") {
|
|
417
|
+
try {
|
|
418
|
+
await runProcess(dockerBin, ["version", "--format", "{{.Server.Version}}"], {});
|
|
419
|
+
return true;
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,26 @@
|
|
|
10
10
|
* New tools are auto-discoverable through their ACTION_CATALOG category via `browse_tools`.
|
|
11
11
|
* No switch statements to update when adding new tools.
|
|
12
12
|
*/
|
|
13
|
+
export type SelectionMode = "lenient" | "moderate" | "aggressive" | "strict";
|
|
13
14
|
export declare const CORE_ACTIONS: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Signal type → MAD selection mode for WakeUpStack L2 retrieval.
|
|
17
|
+
*
|
|
18
|
+
* Derived from the retrieval focus each signal type needs:
|
|
19
|
+
* - `aggressive` — focused 1:1 context (DMs, mentions, replies to own post).
|
|
20
|
+
* Want 2–3 tight matches, not scattershot.
|
|
21
|
+
* - `moderate` — standard working set (general channel activity, projects).
|
|
22
|
+
* - `lenient` — exploratory, cross-domain (new projects, multi-step tasks).
|
|
23
|
+
* Cast wide for synthesis.
|
|
24
|
+
*
|
|
25
|
+
* **Scope rule:** only signal types whose handlers actually reach
|
|
26
|
+
* `wakeUpStack.getContext()` live here. Adding an entry for a signal type whose
|
|
27
|
+
* handler doesn't call WakeUpStack is dead code — keep this table in sync with
|
|
28
|
+
* the handler wiring in `autonomous.ts`.
|
|
29
|
+
*
|
|
30
|
+
* Unmapped signal types fall back to `"moderate"` in `WakeUpStack.getContext()`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const SIGNAL_SELECTION_MODE: Record<string, SelectionMode>;
|
|
14
33
|
export declare const SIGNAL_CONTEXT_ACTIONS: Record<string, string[]>;
|
|
15
34
|
/**
|
|
16
35
|
* Derive the full list of available actions for a given signal type and loaded categories.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalActionMap.d.ts","sourceRoot":"","sources":["../src/signalActionMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"signalActionMap.d.ts","sourceRoot":"","sources":["../src/signalActionMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;AAM7E,eAAO,MAAM,YAAY,EAAE,MAAM,EA0BhC,CAAC;AAOF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAqB/D,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAwK3D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,MAAM,EAAE,CAqBV"}
|
package/dist/signalActionMap.js
CHANGED
|
@@ -45,6 +45,39 @@ export const CORE_ACTIONS = [
|
|
|
45
45
|
// Per-signal-type additions. Only the actions *specific* to that signal.
|
|
46
46
|
// "reply" and "ignore" are in CORE_ACTIONS — excluded here (always available).
|
|
47
47
|
// Cross-referenced across all 4 portals for consistency.
|
|
48
|
+
/**
|
|
49
|
+
* Signal type → MAD selection mode for WakeUpStack L2 retrieval.
|
|
50
|
+
*
|
|
51
|
+
* Derived from the retrieval focus each signal type needs:
|
|
52
|
+
* - `aggressive` — focused 1:1 context (DMs, mentions, replies to own post).
|
|
53
|
+
* Want 2–3 tight matches, not scattershot.
|
|
54
|
+
* - `moderate` — standard working set (general channel activity, projects).
|
|
55
|
+
* - `lenient` — exploratory, cross-domain (new projects, multi-step tasks).
|
|
56
|
+
* Cast wide for synthesis.
|
|
57
|
+
*
|
|
58
|
+
* **Scope rule:** only signal types whose handlers actually reach
|
|
59
|
+
* `wakeUpStack.getContext()` live here. Adding an entry for a signal type whose
|
|
60
|
+
* handler doesn't call WakeUpStack is dead code — keep this table in sync with
|
|
61
|
+
* the handler wiring in `autonomous.ts`.
|
|
62
|
+
*
|
|
63
|
+
* Unmapped signal types fall back to `"moderate"` in `WakeUpStack.getContext()`.
|
|
64
|
+
*/
|
|
65
|
+
export const SIGNAL_SELECTION_MODE = {
|
|
66
|
+
// 1:1 DM — handled by handleDmSignal, wired into WakeUpStack by Change 1.
|
|
67
|
+
dm_received: "aggressive",
|
|
68
|
+
// Direct mention in a channel — handleChannelSignal path.
|
|
69
|
+
channel_mention: "aggressive",
|
|
70
|
+
// Reply to the agent's own post — handleChannelSignal path (channelId present).
|
|
71
|
+
reply_to_own_post: "aggressive",
|
|
72
|
+
// General channel participation — standard working set.
|
|
73
|
+
channel_message: "moderate",
|
|
74
|
+
// Project thread discussion — standard context breadth.
|
|
75
|
+
project_discussion: "moderate",
|
|
76
|
+
// New community post — standard breadth.
|
|
77
|
+
new_post_in_community: "moderate",
|
|
78
|
+
// Discovering a new project — cast wide for cross-domain synthesis.
|
|
79
|
+
new_project: "lenient",
|
|
80
|
+
};
|
|
48
81
|
export const SIGNAL_CONTEXT_ACTIONS = {
|
|
49
82
|
// ── Directive ──
|
|
50
83
|
// Core mining actions so agents can act on "go mine" directives without browse_tools.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalActionMap.js","sourceRoot":"","sources":["../src/signalActionMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"signalActionMap.js","sourceRoot":"","sources":["../src/signalActionMap.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface RuntimeConfig {
|
|
|
17
17
|
* Without this, only IPFS uploads occur.
|
|
18
18
|
*/
|
|
19
19
|
privateKey?: string;
|
|
20
|
+
/** Client version string for version gating (e.g., "0.5.99"). Auto-set from package.json. */
|
|
21
|
+
clientVersion?: string;
|
|
20
22
|
/** How often to send heartbeats in ms (default: 30000) */
|
|
21
23
|
heartbeatIntervalMs?: number;
|
|
22
24
|
/** WebSocket reconnect settings */
|
|
@@ -28,6 +30,12 @@ export interface RuntimeConfig {
|
|
|
28
30
|
/** Max delay in ms (default: 30000) */
|
|
29
31
|
maxDelayMs?: number;
|
|
30
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Auto-install built-in lifecycle hooks (currently: `chat_turn_complete` →
|
|
35
|
+
* episodic memory write). Default: `true`. Set `false` to opt out and
|
|
36
|
+
* register custom listeners on `runtime.hooks` directly.
|
|
37
|
+
*/
|
|
38
|
+
autoInstallHooks?: boolean;
|
|
31
39
|
}
|
|
32
40
|
/** Connection state of the runtime client. */
|
|
33
41
|
export type ConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting";
|
|
@@ -388,10 +396,26 @@ export interface InferenceOptions {
|
|
|
388
396
|
/** Optional provider-specific parameters (e.g. Venice venice_parameters). */
|
|
389
397
|
providerParams?: Record<string, unknown>;
|
|
390
398
|
}
|
|
399
|
+
/**
|
|
400
|
+
* Structured tool invocation produced by an assistant message.
|
|
401
|
+
* Optional — most existing callers serialize tool calls inline as text.
|
|
402
|
+
* `CompactionMemory` uses these to detect Unit-B turn boundaries (an
|
|
403
|
+
* assistant turn isn't closed until every tool call has a matching
|
|
404
|
+
* `role: "tool"` reply).
|
|
405
|
+
*/
|
|
406
|
+
export interface ToolCall {
|
|
407
|
+
id: string;
|
|
408
|
+
name: string;
|
|
409
|
+
arguments: Record<string, unknown>;
|
|
410
|
+
}
|
|
391
411
|
/** A message in an inference conversation. */
|
|
392
412
|
export interface InferenceMessage {
|
|
393
|
-
role: "user" | "assistant" | "system";
|
|
413
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
394
414
|
content: string;
|
|
415
|
+
/** Tool calls emitted by an assistant message. */
|
|
416
|
+
toolCalls?: ToolCall[];
|
|
417
|
+
/** When `role === "tool"`, the call id this message answers. */
|
|
418
|
+
toolCallId?: string;
|
|
395
419
|
}
|
|
396
420
|
/** Inference response. */
|
|
397
421
|
export interface InferenceResult {
|