Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
1322536
docs(rfc): design subtree context reuse with automatic full fallback …
loopx-agent Oct 23, 2026
9e20e0a
fix(report): read exact local evidence windows with pinned pagination
loopx-agent Oct 23, 2026
8e39cbe
Merge pull request #7171 from loopx-project/codex/report-fixed-window…
loopx-agent Oct 23, 2026
f996120
fix(cli): print host-runnable onboarding and heartbeat commands (#7160)
JasonBuildAI Oct 23, 2026
a2ae7c9
Qualify native Codex context recovery before subtree delivery (#7172)
loopx-agent Oct 23, 2026
8205632
feat(report): collect a scoped portfolio evidence source in the origi…
loopx-agent Oct 23, 2026
72ab394
fix(report): retain typed outcome-gap evidence in portfolio reads
loopx-agent Oct 23, 2026
542b7d5
Retire protocol action packet readers and legacy witnesses (#7161)
loopx-agent Oct 23, 2026
d1ce2b3
Add runner-owned benchmark capacity drain planning (#7169)
huangruiteng Oct 23, 2026
bd67d65
Merge pull request #7173 from loopx-project/codex/report-portfolio-so…
loopx-agent Oct 23, 2026
f20838e
fix(examples): initialize canonical authority for Turn E2E (#7175)
loopx-agent Oct 23, 2026
385771e
feat(research): record and estimate LoopX Turn packet input (#7170)
loopx-agent Oct 23, 2026
7e4e04d
test: align selected-work CLI binding with generated prompt
loopx-agent Oct 23, 2026
7129efc
fix(research): explain source-bound numbers in localized history (#7180)
loopx-agent Oct 23, 2026
3378f28
feat(steward): deliver native scheduled reports to the original priva…
loopx-agent Oct 23, 2026
8a03228
test(quota): restore canonical settlement consumer coverage
loopx-agent Oct 23, 2026
5b94c82
refactor(research): bring history into the default reading view (#7184)
loopx-agent Oct 23, 2026
0d55a3d
fix(chat): recover untouched historical routing failures (#7186)
loopx-agent Oct 23, 2026
4b63ba1
perf(chat): reuse runtime revision across HTTP POST dispatch
hhyykk Oct 23, 2026
811549c
test(chat): restore canonical project context qualification
hhyykk Oct 24, 2026
7f01e00
fix(review): align publication checks with author conclusion readback…
loopx-agent Oct 24, 2026
7e41342
fix(quota): expose writeback inputs in settlement guidance (#7174)
loopx-agent Oct 24, 2026
132806d
fix(chat): compare bound context by JSON content (#7176)
loopx-agent Oct 24, 2026
c674e9b
build(deps): bump zod (#7177)
dependabot[bot] Oct 24, 2026
62e752e
perf(cli): keep batched outcome writeback replies compact
loopx-agent Oct 23, 2026
3758272
docs(chat): define original project peer recipient delivery boundary …
loopx-agent Oct 24, 2026
bef5892
Merge pull request #7181 from loopx-project/codex/selected-work-comma…
huangruiteng Oct 24, 2026
eca7dfc
Merge pull request #7183 from loopx-project/codex/settlement-fixture-…
huangruiteng Oct 24, 2026
99ff5b7
fix(ci): lock tokenizer test dependencies (#7185)
loopx-agent Oct 24, 2026
3d6796d
Merge pull request #7189 from loopx-project/codex/restore-project-cha…
huangruiteng Oct 24, 2026
3a1800b
Merge pull request #7187 from loopx-project/codex/chat-http-runtime-s…
huangruiteng Oct 24, 2026
b8b9c1d
fix(chat): review interrupted results without replaying business effe…
loopx-agent Oct 24, 2026
dde1f02
refactor(research): share repeated assessment questions
loopx-agent Oct 24, 2026
e3fa619
Merge pull request #7194 from loopx-project/codex/research-question-c…
loopx-agent Oct 24, 2026
09e47b0
fix(chat): preserve native periodic admission and frozen report autho…
loopx-agent Oct 24, 2026
6f0c9da
fix(research): remove repeated questions from expanded assessments
loopx-agent Oct 24, 2026
6f8b181
Merge pull request #7203 from loopx-project/codex/research-evidence-r…
loopx-agent Oct 24, 2026
0c0d3dd
fix(chat): resume proven prelaunch report refusals through the origin…
loopx-agent Oct 24, 2026
efde93e
feat(research): bind display translations to source context
loopx-agent Oct 24, 2026
c37ab4d
Merge pull request #7212 from loopx-project/codex/research-display-co…
loopx-agent Oct 24, 2026
659c1fd
fix(chat): validate frozen reports in the original native host (#7215)
loopx-agent Oct 24, 2026
5c139d7
fix(research): refresh analysis and clarify contextual quantities
loopx-agent Oct 24, 2026
10d23a8
Merge pull request #7217 from loopx-project/codex/research-context-re…
loopx-agent Oct 24, 2026
19ccb63
fix(reports): retain authorization across partial source reads (#7218)
loopx-agent Oct 24, 2026
0621e24
docs(governance): record accepted session and Host review scope (#7214)
loopx-agent Oct 24, 2026
085bd1e
perf(cli): share selected agent collaboration dispatch (#7213)
hhyykk Oct 24, 2026
c113af7
refactor(periodic-report): decide the field rules in one owner (#7210)
xianth123 Oct 24, 2026
905d0ae
fix(research): restore digest ownership and deterministic scope close…
huangruiteng Oct 24, 2026
7a03792
fix(quota): align Turn settlement outcome guidance (#7211)
loopx-agent Oct 24, 2026
c0fe1ac
fix(research): compare deep analysis without repeated question walls
loopx-agent Oct 24, 2026
2773b65
Merge pull request #7224 from loopx-project/codex/research-analysis-c…
loopx-agent Oct 24, 2026
f104c53
fix(lark): return new scheduled reports to the private chat (#7223)
loopx-agent Oct 24, 2026
cc2c182
fix(bootstrap): validate goal ids before path construction (#7192)
Duang777 Oct 24, 2026
33a0ad5
refactor(authority-e2e): decide the qualified NoKV release in one own…
xianth123 Oct 24, 2026
28f410c
fix(monitor): reuse explicit successor targets (#7195)
huangruiteng Oct 24, 2026
a5f06aa
fix(research): reuse the canonical digest matcher (#7201)
huangruiteng Oct 24, 2026
58e646f
fix(leases): canonicalize equivalent write scopes (#7204)
Duang777 Oct 24, 2026
eab2132
fix(ci): restore digest ownership and browser smoke preconditions (#7…
Duang777 Oct 24, 2026
013ca8d
fix(goal): retain objective adoption for later registered peers (#7216)
hhyykk Oct 24, 2026
75f3787
perf(cli): share selected lifecycle command dispatch (#7202)
hhyykk Oct 24, 2026
7c48375
fix(codex): recover current activity beyond cached history (#7231)
loopx-agent Oct 24, 2026
ed5c2bf
fix(checkpoint): recheck captured session without writing launch locks
loopx-agent Oct 23, 2026
e98020e
fix(worker): retain original replan across bounded host retry
loopx-agent Oct 23, 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
4 changes: 2 additions & 2 deletions .github/GOVERNANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,12 +322,12 @@ voluntary: anyone may decline, narrow, pause, or hand back a scope without
losing attribution for their work. Silence is not acceptance or approval.

Status reflects accepted scopes and follow-up invitations in #4069 through
2026-10-22. The last column says what still separates each contact from a `CODEOWNERS` route under the
2026-10-24. The last column says what still separates each contact from a `CODEOWNERS` route under the
[eligibility rule](#code-owner-eligibility).

| Surface | Contact | Responsibility / status | Path to a code-owner route |
| --- | --- | --- | --- |
| Chat/runtime session lifecycle | [`@Duang777`](https://github.com/Duang777) | Accepted 2026-09-08: managed-session resume/submit/close, request idempotency, focused regressions and follow-up fixes. Shared goal, quota, lease and permission contracts remain outside this assignment. | Has write access and an accepted scope; needs three qualifying in-scope cross-author reviews. |
| Chat/runtime session lifecycle and cohesive Host recovery | [`@Duang777`](https://github.com/Duang777) | Initial session scope accepted 2026-09-08; [expanded and accepted 2026-10-24](https://github.com/loopx-project/loopx/issues/4069#issuecomment-6377902612): first-review contact for resume/submit/close, request idempotency, focused regressions and follow-up maintenance, including Host/recovery surfaces within the same session boundary. Best-effort availability, no fixed SLA; will state on the PR when unavailable. Shared goal/quota/lease policy, canonical-authority promotion, provider activation, release and bypass decisions remain outside this scope. | Write remains active. No Maintain or code-owner change requested or granted; any future route still needs the existing qualifying cross-author reviews and a separate appointment PR. |
| Shared goal authority qualification | [`@wchwawa`](https://github.com/wchwawa) | Accepted 2026-09-08: implementation review, writer/cursor recovery evidence and bounded qualification. Canonical-authority promotion, provider activation and shared-state policy require separate lead-maintainer review. | Has write access and an accepted scope; needs three in-scope cross-author reviews. |
| Windows runtime correctness | [`@BigDataDZ`](https://github.com/BigDataDZ) | Accepted 2026-10-12: Python CLI Windows paths/encoding, filesystem behavior and native repro-first test qualification; best-effort availability and stated recusals retained. | Bounded Windows code-owner route recorded above; shared semantic and CI-policy decisions remain with existing owners. |
| Usage and host usage ingestion | [`@liubf21`](https://github.com/liubf21) | Invited to coordinate usage correctness and historical-data compatibility review; no acceptance recorded. Pricing policy and unrelated host/session authority remain outside this scope. | Has write access; needs scope acceptance and in-scope reviews. |
Expand Down
8 changes: 4 additions & 4 deletions apps/presentation/dashboard/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/presentation/dashboard/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
"recharts": "^3.8.1",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.0",
"zod": "^4.4.3"
"zod": "^4.6.6"
},
"devDependencies": {
"@types/react": "^19.2.15",
Expand Down
23 changes: 23 additions & 0 deletions apps/presentation/dashboard/src/data/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2630,6 +2630,14 @@ const privateConversationSchema = z.object({
goal_active: z.boolean().optional(), monitor: z.object({todo_id: z.string(), status: z.string(),
cadence_minutes: z.number().int().nullable(), next_due_at: z.string().nullable(),
last_checked_at: z.string().nullable()}).nullable().optional(),
report: z.discriminatedUnion("available", [
z.object({available: z.literal(true), enabled: z.boolean(), configured: z.boolean(),
schedule: z.record(z.string(), z.unknown()).nullable().optional(), next_due_at: z.string().nullable().optional(),
retained_window_due_at: z.string().nullable().optional(), generation_id: z.string().nullable().optional(),
delivery_status: z.string().optional(), publication_verified: z.boolean().optional(),
destination: z.string().optional()}),
z.object({available: z.literal(false), error_code: z.string()}),
]).optional(),
goal_id: z.string().optional(), agent_id: z.string().optional(), session_id: z.string().optional()}),
z.object({available: z.literal(false), error_code: z.string()}),
]).optional(),
Expand Down Expand Up @@ -2695,6 +2703,21 @@ export async function changePrivateAgentTarget(bindingId: string, revision: numb
}));
}

const stewardReportPlanSchema = z.object({ok: z.literal(true), applied: z.boolean(), stop_status: z.string().optional(), plan: z.object({
schema_version: z.literal("loopx_steward_report_plan_v0"), plan_id: z.string().regex(/^[a-f0-9]{64}$/),
})});
export async function configureStewardReport(bindingId: string, operation: "enable" | "pause" | "cancel", schedule?: Record<string, unknown>) {
const path = "/api/chat/lark/private-conversations/managed-steward/report";
const send = (body: unknown) => requestJson<unknown>(path, {method: "POST",
headers: {"Content-Type": "application/json"}, body: JSON.stringify(body)});
const request = {binding_id: bindingId, operation, ...(operation === "enable" ? {schedule} : {})};
const preview = stewardReportPlanSchema.parse(await send({...request, execute: false}));
const applied = stewardReportPlanSchema.parse(await send({...request, execute: true, plan_id: preview.plan.plan_id}));
if (!applied.applied) throw new Error("The original report setting was not applied.");
if (applied.stop_status === "unconfirmed") throw new Error("汇报计划已取消;正在生成的任务是否停止尚未确认。Report cancelled; the active task's stop is unconfirmed.");
return applied;
}

export async function changeOwnerNotifications(bindingId: string, bindingRevision: number, revision: number, enabled: boolean) {
return privateConversationsSchema.parse(await requestJson<unknown>("/api/chat/lark/private-conversations/owner-notifications", {
method: "POST", headers: {"Content-Type": "application/json"},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
.research-analysis h3 { font-size: var(--text-heading); font-weight: 600; margin: 0; }
.research-analysis h4 { font-size: var(--text-lead); font-weight: 600; line-height: 1.5; margin: 0 0 8px; }
.research-analysis p { margin: 8px 0; }
.research-analysis header p, .analysis-scope, .analysis-boundary, .research-analysis small, .analysis-method, .analysis-finding > span { color: var(--pw-muted); font-size: var(--text-caption); }
.research-analysis header p, .analysis-scope, .analysis-boundary, .research-analysis small, .analysis-finding > span { color: var(--pw-muted); font-size: var(--text-caption); }
.research-analysis button, .research-analysis select { font: inherit; color: inherit; border: 1px solid var(--pw-line); background: var(--pw-bg); border-radius: 6px; min-height: 44px; padding: 8px 12px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; cursor: pointer; }
.research-analysis button:disabled { opacity: .5; cursor: not-allowed; }
.research-analysis button.analysis-primary { color: var(--pw-bg); background: var(--pw-text); border-color: var(--pw-text); }
Expand All @@ -18,33 +18,44 @@
.analysis-actions small { flex-basis: 100%; }
.analysis-warning { border-inline-start: 2px solid var(--pw-caution); padding-inline-start: 12px; }
.analysis-error { color: var(--pw-red); }
.analysis-finding { border-block-start: 1px solid var(--pw-line); padding-block: 20px 8px; margin-top: 20px; max-width: 76ch; }
.analysis-finding { padding-block: 12px 8px; margin-top: 12px; max-width: 76ch; }
.analysis-finding h4 { margin-top: 8px; }
.analysis-episode-columns, .analysis-episode > summary { display: grid; grid-template-columns: minmax(0, 1fr) 8rem 6rem 9rem 1rem; align-items: baseline; gap: 16px; }
.analysis-episode-columns { color: var(--pw-muted); padding-block: 8px; border-bottom: 1px solid var(--pw-line); }
.analysis-episode-group + .analysis-episode-group { margin-top: 12px; }
.research-analysis .analysis-shared-question { margin: 12px 0 4px; max-width: 76ch; color: var(--pw-muted); font-size: var(--text-body); }
.analysis-episode { border-block-end: 1px solid var(--pw-line); }
.analysis-episode > summary { display: flex; align-items: center; gap: 16px; min-height: 64px; padding-block: 12px; cursor: pointer; list-style: none; }
.analysis-episode > summary { min-height: 48px; padding-block: 12px; cursor: pointer; list-style: none; }
.analysis-episode > summary::-webkit-details-marker { display: none; }
.analysis-episode-name { flex: 1; min-width: 0; max-width: 76ch; font-weight: 500; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.analysis-episode-name { min-width: 0; max-width: 76ch; font-weight: 500; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.analysis-episode[open] > summary .analysis-episode-name { display: block; }
.analysis-episode-verdicts { display: flex; flex-shrink: 0; flex-wrap: wrap; justify-content: end; gap: 4px 24px; }
.analysis-verdict-label { display: none; }
.analysis-episode-exceptions { display: flex; flex-direction: column; color: var(--pw-muted); }
.analysis-episode > summary > svg { flex-shrink: 0; }
.analysis-episode[open] > summary > svg { transform: rotate(180deg); }
.analysis-episode-body { padding-block: 8px 24px; max-width: 90ch; }
.analysis-episode-body { padding-block: 8px 24px; max-width: 90ch; font-size: var(--text-lead); }
.analysis-episode-context { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; margin-block: 20px; }
.analysis-episode-context strong, .analysis-episode-context small { display: block; }
.analysis-episode-context strong { font-weight: 500; }
.analysis-episode-context > :only-child { grid-column: 1 / -1; max-width: 76ch; }
.analysis-reason-judgments { display: flex; flex-wrap: wrap; gap: 4px 20px; font-size: var(--text-body); }
.analysis-reason-judgments > span { display: inline-flex; flex-wrap: wrap; gap: 8px; }
.analysis-reason-judgments strong { font-weight: 500; }
.analysis-reason-judgments > span > span { color: var(--pw-muted); }
.analysis-episode-question { margin-top: 12px; }
.analysis-episode-question > summary { cursor: pointer; padding-block: 10px; min-height: 44px; }
.analysis-episode-question h5 { font: inherit; font-weight: 500; margin: 12px 0 0; }
.analysis-judgments { border-top: 1px solid var(--pw-line); }
.analysis-judgments details { border-bottom: 1px solid var(--pw-line); }
.analysis-judgments summary { min-height: 48px; padding-block: 10px; cursor: pointer; display: flex; align-items: baseline; justify-content: space-between; gap: 16px; }
.analysis-judgments summary strong { font-weight: 500; }
.analysis-judgments summary span { color: var(--pw-muted); font-size: var(--text-caption); }
.analysis-judgments summary span { font-size: var(--text-body); }
.analysis-judgments details > p, .analysis-citations { margin: 4px 0 12px; }
.analysis-question { color: var(--pw-muted); font-size: var(--text-caption); }
.analysis-citations { display: flex; flex-wrap: wrap; gap: 8px; }
.analysis-citations button { font-size: var(--text-caption); }
.analysis-source { border: 1px solid var(--pw-line); border-radius: 8px; padding: 16px; margin-block: 16px; }
.analysis-source p { font-size: var(--text-caption); color: var(--pw-muted); }
.analysis-source pre { font-family: var(--font-mono); font-size: var(--text-caption); line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 360px; overflow: auto; }
.analysis-method { border-block-start: 1px solid var(--pw-line); margin-top: 16px; padding-top: 12px; }
.analysis-source pre { font-family: var(--font-mono); font-size: var(--text-body); line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 360px; overflow: auto; }
.analysis-method { border-block-start: 1px solid var(--pw-line); margin-top: 16px; padding-top: 12px; color: var(--pw-muted); font-size: var(--text-lead); }
.analysis-method summary { min-height: 44px; display: flex; align-items: center; cursor: pointer; color: var(--pw-text); }
.analysis-method dl { display: grid; grid-template-columns: 100px minmax(0, 1fr); gap: 8px 16px; }
.analysis-method dd { margin: 0; color: var(--pw-text); }
Expand All @@ -58,7 +69,15 @@
.analysis-spin { animation: analysis-request-spin 1s linear infinite; }
@keyframes analysis-request-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .analysis-spin { animation: none; } }
@media (max-width: 640px) { .research-analysis { padding: 16px; } .analysis-episode > summary { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 12px; } .analysis-episode-verdicts { grid-column: 1; grid-row: 2; flex-direction: column; gap: 0; } .analysis-episode > summary > svg { grid-column: 2; grid-row: 1 / 3; } .analysis-episode-context { grid-template-columns: 1fr; gap: 12px; } .analysis-method dl { grid-template-columns: 1fr; gap: 2px; } .analysis-method dd { margin-bottom: 8px; } .analysis-pack-choice { flex-direction: column; align-items: stretch; } }
@media (max-width: 1024px) {
.analysis-episode-columns { display: none; }
.analysis-episode > summary { grid-template-columns: minmax(0, 1fr) auto; gap: 4px 12px; }
.analysis-episode-name, .analysis-episode-verdict, .analysis-episode-exceptions { grid-column: 1; }
.analysis-verdict-label { display: inline; }
.analysis-episode > summary > svg { grid-column: 2; grid-row: 1; }
.analysis-episode-exceptions:empty { display: none; }
}
@media (max-width: 640px) { .research-analysis { padding: 16px; } .analysis-episode-context { grid-template-columns: 1fr; gap: 12px; } .analysis-method dl { grid-template-columns: 1fr; gap: 2px; } .analysis-method dd { margin-bottom: 8px; } .analysis-pack-choice { flex-direction: column; align-items: stretch; } }

/* Readback has one status surface, shared by the summary and its detail. */
.analysis-read-error,.analysis-read-empty{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-block:12px;color:var(--pw-muted)}
Expand Down
Loading
Loading