Skip to content

Commit e51cf8e

Browse files
committed
Merge remote-tracking branch 'origin/main' into refactor/issue-fix-metrics-supplement-vocabulary-single-source
Signed-off-by: gcl-coder <88359731+gcl-coder@users.noreply.github.com> # Conflicts: # examples/semantic-vocabulary-drift-smoke.py # loopx/semantics/vocabulary_v0.json
2 parents d95fee4 + d23f1c8 commit e51cf8e

273 files changed

Lines changed: 10217 additions & 9663 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/full-public-smokes.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ jobs:
7070
with:
7171
node-version: "24"
7272

73+
- name: Install the shell used by launch-agent contract checks
74+
run: sudo apt-get update && sudo apt-get install -y zsh
75+
7376
- name: Install smoke runtime dependencies
7477
run: python -m pip install --disable-pip-version-check "jsonschema>=4.23,<5"
7578

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ The open, local-first control plane for long-horizon agents and personal agent t
99

1010
[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Release](https://img.shields.io/github/v/release/loopx-project/loopx?filter=v*&display_name=tag)](https://github.com/loopx-project/loopx/releases/latest) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/XmGgQyCFZd)
1111

12+
<a href="https://trendshift.io/repositories/102379"><img src="https://trendshift.io/api/badge/repositories/102379" alt="loopx-project/loopx on Trendshift" width="220" height="48"></a>
13+
1214
[Get started](#try-loopx) · [Workspace](#meet-the-personal-agent-workspace) · [LHTB results](#lhtb-results) · [Docs](https://loopx-project.github.io/loopx/docs/) · [简体中文](README.zh-CN.md)
1315

1416
**[LHTB](https://zli12321.github.io/LHTB/index.html) · 46 tasks · GPT-5.6 Sol:** LoopX 1.0.3 Heartbeat reaches **0.4948 mean reward** — **+17.3% vs Plain Codex**, **+10.6% vs native Codex Goal**.<br>
@@ -823,8 +825,6 @@ coordination, and an explicitly staged architecture and research incubator.
823825

824826
## Star History
825827

826-
<a href="https://trendshift.io/repositories/102379"><img src="https://trendshift.io/api/badge/repositories/102379" alt="loopx-project/loopx on Trendshift" width="220" height="48"></a>
827-
828828
<p align="center">
829829
<a href="https://github.com/loopx-project/loopx/stargazers"><img src="https://loopx-project.github.io/loopx/site-assets/star-history.svg" alt="LoopX GitHub star history from verified snapshots" width="800"></a><br>
830830
<sub>Generated every six hours from GitHub's official stargazer timestamps using a repository-authorized workflow. A snapshot is published only when the fetched rows match GitHub's current star count; GitHub's image cache may delay refreshes.</sub>

‎README.zh-CN.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Release](https://img.shields.io/github/v/release/loopx-project/loopx?filter=v*&display_name=tag)](https://github.com/loopx-project/loopx/releases/latest) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/XmGgQyCFZd)
1111

12+
<a href="https://trendshift.io/repositories/102379"><img src="https://trendshift.io/api/badge/repositories/102379" alt="loopx-project/loopx 在 Trendshift 的趋势排名" width="220" height="48"></a>
13+
1214
[开始使用](#试用-loopx) · [个人工作区](#认识个人-agent-工作区) · [LHTB 结果](#lhtb-results) · [文档](https://loopx-project.github.io/loopx/docs/) · [English](README.md)
1315

1416
**[LHTB](https://zli12321.github.io/LHTB/index.html) · 46 个任务 · GPT-5.6 Sol:**LoopX 1.0.3 Heartbeat 平均 Reward 达到 **0.4948**,较 **Plain Codex 提升 17.3%**,较**原生 Codex Goal 提升 10.6%**。<br>
@@ -736,8 +738,6 @@ benchmark 证据、operator surface 与 IM integration、shared-goal 跨 host
736738

737739
## Star 趋势
738740

739-
<a href="https://trendshift.io/repositories/102379"><img src="https://trendshift.io/api/badge/repositories/102379" alt="loopx-project/loopx 在 Trendshift 的趋势排名" width="220" height="48"></a>
740-
741741
<p align="center">
742742
<a href="https://github.com/loopx-project/loopx/stargazers"><img src="https://loopx-project.github.io/loopx/site-assets/star-history.svg" alt="LoopX GitHub Star 历史趋势,来自已校验快照" width="800"></a><br>
743743
<sub>由仓库授权的 workflow 每 6 小时基于 GitHub 官方 stargazer 时间戳生成;仅当拉取条数与 GitHub 当前 Star 总数一致时发布。GitHub 图片缓存可能延迟刷新。</sub>

‎apps/presentation/dashboard/README.md‎

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -452,18 +452,6 @@ usable. It uses an installed Playwright package or the Codex bundled runtime
452452
when available, and starts Vite through the local `vite` package rather than
453453
depending on `npm` / `npx` being on `PATH`.
454454

455-
The ops decision-freshness smoke protects the detailed `?view=ops` panel with
456-
two public fixtures: a live-like zero-item summary and a stale/rebase-required
457-
decision example. It verifies the rendered Chinese/English operator copy,
458-
counts, top affected goal, and exact-replay wording instead of relying only on
459-
source-string checks.
460-
461-
The promotion-readiness smoke protects the detailed `?view=ops` panel with
462-
fresh, stale, and missing readiness fixtures. It verifies the status badges,
463-
readiness/rerun decision, artifact window, age, reason, and source-of-truth copy
464-
for canary promotion readiness. The canonical fixture/browser script is
465-
`examples/dashboard-promotion-readiness-browser-smoke.mjs`; use the npm script
466-
above instead of calling ad hoc duplicate filenames.
467455
The grouped demo-readiness path also runs `examples/promotion-gate-smoke.py`
468456
before browser checks, so the structured `gate_state`, `can_promote`, and
469457
`should_warn` contract is covered even when browser smokes are skipped.

‎apps/presentation/dashboard/src/data/chat-model.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ export type CollaborationReadback = {
8383
schema_version: "collaboration_request_readback_v0";
8484
request_id: string;
8585
agent_id: string;
86+
goal_id?: string;
87+
decision_reason?: string;
8688
brief: {
8789
purpose: string;
8890
context: string;

‎apps/presentation/dashboard/src/data/status.ts‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ export const todoIndexSchema = z.object({
131131
current_projected_count: z.number().optional().default(0),
132132
rollout_event_count: z.number().optional().default(0),
133133
item_limit: z.number().optional().nullable(),
134+
complete: z.boolean().optional(),
135+
unavailable_goal_ids: z.array(z.string()).optional(),
134136
items: z.array(todoIndexItemSchema).optional().default([]),
135137
});
136138

@@ -341,6 +343,19 @@ export const projectAssetTodoProjectionGapSchema = z.object({
341343
recommended_action: z.string().optional().nullable(),
342344
});
343345

346+
export const nativeChildActivitySchema = z.object({
347+
schema_version: z.literal("native_subagent_activity_v0"),
348+
observation: z.enum(["unknown", "coordinator_reported"]),
349+
host_attested: z.literal(false),
350+
configured_limit: z.number().int().nonnegative(),
351+
launched_count: z.number().int().nonnegative(),
352+
skipped_count: z.number().int().nonnegative(),
353+
capacity_rejected_count: z.number().int().nonnegative(),
354+
host_failed_count: z.number().int().nonnegative(),
355+
parent_accepted_count: z.number().int().nonnegative(),
356+
turn_instance_id: z.string(),
357+
});
358+
344359
export const projectAssetSchema = z.object({
345360
owner: z.string(),
346361
gate: z.string(),
@@ -351,6 +366,7 @@ export const projectAssetSchema = z.object({
351366
quota: quotaSchema.optional().nullable(),
352367
control_plane: controlPlaneSchema.optional().nullable(),
353368
orchestration: orchestrationPolicySchema.optional().nullable(),
369+
native_child_activity: nativeChildActivitySchema.optional().nullable(),
354370
latest_validation: projectAssetLatestValidationSchema.optional().nullable(),
355371
stale_latest_run_warning: staleLatestRunWarningSchema.optional().nullable(),
356372
todo_projection_gap: projectAssetTodoProjectionGapSchema.optional().nullable(),

‎apps/presentation/dashboard/src/features/personal-workspace/collaboration-card.tsx‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ const copy = {
88
acceptance: "验收要求", return: "需要回传", supplied: "已提供给接收方", pending: "等待接收方读取",
99
decision: "接收方判断", unknown: "尚未记录", unavailable: "暂时无法读取",
1010
adopt: "已采纳", defer: "已暂缓", reject: "未采纳", no_change: "无需调整",
11-
result: "结论已保存", delivered: "结论已回传", details: "查看交办内容",
11+
result: "回复等待送达", delivered: "回复已送达", unverified: "回复送达尚未核验", details: "查看交办内容",
12+
owner: "接收方", reason: "原因",
1213
},
1314
en: {
1415
title: "Delegation brief", context: "Context & corrections", constraints: "Constraints", inputs: "Inputs",
1516
acceptance: "Acceptance", return: "Expected return", supplied: "Supplied to receiver", pending: "Awaiting receiver read",
1617
decision: "Receiver decision", unknown: "Not recorded", unavailable: "Readback unavailable",
1718
adopt: "Adopted", defer: "Deferred", reject: "Rejected", no_change: "No change needed",
18-
result: "Conclusion saved", delivered: "Conclusion returned", details: "View delegation details",
19+
result: "Reply awaiting delivery", delivered: "Reply delivered", unverified: "Reply delivery unverified", details: "View delegation details",
20+
owner: "Recipient", reason: "Reason",
1921
},
2022
};
2123

@@ -27,12 +29,14 @@ export function CollaborationCard({ request }: { request?: CollaborationReadback
2729
const decision = request.decision as "adopt" | "defer" | "reject" | "no_change";
2830
const conclusion = request.returns.find((reply) => reply.phase === "conclusion");
2931
return <section className="personal-collaboration" aria-label={c.title}>
30-
<header><strong>{brief.purpose}</strong><span>{request.agent_id}</span></header>
32+
<header><strong>{brief.purpose}</strong><span>{c.owner}: {request.goal_id ? `${request.goal_id} / ` : ""}{request.agent_id}</span></header>
3133
<p className="personal-collaboration-status">
3234
<span>{request.read_status === "supplied" ? c.supplied : request.read_status === "unavailable" ? c.unavailable : c.pending}</span>
3335
<span>{c.decision}: {c[decision] ?? (request.decision === "unavailable" ? c.unavailable : c.unknown)}</span>
34-
{conclusion ? <span>{conclusion.status === "delivered" ? c.delivered : c.result}</span> : null}
36+
{conclusion ? <span>{conclusion.status === "delivered" ? c.delivered
37+
: conclusion.status === "queued" ? c.result : c.unverified}</span> : null}
3538
</p>
39+
{request.decision_reason ? <p>{c.reason}: {request.decision_reason}</p> : null}
3640
<details>
3741
<summary>{c.details}</summary>
3842
<h4>{c.context}</h4><p>{brief.context}</p>

‎apps/presentation/dashboard/src/features/personal-workspace/context-drawer.tsx‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,18 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
736736
<button className="personal-secondary-action" onClick={() => callbacks.onRequestScheduleConfig?.("heartbeat", selection.item.goalId)} type="button"><Radio size={16} />{t("drawer.setupHeartbeat")}</button>
737737
<button className="personal-secondary-action" onClick={() => callbacks.onRequestScheduleConfig?.("monitor", selection.item.goalId)} type="button"><CalendarClock size={16} />{t("drawer.scheduleAdd")}</button>
738738
</div> : null}
739+
{selection.item.nativeChildActivity?.observation === "coordinator_reported" ? (
740+
<section className="personal-detail-card personal-native-child-activity">
741+
<h3>{t("drawer.subagentReportTitle")}</h3>
742+
<p>{t("drawer.subagentReportedActivity", {
743+
started: selection.item.nativeChildActivity.launched_count,
744+
skipped: selection.item.nativeChildActivity.skipped_count,
745+
rejected: selection.item.nativeChildActivity.capacity_rejected_count,
746+
failed: selection.item.nativeChildActivity.host_failed_count,
747+
accepted: selection.item.nativeChildActivity.parent_accepted_count,
748+
})}</p>
749+
</section>
750+
) : null}
739751
{selection.item.subagentExecution ? <section className="personal-detail-card personal-goal-subagents">
740752
<div className="personal-subagent-heading">
741753
<div>

‎apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ const en = {
259259
"drawer.subagentConfirmEnable": "Confirm turning on sub-agent execution",
260260
"drawer.subagentCurrentBoundary": "Current task-domain restriction",
261261
"drawer.subagentDescription": "Allows the runtime to create temporary child agents for independent tasks only after Todo, quota, capability, and write-scope gates pass. It does not force parallel work or grant durable authority.",
262+
"drawer.subagentReportTitle": "Child activity",
263+
"drawer.subagentReportedActivity": "Latest coordinator report: {started} starts, {skipped} skips, {rejected} capacity rejections, {failed} host failures, {accepted} parent-accepted results. Host verification is unavailable.",
262264
"drawer.subagentDisable": "Preview turning off sub-agent execution",
263265
"drawer.subagentDisableSummary": "New child-agent execution will be disabled for this Goal. Existing Todo ownership and execution records stay unchanged.",
264266
"drawer.subagentDomainInvalid": "The selected task-domain restriction is invalid.",
@@ -1410,6 +1412,8 @@ const zhCN: Record<WorkspaceMessageKey, string> = {
14101412
"drawer.subagentConfirmEnable": "确认开启子代理执行",
14111413
"drawer.subagentCurrentBoundary": "当前任务领域限制",
14121414
"drawer.subagentDescription": "仅在 Todo、配额、能力和写入范围门禁全部通过后,允许运行时为相互独立的任务临时创建子代理;不会强制并行,也不会授予持久权限。",
1415+
"drawer.subagentReportTitle": "子代理活动",
1416+
"drawer.subagentReportedActivity": "最近一轮主 Agent 回报:启动 {started} 次、跳过 {skipped} 次、容量拒绝 {rejected} 次、宿主失败 {failed} 次、主 Agent 验收 {accepted} 项;目前没有宿主核验。",
14131417
"drawer.subagentDisable": "预览关闭子代理执行",
14141418
"drawer.subagentDisableSummary": "这个 Goal 将不再创建新的子代理;现有 Todo 归属和执行记录不受影响。",
14151419
"drawer.subagentDomainInvalid": "所选任务领域限制无效。",

‎apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-model.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ export type WorkspaceGoal = {
117117
repository?: WorkspaceRepositoryContext;
118118
state: WorkspaceGoalState;
119119
subagentExecution?: WorkspaceGoalSubagentConfiguration;
120+
nativeChildActivity?: {
121+
turn_instance_id: string;
122+
observation: "unknown" | "coordinator_reported";
123+
host_attested: false;
124+
launched_count: number;
125+
skipped_count: number;
126+
capacity_rejected_count: number;
127+
host_failed_count: number;
128+
parent_accepted_count: number;
129+
} | null;
120130
title: string;
121131
usage?: WorkspaceGoalUsage | null;
122132
};

0 commit comments

Comments
 (0)