neoctl 0.2.36 → 0.2.37

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 (149) hide show
  1. package/dist/agents/agent-report-security.test.d.ts +1 -0
  2. package/dist/agents/agent-report-security.test.js +301 -0
  3. package/dist/agents/agent-report-security.test.js.map +1 -0
  4. package/dist/agents/agent-tool-persistence.test.js +9 -3
  5. package/dist/agents/agent-tool-persistence.test.js.map +1 -1
  6. package/dist/agents/agent-tool.d.ts +3 -0
  7. package/dist/agents/agent-tool.js +127 -34
  8. package/dist/agents/agent-tool.js.map +1 -1
  9. package/dist/agents/live-preview-redaction-security.test.d.ts +1 -0
  10. package/dist/agents/live-preview-redaction-security.test.js +286 -0
  11. package/dist/agents/live-preview-redaction-security.test.js.map +1 -0
  12. package/dist/agents/local-agent-task.d.ts +27 -1
  13. package/dist/agents/local-agent-task.js +75 -5
  14. package/dist/agents/local-agent-task.js.map +1 -1
  15. package/dist/agents/obs07-11-run-facts.test.d.ts +1 -0
  16. package/dist/agents/obs07-11-run-facts.test.js +459 -0
  17. package/dist/agents/obs07-11-run-facts.test.js.map +1 -0
  18. package/dist/agents/smoke-agent-lifecycle.js +8 -4
  19. package/dist/agents/smoke-agent-lifecycle.js.map +1 -1
  20. package/dist/agents/smoke-agents.js +7 -3
  21. package/dist/agents/smoke-agents.js.map +1 -1
  22. package/dist/context/context-manager.d.ts +1 -0
  23. package/dist/context/context-manager.js +10 -6
  24. package/dist/context/context-manager.js.map +1 -1
  25. package/dist/context/smoke-context.js +46 -3
  26. package/dist/context/smoke-context.js.map +1 -1
  27. package/dist/core/image-registry.js +1 -1
  28. package/dist/core/image-registry.js.map +1 -1
  29. package/dist/core/obs04-visible-data.test.d.ts +1 -0
  30. package/dist/core/obs04-visible-data.test.js +147 -0
  31. package/dist/core/obs04-visible-data.test.js.map +1 -0
  32. package/dist/core/query-engine.d.ts +5 -0
  33. package/dist/core/query-engine.js +35 -2
  34. package/dist/core/query-engine.js.map +1 -1
  35. package/dist/core/query.d.ts +2 -0
  36. package/dist/core/query.js +104 -15
  37. package/dist/core/query.js.map +1 -1
  38. package/dist/core/run-agent.d.ts +2 -0
  39. package/dist/core/run-agent.js +20 -10
  40. package/dist/core/run-agent.js.map +1 -1
  41. package/dist/model/model-gateway.d.ts +1 -0
  42. package/dist/model/model-metadata.json +99 -99
  43. package/dist/model/openai-native-image-guard.test.d.ts +1 -0
  44. package/dist/model/openai-native-image-guard.test.js +101 -0
  45. package/dist/model/openai-native-image-guard.test.js.map +1 -0
  46. package/dist/model/openai-responses-mapper.js +91 -16
  47. package/dist/model/openai-responses-mapper.js.map +1 -1
  48. package/dist/plugins/smoke-plugin-system.js +14 -14
  49. package/dist/repl/index.js +2 -2
  50. package/dist/repl/index.js.map +1 -1
  51. package/dist/secrets/secret-redaction.d.ts +6 -5
  52. package/dist/secrets/secret-redaction.js +7 -79
  53. package/dist/secrets/secret-redaction.js.map +1 -1
  54. package/dist/secrets/secret-types.d.ts +4 -1
  55. package/dist/secrets/secret-types.js.map +1 -1
  56. package/dist/session/session-store.d.ts +4 -1
  57. package/dist/session/session-store.js +5 -2
  58. package/dist/session/session-store.js.map +1 -1
  59. package/dist/tasks/subagent-tools.test.js +1 -0
  60. package/dist/tasks/subagent-tools.test.js.map +1 -1
  61. package/dist/tasks/task-ack-size.test.js +6 -5
  62. package/dist/tasks/task-ack-size.test.js.map +1 -1
  63. package/dist/tasks/task-persistence.d.ts +1 -0
  64. package/dist/tasks/task-persistence.js +31 -9
  65. package/dist/tasks/task-persistence.js.map +1 -1
  66. package/dist/tasks/task-store.d.ts +6 -4
  67. package/dist/tasks/task-store.js +46 -20
  68. package/dist/tasks/task-store.js.map +1 -1
  69. package/dist/tools/builtins/exec-process-manager.d.ts +97 -2
  70. package/dist/tools/builtins/exec-process-manager.js +218 -19
  71. package/dist/tools/builtins/exec-process-manager.js.map +1 -1
  72. package/dist/tools/builtins/exec-tool.js +14 -1
  73. package/dist/tools/builtins/exec-tool.js.map +1 -1
  74. package/dist/tools/builtins/image-generation-tool.js +24 -24
  75. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  76. package/dist/tools/smoke-exec-process.js +2 -1
  77. package/dist/tools/smoke-exec-process.js.map +1 -1
  78. package/dist/tools/smoke-terminal-output-chain.d.ts +1 -0
  79. package/dist/tools/smoke-terminal-output-chain.js +245 -0
  80. package/dist/tools/smoke-terminal-output-chain.js.map +1 -0
  81. package/dist/tools/smoke-tool-system.js +6 -6
  82. package/dist/tools/smoke-tool-system.js.map +1 -1
  83. package/dist/tools/terminal-output-persistence.test.d.ts +1 -0
  84. package/dist/tools/terminal-output-persistence.test.js +50 -0
  85. package/dist/tools/terminal-output-persistence.test.js.map +1 -0
  86. package/dist/tools/terminal-output-store.d.ts +150 -0
  87. package/dist/tools/terminal-output-store.js +562 -0
  88. package/dist/tools/terminal-output-store.js.map +1 -0
  89. package/dist/tools/terminal-output-store.test.d.ts +1 -0
  90. package/dist/tools/terminal-output-store.test.js +364 -0
  91. package/dist/tools/terminal-output-store.test.js.map +1 -0
  92. package/dist/types/events.d.ts +1 -0
  93. package/dist/types/messages.d.ts +1 -0
  94. package/dist/web/agent-content-detail.d.ts +78 -0
  95. package/dist/web/agent-content-detail.js +495 -0
  96. package/dist/web/agent-content-detail.js.map +1 -0
  97. package/dist/web/agent-content-detail.test.d.ts +1 -0
  98. package/dist/web/agent-content-detail.test.js +307 -0
  99. package/dist/web/agent-content-detail.test.js.map +1 -0
  100. package/dist/web/agent-parent-messages.test.d.ts +1 -0
  101. package/dist/web/agent-parent-messages.test.js +58 -0
  102. package/dist/web/agent-parent-messages.test.js.map +1 -0
  103. package/dist/web/agent-tool-payload-security.test.d.ts +1 -0
  104. package/dist/web/agent-tool-payload-security.test.js +120 -0
  105. package/dist/web/agent-tool-payload-security.test.js.map +1 -0
  106. package/dist/web/index.d.ts +114 -3
  107. package/dist/web/index.js +182 -67
  108. package/dist/web/index.js.map +1 -1
  109. package/dist/web/smoke-agent-content-http.d.ts +1 -0
  110. package/dist/web/smoke-agent-content-http.js +446 -0
  111. package/dist/web/smoke-agent-content-http.js.map +1 -0
  112. package/dist/web/smoke-status-semantics.d.ts +1 -0
  113. package/dist/web/smoke-status-semantics.js +90 -0
  114. package/dist/web/smoke-status-semantics.js.map +1 -0
  115. package/dist/web/smoke-task-session-entrypoints.js +22 -1
  116. package/dist/web/smoke-task-session-entrypoints.js.map +1 -1
  117. package/dist/web/smoke-terminal-output-http.d.ts +1 -0
  118. package/dist/web/smoke-terminal-output-http.js +372 -0
  119. package/dist/web/smoke-terminal-output-http.js.map +1 -0
  120. package/dist/web/smoke-tool-call-detail.d.ts +1 -0
  121. package/dist/web/smoke-tool-call-detail.js +106 -0
  122. package/dist/web/smoke-tool-call-detail.js.map +1 -0
  123. package/dist/web/smoke-tool-call-http.d.ts +1 -0
  124. package/dist/web/smoke-tool-call-http.js +100 -0
  125. package/dist/web/smoke-tool-call-http.js.map +1 -0
  126. package/dist/web/smoke-tool-detail-fields-http.d.ts +1 -0
  127. package/dist/web/smoke-tool-detail-fields-http.js +121 -0
  128. package/dist/web/smoke-tool-detail-fields-http.js.map +1 -0
  129. package/dist/web/smoke-web-terminal-tasks.js +126 -76
  130. package/dist/web/smoke-web-terminal-tasks.js.map +1 -1
  131. package/dist/web/status-semantics.d.ts +11 -0
  132. package/dist/web/status-semantics.js +59 -0
  133. package/dist/web/status-semantics.js.map +1 -0
  134. package/dist/web/terminal-presentation.d.ts +15 -0
  135. package/dist/web/terminal-presentation.js +61 -0
  136. package/dist/web/terminal-presentation.js.map +1 -0
  137. package/dist/web/terminal-presentation.test.d.ts +1 -0
  138. package/dist/web/terminal-presentation.test.js +33 -0
  139. package/dist/web/terminal-presentation.test.js.map +1 -0
  140. package/dist/web/tool-call-detail.d.ts +40 -0
  141. package/dist/web/tool-call-detail.js +167 -0
  142. package/dist/web/tool-call-detail.js.map +1 -0
  143. package/dist/web/tool-detail-fields.d.ts +59 -0
  144. package/dist/web/tool-detail-fields.js +119 -0
  145. package/dist/web/tool-detail-fields.js.map +1 -0
  146. package/dist/web/tool-detail-fields.test.d.ts +1 -0
  147. package/dist/web/tool-detail-fields.test.js +121 -0
  148. package/dist/web/tool-detail-fields.test.js.map +1 -0
  149. package/package.json +93 -93
