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.
- package/dist/agents/agent-report-security.test.d.ts +1 -0
- package/dist/agents/agent-report-security.test.js +301 -0
- package/dist/agents/agent-report-security.test.js.map +1 -0
- package/dist/agents/agent-tool-persistence.test.js +9 -3
- package/dist/agents/agent-tool-persistence.test.js.map +1 -1
- package/dist/agents/agent-tool.d.ts +3 -0
- package/dist/agents/agent-tool.js +127 -34
- package/dist/agents/agent-tool.js.map +1 -1
- package/dist/agents/live-preview-redaction-security.test.d.ts +1 -0
- package/dist/agents/live-preview-redaction-security.test.js +286 -0
- package/dist/agents/live-preview-redaction-security.test.js.map +1 -0
- package/dist/agents/local-agent-task.d.ts +27 -1
- package/dist/agents/local-agent-task.js +75 -5
- package/dist/agents/local-agent-task.js.map +1 -1
- package/dist/agents/obs07-11-run-facts.test.d.ts +1 -0
- package/dist/agents/obs07-11-run-facts.test.js +459 -0
- package/dist/agents/obs07-11-run-facts.test.js.map +1 -0
- package/dist/agents/smoke-agent-lifecycle.js +8 -4
- package/dist/agents/smoke-agent-lifecycle.js.map +1 -1
- package/dist/agents/smoke-agents.js +7 -3
- package/dist/agents/smoke-agents.js.map +1 -1
- package/dist/context/context-manager.d.ts +1 -0
- package/dist/context/context-manager.js +10 -6
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/smoke-context.js +46 -3
- package/dist/context/smoke-context.js.map +1 -1
- package/dist/core/image-registry.js +1 -1
- package/dist/core/image-registry.js.map +1 -1
- package/dist/core/obs04-visible-data.test.d.ts +1 -0
- package/dist/core/obs04-visible-data.test.js +147 -0
- package/dist/core/obs04-visible-data.test.js.map +1 -0
- package/dist/core/query-engine.d.ts +5 -0
- package/dist/core/query-engine.js +35 -2
- package/dist/core/query-engine.js.map +1 -1
- package/dist/core/query.d.ts +2 -0
- package/dist/core/query.js +104 -15
- package/dist/core/query.js.map +1 -1
- package/dist/core/run-agent.d.ts +2 -0
- package/dist/core/run-agent.js +20 -10
- package/dist/core/run-agent.js.map +1 -1
- package/dist/model/model-gateway.d.ts +1 -0
- package/dist/model/model-metadata.json +99 -99
- package/dist/model/openai-native-image-guard.test.d.ts +1 -0
- package/dist/model/openai-native-image-guard.test.js +101 -0
- package/dist/model/openai-native-image-guard.test.js.map +1 -0
- package/dist/model/openai-responses-mapper.js +91 -16
- package/dist/model/openai-responses-mapper.js.map +1 -1
- package/dist/plugins/smoke-plugin-system.js +14 -14
- package/dist/repl/index.js +2 -2
- package/dist/repl/index.js.map +1 -1
- package/dist/secrets/secret-redaction.d.ts +6 -5
- package/dist/secrets/secret-redaction.js +7 -79
- package/dist/secrets/secret-redaction.js.map +1 -1
- package/dist/secrets/secret-types.d.ts +4 -1
- package/dist/secrets/secret-types.js.map +1 -1
- package/dist/session/session-store.d.ts +4 -1
- package/dist/session/session-store.js +5 -2
- package/dist/session/session-store.js.map +1 -1
- package/dist/tasks/subagent-tools.test.js +1 -0
- package/dist/tasks/subagent-tools.test.js.map +1 -1
- package/dist/tasks/task-ack-size.test.js +6 -5
- package/dist/tasks/task-ack-size.test.js.map +1 -1
- package/dist/tasks/task-persistence.d.ts +1 -0
- package/dist/tasks/task-persistence.js +31 -9
- package/dist/tasks/task-persistence.js.map +1 -1
- package/dist/tasks/task-store.d.ts +6 -4
- package/dist/tasks/task-store.js +46 -20
- package/dist/tasks/task-store.js.map +1 -1
- package/dist/tools/builtins/exec-process-manager.d.ts +97 -2
- package/dist/tools/builtins/exec-process-manager.js +218 -19
- package/dist/tools/builtins/exec-process-manager.js.map +1 -1
- package/dist/tools/builtins/exec-tool.js +14 -1
- package/dist/tools/builtins/exec-tool.js.map +1 -1
- package/dist/tools/builtins/image-generation-tool.js +24 -24
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/smoke-exec-process.js +2 -1
- package/dist/tools/smoke-exec-process.js.map +1 -1
- package/dist/tools/smoke-terminal-output-chain.d.ts +1 -0
- package/dist/tools/smoke-terminal-output-chain.js +245 -0
- package/dist/tools/smoke-terminal-output-chain.js.map +1 -0
- package/dist/tools/smoke-tool-system.js +6 -6
- package/dist/tools/smoke-tool-system.js.map +1 -1
- package/dist/tools/terminal-output-persistence.test.d.ts +1 -0
- package/dist/tools/terminal-output-persistence.test.js +50 -0
- package/dist/tools/terminal-output-persistence.test.js.map +1 -0
- package/dist/tools/terminal-output-store.d.ts +150 -0
- package/dist/tools/terminal-output-store.js +562 -0
- package/dist/tools/terminal-output-store.js.map +1 -0
- package/dist/tools/terminal-output-store.test.d.ts +1 -0
- package/dist/tools/terminal-output-store.test.js +364 -0
- package/dist/tools/terminal-output-store.test.js.map +1 -0
- package/dist/types/events.d.ts +1 -0
- package/dist/types/messages.d.ts +1 -0
- package/dist/web/agent-content-detail.d.ts +78 -0
- package/dist/web/agent-content-detail.js +495 -0
- package/dist/web/agent-content-detail.js.map +1 -0
- package/dist/web/agent-content-detail.test.d.ts +1 -0
- package/dist/web/agent-content-detail.test.js +307 -0
- package/dist/web/agent-content-detail.test.js.map +1 -0
- package/dist/web/agent-parent-messages.test.d.ts +1 -0
- package/dist/web/agent-parent-messages.test.js +58 -0
- package/dist/web/agent-parent-messages.test.js.map +1 -0
- package/dist/web/agent-tool-payload-security.test.d.ts +1 -0
- package/dist/web/agent-tool-payload-security.test.js +120 -0
- package/dist/web/agent-tool-payload-security.test.js.map +1 -0
- package/dist/web/index.d.ts +114 -3
- package/dist/web/index.js +182 -67
- package/dist/web/index.js.map +1 -1
- package/dist/web/smoke-agent-content-http.d.ts +1 -0
- package/dist/web/smoke-agent-content-http.js +446 -0
- package/dist/web/smoke-agent-content-http.js.map +1 -0
- package/dist/web/smoke-status-semantics.d.ts +1 -0
- package/dist/web/smoke-status-semantics.js +90 -0
- package/dist/web/smoke-status-semantics.js.map +1 -0
- package/dist/web/smoke-task-session-entrypoints.js +22 -1
- package/dist/web/smoke-task-session-entrypoints.js.map +1 -1
- package/dist/web/smoke-terminal-output-http.d.ts +1 -0
- package/dist/web/smoke-terminal-output-http.js +372 -0
- package/dist/web/smoke-terminal-output-http.js.map +1 -0
- package/dist/web/smoke-tool-call-detail.d.ts +1 -0
- package/dist/web/smoke-tool-call-detail.js +106 -0
- package/dist/web/smoke-tool-call-detail.js.map +1 -0
- package/dist/web/smoke-tool-call-http.d.ts +1 -0
- package/dist/web/smoke-tool-call-http.js +100 -0
- package/dist/web/smoke-tool-call-http.js.map +1 -0
- package/dist/web/smoke-tool-detail-fields-http.d.ts +1 -0
- package/dist/web/smoke-tool-detail-fields-http.js +121 -0
- package/dist/web/smoke-tool-detail-fields-http.js.map +1 -0
- package/dist/web/smoke-web-terminal-tasks.js +126 -76
- package/dist/web/smoke-web-terminal-tasks.js.map +1 -1
- package/dist/web/status-semantics.d.ts +11 -0
- package/dist/web/status-semantics.js +59 -0
- package/dist/web/status-semantics.js.map +1 -0
- package/dist/web/terminal-presentation.d.ts +15 -0
- package/dist/web/terminal-presentation.js +61 -0
- package/dist/web/terminal-presentation.js.map +1 -0
- package/dist/web/terminal-presentation.test.d.ts +1 -0
- package/dist/web/terminal-presentation.test.js +33 -0
- package/dist/web/terminal-presentation.test.js.map +1 -0
- package/dist/web/tool-call-detail.d.ts +40 -0
- package/dist/web/tool-call-detail.js +167 -0
- package/dist/web/tool-call-detail.js.map +1 -0
- package/dist/web/tool-detail-fields.d.ts +59 -0
- package/dist/web/tool-detail-fields.js +119 -0
- package/dist/web/tool-detail-fields.js.map +1 -0
- package/dist/web/tool-detail-fields.test.d.ts +1 -0
- package/dist/web/tool-detail-fields.test.js +121 -0
- package/dist/web/tool-detail-fields.test.js.map +1 -0
- package/package.json +93 -93
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
// Real HTTP server/router/WebRepl/resolver; real preloaded TaskStore and disk JSONL.
|
|
2
|
+
// No production patches. Run: npx tsx src/web/smoke-agent-content-http.ts
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import http from 'node:http';
|
|
5
|
+
import fs from 'node:fs/promises';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { runWebServer, WebRepl } from './index.js';
|
|
10
|
+
import { TaskStore } from '../tasks/task-store.js';
|
|
11
|
+
import { createLocalAgentTask } from '../agents/local-agent-task.js';
|
|
12
|
+
import { InMemorySecretRedactionRegistry } from '../secrets/secret-redaction.js';
|
|
13
|
+
import { redactToolDetail } from './tool-call-detail.js';
|
|
14
|
+
const root = await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(), 'obs-agent-http-')));
|
|
15
|
+
const dirs = new Map(['A', 'B'].map(id => [id, path.join(root, `actual-${id}`)]));
|
|
16
|
+
const store = new TaskStore();
|
|
17
|
+
const ownerStores = new Map([['A', store], ['B', new TaskStore()]]);
|
|
18
|
+
const allTasks = () => [...ownerStores.values()].flatMap(s => s.list());
|
|
19
|
+
const secrets = new InMemorySecretRedactionRegistry();
|
|
20
|
+
const secret = 'HTTP_AGENT_RUNTIME_SECRET_7295';
|
|
21
|
+
secrets.record('agent_http', secret);
|
|
22
|
+
let assertions = 0;
|
|
23
|
+
let requests = 0;
|
|
24
|
+
let modelCalls = 0;
|
|
25
|
+
let mutations = 0;
|
|
26
|
+
let runtimeCreations = 0;
|
|
27
|
+
let switchDuringRead = false;
|
|
28
|
+
let server;
|
|
29
|
+
let base = '';
|
|
30
|
+
const originalCreateServer = http.createServer;
|
|
31
|
+
const findings = [];
|
|
32
|
+
const defects = [];
|
|
33
|
+
const phases = [];
|
|
34
|
+
const sanitized = (text) => redactToolDetail(secrets.redact(redactToolDetail(text)));
|
|
35
|
+
function check(v, reason) { assert.ok(v, reason); assertions++; }
|
|
36
|
+
function eq(a, b, reason) { assert.deepEqual(a, b, reason); assertions++; }
|
|
37
|
+
const deny = () => { mutations++; throw new Error('GET attempted mutation/recovery'); };
|
|
38
|
+
const model = () => { modelCalls++; throw new Error('GET attempted model/submit'); };
|
|
39
|
+
const transcript = (owner, agent = 'agent_shared') => path.join(dirs.get(owner), 'subagents', agent, 'transcript.jsonl');
|
|
40
|
+
let serial = 0;
|
|
41
|
+
function entry(text, runGeneration = 3, agentId = 'agent_shared', visible = true) {
|
|
42
|
+
return { type: 'message', sessionId: agentId, agentId, runGeneration, message: { id: `m${++serial}`, role: 'assistant', createdAt: '2026-09-07T00:00:00Z', blocks: [{ type: 'text', text, ...(visible ? { displayChannel: 'visible' } : {}) }] } };
|
|
43
|
+
}
|
|
44
|
+
const jsonl = (values) => values.map(v => JSON.stringify(v) + '\n').join('');
|
|
45
|
+
async function snapshot() {
|
|
46
|
+
const out = [];
|
|
47
|
+
async function walk(dir) {
|
|
48
|
+
for (const name of (await fs.readdir(dir)).sort()) {
|
|
49
|
+
const p = path.join(dir, name);
|
|
50
|
+
const s = await fs.lstat(p);
|
|
51
|
+
out.push([path.relative(root, p), s.size, s.mtimeMs, s.mode, s.isDirectory() ? 'dir' : createHash('sha256').update(await fs.readFile(p)).digest('hex')]);
|
|
52
|
+
if (s.isDirectory())
|
|
53
|
+
await walk(p);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
await walk(root);
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
async function start() {
|
|
60
|
+
const probe = originalCreateServer();
|
|
61
|
+
await new Promise(r => probe.listen(0, '127.0.0.1', r));
|
|
62
|
+
const addr = probe.address();
|
|
63
|
+
check(addr && typeof addr === 'object', 'port allocated');
|
|
64
|
+
await new Promise(r => probe.close(() => r()));
|
|
65
|
+
http.createServer = (...args) => server = originalCreateServer(...args);
|
|
66
|
+
try {
|
|
67
|
+
await runWebServer(['--host', '127.0.0.1', '--port', String(addr.port)], {
|
|
68
|
+
createRuntime: async (config) => {
|
|
69
|
+
runtimeCreations++;
|
|
70
|
+
const id = config?.sessionId ?? 'A';
|
|
71
|
+
const session = dirs.has(id) ? { sessionId: id, sessionDir: dirs.get(id) } : undefined;
|
|
72
|
+
return {
|
|
73
|
+
taskStore: ownerStores.get(id) ?? store, execProcessManager: { subscribe: () => () => { }, subscribeOutput: () => () => { }, list: () => [] }, envPath: path.join(root, 'fixture.env'), initialMetrics: {},
|
|
74
|
+
engine: {
|
|
75
|
+
snapshot: () => ({ session, messages: 0 }), getDisplayEntries: () => [], getHistoryMessages: () => [],
|
|
76
|
+
redactDisplayValue: (v) => {
|
|
77
|
+
if (switchDuringRead) {
|
|
78
|
+
switchDuringRead = false;
|
|
79
|
+
store.getInSession('task_A', dirs.get('A')).runGeneration++;
|
|
80
|
+
}
|
|
81
|
+
return secrets.redact(v);
|
|
82
|
+
},
|
|
83
|
+
isFastMode: () => false, getAppPrompt: () => ({ hasActivePrompt: false }), onSessionTitleChange: () => () => { },
|
|
84
|
+
submit: model, query: model, appendMessage: deny,
|
|
85
|
+
}, model: { generate: model },
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
createRepl: runtime => { const repl = new WebRepl(runtime); repl.submit = model; return repl; },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
http.createServer = originalCreateServer;
|
|
93
|
+
}
|
|
94
|
+
check(server?.listening, 'real server listening');
|
|
95
|
+
base = `http://127.0.0.1:${addr.port}`;
|
|
96
|
+
}
|
|
97
|
+
function url(changes = {}) {
|
|
98
|
+
return `${base}/api/agent-content?${new URLSearchParams({ sessionId: 'A', taskId: 'task_A', runGeneration: '3', view: 'timeline', pageChars: '1024', ...changes })}`;
|
|
99
|
+
}
|
|
100
|
+
async function request(target, init) { requests++; return fetch(target, { ...init, signal: AbortSignal.timeout(15_000) }); }
|
|
101
|
+
async function page(changes = {}) {
|
|
102
|
+
const response = await request(url(changes));
|
|
103
|
+
eq(response.status, 200, 'raw page HTTP200');
|
|
104
|
+
eq(response.headers.get('cache-control'), 'no-store', 'not cacheable');
|
|
105
|
+
const p = await response.json();
|
|
106
|
+
eq(p.ownerSessionId, changes.sessionId ?? 'A', 'owner response identity');
|
|
107
|
+
eq(p.taskId, changes.taskId ?? 'task_A', 'task response identity');
|
|
108
|
+
const requestedRun = Number(changes.runGeneration ?? '3');
|
|
109
|
+
eq(p.runGeneration, Number.isFinite(requestedRun) ? requestedRun : null, 'run response identity (nonfinite JSON numbers become null)');
|
|
110
|
+
check(!('ok' in p) && !('value' in p), 'raw AgentContentPage, not wrapper');
|
|
111
|
+
return p;
|
|
112
|
+
}
|
|
113
|
+
async function state(owner = 'A') {
|
|
114
|
+
const response = await request(`${base}/api/state?${new URLSearchParams({ sessionId: owner })}`);
|
|
115
|
+
eq(response.status, 200, 'real snapshot HTTP200');
|
|
116
|
+
const body = await response.json();
|
|
117
|
+
eq(body.session.sessionId, owner, 'snapshot owner');
|
|
118
|
+
eq(body.lines, [], 'GET does not publish transcript lines');
|
|
119
|
+
return body;
|
|
120
|
+
}
|
|
121
|
+
async function drain(changes = {}) {
|
|
122
|
+
const pages = [];
|
|
123
|
+
for (let i = 0; i < 200; i++) {
|
|
124
|
+
const p = await page(changes);
|
|
125
|
+
pages.push(p);
|
|
126
|
+
check(p.state !== 'unavailable', p.reason);
|
|
127
|
+
if (!p.nextCursor)
|
|
128
|
+
return pages;
|
|
129
|
+
changes = { ...changes, cursor: p.nextCursor, refresh: 'false' };
|
|
130
|
+
}
|
|
131
|
+
throw new Error('pagination stuck');
|
|
132
|
+
}
|
|
133
|
+
function join(items) {
|
|
134
|
+
const values = new Map();
|
|
135
|
+
for (const item of items) {
|
|
136
|
+
const prev = values.get(item.id) ?? '';
|
|
137
|
+
eq(item.content.offset, prev.length, 'fragment no gaps/duplicates');
|
|
138
|
+
values.set(item.id, prev + item.content.text);
|
|
139
|
+
}
|
|
140
|
+
return [...values.values()];
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
for (const [id, dir] of dirs) {
|
|
144
|
+
await fs.mkdir(dir, { recursive: true });
|
|
145
|
+
const task = createLocalAgentTask({ taskId: `task_${id}`, agentId: 'agent_shared', prompt: (`DELEGATION_${id} ${secret} 汉😀\n`).repeat(150), description: 'd'.repeat(2200) });
|
|
146
|
+
task.status = 'failed';
|
|
147
|
+
task.runGeneration = 3;
|
|
148
|
+
task.error = `ACTUAL_FAIL ${secret}`;
|
|
149
|
+
task.createdAt = '2026-09-01T00:00:00.000Z';
|
|
150
|
+
task.updatedAt = '2026-09-07T00:10:00.000Z';
|
|
151
|
+
task.progress.lastText = `LEGACY_LAST_TEXT_${id}_FORBIDDEN`;
|
|
152
|
+
task.progress.visibleText = { channel: 'visible', redactionVersion: 1, runGeneration: 3, text: `LIVE_${id} ${secret}`, truncated: true };
|
|
153
|
+
task.startedAt = '2026-09-07T00:00:00.000Z';
|
|
154
|
+
task.completedAt = '2026-09-07T00:00:01.000Z';
|
|
155
|
+
task.durationMs = 1000;
|
|
156
|
+
task.result = { agent_id: task.agentId, agent_type: 'test', displaySource: 'agent_report', content: (`CURRENT_PARTIAL_${id} ${secret} 😀\n`).repeat(130), status: 'incomplete', total_duration_ms: 1000, total_tool_use_count: 0 };
|
|
157
|
+
task.runHistory = [{ runGeneration: 2, status: 'completed', startedAt: '2026-09-06T00:00:00.000Z', completedAt: '2026-09-06T00:00:02.500Z', durationMs: 2500,
|
|
158
|
+
result: { ...task.result, content: (`ARCHIVE_${id} ${secret}\n`).repeat(100), status: 'completed' }, progress: task.progress, archivedAt: task.completedAt }];
|
|
159
|
+
const writer = new TaskStore();
|
|
160
|
+
writer.attachTask(task, dir);
|
|
161
|
+
writer.flush();
|
|
162
|
+
await fs.writeFile(transcript(id), id === 'A' ? jsonl([
|
|
163
|
+
...Array.from({ length: 80 }, () => entry('OLD_FORBIDDEN'.repeat(5000), 1)),
|
|
164
|
+
entry('HIDDEN_FORBIDDEN', 3, 'agent_shared', false),
|
|
165
|
+
{ ...entry('SYSTEM_FORBIDDEN'), message: { ...entry('').message, role: 'system', blocks: [{ type: 'text', displayChannel: 'visible', text: 'SYSTEM_FORBIDDEN' }] } },
|
|
166
|
+
entry((`BODY_A ${secret} Bearer fixturebearer 汉😀\n`).repeat(500)),
|
|
167
|
+
...Array.from({ length: 35 }, (_, i) => entry(`visible-${i}\n`)),
|
|
168
|
+
{ type: 'message', sessionId: 'agent_shared', agentId: 'agent_shared', runGeneration: 3, message: { id: 'tool-use', role: 'assistant', blocks: [{ type: 'tool_use', id: 'call_one', name: 'file_read', input: { path: '/real/object', offset: 0, api_key: 'STRUCT_SECRET' } }] } },
|
|
169
|
+
{ type: 'message', sessionId: 'agent_shared', agentId: 'agent_shared', runGeneration: 3, message: { id: 'tool-result', role: 'tool_result', blocks: [{ type: 'tool_result', toolUseId: 'call_one', name: 'file_read', ok: false, output: { error: 'REAL_TOOL_ERROR', content: secret } }] } },
|
|
170
|
+
]) : jsonl([entry('BODY_B_ONLY')]));
|
|
171
|
+
// Preloading can recover/write; explicitly outside HTTP read boundary.
|
|
172
|
+
eq(ownerStores.get(id).loadSession(dir).loaded, 1, `real disk preload ${id}`);
|
|
173
|
+
}
|
|
174
|
+
const second = createLocalAgentTask({ taskId: 'task_second', agentId: 'agent_second', prompt: 'SECOND_ONLY', description: '' });
|
|
175
|
+
second.status = 'completed';
|
|
176
|
+
second.runGeneration = 3;
|
|
177
|
+
second.progress.lastText = 'SECOND_LEGACY_FORBIDDEN';
|
|
178
|
+
second.progress.visibleText = { channel: 'visible', runGeneration: 2, text: 'STALE_VISIBLE_FORBIDDEN', truncated: false };
|
|
179
|
+
store.attachTask(second, dirs.get('A'));
|
|
180
|
+
await fs.writeFile(transcript('A', 'agent_second'), jsonl([entry('SECOND_ONLY', 3, 'agent_second')]));
|
|
181
|
+
await fs.writeFile(path.join(root, 'fixture.env'), '');
|
|
182
|
+
store.flush();
|
|
183
|
+
const a = store.getInSession('task_A', dirs.get('A'));
|
|
184
|
+
const initialTask = JSON.stringify(a);
|
|
185
|
+
for (const method of ['bindSession', 'loadSession', 'activateSession', 'prepareResume', 'upsert', 'updateProgress', 'markRunning', 'complete', 'fail', 'kill', 'queueMessage', 'queueMessageInSession', 'appendMessage', 'flush']) {
|
|
186
|
+
for (const ownerStore of ownerStores.values())
|
|
187
|
+
ownerStore[method] = deny;
|
|
188
|
+
}
|
|
189
|
+
const before = await snapshot();
|
|
190
|
+
await start();
|
|
191
|
+
const first = await page();
|
|
192
|
+
eq(first.state, 'partial', 'filtered scan empty partial');
|
|
193
|
+
eq(first.items, [], 'empty page is not EOF');
|
|
194
|
+
check(first.nextCursor, 'empty partial continues');
|
|
195
|
+
const remaining = await drain({ cursor: first.nextCursor });
|
|
196
|
+
check(remaining.length > 1, 'timeline spans multiple pages');
|
|
197
|
+
check(remaining.every(p => p.snapshotId === first.snapshotId && p.upperBoundBytes === first.upperBoundBytes), 'all timeline pages retain snapshot identity and upper bound');
|
|
198
|
+
const items = remaining.flatMap(p => p.items ?? []);
|
|
199
|
+
const joined = join(items);
|
|
200
|
+
eq(joined.length, 38, '>24/8 entries and tool steps retained');
|
|
201
|
+
eq(joined[0], sanitized((`BODY_A ${secret} Bearer fixturebearer 汉😀\n`).repeat(500)), 'long single JSONL exact full redacted body');
|
|
202
|
+
eq(items.find(i => i.kind === 'tool_use')?.object?.text, '/real/object', 'real tool object');
|
|
203
|
+
eq(items.find(i => i.kind === 'tool_result')?.status, 'failed', 'actual tool failure');
|
|
204
|
+
const all = JSON.stringify(remaining);
|
|
205
|
+
for (const forbidden of [secret, 'HIDDEN_FORBIDDEN', 'SYSTEM_FORBIDDEN', 'OLD_FORBIDDEN', 'STRUCT_SECRET', 'fixturebearer', 'BODY_B_ONLY'])
|
|
206
|
+
check(!all.includes(forbidden), `denied ${forbidden}`);
|
|
207
|
+
const retry1 = await page({ cursor: first.nextCursor });
|
|
208
|
+
const retry2 = await page({ cursor: first.nextCursor });
|
|
209
|
+
eq(retry1.items, retry2.items, 'same HTTP cursor retry idempotent');
|
|
210
|
+
phases.push('real-http-empty-partial-long-line-visible-tools');
|
|
211
|
+
for (const view of ['delegation', 'report']) {
|
|
212
|
+
const pages = await drain({ view });
|
|
213
|
+
check(pages.length > 1, `${view} multipage`);
|
|
214
|
+
const field = (p) => view === 'report' ? p.report.content : p.delegation.prompt;
|
|
215
|
+
let result = '';
|
|
216
|
+
for (const p of pages) {
|
|
217
|
+
eq(field(p).offset, result.length, `${view} offset`);
|
|
218
|
+
result += field(p).text;
|
|
219
|
+
}
|
|
220
|
+
eq(result, sanitized(view === 'report' ? a.result.content : a.prompt), `${view} exact redacted source`);
|
|
221
|
+
if (view === 'report') {
|
|
222
|
+
eq(pages[0].report.source, 'task.result', 'current source');
|
|
223
|
+
eq(pages[0].report.taskStatus, 'failed', 'partial is not success');
|
|
224
|
+
eq(pages[0].report.reportStatus, 'incomplete', 'saved incomplete status');
|
|
225
|
+
eq(pages[0].report.error.text, sanitized(`ACTUAL_FAIL ${secret}`), 'real error');
|
|
226
|
+
}
|
|
227
|
+
else
|
|
228
|
+
eq(pages[0].delegation.description.state, 'truncated', 'description explicit truncation');
|
|
229
|
+
check(!JSON.stringify(pages).includes(secret), `${view} secret absent across wire pages`);
|
|
230
|
+
for (const scope of [{ sessionId: 'B', taskId: 'task_B' }, { taskId: 'task_second' }, { runGeneration: '2' }]) {
|
|
231
|
+
eq((await page({ view, cursor: pages[0].nextCursor, ...scope })).state, 'unavailable', `${view} cross-owner/task/run cursor rejected`);
|
|
232
|
+
}
|
|
233
|
+
eq((await page({ view, refresh: 'true', cursor: pages[0].nextCursor })).state, 'unavailable', `${view} incremental refresh rejected; reread without cursor`);
|
|
234
|
+
eq((await page({ view })).snapshotId === pages[0].snapshotId, false, `${view} fresh read creates new snapshot`);
|
|
235
|
+
const p = await page({ view: view === 'report' ? 'delegation' : 'report', cursor: pages[0].nextCursor });
|
|
236
|
+
eq(p.state, 'unavailable', 'cross-view cursor rejected');
|
|
237
|
+
}
|
|
238
|
+
eq((await page({ refresh: 'true' })).state, 'unavailable', 'timeline refresh requires drained cursor');
|
|
239
|
+
eq((await page({ refresh: 'true', cursor: first.nextCursor })).state, 'unavailable', 'timeline partial cursor cannot refresh');
|
|
240
|
+
const archives = await drain({ view: 'report', runGeneration: '2' });
|
|
241
|
+
eq(archives.map(p => p.report.content.text).join(''), sanitized(a.runHistory[0].result.content), 'exact archive paginated');
|
|
242
|
+
eq(archives[0].report.source, 'runHistory', 'archive source');
|
|
243
|
+
eq((await page({ view: 'report', runGeneration: '1' })).state, 'missing', 'evicted run missing never current');
|
|
244
|
+
eq(JSON.stringify(a), initialTask, 'GET task timing/partial/source unchanged');
|
|
245
|
+
eq((await page({ view: 'report', taskId: 'task_second' })).state, 'missing', 'no saved report does not invoke a model');
|
|
246
|
+
phases.push('delegation-report-current-archive-evicted-partial');
|
|
247
|
+
// Snapshot endpoint shares the real router/runtime/store; no direct private projection calls.
|
|
248
|
+
const sourceBeforeState = JSON.stringify(allTasks());
|
|
249
|
+
const currentState = await state();
|
|
250
|
+
const projected = currentState.agentTaskHistory.find(t => t.taskId === a.taskId);
|
|
251
|
+
check(projected, 'current failed task in snapshot history');
|
|
252
|
+
eq(projected.progress.visibleText, secrets.redact(a.progress.visibleText), 'only current visible generation is redacted and preserved, including truncated flag');
|
|
253
|
+
check(!('lastText' in projected.progress), 'legacy lastText field not public');
|
|
254
|
+
check(!JSON.stringify(currentState).includes('LEGACY_LAST_TEXT_'), 'legacy lastText content not public');
|
|
255
|
+
const projectedSecond = currentState.agentTaskHistory.find(t => t.taskId === second.taskId);
|
|
256
|
+
check(projectedSecond && !('visibleText' in projectedSecond.progress), 'prior-generation visibleText omitted');
|
|
257
|
+
check(!JSON.stringify(currentState).includes('STALE_VISIBLE_FORBIDDEN'), 'stale visible body not elsewhere in snapshot');
|
|
258
|
+
for (const field of ['createdAt', 'updatedAt', 'startedAt', 'completedAt', 'durationMs'])
|
|
259
|
+
eq(projected[field], a[field], `snapshot exact actual ${field}`);
|
|
260
|
+
eq(projected.runHistory?.[0]?.startedAt, a.runHistory[0].startedAt, 'archive actual start, not current start');
|
|
261
|
+
eq(projected.runHistory?.[0]?.completedAt, a.runHistory[0].completedAt, 'archive actual end');
|
|
262
|
+
eq(projected.runHistory?.[0]?.durationMs, 2500, 'archive actual frozen duration');
|
|
263
|
+
for (const field of ['startedAt', 'completedAt', 'durationMs'])
|
|
264
|
+
check(!(field in projectedSecond), `unknown ${field} not fabricated from creation/update`);
|
|
265
|
+
const stateB = await state('B');
|
|
266
|
+
eq(stateB.agentTaskHistory.map(t => t.taskId), ['task_B'], 'snapshot owner B excludes A tasks');
|
|
267
|
+
check(!JSON.stringify(currentState).includes('LIVE_B'), 'snapshot A excludes B visible preview');
|
|
268
|
+
eq((await state()).agentTaskHistory.find(t => t.taskId === a.taskId)?.durationMs, 1000, 'terminal duration frozen across reads');
|
|
269
|
+
// Collect a wire-level defect without aborting remaining security/refresh tests.
|
|
270
|
+
if (JSON.stringify(currentState).includes(secret))
|
|
271
|
+
defects.push('/api/state publishes registered runtime secret in agent current/archive result or error; visibleText itself is redacted. agentTaskSnapshot result/error projections need runtime redaction.');
|
|
272
|
+
eq(JSON.stringify(allTasks()), sourceBeforeState, 'snapshot did not mutate any loaded task');
|
|
273
|
+
const savedProgress = a.progress;
|
|
274
|
+
const savedStatus = a.status;
|
|
275
|
+
try {
|
|
276
|
+
a.status = 'running';
|
|
277
|
+
a.progress = { ...savedProgress, visibleText: { ...savedProgress.visibleText, runGeneration: 2, text: 'STALE_ACTIVE_FORBIDDEN' } };
|
|
278
|
+
let active = (await state()).backgroundTasks.find(t => t.taskId === a.taskId);
|
|
279
|
+
check(active && !('visibleText' in active.progress) && !('lastText' in active.progress), 'active task cannot fall back to stale preview or legacy text');
|
|
280
|
+
eq(active.result, undefined, 'active snapshot does not publish stale terminal result');
|
|
281
|
+
a.progress = { ...savedProgress, visibleText: { ...savedProgress.visibleText, channel: 'hidden' } };
|
|
282
|
+
active = (await state()).backgroundTasks.find(t => t.taskId === a.taskId);
|
|
283
|
+
check(!('visibleText' in active.progress), 'unapproved preview channel omitted even for current generation');
|
|
284
|
+
a.progress = { ...savedProgress, visibleText: { ...savedProgress.visibleText, redactionVersion: undefined, text: secret.slice(-10) + 'x'.repeat(3990) } };
|
|
285
|
+
active = (await state()).backgroundTasks.find(t => t.taskId === a.taskId);
|
|
286
|
+
check(!('visibleText' in active.progress), 'legacy clipped preview without redaction provenance never published');
|
|
287
|
+
check(!JSON.stringify(active).includes(secret.slice(-10)), 'legacy secret suffix cannot survive exact registry matching');
|
|
288
|
+
a.progress = savedProgress;
|
|
289
|
+
active = (await state()).backgroundTasks.find(t => t.taskId === a.taskId);
|
|
290
|
+
eq(active.progress.visibleText, secrets.redact(savedProgress.visibleText), 'active current visible generation is available');
|
|
291
|
+
eq(active.startedAt, a.startedAt, 'active actual start not creation/update time');
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
a.progress = savedProgress;
|
|
295
|
+
a.status = savedStatus;
|
|
296
|
+
}
|
|
297
|
+
eq(JSON.stringify(allTasks()), sourceBeforeState, 'fixture-only snapshot changes fully restored');
|
|
298
|
+
phases.push('http-snapshot-current-visible-no-lastText-real-current-archive-timing');
|
|
299
|
+
// Redact whole scalar values BEFORE bounding the public snapshot, never a credential prefix.
|
|
300
|
+
const savedScalars = { result: a.result, error: a.error, runHistory: a.runHistory };
|
|
301
|
+
try {
|
|
302
|
+
const current = 'x'.repeat(1480) + secret + ' tail';
|
|
303
|
+
const archived = 'y'.repeat(580) + secret + ' tail';
|
|
304
|
+
a.result = { ...a.result, content: current };
|
|
305
|
+
a.error = current;
|
|
306
|
+
a.runHistory = [{ ...a.runHistory[0], result: { ...a.runHistory[0].result, content: archived }, error: archived }];
|
|
307
|
+
const projected = (await state()).agentTaskHistory.find(t => t.taskId === a.taskId);
|
|
308
|
+
eq(projected.result.content, secrets.redact(current).slice(0, 1500), 'current report redacted before clipping');
|
|
309
|
+
eq(projected.error, secrets.redact(current).slice(0, 1500), 'current error redacted before clipping');
|
|
310
|
+
eq(projected.runHistory[0].result.content, secrets.redact(archived).slice(0, 600), 'archive report redacted before clipping');
|
|
311
|
+
eq(projected.runHistory[0].error, secrets.redact(archived).slice(0, 600), 'archive error redacted before clipping');
|
|
312
|
+
check(!JSON.stringify(projected).includes(secret.slice(0, 20)), 'no clipped credential prefix in snapshot');
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
Object.assign(a, savedScalars);
|
|
316
|
+
}
|
|
317
|
+
eq(JSON.stringify(allTasks()), sourceBeforeState, 'scalar redaction regression leaves sources intact');
|
|
318
|
+
phases.push('snapshot-secret-boundary-before-current-archive-clipping');
|
|
319
|
+
// Legacy saved results are not proof of a public channel, even on successful tasks.
|
|
320
|
+
try {
|
|
321
|
+
a.result = { ...savedScalars.result, displaySource: undefined, content: 'LEGACY_PRIVATE_REPORT_FORBIDDEN' };
|
|
322
|
+
a.runHistory = [{ ...savedScalars.runHistory[0], result: { ...savedScalars.runHistory[0].result, displaySource: undefined, content: 'LEGACY_PRIVATE_ARCHIVE_FORBIDDEN' } }];
|
|
323
|
+
const wire = await state();
|
|
324
|
+
check(!JSON.stringify(wire).includes('LEGACY_PRIVATE_'), 'snapshot suppresses current and archive unproven report text');
|
|
325
|
+
for (const generation of ['3', '2']) {
|
|
326
|
+
const legacy = await page({ view: 'report', runGeneration: generation });
|
|
327
|
+
eq(legacy.state, 'unavailable', 'unproven legacy report is unavailable, not complete/missing');
|
|
328
|
+
check(!JSON.stringify(legacy).includes('LEGACY_PRIVATE_'), 'full reader never publishes unproven legacy report');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
Object.assign(a, savedScalars);
|
|
333
|
+
}
|
|
334
|
+
eq(JSON.stringify(allTasks()), sourceBeforeState, 'legacy provenance checks never mutate source');
|
|
335
|
+
phases.push('legacy-current-archive-report-provenance-unavailable');
|
|
336
|
+
const count = runtimeCreations;
|
|
337
|
+
eq((await request(url({ sessionId: 'never-created' }), { headers: { Origin: 'https://evil.invalid' } })).status, 403, 'origin denied before runtime');
|
|
338
|
+
eq(runtimeCreations, count, '403 cannot create runtime');
|
|
339
|
+
eq((await request(url(), { headers: { 'Sec-Fetch-Site': 'cross-site' } })).status, 403, 'cross-site denied');
|
|
340
|
+
eq((await request(url(), { headers: { Origin: base } })).status, 200, 'same-origin allowed');
|
|
341
|
+
for (const query of [{ sessionId: 'B' }, { taskId: 'missing' }, { sessionId: 'unknown' }, { view: 'hidden' }, { sessionId: '' }])
|
|
342
|
+
eq((await request(url(query))).status, 404, 'invalid owner/task/view404');
|
|
343
|
+
eq(join((await page({ sessionId: 'B', taskId: 'task_B' })).items ?? []), ['BODY_B_ONLY'], 'same child agentId isolated by owner');
|
|
344
|
+
for (const query of [{ sessionId: 'B', taskId: 'task_B' }, { taskId: 'task_second' }, { runGeneration: '2' }, { cursor: first.nextCursor.slice(0, -8) + 'tampered' }]) {
|
|
345
|
+
eq((await page({ cursor: first.nextCursor, ...query })).state, 'unavailable', 'cross-owner/task/run or tampered cursor denied');
|
|
346
|
+
}
|
|
347
|
+
// tabId takes runtime routing priority, but agentContent must still match actual runtime session.
|
|
348
|
+
await page({ tabId: 'shared-tab' });
|
|
349
|
+
eq((await request(url({ tabId: 'shared-tab', sessionId: 'B', taskId: 'task_B' }))).status, 404, 'tab-scoped A runtime cannot serve B');
|
|
350
|
+
const injected = await page({ ownerSessionDir: dirs.get('B'), ownerSessionId: 'B', agentId: 'agent_second', path: transcript('B'), sessionDir: dirs.get('B') });
|
|
351
|
+
eq(injected.items, [], 'extra owner/path params cannot replace trusted scope');
|
|
352
|
+
eq((await request(url({ sessionId: 'B', taskId: 'task_A', ownerSessionDir: dirs.get('A') }))).status, 404, 'forged owner path cannot override B scope');
|
|
353
|
+
for (const changes of [{ runGeneration: '0' }, { runGeneration: 'NaN' }, { runGeneration: '3.5' }, { pageChars: '1' }, { pageChars: '65537' }])
|
|
354
|
+
eq((await page(changes)).state, 'unavailable', 'invalid numeric request rejected');
|
|
355
|
+
const duplicate = await request(url({ sessionId: 'B' }) + '&sessionId=A&taskId=task_B');
|
|
356
|
+
eq(duplicate.status, 404, 'duplicate scope cannot bypass first owner/task check');
|
|
357
|
+
// Record actual wire normalization, not falsely claim resolver rejects these at HTTP boundary.
|
|
358
|
+
eq((await request(url({ refresh: 'not-a-boolean' }))).status, 404, 'malformed refresh boolean rejected at HTTP boundary');
|
|
359
|
+
findings.push('HTTP discards unknown ownerSessionDir/ownerSessionId/agentId/path/sessionDir keys before resolver. Tested they cannot override trusted scope; strict unknown-key rejection documented for resolver does not apply to raw URL.');
|
|
360
|
+
phases.push('403-404-cursor-scope-query-injection');
|
|
361
|
+
eq(await snapshot(), before, 'all GET phases no file writes/creation or mtime changes');
|
|
362
|
+
// Fixture appends are outside measured GET boundary; existing cursor upper bound stays fixed.
|
|
363
|
+
const refreshCursor = remaining.at(-1).refreshCursor;
|
|
364
|
+
const tail = JSON.stringify(entry('TAIL_COMPLETE'));
|
|
365
|
+
await fs.appendFile(transcript('A'), jsonl([entry('APPENDED'), entry('LATE_OLD', 2)]) + tail.slice(0, 60));
|
|
366
|
+
let frozen = await snapshot();
|
|
367
|
+
const refresh = await page({ cursor: refreshCursor, refresh: 'true' });
|
|
368
|
+
eq(join(refresh.items ?? []), ['APPENDED'], 'incremental refresh only newly appended correct run');
|
|
369
|
+
eq(refresh.pendingTail, true, 'pending JSONL tail');
|
|
370
|
+
eq(await snapshot(), frozen, 'refresh did not repair/write tail');
|
|
371
|
+
await fs.appendFile(transcript('A'), tail.slice(60) + '\n');
|
|
372
|
+
frozen = await snapshot();
|
|
373
|
+
const tailPage = await page({ cursor: refresh.refreshCursor, refresh: 'true' });
|
|
374
|
+
eq(join(tailPage.items ?? []), ['TAIL_COMPLETE'], 'tail complete once');
|
|
375
|
+
const empty = await page({ cursor: tailPage.refreshCursor, refresh: 'true' });
|
|
376
|
+
eq(empty.items, [], 'empty refresh stable');
|
|
377
|
+
// Retry old snapshot after growth still excludes newly appended data.
|
|
378
|
+
const old = await drain({ cursor: first.nextCursor });
|
|
379
|
+
eq(join(old.flatMap(p => p.items ?? [])), joined, 'old snapshot frozen during growth');
|
|
380
|
+
eq(await snapshot(), frozen, 'refresh and historical cursor GET no writes');
|
|
381
|
+
phases.push('fixed-upper-growth-refresh-pending-tail');
|
|
382
|
+
// Scalar rereads are fresh requests, never incremental timeline refresh.
|
|
383
|
+
const savedResult = a.result;
|
|
384
|
+
const savedPrompt = a.prompt;
|
|
385
|
+
try {
|
|
386
|
+
for (const view of ['delegation', 'report']) {
|
|
387
|
+
const start = await page({ view });
|
|
388
|
+
check(start.nextCursor, `${view} source-change fixture cursor`);
|
|
389
|
+
if (view === 'report')
|
|
390
|
+
a.result = { ...savedResult, content: '' };
|
|
391
|
+
else
|
|
392
|
+
a.prompt = '';
|
|
393
|
+
eq((await page({ view, cursor: start.nextCursor })).state, 'unavailable', `${view} changed source rejects old cursor`);
|
|
394
|
+
const reread = await page({ view });
|
|
395
|
+
eq(reread.state, 'complete', `${view} empty saved source is complete, not missing`);
|
|
396
|
+
const content = view === 'report' ? reread.report.content : reread.delegation.prompt;
|
|
397
|
+
eq(content.text, '', `${view} genuine empty content`);
|
|
398
|
+
eq(content.totalChars, 0, `${view} genuine empty length`);
|
|
399
|
+
if (view === 'report')
|
|
400
|
+
eq(reread.report.reportStatus, 'incomplete', 'empty incomplete report not upgraded to success');
|
|
401
|
+
a.result = savedResult;
|
|
402
|
+
a.prompt = savedPrompt;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
a.result = savedResult;
|
|
407
|
+
a.prompt = savedPrompt;
|
|
408
|
+
}
|
|
409
|
+
eq(await snapshot(), frozen, 'scalar source-change GETs no disk writes');
|
|
410
|
+
phases.push('scalar-source-change-rejected-empty-fresh-reread');
|
|
411
|
+
const liveBefore = JSON.stringify(a);
|
|
412
|
+
for (const view of ['timeline', 'delegation', 'report']) {
|
|
413
|
+
switchDuringRead = true;
|
|
414
|
+
try {
|
|
415
|
+
const race = await page({ view, ...(view === 'timeline' ? { cursor: first.nextCursor } : {}) });
|
|
416
|
+
eq(switchDuringRead, false, `${view} fixture really switched during sanitizing read`);
|
|
417
|
+
eq(race.state, 'unavailable', `${view} mid-read generation switch rejected`);
|
|
418
|
+
for (const field of ['report', 'delegation', 'items'])
|
|
419
|
+
check(!(field in race), `${view} no late ${field} content`);
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
if (!switchDuringRead)
|
|
423
|
+
a.runGeneration--;
|
|
424
|
+
switchDuringRead = false;
|
|
425
|
+
}
|
|
426
|
+
eq(JSON.stringify(a), liveBefore, `${view} only fixture injected generation change`);
|
|
427
|
+
}
|
|
428
|
+
eq(await snapshot(), frozen, 'race rejection no disk writes');
|
|
429
|
+
eq(JSON.stringify(a), initialTask, 'all phases preserve original current task');
|
|
430
|
+
eq(modelCalls, 0, 'zero model calls');
|
|
431
|
+
eq(mutations, 0, 'zero mutation/load/bind calls');
|
|
432
|
+
phases.push('mid-read-generation-guard-zero-model-zero-write');
|
|
433
|
+
}
|
|
434
|
+
finally {
|
|
435
|
+
http.createServer = originalCreateServer;
|
|
436
|
+
if (server) {
|
|
437
|
+
server.closeAllConnections();
|
|
438
|
+
await new Promise(r => server.close(() => r()));
|
|
439
|
+
}
|
|
440
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
441
|
+
}
|
|
442
|
+
console.log(JSON.stringify({ ok: defects.length === 0, assertions, requests, runtimeCreations, modelCalls, mutations, phases, findings, defects, cleanup: 'HTTP closed; temporary root removed' }, null, 2));
|
|
443
|
+
// Fail after cleanup and full coverage, rather than silently accept a production defect.
|
|
444
|
+
if (defects.length)
|
|
445
|
+
process.exitCode = 1;
|
|
446
|
+
//# sourceMappingURL=smoke-agent-content-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke-agent-content-http.js","sourceRoot":"","sources":["../../src/web/smoke-agent-content-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { statusText, subagentStatusFacts, subagentHeader, callStatus } from './status-semantics.js';
|
|
6
|
+
import { restoreWebHistoryLines, WebRepl } from './index.js';
|
|
7
|
+
import { createToolResultMessage } from '../types/messages.js';
|
|
8
|
+
import { createSubagentMessageTool, createSubagentOutputTool } from '../tasks/subagent-tools.js';
|
|
9
|
+
import { createLocalAgentTask } from '../agents/local-agent-task.js';
|
|
10
|
+
import { TaskStore } from '../tasks/task-store.js';
|
|
11
|
+
import { editTool } from '../tools/builtins/edit-tool.js';
|
|
12
|
+
import { InMemoryAppState } from '../app/app-state.js';
|
|
13
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'obs08-'));
|
|
14
|
+
const browserLines = [];
|
|
15
|
+
const project = (name, output, ok) => {
|
|
16
|
+
const use = { id: `c${browserLines.length}`, name, input: { description: '保留重复目的' } };
|
|
17
|
+
const message = createToolResultMessage(use, ok, output);
|
|
18
|
+
const lines = restoreWebHistoryLines({ engine: { getDisplayEntries: () => [{ type: 'message', message }] } });
|
|
19
|
+
const line = lines.find(l => l.toolName === name);
|
|
20
|
+
assert.ok(line);
|
|
21
|
+
browserLines.push({ ...line, id: browserLines.length + 1, toolDisplay: { ...line.toolDisplay, purpose: '保留重复目的' }, presentationLevel: browserLines.length % 2 ? 'primary' : 'process' });
|
|
22
|
+
return { line, message, use };
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
const store = new TaskStore();
|
|
26
|
+
const task = createLocalAgentTask({ taskId: 'obs08', agentId: 'agent08', description: 'task', prompt: 'test', outputFile: path.join(dir, 'out') });
|
|
27
|
+
store.upsert(task);
|
|
28
|
+
const call = (tool, input) => tool.call(input, {}, {});
|
|
29
|
+
const failure = await call(createSubagentMessageTool(store), { target: 'unknown', message: 'hi' });
|
|
30
|
+
const failed = project('subagent_message', failure.output, failure.ok).line;
|
|
31
|
+
assert.match(JSON.stringify(failed.toolDisplay), /未入队/);
|
|
32
|
+
assert.doesNotMatch(JSON.stringify(failed.toolDisplay), /仅入队/);
|
|
33
|
+
for (const status of ['running', 'completed']) {
|
|
34
|
+
task.status = status;
|
|
35
|
+
const result = await call(createSubagentMessageTool(store), { target: task.agentId, message: 'hi' });
|
|
36
|
+
const line = project('subagent_message', result.output, result.ok).line;
|
|
37
|
+
assert.match(JSON.stringify(line.toolDisplay), status === 'running' ? /已入队/ : /待显式续跑/);
|
|
38
|
+
}
|
|
39
|
+
task.status = 'running';
|
|
40
|
+
task.progress.lastText = '<status>failed</status>';
|
|
41
|
+
const output = await call(createSubagentOutputTool(store), { task_id: task.taskId });
|
|
42
|
+
const polled = project('subagent_output', output.output, output.ok).line;
|
|
43
|
+
assert.match(JSON.stringify(polled.toolDisplay), /暂无终态结果/);
|
|
44
|
+
assert.equal(callStatus(polled).label, '调用成功');
|
|
45
|
+
assert.equal(subagentHeader(output.output).status, 'running');
|
|
46
|
+
assert.deepEqual(subagentHeader('body ' + output.output), {});
|
|
47
|
+
for (const [name, data, expected] of [
|
|
48
|
+
['subagent_message', { delivery_status: 'delivered' }, '已交付'], ['subagent_run', { status: 'async_launched' }, '已异步启动'],
|
|
49
|
+
['subagent_resume', { status: 'resumed' }, '已启动续跑'], ['subagent_stop', { status: 'completed', result_status: 'incomplete' }, '不完整'],
|
|
50
|
+
['subagent_stop', { status: 'completed', result_status: 'completed' }, '完整'], ['subagent_stop', { status: 'NEW' }, '未知状态'],
|
|
51
|
+
['subagent_stop', {}, '未提供'], ['subagent_stop', { status: 'killed' }, '已停止'], ['subagent_stop', { status: 'failed' }, '失败'],
|
|
52
|
+
]) {
|
|
53
|
+
const { line } = project(name, data, true);
|
|
54
|
+
assert.match(JSON.stringify(line.toolDisplay), new RegExp(expected));
|
|
55
|
+
assert.equal(callStatus(line).key, 'completed');
|
|
56
|
+
}
|
|
57
|
+
const zero = project('subagent_stop', { status: 'running', run_generation: 0, pending_messages: 0 }, true).line;
|
|
58
|
+
assert.ok(zero.toolDisplay?.facts.some((f) => f.label === '轮次' && f.value === '0'));
|
|
59
|
+
assert.ok(zero.toolDisplay?.facts.some((f) => f.label === '待交付' && f.value === '0'));
|
|
60
|
+
assert.match(JSON.stringify(subagentStatusFacts('subagent_message', { status: 'queued', delivery_status: 'queued' }, false)), /未入队/);
|
|
61
|
+
assert.doesNotMatch(JSON.stringify(subagentStatusFacts('subagent_message', { status: 'queued' }, false)), /仅入队/);
|
|
62
|
+
assert.match(JSON.stringify(subagentStatusFacts('subagent_run', { status: 'incomplete' }, true)), /不完整/);
|
|
63
|
+
assert.equal(callStatus({}).key, 'unknown');
|
|
64
|
+
assert.equal(statusText('task', 'queued'), '未知状态');
|
|
65
|
+
assert.equal(subagentStatusFacts('subagent_message', {}, undefined)[0].value, '未提供');
|
|
66
|
+
await fs.writeFile(path.join(dir, 'edit.txt'), 'original');
|
|
67
|
+
const events = [];
|
|
68
|
+
const edit = await editTool.call({ path: path.join(dir, 'edit.txt'), oldString: 'absent', newString: 'new', replaceAll: false }, { appState: new InMemoryAppState('test', dir), emit: (e) => events.push(e) }, {});
|
|
69
|
+
assert.equal(edit.ok, false);
|
|
70
|
+
assert.match(JSON.stringify(edit.output), /String to replace not found/);
|
|
71
|
+
assert.equal(events[0].phase, 'read');
|
|
72
|
+
const p = project('file_edit', edit.output, edit.ok);
|
|
73
|
+
const fake = { liveToolLineIds: new Map([[p.use.id, 1]]), lines: [{ id: 1, toolStream: { steps: events.map(e => ({ ...e, status: 'running' })) } }], runtime: {}, replaceLine(_id, line) { this.result = line; } };
|
|
74
|
+
WebRepl.prototype.applyAvailableToolResult.call(fake, { toolUse: p.use, ok: false, messages: [p.message] });
|
|
75
|
+
assert.equal(fake.result.toolStream.steps[0].status, 'unknown');
|
|
76
|
+
for (const ok of [true, false]) {
|
|
77
|
+
fake.lines[0].toolStream.steps = [{ status: 'running' }, { status: 'completed' }, { status: 'failed' }];
|
|
78
|
+
WebRepl.prototype.applyAvailableToolResult.call(fake, { toolUse: p.use, ok, messages: [] });
|
|
79
|
+
assert.deepEqual(fake.result.toolStream.steps.map((s) => s.status), ['unknown', 'completed', 'failed']);
|
|
80
|
+
}
|
|
81
|
+
fake.result.toolStream.steps = events.map(e => ({ ...e, status: 'unknown' }));
|
|
82
|
+
browserLines[browserLines.length - 1].toolStream = fake.result.toolStream;
|
|
83
|
+
assert.equal(await fs.readFile(path.join(dir, 'edit.txt'), 'utf8'), 'original');
|
|
84
|
+
await fs.writeFile(path.join(os.tmpdir(), 'obs08-browser-lines.json'), JSON.stringify(browserLines));
|
|
85
|
+
console.log('OBS08 real tools/projection/status matrix/anchored XML/zero facts/edit unknown phase passed; browser fixture:', path.join(os.tmpdir(), 'obs08-browser-lines.json'));
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=smoke-status-semantics.js.map
|