agentworkshop 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.AgentWorkShop/prompts/compaction-hints.md +9 -0
- package/.AgentWorkShop/prompts/host-tools.json +664 -630
- package/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -0
- package/.AgentWorkShop/prompts/system-manual.md +6 -1
- package/.output/.AgentWorkShop/prompts/compaction-hints.md +9 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +664 -630
- package/.output/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -0
- package/.output/.AgentWorkShop/prompts/system-manual.md +6 -1
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json +1 -0
- package/.output/server/chunks/_/nitro.mjs +1920 -1211
- package/.output/server/chunks/_/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +25 -3
- package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/scripts/_dbg-cross-channel-e2e.mjs +157 -0
- package/scripts/test-context-governor.ts +176 -0
- package/scripts/test-memory-brief-chronicle.ts +180 -0
- package/scripts/test-memory-dynamic.ts +3 -1
- package/scripts/test-memory-rrf-mmr.ts +114 -0
- package/server/api/workshop/channels/[id]/messages/index.post.ts +26 -1
- package/server/api/workshop/ws.ts +1 -0
- package/server/data/daqs.json +35 -13
- package/server/data/dcw-lines.json +14 -0
- package/server/data/dcw-products.json +14 -0
- package/server/data/dcw-recipes.json +28 -0
- package/server/data/dcw-rollback.json +122 -1
- package/server/data/dcw-runs.json +54 -36
- package/server/data/dcw-writes.json +60 -0
- package/server/data/dcws.json +42 -0
- package/server/data/line-runs.json +32 -22
- package/server/services/workshop/agents/adapters/omp-rpc-client.ts +65 -0
- package/server/services/workshop/agents/agent-interface.ts +26 -1
- package/server/services/workshop/agents/mock-agent.ts +12 -0
- package/server/services/workshop/agents/omp-agent.ts +277 -8
- package/server/services/workshop/db/database.ts +16 -1
- package/server/services/workshop/db/memory.repo.ts +22 -2
- package/server/services/workshop/prompts/loader.ts +6 -5
- package/server/services/workshop/runtime/agent-runtime.ts +52 -6
- package/server/services/workshop/runtime/channel-runtime.ts +14 -6
- package/server/services/workshop/runtime/manager.ts +192 -3
- package/server/services/workshop/runtime/memory.ts +313 -78
- package/server/services/workshop/types/task.ts +14 -0
- package/.output/public/_nuxt/builds/meta/f2f649c5-fd3b-4507-a3a1-8b4a194de72d.json +0 -1
|
@@ -5103,7 +5103,7 @@ function _expandFromEnv(value) {
|
|
|
5103
5103
|
const _inlineRuntimeConfig = {
|
|
5104
5104
|
"app": {
|
|
5105
5105
|
"baseURL": "/",
|
|
5106
|
-
"buildId": "
|
|
5106
|
+
"buildId": "d50c6ec2-801c-4ba2-97d8-a4db401b702c",
|
|
5107
5107
|
"buildAssetsDir": "/_nuxt/",
|
|
5108
5108
|
"cdnURL": ""
|
|
5109
5109
|
},
|
|
@@ -5133,7 +5133,7 @@ const _inlineRuntimeConfig = {
|
|
|
5133
5133
|
"public": {
|
|
5134
5134
|
"appName": "AgentWorkShop",
|
|
5135
5135
|
"appTitle": "AgentWorkShop",
|
|
5136
|
-
"version": "0.5.
|
|
5136
|
+
"version": "0.5.6",
|
|
5137
5137
|
"description": "基于 Nuxt 4 的配置驱动运行范式",
|
|
5138
5138
|
"mode": "dev",
|
|
5139
5139
|
"apiBase": "/api",
|
|
@@ -12226,6 +12226,15 @@ function createMemoryRepo(db) {
|
|
|
12226
12226
|
const agentIdsStmt = db.prepare(
|
|
12227
12227
|
`SELECT DISTINCT agent_id FROM agent_memories WHERE agent_id != ?`
|
|
12228
12228
|
);
|
|
12229
|
+
const channelIdsStmt = db.prepare(
|
|
12230
|
+
`SELECT DISTINCT channel_id AS channelId FROM agent_memories`
|
|
12231
|
+
);
|
|
12232
|
+
const getByIdStmt = db.prepare(
|
|
12233
|
+
`SELECT id, channel_id AS channelId, agent_id AS agentId, kind, title, content,
|
|
12234
|
+
importance, task_id AS taskId, access_count AS accessCount,
|
|
12235
|
+
last_accessed_at AS lastAccessedAt, created_at AS createdAt
|
|
12236
|
+
FROM agent_memories WHERE id = ?`
|
|
12237
|
+
);
|
|
12229
12238
|
let vecDims = null;
|
|
12230
12239
|
let vecFindRowStmt = null;
|
|
12231
12240
|
let vecDeleteRowStmt = null;
|
|
@@ -12325,6 +12334,15 @@ function createMemoryRepo(db) {
|
|
|
12325
12334
|
listMemoryAgentIds() {
|
|
12326
12335
|
return agentIdsStmt.all(TEAM_AGENT_ID).map((r) => r.agent_id);
|
|
12327
12336
|
},
|
|
12337
|
+
/** 有记忆的 channel 清单(team 域行按 channel 迭代维护用) */
|
|
12338
|
+
listChannelIds() {
|
|
12339
|
+
return channelIdsStmt.all().map((r) => r.channelId);
|
|
12340
|
+
},
|
|
12341
|
+
/** 按 id 取单行(brief 置顶注入等直取场景;不存在返回 null) */
|
|
12342
|
+
getById(id) {
|
|
12343
|
+
var _a;
|
|
12344
|
+
return (_a = getByIdStmt.get(id)) != null ? _a : null;
|
|
12345
|
+
},
|
|
12328
12346
|
// ===== vec:延迟建表(vecInit)/ 刷新写入(vecSet)/ 删除(vecDelete)/ 分区 kNN(vecSearch)=====
|
|
12329
12347
|
/** 首次调用按 dims 建表;同 dims 幂等 true;不同 dims 拒绝 false(禁用向量,绝不重建) */
|
|
12330
12348
|
vecInit(dims) {
|
|
@@ -13609,7 +13627,7 @@ function bindStreamSubscriptions(manager, stream) {
|
|
|
13609
13627
|
}
|
|
13610
13628
|
}));
|
|
13611
13629
|
stream.unsubs.push(manager.subscribeAgentStatus(channelId, (e) => {
|
|
13612
|
-
var _a2, _b2, _c2, _d2, _e;
|
|
13630
|
+
var _a2, _b2, _c2, _d2, _e, _f;
|
|
13613
13631
|
return publish(manager, stream, "agent.status", {
|
|
13614
13632
|
agentId: e.agentId,
|
|
13615
13633
|
state: e.state,
|
|
@@ -13617,7 +13635,8 @@ function bindStreamSubscriptions(manager, stream) {
|
|
|
13617
13635
|
currentTaskTitle: (_b2 = e.currentTaskTitle) != null ? _b2 : null,
|
|
13618
13636
|
currentTaskProgress: (_c2 = e.currentTaskProgress) != null ? _c2 : null,
|
|
13619
13637
|
queued: (_d2 = e.queuedCount) != null ? _d2 : 0,
|
|
13620
|
-
completed: (_e = e.completedCount) != null ? _e : 0
|
|
13638
|
+
completed: (_e = e.completedCount) != null ? _e : 0,
|
|
13639
|
+
context: (_f = e.context) != null ? _f : null
|
|
13621
13640
|
}, { agentId: e.agentId });
|
|
13622
13641
|
}));
|
|
13623
13642
|
stream.unsubs.push(manager.subscribeChannelEvents(channelId, (event, source) => mapAgentEvent(manager, stream, event, source)));
|
|
@@ -14253,13 +14272,24 @@ ${this.systemPromptPrefix}` }]
|
|
|
14253
14272
|
* 无触发器 → 不回复(信息性消息)。
|
|
14254
14273
|
*/
|
|
14255
14274
|
async *peerScript(request, ctx) {
|
|
14256
|
-
var _a;
|
|
14275
|
+
var _a, _b, _c;
|
|
14257
14276
|
const fromId = request.fromAgentId;
|
|
14258
14277
|
if (!fromId) return;
|
|
14259
14278
|
const requireReply = ((_a = request.message.metadata) == null ? void 0 : _a["x-aw-require-reply"]) === "true";
|
|
14260
14279
|
yield { kind: "status", status: { state: "WORKING", timestamp: (/* @__PURE__ */ new Date()).toISOString() } };
|
|
14261
14280
|
if (requireReply) {
|
|
14262
14281
|
const text = request.message.parts.map((p) => "text" in p ? p.text : "data" in p ? JSON.stringify(p.data) : "").join("\n");
|
|
14282
|
+
const crossChannel = ((_b = request.message.metadata) == null ? void 0 : _b["x-aw-cross-channel"]) === "true";
|
|
14283
|
+
const fromChannel = (_c = request.message.metadata) == null ? void 0 : _c["x-aw-from-channel"];
|
|
14284
|
+
if (crossChannel && typeof fromChannel === "string") {
|
|
14285
|
+
await ctx.workspace.sendCrossChannelMessage({
|
|
14286
|
+
toChannelId: fromChannel,
|
|
14287
|
+
parts: [{ text: `mock \u8DE8Channel\u56DE\u590D(${ctx.agentId}):\u5DF2\u5904\u7406\u300C${text.slice(0, 60)}\u300D\u3002\u6267\u884C\u7ED3\u679C:\u5B8C\u6210;\u4F60\u6240\u9700\u7684\u5185\u5BB9\u5DF2\u5305\u542B\u5728\u672C\u56DE\u590D\u4E2D\u3002\u672C\u56DE\u590D\u4E0D\u9700\u8981\u518D\u54CD\u5E94\u3002` }],
|
|
14288
|
+
inReplyTo: request.message.messageId
|
|
14289
|
+
});
|
|
14290
|
+
yield { kind: "done" };
|
|
14291
|
+
return;
|
|
14292
|
+
}
|
|
14263
14293
|
await ctx.workspace.sendMessage({
|
|
14264
14294
|
toAgentId: fromId,
|
|
14265
14295
|
parts: [{ text: `mock \u56DE\u590D(${ctx.agentId}):\u5DF2\u5904\u7406\u300C${text.slice(0, 60)}\u300D\u3002\u6267\u884C\u7ED3\u679C:\u5B8C\u6210;\u4F60\u6240\u9700\u7684\u5185\u5BB9\u5DF2\u5305\u542B\u5728\u672C\u56DE\u590D\u4E2D\u3002\u672C\u56DE\u590D\u4E0D\u9700\u8981\u518D\u54CD\u5E94\u3002` }],
|
|
@@ -14406,6 +14436,10 @@ class OmpRpcClient {
|
|
|
14406
14436
|
__publicField$l(this, "exitCode", null);
|
|
14407
14437
|
__publicField$l(this, "pending", /* @__PURE__ */ new Map());
|
|
14408
14438
|
__publicField$l(this, "seq", 0);
|
|
14439
|
+
/** 被动上下文跟踪:最近一次帧携带的累计 provider usage(get_session_stats 不可用时的兜底源) */
|
|
14440
|
+
__publicField$l(this, "lastUsage", null);
|
|
14441
|
+
/** 上下文窗口大小(外部经 get_state 探测后注入;null = 未知,percent 不可算) */
|
|
14442
|
+
__publicField$l(this, "contextWindow", null);
|
|
14409
14443
|
__publicField$l(this, "eventListeners", /* @__PURE__ */ new Set());
|
|
14410
14444
|
/** 原始帧 tap(chunk 重组后的每一帧,含 response/host_tool_call/extension_ui_request) */
|
|
14411
14445
|
__publicField$l(this, "rawFrameListeners", /* @__PURE__ */ new Set());
|
|
@@ -14422,6 +14456,39 @@ class OmpRpcClient {
|
|
|
14422
14456
|
get alive() {
|
|
14423
14457
|
return !!this.child && !this.exited;
|
|
14424
14458
|
}
|
|
14459
|
+
/** 注入上下文窗口大小(get_state 探测 model.contextWindow 后调用;幂等) */
|
|
14460
|
+
setContextWindow(tokens) {
|
|
14461
|
+
if (Number.isFinite(tokens) && tokens > 0) this.contextWindow = tokens;
|
|
14462
|
+
}
|
|
14463
|
+
/** 被动上下文用量快照(无探测 RPC;数据来自最近一次携带 usage 的帧) */
|
|
14464
|
+
getContextUsage() {
|
|
14465
|
+
if (!this.lastUsage) return null;
|
|
14466
|
+
const window = this.contextWindow;
|
|
14467
|
+
return {
|
|
14468
|
+
tokens: this.lastUsage.input,
|
|
14469
|
+
contextWindow: window,
|
|
14470
|
+
percent: window && window > 0 ? Math.min(1, this.lastUsage.input / window) : null
|
|
14471
|
+
};
|
|
14472
|
+
}
|
|
14473
|
+
/**
|
|
14474
|
+
* 从帧中防御性提取累计 usage(顶层 frame.usage 或 frame.message.usage;
|
|
14475
|
+
* input 兼容 input/inputTokens/promptTokens 命名;无有效 input 返回 null)。
|
|
14476
|
+
*/
|
|
14477
|
+
extractUsage(frame) {
|
|
14478
|
+
var _a, _b, _c, _d, _e;
|
|
14479
|
+
const raw = (_b = frame.usage) != null ? _b : (_a = frame.message) == null ? void 0 : _a.usage;
|
|
14480
|
+
if (!raw || typeof raw !== "object") return null;
|
|
14481
|
+
const input = Number((_d = (_c = raw.input) != null ? _c : raw.inputTokens) != null ? _d : raw.promptTokens);
|
|
14482
|
+
if (!Number.isFinite(input) || input <= 0) return null;
|
|
14483
|
+
const output = Number((_e = raw.output) != null ? _e : raw.outputTokens);
|
|
14484
|
+
const cacheRead = Number(raw.cacheRead);
|
|
14485
|
+
return {
|
|
14486
|
+
input,
|
|
14487
|
+
output: Number.isFinite(output) ? output : void 0,
|
|
14488
|
+
cacheRead: Number.isFinite(cacheRead) ? cacheRead : void 0,
|
|
14489
|
+
at: Date.now()
|
|
14490
|
+
};
|
|
14491
|
+
}
|
|
14425
14492
|
/**
|
|
14426
14493
|
* OS 级存活校准(系统休眠/强杀后 exit 事件可能不达,alive 会失真):
|
|
14427
14494
|
* 按 PID 探 OS 实际存在性,进程已死则收敛为已退出(与 exit 事件同路径:
|
|
@@ -14605,6 +14672,8 @@ stderr: ${this.stderrBuf.slice(-500)}` : ""}`));
|
|
|
14605
14672
|
dispatchFrame(frame) {
|
|
14606
14673
|
var _a;
|
|
14607
14674
|
const type = frame.type;
|
|
14675
|
+
const usage = this.extractUsage(frame);
|
|
14676
|
+
if (usage) this.lastUsage = usage;
|
|
14608
14677
|
for (const fn of this.rawFrameListeners) {
|
|
14609
14678
|
try {
|
|
14610
14679
|
fn(frame);
|
|
@@ -15130,7 +15199,7 @@ function seedHomePrompts(homePrompts) {
|
|
|
15130
15199
|
} catch {
|
|
15131
15200
|
}
|
|
15132
15201
|
}
|
|
15133
|
-
if (seeded > 0) console.log(`[prompts] \u5DF2\u5411 ${homePrompts} \
|
|
15202
|
+
if (seeded > 0) console.log(`[prompts] \u5DF2\u5411 ${homePrompts} \u8865\u79CD ${seeded} \u4E2A\u63D0\u793A\u8BCD\u6587\u4EF6`);
|
|
15134
15203
|
}
|
|
15135
15204
|
function promptsDir() {
|
|
15136
15205
|
if (process.env.AW_PROMPTS_DIR) {
|
|
@@ -15141,7 +15210,7 @@ function promptsDir() {
|
|
|
15141
15210
|
return base;
|
|
15142
15211
|
}
|
|
15143
15212
|
const homePrompts = join(awHome(process.env), "prompts");
|
|
15144
|
-
|
|
15213
|
+
seedHomePrompts(homePrompts);
|
|
15145
15214
|
const localConfigRoot = findLocalConfigRoot(process.cwd());
|
|
15146
15215
|
if (localConfigRoot) {
|
|
15147
15216
|
const candidate = join(localConfigRoot, "prompts");
|
|
@@ -19012,166 +19081,850 @@ ${anchorLines.join("\n")}` : ""}
|
|
|
19012
19081
|
var __defProp$7 = Object.defineProperty;
|
|
19013
19082
|
var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
19014
19083
|
var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
19015
|
-
const
|
|
19016
|
-
const
|
|
19017
|
-
const
|
|
19018
|
-
|
|
19019
|
-
|
|
19020
|
-
|
|
19021
|
-
|
|
19022
|
-
|
|
19023
|
-
|
|
19024
|
-
|
|
19025
|
-
|
|
19026
|
-
|
|
19027
|
-
|
|
19028
|
-
|
|
19029
|
-
|
|
19084
|
+
const W_RELEVANCE = 0.5;
|
|
19085
|
+
const W_RECENCY = 0.3;
|
|
19086
|
+
const W_IMPORTANCE = 0.2;
|
|
19087
|
+
const RECENT_FALLBACK = 5;
|
|
19088
|
+
const MAX_TERMS = 12;
|
|
19089
|
+
const MAX_CJK_TERMS = 24;
|
|
19090
|
+
const FTS_POOL = 20;
|
|
19091
|
+
const RRF_K = 60;
|
|
19092
|
+
const MMR_LAMBDA = 0.7;
|
|
19093
|
+
const RELATED_TASK_BOOST = 0.3;
|
|
19094
|
+
const CURATED_KINDS = /* @__PURE__ */ new Set(["brief", "chronicle", "reflection"]);
|
|
19095
|
+
const RECENCY_HALF_LIFE_DAYS = {
|
|
19096
|
+
"episodic-peer": 3,
|
|
19097
|
+
"episodic-task": 14,
|
|
19098
|
+
"episodic-session": 14,
|
|
19099
|
+
"episodic-team-task": 14,
|
|
19100
|
+
"semantic": 0,
|
|
19101
|
+
"brief": 0,
|
|
19102
|
+
"chronicle": 0,
|
|
19103
|
+
"reflection": 0
|
|
19104
|
+
};
|
|
19105
|
+
const CONTENT_STORE_LIMIT = 800;
|
|
19106
|
+
function envNum(name, fallback) {
|
|
19107
|
+
const n = Number(process.env[name]);
|
|
19108
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
19030
19109
|
}
|
|
19031
|
-
function
|
|
19032
|
-
return
|
|
19033
|
-
if ("text" in p) return p.text;
|
|
19034
|
-
if ("data" in p) return JSON.stringify(p.data);
|
|
19035
|
-
if ("url" in p) return p.url;
|
|
19036
|
-
if ("raw" in p) return p.raw;
|
|
19037
|
-
return "";
|
|
19038
|
-
}).join("\n");
|
|
19110
|
+
function segmentCJK(text) {
|
|
19111
|
+
return text.replace(/[\u4e00-\u9fff]+/g, (run) => ` ${run.split("").join(" ")} `);
|
|
19039
19112
|
}
|
|
19040
|
-
function
|
|
19041
|
-
|
|
19042
|
-
const
|
|
19043
|
-
const
|
|
19044
|
-
const
|
|
19045
|
-
|
|
19046
|
-
|
|
19047
|
-
|
|
19048
|
-
|
|
19049
|
-
const
|
|
19050
|
-
if (
|
|
19051
|
-
|
|
19052
|
-
}
|
|
19053
|
-
const
|
|
19054
|
-
|
|
19055
|
-
return `(${flat.length > 64 ? `${flat.slice(0, 64)}\u2026` : flat})`;
|
|
19113
|
+
function buildMatchQuery(text) {
|
|
19114
|
+
const cleaned = text.replace(/["'*().:+-]/g, " ").toLowerCase();
|
|
19115
|
+
const words = segmentCJK(cleaned).split(/\s+/).filter(Boolean);
|
|
19116
|
+
const cjkTerms = [];
|
|
19117
|
+
const otherTerms = [];
|
|
19118
|
+
for (const t of words) {
|
|
19119
|
+
const isCjk = /[\u4e00-\u9fff]/.test(t);
|
|
19120
|
+
if (!isCjk && (t.length < 2 || ["and", "or", "not", "near"].includes(t))) continue;
|
|
19121
|
+
const pool = isCjk ? cjkTerms : otherTerms;
|
|
19122
|
+
const cap = isCjk ? MAX_CJK_TERMS : MAX_TERMS;
|
|
19123
|
+
if (pool.length >= cap) continue;
|
|
19124
|
+
if (!pool.includes(t)) pool.push(t);
|
|
19125
|
+
}
|
|
19126
|
+
const terms = [...otherTerms, ...cjkTerms];
|
|
19127
|
+
return terms.length > 0 ? terms.map((t) => `"${t}"`).join(" OR ") : null;
|
|
19056
19128
|
}
|
|
19057
|
-
function
|
|
19058
|
-
|
|
19059
|
-
|
|
19060
|
-
|
|
19061
|
-
if (Array.isArray(parsed)) return parsed;
|
|
19062
|
-
return null;
|
|
19063
|
-
} catch {
|
|
19064
|
-
}
|
|
19065
|
-
const start = trimmed.indexOf("[");
|
|
19066
|
-
const end = trimmed.lastIndexOf("]");
|
|
19067
|
-
if (start >= 0 && end > start) {
|
|
19068
|
-
try {
|
|
19069
|
-
const parsed = JSON.parse(trimmed.slice(start, end + 1));
|
|
19070
|
-
if (Array.isArray(parsed)) return parsed;
|
|
19071
|
-
} catch {
|
|
19072
|
-
}
|
|
19073
|
-
}
|
|
19074
|
-
return null;
|
|
19129
|
+
function estimateTokens(text) {
|
|
19130
|
+
var _a;
|
|
19131
|
+
const cjk = ((_a = text.match(/[\u4e00-\u9fff]/g)) != null ? _a : []).length;
|
|
19132
|
+
return Math.ceil((text.length - cjk) / 4) + cjk;
|
|
19075
19133
|
}
|
|
19076
|
-
|
|
19077
|
-
|
|
19078
|
-
|
|
19079
|
-
|
|
19080
|
-
|
|
19081
|
-
|
|
19082
|
-
|
|
19083
|
-
|
|
19084
|
-
|
|
19085
|
-
|
|
19086
|
-
|
|
19087
|
-
|
|
19088
|
-
|
|
19089
|
-
|
|
19090
|
-
|
|
19091
|
-
|
|
19092
|
-
__publicField$7(this, "
|
|
19093
|
-
|
|
19094
|
-
__publicField$7(this, "
|
|
19095
|
-
|
|
19096
|
-
|
|
19097
|
-
__publicField$7(this, "
|
|
19098
|
-
|
|
19099
|
-
|
|
19100
|
-
/**
|
|
19101
|
-
* 当前待回执的触发上下文(自动关联兜底):
|
|
19102
|
-
* LLM 偶发省略 in_reply_to 参数 → 平台在 send_message_to_agent 时按上下文自动盖章,
|
|
19103
|
-
* 保证触发器回执关联契约不依赖模型传参纪律。
|
|
19104
|
-
*/
|
|
19105
|
-
__publicField$7(this, "replyContext", null);
|
|
19106
|
-
// ===== 团队名册(roster):全成员名单 + 专长,注入每个回合 =====
|
|
19107
|
-
/** 名册缓存(null = 待刷新);30s TTL——任何成员的增删改都会及时反映到名单 */
|
|
19108
|
-
__publicField$7(this, "rosterCache", null);
|
|
19109
|
-
__publicField$7(this, "rosterAt", 0);
|
|
19110
|
-
// ===== supervise() =====
|
|
19111
|
-
/** supervise 单飞守卫:同一 client 不并发 LLM 回合(残留回合与下一 prompt 混流的根因) */
|
|
19112
|
-
__publicField$7(this, "supervising", false);
|
|
19113
|
-
var _a, _b, _c, _d;
|
|
19114
|
-
this.config = config;
|
|
19115
|
-
this.selfAgentId = (_a = this.config.agentId) != null ? _a : "";
|
|
19116
|
-
this.agentName = (_b = this.config.name) != null ? _b : "agent";
|
|
19117
|
-
this.agentRole = (_c = this.config.role) != null ? _c : "worker";
|
|
19118
|
-
this.channelId = (_d = this.config.channelId) != null ? _d : "";
|
|
19134
|
+
function unsegmentCJK(text) {
|
|
19135
|
+
return text.replace(/(?<=[\u4e00-\u9fff])\s+(?=[\u4e00-\u9fff])/g, "").replace(/(?<=[\u4e00-\u9fff])\s+([,.;:!?,。;:!?])/g, "$1").replace(/([,.;:!?,。;:!?])\s+(?=[\u4e00-\u9fff])/g, "$1").replace(/([A-Za-z0-9])\s+(?=[\u4e00-\u9fff])/g, "$1 ").replace(/(?<=[\u4e00-\u9fff])\s+(?=[A-Za-z0-9])/g, " ").trim();
|
|
19136
|
+
}
|
|
19137
|
+
function partsText(parts) {
|
|
19138
|
+
return parts.map((p) => "text" in p ? p.text : "").filter(Boolean).join("\n");
|
|
19139
|
+
}
|
|
19140
|
+
function humanAgo(iso) {
|
|
19141
|
+
const ms = Date.now() - Date.parse(iso);
|
|
19142
|
+
if (Number.isNaN(ms)) return "?";
|
|
19143
|
+
if (ms < 6e4) return "\u521A\u521A";
|
|
19144
|
+
if (ms < 36e5) return `${Math.floor(ms / 6e4)}\u5206\u949F\u524D`;
|
|
19145
|
+
if (ms < 864e5) return `${Math.floor(ms / 36e5)}\u5C0F\u65F6\u524D`;
|
|
19146
|
+
return `${Math.floor(ms / 864e5)}\u5929\u524D`;
|
|
19147
|
+
}
|
|
19148
|
+
class AgentMemory {
|
|
19149
|
+
constructor(repo, opts) {
|
|
19150
|
+
__publicField$7(this, "repo", repo);
|
|
19151
|
+
__publicField$7(this, "opts", opts);
|
|
19152
|
+
__publicField$7(this, "embedder");
|
|
19153
|
+
// ===== 上下文治理/团队历史(P0-3 新增写入面;全部幂等 upsert)=====
|
|
19154
|
+
/** 会话压缩摘要序号(每实例自增;dedupKey 防同幂键覆盖) */
|
|
19155
|
+
__publicField$7(this, "sessionSeq", 0);
|
|
19156
|
+
var _a;
|
|
19157
|
+
this.embedder = (_a = opts.embedder) != null ? _a : null;
|
|
19119
19158
|
}
|
|
19120
|
-
|
|
19121
|
-
|
|
19122
|
-
|
|
19123
|
-
this.
|
|
19124
|
-
this.
|
|
19125
|
-
this.
|
|
19126
|
-
this.selfAgentId = input.agent.id;
|
|
19159
|
+
/** 向量层惰性初始化(vecReady 后 no-op;建表失败一次性禁用 embedder) */
|
|
19160
|
+
ensureVec() {
|
|
19161
|
+
var _a;
|
|
19162
|
+
if (this.repo.vecReady) return;
|
|
19163
|
+
const dims = (_a = this.embedder) == null ? void 0 : _a.dims();
|
|
19164
|
+
if (dims && !this.repo.vecInit(dims)) this.embedder = null;
|
|
19127
19165
|
}
|
|
19128
|
-
|
|
19129
|
-
|
|
19130
|
-
|
|
19131
|
-
|
|
19132
|
-
|
|
19133
|
-
|
|
19134
|
-
|
|
19135
|
-
|
|
19166
|
+
/** scope 过滤:private 仅本人行;shared 仅本 channel 的 team 行;auto 双域 */
|
|
19167
|
+
inScope(row, scope) {
|
|
19168
|
+
const isTeam = row.agentId === TEAM_AGENT_ID;
|
|
19169
|
+
if (isTeam && row.channelId !== this.opts.channelId) return false;
|
|
19170
|
+
return scope === "auto" ? isTeam || row.agentId === this.opts.agentId : scope === "shared" ? isTeam : row.agentId === this.opts.agentId;
|
|
19171
|
+
}
|
|
19172
|
+
/**
|
|
19173
|
+
* 混合检索原始命中(RRF 融合;不排序不 touch)。
|
|
19174
|
+
* FTS 榜与向量榜各按名次贡献 1/(k+rank) 累加,再按榜内最高分归一化到 0-1——
|
|
19175
|
+
* 相比 v1 的 max 距离归一化,弱首命中/两榜分纲不一致时排序依然稳定。
|
|
19176
|
+
*/
|
|
19177
|
+
async collectHits(query, scope) {
|
|
19178
|
+
const rrf = /* @__PURE__ */ new Map();
|
|
19179
|
+
const addRank = (row, rank) => {
|
|
19180
|
+
if (!this.inScope(row, scope)) return;
|
|
19181
|
+
const inc = 1 / (RRF_K + rank + 1);
|
|
19182
|
+
const cur = rrf.get(row.id);
|
|
19183
|
+
if (cur) cur.score += inc;
|
|
19184
|
+
else rrf.set(row.id, { row, score: inc });
|
|
19185
|
+
};
|
|
19186
|
+
const match = buildMatchQuery(query);
|
|
19187
|
+
if (match) {
|
|
19188
|
+
const found = this.repo.search(this.opts.agentId, match, FTS_POOL);
|
|
19189
|
+
found.forEach((row, i) => addRank(row, i));
|
|
19190
|
+
}
|
|
19191
|
+
if (this.embedder) {
|
|
19192
|
+
try {
|
|
19193
|
+
const [qv] = await this.embedder.embed([query]);
|
|
19194
|
+
if (qv) {
|
|
19195
|
+
this.ensureVec();
|
|
19196
|
+
const ownDomains = scope === "shared" ? [TEAM_AGENT_ID] : scope === "private" ? [this.opts.agentId] : [this.opts.agentId, TEAM_AGENT_ID];
|
|
19197
|
+
const vAll = ownDomains.flatMap((d) => this.repo.vecSearch(d, qv, d === TEAM_AGENT_ID ? 5 : 10));
|
|
19198
|
+
const distByRowid = /* @__PURE__ */ new Map();
|
|
19199
|
+
for (const { memRowid, distance } of vAll) {
|
|
19200
|
+
const prev = distByRowid.get(memRowid);
|
|
19201
|
+
if (prev === void 0 || distance < prev) distByRowid.set(memRowid, distance);
|
|
19202
|
+
}
|
|
19203
|
+
const rowids = [...distByRowid.entries()].sort((a, b) => a[1] - b[1]).map(([rid]) => rid);
|
|
19204
|
+
this.repo.listByRowids(rowids).forEach((row, i) => {
|
|
19205
|
+
if (row.agentId !== this.opts.agentId && row.agentId !== TEAM_AGENT_ID) return;
|
|
19206
|
+
addRank(row, i);
|
|
19207
|
+
});
|
|
19208
|
+
}
|
|
19209
|
+
} catch {
|
|
19136
19210
|
}
|
|
19137
19211
|
}
|
|
19138
|
-
|
|
19212
|
+
const hits = /* @__PURE__ */ new Map();
|
|
19213
|
+
let best = 0;
|
|
19214
|
+
for (const { score } of rrf.values()) {
|
|
19215
|
+
if (score > best) best = score;
|
|
19216
|
+
}
|
|
19217
|
+
for (const { row, score } of rrf.values()) {
|
|
19218
|
+
hits.set(row.id, { row, relevance: best > 0 ? score / best : 0 });
|
|
19219
|
+
}
|
|
19220
|
+
if (scope !== "shared") {
|
|
19221
|
+
for (const row of this.repo.listRecent(this.opts.agentId, RECENT_FALLBACK)) {
|
|
19222
|
+
if (CURATED_KINDS.has(row.kind)) continue;
|
|
19223
|
+
if (!hits.has(row.id)) hits.set(row.id, { row, relevance: 0.15 });
|
|
19224
|
+
}
|
|
19225
|
+
}
|
|
19226
|
+
return hits;
|
|
19139
19227
|
}
|
|
19140
|
-
/**
|
|
19141
|
-
|
|
19142
|
-
const
|
|
19143
|
-
const
|
|
19144
|
-
|
|
19145
|
-
|
|
19228
|
+
/** 排序(综合分降序;策展层排除/任务关联加权;不含预算/touch 副作用) */
|
|
19229
|
+
async rank(query, scope, opts = {}) {
|
|
19230
|
+
const hits = await this.collectHits(query, scope);
|
|
19231
|
+
const related = opts.relatedTaskIds && opts.relatedTaskIds.length > 0 ? new Set(opts.relatedTaskIds) : null;
|
|
19232
|
+
return [...hits.values()].filter((h) => !opts.excludeCurated || !CURATED_KINDS.has(h.row.kind)).map((h) => {
|
|
19233
|
+
let score = this.score(h.row, h.relevance);
|
|
19234
|
+
if (related && h.row.taskId && related.has(h.row.taskId)) {
|
|
19235
|
+
score = Math.min(1, score + RELATED_TASK_BOOST);
|
|
19236
|
+
}
|
|
19237
|
+
return { ...h, score };
|
|
19238
|
+
}).sort((a, b) => b.score - a.score);
|
|
19146
19239
|
}
|
|
19147
|
-
/**
|
|
19148
|
-
|
|
19240
|
+
/**
|
|
19241
|
+
* run/supervise 前的记忆注入:三层装配(硬顶 AW_MEMORY_INJECT_TOTAL)。
|
|
19242
|
+
* - L0 会话简报(brief 行,确定性置顶,不占检索);
|
|
19243
|
+
* - L1 相关性引子(RRF 混合检索 + MMR 多样性 + 任务关联加权,小预算);
|
|
19244
|
+
* - 完整内容由 Agent 经 search_memory 工具按需抓取(L2)。
|
|
19245
|
+
* 预算内装配;使用提示计费(防提示挤占正文预算)。
|
|
19246
|
+
*/
|
|
19247
|
+
async recall(query, recallOpts = {}) {
|
|
19149
19248
|
var _a, _b;
|
|
19150
|
-
const
|
|
19151
|
-
|
|
19152
|
-
|
|
19153
|
-
|
|
19154
|
-
|
|
19155
|
-
|
|
19249
|
+
const doTouch = recallOpts.touch !== false;
|
|
19250
|
+
const explicit = (_a = recallOpts.budgetTokens) != null ? _a : this.opts.budgetTokens;
|
|
19251
|
+
const budget = explicit != null ? explicit : envNum("AW_MEMORY_PRIMER_TOKENS", 300);
|
|
19252
|
+
const totalBudget = explicit != null ? explicit : envNum("AW_MEMORY_INJECT_TOTAL", 500);
|
|
19253
|
+
const scope = (_b = recallOpts.scope) != null ? _b : "auto";
|
|
19254
|
+
const scored = await this.rank(query, scope, { excludeCurated: true, relatedTaskIds: recallOpts.relatedTaskIds });
|
|
19255
|
+
const lines = [];
|
|
19256
|
+
const touched = [];
|
|
19257
|
+
let usedTotal = 0;
|
|
19258
|
+
const briefRef = this.repo.findByAgentDedup(this.opts.channelId, this.opts.agentId, `brief:${this.opts.agentId}`);
|
|
19259
|
+
const briefRow = briefRef ? this.repo.getById(briefRef.id) : null;
|
|
19260
|
+
if (briefRow) {
|
|
19261
|
+
const briefText = `## \u4F1A\u8BDD\u7B80\u62A5(\u81EA\u52A8\u7EF4\u62A4)
|
|
19262
|
+
${unsegmentCJK(briefRow.content)}`;
|
|
19263
|
+
const briefCost = estimateTokens(briefText);
|
|
19264
|
+
if (usedTotal + briefCost <= totalBudget) {
|
|
19265
|
+
usedTotal += briefCost;
|
|
19266
|
+
lines.push(briefText);
|
|
19267
|
+
}
|
|
19268
|
+
}
|
|
19269
|
+
const tipsText = [
|
|
19270
|
+
`\u8BB0\u5FC6\u4F7F\u7528\u63D0\u793A:`,
|
|
19271
|
+
`- \u4EE5\u4E0A\u53EA\u662F\u7EBF\u7D22\u7EA7\u6458\u8981\u3002\u5F00\u5DE5\u524D\u5148\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u591A\u4E0A\u4E0B\u6587:\u5386\u53F2\u7ED3\u8BBA/\u56E2\u961F\u7EA6\u5B9A/\u76F8\u4F3C\u4EFB\u52A1\u7ECF\u9A8C \u2192 \u8C03 search_memory(query, scope) \u4E3B\u52A8\u68C0\u7D22(\u8986\u76D6\u79C1\u6709+\u5171\u4EAB\u57DF)\u3002`,
|
|
19272
|
+
`- \u4F5C\u4E1A\u4E2D\u53D1\u73B0\u53EF\u590D\u7528\u7684\u7ED3\u8BBA\u3001\u7EA6\u5B9A\u3001\u6559\u8BAD \u2192 \u7ACB\u5373 save_memory \u6C89\u6DC0:scope=private \u5B58\u4E2A\u4EBA\u7ECF\u9A8C,scope=shared \u53D1\u5E03\u5230 Channel \u516C\u5171\u8BB0\u5FC6\u4F9B\u5168\u5458\u590D\u7528\u3002`
|
|
19273
|
+
].join("\n");
|
|
19274
|
+
const tipsCost = estimateTokens(tipsText);
|
|
19275
|
+
const candidates = scored.slice();
|
|
19276
|
+
const tokenSet = (row) => new Set(unsegmentCJK(`${row.title} ${row.content.slice(0, 200)}`).toLowerCase().split(/\s+/).filter(Boolean));
|
|
19277
|
+
const selectedTokens = [];
|
|
19278
|
+
let usedPrimer = 0;
|
|
19279
|
+
while (candidates.length > 0 && lines.length < 12) {
|
|
19280
|
+
let bestIdx = -1;
|
|
19281
|
+
let bestGain = -Infinity;
|
|
19282
|
+
let bestTokens = null;
|
|
19283
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
19284
|
+
const c2 = candidates[i];
|
|
19285
|
+
const toks = tokenSet(c2.row);
|
|
19286
|
+
let maxSim = 0;
|
|
19287
|
+
for (const st of selectedTokens) {
|
|
19288
|
+
if (st.size === 0 || toks.size === 0) continue;
|
|
19289
|
+
let inter = 0;
|
|
19290
|
+
for (const t of toks) if (st.has(t)) inter++;
|
|
19291
|
+
const sim = inter / (st.size + toks.size - inter);
|
|
19292
|
+
if (sim > maxSim) maxSim = sim;
|
|
19293
|
+
}
|
|
19294
|
+
const gain = MMR_LAMBDA * c2.score - (1 - MMR_LAMBDA) * maxSim;
|
|
19295
|
+
if (gain > bestGain) {
|
|
19296
|
+
bestGain = gain;
|
|
19297
|
+
bestIdx = i;
|
|
19298
|
+
bestTokens = toks;
|
|
19299
|
+
}
|
|
19300
|
+
}
|
|
19301
|
+
if (bestIdx < 0) break;
|
|
19302
|
+
const [c] = candidates.splice(bestIdx, 1);
|
|
19303
|
+
const line = this.formatLine(c.row);
|
|
19304
|
+
const cost = estimateTokens(line);
|
|
19305
|
+
if (usedPrimer + tipsCost + cost > budget || usedTotal + cost + tipsCost > totalBudget) continue;
|
|
19306
|
+
usedPrimer += cost;
|
|
19307
|
+
usedTotal += cost;
|
|
19308
|
+
lines.push(line);
|
|
19309
|
+
selectedTokens.push(bestTokens);
|
|
19310
|
+
if (doTouch) touched.push(c.row.id);
|
|
19156
19311
|
}
|
|
19312
|
+
if (lines.length === 0) return null;
|
|
19313
|
+
for (const id of touched) this.repo.touch(id);
|
|
19314
|
+
return [
|
|
19315
|
+
`## \u76F8\u5173\u8BB0\u5FC6(\u81EA\u52A8\u53EC\u56DE\u7684\u9AD8\u76F8\u5173/\u6700\u8FD1\u7EBF\u7D22\u6458\u8981;\u4E0E\u5F53\u524D\u4EFB\u52A1\u51B2\u7A81\u65F6,\u4EE5\u5F53\u524D\u4EFB\u52A1\u4E3A\u51C6)`,
|
|
19316
|
+
...lines,
|
|
19317
|
+
tipsText
|
|
19318
|
+
].join("\n");
|
|
19157
19319
|
}
|
|
19158
19320
|
/**
|
|
19159
|
-
*
|
|
19160
|
-
*
|
|
19161
|
-
*
|
|
19321
|
+
* 工具按需抓取(search_memory):结构化片段返回,content 还原为未切分原文。
|
|
19322
|
+
* 触发 touch(access_count 强化后续召回排序);limit 上限防御;
|
|
19323
|
+
* relatedTaskIds 透传任务关联加权(与 recall 同源排序)。
|
|
19162
19324
|
*/
|
|
19163
|
-
|
|
19164
|
-
var _a;
|
|
19165
|
-
(_a =
|
|
19166
|
-
|
|
19167
|
-
|
|
19168
|
-
|
|
19169
|
-
return
|
|
19170
|
-
|
|
19171
|
-
|
|
19172
|
-
|
|
19173
|
-
|
|
19174
|
-
|
|
19325
|
+
async recallRows(query, opts = {}) {
|
|
19326
|
+
var _a, _b;
|
|
19327
|
+
const scope = (_a = opts.scope) != null ? _a : "auto";
|
|
19328
|
+
const limit = Math.min(Math.max((_b = opts.limit) != null ? _b : 5, 1), 20);
|
|
19329
|
+
const scored = (await this.rank(query, scope, { relatedTaskIds: opts.relatedTaskIds })).slice(0, limit);
|
|
19330
|
+
for (const s of scored) this.repo.touch(s.row.id);
|
|
19331
|
+
return scored.map((s) => ({
|
|
19332
|
+
id: s.row.id,
|
|
19333
|
+
kind: s.row.kind,
|
|
19334
|
+
title: s.row.title,
|
|
19335
|
+
content: unsegmentCJK(s.row.content).slice(0, 500),
|
|
19336
|
+
importance: s.row.importance,
|
|
19337
|
+
createdAt: s.row.createdAt,
|
|
19338
|
+
score: Math.round(s.score * 1e3) / 1e3,
|
|
19339
|
+
source: s.row.agentId === TEAM_AGENT_ID ? "shared" : "private"
|
|
19340
|
+
}));
|
|
19341
|
+
}
|
|
19342
|
+
/**
|
|
19343
|
+
* Agent 主动沉淀(save_memory 工具):把作业过程中的可复用结论/经验写入记忆库。
|
|
19344
|
+
* scope='private' → 本人 semantic 域;scope='shared' → Channel 公共域(全员可检索;
|
|
19345
|
+
* dedupKey 按来源 Agent 命名空间隔离,避免多 Agent 同 key 互相覆盖)。写入后自动向量化。
|
|
19346
|
+
*/
|
|
19347
|
+
async save(input) {
|
|
19348
|
+
var _a, _b;
|
|
19349
|
+
const shared = input.scope === "shared";
|
|
19350
|
+
const rawKey = ((_a = input.dedupKey) == null ? void 0 : _a.trim()) || `agent-save:${randomUUID$1().slice(0, 8)}`;
|
|
19351
|
+
const dedupKey = shared ? `agent:${this.opts.agentId}:${rawKey}` : rawKey;
|
|
19352
|
+
const owner = shared ? TEAM_AGENT_ID : this.opts.agentId;
|
|
19353
|
+
this.repo.upsert({
|
|
19354
|
+
channelId: this.opts.channelId,
|
|
19355
|
+
agentId: owner,
|
|
19356
|
+
kind: "semantic",
|
|
19357
|
+
title: input.title,
|
|
19358
|
+
titleFts: segmentCJK(input.title),
|
|
19359
|
+
content: segmentCJK(input.content).slice(0, CONTENT_STORE_LIMIT),
|
|
19360
|
+
importance: (_b = input.importance) != null ? _b : shared ? 0.85 : 0.7,
|
|
19361
|
+
taskId: null,
|
|
19362
|
+
dedupKey
|
|
19363
|
+
});
|
|
19364
|
+
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, owner, dedupKey, input.content);
|
|
19365
|
+
if (shared) await this.updateBrief();
|
|
19366
|
+
return { scope: input.scope, dedupKey };
|
|
19367
|
+
}
|
|
19368
|
+
/** run 后(任务路径;仅终态调用):harvest TaskEngine 终态 + deliverable,并刷新 L0 简报 */
|
|
19369
|
+
async recordTaskOutcome(task) {
|
|
19370
|
+
const preferred = task.artifacts.filter((a) => a.name === "deliverable" || a.name === "summary");
|
|
19371
|
+
const source = preferred.length > 0 ? preferred : task.artifacts;
|
|
19372
|
+
const deliverable = source.flatMap((a) => a.parts).map((p) => "text" in p ? p.text : "").join(" ").trim();
|
|
19373
|
+
const content = deliverable || task.description || task.title;
|
|
19374
|
+
this.repo.upsert({
|
|
19375
|
+
channelId: this.opts.channelId,
|
|
19376
|
+
agentId: this.opts.agentId,
|
|
19377
|
+
kind: "episodic-task",
|
|
19378
|
+
title: task.title,
|
|
19379
|
+
titleFts: segmentCJK(task.title),
|
|
19380
|
+
content: segmentCJK(content).slice(0, CONTENT_STORE_LIMIT),
|
|
19381
|
+
importance: task.state === "COMPLETED" ? 0.8 : 0.55,
|
|
19382
|
+
taskId: task.id,
|
|
19383
|
+
dedupKey: `task:${task.id}`
|
|
19384
|
+
});
|
|
19385
|
+
await this.vectorize(content, `task:${task.id}`);
|
|
19386
|
+
await this.updateBrief();
|
|
19387
|
+
}
|
|
19388
|
+
/** run 后(点对点路径):请求 + 我方回复摘要 */
|
|
19389
|
+
async recordPeerExchange(msg, replyText) {
|
|
19390
|
+
var _a, _b, _c;
|
|
19391
|
+
const ask = partsText(msg.parts).slice(0, 150);
|
|
19392
|
+
const content = replyText ? `\u95EE:${ask} \u7B54:${replyText.slice(0, 250)}` : ask;
|
|
19393
|
+
const fromId = (_b = (_a = msg.metadata) == null ? void 0 : _a["x-aw-from-agent"]) != null ? _b : "unknown";
|
|
19394
|
+
const title = `\u6765\u81EA ${fromId} \u7684\u6D88\u606F`;
|
|
19395
|
+
this.repo.upsert({
|
|
19396
|
+
channelId: this.opts.channelId,
|
|
19397
|
+
agentId: this.opts.agentId,
|
|
19398
|
+
kind: "episodic-peer",
|
|
19399
|
+
title,
|
|
19400
|
+
titleFts: segmentCJK(title),
|
|
19401
|
+
content: segmentCJK(content).slice(0, 600),
|
|
19402
|
+
importance: 0.4,
|
|
19403
|
+
taskId: (_c = msg.taskId) != null ? _c : null,
|
|
19404
|
+
dedupKey: `peer:${msg.messageId}`
|
|
19405
|
+
});
|
|
19406
|
+
await this.vectorize(content, `peer:${msg.messageId}`);
|
|
19407
|
+
}
|
|
19408
|
+
/** 写入后向量化(委托模块级 vectorizeMemory;未切分原文,失败静默留 FTS) */
|
|
19409
|
+
async vectorize(plainContent, dedupKey) {
|
|
19410
|
+
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, this.opts.agentId, dedupKey, plainContent);
|
|
19411
|
+
}
|
|
19412
|
+
/**
|
|
19413
|
+
* 压缩摘要入库(compaction harvest):kind=episodic-session,14d 保鲜,向量化一次。
|
|
19414
|
+
* 三路统一入口(平台主动 compact / omp 阈值自动 / overflow),dedupKey 含序号防互踩。
|
|
19415
|
+
*/
|
|
19416
|
+
async recordSessionCompaction(input) {
|
|
19417
|
+
this.sessionSeq += 1;
|
|
19418
|
+
const dedupKey = `session:${this.opts.agentId}:c${this.sessionSeq}`;
|
|
19419
|
+
const meta = [];
|
|
19420
|
+
if (typeof input.tokensBefore === "number") meta.push(`\u538B\u7F29\u524D ${input.tokensBefore} tok`);
|
|
19421
|
+
if (typeof input.tokensAfter === "number") meta.push(`\u538B\u7F29\u540E\u7EA6 ${input.tokensAfter} tok`);
|
|
19422
|
+
if (input.reason) meta.push(`\u89E6\u53D1=${input.reason}`);
|
|
19423
|
+
const head = meta.length > 0 ? `[\u4F1A\u8BDD\u538B\u7F29\u6458\u8981 \xB7 ${meta.join(" \xB7 ")}]
|
|
19424
|
+
` : "[\u4F1A\u8BDD\u538B\u7F29\u6458\u8981]\n";
|
|
19425
|
+
this.repo.upsert({
|
|
19426
|
+
channelId: this.opts.channelId,
|
|
19427
|
+
agentId: this.opts.agentId,
|
|
19428
|
+
kind: "episodic-session",
|
|
19429
|
+
title: `\u4F1A\u8BDD\u538B\u7F29\u6458\u8981 #${this.sessionSeq}`,
|
|
19430
|
+
titleFts: segmentCJK("\u4F1A\u8BDD\u538B\u7F29\u6458\u8981"),
|
|
19431
|
+
content: segmentCJK(`${head}${input.summary}`).slice(0, CONTENT_STORE_LIMIT),
|
|
19432
|
+
importance: 0.75,
|
|
19433
|
+
taskId: null,
|
|
19434
|
+
dedupKey
|
|
19435
|
+
});
|
|
19436
|
+
await this.vectorize(input.summary, dedupKey);
|
|
19437
|
+
return { dedupKey };
|
|
19438
|
+
}
|
|
19439
|
+
/**
|
|
19440
|
+
* L0 会话简报刷新(零 LLM 模板拼装;brief:<agentId> 幂等单行;免向量化——
|
|
19441
|
+
* 确定性层恒注入,无需被检索;FTS 仍可命中)。数据源=本人已有记忆行,零额外查询依赖。
|
|
19442
|
+
*/
|
|
19443
|
+
async updateBrief() {
|
|
19444
|
+
const own = this.repo.listByAgentChannel(this.opts.channelId, this.opts.agentId, 40).filter((r) => r.kind === "episodic-task");
|
|
19445
|
+
const shared = this.repo.listByAgentChannel(this.opts.channelId, TEAM_AGENT_ID, 40).filter((r) => r.kind === "semantic");
|
|
19446
|
+
const lines = [];
|
|
19447
|
+
const done = own.filter((r) => r.importance >= 0.75).slice(0, 3);
|
|
19448
|
+
if (done.length > 0) {
|
|
19449
|
+
lines.push(`\u6700\u8FD1\u5B8C\u6210:`);
|
|
19450
|
+
done.forEach((r, i) => {
|
|
19451
|
+
lines.push(`${i + 1}) ${r.title} \u2014 ${unsegmentCJK(r.content).slice(0, 30)}`);
|
|
19452
|
+
});
|
|
19453
|
+
}
|
|
19454
|
+
if (shared.length > 0) {
|
|
19455
|
+
lines.push(`\u56E2\u961F\u5171\u4EAB\u7EA6\u5B9A:${shared.slice(0, 2).map((r) => r.title).join(";")}`);
|
|
19456
|
+
}
|
|
19457
|
+
if (lines.length === 0) return;
|
|
19458
|
+
this.repo.upsert({
|
|
19459
|
+
channelId: this.opts.channelId,
|
|
19460
|
+
agentId: this.opts.agentId,
|
|
19461
|
+
kind: "brief",
|
|
19462
|
+
title: "\u4F1A\u8BDD\u7B80\u62A5",
|
|
19463
|
+
titleFts: segmentCJK("\u4F1A\u8BDD\u7B80\u62A5"),
|
|
19464
|
+
content: segmentCJK(lines.join("\n")),
|
|
19465
|
+
importance: 0.6,
|
|
19466
|
+
taskId: null,
|
|
19467
|
+
dedupKey: `brief:${this.opts.agentId}`
|
|
19468
|
+
});
|
|
19469
|
+
}
|
|
19470
|
+
/**
|
|
19471
|
+
* 团队任务成果入共享域(挂 channel task 终态事件;team-task:<taskId> 幂等;向量化)。
|
|
19472
|
+
* 全员 search_memory(scope=shared) 即可命中"谁做完了什么/为什么失败"。
|
|
19473
|
+
*/
|
|
19474
|
+
async appendTeamTaskRecord(input) {
|
|
19475
|
+
const dedupKey = `team-task:${input.taskId}`;
|
|
19476
|
+
this.repo.upsert({
|
|
19477
|
+
channelId: this.opts.channelId,
|
|
19478
|
+
agentId: TEAM_AGENT_ID,
|
|
19479
|
+
kind: "episodic-team-task",
|
|
19480
|
+
title: input.title,
|
|
19481
|
+
titleFts: segmentCJK(input.title),
|
|
19482
|
+
content: segmentCJK(input.content).slice(0, CONTENT_STORE_LIMIT),
|
|
19483
|
+
importance: input.importance,
|
|
19484
|
+
taskId: input.taskId,
|
|
19485
|
+
dedupKey
|
|
19486
|
+
});
|
|
19487
|
+
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, TEAM_AGENT_ID, dedupKey, input.content);
|
|
19488
|
+
}
|
|
19489
|
+
/** 团队编年史滚动重写(chronicle:<channelId> 幂等单行;免向量化;策展层豁免维护) */
|
|
19490
|
+
upsertChronicle(entriesText) {
|
|
19491
|
+
this.repo.upsert({
|
|
19492
|
+
channelId: this.opts.channelId,
|
|
19493
|
+
agentId: TEAM_AGENT_ID,
|
|
19494
|
+
kind: "chronicle",
|
|
19495
|
+
title: "\u56E2\u961F\u7F16\u5E74\u53F2",
|
|
19496
|
+
titleFts: segmentCJK("\u56E2\u961F\u7F16\u5E74\u53F2"),
|
|
19497
|
+
content: segmentCJK(entriesText).slice(0, 1500),
|
|
19498
|
+
importance: 0.9,
|
|
19499
|
+
taskId: null,
|
|
19500
|
+
dedupKey: `chronicle:${this.opts.channelId}`
|
|
19501
|
+
});
|
|
19502
|
+
}
|
|
19503
|
+
/** 空闲反思行(reflection:<agentId>:<month> 幂等单行;免向量化;策展层豁免维护) */
|
|
19504
|
+
upsertReflection(input) {
|
|
19505
|
+
this.repo.upsert({
|
|
19506
|
+
channelId: this.opts.channelId,
|
|
19507
|
+
agentId: this.opts.agentId,
|
|
19508
|
+
kind: "reflection",
|
|
19509
|
+
title: `\u4F5C\u4E1A\u53CD\u601D ${input.month}`,
|
|
19510
|
+
titleFts: segmentCJK(`\u4F5C\u4E1A\u53CD\u601D ${input.month}`),
|
|
19511
|
+
content: segmentCJK(input.content).slice(0, CONTENT_STORE_LIMIT),
|
|
19512
|
+
importance: 0.7,
|
|
19513
|
+
taskId: null,
|
|
19514
|
+
dedupKey: `reflection:${this.opts.agentId}:${input.month}`
|
|
19515
|
+
});
|
|
19516
|
+
}
|
|
19517
|
+
/** kind 感知综合分:时近衰减按 kind 半衰期(知识/策展层不随时间贬值) */
|
|
19518
|
+
score(row, relevance) {
|
|
19519
|
+
var _a;
|
|
19520
|
+
const halfLife = (_a = RECENCY_HALF_LIFE_DAYS[row.kind]) != null ? _a : 7;
|
|
19521
|
+
const ageDays = (Date.now() - Date.parse(row.createdAt)) / 864e5;
|
|
19522
|
+
const recency = halfLife <= 0 ? 1 : Math.exp(-ageDays / halfLife);
|
|
19523
|
+
const importance = Math.min(1, row.importance + row.accessCount * 0.05);
|
|
19524
|
+
return W_RELEVANCE * relevance + W_RECENCY * recency + W_IMPORTANCE * importance;
|
|
19525
|
+
}
|
|
19526
|
+
formatLine(row) {
|
|
19527
|
+
var _a;
|
|
19528
|
+
const tag = (_a = {
|
|
19529
|
+
"episodic-task": "\u4EFB\u52A1",
|
|
19530
|
+
"episodic-team-task": "\u56E2\u961F\u4EFB\u52A1",
|
|
19531
|
+
"episodic-peer": "\u534F\u4F5C",
|
|
19532
|
+
"episodic-session": "\u4F1A\u8BDD",
|
|
19533
|
+
"brief": "\u7B80\u62A5",
|
|
19534
|
+
"chronicle": "\u7F16\u5E74\u53F2",
|
|
19535
|
+
"reflection": "\u53CD\u601D"
|
|
19536
|
+
}[row.kind]) != null ? _a : "\u5171\u4EAB";
|
|
19537
|
+
const content = unsegmentCJK(row.content);
|
|
19538
|
+
const short = content.length > 240 ? `${content.slice(0, 240)}\u2026` : content;
|
|
19539
|
+
return `- [${humanAgo(row.createdAt)}\xB7${tag}] ${row.title}:${short}`;
|
|
19540
|
+
}
|
|
19541
|
+
}
|
|
19542
|
+
async function vectorizeMemory(repo, embedder, channelId, agentId, dedupKey, plainContent) {
|
|
19543
|
+
if (!embedder) return;
|
|
19544
|
+
try {
|
|
19545
|
+
const [vec] = await embedder.embed([plainContent]);
|
|
19546
|
+
if (!vec) return;
|
|
19547
|
+
const dims = embedder.dims();
|
|
19548
|
+
if (dims && !repo.vecInit(dims)) return;
|
|
19549
|
+
const at = repo.findByAgentDedup(channelId, agentId, dedupKey);
|
|
19550
|
+
if (at) repo.vecSet(at.rowid, agentId, vec);
|
|
19551
|
+
} catch {
|
|
19552
|
+
}
|
|
19553
|
+
}
|
|
19554
|
+
function runMemoryMaintenance(repo, opts = {}) {
|
|
19555
|
+
var _a, _b;
|
|
19556
|
+
const expireDays = (_a = opts.expireDays) != null ? _a : envNum("AW_MEMORY_EXPIRE_DAYS", 180);
|
|
19557
|
+
const sessionExpireDays = envNum("AW_MEMORY_EXPIRE_SESSION_DAYS", 14);
|
|
19558
|
+
const cap = (_b = opts.cap) != null ? _b : envNum("AW_MEMORY_CAP", 500);
|
|
19559
|
+
const now = Date.now();
|
|
19560
|
+
let deletedExpired = 0;
|
|
19561
|
+
let evicted = 0;
|
|
19562
|
+
const expireMsFor = (kind) => (kind === "episodic-session" ? sessionExpireDays : expireDays) * 864e5;
|
|
19563
|
+
const expireAndEvict = (rows) => {
|
|
19564
|
+
var _a2;
|
|
19565
|
+
for (const r of rows) {
|
|
19566
|
+
if (now - Date.parse((_a2 = r.lastAccessedAt) != null ? _a2 : r.createdAt) > expireMsFor(r.kind)) {
|
|
19567
|
+
repo.vecDelete(r.rowid);
|
|
19568
|
+
repo.delete(r.id);
|
|
19569
|
+
deletedExpired++;
|
|
19570
|
+
}
|
|
19571
|
+
}
|
|
19572
|
+
const remaining = rows.filter((r) => repo.getById(r.id) !== null);
|
|
19573
|
+
if (remaining.length > cap) {
|
|
19574
|
+
const sorted = remaining.map((r) => ({ r, s: r.importance + r.accessCount * 0.05 })).sort((a, b) => b.s - a.s);
|
|
19575
|
+
for (const { r } of sorted.slice(cap)) {
|
|
19576
|
+
repo.vecDelete(r.rowid);
|
|
19577
|
+
repo.delete(r.id);
|
|
19578
|
+
evicted++;
|
|
19579
|
+
}
|
|
19580
|
+
}
|
|
19581
|
+
};
|
|
19582
|
+
for (const agentId of repo.listMemoryAgentIds()) {
|
|
19583
|
+
expireAndEvict(repo.listByAgentWithRowid(agentId, 1e6).filter((r) => r.kind.startsWith("episodic")));
|
|
19584
|
+
}
|
|
19585
|
+
expireAndEvict(repo.listByAgentWithRowid(TEAM_AGENT_ID, 1e6).filter((r) => r.kind === "episodic-team-task"));
|
|
19586
|
+
let cleanedVec = 0;
|
|
19587
|
+
try {
|
|
19588
|
+
cleanedVec = repo.vecCleanOrphans();
|
|
19589
|
+
} catch {
|
|
19590
|
+
}
|
|
19591
|
+
return { deletedExpired, evicted, cleanedVec };
|
|
19592
|
+
}
|
|
19593
|
+
|
|
19594
|
+
var __defProp$6 = Object.defineProperty;
|
|
19595
|
+
var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
19596
|
+
var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
19597
|
+
const log$5 = createLogger("workshop.omp");
|
|
19598
|
+
const HOST_TOOLS = loadHostToolDefs();
|
|
19599
|
+
const LEAD_ONLY_TOOL_NAMES = /* @__PURE__ */ new Set([
|
|
19600
|
+
"dispatch_task",
|
|
19601
|
+
"get_queue_overview",
|
|
19602
|
+
"read_channel_mail",
|
|
19603
|
+
"reassign_task",
|
|
19604
|
+
"update_task",
|
|
19605
|
+
"create_team_agent",
|
|
19606
|
+
"update_team_agent",
|
|
19607
|
+
"remove_team_agent"
|
|
19608
|
+
]);
|
|
19609
|
+
function hostToolsForRole(role) {
|
|
19610
|
+
if (role === "lead") return HOST_TOOLS;
|
|
19611
|
+
return HOST_TOOLS.filter((t) => !LEAD_ONLY_TOOL_NAMES.has(t.name));
|
|
19612
|
+
}
|
|
19613
|
+
function partsToText$1(parts) {
|
|
19614
|
+
return parts.map((p) => {
|
|
19615
|
+
if ("text" in p) return p.text;
|
|
19616
|
+
if ("data" in p) return JSON.stringify(p.data);
|
|
19617
|
+
if ("url" in p) return p.url;
|
|
19618
|
+
if ("raw" in p) return p.raw;
|
|
19619
|
+
return "";
|
|
19620
|
+
}).join("\n");
|
|
19621
|
+
}
|
|
19622
|
+
function toolArgsPreview(args) {
|
|
19623
|
+
if (!args || typeof args !== "object" || Array.isArray(args)) return "";
|
|
19624
|
+
const a = args;
|
|
19625
|
+
const single = ["path", "file", "filename", "command", "cmd", "query", "pattern", "url", "taskId", "task_id", "id", "name", "toolName"];
|
|
19626
|
+
const pick = single.find((k) => typeof a[k] === "string" && a[k].length > 0);
|
|
19627
|
+
let preview;
|
|
19628
|
+
if (pick) {
|
|
19629
|
+
preview = a[pick];
|
|
19630
|
+
} else {
|
|
19631
|
+
const scalars = Object.entries(a).filter(([, v]) => typeof v === "string" || typeof v === "number" || typeof v === "boolean").slice(0, 2).map(([k, v]) => `${k}=${String(v)}`);
|
|
19632
|
+
if (scalars.length === 0) return "";
|
|
19633
|
+
preview = scalars.join(", ");
|
|
19634
|
+
}
|
|
19635
|
+
const flat = preview.replace(/\s+/g, " ").trim();
|
|
19636
|
+
if (!flat) return "";
|
|
19637
|
+
return `(${flat.length > 64 ? `${flat.slice(0, 64)}\u2026` : flat})`;
|
|
19638
|
+
}
|
|
19639
|
+
function extractJsonArray(text) {
|
|
19640
|
+
const trimmed = text.trim();
|
|
19641
|
+
try {
|
|
19642
|
+
const parsed = JSON.parse(trimmed);
|
|
19643
|
+
if (Array.isArray(parsed)) return parsed;
|
|
19644
|
+
return null;
|
|
19645
|
+
} catch {
|
|
19646
|
+
}
|
|
19647
|
+
const start = trimmed.indexOf("[");
|
|
19648
|
+
const end = trimmed.lastIndexOf("]");
|
|
19649
|
+
if (start >= 0 && end > start) {
|
|
19650
|
+
try {
|
|
19651
|
+
const parsed = JSON.parse(trimmed.slice(start, end + 1));
|
|
19652
|
+
if (Array.isArray(parsed)) return parsed;
|
|
19653
|
+
} catch {
|
|
19654
|
+
}
|
|
19655
|
+
}
|
|
19656
|
+
return null;
|
|
19657
|
+
}
|
|
19658
|
+
class OmpRpcAgentImpl {
|
|
19659
|
+
constructor(config = {}) {
|
|
19660
|
+
__publicField$6(this, "config");
|
|
19661
|
+
__publicField$6(this, "client", null);
|
|
19662
|
+
__publicField$6(this, "workspace", null);
|
|
19663
|
+
__publicField$6(this, "agentInfo", null);
|
|
19664
|
+
__publicField$6(this, "hostToolsRegistered", false);
|
|
19665
|
+
/** 当前 run() 的 taskId(worker 完成任务时用) */
|
|
19666
|
+
__publicField$6(this, "currentTaskId", null);
|
|
19667
|
+
/**
|
|
19668
|
+
* 会话回合状态(steer 可靠注入的依据):
|
|
19669
|
+
* omp 的 steer 仅在回合 streaming 中生效——prompt 已入列但尚未开始输出时,
|
|
19670
|
+
* steer 会"成功"返回但被静默丢弃。因此注入方轮询直到回合输出开始(streamingStarted)
|
|
19671
|
+
* 才发送;若回合在等待期间结束,改走 follow_up(prompt 通道)兜底投递。
|
|
19672
|
+
*/
|
|
19673
|
+
__publicField$6(this, "streaming", false);
|
|
19674
|
+
__publicField$6(this, "turnActive", false);
|
|
19675
|
+
/** 当前回合产生的 assistant 文本(供诊断) */
|
|
19676
|
+
__publicField$6(this, "turnText", "");
|
|
19677
|
+
/** agent 身份信息(factory 注入;无需等待 init()) */
|
|
19678
|
+
__publicField$6(this, "selfAgentId", "");
|
|
19679
|
+
__publicField$6(this, "agentName", "agent");
|
|
19680
|
+
__publicField$6(this, "agentRole", "worker");
|
|
19681
|
+
__publicField$6(this, "channelId", "");
|
|
19682
|
+
/**
|
|
19683
|
+
* 当前待回执的触发上下文(自动关联兜底):
|
|
19684
|
+
* LLM 偶发省略 in_reply_to 参数 → 平台在 send_message_to_agent 时按上下文自动盖章,
|
|
19685
|
+
* 保证触发器回执关联契约不依赖模型传参纪律。
|
|
19686
|
+
*/
|
|
19687
|
+
__publicField$6(this, "replyContext", null);
|
|
19688
|
+
// ===== 上下文治理(70% 无中断压缩环)=====
|
|
19689
|
+
/** 压缩进行中(平台 gate 与 omp 原生压缩共用互斥位) */
|
|
19690
|
+
__publicField$6(this, "compacting", false);
|
|
19691
|
+
__publicField$6(this, "lastCompactAt", 0);
|
|
19692
|
+
/** omp 不支持 compact 命令(旧版)→ 永久停用平台压缩;原生 auto-compaction 兜底,harvest 照常 */
|
|
19693
|
+
__publicField$6(this, "compactLegacy", false);
|
|
19694
|
+
/** 模型上下文窗口(get_state/get_session_stats 探测;null = 未知,percent 不可算) */
|
|
19695
|
+
__publicField$6(this, "contextWindow", null);
|
|
19696
|
+
__publicField$6(this, "sessionId", null);
|
|
19697
|
+
/** harvest 双路去重(compact 响应与 compaction_end 事件可能双达) */
|
|
19698
|
+
__publicField$6(this, "lastHarvestKey", "");
|
|
19699
|
+
__publicField$6(this, "lastHarvestAt", 0);
|
|
19700
|
+
// ===== 团队名册(roster):全成员名单 + 专长,注入每个回合 =====
|
|
19701
|
+
/** 名册缓存(null = 待刷新);30s TTL——任何成员的增删改都会及时反映到名单 */
|
|
19702
|
+
__publicField$6(this, "rosterCache", null);
|
|
19703
|
+
__publicField$6(this, "rosterAt", 0);
|
|
19704
|
+
// ===== supervise() =====
|
|
19705
|
+
/** supervise 单飞守卫:同一 client 不并发 LLM 回合(残留回合与下一 prompt 混流的根因) */
|
|
19706
|
+
__publicField$6(this, "supervising", false);
|
|
19707
|
+
var _a, _b, _c, _d;
|
|
19708
|
+
this.config = config;
|
|
19709
|
+
this.selfAgentId = (_a = this.config.agentId) != null ? _a : "";
|
|
19710
|
+
this.agentName = (_b = this.config.name) != null ? _b : "agent";
|
|
19711
|
+
this.agentRole = (_c = this.config.role) != null ? _c : "worker";
|
|
19712
|
+
this.channelId = (_d = this.config.channelId) != null ? _d : "";
|
|
19713
|
+
}
|
|
19714
|
+
/** 总开关(AW_OMP_COMPACT_ENABLED=0 显式关闭;envNum 拒 0,故单独解析) */
|
|
19715
|
+
compactEnabled() {
|
|
19716
|
+
const v = Number(process.env.AW_OMP_COMPACT_ENABLED);
|
|
19717
|
+
return !(Number.isFinite(v) && v === 0);
|
|
19718
|
+
}
|
|
19719
|
+
compactThreshold() {
|
|
19720
|
+
return Math.min(1, envNum("AW_OMP_COMPACT_THRESHOLD", 0.7));
|
|
19721
|
+
}
|
|
19722
|
+
compactMinIntervalMs() {
|
|
19723
|
+
return envNum("AW_OMP_COMPACT_MIN_INTERVAL_MS", 3e5);
|
|
19724
|
+
}
|
|
19725
|
+
compactWaitMs() {
|
|
19726
|
+
return envNum("AW_OMP_COMPACT_WAIT_MS", 12e4);
|
|
19727
|
+
}
|
|
19728
|
+
/** 被动上下文用量快照(无探测 RPC;getStatus 透出用) */
|
|
19729
|
+
getContextStats() {
|
|
19730
|
+
var _a, _b, _c, _d, _e;
|
|
19731
|
+
const usage = (_b = (_a = this.client) == null ? void 0 : _a.getContextUsage()) != null ? _b : null;
|
|
19732
|
+
const window = (_d = (_c = this.contextWindow) != null ? _c : usage == null ? void 0 : usage.contextWindow) != null ? _d : null;
|
|
19733
|
+
if (!usage && window === null) return null;
|
|
19734
|
+
const usedTokens = (_e = usage == null ? void 0 : usage.tokens) != null ? _e : 0;
|
|
19735
|
+
return {
|
|
19736
|
+
usedTokens,
|
|
19737
|
+
contextWindow: window,
|
|
19738
|
+
percent: window && window > 0 ? Math.min(1, usedTokens / window) : null,
|
|
19739
|
+
compacting: this.compacting
|
|
19740
|
+
};
|
|
19741
|
+
}
|
|
19742
|
+
/**
|
|
19743
|
+
* 上下文用量探测:get_session_stats 权威值;不可用退化为被动 usage + 已探测窗口。
|
|
19744
|
+
* percent 归一化到 0-1(omp 可能返回 0-100)。
|
|
19745
|
+
*/
|
|
19746
|
+
async probeUsage(client) {
|
|
19747
|
+
var _a, _b, _c;
|
|
19748
|
+
try {
|
|
19749
|
+
const resp = await client.send({ type: "get_session_stats" });
|
|
19750
|
+
const cu = ((_a = resp.data) != null ? _a : {}).contextUsage;
|
|
19751
|
+
if (cu && typeof cu.tokens === "number" && cu.tokens > 0) {
|
|
19752
|
+
if (typeof cu.contextWindow === "number" && cu.contextWindow > 0) {
|
|
19753
|
+
this.contextWindow = cu.contextWindow;
|
|
19754
|
+
client.setContextWindow(cu.contextWindow);
|
|
19755
|
+
}
|
|
19756
|
+
const window = (_c = (_b = this.contextWindow) != null ? _b : cu.contextWindow) != null ? _c : null;
|
|
19757
|
+
const rawPercent = typeof cu.percent === "number" ? cu.percent > 1 ? cu.percent / 100 : cu.percent : null;
|
|
19758
|
+
const percent = rawPercent != null ? rawPercent : window && window > 0 ? Math.min(1, cu.tokens / window) : null;
|
|
19759
|
+
return { tokens: cu.tokens, contextWindow: window, percent };
|
|
19760
|
+
}
|
|
19761
|
+
} catch {
|
|
19762
|
+
}
|
|
19763
|
+
return client.getContextUsage();
|
|
19764
|
+
}
|
|
19765
|
+
/**
|
|
19766
|
+
* 上下文治理门控:三条 prompt 路径(worker/peer/supervise)在回合间隙统一调用;
|
|
19767
|
+
* post-settle 经 onTurnSettled 复用同一守卫。任何失败路径都放行——压缩晚一轮
|
|
19768
|
+
* 永远好过中断作业。三重防线:仅回合间隙发起 → get_state 复查 isStreaming/
|
|
19769
|
+
* isCompacting → compacting 互斥位 + 最小间隔防振荡。
|
|
19770
|
+
*/
|
|
19771
|
+
async contextGate(reason) {
|
|
19772
|
+
var _a, _b;
|
|
19773
|
+
if (!this.compactEnabled() || this.compactLegacy || this.compacting) return;
|
|
19774
|
+
const client = this.client;
|
|
19775
|
+
if (!client || !client.alive) return;
|
|
19776
|
+
try {
|
|
19777
|
+
const usage = await this.probeUsage(client);
|
|
19778
|
+
if (!usage || usage.percent === null || usage.percent < this.compactThreshold()) return;
|
|
19779
|
+
if (Date.now() - this.lastCompactAt < this.compactMinIntervalMs()) return;
|
|
19780
|
+
const st = await client.send({ type: "get_state" });
|
|
19781
|
+
const s = (_a = st.data) != null ? _a : {};
|
|
19782
|
+
if (s.isStreaming === true || s.isCompacting === true) return;
|
|
19783
|
+
if (typeof s.sessionId === "string" && s.sessionId) this.sessionId = s.sessionId;
|
|
19784
|
+
this.compacting = true;
|
|
19785
|
+
this.lastCompactAt = Date.now();
|
|
19786
|
+
try {
|
|
19787
|
+
const result = await this.runCompaction(client);
|
|
19788
|
+
if (result == null ? void 0 : result.summary) {
|
|
19789
|
+
await this.harvestCompaction(
|
|
19790
|
+
result.summary,
|
|
19791
|
+
result.tokensBefore,
|
|
19792
|
+
(_b = result.tokensAfter) != null ? _b : result.estimatedTokensAfter,
|
|
19793
|
+
reason
|
|
19794
|
+
);
|
|
19795
|
+
}
|
|
19796
|
+
} finally {
|
|
19797
|
+
this.compacting = false;
|
|
19798
|
+
}
|
|
19799
|
+
} catch (err) {
|
|
19800
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
19801
|
+
if (/compact/i.test(msg) && /unknown|unsupported|invalid|无效|未知|不支持/i.test(msg)) this.compactLegacy = true;
|
|
19802
|
+
log$5.warn(`[OmpRpcAgent:${this.selfAgentId}] contextGate(${reason}) \u5931\u8D25,\u653E\u884C: ${msg}`);
|
|
19803
|
+
}
|
|
19804
|
+
}
|
|
19805
|
+
/**
|
|
19806
|
+
* 发起 compact 并等待 compaction_end(响应内含 result 则立即收口;
|
|
19807
|
+
* 超时放行——压缩在 harness 内后台继续,isCompacting 防后续双发)。
|
|
19808
|
+
*/
|
|
19809
|
+
runCompaction(client) {
|
|
19810
|
+
return new Promise((resolve) => {
|
|
19811
|
+
let settled = false;
|
|
19812
|
+
const finish = (r) => {
|
|
19813
|
+
if (settled) return;
|
|
19814
|
+
settled = true;
|
|
19815
|
+
off();
|
|
19816
|
+
clearTimeout(timer);
|
|
19817
|
+
resolve(r);
|
|
19818
|
+
};
|
|
19819
|
+
const off = client.onEvent((event) => {
|
|
19820
|
+
var _a;
|
|
19821
|
+
if (event.type === "compaction_end") {
|
|
19822
|
+
finish((_a = event.result) != null ? _a : null);
|
|
19823
|
+
} else if (event.type === "__process_exit__") {
|
|
19824
|
+
finish(null);
|
|
19825
|
+
}
|
|
19826
|
+
});
|
|
19827
|
+
const timer = setTimeout(() => {
|
|
19828
|
+
log$5.warn(`[OmpRpcAgent:${this.selfAgentId}] compact \u7B49\u5F85\u8D85\u65F6(${this.compactWaitMs()}ms)\u2192 \u653E\u884C(\u538B\u7F29\u540E\u53F0\u7EE7\u7EED)`);
|
|
19829
|
+
finish(null);
|
|
19830
|
+
}, this.compactWaitMs());
|
|
19831
|
+
void client.send({ type: "compact", customInstructions: this.compactionHints() }).then((resp) => {
|
|
19832
|
+
var _a;
|
|
19833
|
+
const result = (_a = resp.data) == null ? void 0 : _a.result;
|
|
19834
|
+
if (result == null ? void 0 : result.summary) finish(result);
|
|
19835
|
+
}).catch((err) => {
|
|
19836
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
19837
|
+
if (/compact/i.test(msg)) this.compactLegacy = true;
|
|
19838
|
+
log$5.warn(`[OmpRpcAgent:${this.selfAgentId}] compact \u53D1\u8D77\u5931\u8D25: ${msg}`);
|
|
19839
|
+
finish(null);
|
|
19840
|
+
});
|
|
19841
|
+
});
|
|
19842
|
+
}
|
|
19843
|
+
/** 压缩摘要指令(外置 prompts;缺失时省略,omp 用默认策略) */
|
|
19844
|
+
compactionHints() {
|
|
19845
|
+
try {
|
|
19846
|
+
return renderPrompt("compaction-hints");
|
|
19847
|
+
} catch {
|
|
19848
|
+
return void 0;
|
|
19849
|
+
}
|
|
19850
|
+
}
|
|
19851
|
+
/**
|
|
19852
|
+
* 压缩摘要 harvest(三路统一:平台主动 compact / omp 阈值自动 / overflow):
|
|
19853
|
+
* 经 workspace.recordSessionMemory 落库为本人 episodic-session 记忆。
|
|
19854
|
+
* 双路去重:同摘要 60s 内只入库一次。
|
|
19855
|
+
*/
|
|
19856
|
+
async harvestCompaction(summary, tokensBefore, tokensAfter, reason) {
|
|
19857
|
+
var _a, _b;
|
|
19858
|
+
const key = summary.slice(0, 120);
|
|
19859
|
+
if (key === this.lastHarvestKey && Date.now() - this.lastHarvestAt < 6e4) return;
|
|
19860
|
+
this.lastHarvestKey = key;
|
|
19861
|
+
this.lastHarvestAt = Date.now();
|
|
19862
|
+
try {
|
|
19863
|
+
await ((_b = (_a = this.workspace) == null ? void 0 : _a.recordSessionMemory) == null ? void 0 : _b.call(_a, { summary, tokensBefore, tokensAfter, reason }));
|
|
19864
|
+
log$5.info(`[OmpRpcAgent:${this.selfAgentId}] \u538B\u7F29\u6458\u8981\u5DF2\u5165\u8BB0\u5FC6(${summary.length} \u5B57,reason=${reason != null ? reason : "auto"})`);
|
|
19865
|
+
} catch (err) {
|
|
19866
|
+
log$5.warn(`[OmpRpcAgent:${this.selfAgentId}] \u538B\u7F29\u6458\u8981\u5165\u5E93\u5931\u8D25(\u4E0D\u5F71\u54CD\u4F1A\u8BDD):`, err instanceof Error ? err.message : err);
|
|
19867
|
+
}
|
|
19868
|
+
}
|
|
19869
|
+
/** 回合落定钩子(AgentRuntime 在信箱空时调用):后台压缩检查,自守卫不抛错 */
|
|
19870
|
+
async onTurnSettled() {
|
|
19871
|
+
await this.contextGate("post-settle");
|
|
19872
|
+
}
|
|
19873
|
+
// ===== 生命周期 =====
|
|
19874
|
+
async init(input) {
|
|
19875
|
+
this.agentInfo = input.agent;
|
|
19876
|
+
this.channelId = input.channelId;
|
|
19877
|
+
this.agentName = input.agent.name;
|
|
19878
|
+
this.agentRole = input.agent.role;
|
|
19879
|
+
this.selfAgentId = input.agent.id;
|
|
19880
|
+
}
|
|
19881
|
+
async dispose() {
|
|
19882
|
+
if (this.client) {
|
|
19883
|
+
const pid = this.client.pid;
|
|
19884
|
+
await this.client.dispose();
|
|
19885
|
+
this.client = null;
|
|
19886
|
+
if (pid) {
|
|
19887
|
+
markHarnessProcessExit(pid, null);
|
|
19888
|
+
markTerminalSessionExit(pid, null);
|
|
19889
|
+
}
|
|
19890
|
+
}
|
|
19891
|
+
this.hostToolsRegistered = false;
|
|
19892
|
+
}
|
|
19893
|
+
/** harness 进程资源信息(运行时资源监控;进程未 spawn/已回收 → null) */
|
|
19894
|
+
getProcessInfo() {
|
|
19895
|
+
const client = this.client;
|
|
19896
|
+
const pid = client == null ? void 0 : client.pid;
|
|
19897
|
+
if (!pid || !client) return null;
|
|
19898
|
+
return { pid, alive: client.alive, command: `omp --mode ${this.rpcMode}` };
|
|
19899
|
+
}
|
|
19900
|
+
/** 强制终止 harness 进程(进程树;终止后由调用方停止对应 AgentRuntime) */
|
|
19901
|
+
killProcess() {
|
|
19902
|
+
var _a, _b;
|
|
19903
|
+
const pid = (_a = this.client) == null ? void 0 : _a.pid;
|
|
19904
|
+
if (pid) {
|
|
19905
|
+
markTerminalSessionExit(pid, null);
|
|
19906
|
+
killHarnessProcess(pid);
|
|
19907
|
+
} else {
|
|
19908
|
+
(_b = this.client) == null ? void 0 : _b.kill();
|
|
19909
|
+
}
|
|
19910
|
+
}
|
|
19911
|
+
/**
|
|
19912
|
+
* harness 进程存活校准(manager sweeper 周期性调用;休眠/强杀后 exit 事件
|
|
19913
|
+
* 可能不达父进程):按 PID 探 OS 实际存在性,进程已死 → 客户端收敛为已退出,
|
|
19914
|
+
* 在途回合经 __process_exit__ 归位,下一回合 ensureClient 重生子进程。
|
|
19915
|
+
*/
|
|
19916
|
+
reconcileProcess() {
|
|
19917
|
+
var _a;
|
|
19918
|
+
(_a = this.client) == null ? void 0 : _a.reconcile();
|
|
19919
|
+
}
|
|
19920
|
+
/** omp 输出模式(rpc-ui = 默认,启用 HITL 对话框) */
|
|
19921
|
+
get rpcMode() {
|
|
19922
|
+
return this.config.rpcMode === "rpc" ? "rpc" : "rpc-ui";
|
|
19923
|
+
}
|
|
19924
|
+
// ===== prompt 组合:场景 × 身份 × 记忆 × 系统设计 =====
|
|
19925
|
+
/**
|
|
19926
|
+
* 前置上下文段(channel 场景 + 实例身份):场景优先级最高——用户对整个作业
|
|
19927
|
+
* 场景的规范要求,全体成员共享;未设定时注入通用默认场景(prompts/scenario-default.md)。
|
|
19175
19928
|
* 实例 systemPromptPrefix 定义成员专长(可选,无默认)。
|
|
19176
19929
|
*/
|
|
19177
19930
|
contextPrefix(roster) {
|
|
@@ -19295,6 +20048,7 @@ ${identity}`,
|
|
|
19295
20048
|
await this.ensureClient(ctx);
|
|
19296
20049
|
if (!this.client) return [];
|
|
19297
20050
|
if (this.supervising) return [];
|
|
20051
|
+
await this.contextGate("supervise");
|
|
19298
20052
|
const prompt = await this.buildSupervisePrompt(snapshot, ctx.memory);
|
|
19299
20053
|
const timeoutMs = (_a = this.config.superviseTimeoutMs) != null ? _a : 15e4;
|
|
19300
20054
|
return new Promise((resolve) => {
|
|
@@ -19384,7 +20138,7 @@ ${identity}`,
|
|
|
19384
20138
|
* 回给发送者:执行结果 + 对方所需内容,in_reply_to 关联原消息,并声明是否需再响应。
|
|
19385
20139
|
*/
|
|
19386
20140
|
async *peerMessageRun(request, ctx) {
|
|
19387
|
-
var _a, _b, _c, _d, _e, _f;
|
|
20141
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
19388
20142
|
try {
|
|
19389
20143
|
await this.ensureClient(ctx);
|
|
19390
20144
|
} catch (err) {
|
|
@@ -19406,9 +20160,11 @@ ${identity}`,
|
|
|
19406
20160
|
const msgText = partsToText$1(msg.parts);
|
|
19407
20161
|
const requireReply = ((_d = msg.metadata) == null ? void 0 : _d["x-aw-require-reply"]) === "true";
|
|
19408
20162
|
const isReply = typeof ((_e = msg.metadata) == null ? void 0 : _e["x-aw-in-reply-to"]) === "string";
|
|
19409
|
-
|
|
20163
|
+
const crossChannel = ((_f = msg.metadata) == null ? void 0 : _f["x-aw-cross-channel"]) === "true";
|
|
20164
|
+
const fromChannel = typeof ((_g = msg.metadata) == null ? void 0 : _g["x-aw-from-channel"]) === "string" ? String(msg.metadata["x-aw-from-channel"]) : "";
|
|
20165
|
+
this.replyContext = requireReply && request.fromAgentId && !crossChannel ? { fromId: request.fromAgentId, messageId: msg.messageId } : null;
|
|
19410
20166
|
const roleLine = this.agentRole === "lead" ? `You are "${this.agentName}", the LEAD coordinator of a multi-agent team (Channel: ${this.channelId}). A team member sent you a direct message.` : `You are "${this.agentName}", a worker agent in a multi-agent team (Channel: ${this.channelId}).`;
|
|
19411
|
-
const respondBlock = renderPrompt(requireReply ? "peer-reply-required" : "peer-reply-optional", {
|
|
20167
|
+
const respondBlock = crossChannel ? renderPrompt("peer-reply-cross-channel", { fromId, messageId: msg.messageId, fromChannel }) : renderPrompt(requireReply ? "peer-reply-required" : "peer-reply-optional", {
|
|
19412
20168
|
fromId,
|
|
19413
20169
|
messageId: msg.messageId
|
|
19414
20170
|
});
|
|
@@ -19416,7 +20172,7 @@ ${identity}`,
|
|
|
19416
20172
|
fromId,
|
|
19417
20173
|
messageId: msg.messageId,
|
|
19418
20174
|
requireReply,
|
|
19419
|
-
isReplyTo: isReply ? `in_reply_to: ${String((
|
|
20175
|
+
isReplyTo: isReply ? `in_reply_to: ${String((_h = msg.metadata) == null ? void 0 : _h["x-aw-in-reply-to"])}` : "",
|
|
19420
20176
|
msgText,
|
|
19421
20177
|
respondBlock
|
|
19422
20178
|
});
|
|
@@ -19449,6 +20205,7 @@ ${identity}`,
|
|
|
19449
20205
|
if (!client) {
|
|
19450
20206
|
throw new Error("omp \u5BA2\u6237\u7AEF\u672A\u5C31\u7EEA");
|
|
19451
20207
|
}
|
|
20208
|
+
await this.contextGate("pre-prompt");
|
|
19452
20209
|
const queue = [];
|
|
19453
20210
|
let resolveWait = null;
|
|
19454
20211
|
let isDone = false;
|
|
@@ -19605,7 +20362,7 @@ ${identity}`,
|
|
|
19605
20362
|
}
|
|
19606
20363
|
// ===== 内部:omp 事件 → AgentEvent 映射 =====
|
|
19607
20364
|
mapOmpEvent(event, taskId) {
|
|
19608
|
-
var _a, _b, _c, _d;
|
|
20365
|
+
var _a, _b, _c, _d, _e;
|
|
19609
20366
|
switch (event.type) {
|
|
19610
20367
|
case "agent_start":
|
|
19611
20368
|
return [{
|
|
@@ -19688,10 +20445,30 @@ ${identity}`,
|
|
|
19688
20445
|
kind: "error",
|
|
19689
20446
|
error: { code: "OMP_PROCESS_EXIT", message: "omp \u5B50\u8FDB\u7A0B\u610F\u5916\u9000\u51FA" }
|
|
19690
20447
|
}];
|
|
20448
|
+
// ===== 上下文治理事件(回合中到达的原生阈值/overflow 压缩;不污染事件流)=====
|
|
20449
|
+
case "compaction_start":
|
|
20450
|
+
this.compacting = true;
|
|
20451
|
+
return [];
|
|
20452
|
+
case "compaction_end": {
|
|
20453
|
+
this.compacting = false;
|
|
20454
|
+
const result = event.result;
|
|
20455
|
+
if (result == null ? void 0 : result.summary) {
|
|
20456
|
+
void this.harvestCompaction(
|
|
20457
|
+
result.summary,
|
|
20458
|
+
result.tokensBefore,
|
|
20459
|
+
(_d = result.tokensAfter) != null ? _d : result.estimatedTokensAfter,
|
|
20460
|
+
event.reason
|
|
20461
|
+
);
|
|
20462
|
+
}
|
|
20463
|
+
return [];
|
|
20464
|
+
}
|
|
20465
|
+
// 回合完全落定(无自动重试/压缩重试/排队续跑):后续压缩检查由 AgentRuntime 驱动
|
|
20466
|
+
case "agent_settled":
|
|
20467
|
+
return [];
|
|
19691
20468
|
case "__error__":
|
|
19692
20469
|
return [{
|
|
19693
20470
|
kind: "error",
|
|
19694
|
-
error: { code: "OMP_ERROR", message: (
|
|
20471
|
+
error: { code: "OMP_ERROR", message: (_e = event.error) != null ? _e : "omp \u672A\u77E5\u9519\u8BEF" }
|
|
19695
20472
|
}];
|
|
19696
20473
|
default:
|
|
19697
20474
|
return [];
|
|
@@ -19891,16 +20668,39 @@ ${identity}`,
|
|
|
19891
20668
|
}
|
|
19892
20669
|
if (this.config.provider || this.config.model) {
|
|
19893
20670
|
try {
|
|
19894
|
-
await client.send({
|
|
20671
|
+
await client.send({
|
|
20672
|
+
type: "set_model",
|
|
20673
|
+
provider: this.config.provider,
|
|
20674
|
+
modelId: this.config.model
|
|
20675
|
+
});
|
|
19895
20676
|
} catch {
|
|
19896
20677
|
}
|
|
19897
20678
|
}
|
|
19898
20679
|
client.onHostToolCall((req) => this.handleHostTool(req));
|
|
19899
20680
|
await client.send({ type: "set_host_tools", tools: hostToolsForRole(this.agentRole) });
|
|
20681
|
+
void this.probeContext(client).catch(() => {
|
|
20682
|
+
});
|
|
20683
|
+
void client.send({ type: "set_auto_compaction", enabled: true }).catch(() => {
|
|
20684
|
+
});
|
|
19900
20685
|
this.client = client;
|
|
19901
20686
|
this.hostToolsRegistered = true;
|
|
19902
20687
|
}
|
|
19903
20688
|
}
|
|
20689
|
+
/** 上下文状态探测:get_state 取 contextWindow/sessionId(一次;失败仅损失 percent 精度) */
|
|
20690
|
+
async probeContext(client) {
|
|
20691
|
+
var _a;
|
|
20692
|
+
try {
|
|
20693
|
+
const resp = await client.send({ type: "get_state" });
|
|
20694
|
+
const data = (_a = resp.data) != null ? _a : {};
|
|
20695
|
+
const model = data.model;
|
|
20696
|
+
if (typeof (model == null ? void 0 : model.contextWindow) === "number" && model.contextWindow > 0) {
|
|
20697
|
+
this.contextWindow = model.contextWindow;
|
|
20698
|
+
client.setContextWindow(model.contextWindow);
|
|
20699
|
+
}
|
|
20700
|
+
if (typeof data.sessionId === "string" && data.sessionId) this.sessionId = data.sessionId;
|
|
20701
|
+
} catch {
|
|
20702
|
+
}
|
|
20703
|
+
}
|
|
19904
20704
|
// ===== 内部:host tool handler(workspace 桥接) =====
|
|
19905
20705
|
async handleHostTool(req) {
|
|
19906
20706
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
@@ -19999,6 +20799,23 @@ ${identity}`,
|
|
|
19999
20799
|
const triggerNote = inReplyTo ? `(\u56DE\u590D ${inReplyTo.slice(0, 8)}\u2026,\u5DF2\u5B9E\u65F6\u63A8\u9001\u7ED9\u5BF9\u65B9)` : metadata["x-aw-require-reply"] === "true" ? "(\u5DF2\u8981\u6C42\u5BF9\u65B9\u56DE\u590D)" : "";
|
|
20000
20800
|
return { text: `\u6D88\u606F ${sent.messageId.slice(0, 8)}\u2026 \u5DF2\u53D1\u9001\u7ED9 ${toAgentId}(priority=${priority})${triggerNote}` };
|
|
20001
20801
|
}
|
|
20802
|
+
case "send_cross_channel_message": {
|
|
20803
|
+
const toChannelId = req.arguments.to_channel_id;
|
|
20804
|
+
const message = req.arguments.message;
|
|
20805
|
+
if (!toChannelId || !message) return { text: "\u7F3A\u5C11 to_channel_id \u6216 message", isError: true };
|
|
20806
|
+
try {
|
|
20807
|
+
const r = await ws.sendCrossChannelMessage({
|
|
20808
|
+
toChannelId,
|
|
20809
|
+
parts: [{ text: message }],
|
|
20810
|
+
requireReply: req.arguments.require_reply === true,
|
|
20811
|
+
inReplyTo: req.arguments.in_reply_to
|
|
20812
|
+
});
|
|
20813
|
+
const note = req.arguments.require_reply === true ? "(\u5DF2\u8981\u6C42\u5BF9\u65B9 Leader \u56DE\u590D)" : "";
|
|
20814
|
+
return { text: `\u8DE8 Channel \u6D88\u606F ${r.messageId.slice(0, 8)}\u2026 \u5DF2\u9001\u8FBE channel\u300C${r.toChannelName}\u300D\u7684 Leader(${r.toLeadAgentId.slice(0, 8)}\u2026)${note}\u3002\u5BF9\u65B9\u5C06\u6309\u4F60\u7684\u4FE1\u606F\u9700\u6C42\u5904\u7406;\u5176\u56DE\u590D\u4F1A\u7ECF mailbox \u5230\u8FBE\u4F60\u8FD9\u91CC\u3002` };
|
|
20815
|
+
} catch (err) {
|
|
20816
|
+
return { text: `\u8DE8 Channel \u53D1\u9001\u5931\u8D25: ${err instanceof Error ? err.message : String(err)}(\u4EC5 Leader \u53EF\u8DE8 Channel \u901A\u4FE1)`, isError: true };
|
|
20817
|
+
}
|
|
20818
|
+
}
|
|
20002
20819
|
case "refuse_task": {
|
|
20003
20820
|
const taskId = req.arguments.task_id;
|
|
20004
20821
|
const reason = req.arguments.reason;
|
|
@@ -20261,13 +21078,13 @@ ${lines.join("\n")}` };
|
|
|
20261
21078
|
}
|
|
20262
21079
|
}
|
|
20263
21080
|
|
|
20264
|
-
var __defProp$
|
|
20265
|
-
var __defNormalProp$
|
|
20266
|
-
var __publicField$
|
|
21081
|
+
var __defProp$5 = Object.defineProperty;
|
|
21082
|
+
var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21083
|
+
var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20267
21084
|
class ClaudeSdkAgentImpl {
|
|
20268
21085
|
constructor(config = {}) {
|
|
20269
|
-
__publicField$
|
|
20270
|
-
__publicField$
|
|
21086
|
+
__publicField$5(this, "apiKey");
|
|
21087
|
+
__publicField$5(this, "model");
|
|
20271
21088
|
this.apiKey = typeof config.apiKey === "string" ? config.apiKey : void 0;
|
|
20272
21089
|
this.model = typeof config.model === "string" ? config.model : void 0;
|
|
20273
21090
|
}
|
|
@@ -20301,40 +21118,40 @@ const TERMINAL_TASK_STATES = {
|
|
|
20301
21118
|
CANCELED: true
|
|
20302
21119
|
};
|
|
20303
21120
|
|
|
20304
|
-
var __defProp$
|
|
20305
|
-
var __defNormalProp$
|
|
20306
|
-
var __publicField$
|
|
21121
|
+
var __defProp$4 = Object.defineProperty;
|
|
21122
|
+
var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21123
|
+
var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20307
21124
|
const log$4 = createLogger("workshop.agent-runtime");
|
|
20308
21125
|
function partsToText(parts) {
|
|
20309
21126
|
return parts.map((p) => "text" in p ? p.text : "").filter(Boolean).join("\n");
|
|
20310
21127
|
}
|
|
20311
21128
|
class AgentRuntime {
|
|
20312
21129
|
constructor(agent, impl, deps) {
|
|
20313
|
-
__publicField$
|
|
20314
|
-
__publicField$
|
|
20315
|
-
__publicField$
|
|
20316
|
-
__publicField$
|
|
20317
|
-
__publicField$
|
|
20318
|
-
__publicField$
|
|
20319
|
-
__publicField$
|
|
21130
|
+
__publicField$4(this, "impl", impl);
|
|
21131
|
+
__publicField$4(this, "deps", deps);
|
|
21132
|
+
__publicField$4(this, "agentId");
|
|
21133
|
+
__publicField$4(this, "role");
|
|
21134
|
+
__publicField$4(this, "channelId");
|
|
21135
|
+
__publicField$4(this, "name");
|
|
21136
|
+
__publicField$4(this, "state", "idle");
|
|
20320
21137
|
/** 回合失败重投计数(每消息;进程内存,重启由 resetConsuming 重新给机会) */
|
|
20321
|
-
__publicField$
|
|
21138
|
+
__publicField$4(this, "runErrorRetries", /* @__PURE__ */ new Map());
|
|
20322
21139
|
/** 正在执行的任务 id(run 期间;空闲时 null) */
|
|
20323
|
-
__publicField$
|
|
21140
|
+
__publicField$4(this, "currentTaskId", null);
|
|
20324
21141
|
/** poll_messages 阻塞等待数(waitPending 活动计数;>0 = 有轮询在等,实时消息留信箱由其取走) */
|
|
20325
|
-
__publicField$
|
|
21142
|
+
__publicField$4(this, "pollWaiters", 0);
|
|
20326
21143
|
/** run 与 supervise 互斥锁(promise 链) */
|
|
20327
|
-
__publicField$
|
|
20328
|
-
__publicField$
|
|
20329
|
-
__publicField$
|
|
20330
|
-
__publicField$
|
|
21144
|
+
__publicField$4(this, "execLock", Promise.resolve());
|
|
21145
|
+
__publicField$4(this, "abortController", null);
|
|
21146
|
+
__publicField$4(this, "loopPromise", null);
|
|
21147
|
+
__publicField$4(this, "started", false);
|
|
20331
21148
|
/**
|
|
20332
21149
|
* lead 调度决策(供 SchedulerLoop 调用):转发 impl.supervise。
|
|
20333
21150
|
* 未实现 supervise 时返回 null(调用方回退内置规则引擎);
|
|
20334
21151
|
* 与 run 的互斥由调用方通过 withExecLock 保证。
|
|
20335
21152
|
*/
|
|
20336
21153
|
/** 当前 supervise 回合的控制器(abortCurrent 经此打断 LLM 调度回合) */
|
|
20337
|
-
__publicField$
|
|
21154
|
+
__publicField$4(this, "superviseController", null);
|
|
20338
21155
|
this.agentId = agent.id;
|
|
20339
21156
|
this.role = agent.role;
|
|
20340
21157
|
this.channelId = agent.channelId;
|
|
@@ -20347,23 +21164,25 @@ class AgentRuntime {
|
|
|
20347
21164
|
getState() {
|
|
20348
21165
|
return this.state;
|
|
20349
21166
|
}
|
|
20350
|
-
/** 实时状态视图:idle/busy/stopped + 当前任务 +
|
|
21167
|
+
/** 实时状态视图:idle/busy/stopped + 当前任务 + 队列 + harness 上下文用量 */
|
|
20351
21168
|
getStatus() {
|
|
20352
|
-
var _a, _b, _c;
|
|
21169
|
+
var _a, _b, _c, _d, _e, _f;
|
|
20353
21170
|
const queue = this.getQueueView();
|
|
20354
21171
|
const current = (_a = queue.current) != null ? _a : this.currentTaskId ? this.deps.taskEngine.get(this.currentTaskId) : void 0;
|
|
21172
|
+
const context = (_d = (_c = (_b = this.impl).getContextStats) == null ? void 0 : _c.call(_b)) != null ? _d : void 0;
|
|
20355
21173
|
return {
|
|
20356
21174
|
agentId: this.agentId,
|
|
20357
21175
|
channelId: this.channelId,
|
|
20358
21176
|
role: this.role,
|
|
20359
21177
|
name: this.name,
|
|
20360
21178
|
state: this.state,
|
|
20361
|
-
currentTaskId: (
|
|
21179
|
+
currentTaskId: (_e = current == null ? void 0 : current.id) != null ? _e : null,
|
|
20362
21180
|
// 进度/标题透出:lead 观察 worker 是否在推进(progress 空闲/未上报时为 null)
|
|
20363
|
-
currentTaskTitle: (
|
|
21181
|
+
currentTaskTitle: (_f = current == null ? void 0 : current.title) != null ? _f : null,
|
|
20364
21182
|
currentTaskProgress: (current == null ? void 0 : current.progress) != null ? current.progress : null,
|
|
20365
21183
|
queuedCount: queue.queued.length,
|
|
20366
|
-
completedCount: queue.completed.length
|
|
21184
|
+
completedCount: queue.completed.length,
|
|
21185
|
+
...context ? { context } : {}
|
|
20367
21186
|
};
|
|
20368
21187
|
}
|
|
20369
21188
|
/** 本 agent 的任务队列视图(自己的任务管理系统:待执行 FIFO / 执行中 / 已完成) */
|
|
@@ -20553,6 +21372,7 @@ class AgentRuntime {
|
|
|
20553
21372
|
return await this.impl.supervise(snapshot, ctx, { signal: controller.signal });
|
|
20554
21373
|
} finally {
|
|
20555
21374
|
if (this.superviseController === controller) this.superviseController = null;
|
|
21375
|
+
this.maybePostSettle();
|
|
20556
21376
|
}
|
|
20557
21377
|
}
|
|
20558
21378
|
/**
|
|
@@ -20616,7 +21436,9 @@ class AgentRuntime {
|
|
|
20616
21436
|
this.abortController = new AbortController();
|
|
20617
21437
|
let memoryBlock;
|
|
20618
21438
|
try {
|
|
20619
|
-
memoryBlock = (_d = await ((_c = this.deps.memory) == null ? void 0 : _c.recall(partsToText(msg.parts)
|
|
21439
|
+
memoryBlock = (_d = await ((_c = this.deps.memory) == null ? void 0 : _c.recall(partsToText(msg.parts), {
|
|
21440
|
+
relatedTaskIds: this.relatedTaskIdsOf(taskId)
|
|
21441
|
+
}))) != null ? _d : void 0;
|
|
20620
21442
|
} catch (err) {
|
|
20621
21443
|
log$4.error(`[AgentRuntime:${this.agentId}] \u8BB0\u5FC6\u53EC\u56DE\u5931\u8D25:`, err);
|
|
20622
21444
|
}
|
|
@@ -20731,19 +21553,54 @@ class AgentRuntime {
|
|
|
20731
21553
|
this.runErrorRetries.delete(msg.messageId);
|
|
20732
21554
|
this.deps.mailbox.markConsumed(msg.messageId);
|
|
20733
21555
|
}
|
|
21556
|
+
this.maybePostSettle();
|
|
20734
21557
|
}
|
|
20735
21558
|
}
|
|
20736
|
-
/** 状态通知的队列上下文(
|
|
21559
|
+
/** 状态通知的队列上下文(实时:当前任务/待执行数/已完成数/harness 上下文用量) */
|
|
20737
21560
|
queueContext() {
|
|
21561
|
+
var _a;
|
|
20738
21562
|
const status = this.getStatus();
|
|
20739
21563
|
return {
|
|
20740
21564
|
currentTaskId: status.currentTaskId,
|
|
20741
21565
|
currentTaskTitle: status.currentTaskTitle,
|
|
20742
21566
|
currentTaskProgress: status.currentTaskProgress,
|
|
20743
21567
|
queuedCount: status.queuedCount,
|
|
20744
|
-
completedCount: status.completedCount
|
|
21568
|
+
completedCount: status.completedCount,
|
|
21569
|
+
context: (_a = status.context) != null ? _a : null
|
|
20745
21570
|
};
|
|
20746
21571
|
}
|
|
21572
|
+
/**
|
|
21573
|
+
* 任务关联集(自身+父+兄弟,≤20):related-task boost 数据源。
|
|
21574
|
+
* 同父兄弟任务的记忆(前几个子任务做了什么)在引子中必然置顶——
|
|
21575
|
+
* 纯内存 id 判断,零检索开销。
|
|
21576
|
+
*/
|
|
21577
|
+
relatedTaskIdsOf(taskId) {
|
|
21578
|
+
if (!taskId) return void 0;
|
|
21579
|
+
const task = this.deps.taskEngine.get(taskId);
|
|
21580
|
+
if (!task) return void 0;
|
|
21581
|
+
const ids = /* @__PURE__ */ new Set([taskId]);
|
|
21582
|
+
if (task.parentId) {
|
|
21583
|
+
ids.add(task.parentId);
|
|
21584
|
+
for (const t of this.deps.taskEngine.list(this.channelId)) {
|
|
21585
|
+
if (t.parentId === task.parentId) ids.add(t.id);
|
|
21586
|
+
if (ids.size >= 20) break;
|
|
21587
|
+
}
|
|
21588
|
+
}
|
|
21589
|
+
return [...ids];
|
|
21590
|
+
}
|
|
21591
|
+
/**
|
|
21592
|
+
* post-settle 压缩检查:仅信箱无排队消息时触发(排队消息的 pre-prompt gate 兜底)。
|
|
21593
|
+
* impl 自守卫(回合间隙才压缩、异常不抛出);本方法自身也不阻塞消费循环。
|
|
21594
|
+
*/
|
|
21595
|
+
maybePostSettle() {
|
|
21596
|
+
if (!this.impl.onTurnSettled) return;
|
|
21597
|
+
void this.deps.mailbox.peek(1).then((pending) => {
|
|
21598
|
+
var _a, _b;
|
|
21599
|
+
if (pending.length > 0) return void 0;
|
|
21600
|
+
return (_b = (_a = this.impl).onTurnSettled) == null ? void 0 : _b.call(_a);
|
|
21601
|
+
}).catch(() => {
|
|
21602
|
+
});
|
|
21603
|
+
}
|
|
20747
21604
|
toRequest(msg, memory) {
|
|
20748
21605
|
var _a, _b;
|
|
20749
21606
|
return {
|
|
@@ -20761,20 +21618,20 @@ class AgentRuntime {
|
|
|
20761
21618
|
}
|
|
20762
21619
|
}
|
|
20763
21620
|
|
|
20764
|
-
var __defProp$
|
|
20765
|
-
var __defNormalProp$
|
|
20766
|
-
var __publicField$
|
|
21621
|
+
var __defProp$3 = Object.defineProperty;
|
|
21622
|
+
var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21623
|
+
var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20767
21624
|
const log$3 = createLogger("workshop.channel");
|
|
20768
21625
|
class ChannelRuntime {
|
|
20769
21626
|
constructor(channelId, deps, onRouted = () => {
|
|
20770
21627
|
}) {
|
|
20771
|
-
__publicField$
|
|
20772
|
-
__publicField$
|
|
20773
|
-
__publicField$
|
|
20774
|
-
__publicField$
|
|
20775
|
-
__publicField$
|
|
21628
|
+
__publicField$3(this, "deps", deps);
|
|
21629
|
+
__publicField$3(this, "onRouted", onRouted);
|
|
21630
|
+
__publicField$3(this, "channelId");
|
|
21631
|
+
__publicField$3(this, "agents", /* @__PURE__ */ new Map());
|
|
21632
|
+
__publicField$3(this, "schedulerLoop", null);
|
|
20776
21633
|
/** 懒加载回调(manager 注入);未装配的收件人经此按需 wire */
|
|
20777
|
-
__publicField$
|
|
21634
|
+
__publicField$3(this, "loader", null);
|
|
20778
21635
|
this.channelId = channelId;
|
|
20779
21636
|
}
|
|
20780
21637
|
/** channel 全部 enabled 实例元信息(含未装配;供快照/调度看到完整团队) */
|
|
@@ -20811,10 +21668,13 @@ class ChannelRuntime {
|
|
|
20811
21668
|
return delivered;
|
|
20812
21669
|
}
|
|
20813
21670
|
/**
|
|
20814
|
-
* 信箱守卫(垃圾信息拦截)
|
|
21671
|
+
* 信箱守卫(垃圾信息拦截):四类消息放行,其余直接丢弃(不落库、不投递)——
|
|
20815
21672
|
* ① 平台任务消息(task-kind + 真实存在的任务);
|
|
20816
|
-
* ②
|
|
20817
|
-
*
|
|
21673
|
+
* ② 跨 Channel 消息(x-aw-cross-channel 标记 + 源 channel 注明)——
|
|
21674
|
+
* manager.sendCrossChannelMessage 发送时已校验「发送方=源 channel lead +
|
|
21675
|
+
* 双方同主 + 目标 lead 在册」并盖服务端标记;REST/工具入参无法伪造;
|
|
21676
|
+
* ③ 声明发送人为本 channel 成员的消息(伪造/已移除成员 → 拒);
|
|
21677
|
+
* ④ 人类经 REST 注入的消息(x-aw-from-label 必须非空)。
|
|
20818
21678
|
* 防脏信息注入:无主消息与未知发送人的消息没有回执对象,处理它们只会
|
|
20819
21679
|
* 污染 Agent 上下文,因此拦截并删除。
|
|
20820
21680
|
*/
|
|
@@ -20828,6 +21688,9 @@ class ChannelRuntime {
|
|
|
20828
21688
|
log$3.warn(`[ChannelRuntime:${this.channelId.slice(0, 8)}] \u62E6\u622A\u65E0\u6548\u4EFB\u52A1\u6D88\u606F(kind=${String(taskKind)} task=${String(taskId)}),\u5DF2\u4E22\u5F03`);
|
|
20829
21689
|
return false;
|
|
20830
21690
|
}
|
|
21691
|
+
if (meta["x-aw-cross-channel"] === "true" && typeof meta["x-aw-from-channel"] === "string" && meta["x-aw-from-channel"] !== this.channelId) {
|
|
21692
|
+
return true;
|
|
21693
|
+
}
|
|
20831
21694
|
const from = meta["x-aw-from-agent"];
|
|
20832
21695
|
if (typeof from === "string" && from.length > 0) {
|
|
20833
21696
|
const member = this.deps.channelAgents.findByChannelAgent(this.channelId, from);
|
|
@@ -20914,56 +21777,56 @@ class ChannelRuntime {
|
|
|
20914
21777
|
}
|
|
20915
21778
|
}
|
|
20916
21779
|
|
|
20917
|
-
var __defProp$
|
|
20918
|
-
var __defNormalProp$
|
|
20919
|
-
var __publicField$
|
|
21780
|
+
var __defProp$2 = Object.defineProperty;
|
|
21781
|
+
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21782
|
+
var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20920
21783
|
const log$2 = createLogger("workshop.scheduler");
|
|
20921
21784
|
const MAIL_SNAPSHOT_LIMIT = 20;
|
|
20922
21785
|
const IDLE_TICK_CAP_MS = 8e3;
|
|
20923
21786
|
class SchedulerLoop {
|
|
20924
21787
|
constructor(channelRuntime, lead, options = {}) {
|
|
20925
|
-
__publicField$
|
|
20926
|
-
__publicField$
|
|
20927
|
-
__publicField$
|
|
20928
|
-
__publicField$
|
|
20929
|
-
__publicField$
|
|
21788
|
+
__publicField$2(this, "channelRuntime", channelRuntime);
|
|
21789
|
+
__publicField$2(this, "lead", lead);
|
|
21790
|
+
__publicField$2(this, "tickMs");
|
|
21791
|
+
__publicField$2(this, "stallMs");
|
|
21792
|
+
__publicField$2(this, "supervisionMail");
|
|
20930
21793
|
/** supervise 节流:最小间隔与最近一次执行时刻/信号指纹(token 效率) */
|
|
20931
|
-
__publicField$
|
|
20932
|
-
__publicField$
|
|
20933
|
-
__publicField$
|
|
20934
|
-
__publicField$
|
|
20935
|
-
__publicField$
|
|
20936
|
-
__publicField$
|
|
20937
|
-
__publicField$
|
|
21794
|
+
__publicField$2(this, "lastSuperviseAt", 0);
|
|
21795
|
+
__publicField$2(this, "lastFingerprint", "");
|
|
21796
|
+
__publicField$2(this, "timer", null);
|
|
21797
|
+
__publicField$2(this, "started", false);
|
|
21798
|
+
__publicField$2(this, "running", false);
|
|
21799
|
+
__publicField$2(this, "pendingWake", false);
|
|
21800
|
+
__publicField$2(this, "tick", 0);
|
|
20938
21801
|
/** 已催办一次的 WORKING 任务(再次停滞 → cancel) */
|
|
20939
|
-
__publicField$
|
|
21802
|
+
__publicField$2(this, "notified", /* @__PURE__ */ new Set());
|
|
20940
21803
|
/** WORKING 任务最近一次 progress 与时间(停滞检测) */
|
|
20941
|
-
__publicField$
|
|
21804
|
+
__publicField$2(this, "lastProgress", /* @__PURE__ */ new Map());
|
|
20942
21805
|
/** busy 成员执行中任务的进度基线(与 lastProgress 分离:busy 不重置——
|
|
20943
21806
|
* 独立检测"忙碌但进度长期不变"的停滞,喂给快照的 stalled 标记) */
|
|
20944
|
-
__publicField$
|
|
21807
|
+
__publicField$2(this, "progressSeen", /* @__PURE__ */ new Map());
|
|
20945
21808
|
/** goal 父任务「全部子任务 COMPLETED」首见时刻(宽限后规则引擎兜底收口) */
|
|
20946
|
-
__publicField$
|
|
21809
|
+
__publicField$2(this, "goalAllDoneAt", /* @__PURE__ */ new Map());
|
|
20947
21810
|
/** goal 收口宽限窗(ms):给 lead 充分判定机会,超时平台兜底完成 */
|
|
20948
|
-
__publicField$
|
|
21811
|
+
__publicField$2(this, "goalGraceMs", 45e3);
|
|
20949
21812
|
/** 成员空闲起始时间(最久空闲 worker 排序) */
|
|
20950
|
-
__publicField$
|
|
21813
|
+
__publicField$2(this, "idleSince", /* @__PURE__ */ new Map());
|
|
20951
21814
|
/** 当前活跃的执行模式(null = 默认无模式) */
|
|
20952
|
-
__publicField$
|
|
20953
|
-
__publicField$
|
|
21815
|
+
__publicField$2(this, "activeMode", null);
|
|
21816
|
+
__publicField$2(this, "activeModeConfig", {});
|
|
20954
21817
|
/** loop 模式控制器 */
|
|
20955
|
-
__publicField$
|
|
21818
|
+
__publicField$2(this, "loopController", null);
|
|
20956
21819
|
/** 已通知 loop 控制器的完成任务,避免每轮 tick 重复计数 */
|
|
20957
|
-
__publicField$
|
|
21820
|
+
__publicField$2(this, "loopCompletedTaskIds", /* @__PURE__ */ new Set());
|
|
20958
21821
|
/** 调度器启动时刻(loop 完成识别基线;防进程重启后重放重启前的 loop 主任务) */
|
|
20959
|
-
__publicField$
|
|
21822
|
+
__publicField$2(this, "bootAt", Date.now());
|
|
20960
21823
|
/** loop 模式下重新提交任务的回调 */
|
|
20961
|
-
__publicField$
|
|
21824
|
+
__publicField$2(this, "onLoopResubmit", null);
|
|
20962
21825
|
/** 空闲退避:快照指纹连续不变的轮数(决定下次 tick 间隔) */
|
|
20963
|
-
__publicField$
|
|
21826
|
+
__publicField$2(this, "idleStreak", 0);
|
|
20964
21827
|
/** 上一轮快照指纹(空闲判定) */
|
|
20965
|
-
__publicField$
|
|
20966
|
-
__publicField$
|
|
21828
|
+
__publicField$2(this, "lastRoundFingerprint", "");
|
|
21829
|
+
__publicField$2(this, "lastCloseOutAt", 0);
|
|
20967
21830
|
var _a, _b, _c;
|
|
20968
21831
|
this.tickMs = (_a = options.tickMs) != null ? _a : 1e3;
|
|
20969
21832
|
this.stallMs = (_b = options.stallMs) != null ? _b : 3e5;
|
|
@@ -21505,9 +22368,9 @@ class SchedulerLoop {
|
|
|
21505
22368
|
}
|
|
21506
22369
|
}
|
|
21507
22370
|
|
|
21508
|
-
var __defProp$
|
|
21509
|
-
var __defNormalProp$
|
|
21510
|
-
var __publicField$
|
|
22371
|
+
var __defProp$1 = Object.defineProperty;
|
|
22372
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
22373
|
+
var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
21511
22374
|
const log$1 = createLogger("workshop.task-engine");
|
|
21512
22375
|
const TRANSITIONS = {
|
|
21513
22376
|
SUBMITTED: ["WORKING", "ASSIGNED", "CANCELED"],
|
|
@@ -21565,8 +22428,8 @@ class TaskEngine {
|
|
|
21565
22428
|
* 所有迁移必经 transition(),故状态事件不漏发;create/dispatch 的初始态直接落库,单独补发。
|
|
21566
22429
|
*/
|
|
21567
22430
|
constructor(repos, hooks) {
|
|
21568
|
-
__publicField$
|
|
21569
|
-
__publicField$
|
|
22431
|
+
__publicField$1(this, "repos", repos);
|
|
22432
|
+
__publicField$1(this, "hooks", hooks);
|
|
21570
22433
|
}
|
|
21571
22434
|
/** 单 agent 任务队列视图(queued FIFO / current / completed;派生只读投影,无第二份状态) */
|
|
21572
22435
|
/** 批量队列视图:一次 list(channel) 聚合全部成员(调度快照热路径,消除 O(M) 次查询) */
|
|
@@ -21893,372 +22756,69 @@ class TaskEngine {
|
|
|
21893
22756
|
}
|
|
21894
22757
|
const isRetry = task.state === "FAILED";
|
|
21895
22758
|
if (isRetry) this.transition(taskId, "ASSIGNED", task.assigneeId);
|
|
21896
|
-
const updated = this.repos.tasks.update(taskId, {
|
|
21897
|
-
assigneeId: toAgentId,
|
|
21898
|
-
retryCount: isRetry ? task.retryCount + 1 : task.retryCount
|
|
21899
|
-
});
|
|
21900
|
-
if (!updated) throw new AppError(404, "NOT_FOUND", `\u4EFB\u52A1\u4E0D\u5B58\u5728: ${taskId}`);
|
|
21901
|
-
this.repos.messages.consumePendingByTask(taskId);
|
|
21902
|
-
this.deliverTaskMessage({
|
|
21903
|
-
channelId: task.channelId,
|
|
21904
|
-
taskId: task.id,
|
|
21905
|
-
fromAgentId: task.creatorId || null,
|
|
21906
|
-
toAgentId,
|
|
21907
|
-
title: task.title,
|
|
21908
|
-
description: task.description,
|
|
21909
|
-
kind: "assign"
|
|
21910
|
-
});
|
|
21911
|
-
return rowToTask$1(updated);
|
|
21912
|
-
}
|
|
21913
|
-
/** 取消任务:CANCELED(终态)+ 作废队列中的过期投递(assignee 不再消费)+ 投递 cancel 通知 */
|
|
21914
|
-
cancel(taskId, by) {
|
|
21915
|
-
const task = this.requireTask(taskId);
|
|
21916
|
-
this.transition(taskId, "CANCELED", by);
|
|
21917
|
-
this.repos.messages.consumePendingByTask(taskId);
|
|
21918
|
-
this.deliverTaskMessage({
|
|
21919
|
-
channelId: task.channelId,
|
|
21920
|
-
taskId: task.id,
|
|
21921
|
-
fromAgentId: by || null,
|
|
21922
|
-
toAgentId: task.assigneeId,
|
|
21923
|
-
title: task.title,
|
|
21924
|
-
description: task.description,
|
|
21925
|
-
kind: "cancel"
|
|
21926
|
-
});
|
|
21927
|
-
return this.requireTask(taskId);
|
|
21928
|
-
}
|
|
21929
|
-
/**
|
|
21930
|
-
* 子任务完成:向父 assignee 投递 child-completed 消息;
|
|
21931
|
-
* 最后一个未完成子任务完成时,父任务 WAITING → WORKING(lead 接续汇总)。
|
|
21932
|
-
*/
|
|
21933
|
-
onChildCompleted(child) {
|
|
21934
|
-
const parentId = child.parentId;
|
|
21935
|
-
if (!parentId) return;
|
|
21936
|
-
const parent = this.get(parentId);
|
|
21937
|
-
if (!parent) return;
|
|
21938
|
-
this.deliverTaskMessage({
|
|
21939
|
-
channelId: child.channelId,
|
|
21940
|
-
taskId: parent.id,
|
|
21941
|
-
fromAgentId: child.assigneeId,
|
|
21942
|
-
toAgentId: parent.assigneeId,
|
|
21943
|
-
title: child.title,
|
|
21944
|
-
description: child.description,
|
|
21945
|
-
kind: "child-completed",
|
|
21946
|
-
childTaskId: child.id
|
|
21947
|
-
});
|
|
21948
|
-
const siblings = this.repos.tasks.listChildrenMeta(parent.channelId, parent.id);
|
|
21949
|
-
const incomplete = siblings.filter((t) => t.state !== "COMPLETED" && t.state !== "CANCELED");
|
|
21950
|
-
if (incomplete.length === 0 && parent.state === "WAITING") {
|
|
21951
|
-
this.transition(parent.id, "WORKING", child.assigneeId);
|
|
21952
|
-
}
|
|
21953
|
-
}
|
|
21954
|
-
requireTask(taskId) {
|
|
21955
|
-
const task = this.get(taskId);
|
|
21956
|
-
if (!task) throw new AppError(404, "NOT_FOUND", `\u4EFB\u52A1\u4E0D\u5B58\u5728: ${taskId}`);
|
|
21957
|
-
return task;
|
|
21958
|
-
}
|
|
21959
|
-
}
|
|
21960
|
-
|
|
21961
|
-
var __defProp$1 = Object.defineProperty;
|
|
21962
|
-
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21963
|
-
var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
21964
|
-
const W_RELEVANCE = 0.5;
|
|
21965
|
-
const W_RECENCY = 0.3;
|
|
21966
|
-
const W_IMPORTANCE = 0.2;
|
|
21967
|
-
const RECENCY_DAYS = 7;
|
|
21968
|
-
const RECENT_FALLBACK = 5;
|
|
21969
|
-
const WEAK_HIT_KEEP = 3;
|
|
21970
|
-
const MAX_TERMS = 12;
|
|
21971
|
-
const CONTENT_STORE_LIMIT = 800;
|
|
21972
|
-
function envNum(name, fallback) {
|
|
21973
|
-
const n = Number(process.env[name]);
|
|
21974
|
-
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
21975
|
-
}
|
|
21976
|
-
function segmentCJK(text) {
|
|
21977
|
-
return text.replace(/[\u4e00-\u9fff]+/g, (run) => ` ${run.split("").join(" ")} `);
|
|
21978
|
-
}
|
|
21979
|
-
function buildMatchQuery(text) {
|
|
21980
|
-
const cleaned = text.replace(/["'*().:+-]/g, " ").toLowerCase();
|
|
21981
|
-
const terms = segmentCJK(cleaned).split(/\s+/).filter(Boolean).filter((t) => /[\u4e00-\u9fff]/.test(t) || t.length >= 2).filter((t) => !["and", "or", "not", "near"].includes(t)).slice(0, MAX_TERMS);
|
|
21982
|
-
return terms.length > 0 ? terms.map((t) => `"${t}"`).join(" OR ") : null;
|
|
21983
|
-
}
|
|
21984
|
-
function estimateTokens(text) {
|
|
21985
|
-
var _a;
|
|
21986
|
-
const cjk = ((_a = text.match(/[\u4e00-\u9fff]/g)) != null ? _a : []).length;
|
|
21987
|
-
return Math.ceil((text.length - cjk) / 4) + cjk;
|
|
21988
|
-
}
|
|
21989
|
-
function unsegmentCJK(text) {
|
|
21990
|
-
return text.replace(/(?<=[\u4e00-\u9fff])\s+(?=[\u4e00-\u9fff])/g, "").replace(/(?<=[\u4e00-\u9fff])\s+([,.;:!?,。;:!?])/g, "$1").replace(/([,.;:!?,。;:!?])\s+(?=[\u4e00-\u9fff])/g, "$1").replace(/([A-Za-z0-9])\s+(?=[\u4e00-\u9fff])/g, "$1 ").replace(/(?<=[\u4e00-\u9fff])\s+(?=[A-Za-z0-9])/g, " ").trim();
|
|
21991
|
-
}
|
|
21992
|
-
function partsText(parts) {
|
|
21993
|
-
return parts.map((p) => "text" in p ? p.text : "").filter(Boolean).join("\n");
|
|
21994
|
-
}
|
|
21995
|
-
function humanAgo(iso) {
|
|
21996
|
-
const ms = Date.now() - Date.parse(iso);
|
|
21997
|
-
if (Number.isNaN(ms)) return "?";
|
|
21998
|
-
if (ms < 6e4) return "\u521A\u521A";
|
|
21999
|
-
if (ms < 36e5) return `${Math.floor(ms / 6e4)}\u5206\u949F\u524D`;
|
|
22000
|
-
if (ms < 864e5) return `${Math.floor(ms / 36e5)}\u5C0F\u65F6\u524D`;
|
|
22001
|
-
return `${Math.floor(ms / 864e5)}\u5929\u524D`;
|
|
22002
|
-
}
|
|
22003
|
-
class AgentMemory {
|
|
22004
|
-
constructor(repo, opts) {
|
|
22005
|
-
__publicField$1(this, "repo", repo);
|
|
22006
|
-
__publicField$1(this, "opts", opts);
|
|
22007
|
-
__publicField$1(this, "embedder");
|
|
22008
|
-
var _a;
|
|
22009
|
-
this.embedder = (_a = opts.embedder) != null ? _a : null;
|
|
22010
|
-
}
|
|
22011
|
-
/** 向量层惰性初始化(vecReady 后 no-op;建表失败一次性禁用 embedder) */
|
|
22012
|
-
ensureVec() {
|
|
22013
|
-
var _a;
|
|
22014
|
-
if (this.repo.vecReady) return;
|
|
22015
|
-
const dims = (_a = this.embedder) == null ? void 0 : _a.dims();
|
|
22016
|
-
if (dims && !this.repo.vecInit(dims)) this.embedder = null;
|
|
22017
|
-
}
|
|
22018
|
-
/** scope 过滤:private 仅本人行;shared 仅本 channel 的 team 行;auto 双域 */
|
|
22019
|
-
inScope(row, scope) {
|
|
22020
|
-
const isTeam = row.agentId === TEAM_AGENT_ID;
|
|
22021
|
-
if (isTeam && row.channelId !== this.opts.channelId) return false;
|
|
22022
|
-
return scope === "auto" ? isTeam || row.agentId === this.opts.agentId : scope === "shared" ? isTeam : row.agentId === this.opts.agentId;
|
|
22023
|
-
}
|
|
22024
|
-
/** 混合检索原始命中(FTS+向量融合;不排序不 touch) */
|
|
22025
|
-
async collectHits(query, scope) {
|
|
22026
|
-
var _a;
|
|
22027
|
-
const hits = /* @__PURE__ */ new Map();
|
|
22028
|
-
const match = buildMatchQuery(query);
|
|
22029
|
-
if (match) {
|
|
22030
|
-
const found = this.repo.search(this.opts.agentId, match, MAX_TERMS);
|
|
22031
|
-
const first = found[0];
|
|
22032
|
-
const best = first ? Math.max(-first.bm25, 1e-3) : 1;
|
|
22033
|
-
let kept = 0;
|
|
22034
|
-
for (const row of found) {
|
|
22035
|
-
if (!this.inScope(row, scope)) continue;
|
|
22036
|
-
const rel = Math.min(1, -row.bm25 / best);
|
|
22037
|
-
if (rel >= 0.1 || kept < WEAK_HIT_KEEP) {
|
|
22038
|
-
hits.set(row.id, { row, relevance: rel });
|
|
22039
|
-
kept += 1;
|
|
22040
|
-
}
|
|
22041
|
-
}
|
|
22042
|
-
}
|
|
22043
|
-
if (this.embedder) {
|
|
22044
|
-
try {
|
|
22045
|
-
const [qv] = await this.embedder.embed([query]);
|
|
22046
|
-
if (qv) {
|
|
22047
|
-
this.ensureVec();
|
|
22048
|
-
const ownDomains = scope === "shared" ? [TEAM_AGENT_ID] : scope === "private" ? [this.opts.agentId] : [this.opts.agentId, TEAM_AGENT_ID];
|
|
22049
|
-
const vAll = ownDomains.flatMap((d) => this.repo.vecSearch(d, qv, d === TEAM_AGENT_ID ? 5 : 10));
|
|
22050
|
-
const distByRowid = /* @__PURE__ */ new Map();
|
|
22051
|
-
for (const { memRowid, distance } of vAll) {
|
|
22052
|
-
const prev = distByRowid.get(memRowid);
|
|
22053
|
-
if (prev === void 0 || distance < prev) distByRowid.set(memRowid, distance);
|
|
22054
|
-
}
|
|
22055
|
-
for (const row of this.repo.listByRowids([...distByRowid.keys()])) {
|
|
22056
|
-
if (!this.inScope(row, scope)) continue;
|
|
22057
|
-
if (row.agentId !== this.opts.agentId && row.agentId !== TEAM_AGENT_ID) continue;
|
|
22058
|
-
const sim = Math.min(1, Math.max(0, 1 - ((_a = distByRowid.get(row.rowid)) != null ? _a : 1)));
|
|
22059
|
-
const prev = hits.get(row.id);
|
|
22060
|
-
hits.set(row.id, { row, relevance: prev ? Math.max(prev.relevance, sim) : sim });
|
|
22061
|
-
}
|
|
22062
|
-
}
|
|
22063
|
-
} catch {
|
|
22064
|
-
}
|
|
22065
|
-
}
|
|
22066
|
-
if (scope !== "shared") {
|
|
22067
|
-
for (const row of this.repo.listRecent(this.opts.agentId, RECENT_FALLBACK)) {
|
|
22068
|
-
if (!hits.has(row.id)) hits.set(row.id, { row, relevance: 0.15 });
|
|
22069
|
-
}
|
|
22070
|
-
}
|
|
22071
|
-
return hits;
|
|
22072
|
-
}
|
|
22073
|
-
/** 排序(综合分降序;不含预算/touch 副作用) */
|
|
22074
|
-
async rank(query, scope) {
|
|
22075
|
-
const hits = await this.collectHits(query, scope);
|
|
22076
|
-
return [...hits.values()].map((h) => ({ ...h, score: this.score(h.row, h.relevance) })).sort((a, b) => b.score - a.score);
|
|
22077
|
-
}
|
|
22078
|
-
/**
|
|
22079
|
-
* run/supervise 前的"记忆引子"注入:混合检索+排序+小预算装配 → 记忆块。
|
|
22080
|
-
* 默认 AW_MEMORY_PRIMER_TOKENS(300)小预算,只给最相关的少量线索;
|
|
22081
|
-
* 完整内容由 Agent 运行时经 search_memory 工具按需抓取(防全量注入污染上下文)。
|
|
22082
|
-
*/
|
|
22083
|
-
async recall(query, recallOpts = {}) {
|
|
22084
|
-
var _a, _b, _c;
|
|
22085
|
-
const doTouch = recallOpts.touch !== false;
|
|
22086
|
-
const budget = (_b = (_a = recallOpts.budgetTokens) != null ? _a : this.opts.budgetTokens) != null ? _b : envNum("AW_MEMORY_PRIMER_TOKENS", 300);
|
|
22087
|
-
const scope = (_c = recallOpts.scope) != null ? _c : "auto";
|
|
22088
|
-
const scored = await this.rank(query, scope);
|
|
22089
|
-
if (scored.length === 0) return null;
|
|
22090
|
-
const lines = [];
|
|
22091
|
-
const touched = [];
|
|
22092
|
-
let used = 0;
|
|
22093
|
-
for (const s of scored) {
|
|
22094
|
-
const line = this.formatLine(s.row);
|
|
22095
|
-
const cost = estimateTokens(line);
|
|
22096
|
-
if (used + cost > budget) continue;
|
|
22097
|
-
used += cost;
|
|
22098
|
-
lines.push(line);
|
|
22099
|
-
if (doTouch) touched.push(s.row.id);
|
|
22100
|
-
}
|
|
22101
|
-
if (lines.length === 0) return null;
|
|
22102
|
-
for (const id of touched) this.repo.touch(id);
|
|
22103
|
-
return [
|
|
22104
|
-
`## \u76F8\u5173\u8BB0\u5FC6(\u81EA\u52A8\u53EC\u56DE\u7684\u9AD8\u76F8\u5173/\u6700\u8FD1\u7EBF\u7D22\u6458\u8981;\u4E0E\u5F53\u524D\u4EFB\u52A1\u51B2\u7A81\u65F6,\u4EE5\u5F53\u524D\u4EFB\u52A1\u4E3A\u51C6)`,
|
|
22105
|
-
...lines,
|
|
22106
|
-
[
|
|
22107
|
-
`\u8BB0\u5FC6\u4F7F\u7528\u63D0\u793A:`,
|
|
22108
|
-
`- \u4EE5\u4E0A\u53EA\u662F\u7EBF\u7D22\u7EA7\u6458\u8981\u3002\u5F00\u5DE5\u524D\u5148\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u591A\u4E0A\u4E0B\u6587:\u5386\u53F2\u7ED3\u8BBA/\u56E2\u961F\u7EA6\u5B9A/\u76F8\u4F3C\u4EFB\u52A1\u7ECF\u9A8C \u2192 \u8C03 search_memory(query, scope) \u4E3B\u52A8\u68C0\u7D22(\u8986\u76D6\u79C1\u6709+\u5171\u4EAB\u57DF)\u3002`,
|
|
22109
|
-
`- \u4F5C\u4E1A\u4E2D\u53D1\u73B0\u53EF\u590D\u7528\u7684\u7ED3\u8BBA\u3001\u7EA6\u5B9A\u3001\u6559\u8BAD \u2192 \u7ACB\u5373 save_memory \u6C89\u6DC0:scope=private \u5B58\u4E2A\u4EBA\u7ECF\u9A8C,scope=shared \u53D1\u5E03\u5230 Channel \u516C\u5171\u8BB0\u5FC6\u4F9B\u5168\u5458\u590D\u7528\u3002`
|
|
22110
|
-
].join("\n")
|
|
22111
|
-
].join("\n");
|
|
22112
|
-
}
|
|
22113
|
-
/**
|
|
22114
|
-
* 工具按需抓取(search_memory):结构化片段返回,content 还原为未切分原文。
|
|
22115
|
-
* 触发 touch(access_count 强化后续召回排序);limit 上限防御。
|
|
22116
|
-
*/
|
|
22117
|
-
async recallRows(query, opts = {}) {
|
|
22118
|
-
var _a, _b;
|
|
22119
|
-
const scope = (_a = opts.scope) != null ? _a : "auto";
|
|
22120
|
-
const limit = Math.min(Math.max((_b = opts.limit) != null ? _b : 5, 1), 20);
|
|
22121
|
-
const scored = (await this.rank(query, scope)).slice(0, limit);
|
|
22122
|
-
for (const s of scored) this.repo.touch(s.row.id);
|
|
22123
|
-
return scored.map((s) => ({
|
|
22124
|
-
id: s.row.id,
|
|
22125
|
-
kind: s.row.kind,
|
|
22126
|
-
title: s.row.title,
|
|
22127
|
-
content: unsegmentCJK(s.row.content).slice(0, 500),
|
|
22128
|
-
importance: s.row.importance,
|
|
22129
|
-
createdAt: s.row.createdAt,
|
|
22130
|
-
score: Math.round(s.score * 1e3) / 1e3,
|
|
22131
|
-
source: s.row.agentId === TEAM_AGENT_ID ? "shared" : "private"
|
|
22132
|
-
}));
|
|
22133
|
-
}
|
|
22134
|
-
/**
|
|
22135
|
-
* Agent 主动沉淀(save_memory 工具):把作业过程中的可复用结论/经验写入记忆库。
|
|
22136
|
-
* scope='private' → 本人 semantic 域;scope='shared' → Channel 公共域(全员可检索;
|
|
22137
|
-
* dedupKey 按来源 Agent 命名空间隔离,避免多 Agent 同 key 互相覆盖)。写入后自动向量化。
|
|
22138
|
-
*/
|
|
22139
|
-
async save(input) {
|
|
22140
|
-
var _a, _b;
|
|
22141
|
-
const shared = input.scope === "shared";
|
|
22142
|
-
const rawKey = ((_a = input.dedupKey) == null ? void 0 : _a.trim()) || `agent-save:${randomUUID$1().slice(0, 8)}`;
|
|
22143
|
-
const dedupKey = shared ? `agent:${this.opts.agentId}:${rawKey}` : rawKey;
|
|
22144
|
-
const owner = shared ? TEAM_AGENT_ID : this.opts.agentId;
|
|
22145
|
-
this.repo.upsert({
|
|
22146
|
-
channelId: this.opts.channelId,
|
|
22147
|
-
agentId: owner,
|
|
22148
|
-
kind: "semantic",
|
|
22149
|
-
title: input.title,
|
|
22150
|
-
titleFts: segmentCJK(input.title),
|
|
22151
|
-
content: segmentCJK(input.content).slice(0, CONTENT_STORE_LIMIT),
|
|
22152
|
-
importance: (_b = input.importance) != null ? _b : shared ? 0.85 : 0.7,
|
|
22153
|
-
taskId: null,
|
|
22154
|
-
dedupKey
|
|
22155
|
-
});
|
|
22156
|
-
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, owner, dedupKey, input.content);
|
|
22157
|
-
return { scope: input.scope, dedupKey };
|
|
22158
|
-
}
|
|
22159
|
-
/** run 后(任务路径;仅终态调用):harvest TaskEngine 终态 + deliverable */
|
|
22160
|
-
async recordTaskOutcome(task) {
|
|
22161
|
-
const preferred = task.artifacts.filter((a) => a.name === "deliverable" || a.name === "summary");
|
|
22162
|
-
const source = preferred.length > 0 ? preferred : task.artifacts;
|
|
22163
|
-
const deliverable = source.flatMap((a) => a.parts).map((p) => "text" in p ? p.text : "").join(" ").trim();
|
|
22164
|
-
const content = deliverable || task.description || task.title;
|
|
22165
|
-
this.repo.upsert({
|
|
22166
|
-
channelId: this.opts.channelId,
|
|
22167
|
-
agentId: this.opts.agentId,
|
|
22168
|
-
kind: "episodic-task",
|
|
22169
|
-
title: task.title,
|
|
22170
|
-
titleFts: segmentCJK(task.title),
|
|
22171
|
-
content: segmentCJK(content).slice(0, CONTENT_STORE_LIMIT),
|
|
22172
|
-
importance: task.state === "COMPLETED" ? 0.8 : 0.55,
|
|
22759
|
+
const updated = this.repos.tasks.update(taskId, {
|
|
22760
|
+
assigneeId: toAgentId,
|
|
22761
|
+
retryCount: isRetry ? task.retryCount + 1 : task.retryCount
|
|
22762
|
+
});
|
|
22763
|
+
if (!updated) throw new AppError(404, "NOT_FOUND", `\u4EFB\u52A1\u4E0D\u5B58\u5728: ${taskId}`);
|
|
22764
|
+
this.repos.messages.consumePendingByTask(taskId);
|
|
22765
|
+
this.deliverTaskMessage({
|
|
22766
|
+
channelId: task.channelId,
|
|
22173
22767
|
taskId: task.id,
|
|
22174
|
-
|
|
22768
|
+
fromAgentId: task.creatorId || null,
|
|
22769
|
+
toAgentId,
|
|
22770
|
+
title: task.title,
|
|
22771
|
+
description: task.description,
|
|
22772
|
+
kind: "assign"
|
|
22175
22773
|
});
|
|
22176
|
-
|
|
22774
|
+
return rowToTask$1(updated);
|
|
22177
22775
|
}
|
|
22178
|
-
/**
|
|
22179
|
-
|
|
22180
|
-
|
|
22181
|
-
|
|
22182
|
-
|
|
22183
|
-
|
|
22184
|
-
|
|
22185
|
-
|
|
22186
|
-
|
|
22187
|
-
|
|
22188
|
-
|
|
22189
|
-
|
|
22190
|
-
|
|
22191
|
-
content: segmentCJK(content).slice(0, 600),
|
|
22192
|
-
importance: 0.4,
|
|
22193
|
-
taskId: (_c = msg.taskId) != null ? _c : null,
|
|
22194
|
-
dedupKey: `peer:${msg.messageId}`
|
|
22776
|
+
/** 取消任务:CANCELED(终态)+ 作废队列中的过期投递(assignee 不再消费)+ 投递 cancel 通知 */
|
|
22777
|
+
cancel(taskId, by) {
|
|
22778
|
+
const task = this.requireTask(taskId);
|
|
22779
|
+
this.transition(taskId, "CANCELED", by);
|
|
22780
|
+
this.repos.messages.consumePendingByTask(taskId);
|
|
22781
|
+
this.deliverTaskMessage({
|
|
22782
|
+
channelId: task.channelId,
|
|
22783
|
+
taskId: task.id,
|
|
22784
|
+
fromAgentId: by || null,
|
|
22785
|
+
toAgentId: task.assigneeId,
|
|
22786
|
+
title: task.title,
|
|
22787
|
+
description: task.description,
|
|
22788
|
+
kind: "cancel"
|
|
22195
22789
|
});
|
|
22196
|
-
|
|
22197
|
-
}
|
|
22198
|
-
/** 写入后向量化(委托模块级 vectorizeMemory;未切分原文,失败静默留 FTS) */
|
|
22199
|
-
async vectorize(plainContent, dedupKey) {
|
|
22200
|
-
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, this.opts.agentId, dedupKey, plainContent);
|
|
22201
|
-
}
|
|
22202
|
-
score(row, relevance) {
|
|
22203
|
-
const ageDays = (Date.now() - Date.parse(row.createdAt)) / 864e5;
|
|
22204
|
-
const recency = Math.exp(-ageDays / RECENCY_DAYS);
|
|
22205
|
-
const importance = Math.min(1, row.importance + row.accessCount * 0.05);
|
|
22206
|
-
return W_RELEVANCE * relevance + W_RECENCY * recency + W_IMPORTANCE * importance;
|
|
22207
|
-
}
|
|
22208
|
-
formatLine(row) {
|
|
22209
|
-
const tag = row.kind === "episodic-task" ? "\u4EFB\u52A1" : row.kind === "episodic-peer" ? "\u534F\u4F5C" : "\u5171\u4EAB";
|
|
22210
|
-
const content = unsegmentCJK(row.content);
|
|
22211
|
-
const short = content.length > 240 ? `${content.slice(0, 240)}\u2026` : content;
|
|
22212
|
-
return `- [${humanAgo(row.createdAt)}\xB7${tag}] ${row.title}:${short}`;
|
|
22213
|
-
}
|
|
22214
|
-
}
|
|
22215
|
-
async function vectorizeMemory(repo, embedder, channelId, agentId, dedupKey, plainContent) {
|
|
22216
|
-
if (!embedder) return;
|
|
22217
|
-
try {
|
|
22218
|
-
const [vec] = await embedder.embed([plainContent]);
|
|
22219
|
-
if (!vec) return;
|
|
22220
|
-
const dims = embedder.dims();
|
|
22221
|
-
if (dims && !repo.vecInit(dims)) return;
|
|
22222
|
-
const at = repo.findByAgentDedup(channelId, agentId, dedupKey);
|
|
22223
|
-
if (at) repo.vecSet(at.rowid, agentId, vec);
|
|
22224
|
-
} catch {
|
|
22790
|
+
return this.requireTask(taskId);
|
|
22225
22791
|
}
|
|
22226
|
-
|
|
22227
|
-
|
|
22228
|
-
|
|
22229
|
-
|
|
22230
|
-
|
|
22231
|
-
|
|
22232
|
-
|
|
22233
|
-
|
|
22234
|
-
|
|
22235
|
-
|
|
22236
|
-
|
|
22237
|
-
|
|
22238
|
-
|
|
22239
|
-
|
|
22240
|
-
|
|
22241
|
-
|
|
22242
|
-
|
|
22243
|
-
|
|
22244
|
-
|
|
22245
|
-
|
|
22246
|
-
const
|
|
22247
|
-
if (
|
|
22248
|
-
|
|
22249
|
-
for (const { r } of sorted.slice(cap)) {
|
|
22250
|
-
repo.vecDelete(r.rowid);
|
|
22251
|
-
repo.delete(r.id);
|
|
22252
|
-
evicted++;
|
|
22253
|
-
}
|
|
22792
|
+
/**
|
|
22793
|
+
* 子任务完成:向父 assignee 投递 child-completed 消息;
|
|
22794
|
+
* 最后一个未完成子任务完成时,父任务 WAITING → WORKING(lead 接续汇总)。
|
|
22795
|
+
*/
|
|
22796
|
+
onChildCompleted(child) {
|
|
22797
|
+
const parentId = child.parentId;
|
|
22798
|
+
if (!parentId) return;
|
|
22799
|
+
const parent = this.get(parentId);
|
|
22800
|
+
if (!parent) return;
|
|
22801
|
+
this.deliverTaskMessage({
|
|
22802
|
+
channelId: child.channelId,
|
|
22803
|
+
taskId: parent.id,
|
|
22804
|
+
fromAgentId: child.assigneeId,
|
|
22805
|
+
toAgentId: parent.assigneeId,
|
|
22806
|
+
title: child.title,
|
|
22807
|
+
description: child.description,
|
|
22808
|
+
kind: "child-completed",
|
|
22809
|
+
childTaskId: child.id
|
|
22810
|
+
});
|
|
22811
|
+
const siblings = this.repos.tasks.listChildrenMeta(parent.channelId, parent.id);
|
|
22812
|
+
const incomplete = siblings.filter((t) => t.state !== "COMPLETED" && t.state !== "CANCELED");
|
|
22813
|
+
if (incomplete.length === 0 && parent.state === "WAITING") {
|
|
22814
|
+
this.transition(parent.id, "WORKING", child.assigneeId);
|
|
22254
22815
|
}
|
|
22255
22816
|
}
|
|
22256
|
-
|
|
22257
|
-
|
|
22258
|
-
|
|
22259
|
-
|
|
22817
|
+
requireTask(taskId) {
|
|
22818
|
+
const task = this.get(taskId);
|
|
22819
|
+
if (!task) throw new AppError(404, "NOT_FOUND", `\u4EFB\u52A1\u4E0D\u5B58\u5728: ${taskId}`);
|
|
22820
|
+
return task;
|
|
22260
22821
|
}
|
|
22261
|
-
return { deletedExpired, evicted, cleanedVec };
|
|
22262
22822
|
}
|
|
22263
22823
|
|
|
22264
22824
|
const FAIL_THRESHOLD = 3;
|
|
@@ -22391,6 +22951,8 @@ class AgentChannelManager {
|
|
|
22391
22951
|
__publicField(this, "memoryTimer", null);
|
|
22392
22952
|
/** 全 manager 共享的 env 向量 provider(未配置 → null 纯 FTS;熔断/维度全体实例共享) */
|
|
22393
22953
|
__publicField(this, "memoryEmbedder", createEnvEmbeddingProvider());
|
|
22954
|
+
/** 反思游标:每 agent 上次聚合的当月任务数(月度幂等增量判定) */
|
|
22955
|
+
__publicField(this, "reflectCounts", /* @__PURE__ */ new Map());
|
|
22394
22956
|
var _a, _b;
|
|
22395
22957
|
this.memoryTimer = setInterval(() => {
|
|
22396
22958
|
try {
|
|
@@ -22398,6 +22960,11 @@ class AgentChannelManager {
|
|
|
22398
22960
|
} catch (err) {
|
|
22399
22961
|
log.error("[memory] \u7EF4\u62A4\u4EFB\u52A1\u5F02\u5E38", err);
|
|
22400
22962
|
}
|
|
22963
|
+
try {
|
|
22964
|
+
this.reflectIdleMemories();
|
|
22965
|
+
} catch (err) {
|
|
22966
|
+
log.error("[memory] \u53CD\u601D\u4EFB\u52A1\u5F02\u5E38", err);
|
|
22967
|
+
}
|
|
22401
22968
|
}, envNum("AW_MEMORY_MAINTENANCE_MS", 6 * 36e5));
|
|
22402
22969
|
(_b = (_a = this.memoryTimer).unref) == null ? void 0 : _b.call(_a);
|
|
22403
22970
|
}
|
|
@@ -22438,9 +23005,85 @@ class AgentChannelManager {
|
|
|
22438
23005
|
cr.setLoader((id) => this.ensureAgentRuntime(channelId, id));
|
|
22439
23006
|
this.channels.set(channelId, cr);
|
|
22440
23007
|
this.buses.set(channelId, this.buildBus(cr));
|
|
23008
|
+
this.buses.get(channelId).onTaskEvent((e) => this.recordTeamTaskTerminal(channelId, e));
|
|
22441
23009
|
}
|
|
22442
23010
|
return cr;
|
|
22443
23011
|
}
|
|
23012
|
+
/**
|
|
23013
|
+
* 团队历史沉淀(任务终态):① team-task 共享行(成果/失败原因,全员可检索);
|
|
23014
|
+
* ② 团队编年史滚动重写(最近 12 条终态任务轨迹)。
|
|
23015
|
+
*/
|
|
23016
|
+
recordTeamTaskTerminal(channelId, e) {
|
|
23017
|
+
var _a, _b, _c;
|
|
23018
|
+
if (!e.state || !TERMINAL_TASK_STATES[e.state]) return;
|
|
23019
|
+
try {
|
|
23020
|
+
const completed = e.state === "COMPLETED";
|
|
23021
|
+
const task = e.task;
|
|
23022
|
+
const title = (_a = task == null ? void 0 : task.title) != null ? _a : `\u4EFB\u52A1 ${e.taskId.slice(0, 8)}`;
|
|
23023
|
+
const artifacts = (_b = task == null ? void 0 : task.artifacts) != null ? _b : [];
|
|
23024
|
+
const preferred = artifacts.filter((a) => a.name === "deliverable" || a.name === "summary");
|
|
23025
|
+
const source = preferred.length > 0 ? preferred : artifacts;
|
|
23026
|
+
const deliverable = source.flatMap((a) => a.parts).map((p) => "text" in p ? p.text : "").join(" ").trim();
|
|
23027
|
+
const content = completed ? deliverable || title : `\u4EFB\u52A1\u300C${title}\u300D${e.state === "CANCELED" ? "\u5DF2\u53D6\u6D88" : "\u672A\u5B8C\u6210"}${deliverable ? `;\u5DF2\u6709\u8FDB\u5C55: ${deliverable.slice(0, 200)}` : ""}`;
|
|
23028
|
+
const mem = new AgentMemory(this.deps.repos.memories, { channelId, agentId: TEAM_AGENT_ID, embedder: (_c = this.memoryEmbedder) != null ? _c : void 0 });
|
|
23029
|
+
void mem.appendTeamTaskRecord({
|
|
23030
|
+
taskId: e.taskId,
|
|
23031
|
+
title,
|
|
23032
|
+
content,
|
|
23033
|
+
importance: completed ? 0.8 : 0.55
|
|
23034
|
+
}).catch((err) => {
|
|
23035
|
+
log.error("[memory] team-task \u6C89\u6DC0\u5931\u8D25:", err);
|
|
23036
|
+
});
|
|
23037
|
+
this.refreshChronicle(channelId);
|
|
23038
|
+
} catch (err) {
|
|
23039
|
+
log.error("[memory] \u56E2\u961F\u4EFB\u52A1\u6C89\u6DC0\u5F02\u5E38:", err);
|
|
23040
|
+
}
|
|
23041
|
+
}
|
|
23042
|
+
/** 团队编年史滚动重写(最近 12 条终态任务;chronicle:<channelId> 幂等单行;免向量化) */
|
|
23043
|
+
refreshChronicle(channelId) {
|
|
23044
|
+
try {
|
|
23045
|
+
const terminal = this.getTaskEngine().list(channelId).filter((t) => TERMINAL_TASK_STATES[t.state]).sort((a, b) => a.updatedAt < b.updatedAt ? 1 : -1).slice(0, 12);
|
|
23046
|
+
if (terminal.length === 0) return;
|
|
23047
|
+
const entries = terminal.map((t) => {
|
|
23048
|
+
const stamp = t.updatedAt.slice(5, 16).replace("T", " ");
|
|
23049
|
+
const deliverable = t.artifacts.flatMap((a) => a.parts).map((p) => "text" in p ? p.text : "").join(" ").replace(/\s+/g, " ").trim().slice(0, 60);
|
|
23050
|
+
const state = t.state === "COMPLETED" ? "\u5B8C\u6210" : t.state === "FAILED" ? "\u5931\u8D25" : "\u53D6\u6D88";
|
|
23051
|
+
return `${stamp} [${state}] ${t.title} \u2014 ${t.assigneeId.slice(0, 8)}${deliverable ? `(${deliverable})` : ""}`;
|
|
23052
|
+
});
|
|
23053
|
+
new AgentMemory(this.deps.repos.memories, { channelId, agentId: TEAM_AGENT_ID }).upsertChronicle(entries.join("\n"));
|
|
23054
|
+
} catch (err) {
|
|
23055
|
+
log.error("[memory] \u7F16\u5E74\u53F2\u5237\u65B0\u5931\u8D25:", err);
|
|
23056
|
+
}
|
|
23057
|
+
}
|
|
23058
|
+
/**
|
|
23059
|
+
* 空闲反思(sleep-time compute,零 LLM):当月 episodic-task 增量 ≥ 阈值时,
|
|
23060
|
+
* 聚合标题+结论成 semantic 反思行(月度 dedupKey 幂等;FTS 可检索,免向量化)。
|
|
23061
|
+
*/
|
|
23062
|
+
reflectIdleMemories() {
|
|
23063
|
+
var _a, _b;
|
|
23064
|
+
for (const rt of this.agentIndex.values()) {
|
|
23065
|
+
if (rt.getState() === "busy") return;
|
|
23066
|
+
}
|
|
23067
|
+
const trigger = envNum("AW_MEMORY_REFLECT_TRIGGER", 8);
|
|
23068
|
+
const month = (/* @__PURE__ */ new Date()).toISOString().slice(0, 7);
|
|
23069
|
+
for (const agentId of this.deps.repos.memories.listMemoryAgentIds()) {
|
|
23070
|
+
const rows = this.deps.repos.memories.listByAgentWithRowid(agentId, 1e6).filter((r) => r.kind === "episodic-task" && r.createdAt.slice(0, 7) === month);
|
|
23071
|
+
const prev = (_a = this.reflectCounts.get(agentId)) != null ? _a : 0;
|
|
23072
|
+
if (rows.length < trigger || rows.length <= prev) continue;
|
|
23073
|
+
const byChannel = /* @__PURE__ */ new Map();
|
|
23074
|
+
for (const r of rows) {
|
|
23075
|
+
const list = (_b = byChannel.get(r.channelId)) != null ? _b : [];
|
|
23076
|
+
list.push(r);
|
|
23077
|
+
byChannel.set(r.channelId, list);
|
|
23078
|
+
}
|
|
23079
|
+
for (const [channelId, list] of byChannel) {
|
|
23080
|
+
const lines = list.slice(0, 20).map((r) => `- ${r.title}:${unsegmentCJK(r.content).slice(0, 60)}`);
|
|
23081
|
+
new AgentMemory(this.deps.repos.memories, { channelId, agentId }).upsertReflection({ month, content: [`\u5F53\u6708 ${list.length} \u9879\u4EFB\u52A1\u7ECF\u9A8C\u805A\u5408:`, ...lines].join("\n") });
|
|
23082
|
+
}
|
|
23083
|
+
this.reflectCounts.set(agentId, rows.length);
|
|
23084
|
+
log.info(`[memory] \u53CD\u601D\u84B8\u998F:agent=${agentId.slice(0, 8)} \u5F53\u6708 ${rows.length} \u9879\u4EFB\u52A1\u5DF2\u805A\u5408`);
|
|
23085
|
+
}
|
|
23086
|
+
}
|
|
22444
23087
|
buildBus(cr) {
|
|
22445
23088
|
const eventListeners = /* @__PURE__ */ new Set();
|
|
22446
23089
|
const taskListeners = /* @__PURE__ */ new Set();
|
|
@@ -22928,6 +23571,7 @@ class AgentChannelManager {
|
|
|
22928
23571
|
updateTask: (taskId, patch) => this.updateTask(channelId, agent.id, taskId, patch),
|
|
22929
23572
|
reassignTask: (taskId, toAgentId) => this.reassignTask(channelId, agent.id, taskId, toAgentId),
|
|
22930
23573
|
sendMessage: (input) => this.sendA2A(channelId, agent.id, input),
|
|
23574
|
+
sendCrossChannelMessage: (input) => this.sendCrossChannelMessage(channelId, agent.id, input),
|
|
22931
23575
|
refuseTask: (taskId, reason) => this.refuseTask(channelId, agent.id, taskId, reason),
|
|
22932
23576
|
pollMailbox: (limit) => this.pollMailbox(channelId, agent.id, limit),
|
|
22933
23577
|
waitMailbox: (limit, waitMs) => this.waitMailbox(channelId, agent.id, limit != null ? limit : 10, waitMs != null ? waitMs : 0),
|
|
@@ -22946,6 +23590,12 @@ class AgentChannelManager {
|
|
|
22946
23590
|
(_a = this.buses.get(channelId)) == null ? void 0 : _a.notifyMemory({ agentId: agent.id, scope: input.scope, title: input.title, dedupKey: saved.dedupKey });
|
|
22947
23591
|
return saved;
|
|
22948
23592
|
},
|
|
23593
|
+
// 会话压缩摘要入库(harvest 桥):omp 压缩产出 → 本成员 episodic-session 记忆
|
|
23594
|
+
recordSessionMemory: async (input) => {
|
|
23595
|
+
var _a;
|
|
23596
|
+
const saved = await memory.recordSessionCompaction(input);
|
|
23597
|
+
(_a = this.buses.get(channelId)) == null ? void 0 : _a.notifyMemory({ agentId: agent.id, scope: "private", title: `\u4F1A\u8BDD\u538B\u7F29\u6458\u8981(${input.summary.length}\u5B57)`, dedupKey: saved.dedupKey });
|
|
23598
|
+
},
|
|
22949
23599
|
// 团队成员管理(仅 lead;manager 内二次校验角色,工具面与决策面共用)
|
|
22950
23600
|
createTeamMember: (input) => this.createTeamMember(channelId, agent.id, input),
|
|
22951
23601
|
updateTeamMember: (agentId, patch) => this.updateTeamMember(channelId, agent.id, agentId, patch),
|
|
@@ -24140,6 +24790,65 @@ class AgentChannelManager {
|
|
|
24140
24790
|
}
|
|
24141
24791
|
return message;
|
|
24142
24792
|
}
|
|
24793
|
+
/**
|
|
24794
|
+
* 跨 Channel 点对点通信(仅 lead):把消息直投目标 channel 的 lead mailbox。
|
|
24795
|
+
* 沿用既有 mailbox/route 机制(投递/唤醒/消费/回执全复用),仅新增跨 channel 路由:
|
|
24796
|
+
* - 权限:发送方必须是本 channel 启用成员中的 lead(worker/系统拒绝);
|
|
24797
|
+
* - 同主约束:两个 channel 必须属于同一 owner(用户级隔离不破);
|
|
24798
|
+
* - 守卫通行:x-aw-cross-channel 标记由服务端在发送时盖章(REST/工具入参不可伪造),
|
|
24799
|
+
* 目标 channel 信箱守卫据此放行非成员发送方的跨 channel 消息;
|
|
24800
|
+
* - 回执:目标 lead 经同一机制回信(其 send_message_to_agent / 本方法均可,
|
|
24801
|
+
* in_reply_to 关联触发实时推送)。
|
|
24802
|
+
*/
|
|
24803
|
+
async sendCrossChannelMessage(fromChannelId, fromAgentId, input) {
|
|
24804
|
+
var _a, _b, _c;
|
|
24805
|
+
const sender = this.deps.repos.channelAgents.findByChannelAgent(fromChannelId, fromAgentId);
|
|
24806
|
+
if (!sender || sender.enabled !== 1) {
|
|
24807
|
+
throw new AppError(403, "SCOPE_VIOLATION", "\u8DE8 Channel \u901A\u4FE1\u7684\u53D1\u9001\u65B9\u5FC5\u987B\u662F\u672C channel \u7684\u542F\u7528\u6210\u5458");
|
|
24808
|
+
}
|
|
24809
|
+
if (sender.role !== "lead") {
|
|
24810
|
+
throw new AppError(403, "ROLE_FORBIDDEN", `\u8DE8 Channel \u901A\u4FE1\u4EC5\u9650 Leader \u53D1\u8D77(${sender.name} \u662F ${sender.role})`);
|
|
24811
|
+
}
|
|
24812
|
+
const needle = input.toChannelId.trim().toLowerCase();
|
|
24813
|
+
const rows = this.deps.repos.channels.list();
|
|
24814
|
+
const target = (_b = (_a = rows.find((c) => c.id === input.toChannelId)) != null ? _a : rows.find((c) => c.name.toLowerCase() === needle)) != null ? _b : (() => {
|
|
24815
|
+
const partial = rows.filter((c) => c.name.toLowerCase().includes(needle));
|
|
24816
|
+
return partial.length === 1 ? partial[0] : void 0;
|
|
24817
|
+
})();
|
|
24818
|
+
if (!target || target.id === fromChannelId) {
|
|
24819
|
+
throw new AppError(404, "CHANNEL_NOT_FOUND", `\u76EE\u6807 channel \u672A\u547D\u4E2D(\u4E14\u4E0D\u53EF\u4E3A\u672C channel): ${input.toChannelId}`);
|
|
24820
|
+
}
|
|
24821
|
+
if (target.enabled !== 1) throw new AppError(400, "CHANNEL_DISABLED", `\u76EE\u6807 channel \u5DF2\u505C\u7528: ${target.name}`);
|
|
24822
|
+
if (!target.leadAgentId) throw new AppError(400, "NO_LEAD", `\u76EE\u6807 channel \u6CA1\u6709 lead,\u65E0\u6CD5\u63A5\u6536\u8DE8 Channel \u6D88\u606F: ${target.name}`);
|
|
24823
|
+
const sourceChannel = this.deps.repos.channels.findById(fromChannelId);
|
|
24824
|
+
if (sourceChannel && target.ownerUserId !== null && sourceChannel.ownerUserId !== null && sourceChannel.ownerUserId !== target.ownerUserId) {
|
|
24825
|
+
throw new AppError(403, "SCOPE_VIOLATION", "\u8DE8 Channel \u901A\u4FE1\u4EC5\u9650\u540C\u4E00\u7528\u6237\u7684 channel \u4E4B\u95F4");
|
|
24826
|
+
}
|
|
24827
|
+
const targetLead = this.deps.repos.channelAgents.findByChannelAgent(target.id, target.leadAgentId);
|
|
24828
|
+
if (!targetLead || targetLead.enabled !== 1) {
|
|
24829
|
+
throw new AppError(400, "NO_LEAD", `\u76EE\u6807 channel \u7684 lead \u6210\u5458\u7F3A\u5931\u6216\u5DF2\u505C\u7528: ${target.name}`);
|
|
24830
|
+
}
|
|
24831
|
+
const message = buildMessage(target.id, "ROLE_AGENT", input.parts, {
|
|
24832
|
+
"x-aw-target-agent": targetLead.id,
|
|
24833
|
+
"x-aw-from-agent": fromAgentId,
|
|
24834
|
+
"x-aw-from-channel": fromChannelId,
|
|
24835
|
+
"x-aw-cross-channel": "true",
|
|
24836
|
+
"x-aw-from-label": `\u8DE8Channel:${(_c = sourceChannel == null ? void 0 : sourceChannel.name) != null ? _c : fromChannelId} / ${sender.name}`,
|
|
24837
|
+
...input.requireReply ? { "x-aw-require-reply": "true" } : {},
|
|
24838
|
+
// in_reply_to 关联:channel-runtime 将其视为 realtime,回复即时推送对端
|
|
24839
|
+
...input.inReplyTo ? { "x-aw-in-reply-to": input.inReplyTo } : {}
|
|
24840
|
+
});
|
|
24841
|
+
const delivered = this.route(target.id, message);
|
|
24842
|
+
if (!delivered.includes(targetLead.id)) {
|
|
24843
|
+
throw new AppError(502, "DELIVERY_FAILED", `\u8DE8 Channel \u6D88\u606F\u672A\u80FD\u6295\u9012\u5230\u300C${target.name}\u300D\u7684 lead \u4FE1\u7BB1,\u8BF7\u91CD\u8BD5`);
|
|
24844
|
+
}
|
|
24845
|
+
return {
|
|
24846
|
+
messageId: message.messageId,
|
|
24847
|
+
toChannelId: target.id,
|
|
24848
|
+
toChannelName: target.name,
|
|
24849
|
+
toLeadAgentId: targetLead.id
|
|
24850
|
+
};
|
|
24851
|
+
}
|
|
24143
24852
|
/** 阻塞长轮询(poll_messages):到信即时唤醒,250ms 兜底重查 */
|
|
24144
24853
|
async waitMailbox(channelId, callerAgentId, limit, waitMs) {
|
|
24145
24854
|
this.requireMember(channelId, callerAgentId);
|
|
@@ -24350,12 +25059,12 @@ workshopPlugin
|
|
|
24350
25059
|
];
|
|
24351
25060
|
|
|
24352
25061
|
const assets = {
|
|
24353
|
-
"/_nuxt/
|
|
25062
|
+
"/_nuxt/36oeS8_R2.js": {
|
|
24354
25063
|
"type": "text/javascript; charset=utf-8",
|
|
24355
|
-
"etag": "\"
|
|
24356
|
-
"mtime": "2026-09-
|
|
24357
|
-
"size":
|
|
24358
|
-
"path": "../public/_nuxt/
|
|
25064
|
+
"etag": "\"d6-9W7EHt23WjRGOYCN8bz9Yy0aMhg\"",
|
|
25065
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
25066
|
+
"size": 214,
|
|
25067
|
+
"path": "../public/_nuxt/36oeS8_R2.js"
|
|
24359
25068
|
},
|
|
24360
25069
|
"/favicon.svg": {
|
|
24361
25070
|
"type": "image/svg+xml",
|
|
@@ -24364,1259 +25073,1259 @@ const assets = {
|
|
|
24364
25073
|
"size": 819,
|
|
24365
25074
|
"path": "../public/favicon.svg"
|
|
24366
25075
|
},
|
|
24367
|
-
"/_nuxt/36oeS8_R2.js": {
|
|
24368
|
-
"type": "text/javascript; charset=utf-8",
|
|
24369
|
-
"etag": "\"d6-9W7EHt23WjRGOYCN8bz9Yy0aMhg\"",
|
|
24370
|
-
"mtime": "2026-09-02T10:44:57.785Z",
|
|
24371
|
-
"size": 214,
|
|
24372
|
-
"path": "../public/_nuxt/36oeS8_R2.js"
|
|
24373
|
-
},
|
|
24374
25076
|
"/_nuxt/agents.BJwgTLFZ.css": {
|
|
24375
25077
|
"type": "text/css; charset=utf-8",
|
|
24376
25078
|
"etag": "\"35b-ZsP4Yk5oNeMefP2PDhf6ga/NjEw\"",
|
|
24377
|
-
"mtime": "2026-09-
|
|
25079
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
24378
25080
|
"size": 859,
|
|
24379
25081
|
"path": "../public/_nuxt/agents.BJwgTLFZ.css"
|
|
24380
25082
|
},
|
|
24381
25083
|
"/_nuxt/7ZABjMRh2.js": {
|
|
24382
25084
|
"type": "text/javascript; charset=utf-8",
|
|
24383
25085
|
"etag": "\"3a06-vfWCeCuQModyMp+Xi4gZEB3CxnI\"",
|
|
24384
|
-
"mtime": "2026-09-
|
|
25086
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24385
25087
|
"size": 14854,
|
|
24386
25088
|
"path": "../public/_nuxt/7ZABjMRh2.js"
|
|
24387
25089
|
},
|
|
24388
|
-
"/_nuxt/
|
|
25090
|
+
"/_nuxt/2LwEn9gX.js": {
|
|
24389
25091
|
"type": "text/javascript; charset=utf-8",
|
|
24390
|
-
"etag": "\"
|
|
24391
|
-
"mtime": "2026-09-
|
|
24392
|
-
"size":
|
|
24393
|
-
"path": "../public/_nuxt/
|
|
25092
|
+
"etag": "\"548e-d/wW0XgblFvF2ZmqI6QmEPUI+0w\"",
|
|
25093
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
25094
|
+
"size": 21646,
|
|
25095
|
+
"path": "../public/_nuxt/2LwEn9gX.js"
|
|
24394
25096
|
},
|
|
24395
25097
|
"/_nuxt/9X0fVBD7.js": {
|
|
24396
25098
|
"type": "text/javascript; charset=utf-8",
|
|
24397
25099
|
"etag": "\"3d68-dpaiop+2vd/2C5Gh1mxTjRk6P6w\"",
|
|
24398
|
-
"mtime": "2026-09-
|
|
25100
|
+
"mtime": "2026-09-02T12:06:00.105Z",
|
|
24399
25101
|
"size": 15720,
|
|
24400
25102
|
"path": "../public/_nuxt/9X0fVBD7.js"
|
|
24401
25103
|
},
|
|
24402
|
-
"/_nuxt/B3__nfxM.js": {
|
|
24403
|
-
"type": "text/javascript; charset=utf-8",
|
|
24404
|
-
"etag": "\"9924-mdZF1OXMinqQgkVx966QA9Mnw34\"",
|
|
24405
|
-
"mtime": "2026-09-02T10:44:57.787Z",
|
|
24406
|
-
"size": 39204,
|
|
24407
|
-
"path": "../public/_nuxt/B3__nfxM.js"
|
|
24408
|
-
},
|
|
24409
25104
|
"/_nuxt/B0haAGoq.js": {
|
|
24410
25105
|
"type": "text/javascript; charset=utf-8",
|
|
24411
25106
|
"etag": "\"371a-aqw44lYAQlSTs+GwfR2Ui/b7goA\"",
|
|
24412
|
-
"mtime": "2026-09-
|
|
25107
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
24413
25108
|
"size": 14106,
|
|
24414
25109
|
"path": "../public/_nuxt/B0haAGoq.js"
|
|
24415
25110
|
},
|
|
24416
|
-
"/_nuxt/
|
|
25111
|
+
"/_nuxt/B-PgoIPN.js": {
|
|
24417
25112
|
"type": "text/javascript; charset=utf-8",
|
|
24418
|
-
"etag": "\"
|
|
24419
|
-
"mtime": "2026-09-
|
|
24420
|
-
"size":
|
|
24421
|
-
"path": "../public/_nuxt/
|
|
25113
|
+
"etag": "\"2d99-Ho+i6uMJOQv4GcKgjDeaCxtu/Mo\"",
|
|
25114
|
+
"mtime": "2026-09-02T12:06:00.105Z",
|
|
25115
|
+
"size": 11673,
|
|
25116
|
+
"path": "../public/_nuxt/B-PgoIPN.js"
|
|
25117
|
+
},
|
|
25118
|
+
"/_nuxt/B3__nfxM.js": {
|
|
25119
|
+
"type": "text/javascript; charset=utf-8",
|
|
25120
|
+
"etag": "\"9924-mdZF1OXMinqQgkVx966QA9Mnw34\"",
|
|
25121
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
25122
|
+
"size": 39204,
|
|
25123
|
+
"path": "../public/_nuxt/B3__nfxM.js"
|
|
24422
25124
|
},
|
|
24423
25125
|
"/_nuxt/B4GHHF6d2.js": {
|
|
24424
25126
|
"type": "text/javascript; charset=utf-8",
|
|
24425
25127
|
"etag": "\"6a1f-sgKC+rBlgDrFN2xJnNBcsQFFelY\"",
|
|
24426
|
-
"mtime": "2026-09-
|
|
25128
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
24427
25129
|
"size": 27167,
|
|
24428
25130
|
"path": "../public/_nuxt/B4GHHF6d2.js"
|
|
24429
25131
|
},
|
|
25132
|
+
"/_nuxt/BbQornXa.js": {
|
|
25133
|
+
"type": "text/javascript; charset=utf-8",
|
|
25134
|
+
"etag": "\"20d2-fXnSrm+6nw+8ZWjtQ/dLscMx2uc\"",
|
|
25135
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
25136
|
+
"size": 8402,
|
|
25137
|
+
"path": "../public/_nuxt/BbQornXa.js"
|
|
25138
|
+
},
|
|
24430
25139
|
"/_nuxt/B7V9IfTL.js": {
|
|
24431
25140
|
"type": "text/javascript; charset=utf-8",
|
|
24432
25141
|
"etag": "\"21bb-WNOATwmMACC/INep96wHvyKusZ8\"",
|
|
24433
|
-
"mtime": "2026-09-
|
|
25142
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24434
25143
|
"size": 8635,
|
|
24435
25144
|
"path": "../public/_nuxt/B7V9IfTL.js"
|
|
24436
25145
|
},
|
|
25146
|
+
"/_nuxt/B6M2WJWm2.js": {
|
|
25147
|
+
"type": "text/javascript; charset=utf-8",
|
|
25148
|
+
"etag": "\"92-HewTRGUKJSuRw0kFs5RC2k2x4sk\"",
|
|
25149
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
25150
|
+
"size": 146,
|
|
25151
|
+
"path": "../public/_nuxt/B6M2WJWm2.js"
|
|
25152
|
+
},
|
|
24437
25153
|
"/_nuxt/B9aPoQvt.js": {
|
|
24438
25154
|
"type": "text/javascript; charset=utf-8",
|
|
24439
25155
|
"etag": "\"469c-iKeDALdd9GdkRbr7YkPyLiRiPm0\"",
|
|
24440
|
-
"mtime": "2026-09-
|
|
25156
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24441
25157
|
"size": 18076,
|
|
24442
25158
|
"path": "../public/_nuxt/B9aPoQvt.js"
|
|
24443
25159
|
},
|
|
24444
|
-
"/_nuxt/BBrRELH32.js": {
|
|
24445
|
-
"type": "text/javascript; charset=utf-8",
|
|
24446
|
-
"etag": "\"5bc-jGs6+2LpPidhbmCHZyKfmEWQxCI\"",
|
|
24447
|
-
"mtime": "2026-09-02T10:44:57.789Z",
|
|
24448
|
-
"size": 1468,
|
|
24449
|
-
"path": "../public/_nuxt/BBrRELH32.js"
|
|
24450
|
-
},
|
|
24451
|
-
"/_nuxt/BbQornXa.js": {
|
|
24452
|
-
"type": "text/javascript; charset=utf-8",
|
|
24453
|
-
"etag": "\"20d2-fXnSrm+6nw+8ZWjtQ/dLscMx2uc\"",
|
|
24454
|
-
"mtime": "2026-09-02T10:44:57.795Z",
|
|
24455
|
-
"size": 8402,
|
|
24456
|
-
"path": "../public/_nuxt/BbQornXa.js"
|
|
24457
|
-
},
|
|
24458
25160
|
"/_nuxt/BCipft_k2.js": {
|
|
24459
25161
|
"type": "text/javascript; charset=utf-8",
|
|
24460
25162
|
"etag": "\"144-2D+eSx4+11AuVi/8yHxyPvkJ3L4\"",
|
|
24461
|
-
"mtime": "2026-09-
|
|
25163
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24462
25164
|
"size": 324,
|
|
24463
25165
|
"path": "../public/_nuxt/BCipft_k2.js"
|
|
24464
25166
|
},
|
|
24465
|
-
"/_nuxt/BE5QyG5J2.js": {
|
|
24466
|
-
"type": "text/javascript; charset=utf-8",
|
|
24467
|
-
"etag": "\"a09-92sH0EppYph8z6pqhl6Y9RYhj/A\"",
|
|
24468
|
-
"mtime": "2026-09-02T10:44:57.790Z",
|
|
24469
|
-
"size": 2569,
|
|
24470
|
-
"path": "../public/_nuxt/BE5QyG5J2.js"
|
|
24471
|
-
},
|
|
24472
25167
|
"/_nuxt/Bc_mM2cU.js": {
|
|
24473
25168
|
"type": "text/javascript; charset=utf-8",
|
|
24474
25169
|
"etag": "\"3e50-7NnGhVtLTA9Z4/YfDl2qwyaKRpA\"",
|
|
24475
|
-
"mtime": "2026-09-
|
|
25170
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24476
25171
|
"size": 15952,
|
|
24477
25172
|
"path": "../public/_nuxt/Bc_mM2cU.js"
|
|
24478
25173
|
},
|
|
24479
|
-
"/_nuxt/
|
|
25174
|
+
"/_nuxt/BBrRELH32.js": {
|
|
24480
25175
|
"type": "text/javascript; charset=utf-8",
|
|
24481
|
-
"etag": "\"
|
|
24482
|
-
"mtime": "2026-09-
|
|
24483
|
-
"size":
|
|
24484
|
-
"path": "../public/_nuxt/
|
|
25176
|
+
"etag": "\"5bc-jGs6+2LpPidhbmCHZyKfmEWQxCI\"",
|
|
25177
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
25178
|
+
"size": 1468,
|
|
25179
|
+
"path": "../public/_nuxt/BBrRELH32.js"
|
|
25180
|
+
},
|
|
25181
|
+
"/_nuxt/BE5QyG5J2.js": {
|
|
25182
|
+
"type": "text/javascript; charset=utf-8",
|
|
25183
|
+
"etag": "\"a09-92sH0EppYph8z6pqhl6Y9RYhj/A\"",
|
|
25184
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
25185
|
+
"size": 2569,
|
|
25186
|
+
"path": "../public/_nuxt/BE5QyG5J2.js"
|
|
24485
25187
|
},
|
|
24486
25188
|
"/_nuxt/BeIfu4N3.js": {
|
|
24487
25189
|
"type": "text/javascript; charset=utf-8",
|
|
24488
25190
|
"etag": "\"bc89-neyoILuYLlrhO8n1ehz7UmvocMs\"",
|
|
24489
|
-
"mtime": "2026-09-
|
|
25191
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24490
25192
|
"size": 48265,
|
|
24491
25193
|
"path": "../public/_nuxt/BeIfu4N3.js"
|
|
24492
25194
|
},
|
|
24493
25195
|
"/_nuxt/BfGc7TJp.js": {
|
|
24494
25196
|
"type": "text/javascript; charset=utf-8",
|
|
24495
25197
|
"etag": "\"f5-ynAHqm+XhchZ1co7YynIGiIextg\"",
|
|
24496
|
-
"mtime": "2026-09-
|
|
25198
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24497
25199
|
"size": 245,
|
|
24498
25200
|
"path": "../public/_nuxt/BfGc7TJp.js"
|
|
24499
25201
|
},
|
|
24500
|
-
"/_nuxt/
|
|
25202
|
+
"/_nuxt/BF9XPEuw.js": {
|
|
25203
|
+
"type": "text/javascript; charset=utf-8",
|
|
25204
|
+
"etag": "\"21a2-h/t9I4kWzgCaeW8bpn6JW7nfaow\"",
|
|
25205
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
25206
|
+
"size": 8610,
|
|
25207
|
+
"path": "../public/_nuxt/BF9XPEuw.js"
|
|
25208
|
+
},
|
|
25209
|
+
"/_nuxt/BFYNhG9S.js": {
|
|
24501
25210
|
"type": "text/javascript; charset=utf-8",
|
|
24502
|
-
"etag": "\"
|
|
24503
|
-
"mtime": "2026-09-
|
|
24504
|
-
"size":
|
|
24505
|
-
"path": "../public/_nuxt/
|
|
25211
|
+
"etag": "\"9141-81iSu9pJRw8QX6Mxx5nKGoYfOM4\"",
|
|
25212
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
25213
|
+
"size": 37185,
|
|
25214
|
+
"path": "../public/_nuxt/BFYNhG9S.js"
|
|
24506
25215
|
},
|
|
24507
25216
|
"/_nuxt/BDUjyaF4.js": {
|
|
24508
25217
|
"type": "text/javascript; charset=utf-8",
|
|
24509
25218
|
"etag": "\"12149-hpS4uBcTVyjMF/ahBrfPvWSV6dM\"",
|
|
24510
|
-
"mtime": "2026-09-
|
|
25219
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
24511
25220
|
"size": 74057,
|
|
24512
25221
|
"path": "../public/_nuxt/BDUjyaF4.js"
|
|
24513
25222
|
},
|
|
24514
|
-
"/_nuxt/
|
|
25223
|
+
"/_nuxt/BdKzfJiM.js": {
|
|
24515
25224
|
"type": "text/javascript; charset=utf-8",
|
|
24516
|
-
"etag": "\"
|
|
24517
|
-
"mtime": "2026-09-
|
|
24518
|
-
"size":
|
|
24519
|
-
"path": "../public/_nuxt/
|
|
25225
|
+
"etag": "\"1ca51-bE9q/bI2sZhVumbDlGwg8BOjxLQ\"",
|
|
25226
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
25227
|
+
"size": 117329,
|
|
25228
|
+
"path": "../public/_nuxt/BdKzfJiM.js"
|
|
24520
25229
|
},
|
|
24521
25230
|
"/_nuxt/BFjGV-RV2.js": {
|
|
24522
25231
|
"type": "text/javascript; charset=utf-8",
|
|
24523
25232
|
"etag": "\"a0340-NzvTqyczSJgnuw9pjPQnLX42sAE\"",
|
|
24524
|
-
"mtime": "2026-09-
|
|
25233
|
+
"mtime": "2026-09-02T12:06:00.110Z",
|
|
24525
25234
|
"size": 656192,
|
|
24526
25235
|
"path": "../public/_nuxt/BFjGV-RV2.js"
|
|
24527
25236
|
},
|
|
24528
25237
|
"/_nuxt/Bi6AiCuP.js": {
|
|
24529
25238
|
"type": "text/javascript; charset=utf-8",
|
|
24530
25239
|
"etag": "\"496e-oqHtafCqQjIHhroTpVe4NdP44vE\"",
|
|
24531
|
-
"mtime": "2026-09-
|
|
25240
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24532
25241
|
"size": 18798,
|
|
24533
25242
|
"path": "../public/_nuxt/Bi6AiCuP.js"
|
|
24534
25243
|
},
|
|
24535
25244
|
"/_nuxt/BJvGPTpC.js": {
|
|
24536
25245
|
"type": "text/javascript; charset=utf-8",
|
|
24537
25246
|
"etag": "\"42-6OgDQPLMWuyWnNFiZTnZejSK/qg\"",
|
|
24538
|
-
"mtime": "2026-09-
|
|
25247
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24539
25248
|
"size": 66,
|
|
24540
25249
|
"path": "../public/_nuxt/BJvGPTpC.js"
|
|
24541
25250
|
},
|
|
24542
25251
|
"/_nuxt/Bq_KKxCg.js": {
|
|
24543
25252
|
"type": "text/javascript; charset=utf-8",
|
|
24544
25253
|
"etag": "\"2426-fOTBJdnlEjXoDd9OqXKVa4u3D68\"",
|
|
24545
|
-
"mtime": "2026-09-
|
|
25254
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24546
25255
|
"size": 9254,
|
|
24547
25256
|
"path": "../public/_nuxt/Bq_KKxCg.js"
|
|
24548
25257
|
},
|
|
24549
25258
|
"/_nuxt/Bsc69G4x.js": {
|
|
24550
25259
|
"type": "text/javascript; charset=utf-8",
|
|
24551
25260
|
"etag": "\"10b9b-CeedCLRo4KPs11whWlwTGF4MhLk\"",
|
|
24552
|
-
"mtime": "2026-09-
|
|
25261
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
24553
25262
|
"size": 68507,
|
|
24554
25263
|
"path": "../public/_nuxt/Bsc69G4x.js"
|
|
24555
25264
|
},
|
|
25265
|
+
"/_nuxt/BSCpFtzG.js": {
|
|
25266
|
+
"type": "text/javascript; charset=utf-8",
|
|
25267
|
+
"etag": "\"13398-3vxX1fQrPyVWKnXsEX5bmCpF/Eg\"",
|
|
25268
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
25269
|
+
"size": 78744,
|
|
25270
|
+
"path": "../public/_nuxt/BSCpFtzG.js"
|
|
25271
|
+
},
|
|
24556
25272
|
"/_nuxt/BSSUlJnx2.js": {
|
|
24557
25273
|
"type": "text/javascript; charset=utf-8",
|
|
24558
25274
|
"etag": "\"5f5-t0OMayeEXY7fEaFUOlppJZZQvtM\"",
|
|
24559
|
-
"mtime": "2026-09-
|
|
25275
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24560
25276
|
"size": 1525,
|
|
24561
25277
|
"path": "../public/_nuxt/BSSUlJnx2.js"
|
|
24562
25278
|
},
|
|
24563
|
-
"/_nuxt/
|
|
25279
|
+
"/_nuxt/BUxYN2mw.js": {
|
|
24564
25280
|
"type": "text/javascript; charset=utf-8",
|
|
24565
|
-
"etag": "\"
|
|
24566
|
-
"mtime": "2026-09-
|
|
24567
|
-
"size":
|
|
24568
|
-
"path": "../public/_nuxt/
|
|
25281
|
+
"etag": "\"1d2b-imErvR08IoUb6Oyd9b7/yZw9bss\"",
|
|
25282
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
25283
|
+
"size": 7467,
|
|
25284
|
+
"path": "../public/_nuxt/BUxYN2mw.js"
|
|
25285
|
+
},
|
|
25286
|
+
"/_nuxt/Bxh5nf8j.js": {
|
|
25287
|
+
"type": "text/javascript; charset=utf-8",
|
|
25288
|
+
"etag": "\"20cd-xBG7XpkdBjW7zZsLXaS7Psed7UI\"",
|
|
25289
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
25290
|
+
"size": 8397,
|
|
25291
|
+
"path": "../public/_nuxt/Bxh5nf8j.js"
|
|
24569
25292
|
},
|
|
24570
25293
|
"/_nuxt/BrIJiJSN.js": {
|
|
24571
25294
|
"type": "text/javascript; charset=utf-8",
|
|
24572
25295
|
"etag": "\"50eba-EQGueVrdlEzHO7oTVt2LPxnHgRo\"",
|
|
24573
|
-
"mtime": "2026-09-
|
|
25296
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24574
25297
|
"size": 331450,
|
|
24575
25298
|
"path": "../public/_nuxt/BrIJiJSN.js"
|
|
24576
25299
|
},
|
|
24577
25300
|
"/_nuxt/BUcmySDa2.js": {
|
|
24578
25301
|
"type": "text/javascript; charset=utf-8",
|
|
24579
25302
|
"etag": "\"1d27c-MrwgQiovFUP0UVtMJ1LdEF/IrEs\"",
|
|
24580
|
-
"mtime": "2026-09-
|
|
25303
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24581
25304
|
"size": 119420,
|
|
24582
25305
|
"path": "../public/_nuxt/BUcmySDa2.js"
|
|
24583
25306
|
},
|
|
24584
|
-
"/_nuxt/
|
|
24585
|
-
"type": "text/javascript; charset=utf-8",
|
|
24586
|
-
"etag": "\"a6ef-i08VwpGBmCrbpxIYs6NCjsMcsLM\"",
|
|
24587
|
-
"mtime": "2026-09-02T10:44:57.799Z",
|
|
24588
|
-
"size": 42735,
|
|
24589
|
-
"path": "../public/_nuxt/ByGNWgAr.js"
|
|
24590
|
-
},
|
|
24591
|
-
"/_nuxt/BUxYN2mw.js": {
|
|
25307
|
+
"/_nuxt/Ce1zyNYu.js": {
|
|
24592
25308
|
"type": "text/javascript; charset=utf-8",
|
|
24593
|
-
"etag": "\"
|
|
24594
|
-
"mtime": "2026-09-
|
|
24595
|
-
"size":
|
|
24596
|
-
"path": "../public/_nuxt/
|
|
25309
|
+
"etag": "\"1aa4-M2wqiS1A05NQaxZt2Lkrl4z5KSs\"",
|
|
25310
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25311
|
+
"size": 6820,
|
|
25312
|
+
"path": "../public/_nuxt/Ce1zyNYu.js"
|
|
24597
25313
|
},
|
|
24598
|
-
"/_nuxt/
|
|
25314
|
+
"/_nuxt/C9f8QMp12.js": {
|
|
24599
25315
|
"type": "text/javascript; charset=utf-8",
|
|
24600
|
-
"etag": "\"
|
|
24601
|
-
"mtime": "2026-09-
|
|
24602
|
-
"size":
|
|
24603
|
-
"path": "../public/_nuxt/
|
|
25316
|
+
"etag": "\"1896-VcRRXhZEm21djPt3FTvlq+iUccI\"",
|
|
25317
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
25318
|
+
"size": 6294,
|
|
25319
|
+
"path": "../public/_nuxt/C9f8QMp12.js"
|
|
24604
25320
|
},
|
|
24605
25321
|
"/_nuxt/BUNGEK2z.js": {
|
|
24606
25322
|
"type": "text/javascript; charset=utf-8",
|
|
24607
25323
|
"etag": "\"25f37-d9sfkQg8cXQp6meacVazS3RTaiQ\"",
|
|
24608
|
-
"mtime": "2026-09-
|
|
25324
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24609
25325
|
"size": 155447,
|
|
24610
25326
|
"path": "../public/_nuxt/BUNGEK2z.js"
|
|
24611
25327
|
},
|
|
24612
|
-
"/_nuxt/
|
|
24613
|
-
"type": "text/javascript; charset=utf-8",
|
|
24614
|
-
"etag": "\"1896-VcRRXhZEm21djPt3FTvlq+iUccI\"",
|
|
24615
|
-
"mtime": "2026-09-02T10:44:57.799Z",
|
|
24616
|
-
"size": 6294,
|
|
24617
|
-
"path": "../public/_nuxt/C9f8QMp12.js"
|
|
24618
|
-
},
|
|
24619
|
-
"/_nuxt/Ce1zyNYu.js": {
|
|
25328
|
+
"/_nuxt/ByGNWgAr.js": {
|
|
24620
25329
|
"type": "text/javascript; charset=utf-8",
|
|
24621
|
-
"etag": "\"
|
|
24622
|
-
"mtime": "2026-09-
|
|
24623
|
-
"size":
|
|
24624
|
-
"path": "../public/_nuxt/
|
|
24625
|
-
},
|
|
24626
|
-
"/_nuxt/channel-templates.lkqEYlWY.css": {
|
|
24627
|
-
"type": "text/css; charset=utf-8",
|
|
24628
|
-
"etag": "\"846-xsPqrbRlt2uxmbSxMrjhPhB1/BQ\"",
|
|
24629
|
-
"mtime": "2026-09-02T10:44:57.819Z",
|
|
24630
|
-
"size": 2118,
|
|
24631
|
-
"path": "../public/_nuxt/channel-templates.lkqEYlWY.css"
|
|
25330
|
+
"etag": "\"a6ef-i08VwpGBmCrbpxIYs6NCjsMcsLM\"",
|
|
25331
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
25332
|
+
"size": 42735,
|
|
25333
|
+
"path": "../public/_nuxt/ByGNWgAr.js"
|
|
24632
25334
|
},
|
|
24633
25335
|
"/_nuxt/CE2ynNi9.js": {
|
|
24634
25336
|
"type": "text/javascript; charset=utf-8",
|
|
24635
25337
|
"etag": "\"acfe-XUIZJHCNqdlCgIFRDZiRNpy4S2w\"",
|
|
24636
|
-
"mtime": "2026-09-
|
|
25338
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24637
25339
|
"size": 44286,
|
|
24638
25340
|
"path": "../public/_nuxt/CE2ynNi9.js"
|
|
24639
25341
|
},
|
|
24640
25342
|
"/_nuxt/ChEKFMxj.js": {
|
|
24641
25343
|
"type": "text/javascript; charset=utf-8",
|
|
24642
25344
|
"etag": "\"18b-iQWgRD/SAefQcUmBu8DMSobJ8mI\"",
|
|
24643
|
-
"mtime": "2026-09-
|
|
25345
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24644
25346
|
"size": 395,
|
|
24645
25347
|
"path": "../public/_nuxt/ChEKFMxj.js"
|
|
24646
25348
|
},
|
|
25349
|
+
"/_nuxt/channel-templates.lkqEYlWY.css": {
|
|
25350
|
+
"type": "text/css; charset=utf-8",
|
|
25351
|
+
"etag": "\"846-xsPqrbRlt2uxmbSxMrjhPhB1/BQ\"",
|
|
25352
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
25353
|
+
"size": 2118,
|
|
25354
|
+
"path": "../public/_nuxt/channel-templates.lkqEYlWY.css"
|
|
25355
|
+
},
|
|
24647
25356
|
"/_nuxt/ClptO7LA.js": {
|
|
24648
25357
|
"type": "text/javascript; charset=utf-8",
|
|
24649
25358
|
"etag": "\"62a-RPTP1S6Y/nNyCZ1fM26AbT4Fe1A\"",
|
|
24650
|
-
"mtime": "2026-09-
|
|
25359
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24651
25360
|
"size": 1578,
|
|
24652
25361
|
"path": "../public/_nuxt/ClptO7LA.js"
|
|
24653
25362
|
},
|
|
24654
25363
|
"/_nuxt/Cno6kYiO2.js": {
|
|
24655
25364
|
"type": "text/javascript; charset=utf-8",
|
|
24656
25365
|
"etag": "\"f2-SIBAvqBfq2ENmoMT2zz03X9uJTg\"",
|
|
24657
|
-
"mtime": "2026-09-
|
|
25366
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24658
25367
|
"size": 242,
|
|
24659
25368
|
"path": "../public/_nuxt/Cno6kYiO2.js"
|
|
24660
25369
|
},
|
|
24661
25370
|
"/_nuxt/CNs_Ozdc2.js": {
|
|
24662
25371
|
"type": "text/javascript; charset=utf-8",
|
|
24663
25372
|
"etag": "\"1b-1MHUJYdBtOvbvPMaiQxDXp3lHyw\"",
|
|
24664
|
-
"mtime": "2026-09-
|
|
25373
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24665
25374
|
"size": 27,
|
|
24666
25375
|
"path": "../public/_nuxt/CNs_Ozdc2.js"
|
|
24667
25376
|
},
|
|
24668
|
-
"/_nuxt/CfIXY-ET.js": {
|
|
24669
|
-
"type": "text/javascript; charset=utf-8",
|
|
24670
|
-
"etag": "\"28a2f-wT9I8KiLCqQ9ynK+e7t0thS24kQ\"",
|
|
24671
|
-
"mtime": "2026-09-02T10:44:57.802Z",
|
|
24672
|
-
"size": 166447,
|
|
24673
|
-
"path": "../public/_nuxt/CfIXY-ET.js"
|
|
24674
|
-
},
|
|
24675
25377
|
"/_nuxt/CrFGZYVB2.js": {
|
|
24676
25378
|
"type": "text/javascript; charset=utf-8",
|
|
24677
25379
|
"etag": "\"1fd9-h9Klnky7cwjw32+pRNI7dtuWAO4\"",
|
|
24678
|
-
"mtime": "2026-09-
|
|
25380
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24679
25381
|
"size": 8153,
|
|
24680
25382
|
"path": "../public/_nuxt/CrFGZYVB2.js"
|
|
24681
25383
|
},
|
|
25384
|
+
"/_nuxt/CfIXY-ET.js": {
|
|
25385
|
+
"type": "text/javascript; charset=utf-8",
|
|
25386
|
+
"etag": "\"28a2f-wT9I8KiLCqQ9ynK+e7t0thS24kQ\"",
|
|
25387
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25388
|
+
"size": 166447,
|
|
25389
|
+
"path": "../public/_nuxt/CfIXY-ET.js"
|
|
25390
|
+
},
|
|
24682
25391
|
"/_nuxt/Bok1DRqh.js": {
|
|
24683
25392
|
"type": "text/javascript; charset=utf-8",
|
|
24684
25393
|
"etag": "\"8cc4a-revOXh+LOg3l7YA6HB855hkF4ZY\"",
|
|
24685
|
-
"mtime": "2026-09-
|
|
25394
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24686
25395
|
"size": 576586,
|
|
24687
25396
|
"path": "../public/_nuxt/Bok1DRqh.js"
|
|
24688
25397
|
},
|
|
24689
25398
|
"/_nuxt/CWDzKGtj.js": {
|
|
24690
25399
|
"type": "text/javascript; charset=utf-8",
|
|
24691
25400
|
"etag": "\"664-zHaq7dnTV6E6Ze5x/fDOmuaYDa4\"",
|
|
24692
|
-
"mtime": "2026-09-
|
|
25401
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24693
25402
|
"size": 1636,
|
|
24694
25403
|
"path": "../public/_nuxt/CWDzKGtj.js"
|
|
24695
25404
|
},
|
|
24696
25405
|
"/_nuxt/BGkumHZ32.js": {
|
|
24697
25406
|
"type": "text/javascript; charset=utf-8",
|
|
24698
25407
|
"etag": "\"14a0a8-FkCiOKvl5+p8em/4UNCrmbDN4qY\"",
|
|
24699
|
-
"mtime": "2026-09-
|
|
25408
|
+
"mtime": "2026-09-02T12:06:00.110Z",
|
|
24700
25409
|
"size": 1351848,
|
|
24701
25410
|
"path": "../public/_nuxt/BGkumHZ32.js"
|
|
24702
25411
|
},
|
|
24703
25412
|
"/_nuxt/CWKEp1wx2.js": {
|
|
24704
25413
|
"type": "text/javascript; charset=utf-8",
|
|
24705
25414
|
"etag": "\"555-ED/tuOi0Qdk4aSGksbI58QY+vQ8\"",
|
|
24706
|
-
"mtime": "2026-09-
|
|
25415
|
+
"mtime": "2026-09-02T12:06:00.116Z",
|
|
24707
25416
|
"size": 1365,
|
|
24708
25417
|
"path": "../public/_nuxt/CWKEp1wx2.js"
|
|
24709
25418
|
},
|
|
24710
25419
|
"/_nuxt/CXLI50Sq.js": {
|
|
24711
25420
|
"type": "text/javascript; charset=utf-8",
|
|
24712
25421
|
"etag": "\"1f3a-hlX9ru6jZckxtwzbcBYyr7wgyrY\"",
|
|
24713
|
-
"mtime": "2026-09-
|
|
25422
|
+
"mtime": "2026-09-02T12:06:00.116Z",
|
|
24714
25423
|
"size": 7994,
|
|
24715
25424
|
"path": "../public/_nuxt/CXLI50Sq.js"
|
|
24716
25425
|
},
|
|
24717
25426
|
"/_nuxt/C_gFA2H_2.js": {
|
|
24718
25427
|
"type": "text/javascript; charset=utf-8",
|
|
24719
25428
|
"etag": "\"89e-FjJprk7cJxDm6dF45I+PCzGIcG8\"",
|
|
24720
|
-
"mtime": "2026-09-
|
|
25429
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24721
25430
|
"size": 2206,
|
|
24722
25431
|
"path": "../public/_nuxt/C_gFA2H_2.js"
|
|
24723
25432
|
},
|
|
25433
|
+
"/_nuxt/D-Ne4C9a.js": {
|
|
25434
|
+
"type": "text/javascript; charset=utf-8",
|
|
25435
|
+
"etag": "\"1195-OssDeoy4mh8A5/QMpQbuGQHyIKQ\"",
|
|
25436
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25437
|
+
"size": 4501,
|
|
25438
|
+
"path": "../public/_nuxt/D-Ne4C9a.js"
|
|
25439
|
+
},
|
|
24724
25440
|
"/_nuxt/D5KJ7_0V.js": {
|
|
24725
25441
|
"type": "text/javascript; charset=utf-8",
|
|
24726
25442
|
"etag": "\"56ab-vqOxu4dfOFWqC1pao4/du5wXWFk\"",
|
|
24727
|
-
"mtime": "2026-09-
|
|
25443
|
+
"mtime": "2026-09-02T12:06:00.118Z",
|
|
24728
25444
|
"size": 22187,
|
|
24729
25445
|
"path": "../public/_nuxt/D5KJ7_0V.js"
|
|
24730
25446
|
},
|
|
24731
|
-
"/_nuxt/
|
|
25447
|
+
"/_nuxt/D8DDDzV62.js": {
|
|
24732
25448
|
"type": "text/javascript; charset=utf-8",
|
|
24733
|
-
"etag": "\"
|
|
24734
|
-
"mtime": "2026-09-
|
|
24735
|
-
"size":
|
|
24736
|
-
"path": "../public/_nuxt/
|
|
25449
|
+
"etag": "\"20cf-8a3dXj+yAc7cMA4Jnv64rxS2ouU\"",
|
|
25450
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
25451
|
+
"size": 8399,
|
|
25452
|
+
"path": "../public/_nuxt/D8DDDzV62.js"
|
|
24737
25453
|
},
|
|
24738
25454
|
"/_nuxt/D0C5Q0di.js": {
|
|
24739
25455
|
"type": "text/javascript; charset=utf-8",
|
|
24740
25456
|
"etag": "\"e47f-Fzcm4dFhj/kmVCb6h/Aye9ehAG4\"",
|
|
24741
|
-
"mtime": "2026-09-
|
|
25457
|
+
"mtime": "2026-09-02T12:06:00.118Z",
|
|
24742
25458
|
"size": 58495,
|
|
24743
25459
|
"path": "../public/_nuxt/D0C5Q0di.js"
|
|
24744
25460
|
},
|
|
24745
25461
|
"/_nuxt/D95h62Jn.js": {
|
|
24746
25462
|
"type": "text/javascript; charset=utf-8",
|
|
24747
25463
|
"etag": "\"3f5-sTPqCSaAt8a9YlLXlhRfFlOtmcQ\"",
|
|
24748
|
-
"mtime": "2026-09-
|
|
25464
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24749
25465
|
"size": 1013,
|
|
24750
25466
|
"path": "../public/_nuxt/D95h62Jn.js"
|
|
24751
25467
|
},
|
|
24752
|
-
"/_nuxt/
|
|
24753
|
-
"type": "text/
|
|
24754
|
-
"etag": "\"
|
|
24755
|
-
"mtime": "2026-09-
|
|
24756
|
-
"size":
|
|
24757
|
-
"path": "../public/_nuxt/
|
|
25468
|
+
"/_nuxt/dcw.C46dGiF_.css": {
|
|
25469
|
+
"type": "text/css; charset=utf-8",
|
|
25470
|
+
"etag": "\"2608-5iynscon3f2ARegtDxl5rYx3iYM\"",
|
|
25471
|
+
"mtime": "2026-09-02T12:06:00.129Z",
|
|
25472
|
+
"size": 9736,
|
|
25473
|
+
"path": "../public/_nuxt/dcw.C46dGiF_.css"
|
|
24758
25474
|
},
|
|
24759
25475
|
"/_nuxt/daq.m1dxZaD-.css": {
|
|
24760
25476
|
"type": "text/css; charset=utf-8",
|
|
24761
25477
|
"etag": "\"560c-zT5Vz8T4pSzxP9Cp70s8xhLLtvk\"",
|
|
24762
|
-
"mtime": "2026-09-
|
|
25478
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
24763
25479
|
"size": 22028,
|
|
24764
25480
|
"path": "../public/_nuxt/daq.m1dxZaD-.css"
|
|
24765
25481
|
},
|
|
24766
|
-
"/_nuxt/dcw.C46dGiF_.css": {
|
|
24767
|
-
"type": "text/css; charset=utf-8",
|
|
24768
|
-
"etag": "\"2608-5iynscon3f2ARegtDxl5rYx3iYM\"",
|
|
24769
|
-
"mtime": "2026-09-02T10:44:57.820Z",
|
|
24770
|
-
"size": 9736,
|
|
24771
|
-
"path": "../public/_nuxt/dcw.C46dGiF_.css"
|
|
24772
|
-
},
|
|
24773
25482
|
"/_nuxt/DdPeifHR.js": {
|
|
24774
25483
|
"type": "text/javascript; charset=utf-8",
|
|
24775
25484
|
"etag": "\"7ec3-Ul9ut8rzcNu1BCT2CL704Bev/mM\"",
|
|
24776
|
-
"mtime": "2026-09-
|
|
25485
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
24777
25486
|
"size": 32451,
|
|
24778
25487
|
"path": "../public/_nuxt/DdPeifHR.js"
|
|
24779
25488
|
},
|
|
24780
25489
|
"/_nuxt/default.iGJy9dP-.css": {
|
|
24781
25490
|
"type": "text/css; charset=utf-8",
|
|
24782
25491
|
"etag": "\"2922-+exPltwm+fwclE+cBqnrulaFObQ\"",
|
|
24783
|
-
"mtime": "2026-09-
|
|
25492
|
+
"mtime": "2026-09-02T12:06:00.129Z",
|
|
24784
25493
|
"size": 10530,
|
|
24785
25494
|
"path": "../public/_nuxt/default.iGJy9dP-.css"
|
|
24786
25495
|
},
|
|
24787
25496
|
"/_nuxt/DEHNjlTq2.js": {
|
|
24788
25497
|
"type": "text/javascript; charset=utf-8",
|
|
24789
25498
|
"etag": "\"14fe-IJ6pssvuWomkWeOPhpylkD+TDmA\"",
|
|
24790
|
-
"mtime": "2026-09-
|
|
25499
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24791
25500
|
"size": 5374,
|
|
24792
25501
|
"path": "../public/_nuxt/DEHNjlTq2.js"
|
|
24793
25502
|
},
|
|
24794
|
-
"/_nuxt/DIOBYJe3.js": {
|
|
24795
|
-
"type": "text/javascript; charset=utf-8",
|
|
24796
|
-
"etag": "\"4b5-DdWaiyBS+/JejqhLG4Q7/JprP2Q\"",
|
|
24797
|
-
"mtime": "2026-09-02T10:44:57.806Z",
|
|
24798
|
-
"size": 1205,
|
|
24799
|
-
"path": "../public/_nuxt/DIOBYJe3.js"
|
|
24800
|
-
},
|
|
24801
25503
|
"/_nuxt/DEkQ0qQ02.js": {
|
|
24802
25504
|
"type": "text/javascript; charset=utf-8",
|
|
24803
25505
|
"etag": "\"4cfc-ucIBbCQ6UaqBmotD7yRBtwEHEyU\"",
|
|
24804
|
-
"mtime": "2026-09-
|
|
25506
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24805
25507
|
"size": 19708,
|
|
24806
25508
|
"path": "../public/_nuxt/DEkQ0qQ02.js"
|
|
24807
25509
|
},
|
|
25510
|
+
"/_nuxt/DIOBYJe3.js": {
|
|
25511
|
+
"type": "text/javascript; charset=utf-8",
|
|
25512
|
+
"etag": "\"4b5-DdWaiyBS+/JejqhLG4Q7/JprP2Q\"",
|
|
25513
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
25514
|
+
"size": 1205,
|
|
25515
|
+
"path": "../public/_nuxt/DIOBYJe3.js"
|
|
25516
|
+
},
|
|
24808
25517
|
"/_nuxt/DNJSkm3Q.js": {
|
|
24809
25518
|
"type": "text/javascript; charset=utf-8",
|
|
24810
25519
|
"etag": "\"216b-y0s8z84O8dmpAUYWCz4LSRx0vJQ\"",
|
|
24811
|
-
"mtime": "2026-09-
|
|
25520
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
24812
25521
|
"size": 8555,
|
|
24813
25522
|
"path": "../public/_nuxt/DNJSkm3Q.js"
|
|
24814
25523
|
},
|
|
24815
25524
|
"/_nuxt/Dm5mD6XT.js": {
|
|
24816
25525
|
"type": "text/javascript; charset=utf-8",
|
|
24817
25526
|
"etag": "\"23e0-HSV6+x+89Cdaxrhttr88m0kwQk4\"",
|
|
24818
|
-
"mtime": "2026-09-
|
|
25527
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
24819
25528
|
"size": 9184,
|
|
24820
25529
|
"path": "../public/_nuxt/Dm5mD6XT.js"
|
|
24821
25530
|
},
|
|
24822
25531
|
"/_nuxt/dObsRdSQ.js": {
|
|
24823
25532
|
"type": "text/javascript; charset=utf-8",
|
|
24824
25533
|
"etag": "\"3d5-6E8m1HnkzKD1X9Hx3/ZbS1uH0vc\"",
|
|
24825
|
-
"mtime": "2026-09-
|
|
25534
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
24826
25535
|
"size": 981,
|
|
24827
25536
|
"path": "../public/_nuxt/dObsRdSQ.js"
|
|
24828
25537
|
},
|
|
24829
|
-
"/_nuxt/DP6bdyIp.js": {
|
|
24830
|
-
"type": "text/javascript; charset=utf-8",
|
|
24831
|
-
"etag": "\"119c-ZH6sW8Yv0KAJf0LIwFiNMRP2kk8\"",
|
|
24832
|
-
"mtime": "2026-09-02T10:44:57.807Z",
|
|
24833
|
-
"size": 4508,
|
|
24834
|
-
"path": "../public/_nuxt/DP6bdyIp.js"
|
|
24835
|
-
},
|
|
24836
25538
|
"/_nuxt/DPDqAD1e.js": {
|
|
24837
25539
|
"type": "text/javascript; charset=utf-8",
|
|
24838
25540
|
"etag": "\"4842-1Qirb7tmwMUEq9mSoIl88rnZ6Rk\"",
|
|
24839
|
-
"mtime": "2026-09-
|
|
25541
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
24840
25542
|
"size": 18498,
|
|
24841
25543
|
"path": "../public/_nuxt/DPDqAD1e.js"
|
|
24842
25544
|
},
|
|
25545
|
+
"/_nuxt/DP6bdyIp.js": {
|
|
25546
|
+
"type": "text/javascript; charset=utf-8",
|
|
25547
|
+
"etag": "\"119c-ZH6sW8Yv0KAJf0LIwFiNMRP2kk8\"",
|
|
25548
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
25549
|
+
"size": 4508,
|
|
25550
|
+
"path": "../public/_nuxt/DP6bdyIp.js"
|
|
25551
|
+
},
|
|
24843
25552
|
"/_nuxt/DRlJ2-4p.js": {
|
|
24844
25553
|
"type": "text/javascript; charset=utf-8",
|
|
24845
25554
|
"etag": "\"628-hDE8DxhnpZ6MBeG/gHpyPnK5SpM\"",
|
|
24846
|
-
"mtime": "2026-09-
|
|
25555
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24847
25556
|
"size": 1576,
|
|
24848
25557
|
"path": "../public/_nuxt/DRlJ2-4p.js"
|
|
24849
25558
|
},
|
|
24850
25559
|
"/_nuxt/dRAyjbJ6.js": {
|
|
24851
25560
|
"type": "text/javascript; charset=utf-8",
|
|
24852
25561
|
"etag": "\"39890-+z0z97gM6sb8TE1hu131lbilXHI\"",
|
|
24853
|
-
"mtime": "2026-09-
|
|
25562
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24854
25563
|
"size": 235664,
|
|
24855
25564
|
"path": "../public/_nuxt/dRAyjbJ6.js"
|
|
24856
25565
|
},
|
|
24857
25566
|
"/_nuxt/DRq09ZmT.js": {
|
|
24858
25567
|
"type": "text/javascript; charset=utf-8",
|
|
24859
25568
|
"etag": "\"29d-1stN5BQaapAs+Peb3DQslLQQr+0\"",
|
|
24860
|
-
"mtime": "2026-09-
|
|
25569
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24861
25570
|
"size": 669,
|
|
24862
25571
|
"path": "../public/_nuxt/DRq09ZmT.js"
|
|
24863
25572
|
},
|
|
24864
25573
|
"/_nuxt/DSBfvCi5.js": {
|
|
24865
25574
|
"type": "text/javascript; charset=utf-8",
|
|
24866
25575
|
"etag": "\"103b0-dVLvfb3xqwBE5sNRDvR7g27gNt8\"",
|
|
24867
|
-
"mtime": "2026-09-
|
|
25576
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24868
25577
|
"size": 66480,
|
|
24869
25578
|
"path": "../public/_nuxt/DSBfvCi5.js"
|
|
24870
25579
|
},
|
|
24871
25580
|
"/_nuxt/dt2tKE95.js": {
|
|
24872
25581
|
"type": "text/javascript; charset=utf-8",
|
|
24873
25582
|
"etag": "\"4cc1-PBJBqFz6X1T5i/2dfz7MZ6G+XKY\"",
|
|
24874
|
-
"mtime": "2026-09-
|
|
25583
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
24875
25584
|
"size": 19649,
|
|
24876
25585
|
"path": "../public/_nuxt/dt2tKE95.js"
|
|
24877
25586
|
},
|
|
24878
25587
|
"/_nuxt/DVNYfGsj.js": {
|
|
24879
25588
|
"type": "text/javascript; charset=utf-8",
|
|
24880
25589
|
"etag": "\"38f6-6B6Wxe3QzLxU6lfCKri39neupqQ\"",
|
|
24881
|
-
"mtime": "2026-09-
|
|
25590
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24882
25591
|
"size": 14582,
|
|
24883
25592
|
"path": "../public/_nuxt/DVNYfGsj.js"
|
|
24884
25593
|
},
|
|
24885
|
-
"/_nuxt/DVQAz9WI.js": {
|
|
24886
|
-
"type": "text/javascript; charset=utf-8",
|
|
24887
|
-
"etag": "\"130c-rUMRdwb4oHiuX7IOXv/sclpvuds\"",
|
|
24888
|
-
"mtime": "2026-09-02T10:44:57.810Z",
|
|
24889
|
-
"size": 4876,
|
|
24890
|
-
"path": "../public/_nuxt/DVQAz9WI.js"
|
|
24891
|
-
},
|
|
24892
25594
|
"/_nuxt/DXK1U43I.js": {
|
|
24893
25595
|
"type": "text/javascript; charset=utf-8",
|
|
24894
25596
|
"etag": "\"4e6e-0ajU7w+quumividScJQJc/QFBDw\"",
|
|
24895
|
-
"mtime": "2026-09-
|
|
25597
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
24896
25598
|
"size": 20078,
|
|
24897
25599
|
"path": "../public/_nuxt/DXK1U43I.js"
|
|
24898
25600
|
},
|
|
25601
|
+
"/_nuxt/DVQAz9WI.js": {
|
|
25602
|
+
"type": "text/javascript; charset=utf-8",
|
|
25603
|
+
"etag": "\"130c-rUMRdwb4oHiuX7IOXv/sclpvuds\"",
|
|
25604
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
25605
|
+
"size": 4876,
|
|
25606
|
+
"path": "../public/_nuxt/DVQAz9WI.js"
|
|
25607
|
+
},
|
|
24899
25608
|
"/_nuxt/DYWgGHNo.js": {
|
|
24900
25609
|
"type": "text/javascript; charset=utf-8",
|
|
24901
25610
|
"etag": "\"587c-klAZIaxStgu8xNRhCveCQsbbAa8\"",
|
|
24902
|
-
"mtime": "2026-09-
|
|
25611
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
24903
25612
|
"size": 22652,
|
|
24904
25613
|
"path": "../public/_nuxt/DYWgGHNo.js"
|
|
24905
25614
|
},
|
|
24906
|
-
"/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff": {
|
|
24907
|
-
"type": "font/woff",
|
|
24908
|
-
"etag": "\"3f04-1MKyFKXvChwQTK9MnbAM3SwAP/w\"",
|
|
24909
|
-
"mtime": "2026-09-02T10:44:57.821Z",
|
|
24910
|
-
"size": 16132,
|
|
24911
|
-
"path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff"
|
|
24912
|
-
},
|
|
24913
25615
|
"/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2": {
|
|
24914
25616
|
"type": "font/woff2",
|
|
24915
25617
|
"etag": "\"3504-t17DeaJZ5CiTr/7PdWXcRgN9/Yc\"",
|
|
24916
|
-
"mtime": "2026-09-
|
|
25618
|
+
"mtime": "2026-09-02T12:06:00.129Z",
|
|
24917
25619
|
"size": 13572,
|
|
24918
25620
|
"path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2"
|
|
24919
25621
|
},
|
|
25622
|
+
"/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff": {
|
|
25623
|
+
"type": "font/woff",
|
|
25624
|
+
"etag": "\"3f04-1MKyFKXvChwQTK9MnbAM3SwAP/w\"",
|
|
25625
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
25626
|
+
"size": 16132,
|
|
25627
|
+
"path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BZInx2ys.woff"
|
|
25628
|
+
},
|
|
24920
25629
|
"/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff": {
|
|
24921
25630
|
"type": "font/woff",
|
|
24922
25631
|
"etag": "\"3c88-Q5XoFKe1rGp1UkdvSR6MtPcFfgQ\"",
|
|
24923
|
-
"mtime": "2026-09-
|
|
25632
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
24924
25633
|
"size": 15496,
|
|
24925
25634
|
"path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff"
|
|
24926
25635
|
},
|
|
24927
25636
|
"/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2": {
|
|
24928
25637
|
"type": "font/woff2",
|
|
24929
25638
|
"etag": "\"33d4-lVrdxXudnaWAAL0JfU6b+yZGpK0\"",
|
|
24930
|
-
"mtime": "2026-09-
|
|
25639
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
24931
25640
|
"size": 13268,
|
|
24932
25641
|
"path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2"
|
|
24933
25642
|
},
|
|
24934
25643
|
"/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2": {
|
|
24935
25644
|
"type": "font/woff2",
|
|
24936
25645
|
"etag": "\"4620-AEmSjSDDFDLAiok0BdjqqFs2mx4\"",
|
|
24937
|
-
"mtime": "2026-09-
|
|
25646
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
24938
25647
|
"size": 17952,
|
|
24939
25648
|
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2"
|
|
24940
25649
|
},
|
|
25650
|
+
"/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff": {
|
|
25651
|
+
"type": "font/woff",
|
|
25652
|
+
"etag": "\"5698-6bgErOYTElI0Z3Untp+h0Xi0FGs\"",
|
|
25653
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
25654
|
+
"size": 22168,
|
|
25655
|
+
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff"
|
|
25656
|
+
},
|
|
24941
25657
|
"/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff": {
|
|
24942
25658
|
"type": "font/woff",
|
|
24943
25659
|
"etag": "\"4fcc-Wt58DNvJEH8PhhsEwR/fAuZLZf0\"",
|
|
24944
|
-
"mtime": "2026-09-
|
|
25660
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24945
25661
|
"size": 20428,
|
|
24946
25662
|
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff"
|
|
24947
25663
|
},
|
|
24948
|
-
"/_nuxt/eb-garamond-
|
|
25664
|
+
"/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
|
|
24949
25665
|
"type": "font/woff",
|
|
24950
|
-
"etag": "\"
|
|
24951
|
-
"mtime": "2026-09-
|
|
24952
|
-
"size":
|
|
24953
|
-
"path": "../public/_nuxt/eb-garamond-
|
|
25666
|
+
"etag": "\"307c-Fmorq8T0Tyl1FByuAGfnIMJMsU0\"",
|
|
25667
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
25668
|
+
"size": 12412,
|
|
25669
|
+
"path": "../public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff"
|
|
24954
25670
|
},
|
|
24955
25671
|
"/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2": {
|
|
24956
25672
|
"type": "font/woff2",
|
|
24957
25673
|
"etag": "\"419c-BgVrkDzxBAskhVuAe8ZPKrVJ2vk\"",
|
|
24958
|
-
"mtime": "2026-09-
|
|
25674
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24959
25675
|
"size": 16796,
|
|
24960
25676
|
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2"
|
|
24961
25677
|
},
|
|
24962
|
-
"/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
|
|
24963
|
-
"type": "font/woff",
|
|
24964
|
-
"etag": "\"307c-Fmorq8T0Tyl1FByuAGfnIMJMsU0\"",
|
|
24965
|
-
"mtime": "2026-09-02T10:44:57.824Z",
|
|
24966
|
-
"size": 12412,
|
|
24967
|
-
"path": "../public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff"
|
|
24968
|
-
},
|
|
24969
25678
|
"/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2": {
|
|
24970
25679
|
"type": "font/woff2",
|
|
24971
25680
|
"etag": "\"2a00-ZNzj8SIiN3t2N23u++WhC6jE8gk\"",
|
|
24972
|
-
"mtime": "2026-09-
|
|
25681
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24973
25682
|
"size": 10752,
|
|
24974
25683
|
"path": "../public/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2"
|
|
24975
25684
|
},
|
|
24976
25685
|
"/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2": {
|
|
24977
25686
|
"type": "font/woff2",
|
|
24978
25687
|
"etag": "\"2904-BXAeLh8O+jrT8ujKrV7WtU2zP1c\"",
|
|
24979
|
-
"mtime": "2026-09-
|
|
25688
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24980
25689
|
"size": 10500,
|
|
24981
25690
|
"path": "../public/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2"
|
|
24982
25691
|
},
|
|
24983
|
-
"/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff": {
|
|
24984
|
-
"type": "font/woff",
|
|
24985
|
-
"etag": "\"2304-q8ppn7qePqLys53UrEKMrGT8e6E\"",
|
|
24986
|
-
"mtime": "2026-09-02T10:44:57.826Z",
|
|
24987
|
-
"size": 8964,
|
|
24988
|
-
"path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff"
|
|
24989
|
-
},
|
|
24990
25692
|
"/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff": {
|
|
24991
25693
|
"type": "font/woff",
|
|
24992
25694
|
"etag": "\"3108-ggShwQ6kE+MAR7EEQafdmWunxHg\"",
|
|
24993
|
-
"mtime": "2026-09-
|
|
25695
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
24994
25696
|
"size": 12552,
|
|
24995
25697
|
"path": "../public/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff"
|
|
24996
25698
|
},
|
|
24997
25699
|
"/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2": {
|
|
24998
25700
|
"type": "font/woff2",
|
|
24999
25701
|
"etag": "\"19d0-ppOK6AfNTXYuDEeeEMQQhOypGW8\"",
|
|
25000
|
-
"mtime": "2026-09-
|
|
25702
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
25001
25703
|
"size": 6608,
|
|
25002
25704
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2"
|
|
25003
25705
|
},
|
|
25004
25706
|
"/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff": {
|
|
25005
25707
|
"type": "font/woff",
|
|
25006
25708
|
"etag": "\"20b0-FNV/ZgjupejIrGOsz4+8EYVUXHo\"",
|
|
25007
|
-
"mtime": "2026-09-
|
|
25709
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
25008
25710
|
"size": 8368,
|
|
25009
25711
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff"
|
|
25010
25712
|
},
|
|
25011
25713
|
"/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2": {
|
|
25012
25714
|
"type": "font/woff2",
|
|
25013
25715
|
"etag": "\"1940-Y3hsqG2RXMGI9hHTiI+Nv2Q4msM\"",
|
|
25014
|
-
"mtime": "2026-09-
|
|
25716
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
25015
25717
|
"size": 6464,
|
|
25016
25718
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2"
|
|
25017
25719
|
},
|
|
25720
|
+
"/_nuxt/eb-garamond-latin-400-italic.DSEbMgZu.woff2": {
|
|
25721
|
+
"type": "font/woff2",
|
|
25722
|
+
"etag": "\"632c-iB8RNlBCm9D0APLcMJ/hIPATx+0\"",
|
|
25723
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
25724
|
+
"size": 25388,
|
|
25725
|
+
"path": "../public/_nuxt/eb-garamond-latin-400-italic.DSEbMgZu.woff2"
|
|
25726
|
+
},
|
|
25018
25727
|
"/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff": {
|
|
25019
25728
|
"type": "font/woff",
|
|
25020
25729
|
"etag": "\"7890-VX8YYh09367bg28IWSUybEXrsDQ\"",
|
|
25021
|
-
"mtime": "2026-09-
|
|
25730
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
25022
25731
|
"size": 30864,
|
|
25023
25732
|
"path": "../public/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff"
|
|
25024
25733
|
},
|
|
25025
|
-
"/_nuxt/eb-garamond-
|
|
25026
|
-
"type": "font/
|
|
25027
|
-
"etag": "\"
|
|
25028
|
-
"mtime": "2026-09-
|
|
25029
|
-
"size":
|
|
25030
|
-
"path": "../public/_nuxt/eb-garamond-
|
|
25734
|
+
"/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff": {
|
|
25735
|
+
"type": "font/woff",
|
|
25736
|
+
"etag": "\"2304-q8ppn7qePqLys53UrEKMrGT8e6E\"",
|
|
25737
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
25738
|
+
"size": 8964,
|
|
25739
|
+
"path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff"
|
|
25031
25740
|
},
|
|
25032
25741
|
"/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2": {
|
|
25033
25742
|
"type": "font/woff2",
|
|
25034
25743
|
"etag": "\"5d0c-w7FmIa34l5RBoJYmvp9lwadEvW4\"",
|
|
25035
|
-
"mtime": "2026-09-
|
|
25744
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
25036
25745
|
"size": 23820,
|
|
25037
25746
|
"path": "../public/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2"
|
|
25038
25747
|
},
|
|
25039
25748
|
"/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff": {
|
|
25040
25749
|
"type": "font/woff",
|
|
25041
25750
|
"etag": "\"6fc0-tKFcVMt7ocp7dmWyG6/kxtP5mKY\"",
|
|
25042
|
-
"mtime": "2026-09-
|
|
25751
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25043
25752
|
"size": 28608,
|
|
25044
25753
|
"path": "../public/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff"
|
|
25045
25754
|
},
|
|
25046
25755
|
"/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff": {
|
|
25047
25756
|
"type": "font/woff",
|
|
25048
25757
|
"etag": "\"f5b8-o98RIl4uKzIPJHZZpEI+mI17K3c\"",
|
|
25049
|
-
"mtime": "2026-09-
|
|
25758
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25050
25759
|
"size": 62904,
|
|
25051
25760
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff"
|
|
25052
25761
|
},
|
|
25053
25762
|
"/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2": {
|
|
25054
25763
|
"type": "font/woff2",
|
|
25055
25764
|
"etag": "\"b19c-7qms9anmdJJsBixQTHSocgV31Qk\"",
|
|
25056
|
-
"mtime": "2026-09-
|
|
25765
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25057
25766
|
"size": 45468,
|
|
25058
25767
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2"
|
|
25059
25768
|
},
|
|
25060
25769
|
"/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff": {
|
|
25061
25770
|
"type": "font/woff",
|
|
25062
25771
|
"etag": "\"12b44-jg/K3aZca4XOngCAf1Jh47/0cj8\"",
|
|
25063
|
-
"mtime": "2026-09-
|
|
25772
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25064
25773
|
"size": 76612,
|
|
25065
25774
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff"
|
|
25066
25775
|
},
|
|
25067
25776
|
"/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2": {
|
|
25068
25777
|
"type": "font/woff2",
|
|
25069
25778
|
"etag": "\"de84-qKZ/sgxlZLRv1TmEnWR30Cc4wfw\"",
|
|
25070
|
-
"mtime": "2026-09-
|
|
25779
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25071
25780
|
"size": 56964,
|
|
25072
25781
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2"
|
|
25073
25782
|
},
|
|
25074
|
-
"/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2": {
|
|
25075
|
-
"type": "font/woff2",
|
|
25076
|
-
"etag": "\"187c-Wj36AOh9OjwDZT5W3eeao1D/NT4\"",
|
|
25077
|
-
"mtime": "2026-09-02T10:44:57.831Z",
|
|
25078
|
-
"size": 6268,
|
|
25079
|
-
"path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2"
|
|
25080
|
-
},
|
|
25081
25783
|
"/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff": {
|
|
25082
25784
|
"type": "font/woff",
|
|
25083
25785
|
"etag": "\"1edc-XUugZ4qMSSF4m+TQLER2LLza1t0\"",
|
|
25084
|
-
"mtime": "2026-09-
|
|
25786
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25085
25787
|
"size": 7900,
|
|
25086
25788
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff"
|
|
25087
25789
|
},
|
|
25790
|
+
"/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2": {
|
|
25791
|
+
"type": "font/woff2",
|
|
25792
|
+
"etag": "\"187c-Wj36AOh9OjwDZT5W3eeao1D/NT4\"",
|
|
25793
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25794
|
+
"size": 6268,
|
|
25795
|
+
"path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2"
|
|
25796
|
+
},
|
|
25088
25797
|
"/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2": {
|
|
25089
25798
|
"type": "font/woff2",
|
|
25090
25799
|
"etag": "\"183c-arAHcc3MmJQ6+OtYVThlERUqDQQ\"",
|
|
25091
|
-
"mtime": "2026-09-
|
|
25800
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25092
25801
|
"size": 6204,
|
|
25093
25802
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2"
|
|
25094
25803
|
},
|
|
25095
25804
|
"/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff": {
|
|
25096
25805
|
"type": "font/woff",
|
|
25097
25806
|
"etag": "\"1e50-PGVIQbsmhTvI1h5aIhavpIQl8z4\"",
|
|
25098
|
-
"mtime": "2026-09-
|
|
25807
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25099
25808
|
"size": 7760,
|
|
25100
25809
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff"
|
|
25101
25810
|
},
|
|
25102
25811
|
"/_nuxt/eHGLpQSg2.js": {
|
|
25103
25812
|
"type": "text/javascript; charset=utf-8",
|
|
25104
25813
|
"etag": "\"53-ZhaD2u1M9e+y/KP/l2gUqGdFFkk\"",
|
|
25105
|
-
"mtime": "2026-09-
|
|
25814
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
25106
25815
|
"size": 83,
|
|
25107
25816
|
"path": "../public/_nuxt/eHGLpQSg2.js"
|
|
25108
25817
|
},
|
|
25109
|
-
"/_nuxt/
|
|
25110
|
-
"type": "
|
|
25111
|
-
"etag": "\"
|
|
25112
|
-
"mtime": "2026-09-
|
|
25113
|
-
"size":
|
|
25114
|
-
"path": "../public/_nuxt/
|
|
25115
|
-
},
|
|
25116
|
-
"/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2": {
|
|
25117
|
-
"type": "font/woff2",
|
|
25118
|
-
"etag": "\"4080-mZu3Z7sOWqglha+kefNbUA9Pp+Q\"",
|
|
25119
|
-
"mtime": "2026-09-02T10:44:57.834Z",
|
|
25120
|
-
"size": 16512,
|
|
25121
|
-
"path": "../public/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2"
|
|
25818
|
+
"/_nuxt/entry.DjhxLu-f.css": {
|
|
25819
|
+
"type": "text/css; charset=utf-8",
|
|
25820
|
+
"etag": "\"1bca7-dJlPlclu3mtzpf30VOFtuTMDCds\"",
|
|
25821
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25822
|
+
"size": 113831,
|
|
25823
|
+
"path": "../public/_nuxt/entry.DjhxLu-f.css"
|
|
25122
25824
|
},
|
|
25123
25825
|
"/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2": {
|
|
25124
25826
|
"type": "font/woff2",
|
|
25125
25827
|
"etag": "\"3aec-5kpQSZEtAzzU5kdiuro3Zr2YR54\"",
|
|
25126
|
-
"mtime": "2026-09-
|
|
25828
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25127
25829
|
"size": 15084,
|
|
25128
25830
|
"path": "../public/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2"
|
|
25129
25831
|
},
|
|
25130
|
-
"/_nuxt/
|
|
25131
|
-
"type": "
|
|
25132
|
-
"etag": "\"
|
|
25133
|
-
"mtime": "2026-09-
|
|
25134
|
-
"size":
|
|
25135
|
-
"path": "../public/_nuxt/
|
|
25832
|
+
"/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2": {
|
|
25833
|
+
"type": "font/woff2",
|
|
25834
|
+
"etag": "\"1cfc-yYSDXNlt/tTRaj6rJo8ZMqvY7pQ\"",
|
|
25835
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25836
|
+
"size": 7420,
|
|
25837
|
+
"path": "../public/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2"
|
|
25838
|
+
},
|
|
25839
|
+
"/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2": {
|
|
25840
|
+
"type": "font/woff2",
|
|
25841
|
+
"etag": "\"4080-mZu3Z7sOWqglha+kefNbUA9Pp+Q\"",
|
|
25842
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25843
|
+
"size": 16512,
|
|
25844
|
+
"path": "../public/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2"
|
|
25136
25845
|
},
|
|
25137
25846
|
"/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2": {
|
|
25138
25847
|
"type": "font/woff2",
|
|
25139
25848
|
"etag": "\"72d8-9J+D7/6th5UzRxIgoFX9awJv47A\"",
|
|
25140
|
-
"mtime": "2026-09-
|
|
25849
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25141
25850
|
"size": 29400,
|
|
25142
25851
|
"path": "../public/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2"
|
|
25143
25852
|
},
|
|
25144
|
-
"/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2": {
|
|
25145
|
-
"type": "font/woff2",
|
|
25146
|
-
"etag": "\"1820-nQACIwCsmkduQK2CSMidMhmLR9U\"",
|
|
25147
|
-
"mtime": "2026-09-02T10:44:57.834Z",
|
|
25148
|
-
"size": 6176,
|
|
25149
|
-
"path": "../public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2"
|
|
25150
|
-
},
|
|
25151
25853
|
"/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2": {
|
|
25152
25854
|
"type": "font/woff2",
|
|
25153
25855
|
"etag": "\"328c-3kQUs7xjzfvJdLvI58iU6DHlynA\"",
|
|
25154
|
-
"mtime": "2026-09-
|
|
25856
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25155
25857
|
"size": 12940,
|
|
25156
25858
|
"path": "../public/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2"
|
|
25157
25859
|
},
|
|
25860
|
+
"/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2": {
|
|
25861
|
+
"type": "font/woff2",
|
|
25862
|
+
"etag": "\"1820-nQACIwCsmkduQK2CSMidMhmLR9U\"",
|
|
25863
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25864
|
+
"size": 6176,
|
|
25865
|
+
"path": "../public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2"
|
|
25866
|
+
},
|
|
25158
25867
|
"/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2": {
|
|
25159
25868
|
"type": "font/woff2",
|
|
25160
25869
|
"etag": "\"3968-BV9ZbqWHVAcipAKX5y8la3JkUQs\"",
|
|
25161
|
-
"mtime": "2026-09-
|
|
25870
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25162
25871
|
"size": 14696,
|
|
25163
25872
|
"path": "../public/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2"
|
|
25164
25873
|
},
|
|
25165
25874
|
"/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2": {
|
|
25166
25875
|
"type": "font/woff2",
|
|
25167
25876
|
"etag": "\"5a58-jDy+14PX7OhwqFZsiKzuRax9xZ8\"",
|
|
25168
|
-
"mtime": "2026-09-
|
|
25877
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25169
25878
|
"size": 23128,
|
|
25170
25879
|
"path": "../public/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2"
|
|
25171
25880
|
},
|
|
25172
|
-
"/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2": {
|
|
25173
|
-
"type": "font/woff2",
|
|
25174
|
-
"etag": "\"16b4-aZoLOGWoEYW7gmwZamfz5kTfFco\"",
|
|
25175
|
-
"mtime": "2026-09-02T10:44:57.836Z",
|
|
25176
|
-
"size": 5812,
|
|
25177
|
-
"path": "../public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2"
|
|
25178
|
-
},
|
|
25179
25881
|
"/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2": {
|
|
25180
25882
|
"type": "font/woff2",
|
|
25181
25883
|
"etag": "\"1e10-mpU2OlFk4DakDO4paRfgJ2LHDsM\"",
|
|
25182
|
-
"mtime": "2026-09-
|
|
25884
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25183
25885
|
"size": 7696,
|
|
25184
25886
|
"path": "../public/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2"
|
|
25185
25887
|
},
|
|
25888
|
+
"/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2": {
|
|
25889
|
+
"type": "font/woff2",
|
|
25890
|
+
"etag": "\"16b4-aZoLOGWoEYW7gmwZamfz5kTfFco\"",
|
|
25891
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25892
|
+
"size": 5812,
|
|
25893
|
+
"path": "../public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2"
|
|
25894
|
+
},
|
|
25186
25895
|
"/_nuxt/HclGiUj8.js": {
|
|
25187
25896
|
"type": "text/javascript; charset=utf-8",
|
|
25188
25897
|
"etag": "\"4bb-OjUbx7m0dPDFUkNfZ4BuUs+1sHI\"",
|
|
25189
|
-
"mtime": "2026-09-
|
|
25898
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25190
25899
|
"size": 1211,
|
|
25191
25900
|
"path": "../public/_nuxt/HclGiUj8.js"
|
|
25192
25901
|
},
|
|
25193
25902
|
"/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2": {
|
|
25194
25903
|
"type": "font/woff2",
|
|
25195
25904
|
"etag": "\"1f44-6MZ7/PEEOeDVF0eHI650KpwKQV8\"",
|
|
25196
|
-
"mtime": "2026-09-
|
|
25905
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25197
25906
|
"size": 8004,
|
|
25198
25907
|
"path": "../public/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2"
|
|
25199
25908
|
},
|
|
25200
25909
|
"/_nuxt/HWXLx5Hz.js": {
|
|
25201
25910
|
"type": "text/javascript; charset=utf-8",
|
|
25202
25911
|
"etag": "\"3339-T0Y5onZ5wyZwFT6zTIO03qyuPeQ\"",
|
|
25203
|
-
"mtime": "2026-09-
|
|
25912
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25204
25913
|
"size": 13113,
|
|
25205
25914
|
"path": "../public/_nuxt/HWXLx5Hz.js"
|
|
25206
25915
|
},
|
|
25207
25916
|
"/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2": {
|
|
25208
25917
|
"type": "font/woff2",
|
|
25209
25918
|
"etag": "\"20a4-mDbzFbXDuciYuRDdYbcJkcocaWU\"",
|
|
25210
|
-
"mtime": "2026-09-
|
|
25919
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25211
25920
|
"size": 8356,
|
|
25212
25921
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2"
|
|
25213
25922
|
},
|
|
25214
25923
|
"/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff": {
|
|
25215
25924
|
"type": "font/woff",
|
|
25216
25925
|
"etag": "\"1c24-wpeoT2YBcqJ4hbipsoiB1m58w98\"",
|
|
25217
|
-
"mtime": "2026-09-
|
|
25926
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25218
25927
|
"size": 7204,
|
|
25219
25928
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff"
|
|
25220
25929
|
},
|
|
25221
25930
|
"/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff": {
|
|
25222
25931
|
"type": "font/woff",
|
|
25223
25932
|
"etag": "\"1c28-50yap58S0sLYRB2B8AEk2dq82kg\"",
|
|
25224
|
-
"mtime": "2026-09-
|
|
25933
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25225
25934
|
"size": 7208,
|
|
25226
25935
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff"
|
|
25227
25936
|
},
|
|
25228
|
-
"/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2": {
|
|
25229
|
-
"type": "font/woff2",
|
|
25230
|
-
"etag": "\"210c-yqAnW+098RkHUvQzwj27Jo9sIUc\"",
|
|
25231
|
-
"mtime": "2026-09-02T10:44:57.838Z",
|
|
25232
|
-
"size": 8460,
|
|
25233
|
-
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2"
|
|
25234
|
-
},
|
|
25235
25937
|
"/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2": {
|
|
25236
25938
|
"type": "font/woff2",
|
|
25237
25939
|
"etag": "\"2488-WHfw+ZaOHy8HhYaV0AzfKZ8dozA\"",
|
|
25238
|
-
"mtime": "2026-09-
|
|
25940
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25239
25941
|
"size": 9352,
|
|
25240
25942
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2"
|
|
25241
25943
|
},
|
|
25944
|
+
"/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2": {
|
|
25945
|
+
"type": "font/woff2",
|
|
25946
|
+
"etag": "\"210c-yqAnW+098RkHUvQzwj27Jo9sIUc\"",
|
|
25947
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25948
|
+
"size": 8460,
|
|
25949
|
+
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2"
|
|
25950
|
+
},
|
|
25242
25951
|
"/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff": {
|
|
25243
25952
|
"type": "font/woff",
|
|
25244
25953
|
"etag": "\"1c64-t3eBraFEv1B6D+DIfK23+8/F2mA\"",
|
|
25245
|
-
"mtime": "2026-09-
|
|
25954
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25246
25955
|
"size": 7268,
|
|
25247
25956
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff"
|
|
25248
25957
|
},
|
|
25249
25958
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff": {
|
|
25250
25959
|
"type": "font/woff",
|
|
25251
25960
|
"etag": "\"16bc-GBHBT1lClOFRLkxzjkkoZV1QN+Y\"",
|
|
25252
|
-
"mtime": "2026-09-
|
|
25961
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25253
25962
|
"size": 5820,
|
|
25254
25963
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff"
|
|
25255
25964
|
},
|
|
25256
25965
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2": {
|
|
25257
25966
|
"type": "font/woff2",
|
|
25258
25967
|
"etag": "\"1b00-w57wcK5m30ZZ4sBwsaWzlcI3F7c\"",
|
|
25259
|
-
"mtime": "2026-09-
|
|
25968
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25260
25969
|
"size": 6912,
|
|
25261
25970
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2"
|
|
25262
25971
|
},
|
|
25972
|
+
"/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff": {
|
|
25973
|
+
"type": "font/woff",
|
|
25974
|
+
"etag": "\"168c-gvDCX7ATl9g9LbPEKlQjJSXhRPw\"",
|
|
25975
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25976
|
+
"size": 5772,
|
|
25977
|
+
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff"
|
|
25978
|
+
},
|
|
25263
25979
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2": {
|
|
25264
25980
|
"type": "font/woff2",
|
|
25265
25981
|
"etag": "\"1b3c-pFin0Xk9XlGLhqdo1+npFJkyQ5Y\"",
|
|
25266
|
-
"mtime": "2026-09-
|
|
25982
|
+
"mtime": "2026-09-02T12:06:00.141Z",
|
|
25267
25983
|
"size": 6972,
|
|
25268
25984
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2"
|
|
25269
25985
|
},
|
|
25270
25986
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff": {
|
|
25271
25987
|
"type": "font/woff",
|
|
25272
25988
|
"etag": "\"16a0-8RgtlGopOkBt2P4jKMMd7hk+D74\"",
|
|
25273
|
-
"mtime": "2026-09-
|
|
25989
|
+
"mtime": "2026-09-02T12:06:00.141Z",
|
|
25274
25990
|
"size": 5792,
|
|
25275
25991
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff"
|
|
25276
25992
|
},
|
|
25277
|
-
"/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff": {
|
|
25278
|
-
"type": "font/woff",
|
|
25279
|
-
"etag": "\"168c-gvDCX7ATl9g9LbPEKlQjJSXhRPw\"",
|
|
25280
|
-
"mtime": "2026-09-02T10:44:57.840Z",
|
|
25281
|
-
"size": 5772,
|
|
25282
|
-
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff"
|
|
25283
|
-
},
|
|
25284
25993
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2": {
|
|
25285
25994
|
"type": "font/woff2",
|
|
25286
25995
|
"etag": "\"1e0c-R9/TBUX2qLWGlHeC55LoggyLdII\"",
|
|
25287
|
-
"mtime": "2026-09-
|
|
25996
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25288
25997
|
"size": 7692,
|
|
25289
25998
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2"
|
|
25290
25999
|
},
|
|
25291
26000
|
"/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff": {
|
|
25292
26001
|
"type": "font/woff",
|
|
25293
26002
|
"etag": "\"3358-rWMSbc9cch7FBErQpfnWcshAYFM\"",
|
|
25294
|
-
"mtime": "2026-09-
|
|
26003
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25295
26004
|
"size": 13144,
|
|
25296
26005
|
"path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff"
|
|
25297
26006
|
},
|
|
25298
26007
|
"/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2": {
|
|
25299
26008
|
"type": "font/woff2",
|
|
25300
26009
|
"etag": "\"3974-u4dQDjIEo6fGXWYzx5xchAw76NM\"",
|
|
25301
|
-
"mtime": "2026-09-
|
|
26010
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25302
26011
|
"size": 14708,
|
|
25303
26012
|
"path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2"
|
|
25304
26013
|
},
|
|
25305
26014
|
"/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff": {
|
|
25306
26015
|
"type": "font/woff",
|
|
25307
26016
|
"etag": "\"3364-S8wip5no4QO46BFh3FPzQKpIOec\"",
|
|
25308
|
-
"mtime": "2026-09-
|
|
26017
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25309
26018
|
"size": 13156,
|
|
25310
26019
|
"path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff"
|
|
25311
26020
|
},
|
|
25312
|
-
"/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2": {
|
|
25313
|
-
"type": "font/woff2",
|
|
25314
|
-
"etag": "\"3d04-zppco6h02pIBwmMMXLe/qpaIwFI\"",
|
|
25315
|
-
"mtime": "2026-09-02T10:44:57.843Z",
|
|
25316
|
-
"size": 15620,
|
|
25317
|
-
"path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2"
|
|
25318
|
-
},
|
|
25319
26021
|
"/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2": {
|
|
25320
26022
|
"type": "font/woff2",
|
|
25321
26023
|
"etag": "\"3a28-0y8OBwGsYgQ4QBMagAznF6huTuI\"",
|
|
25322
|
-
"mtime": "2026-09-
|
|
26024
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25323
26025
|
"size": 14888,
|
|
25324
26026
|
"path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2"
|
|
25325
26027
|
},
|
|
25326
26028
|
"/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff": {
|
|
25327
26029
|
"type": "font/woff",
|
|
25328
26030
|
"etag": "\"3398-D/GHpHo4zls8HLHH2boKeigB6S4\"",
|
|
25329
|
-
"mtime": "2026-09-
|
|
26031
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25330
26032
|
"size": 13208,
|
|
25331
26033
|
"path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff"
|
|
25332
26034
|
},
|
|
26035
|
+
"/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2": {
|
|
26036
|
+
"type": "font/woff2",
|
|
26037
|
+
"etag": "\"3d04-zppco6h02pIBwmMMXLe/qpaIwFI\"",
|
|
26038
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
26039
|
+
"size": 15620,
|
|
26040
|
+
"path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2"
|
|
26041
|
+
},
|
|
25333
26042
|
"/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2": {
|
|
25334
26043
|
"type": "font/woff2",
|
|
25335
26044
|
"etag": "\"3424-SvjO9SK9iRLLL61B4GuQJWQP62I\"",
|
|
25336
|
-
"mtime": "2026-09-
|
|
26045
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25337
26046
|
"size": 13348,
|
|
25338
26047
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2"
|
|
25339
26048
|
},
|
|
25340
26049
|
"/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff": {
|
|
25341
26050
|
"type": "font/woff",
|
|
25342
26051
|
"etag": "\"2df8-dfJwTWMZxHyGnUuJDGfpU4w2dLs\"",
|
|
25343
|
-
"mtime": "2026-09-
|
|
26052
|
+
"mtime": "2026-09-02T12:06:00.143Z",
|
|
25344
26053
|
"size": 11768,
|
|
25345
26054
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff"
|
|
25346
26055
|
},
|
|
26056
|
+
"/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff": {
|
|
26057
|
+
"type": "font/woff",
|
|
26058
|
+
"etag": "\"2df8-73sb1BUyjMsq70ppsdZBHEqWrtE\"",
|
|
26059
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
26060
|
+
"size": 11768,
|
|
26061
|
+
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff"
|
|
26062
|
+
},
|
|
25347
26063
|
"/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2": {
|
|
25348
26064
|
"type": "font/woff2",
|
|
25349
26065
|
"etag": "\"3478-PpQvQo59iHxPLcEUBhJfmFmCPuA\"",
|
|
25350
|
-
"mtime": "2026-09-
|
|
26066
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25351
26067
|
"size": 13432,
|
|
25352
26068
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2"
|
|
25353
26069
|
},
|
|
25354
26070
|
"/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2": {
|
|
25355
26071
|
"type": "font/woff2",
|
|
25356
26072
|
"etag": "\"37f8-5XYRqKuMO2rN5QZqfj4VW8r2jSQ\"",
|
|
25357
|
-
"mtime": "2026-09-
|
|
26073
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25358
26074
|
"size": 14328,
|
|
25359
26075
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2"
|
|
25360
26076
|
},
|
|
25361
|
-
"/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff": {
|
|
25362
|
-
"type": "font/woff",
|
|
25363
|
-
"etag": "\"2df8-73sb1BUyjMsq70ppsdZBHEqWrtE\"",
|
|
25364
|
-
"mtime": "2026-09-02T10:44:57.844Z",
|
|
25365
|
-
"size": 11768,
|
|
25366
|
-
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff"
|
|
25367
|
-
},
|
|
25368
26077
|
"/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff": {
|
|
25369
26078
|
"type": "font/woff",
|
|
25370
26079
|
"etag": "\"2e38-fOmVENNzEJaYqxODn6K5NAbrEJk\"",
|
|
25371
|
-
"mtime": "2026-09-
|
|
26080
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25372
26081
|
"size": 11832,
|
|
25373
26082
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff"
|
|
25374
26083
|
},
|
|
25375
26084
|
"/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2": {
|
|
25376
26085
|
"type": "font/woff2",
|
|
25377
26086
|
"etag": "\"16ec-bIkS18/YaTiWdOzfzp4pFXvLmqQ\"",
|
|
25378
|
-
"mtime": "2026-09-
|
|
26087
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25379
26088
|
"size": 5868,
|
|
25380
26089
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2"
|
|
25381
26090
|
},
|
|
25382
26091
|
"/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff": {
|
|
25383
26092
|
"type": "font/woff",
|
|
25384
26093
|
"etag": "\"15f4-LdRX2sBB3T5WDAsZLCwBlsMYXPw\"",
|
|
25385
|
-
"mtime": "2026-09-
|
|
26094
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25386
26095
|
"size": 5620,
|
|
25387
26096
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff"
|
|
25388
26097
|
},
|
|
25389
26098
|
"/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff": {
|
|
25390
26099
|
"type": "font/woff",
|
|
25391
26100
|
"etag": "\"15f0-mGuZIt/ndQFiw5uxmCOkhhWSxi4\"",
|
|
25392
|
-
"mtime": "2026-09-
|
|
26101
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25393
26102
|
"size": 5616,
|
|
25394
26103
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff"
|
|
25395
26104
|
},
|
|
25396
26105
|
"/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2": {
|
|
25397
26106
|
"type": "font/woff2",
|
|
25398
26107
|
"etag": "\"1798-7VDjg0E2ggd9c0kJDHNRh+Fu5E0\"",
|
|
25399
|
-
"mtime": "2026-09-
|
|
26108
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25400
26109
|
"size": 6040,
|
|
25401
26110
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2"
|
|
25402
26111
|
},
|
|
25403
|
-
"/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2": {
|
|
25404
|
-
"type": "font/woff2",
|
|
25405
|
-
"etag": "\"1b14-ylPjcMKGVc4RbTi2G25N0MSlVNo\"",
|
|
25406
|
-
"mtime": "2026-09-02T10:44:57.847Z",
|
|
25407
|
-
"size": 6932,
|
|
25408
|
-
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2"
|
|
25409
|
-
},
|
|
25410
26112
|
"/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff": {
|
|
25411
26113
|
"type": "font/woff",
|
|
25412
26114
|
"etag": "\"1650-9Pko0qRZ+EoISmnDaTRQ8KRGy/s\"",
|
|
25413
|
-
"mtime": "2026-09-
|
|
26115
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25414
26116
|
"size": 5712,
|
|
25415
26117
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff"
|
|
25416
26118
|
},
|
|
26119
|
+
"/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2": {
|
|
26120
|
+
"type": "font/woff2",
|
|
26121
|
+
"etag": "\"1b14-ylPjcMKGVc4RbTi2G25N0MSlVNo\"",
|
|
26122
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
26123
|
+
"size": 6932,
|
|
26124
|
+
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2"
|
|
26125
|
+
},
|
|
25417
26126
|
"/_nuxt/kZl6yT-12.js": {
|
|
25418
26127
|
"type": "text/javascript; charset=utf-8",
|
|
25419
26128
|
"etag": "\"e9-t0VKevMurw+ruGbCV/EgmcM2dww\"",
|
|
25420
|
-
"mtime": "2026-09-
|
|
26129
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
25421
26130
|
"size": 233,
|
|
25422
26131
|
"path": "../public/_nuxt/kZl6yT-12.js"
|
|
25423
26132
|
},
|
|
25424
26133
|
"/_nuxt/lO5tpDZ5.js": {
|
|
25425
26134
|
"type": "text/javascript; charset=utf-8",
|
|
25426
26135
|
"etag": "\"3b-z4jypkmUW9c9v+AALQ28pDyJ80A\"",
|
|
25427
|
-
"mtime": "2026-09-
|
|
26136
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25428
26137
|
"size": 59,
|
|
25429
26138
|
"path": "../public/_nuxt/lO5tpDZ5.js"
|
|
25430
26139
|
},
|
|
25431
|
-
"/_nuxt/monitor.41fCD6TB.css": {
|
|
25432
|
-
"type": "text/css; charset=utf-8",
|
|
25433
|
-
"etag": "\"483-AbTSw5gK9t0PRRiSpYierkjEDsE\"",
|
|
25434
|
-
"mtime": "2026-09-02T10:44:57.848Z",
|
|
25435
|
-
"size": 1155,
|
|
25436
|
-
"path": "../public/_nuxt/monitor.41fCD6TB.css"
|
|
25437
|
-
},
|
|
25438
|
-
"/_nuxt/logs.DaIsHWZE.css": {
|
|
25439
|
-
"type": "text/css; charset=utf-8",
|
|
25440
|
-
"etag": "\"1635-2SnVe4npTbogqgQvzzEAwCfWhCI\"",
|
|
25441
|
-
"mtime": "2026-09-02T10:44:57.848Z",
|
|
25442
|
-
"size": 5685,
|
|
25443
|
-
"path": "../public/_nuxt/logs.DaIsHWZE.css"
|
|
25444
|
-
},
|
|
25445
26140
|
"/_nuxt/NIM0Wglj2.js": {
|
|
25446
26141
|
"type": "text/javascript; charset=utf-8",
|
|
25447
26142
|
"etag": "\"aa5-KRmwCVPVQ4lynfKMpxx7nE1gBY4\"",
|
|
25448
|
-
"mtime": "2026-09-
|
|
26143
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25449
26144
|
"size": 2725,
|
|
25450
26145
|
"path": "../public/_nuxt/NIM0Wglj2.js"
|
|
25451
26146
|
},
|
|
25452
|
-
"/_nuxt/
|
|
26147
|
+
"/_nuxt/monitor.41fCD6TB.css": {
|
|
25453
26148
|
"type": "text/css; charset=utf-8",
|
|
25454
|
-
"etag": "\"
|
|
25455
|
-
"mtime": "2026-09-
|
|
25456
|
-
"size":
|
|
25457
|
-
"path": "../public/_nuxt/
|
|
26149
|
+
"etag": "\"483-AbTSw5gK9t0PRRiSpYierkjEDsE\"",
|
|
26150
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
26151
|
+
"size": 1155,
|
|
26152
|
+
"path": "../public/_nuxt/monitor.41fCD6TB.css"
|
|
25458
26153
|
},
|
|
25459
26154
|
"/_nuxt/OwJ1LJkF.js": {
|
|
25460
26155
|
"type": "text/javascript; charset=utf-8",
|
|
25461
26156
|
"etag": "\"3488-ohWEJm0u4abl3TRn0oHqUL2oU3A\"",
|
|
25462
|
-
"mtime": "2026-09-
|
|
26157
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25463
26158
|
"size": 13448,
|
|
25464
26159
|
"path": "../public/_nuxt/OwJ1LJkF.js"
|
|
25465
26160
|
},
|
|
26161
|
+
"/_nuxt/logs.DaIsHWZE.css": {
|
|
26162
|
+
"type": "text/css; charset=utf-8",
|
|
26163
|
+
"etag": "\"1635-2SnVe4npTbogqgQvzzEAwCfWhCI\"",
|
|
26164
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
26165
|
+
"size": 5685,
|
|
26166
|
+
"path": "../public/_nuxt/logs.DaIsHWZE.css"
|
|
26167
|
+
},
|
|
25466
26168
|
"/_nuxt/pages.CytEOfUs.css": {
|
|
25467
26169
|
"type": "text/css; charset=utf-8",
|
|
25468
26170
|
"etag": "\"1f78-Zc87Z5OhCuyS/CdNTE5IMJgqhH0\"",
|
|
25469
|
-
"mtime": "2026-09-
|
|
26171
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25470
26172
|
"size": 8056,
|
|
25471
26173
|
"path": "../public/_nuxt/pages.CytEOfUs.css"
|
|
25472
26174
|
},
|
|
26175
|
+
"/_nuxt/OmpTerminalPanel.Bc9GjNU5.css": {
|
|
26176
|
+
"type": "text/css; charset=utf-8",
|
|
26177
|
+
"etag": "\"10d0-KVD3g2aNdpoQxACTChylqWCAIqY\"",
|
|
26178
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
26179
|
+
"size": 4304,
|
|
26180
|
+
"path": "../public/_nuxt/OmpTerminalPanel.Bc9GjNU5.css"
|
|
26181
|
+
},
|
|
25473
26182
|
"/_nuxt/PQLnLxYe.js": {
|
|
25474
26183
|
"type": "text/javascript; charset=utf-8",
|
|
25475
26184
|
"etag": "\"1359-2EI4UdgR3Dg4/iuC63SVUdU5cAg\"",
|
|
25476
|
-
"mtime": "2026-09-
|
|
26185
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25477
26186
|
"size": 4953,
|
|
25478
26187
|
"path": "../public/_nuxt/PQLnLxYe.js"
|
|
25479
26188
|
},
|
|
26189
|
+
"/_nuxt/pRQri7vQ2.js": {
|
|
26190
|
+
"type": "text/javascript; charset=utf-8",
|
|
26191
|
+
"etag": "\"8b9-3wDeSjR8e4ZgPLVXOMKGsaIsPEk\"",
|
|
26192
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
26193
|
+
"size": 2233,
|
|
26194
|
+
"path": "../public/_nuxt/pRQri7vQ2.js"
|
|
26195
|
+
},
|
|
25480
26196
|
"/_nuxt/plugins.FTm0PcEe.css": {
|
|
25481
26197
|
"type": "text/css; charset=utf-8",
|
|
25482
26198
|
"etag": "\"9bd-tTmniaf8rX8elG1Badc6OjJVtAk\"",
|
|
25483
|
-
"mtime": "2026-09-
|
|
26199
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25484
26200
|
"size": 2493,
|
|
25485
26201
|
"path": "../public/_nuxt/plugins.FTm0PcEe.css"
|
|
25486
26202
|
},
|
|
25487
26203
|
"/_nuxt/RYFtK4qZ2.js": {
|
|
25488
26204
|
"type": "text/javascript; charset=utf-8",
|
|
25489
26205
|
"etag": "\"594c-ZHrAodAyz6fWAruZCqluWn052zA\"",
|
|
25490
|
-
"mtime": "2026-09-
|
|
26206
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25491
26207
|
"size": 22860,
|
|
25492
26208
|
"path": "../public/_nuxt/RYFtK4qZ2.js"
|
|
25493
26209
|
},
|
|
25494
26210
|
"/_nuxt/rzGB_ojX.js": {
|
|
25495
26211
|
"type": "text/javascript; charset=utf-8",
|
|
25496
26212
|
"etag": "\"156ba-Me1pF0LZxFasl9k2mKSJdM5HmgI\"",
|
|
25497
|
-
"mtime": "2026-09-
|
|
26213
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25498
26214
|
"size": 87738,
|
|
25499
26215
|
"path": "../public/_nuxt/rzGB_ojX.js"
|
|
25500
26216
|
},
|
|
25501
|
-
"/_nuxt/pRQri7vQ2.js": {
|
|
25502
|
-
"type": "text/javascript; charset=utf-8",
|
|
25503
|
-
"etag": "\"8b9-3wDeSjR8e4ZgPLVXOMKGsaIsPEk\"",
|
|
25504
|
-
"mtime": "2026-09-02T10:44:57.817Z",
|
|
25505
|
-
"size": 2233,
|
|
25506
|
-
"path": "../public/_nuxt/pRQri7vQ2.js"
|
|
25507
|
-
},
|
|
25508
26217
|
"/_nuxt/R_WxTozV2.js": {
|
|
25509
26218
|
"type": "text/javascript; charset=utf-8",
|
|
25510
26219
|
"etag": "\"f01-WXNbWQm5WyeJtTA6i6wwMxnI1SQ\"",
|
|
25511
|
-
"mtime": "2026-09-
|
|
26220
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25512
26221
|
"size": 3841,
|
|
25513
26222
|
"path": "../public/_nuxt/R_WxTozV2.js"
|
|
25514
26223
|
},
|
|
25515
26224
|
"/_nuxt/settings.BANibAnV.css": {
|
|
25516
26225
|
"type": "text/css; charset=utf-8",
|
|
25517
26226
|
"etag": "\"14e1-dy+irjFjvg+oV4IQLZHkokWSVkU\"",
|
|
25518
|
-
"mtime": "2026-09-
|
|
26227
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25519
26228
|
"size": 5345,
|
|
25520
26229
|
"path": "../public/_nuxt/settings.BANibAnV.css"
|
|
25521
26230
|
},
|
|
25522
26231
|
"/_nuxt/teams.B8JNbUZg.css": {
|
|
25523
26232
|
"type": "text/css; charset=utf-8",
|
|
25524
26233
|
"etag": "\"6b7-7gKsNrCHeSx0FLL3kd7/KcsQBgw\"",
|
|
25525
|
-
"mtime": "2026-09-
|
|
26234
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25526
26235
|
"size": 1719,
|
|
25527
26236
|
"path": "../public/_nuxt/teams.B8JNbUZg.css"
|
|
25528
26237
|
},
|
|
25529
26238
|
"/_nuxt/tokens.CWOTXM-Z.css": {
|
|
25530
26239
|
"type": "text/css; charset=utf-8",
|
|
25531
26240
|
"etag": "\"9cd-tzkC/9SAq2Z51cXkqrDQz0rVzMo\"",
|
|
25532
|
-
"mtime": "2026-09-
|
|
26241
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25533
26242
|
"size": 2509,
|
|
25534
26243
|
"path": "../public/_nuxt/tokens.CWOTXM-Z.css"
|
|
25535
26244
|
},
|
|
25536
26245
|
"/_nuxt/town.BLrD9-WH.css": {
|
|
25537
26246
|
"type": "text/css; charset=utf-8",
|
|
25538
26247
|
"etag": "\"64-INqlNEwsg1I+Dzc8LaEkJCLno5o\"",
|
|
25539
|
-
"mtime": "2026-09-
|
|
26248
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25540
26249
|
"size": 100,
|
|
25541
26250
|
"path": "../public/_nuxt/town.BLrD9-WH.css"
|
|
25542
26251
|
},
|
|
25543
26252
|
"/_nuxt/town.C_DsNW0J.css": {
|
|
25544
26253
|
"type": "text/css; charset=utf-8",
|
|
25545
26254
|
"etag": "\"3b2-lx8uIK7y3f1Nkj2gMcTuak3mB/I\"",
|
|
25546
|
-
"mtime": "2026-09-
|
|
26255
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25547
26256
|
"size": 946,
|
|
25548
26257
|
"path": "../public/_nuxt/town.C_DsNW0J.css"
|
|
25549
26258
|
},
|
|
25550
26259
|
"/_nuxt/TownView.CI2Wpzty.css": {
|
|
25551
26260
|
"type": "text/css; charset=utf-8",
|
|
25552
26261
|
"etag": "\"118cd-lxMkpqeOaL9RAhlC0QWtc8k2J38\"",
|
|
25553
|
-
"mtime": "2026-09-
|
|
26262
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25554
26263
|
"size": 71885,
|
|
25555
26264
|
"path": "../public/_nuxt/TownView.CI2Wpzty.css"
|
|
25556
26265
|
},
|
|
25557
26266
|
"/_nuxt/uBbDCfTz.js": {
|
|
25558
26267
|
"type": "text/javascript; charset=utf-8",
|
|
25559
26268
|
"etag": "\"2435-2SmfQO0WbbFYq5CVz6TT/4+7jS4\"",
|
|
25560
|
-
"mtime": "2026-09-
|
|
26269
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25561
26270
|
"size": 9269,
|
|
25562
26271
|
"path": "../public/_nuxt/uBbDCfTz.js"
|
|
25563
26272
|
},
|
|
25564
26273
|
"/_nuxt/ubPfs9mQ.js": {
|
|
25565
26274
|
"type": "text/javascript; charset=utf-8",
|
|
25566
26275
|
"etag": "\"1dc4-yIIKAQ37KJqWQcdDI1J/9WfoaDc\"",
|
|
25567
|
-
"mtime": "2026-09-
|
|
26276
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25568
26277
|
"size": 7620,
|
|
25569
26278
|
"path": "../public/_nuxt/ubPfs9mQ.js"
|
|
25570
26279
|
},
|
|
25571
26280
|
"/_nuxt/users.D8lcLE62.css": {
|
|
25572
26281
|
"type": "text/css; charset=utf-8",
|
|
25573
26282
|
"etag": "\"2f7-vPqmiQmG+gTnKc25vyRnF3nNTy0\"",
|
|
25574
|
-
"mtime": "2026-09-
|
|
26283
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25575
26284
|
"size": 759,
|
|
25576
26285
|
"path": "../public/_nuxt/users.D8lcLE62.css"
|
|
25577
26286
|
},
|
|
25578
|
-
"/_nuxt/workshop.B98sHiJq.css": {
|
|
25579
|
-
"type": "text/css; charset=utf-8",
|
|
25580
|
-
"etag": "\"d1c-WVdgeDMUl4qOkHXOdrLmeDFgLfA\"",
|
|
25581
|
-
"mtime": "2026-09-02T10:44:57.851Z",
|
|
25582
|
-
"size": 3356,
|
|
25583
|
-
"path": "../public/_nuxt/workshop.B98sHiJq.css"
|
|
25584
|
-
},
|
|
25585
26287
|
"/_nuxt/W1E3-5ML.js": {
|
|
25586
26288
|
"type": "text/javascript; charset=utf-8",
|
|
25587
26289
|
"etag": "\"9625-R1c4xFkyUPCvDq0pqlQVbYHN+rE\"",
|
|
25588
|
-
"mtime": "2026-09-
|
|
26290
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25589
26291
|
"size": 38437,
|
|
25590
26292
|
"path": "../public/_nuxt/W1E3-5ML.js"
|
|
25591
26293
|
},
|
|
26294
|
+
"/_nuxt/Z8k0uMSI.js": {
|
|
26295
|
+
"type": "text/javascript; charset=utf-8",
|
|
26296
|
+
"etag": "\"79df-ZhH5hzPaniNAq0yDLbZqo8UuxgE\"",
|
|
26297
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
26298
|
+
"size": 31199,
|
|
26299
|
+
"path": "../public/_nuxt/Z8k0uMSI.js"
|
|
26300
|
+
},
|
|
26301
|
+
"/_nuxt/workshop.B98sHiJq.css": {
|
|
26302
|
+
"type": "text/css; charset=utf-8",
|
|
26303
|
+
"etag": "\"d1c-WVdgeDMUl4qOkHXOdrLmeDFgLfA\"",
|
|
26304
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
26305
|
+
"size": 3356,
|
|
26306
|
+
"path": "../public/_nuxt/workshop.B98sHiJq.css"
|
|
26307
|
+
},
|
|
25592
26308
|
"/_nuxt/_id_.CbiF5PrV.css": {
|
|
25593
26309
|
"type": "text/css; charset=utf-8",
|
|
25594
26310
|
"etag": "\"1163-pGAiwiKa0Bv9Cnn9iaQDLyOVwhI\"",
|
|
25595
|
-
"mtime": "2026-09-
|
|
26311
|
+
"mtime": "2026-09-02T12:06:00.127Z",
|
|
25596
26312
|
"size": 4451,
|
|
25597
26313
|
"path": "../public/_nuxt/_id_.CbiF5PrV.css"
|
|
25598
26314
|
},
|
|
25599
|
-
"/_nuxt/
|
|
25600
|
-
"type": "text/
|
|
25601
|
-
"etag": "\"
|
|
25602
|
-
"mtime": "2026-09-
|
|
25603
|
-
"size":
|
|
25604
|
-
"path": "../public/_nuxt/
|
|
26315
|
+
"/_nuxt/_wsId_.DET_GinP.css": {
|
|
26316
|
+
"type": "text/css; charset=utf-8",
|
|
26317
|
+
"etag": "\"11059-XSQRI6C+3DnuFVWKY5aaW52YVJE\"",
|
|
26318
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
26319
|
+
"size": 69721,
|
|
26320
|
+
"path": "../public/_nuxt/_wsId_.DET_GinP.css"
|
|
25605
26321
|
},
|
|
25606
26322
|
"/_nuxt/_id_.Ci4u30cR.css": {
|
|
25607
26323
|
"type": "text/css; charset=utf-8",
|
|
25608
26324
|
"etag": "\"3616-1z8Sb15MljzJ6ZFiU/VRUsL2CFs\"",
|
|
25609
|
-
"mtime": "2026-09-
|
|
26325
|
+
"mtime": "2026-09-02T12:06:00.127Z",
|
|
25610
26326
|
"size": 13846,
|
|
25611
26327
|
"path": "../public/_nuxt/_id_.Ci4u30cR.css"
|
|
25612
26328
|
},
|
|
25613
|
-
"/assets/game/player-sheet.png": {
|
|
25614
|
-
"type": "image/png",
|
|
25615
|
-
"etag": "\"2742-xHFqZq17XtbQVhapFMWJpVb0W5o\"",
|
|
25616
|
-
"mtime": "2026-08-25T12:20:54.514Z",
|
|
25617
|
-
"size": 10050,
|
|
25618
|
-
"path": "../public/assets/game/player-sheet.png"
|
|
25619
|
-
},
|
|
25620
26329
|
"/assets/game/coin.png": {
|
|
25621
26330
|
"type": "image/png",
|
|
25622
26331
|
"etag": "\"1a4d-c3GA5v0R/IuKz38xkdcao4hHrX4\"",
|
|
@@ -25624,12 +26333,12 @@ const assets = {
|
|
|
25624
26333
|
"size": 6733,
|
|
25625
26334
|
"path": "../public/assets/game/coin.png"
|
|
25626
26335
|
},
|
|
25627
|
-
"/
|
|
25628
|
-
"type": "
|
|
25629
|
-
"etag": "\"
|
|
25630
|
-
"mtime": "2026-
|
|
25631
|
-
"size":
|
|
25632
|
-
"path": "../public/
|
|
26336
|
+
"/assets/game/player-sheet.png": {
|
|
26337
|
+
"type": "image/png",
|
|
26338
|
+
"etag": "\"2742-xHFqZq17XtbQVhapFMWJpVb0W5o\"",
|
|
26339
|
+
"mtime": "2026-08-25T12:20:54.514Z",
|
|
26340
|
+
"size": 10050,
|
|
26341
|
+
"path": "../public/assets/game/player-sheet.png"
|
|
25633
26342
|
},
|
|
25634
26343
|
"/assets/game/tuxemon-town.json": {
|
|
25635
26344
|
"type": "application/json",
|
|
@@ -25647,24 +26356,17 @@ const assets = {
|
|
|
25647
26356
|
},
|
|
25648
26357
|
"/_nuxt/builds/latest.json": {
|
|
25649
26358
|
"type": "application/json",
|
|
25650
|
-
"etag": "\"47-
|
|
25651
|
-
"mtime": "2026-09-
|
|
26359
|
+
"etag": "\"47-yIVSoLJ7RIih/ZRXcAtm396Vy4w\"",
|
|
26360
|
+
"mtime": "2026-09-02T12:06:05.931Z",
|
|
25652
26361
|
"size": 71,
|
|
25653
26362
|
"path": "../public/_nuxt/builds/latest.json"
|
|
25654
26363
|
},
|
|
25655
|
-
"/assets/game/
|
|
25656
|
-
"type": "
|
|
25657
|
-
"etag": "\"
|
|
25658
|
-
"mtime": "2026-08-
|
|
25659
|
-
"size":
|
|
25660
|
-
"path": "../public/assets/game/
|
|
25661
|
-
},
|
|
25662
|
-
"/assets/game/devices/device-console.glb": {
|
|
25663
|
-
"type": "model/gltf-binary",
|
|
25664
|
-
"etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
|
|
25665
|
-
"mtime": "2026-08-26T05:23:14.559Z",
|
|
25666
|
-
"size": 14724,
|
|
25667
|
-
"path": "../public/assets/game/devices/device-console.glb"
|
|
26364
|
+
"/assets/game/character/bot.png": {
|
|
26365
|
+
"type": "image/png",
|
|
26366
|
+
"etag": "\"36fe-Ke8vj83Dinp8fFaRQQBfBsTGI/8\"",
|
|
26367
|
+
"mtime": "2026-08-25T12:20:54.510Z",
|
|
26368
|
+
"size": 14078,
|
|
26369
|
+
"path": "../public/assets/game/character/bot.png"
|
|
25668
26370
|
},
|
|
25669
26371
|
"/assets/game/tuxmon-sample-32px-extruded.png": {
|
|
25670
26372
|
"type": "image/png",
|
|
@@ -25673,6 +26375,62 @@ const assets = {
|
|
|
25673
26375
|
"size": 192008,
|
|
25674
26376
|
"path": "../public/assets/game/tuxmon-sample-32px-extruded.png"
|
|
25675
26377
|
},
|
|
26378
|
+
"/assets/game/character/device-3d.glb": {
|
|
26379
|
+
"type": "model/gltf-binary",
|
|
26380
|
+
"etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
|
|
26381
|
+
"mtime": "2026-08-25T12:20:54.511Z",
|
|
26382
|
+
"size": 19400,
|
|
26383
|
+
"path": "../public/assets/game/character/device-3d.glb"
|
|
26384
|
+
},
|
|
26385
|
+
"/assets/game/character/hero-3d.glb": {
|
|
26386
|
+
"type": "model/gltf-binary",
|
|
26387
|
+
"etag": "\"8494-Uv+bxnHu3YGJp7Es3lHkob25Y08\"",
|
|
26388
|
+
"mtime": "2026-08-25T12:20:54.511Z",
|
|
26389
|
+
"size": 33940,
|
|
26390
|
+
"path": "../public/assets/game/character/hero-3d.glb"
|
|
26391
|
+
},
|
|
26392
|
+
"/assets/game/character/hero-anime-1.glb": {
|
|
26393
|
+
"type": "model/gltf-binary",
|
|
26394
|
+
"etag": "\"1044c-AUMAdrW4S6OKEsUeAcR5c50fyKs\"",
|
|
26395
|
+
"mtime": "2026-08-26T05:23:14.557Z",
|
|
26396
|
+
"size": 66636,
|
|
26397
|
+
"path": "../public/assets/game/character/hero-anime-1.glb"
|
|
26398
|
+
},
|
|
26399
|
+
"/assets/game/character/hero-anime-2.glb": {
|
|
26400
|
+
"type": "model/gltf-binary",
|
|
26401
|
+
"etag": "\"1058c-J91UapGlsJg/5ODN8k8c7rSNpzw\"",
|
|
26402
|
+
"mtime": "2026-08-26T05:23:14.558Z",
|
|
26403
|
+
"size": 66956,
|
|
26404
|
+
"path": "../public/assets/game/character/hero-anime-2.glb"
|
|
26405
|
+
},
|
|
26406
|
+
"/assets/game/character/hero-anime-4.glb": {
|
|
26407
|
+
"type": "model/gltf-binary",
|
|
26408
|
+
"etag": "\"10544-H4WjfazfTQ6hfF2SkK2BfHU27i8\"",
|
|
26409
|
+
"mtime": "2026-08-26T05:23:14.558Z",
|
|
26410
|
+
"size": 66884,
|
|
26411
|
+
"path": "../public/assets/game/character/hero-anime-4.glb"
|
|
26412
|
+
},
|
|
26413
|
+
"/assets/game/character/mage.png": {
|
|
26414
|
+
"type": "image/png",
|
|
26415
|
+
"etag": "\"3832-juipuJuMJceZrarvR4w7OKgQejA\"",
|
|
26416
|
+
"mtime": "2026-08-25T12:20:54.512Z",
|
|
26417
|
+
"size": 14386,
|
|
26418
|
+
"path": "../public/assets/game/character/mage.png"
|
|
26419
|
+
},
|
|
26420
|
+
"/assets/game/character/hero-anime-3.glb": {
|
|
26421
|
+
"type": "model/gltf-binary",
|
|
26422
|
+
"etag": "\"1057c-jREeKLYoS8AFWzuIOgOSr6CzehU\"",
|
|
26423
|
+
"mtime": "2026-08-26T05:23:14.558Z",
|
|
26424
|
+
"size": 66940,
|
|
26425
|
+
"path": "../public/assets/game/character/hero-anime-3.glb"
|
|
26426
|
+
},
|
|
26427
|
+
"/assets/game/character/knight.png": {
|
|
26428
|
+
"type": "image/png",
|
|
26429
|
+
"etag": "\"3b37-Wyixufl/LcqKO/AeTLuGvzi4goQ\"",
|
|
26430
|
+
"mtime": "2026-08-25T12:20:54.511Z",
|
|
26431
|
+
"size": 15159,
|
|
26432
|
+
"path": "../public/assets/game/character/knight.png"
|
|
26433
|
+
},
|
|
25676
26434
|
"/assets/game/devices/agv.glb": {
|
|
25677
26435
|
"type": "model/gltf-binary",
|
|
25678
26436
|
"etag": "\"b0ec-SGRGNfFN89F7v1GROXKGve7pQqs\"",
|
|
@@ -25680,12 +26438,19 @@ const assets = {
|
|
|
25680
26438
|
"size": 45292,
|
|
25681
26439
|
"path": "../public/assets/game/devices/agv.glb"
|
|
25682
26440
|
},
|
|
25683
|
-
"/assets/game/devices/
|
|
26441
|
+
"/assets/game/devices/caster.glb": {
|
|
26442
|
+
"type": "model/gltf-binary",
|
|
26443
|
+
"etag": "\"5874-Qd988sa7u1y3lgH8K/zhzRLbRbs\"",
|
|
26444
|
+
"mtime": "2026-08-27T07:03:12.510Z",
|
|
26445
|
+
"size": 22644,
|
|
26446
|
+
"path": "../public/assets/game/devices/caster.glb"
|
|
26447
|
+
},
|
|
26448
|
+
"/assets/game/devices/device-console.glb": {
|
|
25684
26449
|
"type": "model/gltf-binary",
|
|
25685
|
-
"etag": "\"
|
|
25686
|
-
"mtime": "2026-08-26T05:23:14.
|
|
25687
|
-
"size":
|
|
25688
|
-
"path": "../public/assets/game/devices/device-
|
|
26450
|
+
"etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
|
|
26451
|
+
"mtime": "2026-08-26T05:23:14.559Z",
|
|
26452
|
+
"size": 14724,
|
|
26453
|
+
"path": "../public/assets/game/devices/device-console.glb"
|
|
25689
26454
|
},
|
|
25690
26455
|
"/assets/game/devices/device-robot-arm.glb": {
|
|
25691
26456
|
"type": "model/gltf-binary",
|
|
@@ -25694,12 +26459,12 @@ const assets = {
|
|
|
25694
26459
|
"size": 14332,
|
|
25695
26460
|
"path": "../public/assets/game/devices/device-robot-arm.glb"
|
|
25696
26461
|
},
|
|
25697
|
-
"/assets/game/devices/
|
|
26462
|
+
"/assets/game/devices/device-scanner.glb": {
|
|
25698
26463
|
"type": "model/gltf-binary",
|
|
25699
|
-
"etag": "\"
|
|
25700
|
-
"mtime": "2026-08-
|
|
25701
|
-
"size":
|
|
25702
|
-
"path": "../public/assets/game/devices/
|
|
26464
|
+
"etag": "\"28e0-uKYZaLiZiCedMMozKBOFU14HUSE\"",
|
|
26465
|
+
"mtime": "2026-08-26T05:23:14.560Z",
|
|
26466
|
+
"size": 10464,
|
|
26467
|
+
"path": "../public/assets/game/devices/device-scanner.glb"
|
|
25703
26468
|
},
|
|
25704
26469
|
"/assets/game/devices/extruder.glb": {
|
|
25705
26470
|
"type": "model/gltf-binary",
|
|
@@ -25715,6 +26480,13 @@ const assets = {
|
|
|
25715
26480
|
"size": 78564,
|
|
25716
26481
|
"path": "../public/assets/game/devices/mdo.glb"
|
|
25717
26482
|
},
|
|
26483
|
+
"/assets/game/devices/power-cabinet.glb": {
|
|
26484
|
+
"type": "model/gltf-binary",
|
|
26485
|
+
"etag": "\"54f0-KsrAxig9JTAY5SGKK3jbdJXB6fk\"",
|
|
26486
|
+
"mtime": "2026-08-27T07:03:12.534Z",
|
|
26487
|
+
"size": 21744,
|
|
26488
|
+
"path": "../public/assets/game/devices/power-cabinet.glb"
|
|
26489
|
+
},
|
|
25718
26490
|
"/assets/game/devices/pump.glb": {
|
|
25719
26491
|
"type": "model/gltf-binary",
|
|
25720
26492
|
"etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
|
|
@@ -25722,13 +26494,6 @@ const assets = {
|
|
|
25722
26494
|
"size": 19400,
|
|
25723
26495
|
"path": "../public/assets/game/devices/pump.glb"
|
|
25724
26496
|
},
|
|
25725
|
-
"/assets/game/devices/tdo.glb": {
|
|
25726
|
-
"type": "model/gltf-binary",
|
|
25727
|
-
"etag": "\"e10c-GdMX+mG/KrSVBzy4EeAPPjFoTqM\"",
|
|
25728
|
-
"mtime": "2026-08-27T07:03:12.523Z",
|
|
25729
|
-
"size": 57612,
|
|
25730
|
-
"path": "../public/assets/game/devices/tdo.glb"
|
|
25731
|
-
},
|
|
25732
26497
|
"/assets/game/devices/thickness-scanner.glb": {
|
|
25733
26498
|
"type": "model/gltf-binary",
|
|
25734
26499
|
"etag": "\"3480-WMTbMzRrl/6AJPzEIPhRW9xPugA\"",
|
|
@@ -25736,6 +26501,13 @@ const assets = {
|
|
|
25736
26501
|
"size": 13440,
|
|
25737
26502
|
"path": "../public/assets/game/devices/thickness-scanner.glb"
|
|
25738
26503
|
},
|
|
26504
|
+
"/assets/game/devices/tdo.glb": {
|
|
26505
|
+
"type": "model/gltf-binary",
|
|
26506
|
+
"etag": "\"e10c-GdMX+mG/KrSVBzy4EeAPPjFoTqM\"",
|
|
26507
|
+
"mtime": "2026-08-27T07:03:12.523Z",
|
|
26508
|
+
"size": 57612,
|
|
26509
|
+
"path": "../public/assets/game/devices/tdo.glb"
|
|
26510
|
+
},
|
|
25739
26511
|
"/assets/game/devices/winder.glb": {
|
|
25740
26512
|
"type": "model/gltf-binary",
|
|
25741
26513
|
"etag": "\"9084-N9S2enupsA8WyhEHtkIgQ+RBDV4\"",
|
|
@@ -25743,61 +26515,33 @@ const assets = {
|
|
|
25743
26515
|
"size": 36996,
|
|
25744
26516
|
"path": "../public/assets/game/devices/winder.glb"
|
|
25745
26517
|
},
|
|
25746
|
-
"/assets/game/
|
|
26518
|
+
"/assets/game/npc/boltnu-sheet.png": {
|
|
25747
26519
|
"type": "image/png",
|
|
25748
|
-
"etag": "\"
|
|
25749
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25750
|
-
"size":
|
|
25751
|
-
"path": "../public/assets/game/
|
|
25752
|
-
},
|
|
25753
|
-
"/assets/game/character/device-3d.glb": {
|
|
25754
|
-
"type": "model/gltf-binary",
|
|
25755
|
-
"etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
|
|
25756
|
-
"mtime": "2026-08-25T12:20:54.511Z",
|
|
25757
|
-
"size": 19400,
|
|
25758
|
-
"path": "../public/assets/game/character/device-3d.glb"
|
|
25759
|
-
},
|
|
25760
|
-
"/assets/game/character/hero-3d.glb": {
|
|
25761
|
-
"type": "model/gltf-binary",
|
|
25762
|
-
"etag": "\"8494-Uv+bxnHu3YGJp7Es3lHkob25Y08\"",
|
|
25763
|
-
"mtime": "2026-08-25T12:20:54.511Z",
|
|
25764
|
-
"size": 33940,
|
|
25765
|
-
"path": "../public/assets/game/character/hero-3d.glb"
|
|
25766
|
-
},
|
|
25767
|
-
"/assets/game/character/hero-anime-1.glb": {
|
|
25768
|
-
"type": "model/gltf-binary",
|
|
25769
|
-
"etag": "\"1044c-AUMAdrW4S6OKEsUeAcR5c50fyKs\"",
|
|
25770
|
-
"mtime": "2026-08-26T05:23:14.557Z",
|
|
25771
|
-
"size": 66636,
|
|
25772
|
-
"path": "../public/assets/game/character/hero-anime-1.glb"
|
|
25773
|
-
},
|
|
25774
|
-
"/assets/game/character/hero-anime-2.glb": {
|
|
25775
|
-
"type": "model/gltf-binary",
|
|
25776
|
-
"etag": "\"1058c-J91UapGlsJg/5ODN8k8c7rSNpzw\"",
|
|
25777
|
-
"mtime": "2026-08-26T05:23:14.558Z",
|
|
25778
|
-
"size": 66956,
|
|
25779
|
-
"path": "../public/assets/game/character/hero-anime-2.glb"
|
|
26520
|
+
"etag": "\"a14-8xg90l10OuRoiEEgFXx9PTGJ9rA\"",
|
|
26521
|
+
"mtime": "2026-08-25T12:20:54.513Z",
|
|
26522
|
+
"size": 2580,
|
|
26523
|
+
"path": "../public/assets/game/npc/boltnu-sheet.png"
|
|
25780
26524
|
},
|
|
25781
|
-
"/assets/game/
|
|
25782
|
-
"type": "
|
|
25783
|
-
"etag": "\"
|
|
25784
|
-
"mtime": "2026-08-
|
|
25785
|
-
"size":
|
|
25786
|
-
"path": "../public/assets/game/
|
|
26525
|
+
"/assets/game/npc/fluttaflap-sheet.png": {
|
|
26526
|
+
"type": "image/png",
|
|
26527
|
+
"etag": "\"f65-ivBz79RSNtXu3px7cWEzCwMXdkg\"",
|
|
26528
|
+
"mtime": "2026-08-25T12:20:54.513Z",
|
|
26529
|
+
"size": 3941,
|
|
26530
|
+
"path": "../public/assets/game/npc/fluttaflap-sheet.png"
|
|
25787
26531
|
},
|
|
25788
|
-
"/assets/game/
|
|
26532
|
+
"/assets/game/npc/rockitten-sheet.png": {
|
|
25789
26533
|
"type": "image/png",
|
|
25790
|
-
"etag": "\"
|
|
25791
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25792
|
-
"size":
|
|
25793
|
-
"path": "../public/assets/game/
|
|
26534
|
+
"etag": "\"786-IY4LCl37+SB6pnPynapoUxsxvOM\"",
|
|
26535
|
+
"mtime": "2026-08-25T12:20:54.513Z",
|
|
26536
|
+
"size": 1926,
|
|
26537
|
+
"path": "../public/assets/game/npc/rockitten-sheet.png"
|
|
25794
26538
|
},
|
|
25795
|
-
"/assets/game/
|
|
25796
|
-
"type": "
|
|
25797
|
-
"etag": "\"
|
|
25798
|
-
"mtime": "2026-08-
|
|
25799
|
-
"size":
|
|
25800
|
-
"path": "../public/assets/game/
|
|
26539
|
+
"/assets/game/npc/tux-sheet.png": {
|
|
26540
|
+
"type": "image/png",
|
|
26541
|
+
"etag": "\"912-kf4+Q7EukO60VT6vlziy5RrzuUo\"",
|
|
26542
|
+
"mtime": "2026-08-25T12:20:54.513Z",
|
|
26543
|
+
"size": 2322,
|
|
26544
|
+
"path": "../public/assets/game/npc/tux-sheet.png"
|
|
25801
26545
|
},
|
|
25802
26546
|
"/assets/game/player/misa-back-walk.000.png": {
|
|
25803
26547
|
"type": "image/png",
|
|
@@ -25806,12 +26550,12 @@ const assets = {
|
|
|
25806
26550
|
"size": 343,
|
|
25807
26551
|
"path": "../public/assets/game/player/misa-back-walk.000.png"
|
|
25808
26552
|
},
|
|
25809
|
-
"/assets/game/
|
|
26553
|
+
"/assets/game/player/misa-back-walk.001.png": {
|
|
25810
26554
|
"type": "image/png",
|
|
25811
|
-
"etag": "\"
|
|
25812
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25813
|
-
"size":
|
|
25814
|
-
"path": "../public/assets/game/
|
|
26555
|
+
"etag": "\"15c-PoeNPtRrfApGTf0GzJcdNP59kts\"",
|
|
26556
|
+
"mtime": "2026-08-25T12:20:54.514Z",
|
|
26557
|
+
"size": 348,
|
|
26558
|
+
"path": "../public/assets/game/player/misa-back-walk.001.png"
|
|
25815
26559
|
},
|
|
25816
26560
|
"/assets/game/player/misa-back-walk.002.png": {
|
|
25817
26561
|
"type": "image/png",
|
|
@@ -25820,12 +26564,12 @@ const assets = {
|
|
|
25820
26564
|
"size": 343,
|
|
25821
26565
|
"path": "../public/assets/game/player/misa-back-walk.002.png"
|
|
25822
26566
|
},
|
|
25823
|
-
"/assets/game/player/misa-back-walk.
|
|
26567
|
+
"/assets/game/player/misa-back-walk.003.png": {
|
|
25824
26568
|
"type": "image/png",
|
|
25825
|
-
"etag": "\"15c-
|
|
26569
|
+
"etag": "\"15c-L+/hkHDyiQ9FJs5w93pxALzvWEg\"",
|
|
25826
26570
|
"mtime": "2026-08-25T12:20:54.514Z",
|
|
25827
26571
|
"size": 348,
|
|
25828
|
-
"path": "../public/assets/game/player/misa-back-walk.
|
|
26572
|
+
"path": "../public/assets/game/player/misa-back-walk.003.png"
|
|
25829
26573
|
},
|
|
25830
26574
|
"/assets/game/player/misa-back.png": {
|
|
25831
26575
|
"type": "image/png",
|
|
@@ -25834,12 +26578,12 @@ const assets = {
|
|
|
25834
26578
|
"size": 348,
|
|
25835
26579
|
"path": "../public/assets/game/player/misa-back.png"
|
|
25836
26580
|
},
|
|
25837
|
-
"/assets/game/player/misa-
|
|
26581
|
+
"/assets/game/player/misa-front-walk.000.png": {
|
|
25838
26582
|
"type": "image/png",
|
|
25839
|
-
"etag": "\"
|
|
25840
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25841
|
-
"size":
|
|
25842
|
-
"path": "../public/assets/game/player/misa-
|
|
26583
|
+
"etag": "\"152-+euueT0jvK7OjNDmtrdehgkQatE\"",
|
|
26584
|
+
"mtime": "2026-08-25T12:20:54.515Z",
|
|
26585
|
+
"size": 338,
|
|
26586
|
+
"path": "../public/assets/game/player/misa-front-walk.000.png"
|
|
25843
26587
|
},
|
|
25844
26588
|
"/assets/game/player/misa-front-walk.003.png": {
|
|
25845
26589
|
"type": "image/png",
|
|
@@ -25848,26 +26592,19 @@ const assets = {
|
|
|
25848
26592
|
"size": 341,
|
|
25849
26593
|
"path": "../public/assets/game/player/misa-front-walk.003.png"
|
|
25850
26594
|
},
|
|
25851
|
-
"/assets/game/player/misa-front-walk.
|
|
26595
|
+
"/assets/game/player/misa-front-walk.002.png": {
|
|
25852
26596
|
"type": "image/png",
|
|
25853
|
-
"etag": "\"155-
|
|
26597
|
+
"etag": "\"155-UzIsnRRYoGpmHf5w9T7CLy/0ubw\"",
|
|
25854
26598
|
"mtime": "2026-08-25T12:20:54.515Z",
|
|
25855
26599
|
"size": 341,
|
|
25856
|
-
"path": "../public/assets/game/player/misa-front-walk.
|
|
25857
|
-
},
|
|
25858
|
-
"/assets/game/player/misa-front-walk.000.png": {
|
|
25859
|
-
"type": "image/png",
|
|
25860
|
-
"etag": "\"152-+euueT0jvK7OjNDmtrdehgkQatE\"",
|
|
25861
|
-
"mtime": "2026-08-25T12:20:54.515Z",
|
|
25862
|
-
"size": 338,
|
|
25863
|
-
"path": "../public/assets/game/player/misa-front-walk.000.png"
|
|
26600
|
+
"path": "../public/assets/game/player/misa-front-walk.002.png"
|
|
25864
26601
|
},
|
|
25865
|
-
"/assets/game/player/misa-front-walk.
|
|
26602
|
+
"/assets/game/player/misa-front-walk.001.png": {
|
|
25866
26603
|
"type": "image/png",
|
|
25867
|
-
"etag": "\"155-
|
|
26604
|
+
"etag": "\"155-r/wKRG+amQ/2TvYolFC2UPXHdC4\"",
|
|
25868
26605
|
"mtime": "2026-08-25T12:20:54.515Z",
|
|
25869
26606
|
"size": 341,
|
|
25870
|
-
"path": "../public/assets/game/player/misa-front-walk.
|
|
26607
|
+
"path": "../public/assets/game/player/misa-front-walk.001.png"
|
|
25871
26608
|
},
|
|
25872
26609
|
"/assets/game/player/misa-front.png": {
|
|
25873
26610
|
"type": "image/png",
|
|
@@ -25925,13 +26662,6 @@ const assets = {
|
|
|
25925
26662
|
"size": 302,
|
|
25926
26663
|
"path": "../public/assets/game/player/misa-right-walk.001.png"
|
|
25927
26664
|
},
|
|
25928
|
-
"/assets/game/player/misa-right-walk.002.png": {
|
|
25929
|
-
"type": "image/png",
|
|
25930
|
-
"etag": "\"12f-3fV+VP6QPPPljfYuG6yhztcSIXc\"",
|
|
25931
|
-
"mtime": "2026-08-25T12:20:54.517Z",
|
|
25932
|
-
"size": 303,
|
|
25933
|
-
"path": "../public/assets/game/player/misa-right-walk.002.png"
|
|
25934
|
-
},
|
|
25935
26665
|
"/assets/game/player/misa-right-walk.003.png": {
|
|
25936
26666
|
"type": "image/png",
|
|
25937
26667
|
"etag": "\"12e-1Tf+ktOQnj4YEenOBQ+4j9KNxVQ\"",
|
|
@@ -25939,6 +26669,13 @@ const assets = {
|
|
|
25939
26669
|
"size": 302,
|
|
25940
26670
|
"path": "../public/assets/game/player/misa-right-walk.003.png"
|
|
25941
26671
|
},
|
|
26672
|
+
"/assets/game/player/misa-right-walk.002.png": {
|
|
26673
|
+
"type": "image/png",
|
|
26674
|
+
"etag": "\"12f-3fV+VP6QPPPljfYuG6yhztcSIXc\"",
|
|
26675
|
+
"mtime": "2026-08-25T12:20:54.517Z",
|
|
26676
|
+
"size": 303,
|
|
26677
|
+
"path": "../public/assets/game/player/misa-right-walk.002.png"
|
|
26678
|
+
},
|
|
25942
26679
|
"/assets/game/player/misa-right.png": {
|
|
25943
26680
|
"type": "image/png",
|
|
25944
26681
|
"etag": "\"12e-u2oP2dt8nlrp15zVNaNSSzpBs0Y\"",
|
|
@@ -25946,48 +26683,6 @@ const assets = {
|
|
|
25946
26683
|
"size": 302,
|
|
25947
26684
|
"path": "../public/assets/game/player/misa-right.png"
|
|
25948
26685
|
},
|
|
25949
|
-
"/assets/game/npc/boltnu-sheet.png": {
|
|
25950
|
-
"type": "image/png",
|
|
25951
|
-
"etag": "\"a14-8xg90l10OuRoiEEgFXx9PTGJ9rA\"",
|
|
25952
|
-
"mtime": "2026-08-25T12:20:54.513Z",
|
|
25953
|
-
"size": 2580,
|
|
25954
|
-
"path": "../public/assets/game/npc/boltnu-sheet.png"
|
|
25955
|
-
},
|
|
25956
|
-
"/assets/game/npc/rockitten-sheet.png": {
|
|
25957
|
-
"type": "image/png",
|
|
25958
|
-
"etag": "\"786-IY4LCl37+SB6pnPynapoUxsxvOM\"",
|
|
25959
|
-
"mtime": "2026-08-25T12:20:54.513Z",
|
|
25960
|
-
"size": 1926,
|
|
25961
|
-
"path": "../public/assets/game/npc/rockitten-sheet.png"
|
|
25962
|
-
},
|
|
25963
|
-
"/assets/game/npc/fluttaflap-sheet.png": {
|
|
25964
|
-
"type": "image/png",
|
|
25965
|
-
"etag": "\"f65-ivBz79RSNtXu3px7cWEzCwMXdkg\"",
|
|
25966
|
-
"mtime": "2026-08-25T12:20:54.513Z",
|
|
25967
|
-
"size": 3941,
|
|
25968
|
-
"path": "../public/assets/game/npc/fluttaflap-sheet.png"
|
|
25969
|
-
},
|
|
25970
|
-
"/assets/game/npc/tux-sheet.png": {
|
|
25971
|
-
"type": "image/png",
|
|
25972
|
-
"etag": "\"912-kf4+Q7EukO60VT6vlziy5RrzuUo\"",
|
|
25973
|
-
"mtime": "2026-08-25T12:20:54.513Z",
|
|
25974
|
-
"size": 2322,
|
|
25975
|
-
"path": "../public/assets/game/npc/tux-sheet.png"
|
|
25976
|
-
},
|
|
25977
|
-
"/assets/game/wuwa/world-far.png": {
|
|
25978
|
-
"type": "image/png",
|
|
25979
|
-
"etag": "\"6b391-DRcUWDyPUwUxDpAWplDh9StwdO0\"",
|
|
25980
|
-
"mtime": "2026-08-25T12:20:54.522Z",
|
|
25981
|
-
"size": 439185,
|
|
25982
|
-
"path": "../public/assets/game/wuwa/world-far.png"
|
|
25983
|
-
},
|
|
25984
|
-
"/assets/game/wuwa/scene-map.png": {
|
|
25985
|
-
"type": "image/png",
|
|
25986
|
-
"etag": "\"682db-bU8mh8SeHPotvuaCc6PZzrWoT+A\"",
|
|
25987
|
-
"mtime": "2026-08-25T12:20:54.521Z",
|
|
25988
|
-
"size": 426715,
|
|
25989
|
-
"path": "../public/assets/game/wuwa/scene-map.png"
|
|
25990
|
-
},
|
|
25991
26686
|
"/assets/game/wuwa/world-middle.png": {
|
|
25992
26687
|
"type": "image/png",
|
|
25993
26688
|
"etag": "\"16164-Dxu+NdXPnqoPFfWHwQi1oefgNvU\"",
|
|
@@ -26002,12 +26697,19 @@ const assets = {
|
|
|
26002
26697
|
"size": 8277,
|
|
26003
26698
|
"path": "../public/assets/game/wuwa/wu-aura.png"
|
|
26004
26699
|
},
|
|
26005
|
-
"/assets/game/wuwa/
|
|
26700
|
+
"/assets/game/wuwa/scene-map.png": {
|
|
26006
26701
|
"type": "image/png",
|
|
26007
|
-
"etag": "\"
|
|
26008
|
-
"mtime": "2026-08-25T12:20:54.
|
|
26009
|
-
"size":
|
|
26010
|
-
"path": "../public/assets/game/wuwa/
|
|
26702
|
+
"etag": "\"682db-bU8mh8SeHPotvuaCc6PZzrWoT+A\"",
|
|
26703
|
+
"mtime": "2026-08-25T12:20:54.521Z",
|
|
26704
|
+
"size": 426715,
|
|
26705
|
+
"path": "../public/assets/game/wuwa/scene-map.png"
|
|
26706
|
+
},
|
|
26707
|
+
"/assets/game/wuwa/world-far.png": {
|
|
26708
|
+
"type": "image/png",
|
|
26709
|
+
"etag": "\"6b391-DRcUWDyPUwUxDpAWplDh9StwdO0\"",
|
|
26710
|
+
"mtime": "2026-08-25T12:20:54.522Z",
|
|
26711
|
+
"size": 439185,
|
|
26712
|
+
"path": "../public/assets/game/wuwa/world-far.png"
|
|
26011
26713
|
},
|
|
26012
26714
|
"/assets/game/wuwa/wu-lead.png": {
|
|
26013
26715
|
"type": "image/png",
|
|
@@ -26016,6 +26718,13 @@ const assets = {
|
|
|
26016
26718
|
"size": 15108,
|
|
26017
26719
|
"path": "../public/assets/game/wuwa/wu-lead.png"
|
|
26018
26720
|
},
|
|
26721
|
+
"/assets/game/wuwa/wu-ring.png": {
|
|
26722
|
+
"type": "image/png",
|
|
26723
|
+
"etag": "\"65ac-/iIjlPgFNpD98zDsyCJYA8021E4\"",
|
|
26724
|
+
"mtime": "2026-08-25T12:20:54.527Z",
|
|
26725
|
+
"size": 26028,
|
|
26726
|
+
"path": "../public/assets/game/wuwa/wu-ring.png"
|
|
26727
|
+
},
|
|
26019
26728
|
"/assets/game/wuwa/wu-slash.png": {
|
|
26020
26729
|
"type": "image/png",
|
|
26021
26730
|
"etag": "\"185-fVjcllSJOBMFcBWLIgBzTrzWGaY\"",
|
|
@@ -26023,13 +26732,6 @@ const assets = {
|
|
|
26023
26732
|
"size": 389,
|
|
26024
26733
|
"path": "../public/assets/game/wuwa/wu-slash.png"
|
|
26025
26734
|
},
|
|
26026
|
-
"/assets/game/wuwa/wu-worker-1.png": {
|
|
26027
|
-
"type": "image/png",
|
|
26028
|
-
"etag": "\"3cc8-0XoRr5qFC7X+vEEX+XrX4cRX+D0\"",
|
|
26029
|
-
"mtime": "2026-08-25T12:20:54.529Z",
|
|
26030
|
-
"size": 15560,
|
|
26031
|
-
"path": "../public/assets/game/wuwa/wu-worker-1.png"
|
|
26032
|
-
},
|
|
26033
26735
|
"/assets/game/wuwa/wu-worker-0.png": {
|
|
26034
26736
|
"type": "image/png",
|
|
26035
26737
|
"etag": "\"3c59-fILvgyTv9TKRgrI9GQlRhaSR96U\"",
|
|
@@ -26037,6 +26739,13 @@ const assets = {
|
|
|
26037
26739
|
"size": 15449,
|
|
26038
26740
|
"path": "../public/assets/game/wuwa/wu-worker-0.png"
|
|
26039
26741
|
},
|
|
26742
|
+
"/assets/game/wuwa/wu-worker-1.png": {
|
|
26743
|
+
"type": "image/png",
|
|
26744
|
+
"etag": "\"3cc8-0XoRr5qFC7X+vEEX+XrX4cRX+D0\"",
|
|
26745
|
+
"mtime": "2026-08-25T12:20:54.529Z",
|
|
26746
|
+
"size": 15560,
|
|
26747
|
+
"path": "../public/assets/game/wuwa/wu-worker-1.png"
|
|
26748
|
+
},
|
|
26040
26749
|
"/assets/game/wuwa/wu-worker-2.png": {
|
|
26041
26750
|
"type": "image/png",
|
|
26042
26751
|
"etag": "\"3c81-6qd4LQS0v2L4rTa0XAmekluER7c\"",
|
|
@@ -26044,12 +26753,12 @@ const assets = {
|
|
|
26044
26753
|
"size": 15489,
|
|
26045
26754
|
"path": "../public/assets/game/wuwa/wu-worker-2.png"
|
|
26046
26755
|
},
|
|
26047
|
-
"/_nuxt/builds/meta/
|
|
26756
|
+
"/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json": {
|
|
26048
26757
|
"type": "application/json",
|
|
26049
|
-
"etag": "\"58-
|
|
26050
|
-
"mtime": "2026-09-
|
|
26758
|
+
"etag": "\"58-0hRGfGurnK/hj51yHgmkUwC+Y4U\"",
|
|
26759
|
+
"mtime": "2026-09-02T12:06:05.932Z",
|
|
26051
26760
|
"size": 88,
|
|
26052
|
-
"path": "../public/_nuxt/builds/meta/
|
|
26761
|
+
"path": "../public/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json"
|
|
26053
26762
|
},
|
|
26054
26763
|
"/assets/game/wuwa/world-near.png": {
|
|
26055
26764
|
"type": "image/png",
|