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:
+111
-13
@@ -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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user