Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
423ebb2
fix(control-plane): read delegation registry through the refusing loader
Oct 26, 2026
5e339ee
fix(research): make input totals and cache subsets readable
loopx-agent Oct 26, 2026
e5a72a0
feat(explore): inherit machine exploration mode across Goals
huangruiteng Oct 26, 2026
61133fc
fix(chat): retain workspace readers across steward navigation
loopx-agent Oct 26, 2026
4c7e7a8
docs: strengthen README community and contributor recognition
loopx-agent Oct 26, 2026
1122853
docs(chat): reconcile background-history acceptance
loopx-agent Oct 26, 2026
2953354
Merge pull request #7391 from loopx-project/codex/research-input-deno…
huangruiteng Oct 26, 2026
8cb50a2
Merge pull request #7394 from loopx-project/codex/readme-community-co…
huangruiteng Oct 26, 2026
c5b1129
docs: move README community section to the footer
loopx-agent Oct 26, 2026
0cb32b0
fix(workspace): stop the read-only source badge from repeating the Go…
JasonBuildAI Oct 26, 2026
de11f06
Merge pull request #7396 from loopx-project/codex/readme-community-pl…
huangruiteng Oct 26, 2026
cdbdc14
Merge pull request #7393 from loopx-project/codex/chat-history-readin…
huangruiteng Oct 26, 2026
bacb4d1
fix(chat): continue explicitly unfinished project work once
loopx-agent Oct 26, 2026
1163ada
Merge pull request #7386 from loopx-project/codex/fix-delegation-cont…
huangruiteng Oct 26, 2026
cd819fd
Merge pull request #7380 from JasonBuildAI/codex/agent-j3w9
huangruiteng Oct 26, 2026
15803cd
Merge pull request #7399 from loopx-project/codex/native-incomplete-w…
loopx-agent Oct 26, 2026
92f739a
Repair Explore inheritance across completion and Goal settings
loopx-agent Oct 26, 2026
9b2de93
Fix Explore material refresh runtime selection
loopx-agent Oct 26, 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
105 changes: 61 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -578,50 +578,6 @@ separates shipped foundations from the next end-to-end acceptance milestones.

</details>

## Contributing

Help make long-horizon Agent work easier to run, inspect and trust.
Contributions can start with a host integration, a reproducible bug, a
documented workflow or a carefully bounded evidence study.

External contributors should start with
[Contributor Tasks](docs/development/contributor-tasks.md) for public, claimable work and
[Contributing](CONTRIBUTING.md) for setup, validation, and boundary rules.
Project roles and public history are recorded in
[Governance](.github/GOVERNANCE.md),
[Authors and Contributors](docs/project/authors.md), and
[Project History](docs/project/history.md).

LoopX keeps local active state separate from the public repository. Do not
commit `.loopx/`, legacy `.codex/goals/`, live `ACTIVE_GOAL_STATE.md`, raw benchmark
traces, credentials, private logs, or operator artifacts.

<a id="community--feedback"></a>

## Community and Feedback

LoopX is already running real long-running agent goals and is under active
development. The most useful feedback comes from real long-running agent
projects: where the control plane helped, where it felt heavy, and which gates
or handoffs disappeared from view.

