arm 候選 batch(Arcrun@341bcb1):step3 誠實化+step4 意圖替換+step6 統計回寫+t158 mode 分流+t159 daemon 登記+t160 現行 ui

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 14:57:54 +08:00
parent 8cc794c354
commit 0a043701d0
3 changed files with 374 additions and 106 deletions
+111 -13
View File
@@ -2099,14 +2099,14 @@ var Hono = class _Hono {
* app.route("/api", app2) // GET /api/user
* ```
*/
route(path, app7) {
route(path, app8) {
const subApp = this.basePath(path);
app7.routes.map((r) => {
app8.routes.map((r) => {
let handler;
if (app7.errorHandler === errorHandler) {
if (app8.errorHandler === errorHandler) {
handler = r.handler;
} else {
handler = /* @__PURE__ */ __name(async (c, next) => (await compose([], app7.errorHandler)(c, () => r.handler(c, next))).res, "handler");
handler = /* @__PURE__ */ __name(async (c, next) => (await compose([], app8.errorHandler)(c, () => r.handler(c, next))).res, "handler");
handler[COMPOSED_HANDLER] = r.handler;
}
subApp.#addRoute(r.method, r.path, handler);
@@ -8195,16 +8195,114 @@ app5.post("/", async (c) => {
});
var init_default = app5;
// src/index.ts
// src/actions/recordAnalytics.ts
async function recordAnalytics(input, env2) {
const hashId = input.canonical_id.startsWith("cmp_") ? input.canonical_id : await env2.SUBMISSIONS_KV.get(`idx:${input.canonical_id}`);
if (!hashId) {
return { ok: false, error: `\u96F6\u4EF6 ${input.canonical_id} \u4E0D\u5728\u7D22\u5F15` };
}
const list = await env2.SUBMISSIONS_KV.list({ prefix: `comp:${hashId}:` });
let targetKey = null;
let targetRecord = null;
let bestScore = -Infinity;
for (const key of list.keys) {
const raw2 = await env2.SUBMISSIONS_KV.get(key.name);
if (!raw2) continue;
let v;
try {
v = JSON.parse(raw2);
} catch {
continue;
}
if (v.status === "tombstone") continue;
if (input.version) {
if (String(v.version) === input.version) {
targetKey = key.name;
targetRecord = v;
break;
}
continue;
}
const score = computeScore(v);
if (score > bestScore) {
bestScore = score;
targetKey = key.name;
targetRecord = v;
}
}
if (!targetKey || !targetRecord) {
return { ok: false, error: `\u96F6\u4EF6 ${input.canonical_id} \u7121\u53EF\u7528\u7248\u672C\u8A18\u9304` };
}
const version2 = String(targetRecord.version ?? "v1");
const canonicalId = String(targetRecord.canonical_id ?? input.canonical_id);
const statsKey = `stats:${hashId}:${version2}`;
let counters = { total_runs: 0, success_runs: 0, total_ms: 0 };
const rawStats = await env2.ANALYTICS_KV.get(statsKey);
if (rawStats) {
try {
const parsed = JSON.parse(rawStats);
counters = {
total_runs: Number(parsed.total_runs) || 0,
success_runs: Number(parsed.success_runs) || 0,
total_ms: Number(parsed.total_ms) || 0
};
} catch {
}
}
counters.total_runs += 1;
counters.success_runs += input.success ? 1 : 0;
counters.total_ms += Math.max(0, Number(input.duration_ms) || 0);
await env2.ANALYTICS_KV.put(statsKey, JSON.stringify(counters));
const successRate = counters.success_runs / counters.total_runs;
const avgDurationMs = Math.round(counters.total_ms / counters.total_runs);
targetRecord.success_rate = successRate;
targetRecord.avg_duration_ms = avgDurationMs;
targetRecord.call_count = counters.total_runs;
await env2.SUBMISSIONS_KV.put(targetKey, JSON.stringify(targetRecord));
return {
ok: true,
canonical_id: canonicalId,
version: version2,
total_runs: counters.total_runs,
success_runs: counters.success_runs,
success_rate: successRate,
avg_duration_ms: avgDurationMs
};
}
__name(recordAnalytics, "recordAnalytics");
// src/routes/analytics.ts
var app6 = new Hono2();
app6.use("*", cors());
app6.get("/", (c) => c.json({ service: "component-registry", version: "1.0.0", status: "ok" }));
app6.route("/components/guide", guide_default);
app6.route("/components/validate-contract", validateContract_default);
app6.route("/components", query_default);
app6.route("/components", components_default);
app6.route("/init", init_default);
var index_default = app6;
app6.post("/record", async (c) => {
const body = await c.req.json().catch(() => null);
if (!body || typeof body.canonical_id !== "string" || body.canonical_id.trim() === "") {
return c.json({ ok: false, error: "canonical_id \u5FC5\u586B" }, 400);
}
if (typeof body.success !== "boolean") {
return c.json({ ok: false, error: "success \u5FC5\u9808\u70BA boolean" }, 400);
}
const result = await recordAnalytics({
canonical_id: body.canonical_id.trim(),
version: typeof body.version === "string" && body.version !== "" ? body.version : void 0,
success: body.success,
duration_ms: typeof body.duration_ms === "number" ? body.duration_ms : 0
}, c.env);
if (!result.ok) return c.json(result, 404);
return c.json(result);
});
var analytics_default = app6;
// src/index.ts
var app7 = new Hono2();
app7.use("*", cors());
app7.get("/", (c) => c.json({ service: "component-registry", version: "1.0.0", status: "ok" }));
app7.route("/components/guide", guide_default);
app7.route("/components/validate-contract", validateContract_default);
app7.route("/components", query_default);
app7.route("/components", components_default);
app7.route("/init", init_default);
app7.route("/analytics", analytics_default);
var index_default = app7;
export {
index_default as default
};