Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
ee4472f
feat(dash): live single-page session dash panel (`loopx dash`) (#2897)
xiaods Aug 8, 2026
f7e99f0
fix(dash): guard missing latest run in goal projection
xiaods Aug 9, 2026
e678401
Merge pull request #2997 from xiaods/codex/dash-none-run-fix
huangruiteng Aug 9, 2026
b53689d
feat(dashboard): simplify personal goal workspace
maxliux5 Aug 8, 2026
0da634e
feat(chat): add local codex goal chat
maxliux5 Aug 8, 2026
3c536cb
feat(chat): integrate goal workspace decisions
maxliux5 Aug 8, 2026
8d27828
docs(dashboard): define goal chat workspace
maxliux5 Aug 8, 2026
8fc094e
test(dashboard): cover goal chat decisions
maxliux5 Aug 8, 2026
2edf858
fix(dashboard): keep status shortcuts deterministic
maxliux5 Aug 8, 2026
58996d4
feat(chat): add durable agent session runtime
maxliux5 Aug 9, 2026
3ea676d
feat(chat): stream and recover goal conversations
maxliux5 Aug 9, 2026
60030b1
test(chat): cover streaming session lifecycle
maxliux5 Aug 9, 2026
5d57be9
docs(contributing): pin explicit integration PR bases
maxliux5 Aug 9, 2026
d18ef3f
fix(chat): satisfy integration validation gates
maxliux5 Aug 9, 2026
e5b4040
chore: sync main into frontend control plane prototype
maxliux5 Aug 9, 2026
b3ce236
fix(ci): select main baseline for integration syncs
maxliux5 Aug 9, 2026
4b82c16
Merge pull request #3002 from huangruiteng/codex/frontend-main-confli…
maxliux5 Aug 9, 2026
4cf109e
feat(dash): show per-goal todo breakdown column
xiaods Aug 9, 2026
7c95950
chore: sync Goal Chat with frontend control plane
maxliux5 Aug 9, 2026
cda3cf4
Merge pull request #3003 from xiaods/codex/dash-todo-breakdown
huangruiteng Aug 9, 2026
fd17b09
Merge pull request #3001 from huangruiteng/codex/frontend-control-pla…
maxliux5 Aug 9, 2026
5d98d5f
chore: sync latest main into frontend prototype
maxliux5 Aug 9, 2026
807b98f
Merge pull request #3005 from huangruiteng/codex/frontend-main-confli…
maxliux5 Aug 9, 2026
756247f
feat(dash): surface waiting lane host-neutral as agent
xiaods Aug 9, 2026
2b1e048
Merge pull request #3006 from xiaods/codex/dash-agent-centric2
huangruiteng Aug 9, 2026
1cb63db
Merge remote-tracking branch 'origin/main' into codex/control-plane-s…
Aug 10, 2026
c101698
fix(chat): recover and isolate durable agent sessions
Aug 10, 2026
a7e396a
fix(dashboard): start complete local control plane
Aug 10, 2026
f9bcc5d
feat(chat): add multi-provider agent adapters
Aug 10, 2026
9934b36
feat(dashboard): refine multi-agent chat experience
Aug 10, 2026
69d0ce2
fix(chat): restore local history across restarts
Aug 10, 2026
2bf5c06
fix(dashboard): gate agents by chat adapter
maxliux5 Aug 10, 2026
f656e5b
Merge pull request #3050 from huangruiteng/codex/control-plane-sessio…
maxliux5 Aug 10, 2026
4357ffe
merge: sync chat adapter fix with latest prototype
maxliux5 Aug 10, 2026
1c04bc3
Merge pull request #3051 from huangruiteng/codex/chat-adapter-capabil…
maxliux5 Aug 10, 2026
62e21bb
feat(chat): add owner-local ACP endpoints
Aug 10, 2026
5698938
docs(chat): document ACP endpoint binding
Aug 10, 2026
dc54a0d
feat(chat): stream and recover active turns
Aug 10, 2026
1b22568
docs(chat): define streaming recovery contract
Aug 10, 2026
1f01dc4
fix(chat): preserve conversational agent sessions
Aug 10, 2026
86c6e09
fix(dashboard): present interrupted chat turns cleanly
Aug 10, 2026
d01e4c2
docs(chat): clarify codex conversation mode
Aug 10, 2026
49ca982
Merge pull request #3052 from huangruiteng/codex/chat-endpoint-acp
maxliux5 Aug 11, 2026
f53bcd4
fix(chat): batch streaming persistence
Aug 11, 2026
93003a2
test(chat): bound streaming persistence cost
Aug 11, 2026
b39fc3e
docs(chat): define buffered streaming durability
Aug 11, 2026
6845401
feat(dashboard): add one-command local launcher
Aug 11, 2026
72f566c
docs(dashboard): document one-command startup
Aug 11, 2026
1157796
Merge remote-tracking branch 'origin/frontend-control-plane-im-protot…
Aug 11, 2026
5b70701
fix(dashboard): auto-select compatible nvm node
Aug 11, 2026
d6ec24d
perf(status): keep repository audits off dashboard hot path
maxliux5 Aug 11, 2026
52ec3a3
docs(dashboard): document deferred boundary audit
maxliux5 Aug 11, 2026
7609cea
Merge pull request #3073 from huangruiteng/codex/chat-endpoint-acp
maxliux5 Aug 11, 2026
a28a7f3
feat(quota): per-goal token/cost/duration capture + dashboard surfaci…
NIU-123370 Aug 12, 2026
9af08c3
Add recoverable Agent action control plane
maxliux5 Aug 12, 2026
6c8d91b
Build personal Agent workspace
maxliux5 Aug 12, 2026
3774d45
Validate personal workspace end to end
maxliux5 Aug 12, 2026
b616d6c
Align monitors with RFC lifecycle
maxliux5 Aug 12, 2026
f5effe6
Refine personal workspace UX: kanban tasks, brutal theme, composer fixes
maxliux5 Aug 13, 2026
19270f0
Update personal workspace acceptance for kanban actions and theme
maxliux5 Aug 13, 2026
34caa22
Merge pull request #3149 from huangruiteng/codex/personal-agent-works…
maxliux5 Aug 13, 2026
650a2bc
docs(guides): add personal Agent workspace trial guide
maxliux5 Aug 13, 2026
0ab92eb
docs(guides): add FAQ section to the workspace trial guide
maxliux5 Aug 13, 2026
21530d5
Surface per-goal token, cost, and duration in the personal workspace …
maxliux5 Aug 13, 2026
4ffd2ac
Project Goal Channel Lark notification binding state into status
maxliux5 Aug 13, 2026
3addbc1
Personal workspace: morning digest, worker strip, goal notification c…
maxliux5 Aug 13, 2026
d851afa
Add personal workspace optimization plan document
maxliux5 Aug 13, 2026
ee35f9f
Turn gated gate.resolve proposals into actionable CLI guidance
maxliux5 Aug 13, 2026
fe38dfd
Personal workspace: in-page Lark notification settings panel
maxliux5 Aug 13, 2026
eca2047
feat(lark): connect goals through reusable topic bindings
maxliux5 Aug 14, 2026
93857e0
feat(workspace): add lark connection management
maxliux5 Aug 14, 2026
4f88888
test(lark): cover goal topic connection flow
maxliux5 Aug 14, 2026
1f22681
fix(control-plane): keep empty channel state off status hot path
maxliux5 Aug 14, 2026
f292456
docs: remove private workspace planning note
maxliux5 Aug 14, 2026
c5d87db
refactor(chat): isolate lark connection api
maxliux5 Aug 14, 2026
ece816a
Merge pull request #3160 from huangruiteng/codex/personal-workspace-t…
maxliux5 Aug 14, 2026
28fd689
feat(lark): route goal topic messages into sessions
maxliux5 Aug 15, 2026
bdc1cf0
feat(workspace): connect Lark apps and inspect sessions
maxliux5 Aug 15, 2026
91d4ecb
fix(workspace): report dashboard launch failures
maxliux5 Aug 15, 2026
c6ca6de
feat(workspace): simplify goal activity and expose session records
maxliux5 Aug 15, 2026
9396fd3
test(workspace): cover goal views and session records
maxliux5 Aug 15, 2026
f5d41e6
test(lark): remove unused server import
maxliux5 Aug 15, 2026
f041a5a
refactor(chat): keep action and attachment modules bounded
maxliux5 Aug 15, 2026
666dbf8
test(control-plane): isolate monitor and scheduler contracts
maxliux5 Aug 15, 2026
c8e0723
fix(lark): preserve setup boundary contract
maxliux5 Aug 15, 2026
8636373
fix(ui): align manager status semantics
maxliux5 Aug 15, 2026
21c3924
fix(ui): contain mobile navigation focus
maxliux5 Aug 15, 2026
9d7459e
test(ui): cover mobile navigation accessibility
maxliux5 Aug 15, 2026
595bb22
test(quota): preserve causal watch ack smoke
maxliux5 Aug 15, 2026
b3df3be
fix(control-plane): preserve goal intent and run identity
maxliux5 Aug 16, 2026
ff1f529
feat(ui): simplify the personal workspace control plane
maxliux5 Aug 16, 2026
96e0256
test(ui): cover blind control-plane workflows
maxliux5 Aug 16, 2026
abb3e60
chore(ui): normalize generated chat bundle
maxliux5 Aug 16, 2026
2b72c15
feat(ui): refine personal workspace conversations
maxliux5 Aug 16, 2026
6083f77
test(ui): cover personal workspace interaction flows
maxliux5 Aug 16, 2026
118325a
Merge pull request #3167 from huangruiteng/codex/personal-workspace-h…
maxliux5 Aug 16, 2026
5e60445
Merge origin/main into frontend control plane RFC
maxliux5 Aug 16, 2026
623f7fe
feat(dashboard): refine manager workspace and intent routing
maxliux5 Aug 16, 2026
f9a7b1b
test(dashboard): cover manager workspace trust contracts
maxliux5 Aug 16, 2026
3092d10
fix(dashboard): reconcile session results with projections
maxliux5 Aug 16, 2026
168b84e
test(dashboard): verify authoritative session results
maxliux5 Aug 16, 2026
2c38209
Merge latest origin/main into frontend control plane RFC
maxliux5 Aug 16, 2026
1984275
Merge latest origin/main into frontend control plane RFC
maxliux5 Aug 16, 2026
3856305
fix(status): omit empty usage aggregates
maxliux5 Aug 16, 2026
765220b
merge: sync latest main into control-plane RFC
maxliux5 Aug 16, 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: 2 additions & 0 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ jobs:
run: python -m mypy

- name: Qualify agent-facing CLI output
env:
LOOPX_CLI_OUTPUT_BASE_REF: origin/${{ github.event.pull_request.base.ref || 'main' }}
run: python examples/control_plane/cli-output-budget-regression-smoke.py

- name: Run fast tests
Expand Down
10 changes: 7 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@
### Worktree And PR Gate

For any tracked repository change beyond a trivial typo fix, create or use a
dedicated clean `git worktree` on a `codex/` branch from latest `origin/main`
before editing files. Do not implement changes directly in a dirty primary
worktree, even when the task starts by inspecting that dirty tree.
dedicated clean `git worktree` on a `codex/` branch. Use latest `origin/main`
unless the user explicitly names an integration or release branch; in that
case, fetch that branch and use its latest remote head as both the worktree
baseline and pull-request base. Before pushing, verify the merge base and PR
base so unrelated `main` history cannot leak into a stacked integration PR.
Do not implement changes directly in a dirty primary worktree, even when the
task starts by inspecting that dirty tree.

When a dirty worktree contains potentially valuable changes, first classify it
read-only, then copy or reapply the valuable subset into the dedicated clean
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ evidence → recovery; continuation → governance.
| Quota and interaction contract | Decides whether a turn should deliver, ask, wait, self-repair, or stay quiet. | `loopx quota should-run`, [quota allocation](docs/quota-allocation.md) |
| Agent runtime bridges | Keeps Codex App, Codex CLI, Claude Code, and generic workers aligned with the same guard. | `loopx heartbeat-prompt`, `loopx codex-cli-bootstrap-message`, `loopx worker-bridge` |
| Operator surfaces | Renders compact status without making the browser the state authority. | `loopx serve-status`, [dashboard](apps/presentation/dashboard/README.md) |
| Session dash | Starts a live single-page panel that tracks fleet progress: sessions, their goals, and each goal's status/todo progress, with result statistics; auto-refreshes in place. | `loopx dash`, [session dash design](docs/product/surfaces/session-dash-panel-design.md) |
| External projections | Projects todos and gates into collaboration surfaces while LoopX remains authoritative. | `loopx lark-kanban`, [Lark Kanban adapter](docs/integrations/lark-kanban-control-plane-adapter.md) |
| Domain capabilities | Packages repeatable work lanes such as issue fixing, content operations, value connector planning, ML experiment advice, benchmark evidence, and Explore. | `loopx issue-fix`, `loopx content-ops`, `loopx value-connectors`, `loopx ml-experiment`, `loopx benchmark`, [Explore](loopx/capabilities/explore/README.md) |
| Experimental context learning | Lets named registered agents trial provider-neutral Reward Memory through ignored, default-off project configuration. OpenViking is one provider option, not a global dependency. | `loopx reward-memory experiment-status`, [Reward Memory architecture](loopx/capabilities/reward_memory/README.md) |
Expand Down
61 changes: 61 additions & 0 deletions apps/presentation/dashboard/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,36 @@ generated site artifact.

## Run

From any directory after installing LoopX:

```bash
loopx dashboard
```

This command installs the dashboard's npm dependencies on first run, then
starts the Vite UI together with the loopback status and Chat services. Open
`http://127.0.0.1:5173/` after the readiness messages appear.

The equivalent source-checkout command remains available for dashboard
development:

```bash
npm ci
npm run build
npm run dev
```

`npm run dev` starts the Vite UI together with the loopback status and Chat
services on ports `5173`, `8766`, and `8767`. Use `npm run dev:web` when those
LoopX services are already running separately. Vite proxies the default
`/status.json` request to port `8766`, so an SSH user only needs to forward port
`5173` for the normal development page.

The live `/status.json` route keeps repository-wide public-boundary scanning
out of the first-screen request. Its contract projection reports that scan as
deferred; run `loopx check` before publishing or pushing public surfaces to
perform the complete boundary audit.

The default screen is the Chinese-first control-plane home. It is meant to
answer the operator's first questions before raw status drill-down: which
project line is active, which user todo is truly blocking, which agent todo is
Expand Down Expand Up @@ -281,6 +305,43 @@ local inspection file only. For public demos, use the sanitized
You can also import a JSON file directly in the browser, or load a local API
URL that returns the same `loopx --format json status` shape.

## Live Single-Page Session Dash

The primary way to watch session task progress is a loopback single-page panel:

```bash
loopx dash # serve at http://127.0.0.1:8767/ (auto-refresh every 10s)
loopx dash --goal-id <goal-id> # narrow the panel to one goal
```

Open the printed URL in any browser and keep it open while the agents work.
The page is a human-focused fleet view: an overview strip of sessions, goals,
active / needs-you / blocked / done buckets, open todos and run statistics,
followed by one card per session with the goals it owns and each goal's
status badge, todo progress bar, waiting reason, and latest run. It refreshes
itself in place every 10 seconds by re-fetching the `/panel` fragment.
Internal control machinery (decision frames, work-lane contracts, quota slot
math, source warnings) is intentionally not rendered. The panel is
read-only: no write controls, no browser write authority. The server binds
loopback only and exposes no write routes.

A one-shot static snapshot is also available for demos or sharing:

```bash
loopx dash generate [--goal-id <goal-id>] --out dash.html
```

Open `dash.html` in any browser. The command runs the public/private
boundary scan before reporting success and withholds output on failure.

```bash
# print the projection + html as JSON instead
loopx --format json dash generate --goal-id <goal-id>
```

See [the session dash panel design](../../../docs/product/surfaces/session-dash-panel-design.md)
for the layout, data boundary, and validation contract.

## Browser Smokes

Dashboard browser smokes are explicit because they start a temporary Vite
Expand Down
22 changes: 22 additions & 0 deletions apps/presentation/dashboard/chat/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="light" />
<meta name="theme-color" content="#f7f8f6" />
<link
rel="icon"
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='9' fill='%230f172a'/%3E%3Cpath d='m8 11 8-4 8 4-8 4-8-4Zm0 5 8 4 8-4M8 21l8 4 8-4' fill='none' stroke='white' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E"
/>
<meta
name="description"
content="LoopX 个人 Agent 工作区:在同一个频道里查看、纠偏并推进 Goal。"
/>
<title>LoopX 个人 Agent 工作区</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="../src/chat-main.tsx"></script>
</body>
</html>
Loading
Loading