- Use [GitHub Issues](https://github.com/loopx-project/loopx/issues) for
reproducible bugs, install problems, and feature requests.
- Open PRs for docs fixes, showcase writeups, and small public-safe examples.
- Join the [Discord community](https://discord.gg/XmGgQyCFZd), or use Lark or
WeChat below.

See [Support](.github/SUPPORT.md) for channel routing, service boundaries, and
official publication sources.

<p align="center">
<a href="docs/assets/loopx-lark-developer-group.png"><img src="docs/assets/loopx-lark-developer-group.png" alt="LoopX Lark developer group QR code" width="280"></a>
<a href="docs/assets/loopx-wechat-contact.png"><img src="docs/assets/loopx-wechat-contact.png" alt="LoopX WeChat contact QR code" width="220"></a>
</p>
<p align="center">
<sub><strong>Lark:</strong> scan to join directly<br><strong>WeChat: <code>huangrt00</code></strong> · mention LoopX in the friend request</sub>
</p>

## Partner Projects

LoopX welcomes collaboration with other open-source projects to build the
Expand Down Expand Up @@ -894,6 +850,67 @@ Current investment is organized through the
benchmark evidence, operator surface and IM integration, shared-goal cross-host
coordination, and an explicitly staged architecture and research incubator.

<a id="contributing"></a>
<a id="community--feedback"></a>

## Community & Contributing

Help shape how long-horizon Agent teams work. Share a workflow, reproduce a
bug, build an integration, or show what your Agents accomplished. Code,
documentation, examples, reviews and carefully bounded evidence studies are
all welcome.

- **Learn:** [Documentation](https://loopx-project.github.io/loopx/docs/) ·
[Blog](https://loopx-project.github.io/loopx/blog/) ·
[Technical directions](docs/project/technical-directions.md).
- **Discuss and share:** ask questions, compare workflows and share projects in
[GitHub Discussions](https://github.com/loopx-project/loopx/discussions).
- **Report a bug or suggest a feature:** open a
[GitHub Issue](https://github.com/loopx-project/loopx/issues/new/choose) with
your version, host/runtime, expected behavior and a public-safe reproduction.
- **Make your first contribution:** pick a public task from
[Contributor Tasks](docs/development/contributor-tasks.md), or bring a
self-contained fix. The [contribution guide](CONTRIBUTING.md) covers setup,
validation and the PR process; larger changes start with a discussion.
- **Join the conversation:** [Discord](https://discord.gg/XmGgQyCFZd) ·
[Lark](docs/assets/loopx-lark-developer-group.png) ·
[WeChat](docs/assets/loopx-wechat-contact.png).

See [Support](.github/SUPPORT.md) for channel routing and official sources, and
our [Code of Conduct](CODE_OF_CONDUCT.md) for community participation.

<details>
<summary>Before sharing code, logs or examples</summary>

Keep `.loopx/`, legacy `.codex/goals/`, live `ACTIVE_GOAL_STATE.md`, raw Agent
sessions and benchmark traces, credentials, private logs, internal links,
sensitive user/team data and operator artifacts out of public contributions.

</details>

### Contributors

Thank you to everyone contributing code, documentation, bug reports, reviews
and real-world feedback. You help make long-horizon Agent work easier to run,
inspect and trust.

[![LoopX GitHub contributors](https://contrib.rocks/image?repo=loopx-project/loopx&columns=12&max=120)](https://github.com/loopx-project/loopx/graphs/contributors)

[All GitHub contributors](https://github.com/loopx-project/loopx/graphs/contributors) ·
[Authors and contribution records](docs/project/authors.md) ·
[Governance](.github/GOVERNANCE.md) · [Project history](docs/project/history.md) ·
[Name and marks](docs/project/trademarks.md).

### Community chats

<p align="center">
<a href="docs/assets/loopx-lark-developer-group.png"><img src="docs/assets/loopx-lark-developer-group.png" alt="LoopX Lark developer group QR code" width="280"></a>
<a href="docs/assets/loopx-wechat-contact.png"><img src="docs/assets/loopx-wechat-contact.png" alt="LoopX WeChat contact QR code" width="220"></a>
</p>
<p align="center">
<sub><strong>Lark:</strong> scan to join directly<br><strong>WeChat: <code>huangrt00</code></strong> · mention LoopX in the friend request</sub>
</p>

## Star History

<p align="center">
Expand Down
97 changes: 57 additions & 40 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -516,46 +516,6 @@ provider 的打包和生命周期,不是另一个控制面 owner。详见

</details>

## 贡献

一起让长程 Agent 工作更容易运行、检查和信任。可以从宿主集成、可复现问题、
工作流文档或边界清楚的证据研究开始。

公开、可认领的任务见 [Contributor Tasks](docs/development/contributor-tasks.md)。贡献前请读
[Contributing](CONTRIBUTING.md),尤其是 public/private 边界、smoke 保留规则和
benchmark 证据边界。

项目角色与维护权限见 [Governance](.github/GOVERNANCE.md),创建者与贡献者归属见
[Authors and Contributors](docs/project/authors.md),关键公开演进见
[Project History](docs/project/history.md),名称与标识使用见
[Name and Marks](docs/project/trademarks.md)。

不要提交 `.loopx/`、`.codex/goals/`、live `ACTIVE_GOAL_STATE.md`、内部链接、
raw benchmark task/log/trajectory/verifier output、credentials、token、私有路径或
未脱敏的用户与团队信息。

## 用户群与反馈

LoopX 已在真实长程 agent 目标上持续运行,并处于活跃迭代期。最需要真实长程
agent 项目里的反馈:控制面帮到了哪里、哪里太重,哪些 gate、handoff 或 scope
仍然不够清楚。

- 可复现 bug、安装问题、功能建议:请提
[GitHub Issue](https://github.com/loopx-project/loopx/issues)。
- 文档修正、showcase 补充、小型 public-safe 示例:欢迎开 PR。
- 参与社区讨论:可加入 [Discord 社区](https://discord.gg/XmGgQyCFZd),也可在
下方直接加入飞书群或通过微信申请入群。

渠道分工、支持边界和官方发布源见 [Support](.github/SUPPORT.md)。

<p align="center">
<a href="docs/assets/loopx-lark-developer-group.png"><img src="docs/assets/loopx-lark-developer-group.png" alt="LoopX 飞书开发群二维码" width="280"></a>
<a href="docs/assets/loopx-wechat-contact.png"><img src="docs/assets/loopx-wechat-contact.png" alt="LoopX 微信联系人二维码" width="220"></a>
</p>
<p align="center">
<sub><strong>飞书:</strong>扫码直接加入<br><strong>微信:<code>huangrt00</code></strong> · 好友申请备注 LoopX</sub>
</p>

## 合作伙伴项目

LoopX 欢迎与其他开源项目协作,共建长程 Agent 生态。已确认的合作伙伴包括:
Expand Down Expand Up @@ -799,6 +759,63 @@ integration 和进阶路径仍是 optional、default-off 或 experimental。Loop
benchmark 证据、operator surface 与 IM integration、shared-goal 跨 host 协作,以及
明确分阶段的架构与研究孵化器。

<a id="贡献"></a>
<a id="用户群与反馈"></a>

## 社区与贡献

一起探索长程 Agent 团队的工作方式。分享你的工作流、复现一个问题、接入新的宿主,
或展示 Agent 做出的成果。代码、文档、示例、评审和边界清楚的证据研究,都欢迎参与。

- **了解项目:**[使用文档](https://loopx-project.github.io/loopx/docs/) ·
[技术博客](https://loopx-project.github.io/loopx/blog/zh/) ·
[技术方向](docs/project/technical-directions.md)。
- **提问与分享:** 在 [GitHub Discussions](https://github.com/loopx-project/loopx/discussions)
交流使用问题、比较工作流、展示你的项目。
- **报告问题或建议功能:** 提交
[GitHub Issue](https://github.com/loopx-project/loopx/issues/new/choose),说明版本、
宿主/运行时、预期行为,并附上可公开的复现步骤。
- **开始第一次贡献:** 从 [Contributor Tasks](docs/development/contributor-tasks.md)
选择公开任务,也可以直接提交独立完整的修复。
[贡献指南](CONTRIBUTING.md)介绍环境搭建、验证与 PR 流程;较大改动请先讨论。
- **加入交流:**[Discord](https://discord.gg/XmGgQyCFZd) ·
[飞书开发群](docs/assets/loopx-lark-developer-group.png) ·
[微信](docs/assets/loopx-wechat-contact.png)。

渠道分工、支持边界和官方发布源见 [Support](.github/SUPPORT.md),
社区参与约定见[行为准则](CODE_OF_CONDUCT.md)。

<details>
<summary>分享代码、日志或示例之前</summary>

不要提交 `.loopx/`、`.codex/goals/`、live `ACTIVE_GOAL_STATE.md`、内部链接、
原始 Agent 会话、raw benchmark task/log/trajectory/verifier output、credentials、
token、私有日志、私有路径、操作员产物或未脱敏的用户与团队信息。

</details>

### 贡献者

感谢每一位贡献代码、文档、问题报告、评审和真实使用反馈的朋友。
你们让长程 Agent 工作更容易运行、检查和信任。

[![LoopX GitHub 贡献者](https://contrib.rocks/image?repo=loopx-project/loopx&columns=12&max=120)](https://github.com/loopx-project/loopx/graphs/contributors)

[全部 GitHub 贡献者](https://github.com/loopx-project/loopx/graphs/contributors) ·
[创建者与贡献记录](docs/project/authors.md) ·
[项目治理](.github/GOVERNANCE.md) · [项目历史](docs/project/history.md) ·
[名称与标识](docs/project/trademarks.md)。

### 社区群聊

<p align="center">
<a href="docs/assets/loopx-lark-developer-group.png"><img src="docs/assets/loopx-lark-developer-group.png" alt="LoopX 飞书开发群二维码" width="280"></a>
<a href="docs/assets/loopx-wechat-contact.png"><img src="docs/assets/loopx-wechat-contact.png" alt="LoopX 微信联系人二维码" width="220"></a>
</p>
<p align="center">
<sub><strong>飞书:</strong>扫码直接加入<br><strong>微信:<code>huangrt00</code></strong> · 好友申请备注 LoopX</sub>
</p>

## Star 趋势

<p align="center">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
import assert from "node:assert/strict";

import { changeStewardExecutorDraft, goalReplanCadenceEditorValue, goalReplanCadenceWriteValue, hasReplanCadenceOverride, goalStorageEditorValue, parseEditableCapabilityJson, projectEditableCapabilityConfiguration, replanCadenceEditorDefaults } from "../src/data/capability-configuration.js";
import { changeStewardExecutorDraft, goalExploreEditorValue, goalExploreWriteValue, goalReplanCadenceEditorValue, goalReplanCadenceWriteValue, hasReplanCadenceOverride, goalStorageEditorValue, parseEditableCapabilityJson, projectEditableCapabilityConfiguration, replanCadenceEditorDefaults } from "../src/data/capability-configuration.js";

const exploreEditor = {fields: [{key: "mode"}, {key: "profile"}, {key: "composition_mode"}, {key: "composition_scope_id", nullable: true}]};
const exploreEffective = {mode: "planning", profile: "generic", composition_mode: "disabled", composition_scope_id: null};
for (const current of [{profile: "adaptive-resilient"}, {composition_mode: "explicit_only", composition_scope_id: "bounded-scope"}]) {
const draft = projectEditableCapabilityConfiguration(exploreEditor, goalExploreEditorValue(current, exploreEffective));
assert.equal(draft.mode, "planning", "sparse Goal overrides display the live inherited mode");
assert.equal(Object.hasOwn(goalExploreWriteValue({...draft, profile: "generic"}, false), "mode"), false,
"saving another field must not pin the inherited mode");
assert.equal(goalExploreWriteValue({...draft, mode: "off"}, true).mode, "off", "an explicit off choice remains writable");
const json = parseEditableCapabilityJson(exploreEditor, JSON.stringify(goalExploreWriteValue(draft, false)))!;
assert.equal(Object.hasOwn(json, "mode"), false, "form to JSON preserves inheritance intent");
assert.equal(projectEditableCapabilityConfiguration(exploreEditor, json, exploreEffective).mode, "planning",
"sparse JSON returning to the form displays the effective mode");
}
assert.equal(goalExploreEditorValue({mode: "evidence"}, exploreEffective).mode, "evidence",
"stored explicit modes win even when device preferences change");

const codexDraft = { executor_endpoint: "codex", executor_model: "gpt-fixture", executor_reasoning_effort: "high", selection_policy: "preferred" };
const managedDraft = changeStewardExecutorDraft(codexDraft, "executor_endpoint", "dsh");
Expand Down
15 changes: 11 additions & 4 deletions apps/presentation/dashboard/smoke/chat-model-menu-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,17 @@ try {
assert.doesNotMatch(goal, /goal-only-model|Fast|personal-chat-model-menu/, "The Goal reading header leaves sending choices in the single composer");
assert.doesNotMatch(goal, /gpt-6\.1-sol/, "Goal readback does not inherit the steward model");
const linked = header("idle", { readOnlySourceLabel: "Historical run", selectedGoal: { goalId: "source-case", title: "Historical run", agentLanes: [] } });
const sourceBadge = linked.match(/class="personal-read-only-source"[^>]*>(.*?)<\/span>/)?.[1] ?? "";
assert.match(sourceBadge, new RegExp(locale === "zh-CN" ? "只读" : "Read only"));
assert.doesNotMatch(sourceBadge, /Historical run/, "The source badge does not repeat the visible Goal title");
assertions += 32;
// The persistent badge is its trigger name and visible text. Its disclosure
// panel is opened on demand and may explain the same source once.
const badgeStart = linked.indexOf('class="personal-read-only-source"');
const badgeEnd = linked.indexOf('class="personal-channel-actions"', badgeStart);
const badge = linked.slice(badgeStart, badgeEnd > badgeStart ? badgeEnd : undefined)
.replace(/<div [^>]*class="context-help-popover"[\s\S]*?<\/div>/, "");
assert.match(badge, new RegExp(locale === "zh-CN" ? "只读" : "Read only"));
assert.doesNotMatch(badge, /Historical run/, "The read-only source badge does not repeat the visible Goal title");
const distinct = header("idle", { readOnlySourceLabel: "Remote build", selectedGoal: { goalId: "source-case", title: "Public Goal", agentLanes: [] } });
assert.match(distinct, /class="personal-read-only-source-label"[^>]*>Remote build</, "A source the Goal title does not name stays visible in the badge");
assertions += 33;
}
console.log(`Chat model/header: ${assertions} bilingual model, defaults and accessible refresh assertions passed (SSR only)`);
} finally { globalThis.window = originalWindow; }
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ try {
assert.equal((await next()).recovered, true);
requests.length = 0;
const restored = await fetchChatHistory(options, partial);
assert.deepEqual(requests, ["/api/chat/sessions/old"], "Recovery reads only the missing session");
assert.deepEqual(requests.map(request => new URL(request, origin).pathname),
["/api/chat/sessions/old"], "Recovery reads only the missing session");
assert.deepEqual(restored.unavailableSessionIds, []);
assert.deepEqual(restored.messages.map(row => row.text), ["Earlier public report", "Current public report"]);
assert.deepEqual(restored.messages.map(row => row.session_id), ["old", "current"], "Colliding IDs preserve both sessions");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ try {
assert.ok((await (await recoveredRead).text()).includes("Revised checked result"), "A non-current conversation recovers before navigation back");
await page.locator(".personal-manager-link").click();
await chat();
assert.equal(await composer.inputValue(), "Keep this draft while original history recovers.",
"Goal navigation and background recovery must preserve the steward draft");
await page.getByText("Revised checked result", { exact: true }).waitFor({ state: "visible" });
assert.equal(await page.getByText("First checked result", { exact: true }).count(), 1);
assert.equal(await page.getByText("Revised checked result", { exact: true }).count(), 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,18 @@ export function goalReplanCadenceWriteValue(
return value;
}

/** Sparse Goal settings display live inherited fields without pinning them. */
export function goalExploreEditorValue(current: unknown, effective: unknown): Record<string, unknown> {
return {...configurationObject(effective), ...configurationObject(current)};
}

/** Only a stored or deliberately edited mode becomes a Goal override. */
export function goalExploreWriteValue(draft: Record<string, unknown>, modeOverride: boolean): Record<string, unknown> {
const value = {...draft};
if (!modeOverride) delete value.mode;
return value;
}

/** A v0 storage selector did not enable creation; opening Settings must not. */
export function goalStorageEditorValue(value: unknown): unknown {
const record = configurationObject(value);
Expand Down
Loading
Loading