@@ -0,0 +1,286 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import test from "node:test";
6
+ import { createLocalAgentTask, updateProgressFromEvent, updateProgressFromMessage } from "./local-agent-task.js";
7
+ import { createTextMessage } from "../types/messages.js";
8
+ import { InMemorySecretRedactionRegistry } from "../secrets/secret-redaction.js";
9
+ import { TaskStore } from "../tasks/task-store.js";
10
+ const SECRET = "SYNTHETIC_CREDENTIAL_0123456789";
11
+ const MARKER = "[secret:fixture]";
12
+ function registry() {
13
+ const value = new InMemorySecretRedactionRegistry();
14
+ value.record("fixture", SECRET);
15
+ return value;
16
+ }
17
+ function task(id = "preview-security") {
18
+ const value = createLocalAgentTask({ taskId: id, agentId: id, description: "synthetic fixture", prompt: "fixture only" });
19
+ value.status = "running";
20
+ return value;
21
+ }
22
+ const update = updateProgressFromEvent;
23
+ function delta(value, text, redactions, generation = value.runGeneration) {
24
+ update(value, { type: "assistant.delta", displayChannel: "visible", text }, generation, redactions);
25
+ }
26
+ test("SEC preview redacts synthetic secret before the 4000-character tail cut", () => {
27
+ const value = task();
28
+ const redactions = registry();
29
+ delta(value, SECRET + "x".repeat(3990), redactions);
30
+ assert.equal(value.progress.visibleText?.text, (MARKER + "x".repeat(3990)).slice(-4000));
31
+ assert.equal(value.progress.visibleText?.truncated, true);
32
+ assert.ok(!redactions.redact(value.progress.visibleText?.text ?? "").startsWith("0123456789"));
33
+ });
34
+ test("SEC each character delta withholds every incomplete secret prefix, including legacy preview", () => {
35
+ const value = task();
36
+ const redactions = registry();
37
+ for (let index = 0; index < SECRET.length; index++) {
38
+ delta(value, SECRET[index], redactions);
39
+ const expected = index === SECRET.length - 1 ? MARKER : "";
40
+ assert.equal(value.progress.visibleText?.text ?? "", expected, `visible at character ${index}`);
41
+ assert.equal(value.progress.lastText ?? "", expected, `legacy at character ${index}`);
42
+ }
43
+ });
44
+ test("SEC live task JSON never persists unpublished carry or raw preview", () => {
45
+ const root = mkdtempSync(join(tmpdir(), "neo-preview-security-"));
46
+ const store = new TaskStore();
47
+ try {
48
+ store.bindSession(root);
49
+ const value = task();
50
+ const redactions = registry();
51
+ store.upsert(value);
52
+ delta(value, SECRET.slice(0, -1), redactions);
53
+ store.upsert(value);
54
+ const file = join(root, "subagents", value.agentId, "task.json");
55
+ assert.ok(!readFileSync(file, "utf8").includes(SECRET.slice(0, -1)));
56
+ assert.ok(!JSON.stringify(value).includes(SECRET.slice(0, -1)));
57
+ delta(value, SECRET.slice(-1), redactions);
58
+ store.upsert(value);
59
+ assert.ok(!readFileSync(file, "utf8").includes(SECRET));
60
+ assert.equal(JSON.parse(readFileSync(file, "utf8")).progress.visibleText.text, MARKER);
61
+ }
62
+ finally {
63
+ store.flush();
64
+ rmSync(root, { recursive: true, force: true });
65
+ }
66
+ });
67
+ test("SEC streaming registry refreshes newly registered secrets and never flushes an unresolved prefix", () => {
68
+ const redactions = new InMemorySecretRedactionRegistry();
69
+ const stream = redactions.createStreamingRedactor({ incompleteSecret: "redact" });
70
+ assert.equal(stream.push("plain "), "plain ");
71
+ redactions.record("fixture", SECRET);
72
+ assert.equal(stream.push(SECRET.slice(0, -1)), "");
73
+ assert.equal(stream.flush(), "[secret:incomplete]");
74
+ });
75
+ test("SEC default terminal flush preserves ordinary tails, whitespace and legacy partial-prefix semantics", () => {
76
+ for (const text of ["ordinary tail", " \n\t", "", "0", "prefix SYN", SECRET, `a ${SECRET} z \n`]) {
77
+ const redactions = registry();
78
+ const stream = redactions.createStreamingRedactor();
79
+ const output = [...text].map(char => stream.push(char)).join("") + stream.flush();
80
+ assert.equal(output, redactions.redact(text));
81
+ assert.equal(stream.flush(), "");
82
+ }
83
+ });
84
+ test("SEC resumed generation discards carry, rejects stale deltas and persists safe archive", () => {
85
+ const root = mkdtempSync(join(tmpdir(), "neo-preview-generations-"));
86
+ const store = new TaskStore();
87
+ try {
88
+ store.bindSession(root);
89
+ const value = task();
90
+ const redactions = registry();
91
+ store.upsert(value);
92
+ const prefix = SECRET.slice(0, 20);
93
+ delta(value, "public " + prefix, redactions);
94
+ store.fail(value.id, "fixture stop", undefined, 1);
95
+ store.prepareResume(value.id, new AbortController());
96
+ store.markRunning(value.id, 2);
97
+ const before = JSON.stringify(value.progress);
98
+ delta(value, SECRET.slice(20), redactions, 1);
99
+ assert.equal(JSON.stringify(value.progress), before);
100
+ delta(value, "new generation", redactions, 2);
101
+ assert.equal(value.progress.visibleText?.text, "new generation");
102
+ assert.equal(value.progress.lastText, "new generation");
103
+ assert.equal(value.runHistory?.[0].progress.visibleText?.text, "public ");
104
+ store.upsert(value);
105
+ const raw = readFileSync(join(root, "subagents", value.agentId, "task.json"), "utf8");
106
+ assert.ok(!raw.includes(prefix));
107
+ const restored = new TaskStore();
108
+ restored.bindSession(root);
109
+ assert.equal(restored.get(value.id)?.runHistory?.[0].progress.visibleText?.text, "public ");
110
+ }
111
+ finally {
112
+ store.flush();
113
+ rmSync(root, { recursive: true, force: true });
114
+ }
115
+ });
116
+ test("SEC distinct task objects including reused ids do not share private carry", () => {
117
+ const redactions = registry();
118
+ const first = task("same-id");
119
+ const second = task("same-id");
120
+ const third = task("different-id");
121
+ delta(first, SECRET.slice(0, 20), redactions);
122
+ delta(second, "plain second", redactions);
123
+ delta(third, "plain third", redactions);
124
+ assert.equal(first.progress.visibleText?.text, "");
125
+ assert.equal(second.progress.visibleText?.text, "plain second");
126
+ assert.equal(third.progress.visibleText?.text, "plain third");
127
+ delta(first, SECRET.slice(20), redactions);
128
+ assert.equal(first.progress.visibleText?.text, MARKER);
129
+ });
130
+ test("SEC terminal events and terminal task statuses never flush carry or accept trailing deltas", () => {
131
+ for (const status of ["completed", "failed", "killed"]) {
132
+ const value = task();
133
+ const redactions = registry();
134
+ delta(value, "public " + SECRET.slice(0, 20), redactions);
135
+ value.status = status;
136
+ delta(value, SECRET.slice(20), redactions);
137
+ assert.equal(value.progress.visibleText?.text, "public ");
138
+ assert.equal(value.progress.lastText, "public ");
139
+ }
140
+ const value = task();
141
+ const redactions = registry();
142
+ delta(value, SECRET.slice(0, 20), redactions);
143
+ update(value, { type: "terminal", reason: "completed" }, 1, redactions);
144
+ delta(value, SECRET.slice(20), redactions);
145
+ assert.equal(value.progress.visibleText?.text, "");
146
+ assert.equal(value.progress.lastText ?? "", "");
147
+ });
148
+ test("SEC unmarked/missing-generation deltas cannot contaminate visible carry", () => {
149
+ const value = task();
150
+ const redactions = registry();
151
+ delta(value, SECRET.slice(0, 20), redactions);
152
+ update(value, { type: "assistant.delta", text: "hidden content" }, 1, redactions);
153
+ update(value, { type: "assistant.delta", displayChannel: "visible", text: "unowned content" }, undefined, redactions);
154
+ delta(value, SECRET.slice(20), redactions);
155
+ assert.equal(value.progress.visibleText?.text, MARKER);
156
+ });
157
+ test("SEC no registry and empty registry retain 0, empty, whitespace and sticky 4000 boundary", () => {
158
+ for (const redactions of [undefined, new InMemorySecretRedactionRegistry(), registry()]) {
159
+ const value = task();
160
+ delta(value, "", redactions);
161
+ assert.deepEqual(value.progress.visibleText, { channel: "visible", runGeneration: 1, text: "", truncated: false, redactionVersion: 1 });
162
+ delta(value, "0", redactions);
163
+ delta(value, " \n\t", redactions);
164
+ assert.equal(value.progress.visibleText?.text, "0 \n\t");
165
+ delta(value, "x".repeat(3996), redactions);
166
+ assert.equal(value.progress.visibleText?.text.length, 4000);
167
+ assert.equal(value.progress.visibleText?.truncated, false);
168
+ delta(value, "", redactions);
169
+ assert.equal(value.progress.visibleText?.truncated, false);
170
+ delta(value, " ", redactions);
171
+ assert.equal(value.progress.visibleText?.truncated, true);
172
+ delta(value, "", redactions);
173
+ assert.equal(value.progress.visibleText?.truncated, true);
174
+ assert.equal(value.progress.visibleText?.text.length, 4000);
175
+ }
176
+ });
177
+ test("SEC clipping counts published redacted characters, not withheld/raw bytes", () => {
178
+ const value = task();
179
+ const redactions = registry();
180
+ delta(value, "x".repeat(4000 - MARKER.length), redactions);
181
+ delta(value, SECRET.slice(0, -1), redactions);
182
+ assert.equal(value.progress.visibleText?.truncated, false);
183
+ delta(value, SECRET.slice(-1), redactions);
184
+ assert.equal(value.progress.visibleText?.text.length, 4000);
185
+ assert.equal(value.progress.visibleText?.truncated, false);
186
+ delta(value, "x", redactions);
187
+ assert.equal(value.progress.visibleText?.truncated, true);
188
+ });
189
+ test("SEC registry changes are live and omitted arguments never downgrade protection", () => {
190
+ const value = task();
191
+ const redactions = new InMemorySecretRedactionRegistry();
192
+ delta(value, "public ", redactions);
193
+ redactions.record("fixture", SECRET);
194
+ for (const char of SECRET)
195
+ delta(value, char, redactions);
196
+ assert.equal(value.progress.visibleText?.text, "public " + MARKER);
197
+ for (const char of SECRET)
198
+ delta(value, char);
199
+ assert.equal(value.progress.visibleText?.text, "public " + MARKER + MARKER);
200
+ });
201
+ test("SEC registry refresh handles longer new secret matching already-private carry", () => {
202
+ const redactions = new InMemorySecretRedactionRegistry();
203
+ redactions.record("short", "ABC");
204
+ const stream = redactions.createStreamingRedactor({ incompleteSecret: "redact" });
205
+ assert.equal(stream.push("AB"), "");
206
+ redactions.record("long", "ABCDE");
207
+ assert.equal(stream.push("C"), "");
208
+ assert.equal(stream.push("DE"), "[secret:long]");
209
+ assert.equal(stream.flush(), "");
210
+ });
211
+ test("SEC every split and character of overlapping/Bearer/trimmed credentials is protected", () => {
212
+ const redactions = registry();
213
+ redactions.record("long", SECRET + "_LONG");
214
+ redactions.record("padded", " PADDED_SYNTHETIC ");
215
+ for (const secret of [SECRET, SECRET + "_LONG", "Bearer " + SECRET, " PADDED_SYNTHETIC ", "PADDED_SYNTHETIC"]) {
216
+ for (let split = 1; split < secret.length; split++) {
217
+ const stream = redactions.createStreamingRedactor({ incompleteSecret: "redact" });
218
+ assert.equal(stream.push(secret.slice(0, split)), "", `split ${split}`);
219
+ const result = stream.push(secret.slice(split) + "!") + stream.flush();
220
+ assert.ok(result.includes("[secret:"));
221
+ assert.ok(!result.includes(secret));
222
+ assert.ok(result.endsWith("!"));
223
+ }
224
+ }
225
+ });
226
+ test("SEC whole-value-only registries fail closed for live previews", () => {
227
+ const base = registry();
228
+ const redactions = { record: base.record.bind(base), redact: base.redact.bind(base) };
229
+ const value = task();
230
+ delta(value, SECRET + " normal", redactions);
231
+ assert.equal(value.progress.visibleText?.text, "");
232
+ assert.equal(value.progress.lastText ?? "", "");
233
+ });
234
+ test("SEC restored unproven tails are discarded instead of being used as safe stream seeds", () => {
235
+ const value = task();
236
+ const redactions = registry();
237
+ value.progress.visibleText = { channel: "visible", runGeneration: 1, text: "0123456789" + "x".repeat(3990), truncated: true };
238
+ value.progress.lastText = "0123456789";
239
+ delta(value, "safe new event", redactions);
240
+ assert.equal(value.progress.visibleText?.text, "safe new event");
241
+ assert.equal(value.progress.lastText, "safe new event");
242
+ assert.equal(value.progress.visibleText?.truncated, false);
243
+ });
244
+ test("SEC restored terminal and archived legacy previews are rejected without any new event", () => {
245
+ const root = mkdtempSync(join(tmpdir(), "neo-preview-legacy-"));
246
+ const store = new TaskStore();
247
+ try {
248
+ store.bindSession(root);
249
+ const value = task();
250
+ store.upsert(value);
251
+ const file = join(root, "subagents", value.agentId, "task.json");
252
+ const raw = JSON.parse(readFileSync(file, "utf8"));
253
+ raw.status = "completed";
254
+ raw.runGeneration = 2;
255
+ const legacy = { channel: "visible", runGeneration: 2, text: "0123456789" + "x".repeat(3990), truncated: true };
256
+ raw.progress.visibleText = legacy;
257
+ raw.runHistory = [{ runGeneration: 1, status: "failed", archivedAt: new Date().toISOString(),
258
+ progress: { totalEvents: 1, totalToolUseCount: 0, visibleText: { ...legacy, runGeneration: 1 } } }];
259
+ writeFileSync(file, JSON.stringify(raw));
260
+ const restored = new TaskStore();
261
+ assert.deepEqual(restored.bindSession(root).errors, []);
262
+ const recovered = restored.get(value.id);
263
+ assert.equal(recovered.progress.visibleText, undefined);
264
+ assert.equal(recovered.runHistory?.[0].progress.visibleText, undefined);
265
+ assert.ok(!readFileSync(file, "utf8").includes("0123456789"));
266
+ // Serialization also rejects an unmarked in-memory legacy preview, not just load.
267
+ recovered.progress.visibleText = legacy;
268
+ restored.upsert(recovered);
269
+ assert.equal(JSON.parse(readFileSync(file, "utf8")).progress.visibleText, undefined);
270
+ }
271
+ finally {
272
+ store.flush();
273
+ rmSync(root, { recursive: true, force: true });
274
+ }
275
+ });
276
+ test("SEC final messages cannot overwrite the protected legacy preview with credential fragments", () => {
277
+ const value = task();
278
+ const redactions = registry();
279
+ delta(value, "public", redactions);
280
+ updateProgressFromMessage(value, createTextMessage("assistant", SECRET + "x".repeat(990)));
281
+ assert.equal(value.progress.lastText, (MARKER + "x".repeat(990)).slice(-1000));
282
+ updateProgressFromMessage(value, createTextMessage("assistant", SECRET.slice(0, -1)));
283
+ assert.equal(value.progress.lastText, "");
284
+ assert.equal(value.progress.visibleText?.text, "public");
285
+ });
286
+ //# sourceMappingURL=live-preview-redaction-security.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-preview-redaction-security.test.js","sourceRoot":"","sources":["../../src/agents/live-preview-redaction-security.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { AgentEvent } from "../types/events.js";
2
2
  import type { Message } from "../types/messages.js";
