Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
ad65115
Recognize direct exec results in the trajectory tool inventory
loopx-agent Nov 5, 2026
ce0cff2
fix(chat): reject non-string queued input actions
loopx-agent Nov 5, 2026
9016ba7
feat(research): compare real captured LoopX request usage
loopx-agent Nov 5, 2026
58c2bf2
Merge remote-tracking branch 'origin/main' into codex/workspace-20261…
loopx-agent Nov 5, 2026
d337d1c
Honor cross-turn delta independently of progressive context
loopx-agent Nov 5, 2026
3247dc4
test: isolate machine CLI smokes from model context transport
loopx-agent Nov 5, 2026
27dfa55
Honor scoped Todo resume conditions across external and managed sched…
loopx-agent Nov 5, 2026
7e96a8e
Audit active solver coverage across every selected benchmark arm
loopx-agent Nov 5, 2026
66d9b03
Merge current main into the captured research usage proposal
loopx-agent Nov 5, 2026
3d60d91
fix(runtime): preserve raw quota JSON for native goal admission
loopx-agent Nov 5, 2026
5e5e8e8
Merge remote-tracking branch 'origin/main' into codex/workspace-20261…
loopx-agent Nov 5, 2026
8a53e2b
feat(collaboration): share reader guidance and version return formatting
loopx-agent Nov 5, 2026
ebd97ba
fix(chat): open long returned answers at their beginning
loopx-agent Nov 5, 2026
200956f
test(lark): verify full versioned returns through body workers
loopx-agent Nov 5, 2026
c285ea7
feat(research): compare real captured LoopX request usage
loopx-agent Nov 5, 2026
f3c110c
fix(runtime): preserve raw quota JSON for native goal admission
loopx-agent Nov 5, 2026
4ec2b05
fix(research): show native command cache and output deltas
loopx-agent Nov 5, 2026
345b9d9
Preserve existing captured-usage proposal history
loopx-agent Nov 5, 2026
db5c28d
fix(chat): preserve queue edits when dismissing actions
loopx-agent Nov 5, 2026
2e33ec0
docs(readme): remove redundant budget disclosure sentence
loopx-agent Nov 5, 2026
3aa27b4
Merge readable collaboration returns with current main
loopx-agent Nov 5, 2026
b0be410
fix(collaboration): count budgets using persisted return format
loopx-agent Nov 5, 2026
c71fcfb
Merge reviewed Research usage proposal into current main for continue…
loopx-agent Nov 5, 2026
c3803a0
fix(research): compare uncached command request shares
loopx-agent Nov 5, 2026
a2e0eae
fix(context): preserve async reader handles in code-mode guidance
loopx-agent Nov 5, 2026
80fa42e
refactor(control-plane): isolate prompt upgrade CLI rendering
loopx-agent Nov 5, 2026
45e1ac6
test(control-plane): qualify complete continuation decisions
loopx-agent Nov 5, 2026
56efc98
fix(chat): answer exhausted requests through one restricted review
loopx-agent Nov 6, 2026
54e26ef
Merge pull request #8157 from loopx-project/codex/exhausted-answer-re…
loopx-agent Nov 6, 2026
e5acc77
fix(runtime): wait for launchd job removal during service handoff
loopx-agent Nov 6, 2026
927d0b3
Merge pull request #8159 from loopx-project/codex/managed-service-han…
loopx-agent Nov 6, 2026
58fc87b
Merge latest main into research usage comparison
loopx-agent Nov 6, 2026
03caf71
test(project): make the no-git registry fixture actually degrade the …
Weimr2627 Nov 6, 2026
7714ced
fix(research): distinguish declared retention from verified adoption
loopx-agent Nov 6, 2026
4db8702
fix(doctor): hold every Git read to one budget
gcl-coder Nov 5, 2026
4e8a992
fix(doctor): retire the probe's own group and keep a stale manifest out
gcl-coder Nov 6, 2026
28ded50
fix(doctor): retire the probe's session when the diagnostic is cancelled
gcl-coder Nov 6, 2026
ed53ff7
fix(chat): retain context-limit failures in pending work
loopx-agent Nov 6, 2026
24027a3
Merge pull request #8164 from loopx-project/codex/pending-context-lim…
loopx-agent Nov 6, 2026
e15a656
test(collaboration): recover complete per-turn delegation context
loopx-agent Nov 6, 2026
f91e26d
Merge pull request #8153 from gcl-coder/fix/doctor-git-probe-budget
huangruiteng Nov 6, 2026
e8dc9e1
Merge pull request #8112 from loopx-project/codex/queued-input-valida…
huangruiteng Nov 6, 2026
d515492
Merge pull request #8116 from loopx-project/codex/workspace-20261105-…
huangruiteng Nov 6, 2026
66b6df0
Merge pull request #8117 from loopx-project/codex/independent-native-…
huangruiteng Nov 6, 2026
586ae28
Merge pull request #8119 from loopx-project/codex/machine-smoke-conte…
huangruiteng Nov 6, 2026
036fdbd
Merge pull request #8135 from loopx-project/codex/scheduler-deferred-…
huangruiteng Nov 6, 2026
7bdae35
Merge pull request #8138 from loopx-project/codex/benchmark-four-arm-…
huangruiteng Nov 6, 2026
953b4f8
fix(lark): hold the collector's Git reads to one budget
gcl-coder Nov 5, 2026
23b532b
fix(lark): stop the collector's Git questions together with its budget
gcl-coder Nov 6, 2026
9e4215e
fix(lark): retire the probe's session when collector-plan is cancelled
gcl-coder Nov 6, 2026
38ccf56
Merge pull request #8149 from loopx-project/codex/readme-remove-budge…
huangruiteng Nov 6, 2026
b064cd5
Merge pull request #8150 from loopx-project/codex/queue-editor-menu-2…
huangruiteng Nov 6, 2026
2db1fd7
Merge pull request #8155 from loopx-project/codex/context-read-handle…
huangruiteng Nov 6, 2026
98d7a9f
Merge pull request #8165 from loopx-project/codex/unfinished-delegati…
huangruiteng Nov 6, 2026
f44c0ec
docs: define router-coordinated controller worker units
huangruiteng Nov 6, 2026
b4aa849
fix(chat): compact bounded history before new native turns
loopx-agent Nov 6, 2026
2b7d800
docs: prioritize controller attention with safe preemption
huangruiteng Nov 6, 2026
d648c70
Merge pull request #8167 from loopx-project/codex/native-history-comp…
loopx-agent Nov 6, 2026
e390f27
fix(runtime): pin qualified service executables behind CLI aliases
loopx-agent Nov 6, 2026
20419fa
docs: make controller worker execution the primary loop
huangruiteng Nov 6, 2026
a1feac4
Merge pull request #8163 from Weimr2627/weimr/registry-git-probe-stub
huangruiteng Nov 6, 2026
a91fae6
Merge pull request #8154 from gcl-coder/fix/lark-collector-git-budget
huangruiteng Nov 6, 2026
8a5c0a2
Merge pull request #8166 from loopx-project/codex/router-controller-r…
huangruiteng Nov 6, 2026
918844a
Merge pull request #8170 from loopx-project/codex/service-runtime-sym…
loopx-agent Nov 6, 2026
dd7a1c1
Pin the native first read and deliver the same-Turn selection route (…
loopx-agent Nov 6, 2026
39770a9
Read saved quota fields in the first native tool call (#8111)
loopx-agent Nov 6, 2026
66660e5
Avoid reparsing unchanged private delivery journals during discovery
loopx-agent Nov 6, 2026
6d42772
Verify captured vision audits and share them in one display request (…
loopx-agent Nov 6, 2026
56b10a0
Keep delivery discovery hints in their bounded provider module
loopx-agent Nov 6, 2026
10eecdc
Merge pull request #8172 from loopx-project/codex/private-delivery-di…
loopx-agent Nov 6, 2026
f87d997
Reuse unchanged observed acceptance and preference bodies in native f…
loopx-agent Nov 6, 2026
eca4fc0
Merge latest main into readable collaboration returns
huangruiteng Nov 6, 2026
313ef49
fix(canary): retain current main maintainability baseline
huangruiteng Nov 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ for other runtimes. Prefer a guided first run? [Choose a task below](#try-loopx)
- **2026-10-20 · 🚀 [LoopX 2.0](https://github.com/loopx-project/loopx/releases/tag/v2.0.0)** — A shared TypeScript control plane and long-horizon research workbench. [Migration guide](docs/product/releases/v2.0.0.md) · [Engineering story](https://loopx-project.github.io/loopx/blog/typescript-control-plane-refactor/).
- **2026-10-14 · 🤖 [Agentic software](https://loopx-project.github.io/loopx/blog/semantic-software-development/)** — Connecting goals, evidence and human feedback to engineering delivery.
- **2026-10-02 · 🧠 [Long-horizon bootstrapping & RSI](https://loopx-project.github.io/loopx/blog/long-horizon-rsi/)** — Four months of developing LoopX with LoopX: public project history and a design perspective on system-level self-improvement.
- **2026-09-18 · 🧪 [LoopX × LHTB](https://loopx-project.github.io/loopx/benchmarks/lhtb/)** — A 46-task, same-model study provides empirical support for **trading more compute for better outcomes**: LoopX Heartbeat mean reward is 17.3% above Plain Codex and 10.6% above native Goal. Budgets differ; methods and limits are disclosed.
- **2026-09-18 · 🧪 [LoopX × LHTB](https://loopx-project.github.io/loopx/benchmarks/lhtb/)** — A 46-task, same-model study provides empirical support for **trading more compute for better outcomes**: LoopX Heartbeat mean reward is 17.3% above Plain Codex and 10.6% above native Goal.
- **2026-09-06 · 🎉 [LoopX 1.0](https://github.com/loopx-project/loopx/releases/tag/v1.0.0)** — A Personal Agent Workspace to follow agent work, act on decisions, and inspect delivered results across sessions. [Workspace guide](https://github.com/loopx-project/loopx/blob/v1.0.0/docs/guides/personal-workspace-user-guide.md).
- **2026-08-02 · ⏱️ [200+ hour trajectories shared on X](https://x.com/huangruiteng/status/2083904257494024425)** — Early owner-run examples spanning 200+ elapsed hours drew broad attention on X, showing work across execution, waits, human decisions and recovery. [Trajectories and limits](#open-source-issue-fix).

Expand Down
67 changes: 63 additions & 4 deletions apps/presentation/dashboard/smoke/delegation-read-cancel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ for (const storage of ["file", "sqlite"]) {
const exited = once(child, "exit");
let stderr = "";
child.stderr.on("data", data => stderr += data);
type Event = {event: string; origin: string; posts: number; source_unchanged: boolean; chat_unchanged: boolean};
type Event = {event: string; origin: string; session_id?: string; posts: number; turn_count: number; source_unchanged: boolean; chat_unchanged: boolean};
const queue: Event[] = [], waiting: {kind: string; receive: (event: Event) => void}[] = [];
createInterface({input: child.stdout}).on("line", line => {
try {
Expand Down Expand Up @@ -54,8 +54,8 @@ for (const storage of ["file", "sqlite"]) {
await page.getByRole("navigation", {name: "管家视图"}).getByRole("button", {name: /^(Chat|对话)$/}).click();
await page.getByText("复核迁移说明中的示例", {exact: true}).filter({visible: true}).first().waitFor();
const before = await fixture("inspect");
const writes: string[] = [];
page.on("request", request => {if (request.method() !== "GET") writes.push(request.url());});
const writes: {url: string; method: string; body: unknown}[] = [];
page.on("request", request => {if (request.method() !== "GET") writes.push({url: request.url(), method: request.method(), body: request.postDataJSON()});});
const trigger = page.getByRole("button", {name: /委派,.*条待跟进/});
const dialog = page.getByRole("dialog", {name: "委派", exact: true});
const settled = () => page!.waitForFunction(() => document.querySelector(".conversation-requests-body")?.getAttribute("aria-busy") === "false");
Expand Down Expand Up @@ -159,8 +159,67 @@ for (const storage of ["file", "sqlite"]) {
assert.equal(await english.getByRole("button", {name: "All records", exact: true}).getAttribute("aria-pressed"), "true");
await page.keyboard.press("Escape");
}
// A completed long return opens at its answer, rather than its evidence
// tail. This uses the real publication, delivery and history owners.
await fixture("report-readable");
assert.equal(typeof ready.session_id, "string");
const history = await (await page.request.get(`${ready.origin}/api/chat/sessions/${ready.session_id}`)).json();
const complete = history.messages.filter((row: {origin: string}) => row.origin === "manager_followup").at(-1);
const provenance = complete.text.lastIndexOf("\n\n处理结论 · builder · 委托 ");
assert.ok(provenance > 0);
assert.equal([...complete.text.slice(0, provenance)].length, 20000, "The actual publication and history preserve the full result budget");
for (const width of [1440, 390]) {
await page.setViewportSize({width, height: width === 390 ? 844 : 900});
await page.getByRole("button", {name: /^(总览|Overview)$/}).click();
await page.getByRole("button", {name: /^(对话|Chat)$/}).click();
const returned = page.locator(".personal-message.is-assistant").last();
await returned.getByText("迁移方案还不能直接上线,原导出路径继续保留。", {exact: true}).waitFor();
await page.waitForFunction(() => {
const viewport = document.querySelector(".personal-channel-scroll")!.getBoundingClientRect();
const row = [...document.querySelectorAll(".personal-message.is-assistant")].at(-1)!;
const answer = row.querySelector(".personal-md > p")!.getBoundingClientRect();
const delivery = row.querySelector(".personal-return-delivery")!.getBoundingClientRect();
return answer.top >= viewport.top && answer.bottom <= viewport.bottom
&& delivery.top >= viewport.top && delivery.bottom <= viewport.bottom;
}).catch(async error => {
console.error(JSON.stringify(await page.evaluate(() => ({
viewport: document.querySelector(".personal-channel-scroll")?.getBoundingClientRect().toJSON(),
scroll: document.querySelector(".personal-channel-scroll")?.scrollTop,
last: [...document.querySelectorAll(".personal-message.is-assistant")].at(-1)?.getBoundingClientRect().toJSON(),
answer: [...document.querySelectorAll(".personal-message.is-assistant")].at(-1)?.querySelector(".personal-md > p")?.getBoundingClientRect().toJSON(),
}))));
throw error;
});
const full = await returned.innerText();
assert.match(full, /完整运行费用.*缺测不能按零计算/);
assert.match(full, /没有追加模型改写/);
assert.match(full, /完整预算边界答复结束。/);
assert.match(full, /隔离安装包就绪后由原负责人继续,不触碰生产会话/);
assert.doesNotMatch(full, /Remaining work|Continue when/);
assert.ok(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 1));
await page.screenshot({path: resolve(output, `reader-${storage}-${width}.png`)});
await page.getByRole("button", {name: /回到最新消息|Latest message/}).click();
await page.setViewportSize({width, height: width === 390 ? 820 : 880});
await page.waitForFunction(() => {
const viewport = document.querySelector(".personal-channel-scroll")!;
return viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight < 2;
});
await returned.getByRole("link", {name: /单独阅读完整答复|Read full answer separately/}).scrollIntoViewIfNeeded();
assert.ok(await returned.getByText("还需核验安装包中的字段映射和失败恢复。", {exact: true}).isVisible());
}
// Opening/reloading the existing conversation attempts its normal Session
// resume (the read-only fixture rejects POST). It must never submit input,
// start a Turn or dispatch a model. Inventory reading above remains GET-only.
const resumes = storage === "sqlite" ? 5 : 4;
assert.deepEqual(writes, Array.from({length: resumes}, () => ({url: ready.origin + "/api/chat/sessions",
method: "POST", body: {goal_id: "", mode: "resume_latest", context_kind: "manager"}})));
const readerAfter = await fixture("inspect");
assert.equal(readerAfter.posts, before.posts + resumes);
assert.equal(readerAfter.turn_count, before.turn_count);
assert.deepEqual(errors, []);
results.push({storage, requests: 61, originalBodyChars: [...body].length, sourceUnchanged: true,
initial: true, filterRetry: true, staleSearch: true, more: true, multiWindow: true, sourceRecovery: true, writes: 0});
initial: true, filterRetry: true, staleSearch: true, more: true, multiWindow: true, sourceRecovery: true,
returnedAnswerStart: true, completeReaderBody: true, inventoryWrites: 0, readerSessionResumes: resumes, readerTurnsStarted: 0});
} finally {
// Release before shutdown: cancelled clients do not stop server work.
child.stdin.write("release\nstop\n");
Expand Down
Loading
Loading