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.
Files changed (206) hide show
  1. package/README.md +43 -585
  2. package/dist/context/prompts.js +2 -1
  3. package/dist/context/prompts.js.map +1 -1
  4. package/dist/core/run-agent.js +2 -0
  5. package/dist/core/run-agent.js.map +1 -1
  6. package/dist/repl/index.js +13 -1
  7. package/dist/repl/index.js.map +1 -1
  8. package/dist/tools/builtins/image-capabilities.d.ts +21 -0
  9. package/dist/tools/builtins/image-capabilities.js +97 -0
  10. package/dist/tools/builtins/image-capabilities.js.map +1 -0
  11. package/dist/tools/builtins/image-generation-tool.d.ts +14 -7
  12. package/dist/tools/builtins/image-generation-tool.js +141 -143
  13. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  14. package/dist/tools/builtins/image-output-verification.d.ts +14 -0
  15. package/dist/tools/builtins/image-output-verification.js +183 -0
  16. package/dist/tools/builtins/image-output-verification.js.map +1 -0
  17. package/dist/tools/registry.d.ts +2 -0
  18. package/dist/tools/registry.js +6 -0
  19. package/dist/tools/registry.js.map +1 -1
  20. package/dist/tools/run-tool-use.js +5 -0
  21. package/dist/tools/run-tool-use.js.map +1 -1
  22. package/dist/web/image-result-metadata.d.ts +20 -0
  23. package/dist/web/image-result-metadata.js +20 -0
  24. package/dist/web/image-result-metadata.js.map +1 -0
  25. package/dist/web/index.d.ts +4 -1
  26. package/dist/web/index.js +20 -5
  27. package/dist/web/index.js.map +1 -1
  28. package/docs/prompt-config.md +1 -1
  29. package/package.json +22 -20
  30. package/dist/agents/agent-report-security.test.d.ts +0 -1
  31. package/dist/agents/agent-report-security.test.js +0 -301
  32. package/dist/agents/agent-report-security.test.js.map +0 -1
  33. package/dist/agents/agent-tool-persistence.test.d.ts +0 -1
  34. package/dist/agents/agent-tool-persistence.test.js +0 -319
  35. package/dist/agents/agent-tool-persistence.test.js.map +0 -1
  36. package/dist/agents/coordination-boundary.test.d.ts +0 -1
  37. package/dist/agents/coordination-boundary.test.js +0 -58
  38. package/dist/agents/coordination-boundary.test.js.map +0 -1
  39. package/dist/agents/live-preview-redaction-security.test.d.ts +0 -1
  40. package/dist/agents/live-preview-redaction-security.test.js +0 -286
  41. package/dist/agents/live-preview-redaction-security.test.js.map +0 -1
  42. package/dist/agents/no-nested-delegation.test.d.ts +0 -1
  43. package/dist/agents/no-nested-delegation.test.js +0 -38
  44. package/dist/agents/no-nested-delegation.test.js.map +0 -1
  45. package/dist/agents/obs07-11-run-facts.test.d.ts +0 -1
  46. package/dist/agents/obs07-11-run-facts.test.js +0 -459
  47. package/dist/agents/obs07-11-run-facts.test.js.map +0 -1
  48. package/dist/agents/smoke-agent-lifecycle.d.ts +0 -1
  49. package/dist/agents/smoke-agent-lifecycle.js +0 -192
  50. package/dist/agents/smoke-agent-lifecycle.js.map +0 -1
  51. package/dist/agents/smoke-agents.d.ts +0 -1
  52. package/dist/agents/smoke-agents.js +0 -362
  53. package/dist/agents/smoke-agents.js.map +0 -1
  54. package/dist/context/prompt-config.test.d.ts +0 -1
  55. package/dist/context/prompt-config.test.js +0 -128
  56. package/dist/context/prompt-config.test.js.map +0 -1
  57. package/dist/context/smoke-context.d.ts +0 -1
  58. package/dist/context/smoke-context.js +0 -502
  59. package/dist/context/smoke-context.js.map +0 -1
  60. package/dist/core/obs04-visible-data.test.d.ts +0 -1
  61. package/dist/core/obs04-visible-data.test.js +0 -147
  62. package/dist/core/obs04-visible-data.test.js.map +0 -1
  63. package/dist/core/query-session-settings.test.d.ts +0 -1
  64. package/dist/core/query-session-settings.test.js +0 -252
  65. package/dist/core/query-session-settings.test.js.map +0 -1
  66. package/dist/core/run-agent-pause.test.d.ts +0 -1
  67. package/dist/core/run-agent-pause.test.js +0 -52
  68. package/dist/core/run-agent-pause.test.js.map +0 -1
  69. package/dist/core/run-agent-persistence.test.d.ts +0 -1
  70. package/dist/core/run-agent-persistence.test.js +0 -222
  71. package/dist/core/run-agent-persistence.test.js.map +0 -1
  72. package/dist/core/session-prompt-inheritance.test.d.ts +0 -1
  73. package/dist/core/session-prompt-inheritance.test.js +0 -132
  74. package/dist/core/session-prompt-inheritance.test.js.map +0 -1
  75. package/dist/core/session-settings-prompt.test.d.ts +0 -1
  76. package/dist/core/session-settings-prompt.test.js +0 -266
  77. package/dist/core/session-settings-prompt.test.js.map +0 -1
  78. package/dist/core/smoke-core-loop.d.ts +0 -1
  79. package/dist/core/smoke-core-loop.js +0 -290
  80. package/dist/core/smoke-core-loop.js.map +0 -1
  81. package/dist/core/smoke-image-integrity.d.ts +0 -1
  82. package/dist/core/smoke-image-integrity.js +0 -67
  83. package/dist/core/smoke-image-integrity.js.map +0 -1
  84. package/dist/execution/docker.test.d.ts +0 -1
  85. package/dist/execution/docker.test.js +0 -57
  86. package/dist/execution/docker.test.js.map +0 -1
  87. package/dist/model/openai-native-image-guard.test.d.ts +0 -1
  88. package/dist/model/openai-native-image-guard.test.js +0 -101
  89. package/dist/model/openai-native-image-guard.test.js.map +0 -1
  90. package/dist/model/openai-responses-instructions.test.d.ts +0 -1
  91. package/dist/model/openai-responses-instructions.test.js +0 -64
  92. package/dist/model/openai-responses-instructions.test.js.map +0 -1
  93. package/dist/model/smoke-openai.d.ts +0 -1
  94. package/dist/model/smoke-openai.js +0 -44
  95. package/dist/model/smoke-openai.js.map +0 -1
  96. package/dist/model/smoke-responses-mapper.d.ts +0 -1
  97. package/dist/model/smoke-responses-mapper.js +0 -156
  98. package/dist/model/smoke-responses-mapper.js.map +0 -1
  99. package/dist/plugins/smoke-plugin-system.d.ts +0 -1
  100. package/dist/plugins/smoke-plugin-system.js +0 -63
  101. package/dist/plugins/smoke-plugin-system.js.map +0 -1
  102. package/dist/repl/smoke-run-command.d.ts +0 -1
  103. package/dist/repl/smoke-run-command.js +0 -43
  104. package/dist/repl/smoke-run-command.js.map +0 -1
  105. package/dist/secrets/smoke-secrets.d.ts +0 -1
  106. package/dist/secrets/smoke-secrets.js +0 -73
  107. package/dist/secrets/smoke-secrets.js.map +0 -1
  108. package/dist/session/session-store-safety.test.d.ts +0 -1
  109. package/dist/session/session-store-safety.test.js +0 -107
  110. package/dist/session/session-store-safety.test.js.map +0 -1
  111. package/dist/session/smoke-session.d.ts +0 -1
  112. package/dist/session/smoke-session.js +0 -233
  113. package/dist/session/smoke-session.js.map +0 -1
  114. package/dist/skills/smoke-skills.d.ts +0 -1
  115. package/dist/skills/smoke-skills.js +0 -109
  116. package/dist/skills/smoke-skills.js.map +0 -1
  117. package/dist/tasks/subagent-tools.test.d.ts +0 -1
  118. package/dist/tasks/subagent-tools.test.js +0 -159
  119. package/dist/tasks/subagent-tools.test.js.map +0 -1
  120. package/dist/tasks/task-ack-size.test.d.ts +0 -1
  121. package/dist/tasks/task-ack-size.test.js +0 -101
  122. package/dist/tasks/task-ack-size.test.js.map +0 -1
  123. package/dist/tasks/task-persistence.test.d.ts +0 -1
  124. package/dist/tasks/task-persistence.test.js +0 -331
  125. package/dist/tasks/task-persistence.test.js.map +0 -1
  126. package/dist/tools/smoke-exec-process.d.ts +0 -1
  127. package/dist/tools/smoke-exec-process.js +0 -127
  128. package/dist/tools/smoke-exec-process.js.map +0 -1
  129. package/dist/tools/smoke-terminal-output-chain.d.ts +0 -1
  130. package/dist/tools/smoke-terminal-output-chain.js +0 -245
  131. package/dist/tools/smoke-terminal-output-chain.js.map +0 -1
  132. package/dist/tools/smoke-tool-system.d.ts +0 -1
  133. package/dist/tools/smoke-tool-system.js +0 -412
  134. package/dist/tools/smoke-tool-system.js.map +0 -1
  135. package/dist/tools/terminal-background-history.test.d.ts +0 -1
  136. package/dist/tools/terminal-background-history.test.js +0 -77
  137. package/dist/tools/terminal-background-history.test.js.map +0 -1
  138. package/dist/tools/terminal-output-persistence.test.d.ts +0 -1
  139. package/dist/tools/terminal-output-persistence.test.js +0 -50
  140. package/dist/tools/terminal-output-persistence.test.js.map +0 -1
  141. package/dist/tools/terminal-output-store.test.d.ts +0 -1
  142. package/dist/tools/terminal-output-store.test.js +0 -364
  143. package/dist/tools/terminal-output-store.test.js.map +0 -1
  144. package/dist/web/agent-content-detail.test.d.ts +0 -1
  145. package/dist/web/agent-content-detail.test.js +0 -307
  146. package/dist/web/agent-content-detail.test.js.map +0 -1
  147. package/dist/web/agent-parent-messages.test.d.ts +0 -1
  148. package/dist/web/agent-parent-messages.test.js +0 -58
  149. package/dist/web/agent-parent-messages.test.js.map +0 -1
  150. package/dist/web/agent-tool-payload-security.test.d.ts +0 -1
  151. package/dist/web/agent-tool-payload-security.test.js +0 -120
  152. package/dist/web/agent-tool-payload-security.test.js.map +0 -1
  153. package/dist/web/prompt-config-protocol.test.d.ts +0 -1
  154. package/dist/web/prompt-config-protocol.test.js +0 -78
  155. package/dist/web/prompt-config-protocol.test.js.map +0 -1
  156. package/dist/web/session-prompt-integration.test.d.ts +0 -1
  157. package/dist/web/session-prompt-integration.test.js +0 -57
  158. package/dist/web/session-prompt-integration.test.js.map +0 -1
  159. package/dist/web/session-settings.test.d.ts +0 -1
  160. package/dist/web/session-settings.test.js +0 -254
  161. package/dist/web/session-settings.test.js.map +0 -1
  162. package/dist/web/smoke-agent-content-http.d.ts +0 -1
  163. package/dist/web/smoke-agent-content-http.js +0 -446
  164. package/dist/web/smoke-agent-content-http.js.map +0 -1
  165. package/dist/web/smoke-plan-payload.d.ts +0 -1
  166. package/dist/web/smoke-plan-payload.js +0 -30
  167. package/dist/web/smoke-plan-payload.js.map +0 -1
  168. package/dist/web/smoke-runtime-context-protocol.d.ts +0 -1
  169. package/dist/web/smoke-runtime-context-protocol.js +0 -42
  170. package/dist/web/smoke-runtime-context-protocol.js.map +0 -1
  171. package/dist/web/smoke-status-semantics.d.ts +0 -1
  172. package/dist/web/smoke-status-semantics.js +0 -90
  173. package/dist/web/smoke-status-semantics.js.map +0 -1
  174. package/dist/web/smoke-task-session-entrypoints.d.ts +0 -1
  175. package/dist/web/smoke-task-session-entrypoints.js +0 -96
  176. package/dist/web/smoke-task-session-entrypoints.js.map +0 -1
  177. package/dist/web/smoke-terminal-output-http.d.ts +0 -1
  178. package/dist/web/smoke-terminal-output-http.js +0 -377
  179. package/dist/web/smoke-terminal-output-http.js.map +0 -1
  180. package/dist/web/smoke-tool-call-detail.d.ts +0 -1
  181. package/dist/web/smoke-tool-call-detail.js +0 -106
  182. package/dist/web/smoke-tool-call-detail.js.map +0 -1
  183. package/dist/web/smoke-tool-call-http.d.ts +0 -1
  184. package/dist/web/smoke-tool-call-http.js +0 -100
  185. package/dist/web/smoke-tool-call-http.js.map +0 -1
  186. package/dist/web/smoke-tool-detail-fields-http.d.ts +0 -1
  187. package/dist/web/smoke-tool-detail-fields-http.js +0 -121
  188. package/dist/web/smoke-tool-detail-fields-http.js.map +0 -1
  189. package/dist/web/smoke-web-agent-tasks.d.ts +0 -1
  190. package/dist/web/smoke-web-agent-tasks.js +0 -50
  191. package/dist/web/smoke-web-agent-tasks.js.map +0 -1
  192. package/dist/web/smoke-web-history.d.ts +0 -1
  193. package/dist/web/smoke-web-history.js +0 -183
  194. package/dist/web/smoke-web-history.js.map +0 -1
  195. package/dist/web/smoke-web-queue.d.ts +0 -1
  196. package/dist/web/smoke-web-queue.js +0 -7
  197. package/dist/web/smoke-web-queue.js.map +0 -1
  198. package/dist/web/smoke-web-terminal-tasks.d.ts +0 -1
  199. package/dist/web/smoke-web-terminal-tasks.js +0 -238
  200. package/dist/web/smoke-web-terminal-tasks.js.map +0 -1
  201. package/dist/web/terminal-presentation.test.d.ts +0 -1
  202. package/dist/web/terminal-presentation.test.js +0 -33
  203. package/dist/web/terminal-presentation.test.js.map +0 -1
  204. package/dist/web/tool-detail-fields.test.d.ts +0 -1
  205. package/dist/web/tool-detail-fields.test.js +0 -121
  206. 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":"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"}
@@ -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 {};