3
+ import type { SecretRedactionRegistry } from "../secrets/secret-types.js";
3
4
  export type LocalAgentTaskStatus = "pending" | "running" | "completed" | "failed" | "killed";
4
5
  export type LocalAgentTaskType = "agent" | "exec" | "image";
5
6
  export interface AgentProgressStep {
@@ -14,6 +15,14 @@ export interface AgentProgressSnapshot {
14
15
  totalToolUseCount: number;
15
16
  lastActivity?: string;
16
17
  lastText?: string;
18
+ /** Bounded live delta preview only; transcript is authoritative for full text. */
19
+ visibleText?: {
20
+ channel: "visible";
21
+ runGeneration: number;
22
+ text: string;
23
+ truncated: boolean;
24
+ redactionVersion?: 1;
25
+ };
17
26
  currentAction?: string;
18
27
  steps?: AgentProgressStep[];
19
28
  }
@@ -32,6 +41,10 @@ export interface AgentRunArchive {
32
41
  result?: AgentToolResult;
33
42
  error?: string;
34
43
  progress: AgentProgressSnapshot;
44
+ /** Actual start of this generation (UTC ISO), never task creation time. */
45
+ startedAt?: string;
46
+ /** Frozen terminal elapsed milliseconds; absent when timestamps are unknown/invalid. */
47
+ durationMs?: number;
35
48
  completedAt?: string;
36
49
  archivedAt: string;
37
50
  }
@@ -79,12 +92,18 @@ export interface LocalAgentTask {
79
92
  runHistory?: AgentRunArchive[];
80
93
  createdAt: string;
81
94
  updatedAt: string;
95
+ /** Actual start of this generation (UTC ISO), never task creation time. */
96
+ startedAt?: string;
97
+ /** Frozen terminal elapsed milliseconds; absent when timestamps are unknown/invalid. */
98
+ durationMs?: number;
82
99
  completedAt?: string;
83
100
  }
84
101
  export interface AgentToolResult {
85
102
  agent_id: string;
86
103
  agent_type: string;
87
104
  content: string;
105
+ /** Explicit report/visible-text provenance; absent on legacy unproven results. */
106
+ displaySource?: "agent_report" | "visible_text";
88
107
  status?: "completed" | "incomplete";
89
108
  total_duration_ms: number;
90
109
  total_tokens?: number;
@@ -103,6 +122,13 @@ export declare function createLocalAgentTask(input: {
103
122
  retain?: boolean;
104
123
  }): LocalAgentTask;
105
124
  export declare function updateProgressFromMessage(task: LocalAgentTask, message: Message): void;
106
- export declare function updateProgressFromEvent(task: LocalAgentTask, event: AgentEvent): void;
125
+ export declare function updateProgressFromEvent(task: LocalAgentTask, event: AgentEvent, runGeneration?: number, secretRedactions?: SecretRedactionRegistry): void;
107
126
  export declare function writeLocalAgentTaskOutput(task: LocalAgentTask): void;
108
127
  export declare function renderLocalAgentTaskOutput(task: LocalAgentTask): string;
128
+ /** Running clocks are derived from the persisted start; terminal clocks never tick. */
129
+ export declare function agentRunDurationMs(run: {
130
+ status: LocalAgentTaskStatus;
131
+ startedAt?: string;
132
+ completedAt?: string;
133
+ durationMs?: number;
134
+ }, nowMs?: number): number | undefined;
@@ -26,6 +26,15 @@ export function createLocalAgentTask(input) {
26
26
  updatedAt: now,
27
27
  };
28
28
  }
29
+ // Task identity (not an id string) and generation isolate concurrent tasks/resumes.
30
+ // Unpublished carry lives only inside these streams, never in progress or task JSON.
31
+ const previewRedactions = new WeakMap();
32
+ function previewStream(registry) {
33
+ if (!registry)
34
+ return { push: (chunk) => chunk };
35
+ // A whole-value-only registry cannot prove a delta prefix safe. Fail closed.
36
+ return registry.createStreamingRedactor?.({ incompleteSecret: "redact" }) ?? { push: () => "" };
37
+ }
29
38
  export function updateProgressFromMessage(task, message) {
30
39
  task.progress.totalEvents += 1;
31
40
  task.progress.lastActivity = new Date().toISOString();
@@ -34,11 +43,50 @@ export function updateProgressFromMessage(task, message) {
34
43
  .map((block) => block.text)
35
44
  .join("\n")
36
45
  .trim();
37
- if (text)
38
- task.progress.lastText = text.slice(-1000);
46
+ if (text) {
47
+ const registry = previewRedactions.get(task)?.registry;
48
+ // A final message is not a visible-delta fallback. Keep the legacy preview
49
+ // safe too, including a terminal message ending in an incomplete secret.
50
+ task.progress.lastText = previewStream(registry).push(text).slice(-1000);
51
+ }
39
52
  task.updatedAt = new Date().toISOString();
40
53
  }
41
- export function updateProgressFromEvent(task, event) {
54
+ export function updateProgressFromEvent(task, event, runGeneration, secretRedactions) {
55
+ if (runGeneration !== undefined && task.runGeneration !== runGeneration)
56
+ return;
57
+ const capturedRun = runGeneration === task.runGeneration && Number.isSafeInteger(runGeneration) && runGeneration > 0;
58
+ let state = previewRedactions.get(task);
59
+ // Once a registry is attached, an omitted optional argument must not downgrade
60
+ // this task to plaintext. A newly supplied registry takes effect immediately.
61
+ const registry = secretRedactions ?? state?.registry;
62
+ if (!state || state.runGeneration !== task.runGeneration || state.registry !== registry) {
63
+ if (registry) {
64
+ // Existing bounded text cannot be proven safe (a cut may have removed the
65
+ // start of a credential). Do not seed the new stream with a persisted tail.
66
+ task.progress.visibleText = undefined;
67
+ task.progress.lastText = undefined;
68
+ }
69
+ state = { runGeneration: task.runGeneration, registry, closed: state?.runGeneration === task.runGeneration && state.closed === true };
70
+ previewRedactions.set(task, state);
71
+ }
72
+ if (event.type === "terminal" || task.status === "completed" || task.status === "failed" || task.status === "killed") {
73
+ // Discard, NEVER flush an ambiguous prefix on completion/failure/kill.
74
+ state.visible = undefined;
75
+ state.legacy = undefined;
76
+ state.closed = true;
77
+ }
78
+ const acceptsDelta = task.status === "running" && !state.closed && (!registry || capturedRun);
79
+ let safeLegacyDelta = "";
80
+ if (event.type === "assistant.delta" && acceptsDelta) {
81
+ safeLegacyDelta = (state.legacy ??= previewStream(registry)).push(event.text);
82
+ if (event.displayChannel === "visible" && capturedRun) {
83
+ const previous = task.progress.visibleText?.runGeneration === runGeneration && task.progress.visibleText.redactionVersion === 1
84
+ ? task.progress.visibleText : undefined;
85
+ const safeDelta = (state.visible ??= previewStream(registry)).push(event.text);
86
+ const text = `${previous?.text ?? ""}${safeDelta}`;
87
+ task.progress.visibleText = { channel: "visible", runGeneration: runGeneration, text: text.slice(-4000), truncated: previous?.truncated === true || text.length > 4000, redactionVersion: 1 };
88
+ }
89
+ }
42
90
  const now = new Date().toISOString();
43
91
  task.progress.totalEvents += 1;
44
92
  task.progress.lastActivity = now;
@@ -70,8 +118,8 @@ export function updateProgressFromEvent(task, event) {
70
118
  else if (event.type === "state" && event.phase !== "running_tools") {
71
119
  task.progress.currentAction = event.detail || event.phase;
72
120
  }
73
- else if (event.type === "assistant.delta" && event.text.trim()) {
74
- task.progress.lastText = `${task.progress.lastText ?? ""}${event.text}`.slice(-1000);
121
+ else if (event.type === "assistant.delta" && safeLegacyDelta) {
122
+ task.progress.lastText = `${task.progress.lastText ?? ""}${safeLegacyDelta}`.slice(-1000);
75
123
  }
76
124
  task.updatedAt = now;
77
125
  }
@@ -103,4 +151,26 @@ export function renderLocalAgentTaskOutput(task) {
103
151
  function defaultTaskOutputFile(taskId) {
104
152
  return resolve(getNeoctlHome(), "agent-tasks", `${taskId}.txt`);
105
153
  }
154
+ /** Running clocks are derived from the persisted start; terminal clocks never tick. */
155
+ export function agentRunDurationMs(run, nowMs = Date.now()) {
156
+ const start = agentRunTimestampMs(run.startedAt);
157
+ if (!Number.isFinite(start))
158
+ return undefined;
159
+ if (run.status === "running") {
160
+ const elapsed = nowMs - start;
161
+ return Number.isSafeInteger(elapsed) && elapsed >= 0 ? elapsed : undefined;
162
+ }
163
+ if (run.status === "pending")
164
+ return undefined;
165
+ const end = agentRunTimestampMs(run.completedAt);
166
+ const elapsed = end - start;
167
+ return Number.isSafeInteger(elapsed) && elapsed >= 0 && run.durationMs === elapsed ? elapsed : undefined;
168
+ }
169
+ /** Accept only the UTC ISO timestamps emitted by the lifecycle, not Date.parse guesses. */
170
+ function agentRunTimestampMs(value) {
171
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value))
172
+ return NaN;
173
+ const ms = Date.parse(value);
174
+ return Number.isFinite(ms) && new Date(ms).toISOString() === value ? ms : NaN;
175
+ }
106
176
  //# sourceMappingURL=local-agent-task.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-agent-task.js","sourceRoot":"","sources":["../../src/agents/local-agent-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA8F5C,MAAM,UAAU,oBAAoB,CAAC,KAUpC;IACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,MAAM;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;QAC3B,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE;QAClD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;QACnE,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE,EAAE;QACnB,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAoB,EAAE,OAAgB;IAC9E,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;SACxB,MAAM,CAAC,CAAC,KAAK,EAA2C,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACjF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IACV,IAAI,IAAI;QAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAoB,EAAE,KAAiB;IAC7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,MAAmC,EAAE,MAAe,EAAE,EAAE;QACjG,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,MAAM,QAAQ,GAAG,QAAQ,EAAE,MAAM,KAAK,WAAW,IAAI,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC;QACnF,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QAC7C,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAC3D,IAAI,KAAK,IAAI,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;IACtC,CAAC,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;IAC5D,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAoB;IAC5D,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACjD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAoB;IAC7D,OAAO;QACL,YAAY,IAAI,CAAC,MAAM,EAAE;QACzB,aAAa,IAAI,CAAC,OAAO,EAAE;QAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5D,WAAW,IAAI,CAAC,MAAM,EAAE;QACxB,mBAAmB,IAAI,CAAC,aAAa,EAAE;QACvC,gBAAgB,IAAI,CAAC,WAAW,EAAE;QAClC,eAAe,IAAI,CAAC,SAAS,EAAE;QAC/B,eAAe,IAAI,CAAC,SAAS,EAAE;QAC/B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QAClE,EAAE;QACF,SAAS;QACT,IAAI,CAAC,MAAM;QACX,EAAE;QACF,SAAS;QACT,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;KACnD,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"local-agent-task.js","sourceRoot":"","sources":["../../src/agents/local-agent-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};