neoctl 0.2.40 → 0.2.42
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 +43 -585
- package/dist/context/prompts.js +2 -1
- package/dist/context/prompts.js.map +1 -1
- package/dist/core/run-agent.js +2 -0
- package/dist/core/run-agent.js.map +1 -1
- package/dist/repl/index.js +13 -1
- package/dist/repl/index.js.map +1 -1
- package/dist/tools/builtins/image-capabilities.d.ts +21 -0
- package/dist/tools/builtins/image-capabilities.js +97 -0
- package/dist/tools/builtins/image-capabilities.js.map +1 -0
- package/dist/tools/builtins/image-generation-tool.d.ts +14 -7
- package/dist/tools/builtins/image-generation-tool.js +141 -143
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/builtins/image-output-verification.d.ts +14 -0
- package/dist/tools/builtins/image-output-verification.js +183 -0
- package/dist/tools/builtins/image-output-verification.js.map +1 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +6 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-tool-use.js +5 -0
- package/dist/tools/run-tool-use.js.map +1 -1
- package/dist/web/image-result-metadata.d.ts +20 -0
- package/dist/web/image-result-metadata.js +20 -0
- package/dist/web/image-result-metadata.js.map +1 -0
- package/dist/web/index.d.ts +4 -1
- package/dist/web/index.js +20 -5
- package/dist/web/index.js.map +1 -1
- package/docs/prompt-config.md +1 -1
- package/package.json +22 -20
- package/dist/agents/agent-report-security.test.d.ts +0 -1
- package/dist/agents/agent-report-security.test.js +0 -301
- package/dist/agents/agent-report-security.test.js.map +0 -1
- package/dist/agents/agent-tool-persistence.test.d.ts +0 -1
- package/dist/agents/agent-tool-persistence.test.js +0 -319
- package/dist/agents/agent-tool-persistence.test.js.map +0 -1
- package/dist/agents/coordination-boundary.test.d.ts +0 -1
- package/dist/agents/coordination-boundary.test.js +0 -58
- package/dist/agents/coordination-boundary.test.js.map +0 -1
- package/dist/agents/live-preview-redaction-security.test.d.ts +0 -1
- package/dist/agents/live-preview-redaction-security.test.js +0 -286
- package/dist/agents/live-preview-redaction-security.test.js.map +0 -1
- package/dist/agents/no-nested-delegation.test.d.ts +0 -1
- package/dist/agents/no-nested-delegation.test.js +0 -38
- package/dist/agents/no-nested-delegation.test.js.map +0 -1
- package/dist/agents/obs07-11-run-facts.test.d.ts +0 -1
- package/dist/agents/obs07-11-run-facts.test.js +0 -459
- package/dist/agents/obs07-11-run-facts.test.js.map +0 -1
- package/dist/agents/smoke-agent-lifecycle.d.ts +0 -1
- package/dist/agents/smoke-agent-lifecycle.js +0 -192
- package/dist/agents/smoke-agent-lifecycle.js.map +0 -1
- package/dist/agents/smoke-agents.d.ts +0 -1
- package/dist/agents/smoke-agents.js +0 -362
- package/dist/agents/smoke-agents.js.map +0 -1
- package/dist/context/prompt-config.test.d.ts +0 -1
- package/dist/context/prompt-config.test.js +0 -128
- package/dist/context/prompt-config.test.js.map +0 -1
- package/dist/context/smoke-context.d.ts +0 -1
- package/dist/context/smoke-context.js +0 -502
- package/dist/context/smoke-context.js.map +0 -1
- package/dist/core/obs04-visible-data.test.d.ts +0 -1
- package/dist/core/obs04-visible-data.test.js +0 -147
- package/dist/core/obs04-visible-data.test.js.map +0 -1
- package/dist/core/query-session-settings.test.d.ts +0 -1
- package/dist/core/query-session-settings.test.js +0 -252
- package/dist/core/query-session-settings.test.js.map +0 -1
- package/dist/core/run-agent-pause.test.d.ts +0 -1
- package/dist/core/run-agent-pause.test.js +0 -52
- package/dist/core/run-agent-pause.test.js.map +0 -1
- package/dist/core/run-agent-persistence.test.d.ts +0 -1
- package/dist/core/run-agent-persistence.test.js +0 -222
- package/dist/core/run-agent-persistence.test.js.map +0 -1
- package/dist/core/session-prompt-inheritance.test.d.ts +0 -1
- package/dist/core/session-prompt-inheritance.test.js +0 -132
- package/dist/core/session-prompt-inheritance.test.js.map +0 -1
- package/dist/core/session-settings-prompt.test.d.ts +0 -1
- package/dist/core/session-settings-prompt.test.js +0 -266
- package/dist/core/session-settings-prompt.test.js.map +0 -1
- package/dist/core/smoke-core-loop.d.ts +0 -1
- package/dist/core/smoke-core-loop.js +0 -290
- package/dist/core/smoke-core-loop.js.map +0 -1
- package/dist/core/smoke-image-integrity.d.ts +0 -1
- package/dist/core/smoke-image-integrity.js +0 -67
- package/dist/core/smoke-image-integrity.js.map +0 -1
- package/dist/execution/docker.test.d.ts +0 -1
- package/dist/execution/docker.test.js +0 -57
- package/dist/execution/docker.test.js.map +0 -1
- package/dist/model/openai-native-image-guard.test.d.ts +0 -1
- package/dist/model/openai-native-image-guard.test.js +0 -101
- package/dist/model/openai-native-image-guard.test.js.map +0 -1
- package/dist/model/openai-responses-instructions.test.d.ts +0 -1
- package/dist/model/openai-responses-instructions.test.js +0 -64
- package/dist/model/openai-responses-instructions.test.js.map +0 -1
- package/dist/model/smoke-openai.d.ts +0 -1
- package/dist/model/smoke-openai.js +0 -44
- package/dist/model/smoke-openai.js.map +0 -1
- package/dist/model/smoke-responses-mapper.d.ts +0 -1
- package/dist/model/smoke-responses-mapper.js +0 -156
- package/dist/model/smoke-responses-mapper.js.map +0 -1
- package/dist/plugins/smoke-plugin-system.d.ts +0 -1
- package/dist/plugins/smoke-plugin-system.js +0 -63
- package/dist/plugins/smoke-plugin-system.js.map +0 -1
- package/dist/repl/smoke-run-command.d.ts +0 -1
- package/dist/repl/smoke-run-command.js +0 -43
- package/dist/repl/smoke-run-command.js.map +0 -1
- package/dist/secrets/smoke-secrets.d.ts +0 -1
- package/dist/secrets/smoke-secrets.js +0 -73
- package/dist/secrets/smoke-secrets.js.map +0 -1
- package/dist/session/session-store-safety.test.d.ts +0 -1
- package/dist/session/session-store-safety.test.js +0 -107
- package/dist/session/session-store-safety.test.js.map +0 -1
- package/dist/session/smoke-session.d.ts +0 -1
- package/dist/session/smoke-session.js +0 -233
- package/dist/session/smoke-session.js.map +0 -1
- package/dist/skills/smoke-skills.d.ts +0 -1
- package/dist/skills/smoke-skills.js +0 -109
- package/dist/skills/smoke-skills.js.map +0 -1
- package/dist/tasks/subagent-tools.test.d.ts +0 -1
- package/dist/tasks/subagent-tools.test.js +0 -159
- package/dist/tasks/subagent-tools.test.js.map +0 -1
- package/dist/tasks/task-ack-size.test.d.ts +0 -1
- package/dist/tasks/task-ack-size.test.js +0 -101
- package/dist/tasks/task-ack-size.test.js.map +0 -1
- package/dist/tasks/task-persistence.test.d.ts +0 -1
- package/dist/tasks/task-persistence.test.js +0 -331
- package/dist/tasks/task-persistence.test.js.map +0 -1
- package/dist/tools/smoke-exec-process.d.ts +0 -1
- package/dist/tools/smoke-exec-process.js +0 -127
- package/dist/tools/smoke-exec-process.js.map +0 -1
- package/dist/tools/smoke-terminal-output-chain.d.ts +0 -1
- package/dist/tools/smoke-terminal-output-chain.js +0 -245
- package/dist/tools/smoke-terminal-output-chain.js.map +0 -1
- package/dist/tools/smoke-tool-system.d.ts +0 -1
- package/dist/tools/smoke-tool-system.js +0 -412
- package/dist/tools/smoke-tool-system.js.map +0 -1
- package/dist/tools/terminal-background-history.test.d.ts +0 -1
- package/dist/tools/terminal-background-history.test.js +0 -77
- package/dist/tools/terminal-background-history.test.js.map +0 -1
- package/dist/tools/terminal-output-persistence.test.d.ts +0 -1
- package/dist/tools/terminal-output-persistence.test.js +0 -50
- package/dist/tools/terminal-output-persistence.test.js.map +0 -1
- package/dist/tools/terminal-output-store.test.d.ts +0 -1
- package/dist/tools/terminal-output-store.test.js +0 -364
- package/dist/tools/terminal-output-store.test.js.map +0 -1
- package/dist/web/agent-content-detail.test.d.ts +0 -1
- package/dist/web/agent-content-detail.test.js +0 -307
- package/dist/web/agent-content-detail.test.js.map +0 -1
- package/dist/web/agent-parent-messages.test.d.ts +0 -1
- package/dist/web/agent-parent-messages.test.js +0 -58
- package/dist/web/agent-parent-messages.test.js.map +0 -1
- package/dist/web/agent-tool-payload-security.test.d.ts +0 -1
- package/dist/web/agent-tool-payload-security.test.js +0 -120
- package/dist/web/agent-tool-payload-security.test.js.map +0 -1
- package/dist/web/prompt-config-protocol.test.d.ts +0 -1
- package/dist/web/prompt-config-protocol.test.js +0 -78
- package/dist/web/prompt-config-protocol.test.js.map +0 -1
- package/dist/web/session-prompt-integration.test.d.ts +0 -1
- package/dist/web/session-prompt-integration.test.js +0 -57
- package/dist/web/session-prompt-integration.test.js.map +0 -1
- package/dist/web/session-settings.test.d.ts +0 -1
- package/dist/web/session-settings.test.js +0 -254
- package/dist/web/session-settings.test.js.map +0 -1
- package/dist/web/smoke-agent-content-http.d.ts +0 -1
- package/dist/web/smoke-agent-content-http.js +0 -446
- package/dist/web/smoke-agent-content-http.js.map +0 -1
- package/dist/web/smoke-plan-payload.d.ts +0 -1
- package/dist/web/smoke-plan-payload.js +0 -30
- package/dist/web/smoke-plan-payload.js.map +0 -1
- package/dist/web/smoke-runtime-context-protocol.d.ts +0 -1
- package/dist/web/smoke-runtime-context-protocol.js +0 -42
- package/dist/web/smoke-runtime-context-protocol.js.map +0 -1
- package/dist/web/smoke-status-semantics.d.ts +0 -1
- package/dist/web/smoke-status-semantics.js +0 -90
- package/dist/web/smoke-status-semantics.js.map +0 -1
- package/dist/web/smoke-task-session-entrypoints.d.ts +0 -1
- package/dist/web/smoke-task-session-entrypoints.js +0 -96
- package/dist/web/smoke-task-session-entrypoints.js.map +0 -1
- package/dist/web/smoke-terminal-output-http.d.ts +0 -1
- package/dist/web/smoke-terminal-output-http.js +0 -377
- package/dist/web/smoke-terminal-output-http.js.map +0 -1
- package/dist/web/smoke-tool-call-detail.d.ts +0 -1
- package/dist/web/smoke-tool-call-detail.js +0 -106
- package/dist/web/smoke-tool-call-detail.js.map +0 -1
- package/dist/web/smoke-tool-call-http.d.ts +0 -1
- package/dist/web/smoke-tool-call-http.js +0 -100
- package/dist/web/smoke-tool-call-http.js.map +0 -1
- package/dist/web/smoke-tool-detail-fields-http.d.ts +0 -1
- package/dist/web/smoke-tool-detail-fields-http.js +0 -121
- package/dist/web/smoke-tool-detail-fields-http.js.map +0 -1
- package/dist/web/smoke-web-agent-tasks.d.ts +0 -1
- package/dist/web/smoke-web-agent-tasks.js +0 -50
- package/dist/web/smoke-web-agent-tasks.js.map +0 -1
- package/dist/web/smoke-web-history.d.ts +0 -1
- package/dist/web/smoke-web-history.js +0 -183
- package/dist/web/smoke-web-history.js.map +0 -1
- package/dist/web/smoke-web-queue.d.ts +0 -1
- package/dist/web/smoke-web-queue.js +0 -7
- package/dist/web/smoke-web-queue.js.map +0 -1
- package/dist/web/smoke-web-terminal-tasks.d.ts +0 -1
- package/dist/web/smoke-web-terminal-tasks.js +0 -238
- package/dist/web/smoke-web-terminal-tasks.js.map +0 -1
- package/dist/web/terminal-presentation.test.d.ts +0 -1
- package/dist/web/terminal-presentation.test.js +0 -33
- package/dist/web/terminal-presentation.test.js.map +0 -1
- package/dist/web/tool-detail-fields.test.d.ts +0 -1
- package/dist/web/tool-detail-fields.test.js +0 -121
- package/dist/web/tool-detail-fields.test.js.map +0 -1
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { loadNeoPlugins, NEO_PLUGIN_PROTOCOL, validateNeoPluginManifest } from "./plugin-system.js";
|
|
6
|
-
async function main() {
|
|
7
|
-
const root = await mkdtemp(path.join(os.tmpdir(), "neo-plugin-smoke-"));
|
|
8
|
-
const dataDir = path.join(root, "data");
|
|
9
|
-
try {
|
|
10
|
-
await createPlugin(root, "beta", false, "beta_tool");
|
|
11
|
-
await createPlugin(root, "alpha", true, "alpha_tool");
|
|
12
|
-
await mkdir(path.join(root, "not-a-plugin"), { recursive: true });
|
|
13
|
-
const plugins = await loadNeoPlugins({
|
|
14
|
-
directories: root,
|
|
15
|
-
appDataDir: dataDir,
|
|
16
|
-
env: { SMOKE_VALUE: "available" },
|
|
17
|
-
});
|
|
18
|
-
assert.deepEqual(plugins.map((plugin) => plugin.id), ["alpha", "beta"]);
|
|
19
|
-
assert.deepEqual(plugins.map((plugin) => plugin.defaultEnabled), [true, false]);
|
|
20
|
-
assert.deepEqual(plugins.flatMap((plugin) => plugin.tools.map((tool) => tool.name)), ["alpha_tool", "beta_tool"]);
|
|
21
|
-
assert.equal(plugins[0]?.promptSections[0]?.content, `available:${path.resolve(dataDir)}`);
|
|
22
|
-
assert.equal(await plugins[0]?.route?.({ method: "GET" }, {}, new URL("http://localhost/alpha"), {}), true);
|
|
23
|
-
assert.throws(() => validateNeoPluginManifest({ protocol: "other", id: "bad", name: "Bad", version: "1", entry: "index.mjs" }), /protocol must be neo-plugin\/v1/);
|
|
24
|
-
const missing = await loadNeoPlugins({ directories: path.join(root, "missing") });
|
|
25
|
-
assert.deepEqual(missing, []);
|
|
26
|
-
console.log(JSON.stringify({ ok: true, protocol: NEO_PLUGIN_PROTOCOL, plugins: plugins.map((plugin) => plugin.id) }, null, 2));
|
|
27
|
-
}
|
|
28
|
-
finally {
|
|
29
|
-
await rm(root, { recursive: true, force: true });
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
async function createPlugin(root, id, defaultEnabled, toolName) {
|
|
33
|
-
const pluginDir = path.join(root, id);
|
|
34
|
-
await mkdir(pluginDir, { recursive: true });
|
|
35
|
-
await writeFile(path.join(pluginDir, "neo-plugin.json"), JSON.stringify({
|
|
36
|
-
protocol: NEO_PLUGIN_PROTOCOL,
|
|
37
|
-
id,
|
|
38
|
-
name: id.toUpperCase(),
|
|
39
|
-
version: "1.0.0",
|
|
40
|
-
entry: "index.mjs",
|
|
41
|
-
defaultEnabled,
|
|
42
|
-
}, null, 2));
|
|
43
|
-
await writeFile(path.join(pluginDir, "index.mjs"), `
|
|
44
|
-
export function createPlugin(context) {
|
|
45
|
-
return {
|
|
46
|
-
tools: [{
|
|
47
|
-
name: ${JSON.stringify(toolName)},
|
|
48
|
-
description: "smoke tool",
|
|
49
|
-
inputSchema: { type: "object" },
|
|
50
|
-
metadata: { readOnly: true, concurrent: true, visible: true },
|
|
51
|
-
async execute() { return { ok: true, output: context.manifest.id }; },
|
|
52
|
-
}],
|
|
53
|
-
promptSections: [{ name: "Smoke", content: context.env.SMOKE_VALUE + ":" + context.appDataDir, cacheStable: true }],
|
|
54
|
-
route(request, response, url) { return url.pathname === "/" + context.manifest.id; },
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
`, "utf8");
|
|
58
|
-
}
|
|
59
|
-
main().catch((error) => {
|
|
60
|
-
console.error(error);
|
|
61
|
-
process.exitCode = 1;
|
|
62
|
-
});
|
|
63
|
-
//# sourceMappingURL=smoke-plugin-system.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-plugin-system.js","sourceRoot":"","sources":["../../src/plugins/smoke-plugin-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { executeRunCommand, parseRunCliArgs, readRunPrompt, toJsonAgentEvent } from "./run-command.js";
|
|
3
|
-
const parsed = parseRunCliArgs(["--json", "--model", "gpt-5.6", "--reasoning=high", "fix", "tests"]);
|
|
4
|
-
assert.deepEqual(parsed, {
|
|
5
|
-
ok: true,
|
|
6
|
-
options: { json: true, model: "gpt-5.6", reasoning: "high", prompt: "fix tests" },
|
|
7
|
-
});
|
|
8
|
-
assert.equal(parseRunCliArgs(["--wat"]).ok, false);
|
|
9
|
-
assert.equal(parseRunCliArgs(["-"]).ok, true);
|
|
10
|
-
const pipedInput = Object.assign((async function* () { yield " piped prompt\n"; })(), { isTTY: false });
|
|
11
|
-
assert.equal(await readRunPrompt(undefined, pipedInput), "piped prompt");
|
|
12
|
-
const errorEvent = toJsonAgentEvent({ type: "error", error: new TypeError("broken") });
|
|
13
|
-
assert.equal(errorEvent.error.name, "TypeError");
|
|
14
|
-
assert.equal(errorEvent.error.message, "broken");
|
|
15
|
-
const events = [
|
|
16
|
-
{ type: "assistant.delta", text: "hello" },
|
|
17
|
-
{ type: "assistant.delta", text: " world" },
|
|
18
|
-
{ type: "terminal", reason: "completed" },
|
|
19
|
-
];
|
|
20
|
-
const engine = {
|
|
21
|
-
async *sendUserText() {
|
|
22
|
-
yield* events;
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
let stdout = "";
|
|
26
|
-
let stderr = "";
|
|
27
|
-
const plain = await executeRunCommand(engine, "prompt", { json: false }, {
|
|
28
|
-
stdout: { write: (chunk) => { stdout += chunk; } },
|
|
29
|
-
stderr: { write: (chunk) => { stderr += chunk; } },
|
|
30
|
-
});
|
|
31
|
-
assert.deepEqual(plain, { exitCode: 0, terminalReason: "completed" });
|
|
32
|
-
assert.equal(stdout, "hello world\n");
|
|
33
|
-
assert.equal(stderr, "");
|
|
34
|
-
stdout = "";
|
|
35
|
-
const json = await executeRunCommand(engine, "prompt", { json: true }, {
|
|
36
|
-
stdout: { write: (chunk) => { stdout += chunk; } },
|
|
37
|
-
stderr: { write: () => undefined },
|
|
38
|
-
});
|
|
39
|
-
assert.equal(json.exitCode, 0);
|
|
40
|
-
const records = stdout.trim().split("\n").map((line) => JSON.parse(line));
|
|
41
|
-
assert.deepEqual(records.map((event) => event.type), ["assistant.delta", "assistant.delta", "terminal"]);
|
|
42
|
-
console.log("cli run smoke ok");
|
|
43
|
-
//# sourceMappingURL=smoke-run-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-run-command.js","sourceRoot":"","sources":["../../src/repl/smoke-run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { InMemoryAppState } from "../app/app-state.js";
|
|
5
|
-
import { ToolRegistry } from "../tools/registry.js";
|
|
6
|
-
import { runToolUse } from "../tools/run-tool-use.js";
|
|
7
|
-
import { createExecTool } from "../tools/builtins/exec-tool.js";
|
|
8
|
-
import { ExecProcessManager } from "../tools/builtins/exec-process-manager.js";
|
|
9
|
-
import { createSecretTools } from "../tools/builtins/secret-tools.js";
|
|
10
|
-
import { InMemorySecretRedactionRegistry } from "./secret-redaction.js";
|
|
11
|
-
import { SecretStore } from "./secret-store.js";
|
|
12
|
-
async function main() {
|
|
13
|
-
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "neoctl-secrets-"));
|
|
14
|
-
const filePath = path.join(dir, "secrets.json");
|
|
15
|
-
const store = await SecretStore.open({ filePath, passphrase: "smoke-passphrase" });
|
|
16
|
-
await store.setPlaintext("api_token", "super-secret-token");
|
|
17
|
-
const empty = await store.requestEmpty("github_token", { reason: "Need GitHub API", requestedBy: "agent" });
|
|
18
|
-
const raw = await fs.readFile(filePath, "utf8");
|
|
19
|
-
const encryptedAtRestOk = !raw.includes("super-secret-token") && raw.includes("api_token") && raw.includes("github_token");
|
|
20
|
-
const list = await store.list();
|
|
21
|
-
const metadataOk = list.some((entry) => entry.key === "api_token" && entry.status === "set" && entry.length === "super-secret-token".length)
|
|
22
|
-
&& empty.status === "empty";
|
|
23
|
-
const registry = new ToolRegistry();
|
|
24
|
-
for (const tool of createSecretTools())
|
|
25
|
-
registry.register(tool);
|
|
26
|
-
registry.register(createExecTool({ processManager: new ExecProcessManager() }));
|
|
27
|
-
const redactions = new InMemorySecretRedactionRegistry();
|
|
28
|
-
const context = {
|
|
29
|
-
agentId: "smoke",
|
|
30
|
-
tools: registry,
|
|
31
|
-
appState: new InMemoryAppState("smoke", dir),
|
|
32
|
-
secrets: store,
|
|
33
|
-
secretRedactions: redactions,
|
|
34
|
-
emit: () => undefined,
|
|
35
|
-
};
|
|
36
|
-
const secretList = await runToolUse({ id: "secret_list", name: "secret_list", input: {} }, context);
|
|
37
|
-
const secretListJson = JSON.stringify(secretList);
|
|
38
|
-
const listToolOk = secretListJson.includes("api_token") && secretListJson.includes('"length":18') && !secretListJson.includes("super-secret-token");
|
|
39
|
-
const request = await runToolUse({ id: "secret_request", name: "secret_request", input: { key: "new_token", reason: "test" } }, context);
|
|
40
|
-
const requestOk = JSON.stringify(request).includes("new_token") && (await store.info("new_token"))?.status === "empty";
|
|
41
|
-
const execResult = await runToolUse({
|
|
42
|
-
id: "exec_secret",
|
|
43
|
-
name: "terminal_run",
|
|
44
|
-
input: {
|
|
45
|
-
cmd: "node -e \"console.log(process.env.API_TOKEN)\"",
|
|
46
|
-
description: "verify secret env redaction",
|
|
47
|
-
envSecrets: { API_TOKEN: "api_token" },
|
|
48
|
-
max_output_chars: 1000,
|
|
49
|
-
},
|
|
50
|
-
}, context);
|
|
51
|
-
const execJson = JSON.stringify(execResult);
|
|
52
|
-
const execRedactedOk = execJson.includes("[secret:api_token]") && !execJson.includes("super-secret-token");
|
|
53
|
-
redactions.record("split_token", "ABCDEF");
|
|
54
|
-
const streamRedactor = redactions.createStreamingRedactor();
|
|
55
|
-
const splitRedacted = `${streamRedactor.push("prefix ABC")}${streamRedactor.push("DEF suffix")}${streamRedactor.flush()}`;
|
|
56
|
-
const splitChunkRedactionOk = splitRedacted === "prefix [secret:split_token] suffix" && !splitRedacted.includes("ABCDEF");
|
|
57
|
-
let emptyErrorOk = false;
|
|
58
|
-
try {
|
|
59
|
-
await store.resolveForTool("github_token");
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
emptyErrorOk = error instanceof Error && error.message.includes("has no value");
|
|
63
|
-
}
|
|
64
|
-
const ok = encryptedAtRestOk && metadataOk && listToolOk && requestOk && execRedactedOk && splitChunkRedactionOk && emptyErrorOk;
|
|
65
|
-
console.log(JSON.stringify({ ok, encryptedAtRestOk, metadataOk, listToolOk, requestOk, execRedactedOk, splitChunkRedactionOk, emptyErrorOk }, null, 2));
|
|
66
|
-
if (!ok)
|
|
67
|
-
process.exitCode = 1;
|
|
68
|
-
}
|
|
69
|
-
void main().catch((error) => {
|
|
70
|
-
console.error(error);
|
|
71
|
-
process.exitCode = 1;
|
|
72
|
-
});
|
|
73
|
-
//# sourceMappingURL=smoke-secrets.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-secrets.js","sourceRoot":"","sources":["../../src/secrets/smoke-secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAEnF,MAAM,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5G,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3H,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,CAAC,MAAM,CAAC;WACvI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;IAE9B,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,IAAI,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,IAAI,+BAA+B,EAAE,CAAC;IACzD,MAAM,OAAO,GAAmB;QAC9B,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC;QAC5C,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,UAAU;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;KACtB,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACpG,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAEpJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACzI,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAEvH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC;QAClC,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE;YACL,GAAG,EAAE,gDAAgD;YACrD,WAAW,EAAE,6BAA6B;YAC1C,UAAU,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;YACtC,gBAAgB,EAAE,IAAI;SACvB;KACF,EAAE,OAAO,CAAC,CAAC;IACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC3G,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,UAAU,CAAC,uBAAuB,EAAE,CAAC;IAC5D,MAAM,aAAa,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1H,MAAM,qBAAqB,GAAG,aAAa,KAAK,oCAAoC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE1H,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,GAAG,iBAAiB,IAAI,UAAU,IAAI,UAAU,IAAI,SAAS,IAAI,cAAc,IAAI,qBAAqB,IAAI,YAAY,CAAC;IACjI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxJ,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import test from "node:test";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { SessionStore } from "./session-store.js";
|
|
7
|
-
import { createTextMessage } from "../types/messages.js";
|
|
8
|
-
import { QueryEngine } from "../core/query-engine.js";
|
|
9
|
-
import { ToolRegistry } from "../tools/registry.js";
|
|
10
|
-
async function temporary(run) {
|
|
11
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), "neo-session-safety-"));
|
|
12
|
-
try {
|
|
13
|
-
await run(root);
|
|
14
|
-
}
|
|
15
|
-
finally {
|
|
16
|
-
fs.rmSync(root, { recursive: true, force: true });
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
test("unsafe identifiers cannot open or delete root or parent; custom roots work", async () => temporary(async (root) => {
|
|
20
|
-
const rootDir = path.join(root, "custom", "sessions");
|
|
21
|
-
const store = await SessionStore.open({ rootDir, sessionId: "legal-session_中文", agentId: "main" });
|
|
22
|
-
store.recordMessage(createTextMessage("user", "safe"));
|
|
23
|
-
for (const sessionId of [".", "..", " ../escape ", "a/b", "a\\b", "C:\\escape", "x:stream", "name.", "NUL", "con.txt", "x\0y"]) {
|
|
24
|
-
await assert.rejects(SessionStore.open({ rootDir, sessionId, agentId: "main", resume: true }), /invalid session id/);
|
|
25
|
-
await assert.rejects(SessionStore.delete({ rootDir, sessionId }), /invalid session id/);
|
|
26
|
-
assert.equal(fs.existsSync(store.transcriptPath), true);
|
|
27
|
-
}
|
|
28
|
-
assert.equal(await SessionStore.delete({ rootDir, sessionId: store.sessionId }), true);
|
|
29
|
-
assert.equal(fs.existsSync(rootDir), true);
|
|
30
|
-
assert.equal(fs.existsSync(root), true);
|
|
31
|
-
}));
|
|
32
|
-
test("reject session and root junctions without changing target", async () => temporary(async (root) => {
|
|
33
|
-
const rootDir = path.join(root, "sessions");
|
|
34
|
-
const target = path.join(root, "target");
|
|
35
|
-
fs.mkdirSync(rootDir);
|
|
36
|
-
fs.mkdirSync(target);
|
|
37
|
-
fs.writeFileSync(path.join(target, "sentinel"), "untouched");
|
|
38
|
-
const child = path.join(rootDir, "child");
|
|
39
|
-
fs.symlinkSync(target, child, process.platform === "win32" ? "junction" : "dir");
|
|
40
|
-
await assert.rejects(SessionStore.open({ rootDir, sessionId: "child", agentId: "main", resume: true }), /Unsafe session directory/);
|
|
41
|
-
await assert.rejects(SessionStore.delete({ rootDir, sessionId: "child" }), /Unsafe session directory/);
|
|
42
|
-
await assert.rejects(SessionStore.open({ rootDir: child, sessionId: "nested", agentId: "main" }), /Unsafe session directory/);
|
|
43
|
-
assert.equal(fs.readFileSync(path.join(target, "sentinel"), "utf8"), "untouched");
|
|
44
|
-
}));
|
|
45
|
-
for (const kind of ["hardlink", "symlink"]) {
|
|
46
|
-
test(`reject transcript ${kind} before read, repair, append or delete`, async (t) => temporary(async (root) => {
|
|
47
|
-
const rootDir = path.join(root, "sessions");
|
|
48
|
-
const store = await SessionStore.open({ rootDir, sessionId: "child", agentId: "main" });
|
|
49
|
-
const target = path.join(root, "target.txt");
|
|
50
|
-
fs.writeFileSync(target, "unterminated sensitive data");
|
|
51
|
-
try {
|
|
52
|
-
if (kind === "hardlink")
|
|
53
|
-
fs.linkSync(target, store.transcriptPath);
|
|
54
|
-
else
|
|
55
|
-
fs.symlinkSync(target, store.transcriptPath, "file");
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
if (kind === "symlink" && error.code === "EPERM") {
|
|
59
|
-
t.skip("file symlink privilege unavailable");
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
await assert.rejects(SessionStore.open({ rootDir, sessionId: "child", agentId: "main", resume: true }), /Unsafe session transcript/);
|
|
65
|
-
assert.throws(() => store.recordMessage(createTextMessage("user", "no write")), /Unsafe session transcript/);
|
|
66
|
-
await assert.rejects(SessionStore.delete({ rootDir, sessionId: "child" }), /Unsafe session transcript/);
|
|
67
|
-
assert.equal(fs.readFileSync(target, "utf8"), "unterminated sensitive data");
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
test("partial append poisons instance; reopen repairs tail and preserves prior messages", async (t) => temporary(async (rootDir) => {
|
|
71
|
-
const store = await SessionStore.open({ rootDir, sessionId: "child", agentId: "main" });
|
|
72
|
-
const first = createTextMessage("user", "before failure");
|
|
73
|
-
store.recordMessage(first);
|
|
74
|
-
const write = fs.writeFileSync;
|
|
75
|
-
const mock = t.mock.method(fs, "writeFileSync", ((file, data, ...args) => {
|
|
76
|
-
if (typeof file === "number") {
|
|
77
|
-
write(file, String(data).slice(0, 20), "utf8");
|
|
78
|
-
throw Object.assign(new Error("disk full"), { code: "ENOSPC" });
|
|
79
|
-
}
|
|
80
|
-
return write(file, data, ...args);
|
|
81
|
-
}));
|
|
82
|
-
assert.throws(() => store.recordMessage(createTextMessage("user", "lost")), /disk full/);
|
|
83
|
-
mock.mock.restore();
|
|
84
|
-
const partial = fs.readFileSync(store.transcriptPath, "utf8");
|
|
85
|
-
assert.throws(() => store.recordMessage(createTextMessage("user", "must not append")), /writes disabled/);
|
|
86
|
-
assert.equal(fs.readFileSync(store.transcriptPath, "utf8"), partial);
|
|
87
|
-
const reopened = await SessionStore.open({ rootDir, sessionId: "child", agentId: "main", resume: true });
|
|
88
|
-
assert.deepEqual(reopened.getInitialMessages(), [first]);
|
|
89
|
-
const next = createTextMessage("user", "after repair");
|
|
90
|
-
reopened.recordMessage(next);
|
|
91
|
-
const again = await SessionStore.open({ rootDir, sessionId: "child", agentId: "main", resume: true });
|
|
92
|
-
assert.deepEqual(again.getInitialMessages(), [first, next]);
|
|
93
|
-
}));
|
|
94
|
-
test("failed compaction checkpoint does not replace engine history", async () => temporary(async (rootDir) => {
|
|
95
|
-
const engine = new QueryEngine({ tools: new ToolRegistry(), modelGateway: { async *stream() { } }, session: { rootDir, sessionId: "main" } });
|
|
96
|
-
await engine.initialize();
|
|
97
|
-
const internal = engine;
|
|
98
|
-
const original = createTextMessage("user", "original");
|
|
99
|
-
internal.history.push(original);
|
|
100
|
-
internal.sessionStore.recordMessage(original);
|
|
101
|
-
internal.sessionStore.recordCompactCheckpoint = () => { throw new Error("checkpoint failed"); };
|
|
102
|
-
assert.throws(() => internal.applyCompactionResult({ changed: true, messages: [createTextMessage("user", "replacement")] }), /checkpoint failed/);
|
|
103
|
-
assert.deepEqual(internal.history, [original]);
|
|
104
|
-
const restored = await SessionStore.open({ rootDir, sessionId: "main", agentId: "main", resume: true });
|
|
105
|
-
assert.deepEqual(restored.getInitialMessages(), [original]);
|
|
106
|
-
}));
|
|
107
|
-
//# sourceMappingURL=session-store-safety.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-store-safety.test.js","sourceRoot":"","sources":["../../src/session/session-store-safety.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { FileToolResultMemory, PERSISTED_OUTPUT_TAG } from "./tool-result-memory.js";
|
|
5
|
-
import { SessionStore } from "./session-store.js";
|
|
6
|
-
import { writeSessionMarkdownExport } from "./session-export.js";
|
|
7
|
-
import { createTextMessage, createThinkingMessage } from "../types/messages.js";
|
|
8
|
-
async function main() {
|
|
9
|
-
const root = await fs.mkdtemp(path.join(os.tmpdir(), "agent-session-smoke-"));
|
|
10
|
-
const sessionId = "smoke-session";
|
|
11
|
-
const messages = createToolMessages();
|
|
12
|
-
const memory = new FileToolResultMemory({ sessionDir: path.join(root, sessionId), thresholdChars: 180, previewChars: 40 });
|
|
13
|
-
const first = await memory.applyBudget(messages);
|
|
14
|
-
const persistedBlocks = first.messages.flatMap((message) => message.blocks.filter((block) => block.type === "tool_result" && String(block.output).startsWith(PERSISTED_OUTPUT_TAG)));
|
|
15
|
-
const second = await memory.applyBudget(messages);
|
|
16
|
-
const store = await SessionStore.open({ agentId: "main", rootDir: root, sessionId });
|
|
17
|
-
for (const message of messages)
|
|
18
|
-
store.recordMessage(message);
|
|
19
|
-
store.recordMessage(createThinkingMessage("persisted visible reasoning"));
|
|
20
|
-
store.recordMessage(createTextMessage("assistant", "assistant before compact"));
|
|
21
|
-
store.recordContentReplacements(first.records);
|
|
22
|
-
store.recordTitle("Smoke Session Title", "initial");
|
|
23
|
-
store.recordTitle("Refined Smoke Session Title", "refinement");
|
|
24
|
-
store.recordFastMode(true);
|
|
25
|
-
store.recordContextWindowTokens(256000);
|
|
26
|
-
store.recordMessage({ ...messages[0], role: "progress" });
|
|
27
|
-
const compactionBoundary = {
|
|
28
|
-
...createTextMessage("system", "<compact_state>persisted compact state</compact_state>"),
|
|
29
|
-
isMeta: true,
|
|
30
|
-
metadata: { compactBoundary: true, compactionReason: "manualcompact", modelDriven: true },
|
|
31
|
-
};
|
|
32
|
-
const preservedUser = { ...createTextMessage("user", "preserved user request"), metadata: { compactPreservedUser: true } };
|
|
33
|
-
store.recordCompactCheckpoint([preservedUser, compactionBoundary], "manualcompact", {
|
|
34
|
-
reason: "manualcompact",
|
|
35
|
-
summary: "persisted compact summary",
|
|
36
|
-
continuationState: "persisted compact state",
|
|
37
|
-
sourceMessages: messages.length + 2,
|
|
38
|
-
preservedUserMessages: 1,
|
|
39
|
-
newWindowMessages: 2,
|
|
40
|
-
charsFreed: 1234,
|
|
41
|
-
modelDriven: true,
|
|
42
|
-
imageCount: 0,
|
|
43
|
-
});
|
|
44
|
-
store.recordMessage(createTextMessage("assistant", "assistant between compacts"));
|
|
45
|
-
const secondCompactionBoundary = {
|
|
46
|
-
...createTextMessage("system", "<compact_state>second compact state</compact_state>"),
|
|
47
|
-
isMeta: true,
|
|
48
|
-
metadata: { compactBoundary: true, compactionReason: "manualcompact", modelDriven: true },
|
|
49
|
-
};
|
|
50
|
-
store.recordCompactCheckpoint([preservedUser, secondCompactionBoundary], "manualcompact", {
|
|
51
|
-
reason: "manualcompact",
|
|
52
|
-
summary: "second compact summary",
|
|
53
|
-
continuationState: "second compact state",
|
|
54
|
-
sourceMessages: 3,
|
|
55
|
-
preservedUserMessages: 1,
|
|
56
|
-
newWindowMessages: 2,
|
|
57
|
-
charsFreed: 2345,
|
|
58
|
-
modelDriven: true,
|
|
59
|
-
imageCount: 0,
|
|
60
|
-
});
|
|
61
|
-
store.recordMessage(createTextMessage("assistant", "assistant after second compact"));
|
|
62
|
-
const resumed = await SessionStore.open({ agentId: "main", rootDir: root, sessionId, resume: true });
|
|
63
|
-
const latest = await SessionStore.open({ agentId: "main", rootDir: root, resume: true });
|
|
64
|
-
const listed = await SessionStore.list({ agentId: "main", rootDir: root });
|
|
65
|
-
const resumedBudget = await resumed.toolResultMemory.applyBudget(resumed.getInitialMessages(), { maxSerializedLength: 180 });
|
|
66
|
-
const displayEntries = resumed.getDisplayEntries();
|
|
67
|
-
const displayMessages = displayEntries.filter((entry) => entry.type === "message").map((entry) => entry.message);
|
|
68
|
-
const displayCompactions = displayEntries.filter((entry) => entry.type === "compact");
|
|
69
|
-
const displayCompactionIndexes = displayEntries.flatMap((entry, index) => entry.type === "compact" ? [index] : []);
|
|
70
|
-
const exportPath = path.join(root, "exports", "session.md");
|
|
71
|
-
const exportResult = await writeSessionMarkdownExport({
|
|
72
|
-
outputPath: exportPath,
|
|
73
|
-
session: resumed.snapshot(),
|
|
74
|
-
agentId: "main",
|
|
75
|
-
promptSnapshot: {
|
|
76
|
-
model: "smoke-model",
|
|
77
|
-
systemPrompt: "system prompt smoke",
|
|
78
|
-
userContextPrompt: "User context:\ncurrentDate: 2026-05-09",
|
|
79
|
-
toolDefinitions: [{ name: "alpha", description: "Alpha tool", inputSchema: { type: "object" } }],
|
|
80
|
-
commands: ["/export <absolute-md-path>"],
|
|
81
|
-
},
|
|
82
|
-
maxToolResultLines: 3,
|
|
83
|
-
});
|
|
84
|
-
const exportedMarkdown = await fs.readFile(exportPath, "utf8");
|
|
85
|
-
const truncatedTailSessionId = "truncated-tail-session";
|
|
86
|
-
const truncatedTailStore = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: truncatedTailSessionId });
|
|
87
|
-
truncatedTailStore.recordMessage(createTextMessage("user", "durable before partial tail"));
|
|
88
|
-
await fs.appendFile(truncatedTailStore.transcriptPath, '{"type":"message","sessionId":"truncated-tail-session"', "utf8");
|
|
89
|
-
const recoveredTailStore = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: truncatedTailSessionId, resume: true });
|
|
90
|
-
const recoveredTailMessagesBeforeAppend = recoveredTailStore.getInitialMessages();
|
|
91
|
-
const repairedTailText = await fs.readFile(truncatedTailStore.transcriptPath, "utf8");
|
|
92
|
-
recoveredTailStore.recordMessage(createTextMessage("assistant", "durable after partial tail"));
|
|
93
|
-
const recoveredTailAgain = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: truncatedTailSessionId, resume: true });
|
|
94
|
-
const unterminatedValidSessionId = "unterminated-valid-session";
|
|
95
|
-
const unterminatedValidStore = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: unterminatedValidSessionId });
|
|
96
|
-
unterminatedValidStore.recordMessage(createTextMessage("user", "valid record without final newline"));
|
|
97
|
-
const validTranscript = await fs.readFile(unterminatedValidStore.transcriptPath, "utf8");
|
|
98
|
-
await fs.writeFile(unterminatedValidStore.transcriptPath, validTranscript.replace(/\n$/u, ""), "utf8");
|
|
99
|
-
const recoveredValidTail = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: unterminatedValidSessionId, resume: true });
|
|
100
|
-
const repairedValidText = await fs.readFile(unterminatedValidStore.transcriptPath, "utf8");
|
|
101
|
-
const corruptMiddleSessionId = "corrupt-middle-session";
|
|
102
|
-
const corruptMiddleStore = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: corruptMiddleSessionId });
|
|
103
|
-
corruptMiddleStore.recordMessage(createTextMessage("user", "before corrupt middle"));
|
|
104
|
-
corruptMiddleStore.recordMessage(createTextMessage("assistant", "after corrupt middle"));
|
|
105
|
-
const corruptLines = (await fs.readFile(corruptMiddleStore.transcriptPath, "utf8")).trimEnd().split("\n");
|
|
106
|
-
await fs.writeFile(corruptMiddleStore.transcriptPath, `${corruptLines[0]}\n{malformed}\n${corruptLines[1]}\n`, "utf8");
|
|
107
|
-
const corruptMiddleRejected = await SessionStore.open({ agentId: "main", rootDir: root, sessionId: corruptMiddleSessionId, resume: true })
|
|
108
|
-
.then(() => false)
|
|
109
|
-
.catch((error) => error instanceof Error && error.message.includes("Malformed session transcript"));
|
|
110
|
-
const durabilitySessionsDeleted = await Promise.all([
|
|
111
|
-
truncatedTailSessionId,
|
|
112
|
-
unterminatedValidSessionId,
|
|
113
|
-
corruptMiddleSessionId,
|
|
114
|
-
].map((durabilitySessionId) => SessionStore.delete({ rootDir: root, sessionId: durabilitySessionId })));
|
|
115
|
-
const afterReset = await SessionStore.open({ agentId: "main", rootDir: root, sessionId, resume: true });
|
|
116
|
-
afterReset.reset();
|
|
117
|
-
const resetResume = await SessionStore.open({ agentId: "main", rootDir: root, sessionId, resume: true });
|
|
118
|
-
const deleted = await SessionStore.delete({ rootDir: root, sessionId });
|
|
119
|
-
const listedAfterDelete = await SessionStore.list({ agentId: "main", rootDir: root });
|
|
120
|
-
const ok = first.records.length === 1 &&
|
|
121
|
-
persistedBlocks.length === 1 &&
|
|
122
|
-
second.records.length === 0 &&
|
|
123
|
-
JSON.stringify(first.messages) === JSON.stringify(second.messages) &&
|
|
124
|
-
resumed.snapshot().resumedMessages === 3 &&
|
|
125
|
-
resumed.getInitialMessages()[0]?.metadata?.compactPreservedUser === true &&
|
|
126
|
-
resumed.getInitialMessages()[1]?.metadata?.compactBoundary === true &&
|
|
127
|
-
resumed.getInitialMessages().at(-1)?.blocks.some((block) => block.type === "text" && block.text === "assistant after second compact") === true &&
|
|
128
|
-
displayMessages.length === messages.length + 4 &&
|
|
129
|
-
displayMessages.some((message) => message.role === "assistant" && message.blocks.some((block) => block.type === "text" && block.text === "assistant before compact")) &&
|
|
130
|
-
displayMessages.some((message) => message.role === "assistant" && message.blocks.some((block) => block.type === "text" && block.text === "assistant between compacts")) &&
|
|
131
|
-
displayMessages.some((message) => message.role === "assistant" && message.blocks.some((block) => block.type === "text" && block.text === "assistant after second compact")) &&
|
|
132
|
-
displayCompactions.length === 2 &&
|
|
133
|
-
displayCompactions[0]?.report?.summary === "persisted compact summary" &&
|
|
134
|
-
displayCompactions[1]?.report?.summary === "second compact summary" &&
|
|
135
|
-
displayEntries.findIndex((entry) => entry.type === "compact") > displayEntries.findIndex((entry) => entry.type === "message" && entry.message.blocks.some((block) => block.type === "text" && block.text === "assistant before compact")) &&
|
|
136
|
-
displayEntries.findIndex((entry) => entry.type === "message" && entry.message.blocks.some((block) => block.type === "text" && block.text === "assistant between compacts")) > displayEntries.findIndex((entry) => entry.type === "compact") &&
|
|
137
|
-
displayCompactionIndexes.at(-1) < displayEntries.findIndex((entry) => entry.type === "message" && entry.message.blocks.some((block) => block.type === "text" && block.text === "assistant after second compact")) &&
|
|
138
|
-
resumed.snapshot().lastCompaction?.summary === "second compact summary" &&
|
|
139
|
-
resumed.snapshot().lastCompaction?.continuationState === "second compact state" &&
|
|
140
|
-
resumed.snapshot().title === "Refined Smoke Session Title" &&
|
|
141
|
-
resumed.snapshot().titleKind === "refinement" &&
|
|
142
|
-
resumed.snapshot().hasInitialTitle &&
|
|
143
|
-
resumed.snapshot().hasTitleRefinement &&
|
|
144
|
-
resumed.snapshot().fastMode === true &&
|
|
145
|
-
resumed.snapshot().contextWindowTokens === 256000 &&
|
|
146
|
-
resumed.getContextWindowTokens() === 256000 &&
|
|
147
|
-
latest.snapshot().sessionId === sessionId &&
|
|
148
|
-
latest.snapshot().resumedMessages === 3 &&
|
|
149
|
-
latest.snapshot().lastCompaction?.charsFreed === 2345 &&
|
|
150
|
-
latest.snapshot().title === "Refined Smoke Session Title" &&
|
|
151
|
-
latest.snapshot().titleKind === "refinement" &&
|
|
152
|
-
listed.length === 1 &&
|
|
153
|
-
listed[0]?.sessionId === sessionId &&
|
|
154
|
-
listed[0]?.title === "Refined Smoke Session Title" &&
|
|
155
|
-
resumedBudget.records.length === 0 &&
|
|
156
|
-
resumedBudget.messages.every((message) => message.role !== "tool_result") &&
|
|
157
|
-
exportResult.bytes > 0 &&
|
|
158
|
-
exportedMarkdown.includes("# Neo Session Export") &&
|
|
159
|
-
exportedMarkdown.includes("system prompt smoke") &&
|
|
160
|
-
exportedMarkdown.includes("## Transcript") &&
|
|
161
|
-
exportedMarkdown.includes("Tool use ID: call_a") &&
|
|
162
|
-
exportedMarkdown.includes("persisted compact state") &&
|
|
163
|
-
recoveredTailMessagesBeforeAppend.length === 1 &&
|
|
164
|
-
recoveredTailMessagesBeforeAppend[0]?.blocks.some((block) => block.type === "text" && block.text === "durable before partial tail") === true &&
|
|
165
|
-
repairedTailText.endsWith("\n") &&
|
|
166
|
-
repairedTailText.trimEnd().split("\n").length === 1 &&
|
|
167
|
-
recoveredTailAgain.getInitialMessages().length === 2 &&
|
|
168
|
-
recoveredTailAgain.getInitialMessages()[1]?.blocks.some((block) => block.type === "text" && block.text === "durable after partial tail") === true &&
|
|
169
|
-
recoveredValidTail.getInitialMessages().length === 1 &&
|
|
170
|
-
repairedValidText.endsWith("\n") &&
|
|
171
|
-
corruptMiddleRejected &&
|
|
172
|
-
durabilitySessionsDeleted.every(Boolean) &&
|
|
173
|
-
resetResume.snapshot().resumedMessages === 0 &&
|
|
174
|
-
resetResume.snapshot().lastCompaction === undefined &&
|
|
175
|
-
resetResume.snapshot().fastMode === true &&
|
|
176
|
-
resetResume.snapshot().contextWindowTokens === 256000 &&
|
|
177
|
-
deleted &&
|
|
178
|
-
listedAfterDelete.length === 0;
|
|
179
|
-
console.log(JSON.stringify({
|
|
180
|
-
ok,
|
|
181
|
-
firstRecords: first.records.length,
|
|
182
|
-
persistedBlocks: persistedBlocks.length,
|
|
183
|
-
exportResult,
|
|
184
|
-
resumed: resumed.snapshot(),
|
|
185
|
-
latest: latest.snapshot(),
|
|
186
|
-
listed,
|
|
187
|
-
durability: {
|
|
188
|
-
recoveredTailMessagesBeforeAppend: recoveredTailMessagesBeforeAppend.length,
|
|
189
|
-
repairedTailLines: repairedTailText.trimEnd().split("\n").length,
|
|
190
|
-
recoveredTailAgainMessages: recoveredTailAgain.getInitialMessages().length,
|
|
191
|
-
recoveredValidTailMessages: recoveredValidTail.getInitialMessages().length,
|
|
192
|
-
repairedValidEndsWithNewline: repairedValidText.endsWith("\n"),
|
|
193
|
-
corruptMiddleRejected,
|
|
194
|
-
durabilitySessionsDeleted,
|
|
195
|
-
},
|
|
196
|
-
reset: resetResume.snapshot(),
|
|
197
|
-
deleted,
|
|
198
|
-
listedAfterDelete,
|
|
199
|
-
}, null, 2));
|
|
200
|
-
if (!ok)
|
|
201
|
-
process.exitCode = 1;
|
|
202
|
-
}
|
|
203
|
-
function createToolMessages() {
|
|
204
|
-
const createdAt = new Date().toISOString();
|
|
205
|
-
return [
|
|
206
|
-
{
|
|
207
|
-
id: "assistant-tools",
|
|
208
|
-
role: "assistant",
|
|
209
|
-
createdAt,
|
|
210
|
-
blocks: [
|
|
211
|
-
{ type: "tool_use", id: "call_a", name: "alpha", input: {} },
|
|
212
|
-
{ type: "tool_use", id: "call_b", name: "beta", input: {} },
|
|
213
|
-
],
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
id: "result-a",
|
|
217
|
-
role: "tool_result",
|
|
218
|
-
createdAt,
|
|
219
|
-
blocks: [{ type: "tool_result", toolUseId: "call_a", name: "alpha", ok: true, output: "a".repeat(120) }],
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
id: "result-b",
|
|
223
|
-
role: "tool_result",
|
|
224
|
-
createdAt,
|
|
225
|
-
blocks: [{ type: "tool_result", toolUseId: "call_b", name: "beta", ok: true, output: "b".repeat(220) }],
|
|
226
|
-
},
|
|
227
|
-
];
|
|
228
|
-
}
|
|
229
|
-
main().catch((error) => {
|
|
230
|
-
console.error(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
231
|
-
process.exitCode = 1;
|
|
232
|
-
});
|
|
233
|
-
//# sourceMappingURL=smoke-session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smoke-session.js","sourceRoot":"","sources":["../../src/session/smoke-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|