feat: update session workspace flow and web ui
This commit is contained in:
@@ -117,6 +117,17 @@ async function uploadAttachment(port, token, { filename, mime, data }) {
|
||||
return payload.attachment;
|
||||
}
|
||||
|
||||
async function fetchAuthedJson(port, token, pathname) {
|
||||
const response = await fetch(`http://127.0.0.1:${port}${pathname}`, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
const payload = await response.json();
|
||||
assert(response.ok && payload.ok, `Request failed for ${pathname}: ${payload.message || response.status}`);
|
||||
return payload;
|
||||
}
|
||||
|
||||
function nextMessage(messages, ws, predicate, timeoutMs = 15000) {
|
||||
const callSite = (() => {
|
||||
const stack = String(new Error().stack || '').split('\n');
|
||||
@@ -333,6 +344,22 @@ async function main() {
|
||||
|
||||
await nextMessage(messages, ws, (msg) => msg.type === 'session_list');
|
||||
|
||||
const pickerRoot = path.join(homeDir, 'picker-root');
|
||||
mkdirp(path.join(pickerRoot, 'alpha'));
|
||||
mkdirp(path.join(pickerRoot, 'beta'));
|
||||
fs.writeFileSync(path.join(pickerRoot, 'note.txt'), 'not a directory');
|
||||
|
||||
ws.send(JSON.stringify({ type: 'new_session', agent: 'codex', mode: 'plan' }));
|
||||
const defaultCodexSession = await nextMessage(messages, ws, (msg) => msg.type === 'session_info' && msg.agent === 'codex' && msg.title === 'New Chat');
|
||||
assert(defaultCodexSession.cwd === homeDir, 'Codex new_session without cwd should default to HOME');
|
||||
|
||||
const directoryPayload = await fetchAuthedJson(port, token, `/api/fs/directories?path=${encodeURIComponent(pickerRoot)}`);
|
||||
assert(directoryPayload.currentPath === pickerRoot, 'Directory picker should return requested absolute path');
|
||||
assert(directoryPayload.defaultPath === homeDir, 'Directory picker should expose HOME as default path');
|
||||
assert(directoryPayload.entries.some((entry) => entry.name === 'alpha'), 'Directory picker should list child directories');
|
||||
assert(directoryPayload.entries.some((entry) => entry.name === 'beta'), 'Directory picker should include all child directories');
|
||||
assert(!directoryPayload.entries.some((entry) => entry.name === 'note.txt'), 'Directory picker should hide files');
|
||||
|
||||
ws.send(JSON.stringify({
|
||||
type: 'save_codex_config',
|
||||
config: {
|
||||
@@ -356,6 +383,11 @@ async function main() {
|
||||
assert(codexSession.mode === 'plan', 'Codex new_session should follow requested mode');
|
||||
assert(codexSession.model === 'gpt-5.4', 'Codex new_session should inject default model gpt-5.4');
|
||||
|
||||
ws.send(JSON.stringify({ type: 'list_cwd_suggestions' }));
|
||||
const cwdSuggestions = await nextMessage(messages, ws, (msg) => msg.type === 'cwd_suggestions');
|
||||
assert(cwdSuggestions.defaultPath === homeDir, 'CWD suggestions should expose HOME as default path');
|
||||
assert(Array.isArray(cwdSuggestions.paths) && cwdSuggestions.paths.includes(codexInitCwd), 'CWD suggestions should include recently used session directories');
|
||||
|
||||
ws.send(JSON.stringify({ type: 'message', text: '/init', sessionId: codexSession.sessionId, mode: 'plan', agent: 'codex' }));
|
||||
const codexInitStart = await nextMessage(messages, ws, (msg) => msg.type === 'system_message' && /AGENTS\.md/.test(msg.message || ''));
|
||||
assert(/AGENTS\.md/.test(codexInitStart.message || ''), 'Codex /init should announce AGENTS.md generation');
|
||||
|
||||
Reference in New Issue
Block a user