agentworkshop 0.5.4 → 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 +1936 -1195
- 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/cli/commands/start.mjs +2 -2
- package/package.json +1 -1
- package/scripts/_dbg-cross-channel-e2e.mjs +157 -0
- package/scripts/_dbg-prompts-resolve-test.ts +39 -0
- package/scripts/start.mjs +2 -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 +110 -88
- package/server/data/dcw-lines.json +21 -0
- package/server/data/dcw-products.json +21 -0
- package/server/data/dcw-recipes.json +28 -0
- package/server/data/dcw-rollback.json +260 -1
- package/server/data/dcw-runs.json +81 -54
- package/server/data/dcw-writes.json +108 -0
- package/server/data/dcws.json +63 -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 +64 -10
- 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/70bd10c7-55cf-4e49-94de-8aa1b9edf33a.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);
|
|
@@ -15111,12 +15180,44 @@ function respondUi(session, response) {
|
|
|
15111
15180
|
}
|
|
15112
15181
|
|
|
15113
15182
|
const cache = /* @__PURE__ */ new Map();
|
|
15183
|
+
function packagedPromptsDir() {
|
|
15184
|
+
const packageRoot = process.env.AW_PACKAGE_ROOT ? resolve$1(process.env.AW_PACKAGE_ROOT) : resolve$1(dirname$1(fileURLToPath(globalThis._importMeta_.url)), "../../../..");
|
|
15185
|
+
const candidate = join(packageRoot, ".AgentWorkShop", "prompts");
|
|
15186
|
+
return existsSync(candidate) ? candidate : null;
|
|
15187
|
+
}
|
|
15188
|
+
function seedHomePrompts(homePrompts) {
|
|
15189
|
+
const src = packagedPromptsDir();
|
|
15190
|
+
if (!src || resolve$1(src) === resolve$1(homePrompts)) return;
|
|
15191
|
+
mkdirSync(homePrompts, { recursive: true });
|
|
15192
|
+
let seeded = 0;
|
|
15193
|
+
for (const f of readdirSync(src)) {
|
|
15194
|
+
const dst = join(homePrompts, f);
|
|
15195
|
+
if (existsSync(dst)) continue;
|
|
15196
|
+
try {
|
|
15197
|
+
copyFileSync(join(src, f), dst);
|
|
15198
|
+
seeded++;
|
|
15199
|
+
} catch {
|
|
15200
|
+
}
|
|
15201
|
+
}
|
|
15202
|
+
if (seeded > 0) console.log(`[prompts] \u5DF2\u5411 ${homePrompts} \u8865\u79CD ${seeded} \u4E2A\u63D0\u793A\u8BCD\u6587\u4EF6`);
|
|
15203
|
+
}
|
|
15114
15204
|
function promptsDir() {
|
|
15115
|
-
|
|
15116
|
-
|
|
15117
|
-
|
|
15205
|
+
if (process.env.AW_PROMPTS_DIR) {
|
|
15206
|
+
const base = resolve$1(process.env.AW_PROMPTS_DIR);
|
|
15207
|
+
if (!existsSync(base)) {
|
|
15208
|
+
throw new AppError(500, "PROMPTS_DIR_MISSING", `prompts \u76EE\u5F55\u4E0D\u5B58\u5728: ${base}(AW_PROMPTS_DIR \u6307\u5B9A)`);
|
|
15209
|
+
}
|
|
15210
|
+
return base;
|
|
15211
|
+
}
|
|
15212
|
+
const homePrompts = join(awHome(process.env), "prompts");
|
|
15213
|
+
seedHomePrompts(homePrompts);
|
|
15214
|
+
const localConfigRoot = findLocalConfigRoot(process.cwd());
|
|
15215
|
+
if (localConfigRoot) {
|
|
15216
|
+
const candidate = join(localConfigRoot, "prompts");
|
|
15217
|
+
if (existsSync(candidate)) return candidate;
|
|
15118
15218
|
}
|
|
15119
|
-
return
|
|
15219
|
+
if (existsSync(homePrompts)) return homePrompts;
|
|
15220
|
+
throw new AppError(500, "PROMPTS_DIR_MISSING", `prompts \u76EE\u5F55\u4E0D\u5B58\u5728(\u5DF2\u5C1D\u8BD5\u81EA\u52A8\u64AD\u79CD): ${homePrompts};\u53EF\u7528 AW_PROMPTS_DIR \u6307\u5B9A`);
|
|
15120
15221
|
}
|
|
15121
15222
|
function loadPrompt(name) {
|
|
15122
15223
|
const file = join(promptsDir(), `${name}.md`);
|
|
@@ -18980,159 +19081,843 @@ ${anchorLines.join("\n")}` : ""}
|
|
|
18980
19081
|
var __defProp$7 = Object.defineProperty;
|
|
18981
19082
|
var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
18982
19083
|
var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
18983
|
-
const
|
|
18984
|
-
const
|
|
18985
|
-
const
|
|
18986
|
-
|
|
18987
|
-
|
|
18988
|
-
|
|
18989
|
-
|
|
18990
|
-
|
|
18991
|
-
|
|
18992
|
-
|
|
18993
|
-
|
|
18994
|
-
|
|
18995
|
-
|
|
18996
|
-
|
|
18997
|
-
|
|
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;
|
|
18998
19109
|
}
|
|
18999
|
-
function
|
|
19000
|
-
return
|
|
19001
|
-
if ("text" in p) return p.text;
|
|
19002
|
-
if ("data" in p) return JSON.stringify(p.data);
|
|
19003
|
-
if ("url" in p) return p.url;
|
|
19004
|
-
if ("raw" in p) return p.raw;
|
|
19005
|
-
return "";
|
|
19006
|
-
}).join("\n");
|
|
19110
|
+
function segmentCJK(text) {
|
|
19111
|
+
return text.replace(/[\u4e00-\u9fff]+/g, (run) => ` ${run.split("").join(" ")} `);
|
|
19007
19112
|
}
|
|
19008
|
-
function
|
|
19009
|
-
|
|
19010
|
-
const
|
|
19011
|
-
const
|
|
19012
|
-
const
|
|
19013
|
-
|
|
19014
|
-
|
|
19015
|
-
|
|
19016
|
-
|
|
19017
|
-
const
|
|
19018
|
-
if (
|
|
19019
|
-
|
|
19020
|
-
}
|
|
19021
|
-
const
|
|
19022
|
-
|
|
19023
|
-
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;
|
|
19024
19128
|
}
|
|
19025
|
-
function
|
|
19026
|
-
|
|
19027
|
-
|
|
19028
|
-
|
|
19029
|
-
if (Array.isArray(parsed)) return parsed;
|
|
19030
|
-
return null;
|
|
19031
|
-
} catch {
|
|
19032
|
-
}
|
|
19033
|
-
const start = trimmed.indexOf("[");
|
|
19034
|
-
const end = trimmed.lastIndexOf("]");
|
|
19035
|
-
if (start >= 0 && end > start) {
|
|
19036
|
-
try {
|
|
19037
|
-
const parsed = JSON.parse(trimmed.slice(start, end + 1));
|
|
19038
|
-
if (Array.isArray(parsed)) return parsed;
|
|
19039
|
-
} catch {
|
|
19040
|
-
}
|
|
19041
|
-
}
|
|
19042
|
-
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;
|
|
19043
19133
|
}
|
|
19044
|
-
|
|
19045
|
-
|
|
19046
|
-
|
|
19047
|
-
|
|
19048
|
-
|
|
19049
|
-
|
|
19050
|
-
|
|
19051
|
-
|
|
19052
|
-
|
|
19053
|
-
|
|
19054
|
-
|
|
19055
|
-
|
|
19056
|
-
|
|
19057
|
-
|
|
19058
|
-
|
|
19059
|
-
|
|
19060
|
-
__publicField$7(this, "
|
|
19061
|
-
|
|
19062
|
-
__publicField$7(this, "
|
|
19063
|
-
|
|
19064
|
-
|
|
19065
|
-
__publicField$7(this, "
|
|
19066
|
-
|
|
19067
|
-
|
|
19068
|
-
/**
|
|
19069
|
-
* 当前待回执的触发上下文(自动关联兜底):
|
|
19070
|
-
* LLM 偶发省略 in_reply_to 参数 → 平台在 send_message_to_agent 时按上下文自动盖章,
|
|
19071
|
-
* 保证触发器回执关联契约不依赖模型传参纪律。
|
|
19072
|
-
*/
|
|
19073
|
-
__publicField$7(this, "replyContext", null);
|
|
19074
|
-
// ===== 团队名册(roster):全成员名单 + 专长,注入每个回合 =====
|
|
19075
|
-
/** 名册缓存(null = 待刷新);30s TTL——任何成员的增删改都会及时反映到名单 */
|
|
19076
|
-
__publicField$7(this, "rosterCache", null);
|
|
19077
|
-
__publicField$7(this, "rosterAt", 0);
|
|
19078
|
-
// ===== supervise() =====
|
|
19079
|
-
/** supervise 单飞守卫:同一 client 不并发 LLM 回合(残留回合与下一 prompt 混流的根因) */
|
|
19080
|
-
__publicField$7(this, "supervising", false);
|
|
19081
|
-
var _a, _b, _c, _d;
|
|
19082
|
-
this.config = config;
|
|
19083
|
-
this.selfAgentId = (_a = this.config.agentId) != null ? _a : "";
|
|
19084
|
-
this.agentName = (_b = this.config.name) != null ? _b : "agent";
|
|
19085
|
-
this.agentRole = (_c = this.config.role) != null ? _c : "worker";
|
|
19086
|
-
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;
|
|
19087
19158
|
}
|
|
19088
|
-
|
|
19089
|
-
|
|
19090
|
-
|
|
19091
|
-
this.
|
|
19092
|
-
this.
|
|
19093
|
-
this.
|
|
19094
|
-
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;
|
|
19095
19165
|
}
|
|
19096
|
-
|
|
19097
|
-
|
|
19098
|
-
|
|
19099
|
-
|
|
19100
|
-
|
|
19101
|
-
|
|
19102
|
-
|
|
19103
|
-
|
|
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 {
|
|
19104
19210
|
}
|
|
19105
19211
|
}
|
|
19106
|
-
|
|
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;
|
|
19107
19227
|
}
|
|
19108
|
-
/**
|
|
19109
|
-
|
|
19110
|
-
const
|
|
19111
|
-
const
|
|
19112
|
-
|
|
19113
|
-
|
|
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);
|
|
19114
19239
|
}
|
|
19115
|
-
/**
|
|
19116
|
-
|
|
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 = {}) {
|
|
19117
19248
|
var _a, _b;
|
|
19118
|
-
const
|
|
19119
|
-
|
|
19120
|
-
|
|
19121
|
-
|
|
19122
|
-
|
|
19123
|
-
|
|
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);
|
|
19124
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");
|
|
19125
19319
|
}
|
|
19126
19320
|
/**
|
|
19127
|
-
*
|
|
19128
|
-
*
|
|
19129
|
-
*
|
|
19321
|
+
* 工具按需抓取(search_memory):结构化片段返回,content 还原为未切分原文。
|
|
19322
|
+
* 触发 touch(access_count 强化后续召回排序);limit 上限防御;
|
|
19323
|
+
* relatedTaskIds 透传任务关联加权(与 recall 同源排序)。
|
|
19130
19324
|
*/
|
|
19131
|
-
|
|
19132
|
-
var _a;
|
|
19133
|
-
(_a =
|
|
19134
|
-
|
|
19135
|
-
|
|
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 对话框) */
|
|
19136
19921
|
get rpcMode() {
|
|
19137
19922
|
return this.config.rpcMode === "rpc" ? "rpc" : "rpc-ui";
|
|
19138
19923
|
}
|
|
@@ -19263,6 +20048,7 @@ ${identity}`,
|
|
|
19263
20048
|
await this.ensureClient(ctx);
|
|
19264
20049
|
if (!this.client) return [];
|
|
19265
20050
|
if (this.supervising) return [];
|
|
20051
|
+
await this.contextGate("supervise");
|
|
19266
20052
|
const prompt = await this.buildSupervisePrompt(snapshot, ctx.memory);
|
|
19267
20053
|
const timeoutMs = (_a = this.config.superviseTimeoutMs) != null ? _a : 15e4;
|
|
19268
20054
|
return new Promise((resolve) => {
|
|
@@ -19352,7 +20138,7 @@ ${identity}`,
|
|
|
19352
20138
|
* 回给发送者:执行结果 + 对方所需内容,in_reply_to 关联原消息,并声明是否需再响应。
|
|
19353
20139
|
*/
|
|
19354
20140
|
async *peerMessageRun(request, ctx) {
|
|
19355
|
-
var _a, _b, _c, _d, _e, _f;
|
|
20141
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
19356
20142
|
try {
|
|
19357
20143
|
await this.ensureClient(ctx);
|
|
19358
20144
|
} catch (err) {
|
|
@@ -19374,9 +20160,11 @@ ${identity}`,
|
|
|
19374
20160
|
const msgText = partsToText$1(msg.parts);
|
|
19375
20161
|
const requireReply = ((_d = msg.metadata) == null ? void 0 : _d["x-aw-require-reply"]) === "true";
|
|
19376
20162
|
const isReply = typeof ((_e = msg.metadata) == null ? void 0 : _e["x-aw-in-reply-to"]) === "string";
|
|
19377
|
-
|
|
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;
|
|
19378
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}).`;
|
|
19379
|
-
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", {
|
|
19380
20168
|
fromId,
|
|
19381
20169
|
messageId: msg.messageId
|
|
19382
20170
|
});
|
|
@@ -19384,7 +20172,7 @@ ${identity}`,
|
|
|
19384
20172
|
fromId,
|
|
19385
20173
|
messageId: msg.messageId,
|
|
19386
20174
|
requireReply,
|
|
19387
|
-
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"])}` : "",
|
|
19388
20176
|
msgText,
|
|
19389
20177
|
respondBlock
|
|
19390
20178
|
});
|
|
@@ -19417,6 +20205,7 @@ ${identity}`,
|
|
|
19417
20205
|
if (!client) {
|
|
19418
20206
|
throw new Error("omp \u5BA2\u6237\u7AEF\u672A\u5C31\u7EEA");
|
|
19419
20207
|
}
|
|
20208
|
+
await this.contextGate("pre-prompt");
|
|
19420
20209
|
const queue = [];
|
|
19421
20210
|
let resolveWait = null;
|
|
19422
20211
|
let isDone = false;
|
|
@@ -19573,7 +20362,7 @@ ${identity}`,
|
|
|
19573
20362
|
}
|
|
19574
20363
|
// ===== 内部:omp 事件 → AgentEvent 映射 =====
|
|
19575
20364
|
mapOmpEvent(event, taskId) {
|
|
19576
|
-
var _a, _b, _c, _d;
|
|
20365
|
+
var _a, _b, _c, _d, _e;
|
|
19577
20366
|
switch (event.type) {
|
|
19578
20367
|
case "agent_start":
|
|
19579
20368
|
return [{
|
|
@@ -19656,10 +20445,30 @@ ${identity}`,
|
|
|
19656
20445
|
kind: "error",
|
|
19657
20446
|
error: { code: "OMP_PROCESS_EXIT", message: "omp \u5B50\u8FDB\u7A0B\u610F\u5916\u9000\u51FA" }
|
|
19658
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 [];
|
|
19659
20468
|
case "__error__":
|
|
19660
20469
|
return [{
|
|
19661
20470
|
kind: "error",
|
|
19662
|
-
error: { code: "OMP_ERROR", message: (
|
|
20471
|
+
error: { code: "OMP_ERROR", message: (_e = event.error) != null ? _e : "omp \u672A\u77E5\u9519\u8BEF" }
|
|
19663
20472
|
}];
|
|
19664
20473
|
default:
|
|
19665
20474
|
return [];
|
|
@@ -19859,16 +20668,39 @@ ${identity}`,
|
|
|
19859
20668
|
}
|
|
19860
20669
|
if (this.config.provider || this.config.model) {
|
|
19861
20670
|
try {
|
|
19862
|
-
await client.send({
|
|
20671
|
+
await client.send({
|
|
20672
|
+
type: "set_model",
|
|
20673
|
+
provider: this.config.provider,
|
|
20674
|
+
modelId: this.config.model
|
|
20675
|
+
});
|
|
19863
20676
|
} catch {
|
|
19864
20677
|
}
|
|
19865
20678
|
}
|
|
19866
20679
|
client.onHostToolCall((req) => this.handleHostTool(req));
|
|
19867
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
|
+
});
|
|
19868
20685
|
this.client = client;
|
|
19869
20686
|
this.hostToolsRegistered = true;
|
|
19870
20687
|
}
|
|
19871
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
|
+
}
|
|
19872
20704
|
// ===== 内部:host tool handler(workspace 桥接) =====
|
|
19873
20705
|
async handleHostTool(req) {
|
|
19874
20706
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
@@ -19962,10 +20794,27 @@ ${identity}`,
|
|
|
19962
20794
|
metadata["x-aw-in-reply-to"] = inReplyTo;
|
|
19963
20795
|
if (priority === "task") priority = "immediate";
|
|
19964
20796
|
}
|
|
19965
|
-
metadata["x-aw-msg-priority"] = priority;
|
|
19966
|
-
const sent = await ws.sendMessage({ toAgentId, parts: [{ text: message }], metadata });
|
|
19967
|
-
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)" : "";
|
|
19968
|
-
return { text: `\u6D88\u606F ${sent.messageId.slice(0, 8)}\u2026 \u5DF2\u53D1\u9001\u7ED9 ${toAgentId}(priority=${priority})${triggerNote}` };
|
|
20797
|
+
metadata["x-aw-msg-priority"] = priority;
|
|
20798
|
+
const sent = await ws.sendMessage({ toAgentId, parts: [{ text: message }], metadata });
|
|
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)" : "";
|
|
20800
|
+
return { text: `\u6D88\u606F ${sent.messageId.slice(0, 8)}\u2026 \u5DF2\u53D1\u9001\u7ED9 ${toAgentId}(priority=${priority})${triggerNote}` };
|
|
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
|
+
}
|
|
19969
20818
|
}
|
|
19970
20819
|
case "refuse_task": {
|
|
19971
20820
|
const taskId = req.arguments.task_id;
|
|
@@ -20229,13 +21078,13 @@ ${lines.join("\n")}` };
|
|
|
20229
21078
|
}
|
|
20230
21079
|
}
|
|
20231
21080
|
|
|
20232
|
-
var __defProp$
|
|
20233
|
-
var __defNormalProp$
|
|
20234
|
-
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);
|
|
20235
21084
|
class ClaudeSdkAgentImpl {
|
|
20236
21085
|
constructor(config = {}) {
|
|
20237
|
-
__publicField$
|
|
20238
|
-
__publicField$
|
|
21086
|
+
__publicField$5(this, "apiKey");
|
|
21087
|
+
__publicField$5(this, "model");
|
|
20239
21088
|
this.apiKey = typeof config.apiKey === "string" ? config.apiKey : void 0;
|
|
20240
21089
|
this.model = typeof config.model === "string" ? config.model : void 0;
|
|
20241
21090
|
}
|
|
@@ -20269,40 +21118,40 @@ const TERMINAL_TASK_STATES = {
|
|
|
20269
21118
|
CANCELED: true
|
|
20270
21119
|
};
|
|
20271
21120
|
|
|
20272
|
-
var __defProp$
|
|
20273
|
-
var __defNormalProp$
|
|
20274
|
-
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);
|
|
20275
21124
|
const log$4 = createLogger("workshop.agent-runtime");
|
|
20276
21125
|
function partsToText(parts) {
|
|
20277
21126
|
return parts.map((p) => "text" in p ? p.text : "").filter(Boolean).join("\n");
|
|
20278
21127
|
}
|
|
20279
21128
|
class AgentRuntime {
|
|
20280
21129
|
constructor(agent, impl, deps) {
|
|
20281
|
-
__publicField$
|
|
20282
|
-
__publicField$
|
|
20283
|
-
__publicField$
|
|
20284
|
-
__publicField$
|
|
20285
|
-
__publicField$
|
|
20286
|
-
__publicField$
|
|
20287
|
-
__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");
|
|
20288
21137
|
/** 回合失败重投计数(每消息;进程内存,重启由 resetConsuming 重新给机会) */
|
|
20289
|
-
__publicField$
|
|
21138
|
+
__publicField$4(this, "runErrorRetries", /* @__PURE__ */ new Map());
|
|
20290
21139
|
/** 正在执行的任务 id(run 期间;空闲时 null) */
|
|
20291
|
-
__publicField$
|
|
21140
|
+
__publicField$4(this, "currentTaskId", null);
|
|
20292
21141
|
/** poll_messages 阻塞等待数(waitPending 活动计数;>0 = 有轮询在等,实时消息留信箱由其取走) */
|
|
20293
|
-
__publicField$
|
|
21142
|
+
__publicField$4(this, "pollWaiters", 0);
|
|
20294
21143
|
/** run 与 supervise 互斥锁(promise 链) */
|
|
20295
|
-
__publicField$
|
|
20296
|
-
__publicField$
|
|
20297
|
-
__publicField$
|
|
20298
|
-
__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);
|
|
20299
21148
|
/**
|
|
20300
21149
|
* lead 调度决策(供 SchedulerLoop 调用):转发 impl.supervise。
|
|
20301
21150
|
* 未实现 supervise 时返回 null(调用方回退内置规则引擎);
|
|
20302
21151
|
* 与 run 的互斥由调用方通过 withExecLock 保证。
|
|
20303
21152
|
*/
|
|
20304
21153
|
/** 当前 supervise 回合的控制器(abortCurrent 经此打断 LLM 调度回合) */
|
|
20305
|
-
__publicField$
|
|
21154
|
+
__publicField$4(this, "superviseController", null);
|
|
20306
21155
|
this.agentId = agent.id;
|
|
20307
21156
|
this.role = agent.role;
|
|
20308
21157
|
this.channelId = agent.channelId;
|
|
@@ -20315,23 +21164,25 @@ class AgentRuntime {
|
|
|
20315
21164
|
getState() {
|
|
20316
21165
|
return this.state;
|
|
20317
21166
|
}
|
|
20318
|
-
/** 实时状态视图:idle/busy/stopped + 当前任务 +
|
|
21167
|
+
/** 实时状态视图:idle/busy/stopped + 当前任务 + 队列 + harness 上下文用量 */
|
|
20319
21168
|
getStatus() {
|
|
20320
|
-
var _a, _b, _c;
|
|
21169
|
+
var _a, _b, _c, _d, _e, _f;
|
|
20321
21170
|
const queue = this.getQueueView();
|
|
20322
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;
|
|
20323
21173
|
return {
|
|
20324
21174
|
agentId: this.agentId,
|
|
20325
21175
|
channelId: this.channelId,
|
|
20326
21176
|
role: this.role,
|
|
20327
21177
|
name: this.name,
|
|
20328
21178
|
state: this.state,
|
|
20329
|
-
currentTaskId: (
|
|
21179
|
+
currentTaskId: (_e = current == null ? void 0 : current.id) != null ? _e : null,
|
|
20330
21180
|
// 进度/标题透出:lead 观察 worker 是否在推进(progress 空闲/未上报时为 null)
|
|
20331
|
-
currentTaskTitle: (
|
|
21181
|
+
currentTaskTitle: (_f = current == null ? void 0 : current.title) != null ? _f : null,
|
|
20332
21182
|
currentTaskProgress: (current == null ? void 0 : current.progress) != null ? current.progress : null,
|
|
20333
21183
|
queuedCount: queue.queued.length,
|
|
20334
|
-
completedCount: queue.completed.length
|
|
21184
|
+
completedCount: queue.completed.length,
|
|
21185
|
+
...context ? { context } : {}
|
|
20335
21186
|
};
|
|
20336
21187
|
}
|
|
20337
21188
|
/** 本 agent 的任务队列视图(自己的任务管理系统:待执行 FIFO / 执行中 / 已完成) */
|
|
@@ -20521,6 +21372,7 @@ class AgentRuntime {
|
|
|
20521
21372
|
return await this.impl.supervise(snapshot, ctx, { signal: controller.signal });
|
|
20522
21373
|
} finally {
|
|
20523
21374
|
if (this.superviseController === controller) this.superviseController = null;
|
|
21375
|
+
this.maybePostSettle();
|
|
20524
21376
|
}
|
|
20525
21377
|
}
|
|
20526
21378
|
/**
|
|
@@ -20584,7 +21436,9 @@ class AgentRuntime {
|
|
|
20584
21436
|
this.abortController = new AbortController();
|
|
20585
21437
|
let memoryBlock;
|
|
20586
21438
|
try {
|
|
20587
|
-
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;
|
|
20588
21442
|
} catch (err) {
|
|
20589
21443
|
log$4.error(`[AgentRuntime:${this.agentId}] \u8BB0\u5FC6\u53EC\u56DE\u5931\u8D25:`, err);
|
|
20590
21444
|
}
|
|
@@ -20699,19 +21553,54 @@ class AgentRuntime {
|
|
|
20699
21553
|
this.runErrorRetries.delete(msg.messageId);
|
|
20700
21554
|
this.deps.mailbox.markConsumed(msg.messageId);
|
|
20701
21555
|
}
|
|
21556
|
+
this.maybePostSettle();
|
|
20702
21557
|
}
|
|
20703
21558
|
}
|
|
20704
|
-
/** 状态通知的队列上下文(
|
|
21559
|
+
/** 状态通知的队列上下文(实时:当前任务/待执行数/已完成数/harness 上下文用量) */
|
|
20705
21560
|
queueContext() {
|
|
21561
|
+
var _a;
|
|
20706
21562
|
const status = this.getStatus();
|
|
20707
21563
|
return {
|
|
20708
21564
|
currentTaskId: status.currentTaskId,
|
|
20709
21565
|
currentTaskTitle: status.currentTaskTitle,
|
|
20710
21566
|
currentTaskProgress: status.currentTaskProgress,
|
|
20711
21567
|
queuedCount: status.queuedCount,
|
|
20712
|
-
completedCount: status.completedCount
|
|
21568
|
+
completedCount: status.completedCount,
|
|
21569
|
+
context: (_a = status.context) != null ? _a : null
|
|
20713
21570
|
};
|
|
20714
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
|
+
}
|
|
20715
21604
|
toRequest(msg, memory) {
|
|
20716
21605
|
var _a, _b;
|
|
20717
21606
|
return {
|
|
@@ -20729,20 +21618,20 @@ class AgentRuntime {
|
|
|
20729
21618
|
}
|
|
20730
21619
|
}
|
|
20731
21620
|
|
|
20732
|
-
var __defProp$
|
|
20733
|
-
var __defNormalProp$
|
|
20734
|
-
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);
|
|
20735
21624
|
const log$3 = createLogger("workshop.channel");
|
|
20736
21625
|
class ChannelRuntime {
|
|
20737
21626
|
constructor(channelId, deps, onRouted = () => {
|
|
20738
21627
|
}) {
|
|
20739
|
-
__publicField$
|
|
20740
|
-
__publicField$
|
|
20741
|
-
__publicField$
|
|
20742
|
-
__publicField$
|
|
20743
|
-
__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);
|
|
20744
21633
|
/** 懒加载回调(manager 注入);未装配的收件人经此按需 wire */
|
|
20745
|
-
__publicField$
|
|
21634
|
+
__publicField$3(this, "loader", null);
|
|
20746
21635
|
this.channelId = channelId;
|
|
20747
21636
|
}
|
|
20748
21637
|
/** channel 全部 enabled 实例元信息(含未装配;供快照/调度看到完整团队) */
|
|
@@ -20779,10 +21668,13 @@ class ChannelRuntime {
|
|
|
20779
21668
|
return delivered;
|
|
20780
21669
|
}
|
|
20781
21670
|
/**
|
|
20782
|
-
* 信箱守卫(垃圾信息拦截)
|
|
21671
|
+
* 信箱守卫(垃圾信息拦截):四类消息放行,其余直接丢弃(不落库、不投递)——
|
|
20783
21672
|
* ① 平台任务消息(task-kind + 真实存在的任务);
|
|
20784
|
-
* ②
|
|
20785
|
-
*
|
|
21673
|
+
* ② 跨 Channel 消息(x-aw-cross-channel 标记 + 源 channel 注明)——
|
|
21674
|
+
* manager.sendCrossChannelMessage 发送时已校验「发送方=源 channel lead +
|
|
21675
|
+
* 双方同主 + 目标 lead 在册」并盖服务端标记;REST/工具入参无法伪造;
|
|
21676
|
+
* ③ 声明发送人为本 channel 成员的消息(伪造/已移除成员 → 拒);
|
|
21677
|
+
* ④ 人类经 REST 注入的消息(x-aw-from-label 必须非空)。
|
|
20786
21678
|
* 防脏信息注入:无主消息与未知发送人的消息没有回执对象,处理它们只会
|
|
20787
21679
|
* 污染 Agent 上下文,因此拦截并删除。
|
|
20788
21680
|
*/
|
|
@@ -20796,6 +21688,9 @@ class ChannelRuntime {
|
|
|
20796
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`);
|
|
20797
21689
|
return false;
|
|
20798
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
|
+
}
|
|
20799
21694
|
const from = meta["x-aw-from-agent"];
|
|
20800
21695
|
if (typeof from === "string" && from.length > 0) {
|
|
20801
21696
|
const member = this.deps.channelAgents.findByChannelAgent(this.channelId, from);
|
|
@@ -20882,56 +21777,56 @@ class ChannelRuntime {
|
|
|
20882
21777
|
}
|
|
20883
21778
|
}
|
|
20884
21779
|
|
|
20885
|
-
var __defProp$
|
|
20886
|
-
var __defNormalProp$
|
|
20887
|
-
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);
|
|
20888
21783
|
const log$2 = createLogger("workshop.scheduler");
|
|
20889
21784
|
const MAIL_SNAPSHOT_LIMIT = 20;
|
|
20890
21785
|
const IDLE_TICK_CAP_MS = 8e3;
|
|
20891
21786
|
class SchedulerLoop {
|
|
20892
21787
|
constructor(channelRuntime, lead, options = {}) {
|
|
20893
|
-
__publicField$
|
|
20894
|
-
__publicField$
|
|
20895
|
-
__publicField$
|
|
20896
|
-
__publicField$
|
|
20897
|
-
__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");
|
|
20898
21793
|
/** supervise 节流:最小间隔与最近一次执行时刻/信号指纹(token 效率) */
|
|
20899
|
-
__publicField$
|
|
20900
|
-
__publicField$
|
|
20901
|
-
__publicField$
|
|
20902
|
-
__publicField$
|
|
20903
|
-
__publicField$
|
|
20904
|
-
__publicField$
|
|
20905
|
-
__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);
|
|
20906
21801
|
/** 已催办一次的 WORKING 任务(再次停滞 → cancel) */
|
|
20907
|
-
__publicField$
|
|
21802
|
+
__publicField$2(this, "notified", /* @__PURE__ */ new Set());
|
|
20908
21803
|
/** WORKING 任务最近一次 progress 与时间(停滞检测) */
|
|
20909
|
-
__publicField$
|
|
21804
|
+
__publicField$2(this, "lastProgress", /* @__PURE__ */ new Map());
|
|
20910
21805
|
/** busy 成员执行中任务的进度基线(与 lastProgress 分离:busy 不重置——
|
|
20911
21806
|
* 独立检测"忙碌但进度长期不变"的停滞,喂给快照的 stalled 标记) */
|
|
20912
|
-
__publicField$
|
|
21807
|
+
__publicField$2(this, "progressSeen", /* @__PURE__ */ new Map());
|
|
20913
21808
|
/** goal 父任务「全部子任务 COMPLETED」首见时刻(宽限后规则引擎兜底收口) */
|
|
20914
|
-
__publicField$
|
|
21809
|
+
__publicField$2(this, "goalAllDoneAt", /* @__PURE__ */ new Map());
|
|
20915
21810
|
/** goal 收口宽限窗(ms):给 lead 充分判定机会,超时平台兜底完成 */
|
|
20916
|
-
__publicField$
|
|
21811
|
+
__publicField$2(this, "goalGraceMs", 45e3);
|
|
20917
21812
|
/** 成员空闲起始时间(最久空闲 worker 排序) */
|
|
20918
|
-
__publicField$
|
|
21813
|
+
__publicField$2(this, "idleSince", /* @__PURE__ */ new Map());
|
|
20919
21814
|
/** 当前活跃的执行模式(null = 默认无模式) */
|
|
20920
|
-
__publicField$
|
|
20921
|
-
__publicField$
|
|
21815
|
+
__publicField$2(this, "activeMode", null);
|
|
21816
|
+
__publicField$2(this, "activeModeConfig", {});
|
|
20922
21817
|
/** loop 模式控制器 */
|
|
20923
|
-
__publicField$
|
|
21818
|
+
__publicField$2(this, "loopController", null);
|
|
20924
21819
|
/** 已通知 loop 控制器的完成任务,避免每轮 tick 重复计数 */
|
|
20925
|
-
__publicField$
|
|
21820
|
+
__publicField$2(this, "loopCompletedTaskIds", /* @__PURE__ */ new Set());
|
|
20926
21821
|
/** 调度器启动时刻(loop 完成识别基线;防进程重启后重放重启前的 loop 主任务) */
|
|
20927
|
-
__publicField$
|
|
21822
|
+
__publicField$2(this, "bootAt", Date.now());
|
|
20928
21823
|
/** loop 模式下重新提交任务的回调 */
|
|
20929
|
-
__publicField$
|
|
21824
|
+
__publicField$2(this, "onLoopResubmit", null);
|
|
20930
21825
|
/** 空闲退避:快照指纹连续不变的轮数(决定下次 tick 间隔) */
|
|
20931
|
-
__publicField$
|
|
21826
|
+
__publicField$2(this, "idleStreak", 0);
|
|
20932
21827
|
/** 上一轮快照指纹(空闲判定) */
|
|
20933
|
-
__publicField$
|
|
20934
|
-
__publicField$
|
|
21828
|
+
__publicField$2(this, "lastRoundFingerprint", "");
|
|
21829
|
+
__publicField$2(this, "lastCloseOutAt", 0);
|
|
20935
21830
|
var _a, _b, _c;
|
|
20936
21831
|
this.tickMs = (_a = options.tickMs) != null ? _a : 1e3;
|
|
20937
21832
|
this.stallMs = (_b = options.stallMs) != null ? _b : 3e5;
|
|
@@ -21473,9 +22368,9 @@ class SchedulerLoop {
|
|
|
21473
22368
|
}
|
|
21474
22369
|
}
|
|
21475
22370
|
|
|
21476
|
-
var __defProp$
|
|
21477
|
-
var __defNormalProp$
|
|
21478
|
-
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);
|
|
21479
22374
|
const log$1 = createLogger("workshop.task-engine");
|
|
21480
22375
|
const TRANSITIONS = {
|
|
21481
22376
|
SUBMITTED: ["WORKING", "ASSIGNED", "CANCELED"],
|
|
@@ -21533,8 +22428,8 @@ class TaskEngine {
|
|
|
21533
22428
|
* 所有迁移必经 transition(),故状态事件不漏发;create/dispatch 的初始态直接落库,单独补发。
|
|
21534
22429
|
*/
|
|
21535
22430
|
constructor(repos, hooks) {
|
|
21536
|
-
__publicField$
|
|
21537
|
-
__publicField$
|
|
22431
|
+
__publicField$1(this, "repos", repos);
|
|
22432
|
+
__publicField$1(this, "hooks", hooks);
|
|
21538
22433
|
}
|
|
21539
22434
|
/** 单 agent 任务队列视图(queued FIFO / current / completed;派生只读投影,无第二份状态) */
|
|
21540
22435
|
/** 批量队列视图:一次 list(channel) 聚合全部成员(调度快照热路径,消除 O(M) 次查询) */
|
|
@@ -21874,359 +22769,56 @@ class TaskEngine {
|
|
|
21874
22769
|
toAgentId,
|
|
21875
22770
|
title: task.title,
|
|
21876
22771
|
description: task.description,
|
|
21877
|
-
kind: "assign"
|
|
21878
|
-
});
|
|
21879
|
-
return rowToTask$1(updated);
|
|
21880
|
-
}
|
|
21881
|
-
/** 取消任务:CANCELED(终态)+ 作废队列中的过期投递(assignee 不再消费)+ 投递 cancel 通知 */
|
|
21882
|
-
cancel(taskId, by) {
|
|
21883
|
-
const task = this.requireTask(taskId);
|
|
21884
|
-
this.transition(taskId, "CANCELED", by);
|
|
21885
|
-
this.repos.messages.consumePendingByTask(taskId);
|
|
21886
|
-
this.deliverTaskMessage({
|
|
21887
|
-
channelId: task.channelId,
|
|
21888
|
-
taskId: task.id,
|
|
21889
|
-
fromAgentId: by || null,
|
|
21890
|
-
toAgentId: task.assigneeId,
|
|
21891
|
-
title: task.title,
|
|
21892
|
-
description: task.description,
|
|
21893
|
-
kind: "cancel"
|
|
21894
|
-
});
|
|
21895
|
-
return this.requireTask(taskId);
|
|
21896
|
-
}
|
|
21897
|
-
/**
|
|
21898
|
-
* 子任务完成:向父 assignee 投递 child-completed 消息;
|
|
21899
|
-
* 最后一个未完成子任务完成时,父任务 WAITING → WORKING(lead 接续汇总)。
|
|
21900
|
-
*/
|
|
21901
|
-
onChildCompleted(child) {
|
|
21902
|
-
const parentId = child.parentId;
|
|
21903
|
-
if (!parentId) return;
|
|
21904
|
-
const parent = this.get(parentId);
|
|
21905
|
-
if (!parent) return;
|
|
21906
|
-
this.deliverTaskMessage({
|
|
21907
|
-
channelId: child.channelId,
|
|
21908
|
-
taskId: parent.id,
|
|
21909
|
-
fromAgentId: child.assigneeId,
|
|
21910
|
-
toAgentId: parent.assigneeId,
|
|
21911
|
-
title: child.title,
|
|
21912
|
-
description: child.description,
|
|
21913
|
-
kind: "child-completed",
|
|
21914
|
-
childTaskId: child.id
|
|
21915
|
-
});
|
|
21916
|
-
const siblings = this.repos.tasks.listChildrenMeta(parent.channelId, parent.id);
|
|
21917
|
-
const incomplete = siblings.filter((t) => t.state !== "COMPLETED" && t.state !== "CANCELED");
|
|
21918
|
-
if (incomplete.length === 0 && parent.state === "WAITING") {
|
|
21919
|
-
this.transition(parent.id, "WORKING", child.assigneeId);
|
|
21920
|
-
}
|
|
21921
|
-
}
|
|
21922
|
-
requireTask(taskId) {
|
|
21923
|
-
const task = this.get(taskId);
|
|
21924
|
-
if (!task) throw new AppError(404, "NOT_FOUND", `\u4EFB\u52A1\u4E0D\u5B58\u5728: ${taskId}`);
|
|
21925
|
-
return task;
|
|
21926
|
-
}
|
|
21927
|
-
}
|
|
21928
|
-
|
|
21929
|
-
var __defProp$1 = Object.defineProperty;
|
|
21930
|
-
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21931
|
-
var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
21932
|
-
const W_RELEVANCE = 0.5;
|
|
21933
|
-
const W_RECENCY = 0.3;
|
|
21934
|
-
const W_IMPORTANCE = 0.2;
|
|
21935
|
-
const RECENCY_DAYS = 7;
|
|
21936
|
-
const RECENT_FALLBACK = 5;
|
|
21937
|
-
const WEAK_HIT_KEEP = 3;
|
|
21938
|
-
const MAX_TERMS = 12;
|
|
21939
|
-
const CONTENT_STORE_LIMIT = 800;
|
|
21940
|
-
function envNum(name, fallback) {
|
|
21941
|
-
const n = Number(process.env[name]);
|
|
21942
|
-
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
21943
|
-
}
|
|
21944
|
-
function segmentCJK(text) {
|
|
21945
|
-
return text.replace(/[\u4e00-\u9fff]+/g, (run) => ` ${run.split("").join(" ")} `);
|
|
21946
|
-
}
|
|
21947
|
-
function buildMatchQuery(text) {
|
|
21948
|
-
const cleaned = text.replace(/["'*().:+-]/g, " ").toLowerCase();
|
|
21949
|
-
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);
|
|
21950
|
-
return terms.length > 0 ? terms.map((t) => `"${t}"`).join(" OR ") : null;
|
|
21951
|
-
}
|
|
21952
|
-
function estimateTokens(text) {
|
|
21953
|
-
var _a;
|
|
21954
|
-
const cjk = ((_a = text.match(/[\u4e00-\u9fff]/g)) != null ? _a : []).length;
|
|
21955
|
-
return Math.ceil((text.length - cjk) / 4) + cjk;
|
|
21956
|
-
}
|
|
21957
|
-
function unsegmentCJK(text) {
|
|
21958
|
-
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();
|
|
21959
|
-
}
|
|
21960
|
-
function partsText(parts) {
|
|
21961
|
-
return parts.map((p) => "text" in p ? p.text : "").filter(Boolean).join("\n");
|
|
21962
|
-
}
|
|
21963
|
-
function humanAgo(iso) {
|
|
21964
|
-
const ms = Date.now() - Date.parse(iso);
|
|
21965
|
-
if (Number.isNaN(ms)) return "?";
|
|
21966
|
-
if (ms < 6e4) return "\u521A\u521A";
|
|
21967
|
-
if (ms < 36e5) return `${Math.floor(ms / 6e4)}\u5206\u949F\u524D`;
|
|
21968
|
-
if (ms < 864e5) return `${Math.floor(ms / 36e5)}\u5C0F\u65F6\u524D`;
|
|
21969
|
-
return `${Math.floor(ms / 864e5)}\u5929\u524D`;
|
|
21970
|
-
}
|
|
21971
|
-
class AgentMemory {
|
|
21972
|
-
constructor(repo, opts) {
|
|
21973
|
-
__publicField$1(this, "repo", repo);
|
|
21974
|
-
__publicField$1(this, "opts", opts);
|
|
21975
|
-
__publicField$1(this, "embedder");
|
|
21976
|
-
var _a;
|
|
21977
|
-
this.embedder = (_a = opts.embedder) != null ? _a : null;
|
|
21978
|
-
}
|
|
21979
|
-
/** 向量层惰性初始化(vecReady 后 no-op;建表失败一次性禁用 embedder) */
|
|
21980
|
-
ensureVec() {
|
|
21981
|
-
var _a;
|
|
21982
|
-
if (this.repo.vecReady) return;
|
|
21983
|
-
const dims = (_a = this.embedder) == null ? void 0 : _a.dims();
|
|
21984
|
-
if (dims && !this.repo.vecInit(dims)) this.embedder = null;
|
|
21985
|
-
}
|
|
21986
|
-
/** scope 过滤:private 仅本人行;shared 仅本 channel 的 team 行;auto 双域 */
|
|
21987
|
-
inScope(row, scope) {
|
|
21988
|
-
const isTeam = row.agentId === TEAM_AGENT_ID;
|
|
21989
|
-
if (isTeam && row.channelId !== this.opts.channelId) return false;
|
|
21990
|
-
return scope === "auto" ? isTeam || row.agentId === this.opts.agentId : scope === "shared" ? isTeam : row.agentId === this.opts.agentId;
|
|
21991
|
-
}
|
|
21992
|
-
/** 混合检索原始命中(FTS+向量融合;不排序不 touch) */
|
|
21993
|
-
async collectHits(query, scope) {
|
|
21994
|
-
var _a;
|
|
21995
|
-
const hits = /* @__PURE__ */ new Map();
|
|
21996
|
-
const match = buildMatchQuery(query);
|
|
21997
|
-
if (match) {
|
|
21998
|
-
const found = this.repo.search(this.opts.agentId, match, MAX_TERMS);
|
|
21999
|
-
const first = found[0];
|
|
22000
|
-
const best = first ? Math.max(-first.bm25, 1e-3) : 1;
|
|
22001
|
-
let kept = 0;
|
|
22002
|
-
for (const row of found) {
|
|
22003
|
-
if (!this.inScope(row, scope)) continue;
|
|
22004
|
-
const rel = Math.min(1, -row.bm25 / best);
|
|
22005
|
-
if (rel >= 0.1 || kept < WEAK_HIT_KEEP) {
|
|
22006
|
-
hits.set(row.id, { row, relevance: rel });
|
|
22007
|
-
kept += 1;
|
|
22008
|
-
}
|
|
22009
|
-
}
|
|
22010
|
-
}
|
|
22011
|
-
if (this.embedder) {
|
|
22012
|
-
try {
|
|
22013
|
-
const [qv] = await this.embedder.embed([query]);
|
|
22014
|
-
if (qv) {
|
|
22015
|
-
this.ensureVec();
|
|
22016
|
-
const ownDomains = scope === "shared" ? [TEAM_AGENT_ID] : scope === "private" ? [this.opts.agentId] : [this.opts.agentId, TEAM_AGENT_ID];
|
|
22017
|
-
const vAll = ownDomains.flatMap((d) => this.repo.vecSearch(d, qv, d === TEAM_AGENT_ID ? 5 : 10));
|
|
22018
|
-
const distByRowid = /* @__PURE__ */ new Map();
|
|
22019
|
-
for (const { memRowid, distance } of vAll) {
|
|
22020
|
-
const prev = distByRowid.get(memRowid);
|
|
22021
|
-
if (prev === void 0 || distance < prev) distByRowid.set(memRowid, distance);
|
|
22022
|
-
}
|
|
22023
|
-
for (const row of this.repo.listByRowids([...distByRowid.keys()])) {
|
|
22024
|
-
if (!this.inScope(row, scope)) continue;
|
|
22025
|
-
if (row.agentId !== this.opts.agentId && row.agentId !== TEAM_AGENT_ID) continue;
|
|
22026
|
-
const sim = Math.min(1, Math.max(0, 1 - ((_a = distByRowid.get(row.rowid)) != null ? _a : 1)));
|
|
22027
|
-
const prev = hits.get(row.id);
|
|
22028
|
-
hits.set(row.id, { row, relevance: prev ? Math.max(prev.relevance, sim) : sim });
|
|
22029
|
-
}
|
|
22030
|
-
}
|
|
22031
|
-
} catch {
|
|
22032
|
-
}
|
|
22033
|
-
}
|
|
22034
|
-
if (scope !== "shared") {
|
|
22035
|
-
for (const row of this.repo.listRecent(this.opts.agentId, RECENT_FALLBACK)) {
|
|
22036
|
-
if (!hits.has(row.id)) hits.set(row.id, { row, relevance: 0.15 });
|
|
22037
|
-
}
|
|
22038
|
-
}
|
|
22039
|
-
return hits;
|
|
22040
|
-
}
|
|
22041
|
-
/** 排序(综合分降序;不含预算/touch 副作用) */
|
|
22042
|
-
async rank(query, scope) {
|
|
22043
|
-
const hits = await this.collectHits(query, scope);
|
|
22044
|
-
return [...hits.values()].map((h) => ({ ...h, score: this.score(h.row, h.relevance) })).sort((a, b) => b.score - a.score);
|
|
22045
|
-
}
|
|
22046
|
-
/**
|
|
22047
|
-
* run/supervise 前的"记忆引子"注入:混合检索+排序+小预算装配 → 记忆块。
|
|
22048
|
-
* 默认 AW_MEMORY_PRIMER_TOKENS(300)小预算,只给最相关的少量线索;
|
|
22049
|
-
* 完整内容由 Agent 运行时经 search_memory 工具按需抓取(防全量注入污染上下文)。
|
|
22050
|
-
*/
|
|
22051
|
-
async recall(query, recallOpts = {}) {
|
|
22052
|
-
var _a, _b, _c;
|
|
22053
|
-
const doTouch = recallOpts.touch !== false;
|
|
22054
|
-
const budget = (_b = (_a = recallOpts.budgetTokens) != null ? _a : this.opts.budgetTokens) != null ? _b : envNum("AW_MEMORY_PRIMER_TOKENS", 300);
|
|
22055
|
-
const scope = (_c = recallOpts.scope) != null ? _c : "auto";
|
|
22056
|
-
const scored = await this.rank(query, scope);
|
|
22057
|
-
if (scored.length === 0) return null;
|
|
22058
|
-
const lines = [];
|
|
22059
|
-
const touched = [];
|
|
22060
|
-
let used = 0;
|
|
22061
|
-
for (const s of scored) {
|
|
22062
|
-
const line = this.formatLine(s.row);
|
|
22063
|
-
const cost = estimateTokens(line);
|
|
22064
|
-
if (used + cost > budget) continue;
|
|
22065
|
-
used += cost;
|
|
22066
|
-
lines.push(line);
|
|
22067
|
-
if (doTouch) touched.push(s.row.id);
|
|
22068
|
-
}
|
|
22069
|
-
if (lines.length === 0) return null;
|
|
22070
|
-
for (const id of touched) this.repo.touch(id);
|
|
22071
|
-
return [
|
|
22072
|
-
`## \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)`,
|
|
22073
|
-
...lines,
|
|
22074
|
-
[
|
|
22075
|
-
`\u8BB0\u5FC6\u4F7F\u7528\u63D0\u793A:`,
|
|
22076
|
-
`- \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`,
|
|
22077
|
-
`- \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`
|
|
22078
|
-
].join("\n")
|
|
22079
|
-
].join("\n");
|
|
22080
|
-
}
|
|
22081
|
-
/**
|
|
22082
|
-
* 工具按需抓取(search_memory):结构化片段返回,content 还原为未切分原文。
|
|
22083
|
-
* 触发 touch(access_count 强化后续召回排序);limit 上限防御。
|
|
22084
|
-
*/
|
|
22085
|
-
async recallRows(query, opts = {}) {
|
|
22086
|
-
var _a, _b;
|
|
22087
|
-
const scope = (_a = opts.scope) != null ? _a : "auto";
|
|
22088
|
-
const limit = Math.min(Math.max((_b = opts.limit) != null ? _b : 5, 1), 20);
|
|
22089
|
-
const scored = (await this.rank(query, scope)).slice(0, limit);
|
|
22090
|
-
for (const s of scored) this.repo.touch(s.row.id);
|
|
22091
|
-
return scored.map((s) => ({
|
|
22092
|
-
id: s.row.id,
|
|
22093
|
-
kind: s.row.kind,
|
|
22094
|
-
title: s.row.title,
|
|
22095
|
-
content: unsegmentCJK(s.row.content).slice(0, 500),
|
|
22096
|
-
importance: s.row.importance,
|
|
22097
|
-
createdAt: s.row.createdAt,
|
|
22098
|
-
score: Math.round(s.score * 1e3) / 1e3,
|
|
22099
|
-
source: s.row.agentId === TEAM_AGENT_ID ? "shared" : "private"
|
|
22100
|
-
}));
|
|
22101
|
-
}
|
|
22102
|
-
/**
|
|
22103
|
-
* Agent 主动沉淀(save_memory 工具):把作业过程中的可复用结论/经验写入记忆库。
|
|
22104
|
-
* scope='private' → 本人 semantic 域;scope='shared' → Channel 公共域(全员可检索;
|
|
22105
|
-
* dedupKey 按来源 Agent 命名空间隔离,避免多 Agent 同 key 互相覆盖)。写入后自动向量化。
|
|
22106
|
-
*/
|
|
22107
|
-
async save(input) {
|
|
22108
|
-
var _a, _b;
|
|
22109
|
-
const shared = input.scope === "shared";
|
|
22110
|
-
const rawKey = ((_a = input.dedupKey) == null ? void 0 : _a.trim()) || `agent-save:${randomUUID$1().slice(0, 8)}`;
|
|
22111
|
-
const dedupKey = shared ? `agent:${this.opts.agentId}:${rawKey}` : rawKey;
|
|
22112
|
-
const owner = shared ? TEAM_AGENT_ID : this.opts.agentId;
|
|
22113
|
-
this.repo.upsert({
|
|
22114
|
-
channelId: this.opts.channelId,
|
|
22115
|
-
agentId: owner,
|
|
22116
|
-
kind: "semantic",
|
|
22117
|
-
title: input.title,
|
|
22118
|
-
titleFts: segmentCJK(input.title),
|
|
22119
|
-
content: segmentCJK(input.content).slice(0, CONTENT_STORE_LIMIT),
|
|
22120
|
-
importance: (_b = input.importance) != null ? _b : shared ? 0.85 : 0.7,
|
|
22121
|
-
taskId: null,
|
|
22122
|
-
dedupKey
|
|
22772
|
+
kind: "assign"
|
|
22123
22773
|
});
|
|
22124
|
-
|
|
22125
|
-
return { scope: input.scope, dedupKey };
|
|
22774
|
+
return rowToTask$1(updated);
|
|
22126
22775
|
}
|
|
22127
|
-
/**
|
|
22128
|
-
|
|
22129
|
-
const
|
|
22130
|
-
|
|
22131
|
-
|
|
22132
|
-
|
|
22133
|
-
|
|
22134
|
-
channelId: this.opts.channelId,
|
|
22135
|
-
agentId: this.opts.agentId,
|
|
22136
|
-
kind: "episodic-task",
|
|
22137
|
-
title: task.title,
|
|
22138
|
-
titleFts: segmentCJK(task.title),
|
|
22139
|
-
content: segmentCJK(content).slice(0, CONTENT_STORE_LIMIT),
|
|
22140
|
-
importance: task.state === "COMPLETED" ? 0.8 : 0.55,
|
|
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,
|
|
22141
22783
|
taskId: task.id,
|
|
22142
|
-
|
|
22784
|
+
fromAgentId: by || null,
|
|
22785
|
+
toAgentId: task.assigneeId,
|
|
22786
|
+
title: task.title,
|
|
22787
|
+
description: task.description,
|
|
22788
|
+
kind: "cancel"
|
|
22143
22789
|
});
|
|
22144
|
-
|
|
22790
|
+
return this.requireTask(taskId);
|
|
22145
22791
|
}
|
|
22146
|
-
/**
|
|
22147
|
-
|
|
22148
|
-
|
|
22149
|
-
|
|
22150
|
-
|
|
22151
|
-
const
|
|
22152
|
-
|
|
22153
|
-
this.
|
|
22154
|
-
|
|
22155
|
-
|
|
22156
|
-
|
|
22157
|
-
|
|
22158
|
-
|
|
22159
|
-
|
|
22160
|
-
|
|
22161
|
-
|
|
22162
|
-
|
|
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
|
|
22163
22810
|
});
|
|
22164
|
-
|
|
22165
|
-
|
|
22166
|
-
|
|
22167
|
-
|
|
22168
|
-
await vectorizeMemory(this.repo, this.embedder, this.opts.channelId, this.opts.agentId, dedupKey, plainContent);
|
|
22169
|
-
}
|
|
22170
|
-
score(row, relevance) {
|
|
22171
|
-
const ageDays = (Date.now() - Date.parse(row.createdAt)) / 864e5;
|
|
22172
|
-
const recency = Math.exp(-ageDays / RECENCY_DAYS);
|
|
22173
|
-
const importance = Math.min(1, row.importance + row.accessCount * 0.05);
|
|
22174
|
-
return W_RELEVANCE * relevance + W_RECENCY * recency + W_IMPORTANCE * importance;
|
|
22175
|
-
}
|
|
22176
|
-
formatLine(row) {
|
|
22177
|
-
const tag = row.kind === "episodic-task" ? "\u4EFB\u52A1" : row.kind === "episodic-peer" ? "\u534F\u4F5C" : "\u5171\u4EAB";
|
|
22178
|
-
const content = unsegmentCJK(row.content);
|
|
22179
|
-
const short = content.length > 240 ? `${content.slice(0, 240)}\u2026` : content;
|
|
22180
|
-
return `- [${humanAgo(row.createdAt)}\xB7${tag}] ${row.title}:${short}`;
|
|
22181
|
-
}
|
|
22182
|
-
}
|
|
22183
|
-
async function vectorizeMemory(repo, embedder, channelId, agentId, dedupKey, plainContent) {
|
|
22184
|
-
if (!embedder) return;
|
|
22185
|
-
try {
|
|
22186
|
-
const [vec] = await embedder.embed([plainContent]);
|
|
22187
|
-
if (!vec) return;
|
|
22188
|
-
const dims = embedder.dims();
|
|
22189
|
-
if (dims && !repo.vecInit(dims)) return;
|
|
22190
|
-
const at = repo.findByAgentDedup(channelId, agentId, dedupKey);
|
|
22191
|
-
if (at) repo.vecSet(at.rowid, agentId, vec);
|
|
22192
|
-
} catch {
|
|
22193
|
-
}
|
|
22194
|
-
}
|
|
22195
|
-
function runMemoryMaintenance(repo, opts = {}) {
|
|
22196
|
-
var _a, _b, _c;
|
|
22197
|
-
const expireDays = (_a = opts.expireDays) != null ? _a : envNum("AW_MEMORY_EXPIRE_DAYS", 180);
|
|
22198
|
-
const cap = (_b = opts.cap) != null ? _b : envNum("AW_MEMORY_CAP", 500);
|
|
22199
|
-
const expireMs = expireDays * 864e5;
|
|
22200
|
-
const now = Date.now();
|
|
22201
|
-
let deletedExpired = 0;
|
|
22202
|
-
let evicted = 0;
|
|
22203
|
-
for (const agentId of repo.listMemoryAgentIds()) {
|
|
22204
|
-
if (agentId === TEAM_AGENT_ID) continue;
|
|
22205
|
-
const rows = repo.listByAgentWithRowid(agentId, 1e6);
|
|
22206
|
-
for (const r of rows) {
|
|
22207
|
-
if (!r.kind.startsWith("episodic")) continue;
|
|
22208
|
-
if (now - Date.parse((_c = r.lastAccessedAt) != null ? _c : r.createdAt) > expireMs) {
|
|
22209
|
-
repo.vecDelete(r.rowid);
|
|
22210
|
-
repo.delete(r.id);
|
|
22211
|
-
deletedExpired++;
|
|
22212
|
-
}
|
|
22213
|
-
}
|
|
22214
|
-
const remaining = repo.listByAgentWithRowid(agentId, 1e6).filter((r) => r.kind.startsWith("episodic"));
|
|
22215
|
-
if (remaining.length > cap) {
|
|
22216
|
-
const sorted = remaining.map((r) => ({ r, s: r.importance + r.accessCount * 0.05 })).sort((a, b) => b.s - a.s);
|
|
22217
|
-
for (const { r } of sorted.slice(cap)) {
|
|
22218
|
-
repo.vecDelete(r.rowid);
|
|
22219
|
-
repo.delete(r.id);
|
|
22220
|
-
evicted++;
|
|
22221
|
-
}
|
|
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);
|
|
22222
22815
|
}
|
|
22223
22816
|
}
|
|
22224
|
-
|
|
22225
|
-
|
|
22226
|
-
|
|
22227
|
-
|
|
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;
|
|
22228
22821
|
}
|
|
22229
|
-
return { deletedExpired, evicted, cleanedVec };
|
|
22230
22822
|
}
|
|
22231
22823
|
|
|
22232
22824
|
const FAIL_THRESHOLD = 3;
|
|
@@ -22359,6 +22951,8 @@ class AgentChannelManager {
|
|
|
22359
22951
|
__publicField(this, "memoryTimer", null);
|
|
22360
22952
|
/** 全 manager 共享的 env 向量 provider(未配置 → null 纯 FTS;熔断/维度全体实例共享) */
|
|
22361
22953
|
__publicField(this, "memoryEmbedder", createEnvEmbeddingProvider());
|
|
22954
|
+
/** 反思游标:每 agent 上次聚合的当月任务数(月度幂等增量判定) */
|
|
22955
|
+
__publicField(this, "reflectCounts", /* @__PURE__ */ new Map());
|
|
22362
22956
|
var _a, _b;
|
|
22363
22957
|
this.memoryTimer = setInterval(() => {
|
|
22364
22958
|
try {
|
|
@@ -22366,6 +22960,11 @@ class AgentChannelManager {
|
|
|
22366
22960
|
} catch (err) {
|
|
22367
22961
|
log.error("[memory] \u7EF4\u62A4\u4EFB\u52A1\u5F02\u5E38", err);
|
|
22368
22962
|
}
|
|
22963
|
+
try {
|
|
22964
|
+
this.reflectIdleMemories();
|
|
22965
|
+
} catch (err) {
|
|
22966
|
+
log.error("[memory] \u53CD\u601D\u4EFB\u52A1\u5F02\u5E38", err);
|
|
22967
|
+
}
|
|
22369
22968
|
}, envNum("AW_MEMORY_MAINTENANCE_MS", 6 * 36e5));
|
|
22370
22969
|
(_b = (_a = this.memoryTimer).unref) == null ? void 0 : _b.call(_a);
|
|
22371
22970
|
}
|
|
@@ -22406,9 +23005,85 @@ class AgentChannelManager {
|
|
|
22406
23005
|
cr.setLoader((id) => this.ensureAgentRuntime(channelId, id));
|
|
22407
23006
|
this.channels.set(channelId, cr);
|
|
22408
23007
|
this.buses.set(channelId, this.buildBus(cr));
|
|
23008
|
+
this.buses.get(channelId).onTaskEvent((e) => this.recordTeamTaskTerminal(channelId, e));
|
|
22409
23009
|
}
|
|
22410
23010
|
return cr;
|
|
22411
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
|
+
}
|
|
22412
23087
|
buildBus(cr) {
|
|
22413
23088
|
const eventListeners = /* @__PURE__ */ new Set();
|
|
22414
23089
|
const taskListeners = /* @__PURE__ */ new Set();
|
|
@@ -22896,6 +23571,7 @@ class AgentChannelManager {
|
|
|
22896
23571
|
updateTask: (taskId, patch) => this.updateTask(channelId, agent.id, taskId, patch),
|
|
22897
23572
|
reassignTask: (taskId, toAgentId) => this.reassignTask(channelId, agent.id, taskId, toAgentId),
|
|
22898
23573
|
sendMessage: (input) => this.sendA2A(channelId, agent.id, input),
|
|
23574
|
+
sendCrossChannelMessage: (input) => this.sendCrossChannelMessage(channelId, agent.id, input),
|
|
22899
23575
|
refuseTask: (taskId, reason) => this.refuseTask(channelId, agent.id, taskId, reason),
|
|
22900
23576
|
pollMailbox: (limit) => this.pollMailbox(channelId, agent.id, limit),
|
|
22901
23577
|
waitMailbox: (limit, waitMs) => this.waitMailbox(channelId, agent.id, limit != null ? limit : 10, waitMs != null ? waitMs : 0),
|
|
@@ -22914,6 +23590,12 @@ class AgentChannelManager {
|
|
|
22914
23590
|
(_a = this.buses.get(channelId)) == null ? void 0 : _a.notifyMemory({ agentId: agent.id, scope: input.scope, title: input.title, dedupKey: saved.dedupKey });
|
|
22915
23591
|
return saved;
|
|
22916
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
|
+
},
|
|
22917
23599
|
// 团队成员管理(仅 lead;manager 内二次校验角色,工具面与决策面共用)
|
|
22918
23600
|
createTeamMember: (input) => this.createTeamMember(channelId, agent.id, input),
|
|
22919
23601
|
updateTeamMember: (agentId, patch) => this.updateTeamMember(channelId, agent.id, agentId, patch),
|
|
@@ -24108,6 +24790,65 @@ class AgentChannelManager {
|
|
|
24108
24790
|
}
|
|
24109
24791
|
return message;
|
|
24110
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
|
+
}
|
|
24111
24852
|
/** 阻塞长轮询(poll_messages):到信即时唤醒,250ms 兜底重查 */
|
|
24112
24853
|
async waitMailbox(channelId, callerAgentId, limit, waitMs) {
|
|
24113
24854
|
this.requireMember(channelId, callerAgentId);
|
|
@@ -24321,7 +25062,7 @@ const assets = {
|
|
|
24321
25062
|
"/_nuxt/36oeS8_R2.js": {
|
|
24322
25063
|
"type": "text/javascript; charset=utf-8",
|
|
24323
25064
|
"etag": "\"d6-9W7EHt23WjRGOYCN8bz9Yy0aMhg\"",
|
|
24324
|
-
"mtime": "2026-09-
|
|
25065
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24325
25066
|
"size": 214,
|
|
24326
25067
|
"path": "../public/_nuxt/36oeS8_R2.js"
|
|
24327
25068
|
},
|
|
@@ -24332,1293 +25073,1363 @@ const assets = {
|
|
|
24332
25073
|
"size": 819,
|
|
24333
25074
|
"path": "../public/favicon.svg"
|
|
24334
25075
|
},
|
|
25076
|
+
"/_nuxt/agents.BJwgTLFZ.css": {
|
|
25077
|
+
"type": "text/css; charset=utf-8",
|
|
25078
|
+
"etag": "\"35b-ZsP4Yk5oNeMefP2PDhf6ga/NjEw\"",
|
|
25079
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
25080
|
+
"size": 859,
|
|
25081
|
+
"path": "../public/_nuxt/agents.BJwgTLFZ.css"
|
|
25082
|
+
},
|
|
24335
25083
|
"/_nuxt/7ZABjMRh2.js": {
|
|
24336
25084
|
"type": "text/javascript; charset=utf-8",
|
|
24337
25085
|
"etag": "\"3a06-vfWCeCuQModyMp+Xi4gZEB3CxnI\"",
|
|
24338
|
-
"mtime": "2026-09-
|
|
25086
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24339
25087
|
"size": 14854,
|
|
24340
25088
|
"path": "../public/_nuxt/7ZABjMRh2.js"
|
|
24341
25089
|
},
|
|
24342
25090
|
"/_nuxt/2LwEn9gX.js": {
|
|
24343
25091
|
"type": "text/javascript; charset=utf-8",
|
|
24344
25092
|
"etag": "\"548e-d/wW0XgblFvF2ZmqI6QmEPUI+0w\"",
|
|
24345
|
-
"mtime": "2026-09-
|
|
25093
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24346
25094
|
"size": 21646,
|
|
24347
25095
|
"path": "../public/_nuxt/2LwEn9gX.js"
|
|
24348
25096
|
},
|
|
24349
|
-
"/_nuxt/agents.BJwgTLFZ.css": {
|
|
24350
|
-
"type": "text/css; charset=utf-8",
|
|
24351
|
-
"etag": "\"35b-ZsP4Yk5oNeMefP2PDhf6ga/NjEw\"",
|
|
24352
|
-
"mtime": "2026-09-02T10:11:57.264Z",
|
|
24353
|
-
"size": 859,
|
|
24354
|
-
"path": "../public/_nuxt/agents.BJwgTLFZ.css"
|
|
24355
|
-
},
|
|
24356
|
-
"/_nuxt/B-PgoIPN.js": {
|
|
24357
|
-
"type": "text/javascript; charset=utf-8",
|
|
24358
|
-
"etag": "\"2d99-Ho+i6uMJOQv4GcKgjDeaCxtu/Mo\"",
|
|
24359
|
-
"mtime": "2026-09-02T10:11:57.221Z",
|
|
24360
|
-
"size": 11673,
|
|
24361
|
-
"path": "../public/_nuxt/B-PgoIPN.js"
|
|
24362
|
-
},
|
|
24363
25097
|
"/_nuxt/9X0fVBD7.js": {
|
|
24364
25098
|
"type": "text/javascript; charset=utf-8",
|
|
24365
25099
|
"etag": "\"3d68-dpaiop+2vd/2C5Gh1mxTjRk6P6w\"",
|
|
24366
|
-
"mtime": "2026-09-
|
|
25100
|
+
"mtime": "2026-09-02T12:06:00.105Z",
|
|
24367
25101
|
"size": 15720,
|
|
24368
25102
|
"path": "../public/_nuxt/9X0fVBD7.js"
|
|
24369
25103
|
},
|
|
24370
25104
|
"/_nuxt/B0haAGoq.js": {
|
|
24371
25105
|
"type": "text/javascript; charset=utf-8",
|
|
24372
25106
|
"etag": "\"371a-aqw44lYAQlSTs+GwfR2Ui/b7goA\"",
|
|
24373
|
-
"mtime": "2026-09-
|
|
25107
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
24374
25108
|
"size": 14106,
|
|
24375
25109
|
"path": "../public/_nuxt/B0haAGoq.js"
|
|
24376
25110
|
},
|
|
24377
|
-
"/_nuxt/
|
|
25111
|
+
"/_nuxt/B-PgoIPN.js": {
|
|
24378
25112
|
"type": "text/javascript; charset=utf-8",
|
|
24379
|
-
"etag": "\"
|
|
24380
|
-
"mtime": "2026-09-
|
|
24381
|
-
"size":
|
|
24382
|
-
"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"
|
|
24383
25117
|
},
|
|
24384
25118
|
"/_nuxt/B3__nfxM.js": {
|
|
24385
25119
|
"type": "text/javascript; charset=utf-8",
|
|
24386
25120
|
"etag": "\"9924-mdZF1OXMinqQgkVx966QA9Mnw34\"",
|
|
24387
|
-
"mtime": "2026-09-
|
|
25121
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
24388
25122
|
"size": 39204,
|
|
24389
25123
|
"path": "../public/_nuxt/B3__nfxM.js"
|
|
24390
25124
|
},
|
|
25125
|
+
"/_nuxt/B4GHHF6d2.js": {
|
|
25126
|
+
"type": "text/javascript; charset=utf-8",
|
|
25127
|
+
"etag": "\"6a1f-sgKC+rBlgDrFN2xJnNBcsQFFelY\"",
|
|
25128
|
+
"mtime": "2026-09-02T12:06:00.107Z",
|
|
25129
|
+
"size": 27167,
|
|
25130
|
+
"path": "../public/_nuxt/B4GHHF6d2.js"
|
|
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
|
+
},
|
|
24391
25139
|
"/_nuxt/B7V9IfTL.js": {
|
|
24392
25140
|
"type": "text/javascript; charset=utf-8",
|
|
24393
25141
|
"etag": "\"21bb-WNOATwmMACC/INep96wHvyKusZ8\"",
|
|
24394
|
-
"mtime": "2026-09-
|
|
25142
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24395
25143
|
"size": 8635,
|
|
24396
25144
|
"path": "../public/_nuxt/B7V9IfTL.js"
|
|
24397
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
|
+
},
|
|
24398
25153
|
"/_nuxt/B9aPoQvt.js": {
|
|
24399
25154
|
"type": "text/javascript; charset=utf-8",
|
|
24400
25155
|
"etag": "\"469c-iKeDALdd9GdkRbr7YkPyLiRiPm0\"",
|
|
24401
|
-
"mtime": "2026-09-
|
|
25156
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24402
25157
|
"size": 18076,
|
|
24403
25158
|
"path": "../public/_nuxt/B9aPoQvt.js"
|
|
24404
25159
|
},
|
|
24405
|
-
"/_nuxt/BbQornXa.js": {
|
|
24406
|
-
"type": "text/javascript; charset=utf-8",
|
|
24407
|
-
"etag": "\"20d2-fXnSrm+6nw+8ZWjtQ/dLscMx2uc\"",
|
|
24408
|
-
"mtime": "2026-09-02T10:11:57.239Z",
|
|
24409
|
-
"size": 8402,
|
|
24410
|
-
"path": "../public/_nuxt/BbQornXa.js"
|
|
24411
|
-
},
|
|
24412
25160
|
"/_nuxt/BCipft_k2.js": {
|
|
24413
25161
|
"type": "text/javascript; charset=utf-8",
|
|
24414
25162
|
"etag": "\"144-2D+eSx4+11AuVi/8yHxyPvkJ3L4\"",
|
|
24415
|
-
"mtime": "2026-09-
|
|
25163
|
+
"mtime": "2026-09-02T12:06:00.108Z",
|
|
24416
25164
|
"size": 324,
|
|
24417
25165
|
"path": "../public/_nuxt/BCipft_k2.js"
|
|
24418
25166
|
},
|
|
24419
|
-
"/_nuxt/BBrRELH32.js": {
|
|
24420
|
-
"type": "text/javascript; charset=utf-8",
|
|
24421
|
-
"etag": "\"5bc-jGs6+2LpPidhbmCHZyKfmEWQxCI\"",
|
|
24422
|
-
"mtime": "2026-09-02T10:11:57.233Z",
|
|
24423
|
-
"size": 1468,
|
|
24424
|
-
"path": "../public/_nuxt/BBrRELH32.js"
|
|
24425
|
-
},
|
|
24426
25167
|
"/_nuxt/Bc_mM2cU.js": {
|
|
24427
25168
|
"type": "text/javascript; charset=utf-8",
|
|
24428
25169
|
"etag": "\"3e50-7NnGhVtLTA9Z4/YfDl2qwyaKRpA\"",
|
|
24429
|
-
"mtime": "2026-09-
|
|
25170
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24430
25171
|
"size": 15952,
|
|
24431
25172
|
"path": "../public/_nuxt/Bc_mM2cU.js"
|
|
24432
25173
|
},
|
|
24433
|
-
"/_nuxt/
|
|
24434
|
-
"type": "text/javascript; charset=utf-8",
|
|
24435
|
-
"etag": "\"92-HewTRGUKJSuRw0kFs5RC2k2x4sk\"",
|
|
24436
|
-
"mtime": "2026-09-02T10:11:57.232Z",
|
|
24437
|
-
"size": 146,
|
|
24438
|
-
"path": "../public/_nuxt/B6M2WJWm2.js"
|
|
24439
|
-
},
|
|
24440
|
-
"/_nuxt/BDUjyaF4.js": {
|
|
24441
|
-
"type": "text/javascript; charset=utf-8",
|
|
24442
|
-
"etag": "\"12149-hpS4uBcTVyjMF/ahBrfPvWSV6dM\"",
|
|
24443
|
-
"mtime": "2026-09-02T10:11:57.234Z",
|
|
24444
|
-
"size": 74057,
|
|
24445
|
-
"path": "../public/_nuxt/BDUjyaF4.js"
|
|
24446
|
-
},
|
|
24447
|
-
"/_nuxt/BF9XPEuw.js": {
|
|
25174
|
+
"/_nuxt/BBrRELH32.js": {
|
|
24448
25175
|
"type": "text/javascript; charset=utf-8",
|
|
24449
|
-
"etag": "\"
|
|
24450
|
-
"mtime": "2026-09-
|
|
24451
|
-
"size":
|
|
24452
|
-
"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"
|
|
24453
25180
|
},
|
|
24454
25181
|
"/_nuxt/BE5QyG5J2.js": {
|
|
24455
25182
|
"type": "text/javascript; charset=utf-8",
|
|
24456
25183
|
"etag": "\"a09-92sH0EppYph8z6pqhl6Y9RYhj/A\"",
|
|
24457
|
-
"mtime": "2026-09-
|
|
25184
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
24458
25185
|
"size": 2569,
|
|
24459
25186
|
"path": "../public/_nuxt/BE5QyG5J2.js"
|
|
24460
25187
|
},
|
|
24461
25188
|
"/_nuxt/BeIfu4N3.js": {
|
|
24462
25189
|
"type": "text/javascript; charset=utf-8",
|
|
24463
25190
|
"etag": "\"bc89-neyoILuYLlrhO8n1ehz7UmvocMs\"",
|
|
24464
|
-
"mtime": "2026-09-
|
|
25191
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24465
25192
|
"size": 48265,
|
|
24466
25193
|
"path": "../public/_nuxt/BeIfu4N3.js"
|
|
24467
25194
|
},
|
|
24468
25195
|
"/_nuxt/BfGc7TJp.js": {
|
|
24469
25196
|
"type": "text/javascript; charset=utf-8",
|
|
24470
25197
|
"etag": "\"f5-ynAHqm+XhchZ1co7YynIGiIextg\"",
|
|
24471
|
-
"mtime": "2026-09-
|
|
25198
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24472
25199
|
"size": 245,
|
|
24473
25200
|
"path": "../public/_nuxt/BfGc7TJp.js"
|
|
24474
25201
|
},
|
|
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": {
|
|
25210
|
+
"type": "text/javascript; charset=utf-8",
|
|
25211
|
+
"etag": "\"9141-81iSu9pJRw8QX6Mxx5nKGoYfOM4\"",
|
|
25212
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
25213
|
+
"size": 37185,
|
|
25214
|
+
"path": "../public/_nuxt/BFYNhG9S.js"
|
|
25215
|
+
},
|
|
25216
|
+
"/_nuxt/BDUjyaF4.js": {
|
|
25217
|
+
"type": "text/javascript; charset=utf-8",
|
|
25218
|
+
"etag": "\"12149-hpS4uBcTVyjMF/ahBrfPvWSV6dM\"",
|
|
25219
|
+
"mtime": "2026-09-02T12:06:00.109Z",
|
|
25220
|
+
"size": 74057,
|
|
25221
|
+
"path": "../public/_nuxt/BDUjyaF4.js"
|
|
25222
|
+
},
|
|
24475
25223
|
"/_nuxt/BdKzfJiM.js": {
|
|
24476
25224
|
"type": "text/javascript; charset=utf-8",
|
|
24477
25225
|
"etag": "\"1ca51-bE9q/bI2sZhVumbDlGwg8BOjxLQ\"",
|
|
24478
|
-
"mtime": "2026-09-
|
|
25226
|
+
"mtime": "2026-09-02T12:06:00.112Z",
|
|
24479
25227
|
"size": 117329,
|
|
24480
25228
|
"path": "../public/_nuxt/BdKzfJiM.js"
|
|
24481
25229
|
},
|
|
24482
|
-
"/_nuxt/BFYNhG9S.js": {
|
|
24483
|
-
"type": "text/javascript; charset=utf-8",
|
|
24484
|
-
"etag": "\"9141-81iSu9pJRw8QX6Mxx5nKGoYfOM4\"",
|
|
24485
|
-
"mtime": "2026-09-02T10:11:57.235Z",
|
|
24486
|
-
"size": 37185,
|
|
24487
|
-
"path": "../public/_nuxt/BFYNhG9S.js"
|
|
24488
|
-
},
|
|
24489
25230
|
"/_nuxt/BFjGV-RV2.js": {
|
|
24490
25231
|
"type": "text/javascript; charset=utf-8",
|
|
24491
25232
|
"etag": "\"a0340-NzvTqyczSJgnuw9pjPQnLX42sAE\"",
|
|
24492
|
-
"mtime": "2026-09-
|
|
25233
|
+
"mtime": "2026-09-02T12:06:00.110Z",
|
|
24493
25234
|
"size": 656192,
|
|
24494
25235
|
"path": "../public/_nuxt/BFjGV-RV2.js"
|
|
24495
25236
|
},
|
|
24496
25237
|
"/_nuxt/Bi6AiCuP.js": {
|
|
24497
25238
|
"type": "text/javascript; charset=utf-8",
|
|
24498
25239
|
"etag": "\"496e-oqHtafCqQjIHhroTpVe4NdP44vE\"",
|
|
24499
|
-
"mtime": "2026-09-
|
|
25240
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24500
25241
|
"size": 18798,
|
|
24501
25242
|
"path": "../public/_nuxt/Bi6AiCuP.js"
|
|
24502
25243
|
},
|
|
24503
25244
|
"/_nuxt/BJvGPTpC.js": {
|
|
24504
25245
|
"type": "text/javascript; charset=utf-8",
|
|
24505
25246
|
"etag": "\"42-6OgDQPLMWuyWnNFiZTnZejSK/qg\"",
|
|
24506
|
-
"mtime": "2026-09-
|
|
25247
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24507
25248
|
"size": 66,
|
|
24508
25249
|
"path": "../public/_nuxt/BJvGPTpC.js"
|
|
24509
25250
|
},
|
|
24510
25251
|
"/_nuxt/Bq_KKxCg.js": {
|
|
24511
25252
|
"type": "text/javascript; charset=utf-8",
|
|
24512
25253
|
"etag": "\"2426-fOTBJdnlEjXoDd9OqXKVa4u3D68\"",
|
|
24513
|
-
"mtime": "2026-09-
|
|
25254
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24514
25255
|
"size": 9254,
|
|
24515
25256
|
"path": "../public/_nuxt/Bq_KKxCg.js"
|
|
24516
25257
|
},
|
|
24517
25258
|
"/_nuxt/Bsc69G4x.js": {
|
|
24518
25259
|
"type": "text/javascript; charset=utf-8",
|
|
24519
25260
|
"etag": "\"10b9b-CeedCLRo4KPs11whWlwTGF4MhLk\"",
|
|
24520
|
-
"mtime": "2026-09-
|
|
25261
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
24521
25262
|
"size": 68507,
|
|
24522
25263
|
"path": "../public/_nuxt/Bsc69G4x.js"
|
|
24523
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
|
+
},
|
|
24524
25272
|
"/_nuxt/BSSUlJnx2.js": {
|
|
24525
25273
|
"type": "text/javascript; charset=utf-8",
|
|
24526
25274
|
"etag": "\"5f5-t0OMayeEXY7fEaFUOlppJZZQvtM\"",
|
|
24527
|
-
"mtime": "2026-09-
|
|
25275
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24528
25276
|
"size": 1525,
|
|
24529
25277
|
"path": "../public/_nuxt/BSSUlJnx2.js"
|
|
24530
25278
|
},
|
|
24531
|
-
"/_nuxt/
|
|
24532
|
-
"type": "text/javascript; charset=utf-8",
|
|
24533
|
-
"etag": "\"50eba-EQGueVrdlEzHO7oTVt2LPxnHgRo\"",
|
|
24534
|
-
"mtime": "2026-09-02T10:11:57.242Z",
|
|
24535
|
-
"size": 331450,
|
|
24536
|
-
"path": "../public/_nuxt/BrIJiJSN.js"
|
|
24537
|
-
},
|
|
24538
|
-
"/_nuxt/BSCpFtzG.js": {
|
|
25279
|
+
"/_nuxt/BUxYN2mw.js": {
|
|
24539
25280
|
"type": "text/javascript; charset=utf-8",
|
|
24540
|
-
"etag": "\"
|
|
24541
|
-
"mtime": "2026-09-
|
|
24542
|
-
"size":
|
|
24543
|
-
"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"
|
|
24544
25285
|
},
|
|
24545
25286
|
"/_nuxt/Bxh5nf8j.js": {
|
|
24546
25287
|
"type": "text/javascript; charset=utf-8",
|
|
24547
25288
|
"etag": "\"20cd-xBG7XpkdBjW7zZsLXaS7Psed7UI\"",
|
|
24548
|
-
"mtime": "2026-09-
|
|
25289
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
24549
25290
|
"size": 8397,
|
|
24550
25291
|
"path": "../public/_nuxt/Bxh5nf8j.js"
|
|
24551
25292
|
},
|
|
25293
|
+
"/_nuxt/BrIJiJSN.js": {
|
|
25294
|
+
"type": "text/javascript; charset=utf-8",
|
|
25295
|
+
"etag": "\"50eba-EQGueVrdlEzHO7oTVt2LPxnHgRo\"",
|
|
25296
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
25297
|
+
"size": 331450,
|
|
25298
|
+
"path": "../public/_nuxt/BrIJiJSN.js"
|
|
25299
|
+
},
|
|
24552
25300
|
"/_nuxt/BUcmySDa2.js": {
|
|
24553
25301
|
"type": "text/javascript; charset=utf-8",
|
|
24554
25302
|
"etag": "\"1d27c-MrwgQiovFUP0UVtMJ1LdEF/IrEs\"",
|
|
24555
|
-
"mtime": "2026-09-
|
|
25303
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24556
25304
|
"size": 119420,
|
|
24557
25305
|
"path": "../public/_nuxt/BUcmySDa2.js"
|
|
24558
25306
|
},
|
|
25307
|
+
"/_nuxt/Ce1zyNYu.js": {
|
|
25308
|
+
"type": "text/javascript; charset=utf-8",
|
|
25309
|
+
"etag": "\"1aa4-M2wqiS1A05NQaxZt2Lkrl4z5KSs\"",
|
|
25310
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25311
|
+
"size": 6820,
|
|
25312
|
+
"path": "../public/_nuxt/Ce1zyNYu.js"
|
|
25313
|
+
},
|
|
24559
25314
|
"/_nuxt/C9f8QMp12.js": {
|
|
24560
25315
|
"type": "text/javascript; charset=utf-8",
|
|
24561
25316
|
"etag": "\"1896-VcRRXhZEm21djPt3FTvlq+iUccI\"",
|
|
24562
|
-
"mtime": "2026-09-
|
|
25317
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24563
25318
|
"size": 6294,
|
|
24564
25319
|
"path": "../public/_nuxt/C9f8QMp12.js"
|
|
24565
25320
|
},
|
|
24566
|
-
"/_nuxt/ByGNWgAr.js": {
|
|
24567
|
-
"type": "text/javascript; charset=utf-8",
|
|
24568
|
-
"etag": "\"a6ef-i08VwpGBmCrbpxIYs6NCjsMcsLM\"",
|
|
24569
|
-
"mtime": "2026-09-02T10:11:57.243Z",
|
|
24570
|
-
"size": 42735,
|
|
24571
|
-
"path": "../public/_nuxt/ByGNWgAr.js"
|
|
24572
|
-
},
|
|
24573
|
-
"/_nuxt/BUxYN2mw.js": {
|
|
24574
|
-
"type": "text/javascript; charset=utf-8",
|
|
24575
|
-
"etag": "\"1d2b-imErvR08IoUb6Oyd9b7/yZw9bss\"",
|
|
24576
|
-
"mtime": "2026-09-02T10:11:57.239Z",
|
|
24577
|
-
"size": 7467,
|
|
24578
|
-
"path": "../public/_nuxt/BUxYN2mw.js"
|
|
24579
|
-
},
|
|
24580
25321
|
"/_nuxt/BUNGEK2z.js": {
|
|
24581
25322
|
"type": "text/javascript; charset=utf-8",
|
|
24582
25323
|
"etag": "\"25f37-d9sfkQg8cXQp6meacVazS3RTaiQ\"",
|
|
24583
|
-
"mtime": "2026-09-
|
|
25324
|
+
"mtime": "2026-09-02T12:06:00.111Z",
|
|
24584
25325
|
"size": 155447,
|
|
24585
25326
|
"path": "../public/_nuxt/BUNGEK2z.js"
|
|
24586
25327
|
},
|
|
24587
|
-
"/_nuxt/
|
|
25328
|
+
"/_nuxt/ByGNWgAr.js": {
|
|
24588
25329
|
"type": "text/javascript; charset=utf-8",
|
|
24589
|
-
"etag": "\"
|
|
24590
|
-
"mtime": "2026-09-
|
|
24591
|
-
"size":
|
|
24592
|
-
"path": "../public/_nuxt/
|
|
25330
|
+
"etag": "\"a6ef-i08VwpGBmCrbpxIYs6NCjsMcsLM\"",
|
|
25331
|
+
"mtime": "2026-09-02T12:06:00.114Z",
|
|
25332
|
+
"size": 42735,
|
|
25333
|
+
"path": "../public/_nuxt/ByGNWgAr.js"
|
|
24593
25334
|
},
|
|
24594
25335
|
"/_nuxt/CE2ynNi9.js": {
|
|
24595
25336
|
"type": "text/javascript; charset=utf-8",
|
|
24596
25337
|
"etag": "\"acfe-XUIZJHCNqdlCgIFRDZiRNpy4S2w\"",
|
|
24597
|
-
"mtime": "2026-09-
|
|
25338
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24598
25339
|
"size": 44286,
|
|
24599
25340
|
"path": "../public/_nuxt/CE2ynNi9.js"
|
|
24600
25341
|
},
|
|
24601
25342
|
"/_nuxt/ChEKFMxj.js": {
|
|
24602
25343
|
"type": "text/javascript; charset=utf-8",
|
|
24603
25344
|
"etag": "\"18b-iQWgRD/SAefQcUmBu8DMSobJ8mI\"",
|
|
24604
|
-
"mtime": "2026-09-
|
|
25345
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24605
25346
|
"size": 395,
|
|
24606
25347
|
"path": "../public/_nuxt/ChEKFMxj.js"
|
|
24607
25348
|
},
|
|
24608
25349
|
"/_nuxt/channel-templates.lkqEYlWY.css": {
|
|
24609
25350
|
"type": "text/css; charset=utf-8",
|
|
24610
25351
|
"etag": "\"846-xsPqrbRlt2uxmbSxMrjhPhB1/BQ\"",
|
|
24611
|
-
"mtime": "2026-09-
|
|
25352
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
24612
25353
|
"size": 2118,
|
|
24613
25354
|
"path": "../public/_nuxt/channel-templates.lkqEYlWY.css"
|
|
24614
25355
|
},
|
|
24615
|
-
"/_nuxt/
|
|
25356
|
+
"/_nuxt/ClptO7LA.js": {
|
|
24616
25357
|
"type": "text/javascript; charset=utf-8",
|
|
24617
|
-
"etag": "\"
|
|
24618
|
-
"mtime": "2026-09-
|
|
24619
|
-
"size":
|
|
24620
|
-
"path": "../public/_nuxt/
|
|
25358
|
+
"etag": "\"62a-RPTP1S6Y/nNyCZ1fM26AbT4Fe1A\"",
|
|
25359
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25360
|
+
"size": 1578,
|
|
25361
|
+
"path": "../public/_nuxt/ClptO7LA.js"
|
|
24621
25362
|
},
|
|
24622
25363
|
"/_nuxt/Cno6kYiO2.js": {
|
|
24623
25364
|
"type": "text/javascript; charset=utf-8",
|
|
24624
25365
|
"etag": "\"f2-SIBAvqBfq2ENmoMT2zz03X9uJTg\"",
|
|
24625
|
-
"mtime": "2026-09-
|
|
25366
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24626
25367
|
"size": 242,
|
|
24627
25368
|
"path": "../public/_nuxt/Cno6kYiO2.js"
|
|
24628
25369
|
},
|
|
24629
|
-
"/_nuxt/
|
|
25370
|
+
"/_nuxt/CNs_Ozdc2.js": {
|
|
24630
25371
|
"type": "text/javascript; charset=utf-8",
|
|
24631
|
-
"etag": "\"
|
|
24632
|
-
"mtime": "2026-09-
|
|
24633
|
-
"size":
|
|
24634
|
-
"path": "../public/_nuxt/
|
|
25372
|
+
"etag": "\"1b-1MHUJYdBtOvbvPMaiQxDXp3lHyw\"",
|
|
25373
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
25374
|
+
"size": 27,
|
|
25375
|
+
"path": "../public/_nuxt/CNs_Ozdc2.js"
|
|
24635
25376
|
},
|
|
24636
25377
|
"/_nuxt/CrFGZYVB2.js": {
|
|
24637
25378
|
"type": "text/javascript; charset=utf-8",
|
|
24638
25379
|
"etag": "\"1fd9-h9Klnky7cwjw32+pRNI7dtuWAO4\"",
|
|
24639
|
-
"mtime": "2026-09-
|
|
25380
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24640
25381
|
"size": 8153,
|
|
24641
25382
|
"path": "../public/_nuxt/CrFGZYVB2.js"
|
|
24642
25383
|
},
|
|
24643
|
-
"/_nuxt/
|
|
25384
|
+
"/_nuxt/CfIXY-ET.js": {
|
|
24644
25385
|
"type": "text/javascript; charset=utf-8",
|
|
24645
|
-
"etag": "\"
|
|
24646
|
-
"mtime": "2026-09-
|
|
24647
|
-
"size":
|
|
24648
|
-
"path": "../public/_nuxt/
|
|
25386
|
+
"etag": "\"28a2f-wT9I8KiLCqQ9ynK+e7t0thS24kQ\"",
|
|
25387
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
25388
|
+
"size": 166447,
|
|
25389
|
+
"path": "../public/_nuxt/CfIXY-ET.js"
|
|
24649
25390
|
},
|
|
24650
25391
|
"/_nuxt/Bok1DRqh.js": {
|
|
24651
25392
|
"type": "text/javascript; charset=utf-8",
|
|
24652
25393
|
"etag": "\"8cc4a-revOXh+LOg3l7YA6HB855hkF4ZY\"",
|
|
24653
|
-
"mtime": "2026-09-
|
|
25394
|
+
"mtime": "2026-09-02T12:06:00.113Z",
|
|
24654
25395
|
"size": 576586,
|
|
24655
25396
|
"path": "../public/_nuxt/Bok1DRqh.js"
|
|
24656
25397
|
},
|
|
24657
25398
|
"/_nuxt/CWDzKGtj.js": {
|
|
24658
25399
|
"type": "text/javascript; charset=utf-8",
|
|
24659
25400
|
"etag": "\"664-zHaq7dnTV6E6Ze5x/fDOmuaYDa4\"",
|
|
24660
|
-
"mtime": "2026-09-
|
|
25401
|
+
"mtime": "2026-09-02T12:06:00.115Z",
|
|
24661
25402
|
"size": 1636,
|
|
24662
25403
|
"path": "../public/_nuxt/CWDzKGtj.js"
|
|
24663
25404
|
},
|
|
24664
25405
|
"/_nuxt/BGkumHZ32.js": {
|
|
24665
25406
|
"type": "text/javascript; charset=utf-8",
|
|
24666
25407
|
"etag": "\"14a0a8-FkCiOKvl5+p8em/4UNCrmbDN4qY\"",
|
|
24667
|
-
"mtime": "2026-09-
|
|
25408
|
+
"mtime": "2026-09-02T12:06:00.110Z",
|
|
24668
25409
|
"size": 1351848,
|
|
24669
25410
|
"path": "../public/_nuxt/BGkumHZ32.js"
|
|
24670
25411
|
},
|
|
24671
25412
|
"/_nuxt/CWKEp1wx2.js": {
|
|
24672
25413
|
"type": "text/javascript; charset=utf-8",
|
|
24673
25414
|
"etag": "\"555-ED/tuOi0Qdk4aSGksbI58QY+vQ8\"",
|
|
24674
|
-
"mtime": "2026-09-
|
|
25415
|
+
"mtime": "2026-09-02T12:06:00.116Z",
|
|
24675
25416
|
"size": 1365,
|
|
24676
25417
|
"path": "../public/_nuxt/CWKEp1wx2.js"
|
|
24677
25418
|
},
|
|
24678
25419
|
"/_nuxt/CXLI50Sq.js": {
|
|
24679
25420
|
"type": "text/javascript; charset=utf-8",
|
|
24680
25421
|
"etag": "\"1f3a-hlX9ru6jZckxtwzbcBYyr7wgyrY\"",
|
|
24681
|
-
"mtime": "2026-09-
|
|
25422
|
+
"mtime": "2026-09-02T12:06:00.116Z",
|
|
24682
25423
|
"size": 7994,
|
|
24683
25424
|
"path": "../public/_nuxt/CXLI50Sq.js"
|
|
24684
25425
|
},
|
|
24685
25426
|
"/_nuxt/C_gFA2H_2.js": {
|
|
24686
25427
|
"type": "text/javascript; charset=utf-8",
|
|
24687
25428
|
"etag": "\"89e-FjJprk7cJxDm6dF45I+PCzGIcG8\"",
|
|
24688
|
-
"mtime": "2026-09-
|
|
25429
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24689
25430
|
"size": 2206,
|
|
24690
25431
|
"path": "../public/_nuxt/C_gFA2H_2.js"
|
|
24691
25432
|
},
|
|
24692
|
-
"/_nuxt/D0C5Q0di.js": {
|
|
24693
|
-
"type": "text/javascript; charset=utf-8",
|
|
24694
|
-
"etag": "\"e47f-Fzcm4dFhj/kmVCb6h/Aye9ehAG4\"",
|
|
24695
|
-
"mtime": "2026-09-02T10:11:57.249Z",
|
|
24696
|
-
"size": 58495,
|
|
24697
|
-
"path": "../public/_nuxt/D0C5Q0di.js"
|
|
24698
|
-
},
|
|
24699
25433
|
"/_nuxt/D-Ne4C9a.js": {
|
|
24700
25434
|
"type": "text/javascript; charset=utf-8",
|
|
24701
25435
|
"etag": "\"1195-OssDeoy4mh8A5/QMpQbuGQHyIKQ\"",
|
|
24702
|
-
"mtime": "2026-09-
|
|
25436
|
+
"mtime": "2026-09-02T12:06:00.117Z",
|
|
24703
25437
|
"size": 4501,
|
|
24704
25438
|
"path": "../public/_nuxt/D-Ne4C9a.js"
|
|
24705
25439
|
},
|
|
24706
25440
|
"/_nuxt/D5KJ7_0V.js": {
|
|
24707
25441
|
"type": "text/javascript; charset=utf-8",
|
|
24708
25442
|
"etag": "\"56ab-vqOxu4dfOFWqC1pao4/du5wXWFk\"",
|
|
24709
|
-
"mtime": "2026-09-
|
|
25443
|
+
"mtime": "2026-09-02T12:06:00.118Z",
|
|
24710
25444
|
"size": 22187,
|
|
24711
25445
|
"path": "../public/_nuxt/D5KJ7_0V.js"
|
|
24712
25446
|
},
|
|
25447
|
+
"/_nuxt/D8DDDzV62.js": {
|
|
25448
|
+
"type": "text/javascript; charset=utf-8",
|
|
25449
|
+
"etag": "\"20cf-8a3dXj+yAc7cMA4Jnv64rxS2ouU\"",
|
|
25450
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
25451
|
+
"size": 8399,
|
|
25452
|
+
"path": "../public/_nuxt/D8DDDzV62.js"
|
|
25453
|
+
},
|
|
25454
|
+
"/_nuxt/D0C5Q0di.js": {
|
|
25455
|
+
"type": "text/javascript; charset=utf-8",
|
|
25456
|
+
"etag": "\"e47f-Fzcm4dFhj/kmVCb6h/Aye9ehAG4\"",
|
|
25457
|
+
"mtime": "2026-09-02T12:06:00.118Z",
|
|
25458
|
+
"size": 58495,
|
|
25459
|
+
"path": "../public/_nuxt/D0C5Q0di.js"
|
|
25460
|
+
},
|
|
24713
25461
|
"/_nuxt/D95h62Jn.js": {
|
|
24714
25462
|
"type": "text/javascript; charset=utf-8",
|
|
24715
25463
|
"etag": "\"3f5-sTPqCSaAt8a9YlLXlhRfFlOtmcQ\"",
|
|
24716
|
-
"mtime": "2026-09-
|
|
25464
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24717
25465
|
"size": 1013,
|
|
24718
25466
|
"path": "../public/_nuxt/D95h62Jn.js"
|
|
24719
25467
|
},
|
|
24720
|
-
"/_nuxt/
|
|
24721
|
-
"type": "text/
|
|
24722
|
-
"etag": "\"
|
|
24723
|
-
"mtime": "2026-09-
|
|
24724
|
-
"size":
|
|
24725
|
-
"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"
|
|
24726
25474
|
},
|
|
24727
25475
|
"/_nuxt/daq.m1dxZaD-.css": {
|
|
24728
25476
|
"type": "text/css; charset=utf-8",
|
|
24729
25477
|
"etag": "\"560c-zT5Vz8T4pSzxP9Cp70s8xhLLtvk\"",
|
|
24730
|
-
"mtime": "2026-09-
|
|
25478
|
+
"mtime": "2026-09-02T12:06:00.128Z",
|
|
24731
25479
|
"size": 22028,
|
|
24732
25480
|
"path": "../public/_nuxt/daq.m1dxZaD-.css"
|
|
24733
25481
|
},
|
|
25482
|
+
"/_nuxt/DdPeifHR.js": {
|
|
25483
|
+
"type": "text/javascript; charset=utf-8",
|
|
25484
|
+
"etag": "\"7ec3-Ul9ut8rzcNu1BCT2CL704Bev/mM\"",
|
|
25485
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
25486
|
+
"size": 32451,
|
|
25487
|
+
"path": "../public/_nuxt/DdPeifHR.js"
|
|
25488
|
+
},
|
|
24734
25489
|
"/_nuxt/default.iGJy9dP-.css": {
|
|
24735
25490
|
"type": "text/css; charset=utf-8",
|
|
24736
25491
|
"etag": "\"2922-+exPltwm+fwclE+cBqnrulaFObQ\"",
|
|
24737
|
-
"mtime": "2026-09-
|
|
25492
|
+
"mtime": "2026-09-02T12:06:00.129Z",
|
|
24738
25493
|
"size": 10530,
|
|
24739
25494
|
"path": "../public/_nuxt/default.iGJy9dP-.css"
|
|
24740
25495
|
},
|
|
24741
|
-
"/_nuxt/
|
|
24742
|
-
"type": "text/css; charset=utf-8",
|
|
24743
|
-
"etag": "\"2608-5iynscon3f2ARegtDxl5rYx3iYM\"",
|
|
24744
|
-
"mtime": "2026-09-02T10:11:57.265Z",
|
|
24745
|
-
"size": 9736,
|
|
24746
|
-
"path": "../public/_nuxt/dcw.C46dGiF_.css"
|
|
24747
|
-
},
|
|
24748
|
-
"/_nuxt/DdPeifHR.js": {
|
|
25496
|
+
"/_nuxt/DEHNjlTq2.js": {
|
|
24749
25497
|
"type": "text/javascript; charset=utf-8",
|
|
24750
|
-
"etag": "\"
|
|
24751
|
-
"mtime": "2026-09-
|
|
24752
|
-
"size":
|
|
24753
|
-
"path": "../public/_nuxt/
|
|
25498
|
+
"etag": "\"14fe-IJ6pssvuWomkWeOPhpylkD+TDmA\"",
|
|
25499
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
25500
|
+
"size": 5374,
|
|
25501
|
+
"path": "../public/_nuxt/DEHNjlTq2.js"
|
|
24754
25502
|
},
|
|
24755
25503
|
"/_nuxt/DEkQ0qQ02.js": {
|
|
24756
25504
|
"type": "text/javascript; charset=utf-8",
|
|
24757
25505
|
"etag": "\"4cfc-ucIBbCQ6UaqBmotD7yRBtwEHEyU\"",
|
|
24758
|
-
"mtime": "2026-09-
|
|
25506
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24759
25507
|
"size": 19708,
|
|
24760
25508
|
"path": "../public/_nuxt/DEkQ0qQ02.js"
|
|
24761
25509
|
},
|
|
24762
25510
|
"/_nuxt/DIOBYJe3.js": {
|
|
24763
25511
|
"type": "text/javascript; charset=utf-8",
|
|
24764
25512
|
"etag": "\"4b5-DdWaiyBS+/JejqhLG4Q7/JprP2Q\"",
|
|
24765
|
-
"mtime": "2026-09-
|
|
25513
|
+
"mtime": "2026-09-02T12:06:00.119Z",
|
|
24766
25514
|
"size": 1205,
|
|
24767
25515
|
"path": "../public/_nuxt/DIOBYJe3.js"
|
|
24768
25516
|
},
|
|
24769
|
-
"/_nuxt/Dm5mD6XT.js": {
|
|
24770
|
-
"type": "text/javascript; charset=utf-8",
|
|
24771
|
-
"etag": "\"23e0-HSV6+x+89Cdaxrhttr88m0kwQk4\"",
|
|
24772
|
-
"mtime": "2026-09-02T10:11:57.256Z",
|
|
24773
|
-
"size": 9184,
|
|
24774
|
-
"path": "../public/_nuxt/Dm5mD6XT.js"
|
|
24775
|
-
},
|
|
24776
25517
|
"/_nuxt/DNJSkm3Q.js": {
|
|
24777
25518
|
"type": "text/javascript; charset=utf-8",
|
|
24778
25519
|
"etag": "\"216b-y0s8z84O8dmpAUYWCz4LSRx0vJQ\"",
|
|
24779
|
-
"mtime": "2026-09-
|
|
25520
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
24780
25521
|
"size": 8555,
|
|
24781
25522
|
"path": "../public/_nuxt/DNJSkm3Q.js"
|
|
24782
25523
|
},
|
|
24783
|
-
"/_nuxt/
|
|
25524
|
+
"/_nuxt/Dm5mD6XT.js": {
|
|
24784
25525
|
"type": "text/javascript; charset=utf-8",
|
|
24785
|
-
"etag": "\"
|
|
24786
|
-
"mtime": "2026-09-
|
|
24787
|
-
"size":
|
|
24788
|
-
"path": "../public/_nuxt/
|
|
25526
|
+
"etag": "\"23e0-HSV6+x+89Cdaxrhttr88m0kwQk4\"",
|
|
25527
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25528
|
+
"size": 9184,
|
|
25529
|
+
"path": "../public/_nuxt/Dm5mD6XT.js"
|
|
24789
25530
|
},
|
|
24790
25531
|
"/_nuxt/dObsRdSQ.js": {
|
|
24791
25532
|
"type": "text/javascript; charset=utf-8",
|
|
24792
25533
|
"etag": "\"3d5-6E8m1HnkzKD1X9Hx3/ZbS1uH0vc\"",
|
|
24793
|
-
"mtime": "2026-09-
|
|
25534
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
24794
25535
|
"size": 981,
|
|
24795
25536
|
"path": "../public/_nuxt/dObsRdSQ.js"
|
|
24796
25537
|
},
|
|
25538
|
+
"/_nuxt/DPDqAD1e.js": {
|
|
25539
|
+
"type": "text/javascript; charset=utf-8",
|
|
25540
|
+
"etag": "\"4842-1Qirb7tmwMUEq9mSoIl88rnZ6Rk\"",
|
|
25541
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
25542
|
+
"size": 18498,
|
|
25543
|
+
"path": "../public/_nuxt/DPDqAD1e.js"
|
|
25544
|
+
},
|
|
24797
25545
|
"/_nuxt/DP6bdyIp.js": {
|
|
24798
25546
|
"type": "text/javascript; charset=utf-8",
|
|
24799
25547
|
"etag": "\"119c-ZH6sW8Yv0KAJf0LIwFiNMRP2kk8\"",
|
|
24800
|
-
"mtime": "2026-09-
|
|
25548
|
+
"mtime": "2026-09-02T12:06:00.120Z",
|
|
24801
25549
|
"size": 4508,
|
|
24802
25550
|
"path": "../public/_nuxt/DP6bdyIp.js"
|
|
24803
25551
|
},
|
|
24804
25552
|
"/_nuxt/DRlJ2-4p.js": {
|
|
24805
25553
|
"type": "text/javascript; charset=utf-8",
|
|
24806
25554
|
"etag": "\"628-hDE8DxhnpZ6MBeG/gHpyPnK5SpM\"",
|
|
24807
|
-
"mtime": "2026-09-
|
|
25555
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24808
25556
|
"size": 1576,
|
|
24809
25557
|
"path": "../public/_nuxt/DRlJ2-4p.js"
|
|
24810
25558
|
},
|
|
24811
|
-
"/_nuxt/DPDqAD1e.js": {
|
|
24812
|
-
"type": "text/javascript; charset=utf-8",
|
|
24813
|
-
"etag": "\"4842-1Qirb7tmwMUEq9mSoIl88rnZ6Rk\"",
|
|
24814
|
-
"mtime": "2026-09-02T10:11:57.252Z",
|
|
24815
|
-
"size": 18498,
|
|
24816
|
-
"path": "../public/_nuxt/DPDqAD1e.js"
|
|
24817
|
-
},
|
|
24818
25559
|
"/_nuxt/dRAyjbJ6.js": {
|
|
24819
25560
|
"type": "text/javascript; charset=utf-8",
|
|
24820
25561
|
"etag": "\"39890-+z0z97gM6sb8TE1hu131lbilXHI\"",
|
|
24821
|
-
"mtime": "2026-09-
|
|
25562
|
+
"mtime": "2026-09-02T12:06:00.104Z",
|
|
24822
25563
|
"size": 235664,
|
|
24823
25564
|
"path": "../public/_nuxt/dRAyjbJ6.js"
|
|
24824
25565
|
},
|
|
24825
25566
|
"/_nuxt/DRq09ZmT.js": {
|
|
24826
25567
|
"type": "text/javascript; charset=utf-8",
|
|
24827
25568
|
"etag": "\"29d-1stN5BQaapAs+Peb3DQslLQQr+0\"",
|
|
24828
|
-
"mtime": "2026-09-
|
|
25569
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24829
25570
|
"size": 669,
|
|
24830
25571
|
"path": "../public/_nuxt/DRq09ZmT.js"
|
|
24831
25572
|
},
|
|
24832
25573
|
"/_nuxt/DSBfvCi5.js": {
|
|
24833
25574
|
"type": "text/javascript; charset=utf-8",
|
|
24834
25575
|
"etag": "\"103b0-dVLvfb3xqwBE5sNRDvR7g27gNt8\"",
|
|
24835
|
-
"mtime": "2026-09-
|
|
25576
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24836
25577
|
"size": 66480,
|
|
24837
25578
|
"path": "../public/_nuxt/DSBfvCi5.js"
|
|
24838
25579
|
},
|
|
24839
25580
|
"/_nuxt/dt2tKE95.js": {
|
|
24840
25581
|
"type": "text/javascript; charset=utf-8",
|
|
24841
25582
|
"etag": "\"4cc1-PBJBqFz6X1T5i/2dfz7MZ6G+XKY\"",
|
|
24842
|
-
"mtime": "2026-09-
|
|
25583
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
24843
25584
|
"size": 19649,
|
|
24844
25585
|
"path": "../public/_nuxt/dt2tKE95.js"
|
|
24845
25586
|
},
|
|
24846
25587
|
"/_nuxt/DVNYfGsj.js": {
|
|
24847
25588
|
"type": "text/javascript; charset=utf-8",
|
|
24848
25589
|
"etag": "\"38f6-6B6Wxe3QzLxU6lfCKri39neupqQ\"",
|
|
24849
|
-
"mtime": "2026-09-
|
|
25590
|
+
"mtime": "2026-09-02T12:06:00.121Z",
|
|
24850
25591
|
"size": 14582,
|
|
24851
25592
|
"path": "../public/_nuxt/DVNYfGsj.js"
|
|
24852
25593
|
},
|
|
24853
|
-
"/_nuxt/DVQAz9WI.js": {
|
|
24854
|
-
"type": "text/javascript; charset=utf-8",
|
|
24855
|
-
"etag": "\"130c-rUMRdwb4oHiuX7IOXv/sclpvuds\"",
|
|
24856
|
-
"mtime": "2026-09-02T10:11:57.254Z",
|
|
24857
|
-
"size": 4876,
|
|
24858
|
-
"path": "../public/_nuxt/DVQAz9WI.js"
|
|
24859
|
-
},
|
|
24860
25594
|
"/_nuxt/DXK1U43I.js": {
|
|
24861
25595
|
"type": "text/javascript; charset=utf-8",
|
|
24862
25596
|
"etag": "\"4e6e-0ajU7w+quumividScJQJc/QFBDw\"",
|
|
24863
|
-
"mtime": "2026-09-
|
|
25597
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
24864
25598
|
"size": 20078,
|
|
24865
25599
|
"path": "../public/_nuxt/DXK1U43I.js"
|
|
24866
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
|
+
},
|
|
24867
25608
|
"/_nuxt/DYWgGHNo.js": {
|
|
24868
25609
|
"type": "text/javascript; charset=utf-8",
|
|
24869
25610
|
"etag": "\"587c-klAZIaxStgu8xNRhCveCQsbbAa8\"",
|
|
24870
|
-
"mtime": "2026-09-
|
|
25611
|
+
"mtime": "2026-09-02T12:06:00.122Z",
|
|
24871
25612
|
"size": 22652,
|
|
24872
25613
|
"path": "../public/_nuxt/DYWgGHNo.js"
|
|
24873
25614
|
},
|
|
24874
25615
|
"/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2": {
|
|
24875
25616
|
"type": "font/woff2",
|
|
24876
25617
|
"etag": "\"3504-t17DeaJZ5CiTr/7PdWXcRgN9/Yc\"",
|
|
24877
|
-
"mtime": "2026-09-
|
|
25618
|
+
"mtime": "2026-09-02T12:06:00.129Z",
|
|
24878
25619
|
"size": 13572,
|
|
24879
25620
|
"path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.BGIwiowF.woff2"
|
|
24880
25621
|
},
|
|
24881
|
-
"/_nuxt/eb-garamond-cyrillic-400-
|
|
24882
|
-
"type": "font/
|
|
24883
|
-
"etag": "\"
|
|
24884
|
-
"mtime": "2026-09-
|
|
24885
|
-
"size":
|
|
24886
|
-
"path": "../public/_nuxt/eb-garamond-cyrillic-400-
|
|
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"
|
|
24887
25628
|
},
|
|
24888
25629
|
"/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff": {
|
|
24889
25630
|
"type": "font/woff",
|
|
24890
25631
|
"etag": "\"3c88-Q5XoFKe1rGp1UkdvSR6MtPcFfgQ\"",
|
|
24891
|
-
"mtime": "2026-09-
|
|
25632
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
24892
25633
|
"size": 15496,
|
|
24893
25634
|
"path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.C0kVTdou.woff"
|
|
24894
25635
|
},
|
|
24895
|
-
"/_nuxt/eb-garamond-cyrillic-400-
|
|
25636
|
+
"/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2": {
|
|
25637
|
+
"type": "font/woff2",
|
|
25638
|
+
"etag": "\"33d4-lVrdxXudnaWAAL0JfU6b+yZGpK0\"",
|
|
25639
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
25640
|
+
"size": 13268,
|
|
25641
|
+
"path": "../public/_nuxt/eb-garamond-cyrillic-400-normal.DDLP67lu.woff2"
|
|
25642
|
+
},
|
|
25643
|
+
"/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2": {
|
|
25644
|
+
"type": "font/woff2",
|
|
25645
|
+
"etag": "\"4620-AEmSjSDDFDLAiok0BdjqqFs2mx4\"",
|
|
25646
|
+
"mtime": "2026-09-02T12:06:00.130Z",
|
|
25647
|
+
"size": 17952,
|
|
25648
|
+
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2"
|
|
25649
|
+
},
|
|
25650
|
+
"/_nuxt/eb-garamond-cyrillic-ext-400-italic.CYS3phfl.woff": {
|
|
24896
25651
|
"type": "font/woff",
|
|
24897
|
-
"etag": "\"
|
|
24898
|
-
"mtime": "2026-09-
|
|
24899
|
-
"size":
|
|
24900
|
-
"path": "../public/_nuxt/eb-garamond-cyrillic-400-italic.
|
|
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"
|
|
24901
25656
|
},
|
|
24902
25657
|
"/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff": {
|
|
24903
25658
|
"type": "font/woff",
|
|
24904
25659
|
"etag": "\"4fcc-Wt58DNvJEH8PhhsEwR/fAuZLZf0\"",
|
|
24905
|
-
"mtime": "2026-09-
|
|
25660
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24906
25661
|
"size": 20428,
|
|
24907
25662
|
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.DG8lny6_.woff"
|
|
24908
25663
|
},
|
|
24909
|
-
"/_nuxt/eb-garamond-
|
|
25664
|
+
"/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
|
|
24910
25665
|
"type": "font/woff",
|
|
24911
|
-
"etag": "\"
|
|
24912
|
-
"mtime": "2026-09-
|
|
24913
|
-
"size":
|
|
24914
|
-
"path": "../public/_nuxt/eb-garamond-
|
|
24915
|
-
},
|
|
24916
|
-
"/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2": {
|
|
24917
|
-
"type": "font/woff2",
|
|
24918
|
-
"etag": "\"4620-AEmSjSDDFDLAiok0BdjqqFs2mx4\"",
|
|
24919
|
-
"mtime": "2026-09-02T10:11:57.268Z",
|
|
24920
|
-
"size": 17952,
|
|
24921
|
-
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-italic.Bz1w3xqM.woff2"
|
|
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"
|
|
24922
25670
|
},
|
|
24923
25671
|
"/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2": {
|
|
24924
25672
|
"type": "font/woff2",
|
|
24925
25673
|
"etag": "\"419c-BgVrkDzxBAskhVuAe8ZPKrVJ2vk\"",
|
|
24926
|
-
"mtime": "2026-09-
|
|
25674
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24927
25675
|
"size": 16796,
|
|
24928
25676
|
"path": "../public/_nuxt/eb-garamond-cyrillic-ext-400-normal.o8fRvAFQ.woff2"
|
|
24929
25677
|
},
|
|
24930
|
-
"/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff": {
|
|
24931
|
-
"type": "font/woff",
|
|
24932
|
-
"etag": "\"307c-Fmorq8T0Tyl1FByuAGfnIMJMsU0\"",
|
|
24933
|
-
"mtime": "2026-09-02T10:11:57.269Z",
|
|
24934
|
-
"size": 12412,
|
|
24935
|
-
"path": "../public/_nuxt/eb-garamond-greek-400-italic.BamGE6QP.woff"
|
|
24936
|
-
},
|
|
24937
25678
|
"/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2": {
|
|
24938
25679
|
"type": "font/woff2",
|
|
24939
25680
|
"etag": "\"2a00-ZNzj8SIiN3t2N23u++WhC6jE8gk\"",
|
|
24940
|
-
"mtime": "2026-09-
|
|
25681
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24941
25682
|
"size": 10752,
|
|
24942
25683
|
"path": "../public/_nuxt/eb-garamond-greek-400-normal.CVAbzS9p.woff2"
|
|
24943
25684
|
},
|
|
24944
25685
|
"/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2": {
|
|
24945
25686
|
"type": "font/woff2",
|
|
24946
25687
|
"etag": "\"2904-BXAeLh8O+jrT8ujKrV7WtU2zP1c\"",
|
|
24947
|
-
"mtime": "2026-09-
|
|
25688
|
+
"mtime": "2026-09-02T12:06:00.131Z",
|
|
24948
25689
|
"size": 10500,
|
|
24949
25690
|
"path": "../public/_nuxt/eb-garamond-greek-400-italic.Dqr5KC66.woff2"
|
|
24950
25691
|
},
|
|
24951
25692
|
"/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff": {
|
|
24952
25693
|
"type": "font/woff",
|
|
24953
25694
|
"etag": "\"3108-ggShwQ6kE+MAR7EEQafdmWunxHg\"",
|
|
24954
|
-
"mtime": "2026-09-
|
|
25695
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
24955
25696
|
"size": 12552,
|
|
24956
25697
|
"path": "../public/_nuxt/eb-garamond-greek-400-normal.d4JlP2QH.woff"
|
|
24957
25698
|
},
|
|
24958
25699
|
"/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2": {
|
|
24959
25700
|
"type": "font/woff2",
|
|
24960
25701
|
"etag": "\"19d0-ppOK6AfNTXYuDEeeEMQQhOypGW8\"",
|
|
24961
|
-
"mtime": "2026-09-
|
|
25702
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
24962
25703
|
"size": 6608,
|
|
24963
25704
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.CHZOQEtG.woff2"
|
|
24964
25705
|
},
|
|
24965
25706
|
"/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff": {
|
|
24966
25707
|
"type": "font/woff",
|
|
24967
25708
|
"etag": "\"20b0-FNV/ZgjupejIrGOsz4+8EYVUXHo\"",
|
|
24968
|
-
"mtime": "2026-09-
|
|
25709
|
+
"mtime": "2026-09-02T12:06:00.132Z",
|
|
24969
25710
|
"size": 8368,
|
|
24970
25711
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.BaZl8BIK.woff"
|
|
24971
25712
|
},
|
|
24972
|
-
"/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff": {
|
|
24973
|
-
"type": "font/woff",
|
|
24974
|
-
"etag": "\"2304-q8ppn7qePqLys53UrEKMrGT8e6E\"",
|
|
24975
|
-
"mtime": "2026-09-02T10:11:57.271Z",
|
|
24976
|
-
"size": 8964,
|
|
24977
|
-
"path": "../public/_nuxt/eb-garamond-greek-ext-400-italic.BL1XYHtS.woff"
|
|
24978
|
-
},
|
|
24979
25713
|
"/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2": {
|
|
24980
25714
|
"type": "font/woff2",
|
|
24981
25715
|
"etag": "\"1940-Y3hsqG2RXMGI9hHTiI+Nv2Q4msM\"",
|
|
24982
|
-
"mtime": "2026-09-
|
|
25716
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
24983
25717
|
"size": 6464,
|
|
24984
25718
|
"path": "../public/_nuxt/eb-garamond-greek-ext-400-normal.K8pwR3tn.woff2"
|
|
24985
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
|
+
},
|
|
24986
25727
|
"/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff": {
|
|
24987
25728
|
"type": "font/woff",
|
|
24988
25729
|
"etag": "\"7890-VX8YYh09367bg28IWSUybEXrsDQ\"",
|
|
24989
|
-
"mtime": "2026-09-
|
|
25730
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
24990
25731
|
"size": 30864,
|
|
24991
25732
|
"path": "../public/_nuxt/eb-garamond-latin-400-italic.CDFyLPXJ.woff"
|
|
24992
25733
|
},
|
|
24993
|
-
"/_nuxt/eb-garamond-
|
|
24994
|
-
"type": "font/
|
|
24995
|
-
"etag": "\"
|
|
24996
|
-
"mtime": "2026-09-
|
|
24997
|
-
"size":
|
|
24998
|
-
"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"
|
|
24999
25740
|
},
|
|
25000
25741
|
"/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2": {
|
|
25001
25742
|
"type": "font/woff2",
|
|
25002
25743
|
"etag": "\"5d0c-w7FmIa34l5RBoJYmvp9lwadEvW4\"",
|
|
25003
|
-
"mtime": "2026-09-
|
|
25744
|
+
"mtime": "2026-09-02T12:06:00.133Z",
|
|
25004
25745
|
"size": 23820,
|
|
25005
25746
|
"path": "../public/_nuxt/eb-garamond-latin-400-normal.BCNrxLz_.woff2"
|
|
25006
25747
|
},
|
|
25007
25748
|
"/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff": {
|
|
25008
25749
|
"type": "font/woff",
|
|
25009
25750
|
"etag": "\"6fc0-tKFcVMt7ocp7dmWyG6/kxtP5mKY\"",
|
|
25010
|
-
"mtime": "2026-09-
|
|
25751
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25011
25752
|
"size": 28608,
|
|
25012
25753
|
"path": "../public/_nuxt/eb-garamond-latin-400-normal.maQnHeKB.woff"
|
|
25013
25754
|
},
|
|
25014
25755
|
"/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff": {
|
|
25015
25756
|
"type": "font/woff",
|
|
25016
25757
|
"etag": "\"f5b8-o98RIl4uKzIPJHZZpEI+mI17K3c\"",
|
|
25017
|
-
"mtime": "2026-09-
|
|
25758
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25018
25759
|
"size": 62904,
|
|
25019
25760
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.DUSsnRSD.woff"
|
|
25020
25761
|
},
|
|
25021
25762
|
"/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2": {
|
|
25022
25763
|
"type": "font/woff2",
|
|
25023
25764
|
"etag": "\"b19c-7qms9anmdJJsBixQTHSocgV31Qk\"",
|
|
25024
|
-
"mtime": "2026-09-
|
|
25765
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25025
25766
|
"size": 45468,
|
|
25026
25767
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-italic.V7s3nWfX.woff2"
|
|
25027
25768
|
},
|
|
25028
25769
|
"/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff": {
|
|
25029
25770
|
"type": "font/woff",
|
|
25030
25771
|
"etag": "\"12b44-jg/K3aZca4XOngCAf1Jh47/0cj8\"",
|
|
25031
|
-
"mtime": "2026-09-
|
|
25772
|
+
"mtime": "2026-09-02T12:06:00.134Z",
|
|
25032
25773
|
"size": 76612,
|
|
25033
25774
|
"path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.B4EmgUmt.woff"
|
|
25034
25775
|
},
|
|
25776
|
+
"/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2": {
|
|
25777
|
+
"type": "font/woff2",
|
|
25778
|
+
"etag": "\"de84-qKZ/sgxlZLRv1TmEnWR30Cc4wfw\"",
|
|
25779
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25780
|
+
"size": 56964,
|
|
25781
|
+
"path": "../public/_nuxt/eb-garamond-latin-ext-400-normal.o4A__6QZ.woff2"
|
|
25782
|
+
},
|
|
25035
25783
|
"/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff": {
|
|
25036
25784
|
"type": "font/woff",
|
|
25037
25785
|
"etag": "\"1edc-XUugZ4qMSSF4m+TQLER2LLza1t0\"",
|
|
25038
|
-
"mtime": "2026-09-
|
|
25786
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25039
25787
|
"size": 7900,
|
|
25040
25788
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.ORtyMVfw.woff"
|
|
25041
25789
|
},
|
|
25042
25790
|
"/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2": {
|
|
25043
25791
|
"type": "font/woff2",
|
|
25044
25792
|
"etag": "\"187c-Wj36AOh9OjwDZT5W3eeao1D/NT4\"",
|
|
25045
|
-
"mtime": "2026-09-
|
|
25793
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25046
25794
|
"size": 6268,
|
|
25047
25795
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-italic.DQ8HKnks.woff2"
|
|
25048
25796
|
},
|
|
25049
|
-
"/_nuxt/eb-garamond-
|
|
25050
|
-
"type": "font/woff2",
|
|
25051
|
-
"etag": "\"
|
|
25052
|
-
"mtime": "2026-09-
|
|
25053
|
-
"size":
|
|
25054
|
-
"path": "../public/_nuxt/eb-garamond-
|
|
25797
|
+
"/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2": {
|
|
25798
|
+
"type": "font/woff2",
|
|
25799
|
+
"etag": "\"183c-arAHcc3MmJQ6+OtYVThlERUqDQQ\"",
|
|
25800
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25801
|
+
"size": 6204,
|
|
25802
|
+
"path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.CLvJdMEL.woff2"
|
|
25055
25803
|
},
|
|
25056
25804
|
"/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff": {
|
|
25057
25805
|
"type": "font/woff",
|
|
25058
25806
|
"etag": "\"1e50-PGVIQbsmhTvI1h5aIhavpIQl8z4\"",
|
|
25059
|
-
"mtime": "2026-09-
|
|
25807
|
+
"mtime": "2026-09-02T12:06:00.135Z",
|
|
25060
25808
|
"size": 7760,
|
|
25061
25809
|
"path": "../public/_nuxt/eb-garamond-vietnamese-400-normal.ifvNSiWx.woff"
|
|
25062
25810
|
},
|
|
25063
|
-
"/_nuxt/
|
|
25064
|
-
"type": "
|
|
25065
|
-
"etag": "\"
|
|
25066
|
-
"mtime": "2026-09-
|
|
25067
|
-
"size":
|
|
25068
|
-
"path": "../public/_nuxt/
|
|
25811
|
+
"/_nuxt/eHGLpQSg2.js": {
|
|
25812
|
+
"type": "text/javascript; charset=utf-8",
|
|
25813
|
+
"etag": "\"53-ZhaD2u1M9e+y/KP/l2gUqGdFFkk\"",
|
|
25814
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
25815
|
+
"size": 83,
|
|
25816
|
+
"path": "../public/_nuxt/eHGLpQSg2.js"
|
|
25069
25817
|
},
|
|
25070
25818
|
"/_nuxt/entry.DjhxLu-f.css": {
|
|
25071
25819
|
"type": "text/css; charset=utf-8",
|
|
25072
25820
|
"etag": "\"1bca7-dJlPlclu3mtzpf30VOFtuTMDCds\"",
|
|
25073
|
-
"mtime": "2026-09-
|
|
25821
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25074
25822
|
"size": 113831,
|
|
25075
25823
|
"path": "../public/_nuxt/entry.DjhxLu-f.css"
|
|
25076
25824
|
},
|
|
25077
|
-
"/_nuxt/
|
|
25078
|
-
"type": "
|
|
25079
|
-
"etag": "\"
|
|
25080
|
-
"mtime": "2026-09-
|
|
25081
|
-
"size":
|
|
25082
|
-
"path": "../public/_nuxt/
|
|
25825
|
+
"/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2": {
|
|
25826
|
+
"type": "font/woff2",
|
|
25827
|
+
"etag": "\"3aec-5kpQSZEtAzzU5kdiuro3Zr2YR54\"",
|
|
25828
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25829
|
+
"size": 15084,
|
|
25830
|
+
"path": "../public/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2"
|
|
25083
25831
|
},
|
|
25084
25832
|
"/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2": {
|
|
25085
25833
|
"type": "font/woff2",
|
|
25086
25834
|
"etag": "\"1cfc-yYSDXNlt/tTRaj6rJo8ZMqvY7pQ\"",
|
|
25087
|
-
"mtime": "2026-09-
|
|
25835
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25088
25836
|
"size": 7420,
|
|
25089
25837
|
"path": "../public/_nuxt/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2"
|
|
25090
25838
|
},
|
|
25091
25839
|
"/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2": {
|
|
25092
25840
|
"type": "font/woff2",
|
|
25093
25841
|
"etag": "\"4080-mZu3Z7sOWqglha+kefNbUA9Pp+Q\"",
|
|
25094
|
-
"mtime": "2026-09-
|
|
25842
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25095
25843
|
"size": 16512,
|
|
25096
25844
|
"path": "../public/_nuxt/geist-latin-ext-wght-normal.DC-KSUi6.woff2"
|
|
25097
25845
|
},
|
|
25098
|
-
"/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2": {
|
|
25099
|
-
"type": "font/woff2",
|
|
25100
|
-
"etag": "\"3aec-5kpQSZEtAzzU5kdiuro3Zr2YR54\"",
|
|
25101
|
-
"mtime": "2026-09-02T10:11:57.277Z",
|
|
25102
|
-
"size": 15084,
|
|
25103
|
-
"path": "../public/_nuxt/geist-cyrillic-wght-normal.BEAKL7Jp.woff2"
|
|
25104
|
-
},
|
|
25105
25846
|
"/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2": {
|
|
25106
25847
|
"type": "font/woff2",
|
|
25107
25848
|
"etag": "\"72d8-9J+D7/6th5UzRxIgoFX9awJv47A\"",
|
|
25108
|
-
"mtime": "2026-09-
|
|
25849
|
+
"mtime": "2026-09-02T12:06:00.136Z",
|
|
25109
25850
|
"size": 29400,
|
|
25110
25851
|
"path": "../public/_nuxt/geist-latin-wght-normal.BgDaEnEv.woff2"
|
|
25111
25852
|
},
|
|
25112
25853
|
"/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2": {
|
|
25113
25854
|
"type": "font/woff2",
|
|
25114
25855
|
"etag": "\"328c-3kQUs7xjzfvJdLvI58iU6DHlynA\"",
|
|
25115
|
-
"mtime": "2026-09-
|
|
25856
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25116
25857
|
"size": 12940,
|
|
25117
25858
|
"path": "../public/_nuxt/geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2"
|
|
25118
25859
|
},
|
|
25119
25860
|
"/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2": {
|
|
25120
25861
|
"type": "font/woff2",
|
|
25121
25862
|
"etag": "\"1820-nQACIwCsmkduQK2CSMidMhmLR9U\"",
|
|
25122
|
-
"mtime": "2026-09-
|
|
25863
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25123
25864
|
"size": 6176,
|
|
25124
25865
|
"path": "../public/_nuxt/geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2"
|
|
25125
25866
|
},
|
|
25126
25867
|
"/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2": {
|
|
25127
25868
|
"type": "font/woff2",
|
|
25128
25869
|
"etag": "\"3968-BV9ZbqWHVAcipAKX5y8la3JkUQs\"",
|
|
25129
|
-
"mtime": "2026-09-
|
|
25870
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25130
25871
|
"size": 14696,
|
|
25131
25872
|
"path": "../public/_nuxt/geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2"
|
|
25132
25873
|
},
|
|
25133
25874
|
"/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2": {
|
|
25134
25875
|
"type": "font/woff2",
|
|
25135
25876
|
"etag": "\"5a58-jDy+14PX7OhwqFZsiKzuRax9xZ8\"",
|
|
25136
|
-
"mtime": "2026-09-
|
|
25877
|
+
"mtime": "2026-09-02T12:06:00.137Z",
|
|
25137
25878
|
"size": 23128,
|
|
25138
25879
|
"path": "../public/_nuxt/geist-mono-latin-wght-normal.XN7g48iV.woff2"
|
|
25139
25880
|
},
|
|
25140
25881
|
"/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2": {
|
|
25141
25882
|
"type": "font/woff2",
|
|
25142
25883
|
"etag": "\"1e10-mpU2OlFk4DakDO4paRfgJ2LHDsM\"",
|
|
25143
|
-
"mtime": "2026-09-
|
|
25884
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25144
25885
|
"size": 7696,
|
|
25145
25886
|
"path": "../public/_nuxt/geist-mono-vietnamese-wght-normal.DadHysG0.woff2"
|
|
25146
25887
|
},
|
|
25147
25888
|
"/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2": {
|
|
25148
25889
|
"type": "font/woff2",
|
|
25149
25890
|
"etag": "\"16b4-aZoLOGWoEYW7gmwZamfz5kTfFco\"",
|
|
25150
|
-
"mtime": "2026-09-
|
|
25891
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25151
25892
|
"size": 5812,
|
|
25152
25893
|
"path": "../public/_nuxt/geist-mono-symbols2-wght-normal.CO5SzqOn.woff2"
|
|
25153
25894
|
},
|
|
25154
25895
|
"/_nuxt/HclGiUj8.js": {
|
|
25155
25896
|
"type": "text/javascript; charset=utf-8",
|
|
25156
25897
|
"etag": "\"4bb-OjUbx7m0dPDFUkNfZ4BuUs+1sHI\"",
|
|
25157
|
-
"mtime": "2026-09-
|
|
25898
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25158
25899
|
"size": 1211,
|
|
25159
25900
|
"path": "../public/_nuxt/HclGiUj8.js"
|
|
25160
25901
|
},
|
|
25161
25902
|
"/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2": {
|
|
25162
25903
|
"type": "font/woff2",
|
|
25163
25904
|
"etag": "\"1f44-6MZ7/PEEOeDVF0eHI650KpwKQV8\"",
|
|
25164
|
-
"mtime": "2026-09-
|
|
25905
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25165
25906
|
"size": 8004,
|
|
25166
25907
|
"path": "../public/_nuxt/geist-vietnamese-wght-normal.6IgcOCM7.woff2"
|
|
25167
25908
|
},
|
|
25168
25909
|
"/_nuxt/HWXLx5Hz.js": {
|
|
25169
25910
|
"type": "text/javascript; charset=utf-8",
|
|
25170
25911
|
"etag": "\"3339-T0Y5onZ5wyZwFT6zTIO03qyuPeQ\"",
|
|
25171
|
-
"mtime": "2026-09-
|
|
25912
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25172
25913
|
"size": 13113,
|
|
25173
25914
|
"path": "../public/_nuxt/HWXLx5Hz.js"
|
|
25174
25915
|
},
|
|
25175
25916
|
"/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2": {
|
|
25176
25917
|
"type": "font/woff2",
|
|
25177
25918
|
"etag": "\"20a4-mDbzFbXDuciYuRDdYbcJkcocaWU\"",
|
|
25178
|
-
"mtime": "2026-09-
|
|
25919
|
+
"mtime": "2026-09-02T12:06:00.138Z",
|
|
25179
25920
|
"size": 8356,
|
|
25180
25921
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2"
|
|
25181
25922
|
},
|
|
25182
25923
|
"/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff": {
|
|
25183
25924
|
"type": "font/woff",
|
|
25184
25925
|
"etag": "\"1c24-wpeoT2YBcqJ4hbipsoiB1m58w98\"",
|
|
25185
|
-
"mtime": "2026-09-
|
|
25926
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25186
25927
|
"size": 7204,
|
|
25187
25928
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff"
|
|
25188
25929
|
},
|
|
25189
25930
|
"/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff": {
|
|
25190
25931
|
"type": "font/woff",
|
|
25191
25932
|
"etag": "\"1c28-50yap58S0sLYRB2B8AEk2dq82kg\"",
|
|
25192
|
-
"mtime": "2026-09-
|
|
25933
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25193
25934
|
"size": 7208,
|
|
25194
25935
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff"
|
|
25195
25936
|
},
|
|
25196
|
-
"/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2": {
|
|
25197
|
-
"type": "font/woff2",
|
|
25198
|
-
"etag": "\"210c-yqAnW+098RkHUvQzwj27Jo9sIUc\"",
|
|
25199
|
-
"mtime": "2026-09-02T10:11:57.281Z",
|
|
25200
|
-
"size": 8460,
|
|
25201
|
-
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2"
|
|
25202
|
-
},
|
|
25203
25937
|
"/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2": {
|
|
25204
25938
|
"type": "font/woff2",
|
|
25205
25939
|
"etag": "\"2488-WHfw+ZaOHy8HhYaV0AzfKZ8dozA\"",
|
|
25206
|
-
"mtime": "2026-09-
|
|
25940
|
+
"mtime": "2026-09-02T12:06:00.139Z",
|
|
25207
25941
|
"size": 9352,
|
|
25208
25942
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2"
|
|
25209
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
|
+
},
|
|
25210
25951
|
"/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff": {
|
|
25211
25952
|
"type": "font/woff",
|
|
25212
25953
|
"etag": "\"1c64-t3eBraFEv1B6D+DIfK23+8/F2mA\"",
|
|
25213
|
-
"mtime": "2026-09-
|
|
25954
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25214
25955
|
"size": 7268,
|
|
25215
25956
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff"
|
|
25216
25957
|
},
|
|
25217
25958
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff": {
|
|
25218
25959
|
"type": "font/woff",
|
|
25219
25960
|
"etag": "\"16bc-GBHBT1lClOFRLkxzjkkoZV1QN+Y\"",
|
|
25220
|
-
"mtime": "2026-09-
|
|
25961
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25221
25962
|
"size": 5820,
|
|
25222
25963
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff"
|
|
25223
25964
|
},
|
|
25224
25965
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2": {
|
|
25225
25966
|
"type": "font/woff2",
|
|
25226
25967
|
"etag": "\"1b00-w57wcK5m30ZZ4sBwsaWzlcI3F7c\"",
|
|
25227
|
-
"mtime": "2026-09-
|
|
25968
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25228
25969
|
"size": 6912,
|
|
25229
25970
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2"
|
|
25230
25971
|
},
|
|
25231
25972
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff": {
|
|
25232
25973
|
"type": "font/woff",
|
|
25233
25974
|
"etag": "\"168c-gvDCX7ATl9g9LbPEKlQjJSXhRPw\"",
|
|
25234
|
-
"mtime": "2026-09-
|
|
25975
|
+
"mtime": "2026-09-02T12:06:00.140Z",
|
|
25235
25976
|
"size": 5772,
|
|
25236
25977
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff"
|
|
25237
25978
|
},
|
|
25238
|
-
"/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff": {
|
|
25239
|
-
"type": "font/woff",
|
|
25240
|
-
"etag": "\"16a0-8RgtlGopOkBt2P4jKMMd7hk+D74\"",
|
|
25241
|
-
"mtime": "2026-09-02T10:11:57.284Z",
|
|
25242
|
-
"size": 5792,
|
|
25243
|
-
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff"
|
|
25244
|
-
},
|
|
25245
25979
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2": {
|
|
25246
25980
|
"type": "font/woff2",
|
|
25247
25981
|
"etag": "\"1b3c-pFin0Xk9XlGLhqdo1+npFJkyQ5Y\"",
|
|
25248
|
-
"mtime": "2026-09-
|
|
25982
|
+
"mtime": "2026-09-02T12:06:00.141Z",
|
|
25249
25983
|
"size": 6972,
|
|
25250
25984
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2"
|
|
25251
25985
|
},
|
|
25252
|
-
"/_nuxt/ibm-plex-mono-
|
|
25986
|
+
"/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff": {
|
|
25253
25987
|
"type": "font/woff",
|
|
25254
|
-
"etag": "\"
|
|
25255
|
-
"mtime": "2026-09-
|
|
25256
|
-
"size":
|
|
25257
|
-
"path": "../public/_nuxt/ibm-plex-mono-
|
|
25988
|
+
"etag": "\"16a0-8RgtlGopOkBt2P4jKMMd7hk+D74\"",
|
|
25989
|
+
"mtime": "2026-09-02T12:06:00.141Z",
|
|
25990
|
+
"size": 5792,
|
|
25991
|
+
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff"
|
|
25258
25992
|
},
|
|
25259
25993
|
"/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2": {
|
|
25260
25994
|
"type": "font/woff2",
|
|
25261
25995
|
"etag": "\"1e0c-R9/TBUX2qLWGlHeC55LoggyLdII\"",
|
|
25262
|
-
"mtime": "2026-09-
|
|
25996
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25263
25997
|
"size": 7692,
|
|
25264
25998
|
"path": "../public/_nuxt/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2"
|
|
25265
25999
|
},
|
|
26000
|
+
"/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff": {
|
|
26001
|
+
"type": "font/woff",
|
|
26002
|
+
"etag": "\"3358-rWMSbc9cch7FBErQpfnWcshAYFM\"",
|
|
26003
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
26004
|
+
"size": 13144,
|
|
26005
|
+
"path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff"
|
|
26006
|
+
},
|
|
25266
26007
|
"/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2": {
|
|
25267
26008
|
"type": "font/woff2",
|
|
25268
26009
|
"etag": "\"3974-u4dQDjIEo6fGXWYzx5xchAw76NM\"",
|
|
25269
|
-
"mtime": "2026-09-
|
|
26010
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25270
26011
|
"size": 14708,
|
|
25271
26012
|
"path": "../public/_nuxt/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2"
|
|
25272
26013
|
},
|
|
25273
26014
|
"/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff": {
|
|
25274
26015
|
"type": "font/woff",
|
|
25275
26016
|
"etag": "\"3364-S8wip5no4QO46BFh3FPzQKpIOec\"",
|
|
25276
|
-
"mtime": "2026-09-
|
|
26017
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25277
26018
|
"size": 13156,
|
|
25278
26019
|
"path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff"
|
|
25279
26020
|
},
|
|
25280
26021
|
"/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2": {
|
|
25281
26022
|
"type": "font/woff2",
|
|
25282
26023
|
"etag": "\"3a28-0y8OBwGsYgQ4QBMagAznF6huTuI\"",
|
|
25283
|
-
"mtime": "2026-09-
|
|
26024
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25284
26025
|
"size": 14888,
|
|
25285
26026
|
"path": "../public/_nuxt/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2"
|
|
25286
26027
|
},
|
|
25287
26028
|
"/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff": {
|
|
25288
26029
|
"type": "font/woff",
|
|
25289
26030
|
"etag": "\"3398-D/GHpHo4zls8HLHH2boKeigB6S4\"",
|
|
25290
|
-
"mtime": "2026-09-
|
|
26031
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25291
26032
|
"size": 13208,
|
|
25292
26033
|
"path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff"
|
|
25293
26034
|
},
|
|
25294
26035
|
"/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2": {
|
|
25295
26036
|
"type": "font/woff2",
|
|
25296
26037
|
"etag": "\"3d04-zppco6h02pIBwmMMXLe/qpaIwFI\"",
|
|
25297
|
-
"mtime": "2026-09-
|
|
26038
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25298
26039
|
"size": 15620,
|
|
25299
26040
|
"path": "../public/_nuxt/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2"
|
|
25300
26041
|
},
|
|
25301
|
-
"/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff": {
|
|
25302
|
-
"type": "font/woff",
|
|
25303
|
-
"etag": "\"2df8-dfJwTWMZxHyGnUuJDGfpU4w2dLs\"",
|
|
25304
|
-
"mtime": "2026-09-02T10:11:57.287Z",
|
|
25305
|
-
"size": 11768,
|
|
25306
|
-
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff"
|
|
25307
|
-
},
|
|
25308
26042
|
"/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2": {
|
|
25309
26043
|
"type": "font/woff2",
|
|
25310
26044
|
"etag": "\"3424-SvjO9SK9iRLLL61B4GuQJWQP62I\"",
|
|
25311
|
-
"mtime": "2026-09-
|
|
26045
|
+
"mtime": "2026-09-02T12:06:00.142Z",
|
|
25312
26046
|
"size": 13348,
|
|
25313
26047
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2"
|
|
25314
26048
|
},
|
|
26049
|
+
"/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff": {
|
|
26050
|
+
"type": "font/woff",
|
|
26051
|
+
"etag": "\"2df8-dfJwTWMZxHyGnUuJDGfpU4w2dLs\"",
|
|
26052
|
+
"mtime": "2026-09-02T12:06:00.143Z",
|
|
26053
|
+
"size": 11768,
|
|
26054
|
+
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff"
|
|
26055
|
+
},
|
|
25315
26056
|
"/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff": {
|
|
25316
26057
|
"type": "font/woff",
|
|
25317
26058
|
"etag": "\"2df8-73sb1BUyjMsq70ppsdZBHEqWrtE\"",
|
|
25318
|
-
"mtime": "2026-09-
|
|
26059
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25319
26060
|
"size": 11768,
|
|
25320
26061
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff"
|
|
25321
26062
|
},
|
|
25322
26063
|
"/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2": {
|
|
25323
26064
|
"type": "font/woff2",
|
|
25324
26065
|
"etag": "\"3478-PpQvQo59iHxPLcEUBhJfmFmCPuA\"",
|
|
25325
|
-
"mtime": "2026-09-
|
|
26066
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25326
26067
|
"size": 13432,
|
|
25327
26068
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2"
|
|
25328
26069
|
},
|
|
26070
|
+
"/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2": {
|
|
26071
|
+
"type": "font/woff2",
|
|
26072
|
+
"etag": "\"37f8-5XYRqKuMO2rN5QZqfj4VW8r2jSQ\"",
|
|
26073
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
26074
|
+
"size": 14328,
|
|
26075
|
+
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2"
|
|
26076
|
+
},
|
|
25329
26077
|
"/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff": {
|
|
25330
26078
|
"type": "font/woff",
|
|
25331
26079
|
"etag": "\"2e38-fOmVENNzEJaYqxODn6K5NAbrEJk\"",
|
|
25332
|
-
"mtime": "2026-09-
|
|
26080
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25333
26081
|
"size": 11832,
|
|
25334
26082
|
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff"
|
|
25335
26083
|
},
|
|
25336
26084
|
"/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2": {
|
|
25337
26085
|
"type": "font/woff2",
|
|
25338
26086
|
"etag": "\"16ec-bIkS18/YaTiWdOzfzp4pFXvLmqQ\"",
|
|
25339
|
-
"mtime": "2026-09-
|
|
26087
|
+
"mtime": "2026-09-02T12:06:00.144Z",
|
|
25340
26088
|
"size": 5868,
|
|
25341
26089
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2"
|
|
25342
26090
|
},
|
|
25343
|
-
"/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2": {
|
|
25344
|
-
"type": "font/woff2",
|
|
25345
|
-
"etag": "\"37f8-5XYRqKuMO2rN5QZqfj4VW8r2jSQ\"",
|
|
25346
|
-
"mtime": "2026-09-02T10:11:57.288Z",
|
|
25347
|
-
"size": 14328,
|
|
25348
|
-
"path": "../public/_nuxt/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2"
|
|
25349
|
-
},
|
|
25350
26091
|
"/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff": {
|
|
25351
26092
|
"type": "font/woff",
|
|
25352
26093
|
"etag": "\"15f4-LdRX2sBB3T5WDAsZLCwBlsMYXPw\"",
|
|
25353
|
-
"mtime": "2026-09-
|
|
26094
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25354
26095
|
"size": 5620,
|
|
25355
26096
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff"
|
|
25356
26097
|
},
|
|
25357
26098
|
"/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff": {
|
|
25358
26099
|
"type": "font/woff",
|
|
25359
26100
|
"etag": "\"15f0-mGuZIt/ndQFiw5uxmCOkhhWSxi4\"",
|
|
25360
|
-
"mtime": "2026-09-
|
|
26101
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25361
26102
|
"size": 5616,
|
|
25362
26103
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff"
|
|
25363
26104
|
},
|
|
25364
26105
|
"/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2": {
|
|
25365
26106
|
"type": "font/woff2",
|
|
25366
26107
|
"etag": "\"1798-7VDjg0E2ggd9c0kJDHNRh+Fu5E0\"",
|
|
25367
|
-
"mtime": "2026-09-
|
|
26108
|
+
"mtime": "2026-09-02T12:06:00.145Z",
|
|
25368
26109
|
"size": 6040,
|
|
25369
26110
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2"
|
|
25370
26111
|
},
|
|
25371
|
-
"/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2": {
|
|
25372
|
-
"type": "font/woff2",
|
|
25373
|
-
"etag": "\"1b14-ylPjcMKGVc4RbTi2G25N0MSlVNo\"",
|
|
25374
|
-
"mtime": "2026-09-02T10:11:57.290Z",
|
|
25375
|
-
"size": 6932,
|
|
25376
|
-
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2"
|
|
25377
|
-
},
|
|
25378
26112
|
"/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff": {
|
|
25379
26113
|
"type": "font/woff",
|
|
25380
26114
|
"etag": "\"1650-9Pko0qRZ+EoISmnDaTRQ8KRGy/s\"",
|
|
25381
|
-
"mtime": "2026-09-
|
|
26115
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25382
26116
|
"size": 5712,
|
|
25383
26117
|
"path": "../public/_nuxt/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff"
|
|
25384
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
|
+
},
|
|
25385
26126
|
"/_nuxt/kZl6yT-12.js": {
|
|
25386
26127
|
"type": "text/javascript; charset=utf-8",
|
|
25387
26128
|
"etag": "\"e9-t0VKevMurw+ruGbCV/EgmcM2dww\"",
|
|
25388
|
-
"mtime": "2026-09-
|
|
26129
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
25389
26130
|
"size": 233,
|
|
25390
26131
|
"path": "../public/_nuxt/kZl6yT-12.js"
|
|
25391
26132
|
},
|
|
25392
26133
|
"/_nuxt/lO5tpDZ5.js": {
|
|
25393
26134
|
"type": "text/javascript; charset=utf-8",
|
|
25394
26135
|
"etag": "\"3b-z4jypkmUW9c9v+AALQ28pDyJ80A\"",
|
|
25395
|
-
"mtime": "2026-09-
|
|
26136
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25396
26137
|
"size": 59,
|
|
25397
26138
|
"path": "../public/_nuxt/lO5tpDZ5.js"
|
|
25398
26139
|
},
|
|
25399
|
-
"/_nuxt/monitor.41fCD6TB.css": {
|
|
25400
|
-
"type": "text/css; charset=utf-8",
|
|
25401
|
-
"etag": "\"483-AbTSw5gK9t0PRRiSpYierkjEDsE\"",
|
|
25402
|
-
"mtime": "2026-09-02T10:11:57.291Z",
|
|
25403
|
-
"size": 1155,
|
|
25404
|
-
"path": "../public/_nuxt/monitor.41fCD6TB.css"
|
|
25405
|
-
},
|
|
25406
|
-
"/_nuxt/logs.DaIsHWZE.css": {
|
|
25407
|
-
"type": "text/css; charset=utf-8",
|
|
25408
|
-
"etag": "\"1635-2SnVe4npTbogqgQvzzEAwCfWhCI\"",
|
|
25409
|
-
"mtime": "2026-09-02T10:11:57.291Z",
|
|
25410
|
-
"size": 5685,
|
|
25411
|
-
"path": "../public/_nuxt/logs.DaIsHWZE.css"
|
|
25412
|
-
},
|
|
25413
26140
|
"/_nuxt/NIM0Wglj2.js": {
|
|
25414
26141
|
"type": "text/javascript; charset=utf-8",
|
|
25415
26142
|
"etag": "\"aa5-KRmwCVPVQ4lynfKMpxx7nE1gBY4\"",
|
|
25416
|
-
"mtime": "2026-09-
|
|
26143
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25417
26144
|
"size": 2725,
|
|
25418
26145
|
"path": "../public/_nuxt/NIM0Wglj2.js"
|
|
25419
26146
|
},
|
|
25420
|
-
"/_nuxt/
|
|
26147
|
+
"/_nuxt/monitor.41fCD6TB.css": {
|
|
25421
26148
|
"type": "text/css; charset=utf-8",
|
|
25422
|
-
"etag": "\"
|
|
25423
|
-
"mtime": "2026-09-
|
|
25424
|
-
"size":
|
|
25425
|
-
"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"
|
|
25426
26153
|
},
|
|
25427
26154
|
"/_nuxt/OwJ1LJkF.js": {
|
|
25428
26155
|
"type": "text/javascript; charset=utf-8",
|
|
25429
26156
|
"etag": "\"3488-ohWEJm0u4abl3TRn0oHqUL2oU3A\"",
|
|
25430
|
-
"mtime": "2026-09-
|
|
26157
|
+
"mtime": "2026-09-02T12:06:00.123Z",
|
|
25431
26158
|
"size": 13448,
|
|
25432
26159
|
"path": "../public/_nuxt/OwJ1LJkF.js"
|
|
25433
26160
|
},
|
|
25434
|
-
"/_nuxt/
|
|
26161
|
+
"/_nuxt/logs.DaIsHWZE.css": {
|
|
25435
26162
|
"type": "text/css; charset=utf-8",
|
|
25436
|
-
"etag": "\"
|
|
25437
|
-
"mtime": "2026-09-
|
|
25438
|
-
"size":
|
|
25439
|
-
"path": "../public/_nuxt/
|
|
26163
|
+
"etag": "\"1635-2SnVe4npTbogqgQvzzEAwCfWhCI\"",
|
|
26164
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
26165
|
+
"size": 5685,
|
|
26166
|
+
"path": "../public/_nuxt/logs.DaIsHWZE.css"
|
|
25440
26167
|
},
|
|
25441
26168
|
"/_nuxt/pages.CytEOfUs.css": {
|
|
25442
26169
|
"type": "text/css; charset=utf-8",
|
|
25443
26170
|
"etag": "\"1f78-Zc87Z5OhCuyS/CdNTE5IMJgqhH0\"",
|
|
25444
|
-
"mtime": "2026-09-
|
|
26171
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25445
26172
|
"size": 8056,
|
|
25446
26173
|
"path": "../public/_nuxt/pages.CytEOfUs.css"
|
|
25447
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
|
+
},
|
|
25448
26182
|
"/_nuxt/PQLnLxYe.js": {
|
|
25449
26183
|
"type": "text/javascript; charset=utf-8",
|
|
25450
26184
|
"etag": "\"1359-2EI4UdgR3Dg4/iuC63SVUdU5cAg\"",
|
|
25451
|
-
"mtime": "2026-09-
|
|
26185
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25452
26186
|
"size": 4953,
|
|
25453
26187
|
"path": "../public/_nuxt/PQLnLxYe.js"
|
|
25454
26188
|
},
|
|
25455
26189
|
"/_nuxt/pRQri7vQ2.js": {
|
|
25456
26190
|
"type": "text/javascript; charset=utf-8",
|
|
25457
26191
|
"etag": "\"8b9-3wDeSjR8e4ZgPLVXOMKGsaIsPEk\"",
|
|
25458
|
-
"mtime": "2026-09-
|
|
26192
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25459
26193
|
"size": 2233,
|
|
25460
26194
|
"path": "../public/_nuxt/pRQri7vQ2.js"
|
|
25461
26195
|
},
|
|
26196
|
+
"/_nuxt/plugins.FTm0PcEe.css": {
|
|
26197
|
+
"type": "text/css; charset=utf-8",
|
|
26198
|
+
"etag": "\"9bd-tTmniaf8rX8elG1Badc6OjJVtAk\"",
|
|
26199
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
26200
|
+
"size": 2493,
|
|
26201
|
+
"path": "../public/_nuxt/plugins.FTm0PcEe.css"
|
|
26202
|
+
},
|
|
25462
26203
|
"/_nuxt/RYFtK4qZ2.js": {
|
|
25463
26204
|
"type": "text/javascript; charset=utf-8",
|
|
25464
26205
|
"etag": "\"594c-ZHrAodAyz6fWAruZCqluWn052zA\"",
|
|
25465
|
-
"mtime": "2026-09-
|
|
26206
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25466
26207
|
"size": 22860,
|
|
25467
26208
|
"path": "../public/_nuxt/RYFtK4qZ2.js"
|
|
25468
26209
|
},
|
|
25469
|
-
"/_nuxt/R_WxTozV2.js": {
|
|
25470
|
-
"type": "text/javascript; charset=utf-8",
|
|
25471
|
-
"etag": "\"f01-WXNbWQm5WyeJtTA6i6wwMxnI1SQ\"",
|
|
25472
|
-
"mtime": "2026-09-02T10:11:57.258Z",
|
|
25473
|
-
"size": 3841,
|
|
25474
|
-
"path": "../public/_nuxt/R_WxTozV2.js"
|
|
25475
|
-
},
|
|
25476
26210
|
"/_nuxt/rzGB_ojX.js": {
|
|
25477
26211
|
"type": "text/javascript; charset=utf-8",
|
|
25478
26212
|
"etag": "\"156ba-Me1pF0LZxFasl9k2mKSJdM5HmgI\"",
|
|
25479
|
-
"mtime": "2026-09-
|
|
26213
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25480
26214
|
"size": 87738,
|
|
25481
26215
|
"path": "../public/_nuxt/rzGB_ojX.js"
|
|
25482
26216
|
},
|
|
26217
|
+
"/_nuxt/R_WxTozV2.js": {
|
|
26218
|
+
"type": "text/javascript; charset=utf-8",
|
|
26219
|
+
"etag": "\"f01-WXNbWQm5WyeJtTA6i6wwMxnI1SQ\"",
|
|
26220
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
26221
|
+
"size": 3841,
|
|
26222
|
+
"path": "../public/_nuxt/R_WxTozV2.js"
|
|
26223
|
+
},
|
|
25483
26224
|
"/_nuxt/settings.BANibAnV.css": {
|
|
25484
26225
|
"type": "text/css; charset=utf-8",
|
|
25485
26226
|
"etag": "\"14e1-dy+irjFjvg+oV4IQLZHkokWSVkU\"",
|
|
25486
|
-
"mtime": "2026-09-
|
|
26227
|
+
"mtime": "2026-09-02T12:06:00.146Z",
|
|
25487
26228
|
"size": 5345,
|
|
25488
26229
|
"path": "../public/_nuxt/settings.BANibAnV.css"
|
|
25489
26230
|
},
|
|
25490
|
-
"/_nuxt/town.BLrD9-WH.css": {
|
|
25491
|
-
"type": "text/css; charset=utf-8",
|
|
25492
|
-
"etag": "\"64-INqlNEwsg1I+Dzc8LaEkJCLno5o\"",
|
|
25493
|
-
"mtime": "2026-09-02T10:11:57.293Z",
|
|
25494
|
-
"size": 100,
|
|
25495
|
-
"path": "../public/_nuxt/town.BLrD9-WH.css"
|
|
25496
|
-
},
|
|
25497
26231
|
"/_nuxt/teams.B8JNbUZg.css": {
|
|
25498
26232
|
"type": "text/css; charset=utf-8",
|
|
25499
26233
|
"etag": "\"6b7-7gKsNrCHeSx0FLL3kd7/KcsQBgw\"",
|
|
25500
|
-
"mtime": "2026-09-
|
|
26234
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25501
26235
|
"size": 1719,
|
|
25502
26236
|
"path": "../public/_nuxt/teams.B8JNbUZg.css"
|
|
25503
26237
|
},
|
|
25504
|
-
"/_nuxt/town.C_DsNW0J.css": {
|
|
25505
|
-
"type": "text/css; charset=utf-8",
|
|
25506
|
-
"etag": "\"3b2-lx8uIK7y3f1Nkj2gMcTuak3mB/I\"",
|
|
25507
|
-
"mtime": "2026-09-02T10:11:57.293Z",
|
|
25508
|
-
"size": 946,
|
|
25509
|
-
"path": "../public/_nuxt/town.C_DsNW0J.css"
|
|
25510
|
-
},
|
|
25511
26238
|
"/_nuxt/tokens.CWOTXM-Z.css": {
|
|
25512
26239
|
"type": "text/css; charset=utf-8",
|
|
25513
26240
|
"etag": "\"9cd-tzkC/9SAq2Z51cXkqrDQz0rVzMo\"",
|
|
25514
|
-
"mtime": "2026-09-
|
|
26241
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25515
26242
|
"size": 2509,
|
|
25516
26243
|
"path": "../public/_nuxt/tokens.CWOTXM-Z.css"
|
|
25517
26244
|
},
|
|
26245
|
+
"/_nuxt/town.BLrD9-WH.css": {
|
|
26246
|
+
"type": "text/css; charset=utf-8",
|
|
26247
|
+
"etag": "\"64-INqlNEwsg1I+Dzc8LaEkJCLno5o\"",
|
|
26248
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
26249
|
+
"size": 100,
|
|
26250
|
+
"path": "../public/_nuxt/town.BLrD9-WH.css"
|
|
26251
|
+
},
|
|
26252
|
+
"/_nuxt/town.C_DsNW0J.css": {
|
|
26253
|
+
"type": "text/css; charset=utf-8",
|
|
26254
|
+
"etag": "\"3b2-lx8uIK7y3f1Nkj2gMcTuak3mB/I\"",
|
|
26255
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
26256
|
+
"size": 946,
|
|
26257
|
+
"path": "../public/_nuxt/town.C_DsNW0J.css"
|
|
26258
|
+
},
|
|
25518
26259
|
"/_nuxt/TownView.CI2Wpzty.css": {
|
|
25519
26260
|
"type": "text/css; charset=utf-8",
|
|
25520
26261
|
"etag": "\"118cd-lxMkpqeOaL9RAhlC0QWtc8k2J38\"",
|
|
25521
|
-
"mtime": "2026-09-
|
|
26262
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25522
26263
|
"size": 71885,
|
|
25523
26264
|
"path": "../public/_nuxt/TownView.CI2Wpzty.css"
|
|
25524
26265
|
},
|
|
25525
26266
|
"/_nuxt/uBbDCfTz.js": {
|
|
25526
26267
|
"type": "text/javascript; charset=utf-8",
|
|
25527
26268
|
"etag": "\"2435-2SmfQO0WbbFYq5CVz6TT/4+7jS4\"",
|
|
25528
|
-
"mtime": "2026-09-
|
|
26269
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25529
26270
|
"size": 9269,
|
|
25530
26271
|
"path": "../public/_nuxt/uBbDCfTz.js"
|
|
25531
26272
|
},
|
|
25532
26273
|
"/_nuxt/ubPfs9mQ.js": {
|
|
25533
26274
|
"type": "text/javascript; charset=utf-8",
|
|
25534
26275
|
"etag": "\"1dc4-yIIKAQ37KJqWQcdDI1J/9WfoaDc\"",
|
|
25535
|
-
"mtime": "2026-09-
|
|
26276
|
+
"mtime": "2026-09-02T12:06:00.126Z",
|
|
25536
26277
|
"size": 7620,
|
|
25537
26278
|
"path": "../public/_nuxt/ubPfs9mQ.js"
|
|
25538
26279
|
},
|
|
25539
26280
|
"/_nuxt/users.D8lcLE62.css": {
|
|
25540
26281
|
"type": "text/css; charset=utf-8",
|
|
25541
26282
|
"etag": "\"2f7-vPqmiQmG+gTnKc25vyRnF3nNTy0\"",
|
|
25542
|
-
"mtime": "2026-09-
|
|
26283
|
+
"mtime": "2026-09-02T12:06:00.147Z",
|
|
25543
26284
|
"size": 759,
|
|
25544
26285
|
"path": "../public/_nuxt/users.D8lcLE62.css"
|
|
25545
26286
|
},
|
|
25546
26287
|
"/_nuxt/W1E3-5ML.js": {
|
|
25547
26288
|
"type": "text/javascript; charset=utf-8",
|
|
25548
26289
|
"etag": "\"9625-R1c4xFkyUPCvDq0pqlQVbYHN+rE\"",
|
|
25549
|
-
"mtime": "2026-09-
|
|
26290
|
+
"mtime": "2026-09-02T12:06:00.124Z",
|
|
25550
26291
|
"size": 38437,
|
|
25551
26292
|
"path": "../public/_nuxt/W1E3-5ML.js"
|
|
25552
26293
|
},
|
|
25553
|
-
"/_nuxt/workshop.B98sHiJq.css": {
|
|
25554
|
-
"type": "text/css; charset=utf-8",
|
|
25555
|
-
"etag": "\"d1c-WVdgeDMUl4qOkHXOdrLmeDFgLfA\"",
|
|
25556
|
-
"mtime": "2026-09-02T10:11:57.294Z",
|
|
25557
|
-
"size": 3356,
|
|
25558
|
-
"path": "../public/_nuxt/workshop.B98sHiJq.css"
|
|
25559
|
-
},
|
|
25560
26294
|
"/_nuxt/Z8k0uMSI.js": {
|
|
25561
26295
|
"type": "text/javascript; charset=utf-8",
|
|
25562
26296
|
"etag": "\"79df-ZhH5hzPaniNAq0yDLbZqo8UuxgE\"",
|
|
25563
|
-
"mtime": "2026-09-
|
|
26297
|
+
"mtime": "2026-09-02T12:06:00.125Z",
|
|
25564
26298
|
"size": 31199,
|
|
25565
26299
|
"path": "../public/_nuxt/Z8k0uMSI.js"
|
|
25566
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
|
+
},
|
|
25567
26308
|
"/_nuxt/_id_.CbiF5PrV.css": {
|
|
25568
26309
|
"type": "text/css; charset=utf-8",
|
|
25569
26310
|
"etag": "\"1163-pGAiwiKa0Bv9Cnn9iaQDLyOVwhI\"",
|
|
25570
|
-
"mtime": "2026-09-
|
|
26311
|
+
"mtime": "2026-09-02T12:06:00.127Z",
|
|
25571
26312
|
"size": 4451,
|
|
25572
26313
|
"path": "../public/_nuxt/_id_.CbiF5PrV.css"
|
|
25573
26314
|
},
|
|
25574
|
-
"/_nuxt/
|
|
25575
|
-
"type": "text/css; charset=utf-8",
|
|
25576
|
-
"etag": "\"
|
|
25577
|
-
"mtime": "2026-09-
|
|
25578
|
-
"size":
|
|
25579
|
-
"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"
|
|
26321
|
+
},
|
|
26322
|
+
"/_nuxt/_id_.Ci4u30cR.css": {
|
|
26323
|
+
"type": "text/css; charset=utf-8",
|
|
26324
|
+
"etag": "\"3616-1z8Sb15MljzJ6ZFiU/VRUsL2CFs\"",
|
|
26325
|
+
"mtime": "2026-09-02T12:06:00.127Z",
|
|
26326
|
+
"size": 13846,
|
|
26327
|
+
"path": "../public/_nuxt/_id_.Ci4u30cR.css"
|
|
26328
|
+
},
|
|
26329
|
+
"/assets/game/coin.png": {
|
|
26330
|
+
"type": "image/png",
|
|
26331
|
+
"etag": "\"1a4d-c3GA5v0R/IuKz38xkdcao4hHrX4\"",
|
|
26332
|
+
"mtime": "2026-08-25T12:20:54.512Z",
|
|
26333
|
+
"size": 6733,
|
|
26334
|
+
"path": "../public/assets/game/coin.png"
|
|
26335
|
+
},
|
|
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"
|
|
26342
|
+
},
|
|
26343
|
+
"/assets/game/tuxemon-town.json": {
|
|
26344
|
+
"type": "application/json",
|
|
26345
|
+
"etag": "\"fec5-uB5TWkwSxd0G5Tiupl3I0+u94XM\"",
|
|
26346
|
+
"mtime": "2026-08-25T12:20:54.517Z",
|
|
26347
|
+
"size": 65221,
|
|
26348
|
+
"path": "../public/assets/game/tuxemon-town.json"
|
|
26349
|
+
},
|
|
26350
|
+
"/scene/background/cyber-town-background.svg": {
|
|
26351
|
+
"type": "image/svg+xml",
|
|
26352
|
+
"etag": "\"1656-Q8xWIs77K5i5HJYRdMCDYSQhkvs\"",
|
|
26353
|
+
"mtime": "2026-08-25T12:20:54.529Z",
|
|
26354
|
+
"size": 5718,
|
|
26355
|
+
"path": "../public/scene/background/cyber-town-background.svg"
|
|
26356
|
+
},
|
|
26357
|
+
"/_nuxt/builds/latest.json": {
|
|
26358
|
+
"type": "application/json",
|
|
26359
|
+
"etag": "\"47-yIVSoLJ7RIih/ZRXcAtm396Vy4w\"",
|
|
26360
|
+
"mtime": "2026-09-02T12:06:05.931Z",
|
|
26361
|
+
"size": 71,
|
|
26362
|
+
"path": "../public/_nuxt/builds/latest.json"
|
|
26363
|
+
},
|
|
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"
|
|
26370
|
+
},
|
|
26371
|
+
"/assets/game/tuxmon-sample-32px-extruded.png": {
|
|
26372
|
+
"type": "image/png",
|
|
26373
|
+
"etag": "\"2ee08-3yTsAqzTx0djGCGVAEgUGQ1/MEg\"",
|
|
26374
|
+
"mtime": "2026-08-25T12:20:54.518Z",
|
|
26375
|
+
"size": 192008,
|
|
26376
|
+
"path": "../public/assets/game/tuxmon-sample-32px-extruded.png"
|
|
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"
|
|
25580
26398
|
},
|
|
25581
|
-
"/
|
|
25582
|
-
"type": "
|
|
25583
|
-
"etag": "\"
|
|
25584
|
-
"mtime": "2026-
|
|
25585
|
-
"size":
|
|
25586
|
-
"path": "../public/
|
|
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"
|
|
25587
26405
|
},
|
|
25588
|
-
"/
|
|
25589
|
-
"type": "
|
|
25590
|
-
"etag": "\"
|
|
25591
|
-
"mtime": "2026-08-
|
|
25592
|
-
"size":
|
|
25593
|
-
"path": "../public/
|
|
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"
|
|
25594
26412
|
},
|
|
25595
|
-
"/assets/game/
|
|
26413
|
+
"/assets/game/character/mage.png": {
|
|
25596
26414
|
"type": "image/png",
|
|
25597
|
-
"etag": "\"
|
|
26415
|
+
"etag": "\"3832-juipuJuMJceZrarvR4w7OKgQejA\"",
|
|
25598
26416
|
"mtime": "2026-08-25T12:20:54.512Z",
|
|
25599
|
-
"size":
|
|
25600
|
-
"path": "../public/assets/game/
|
|
25601
|
-
},
|
|
25602
|
-
"/assets/game/player-sheet.png": {
|
|
25603
|
-
"type": "image/png",
|
|
25604
|
-
"etag": "\"2742-xHFqZq17XtbQVhapFMWJpVb0W5o\"",
|
|
25605
|
-
"mtime": "2026-08-25T12:20:54.514Z",
|
|
25606
|
-
"size": 10050,
|
|
25607
|
-
"path": "../public/assets/game/player-sheet.png"
|
|
26417
|
+
"size": 14386,
|
|
26418
|
+
"path": "../public/assets/game/character/mage.png"
|
|
25608
26419
|
},
|
|
25609
|
-
"/
|
|
25610
|
-
"type": "
|
|
25611
|
-
"etag": "\"
|
|
25612
|
-
"mtime": "2026-
|
|
25613
|
-
"size":
|
|
25614
|
-
"path": "../public/
|
|
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"
|
|
25615
26426
|
},
|
|
25616
|
-
"/assets/game/
|
|
25617
|
-
"type": "
|
|
25618
|
-
"etag": "\"
|
|
25619
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25620
|
-
"size":
|
|
25621
|
-
"path": "../public/assets/game/
|
|
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"
|
|
25622
26433
|
},
|
|
25623
26434
|
"/assets/game/devices/agv.glb": {
|
|
25624
26435
|
"type": "model/gltf-binary",
|
|
@@ -25634,12 +26445,12 @@ const assets = {
|
|
|
25634
26445
|
"size": 22644,
|
|
25635
26446
|
"path": "../public/assets/game/devices/caster.glb"
|
|
25636
26447
|
},
|
|
25637
|
-
"/assets/game/
|
|
25638
|
-
"type": "
|
|
25639
|
-
"etag": "\"
|
|
25640
|
-
"mtime": "2026-08-
|
|
25641
|
-
"size":
|
|
25642
|
-
"path": "../public/assets/game/
|
|
26448
|
+
"/assets/game/devices/device-console.glb": {
|
|
26449
|
+
"type": "model/gltf-binary",
|
|
26450
|
+
"etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
|
|
26451
|
+
"mtime": "2026-08-26T05:23:14.559Z",
|
|
26452
|
+
"size": 14724,
|
|
26453
|
+
"path": "../public/assets/game/devices/device-console.glb"
|
|
25643
26454
|
},
|
|
25644
26455
|
"/assets/game/devices/device-robot-arm.glb": {
|
|
25645
26456
|
"type": "model/gltf-binary",
|
|
@@ -25648,13 +26459,6 @@ const assets = {
|
|
|
25648
26459
|
"size": 14332,
|
|
25649
26460
|
"path": "../public/assets/game/devices/device-robot-arm.glb"
|
|
25650
26461
|
},
|
|
25651
|
-
"/assets/game/devices/device-console.glb": {
|
|
25652
|
-
"type": "model/gltf-binary",
|
|
25653
|
-
"etag": "\"3984-GibNFJHAqtYWIxLy79rzU1HZAds\"",
|
|
25654
|
-
"mtime": "2026-08-26T05:23:14.559Z",
|
|
25655
|
-
"size": 14724,
|
|
25656
|
-
"path": "../public/assets/game/devices/device-console.glb"
|
|
25657
|
-
},
|
|
25658
26462
|
"/assets/game/devices/device-scanner.glb": {
|
|
25659
26463
|
"type": "model/gltf-binary",
|
|
25660
26464
|
"etag": "\"28e0-uKYZaLiZiCedMMozKBOFU14HUSE\"",
|
|
@@ -25662,13 +26466,6 @@ const assets = {
|
|
|
25662
26466
|
"size": 10464,
|
|
25663
26467
|
"path": "../public/assets/game/devices/device-scanner.glb"
|
|
25664
26468
|
},
|
|
25665
|
-
"/assets/game/devices/mdo.glb": {
|
|
25666
|
-
"type": "model/gltf-binary",
|
|
25667
|
-
"etag": "\"132e4-EDslgF5+17dSukguA0eZzN4I0+o\"",
|
|
25668
|
-
"mtime": "2026-08-27T07:03:12.518Z",
|
|
25669
|
-
"size": 78564,
|
|
25670
|
-
"path": "../public/assets/game/devices/mdo.glb"
|
|
25671
|
-
},
|
|
25672
26469
|
"/assets/game/devices/extruder.glb": {
|
|
25673
26470
|
"type": "model/gltf-binary",
|
|
25674
26471
|
"etag": "\"18124-H6X1eQmFDn6eONUMGU6lGdQafZ8\"",
|
|
@@ -25676,6 +26473,13 @@ const assets = {
|
|
|
25676
26473
|
"size": 98596,
|
|
25677
26474
|
"path": "../public/assets/game/devices/extruder.glb"
|
|
25678
26475
|
},
|
|
26476
|
+
"/assets/game/devices/mdo.glb": {
|
|
26477
|
+
"type": "model/gltf-binary",
|
|
26478
|
+
"etag": "\"132e4-EDslgF5+17dSukguA0eZzN4I0+o\"",
|
|
26479
|
+
"mtime": "2026-08-27T07:03:12.518Z",
|
|
26480
|
+
"size": 78564,
|
|
26481
|
+
"path": "../public/assets/game/devices/mdo.glb"
|
|
26482
|
+
},
|
|
25679
26483
|
"/assets/game/devices/power-cabinet.glb": {
|
|
25680
26484
|
"type": "model/gltf-binary",
|
|
25681
26485
|
"etag": "\"54f0-KsrAxig9JTAY5SGKK3jbdJXB6fk\"",
|
|
@@ -25690,13 +26494,6 @@ const assets = {
|
|
|
25690
26494
|
"size": 19400,
|
|
25691
26495
|
"path": "../public/assets/game/devices/pump.glb"
|
|
25692
26496
|
},
|
|
25693
|
-
"/assets/game/devices/tdo.glb": {
|
|
25694
|
-
"type": "model/gltf-binary",
|
|
25695
|
-
"etag": "\"e10c-GdMX+mG/KrSVBzy4EeAPPjFoTqM\"",
|
|
25696
|
-
"mtime": "2026-08-27T07:03:12.523Z",
|
|
25697
|
-
"size": 57612,
|
|
25698
|
-
"path": "../public/assets/game/devices/tdo.glb"
|
|
25699
|
-
},
|
|
25700
26497
|
"/assets/game/devices/thickness-scanner.glb": {
|
|
25701
26498
|
"type": "model/gltf-binary",
|
|
25702
26499
|
"etag": "\"3480-WMTbMzRrl/6AJPzEIPhRW9xPugA\"",
|
|
@@ -25704,6 +26501,13 @@ const assets = {
|
|
|
25704
26501
|
"size": 13440,
|
|
25705
26502
|
"path": "../public/assets/game/devices/thickness-scanner.glb"
|
|
25706
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
|
+
},
|
|
25707
26511
|
"/assets/game/devices/winder.glb": {
|
|
25708
26512
|
"type": "model/gltf-binary",
|
|
25709
26513
|
"etag": "\"9084-N9S2enupsA8WyhEHtkIgQ+RBDV4\"",
|
|
@@ -25739,68 +26543,12 @@ const assets = {
|
|
|
25739
26543
|
"size": 2322,
|
|
25740
26544
|
"path": "../public/assets/game/npc/tux-sheet.png"
|
|
25741
26545
|
},
|
|
25742
|
-
"/assets/game/
|
|
25743
|
-
"type": "image/png",
|
|
25744
|
-
"etag": "\"36fe-Ke8vj83Dinp8fFaRQQBfBsTGI/8\"",
|
|
25745
|
-
"mtime": "2026-08-25T12:20:54.510Z",
|
|
25746
|
-
"size": 14078,
|
|
25747
|
-
"path": "../public/assets/game/character/bot.png"
|
|
25748
|
-
},
|
|
25749
|
-
"/assets/game/character/device-3d.glb": {
|
|
25750
|
-
"type": "model/gltf-binary",
|
|
25751
|
-
"etag": "\"4bc8-yAiKZtO+P2bBmqfRvhlxcF0oduE\"",
|
|
25752
|
-
"mtime": "2026-08-25T12:20:54.511Z",
|
|
25753
|
-
"size": 19400,
|
|
25754
|
-
"path": "../public/assets/game/character/device-3d.glb"
|
|
25755
|
-
},
|
|
25756
|
-
"/assets/game/character/hero-anime-1.glb": {
|
|
25757
|
-
"type": "model/gltf-binary",
|
|
25758
|
-
"etag": "\"1044c-AUMAdrW4S6OKEsUeAcR5c50fyKs\"",
|
|
25759
|
-
"mtime": "2026-08-26T05:23:14.557Z",
|
|
25760
|
-
"size": 66636,
|
|
25761
|
-
"path": "../public/assets/game/character/hero-anime-1.glb"
|
|
25762
|
-
},
|
|
25763
|
-
"/assets/game/character/hero-3d.glb": {
|
|
25764
|
-
"type": "model/gltf-binary",
|
|
25765
|
-
"etag": "\"8494-Uv+bxnHu3YGJp7Es3lHkob25Y08\"",
|
|
25766
|
-
"mtime": "2026-08-25T12:20:54.511Z",
|
|
25767
|
-
"size": 33940,
|
|
25768
|
-
"path": "../public/assets/game/character/hero-3d.glb"
|
|
25769
|
-
},
|
|
25770
|
-
"/assets/game/character/hero-anime-3.glb": {
|
|
25771
|
-
"type": "model/gltf-binary",
|
|
25772
|
-
"etag": "\"1057c-jREeKLYoS8AFWzuIOgOSr6CzehU\"",
|
|
25773
|
-
"mtime": "2026-08-26T05:23:14.558Z",
|
|
25774
|
-
"size": 66940,
|
|
25775
|
-
"path": "../public/assets/game/character/hero-anime-3.glb"
|
|
25776
|
-
},
|
|
25777
|
-
"/assets/game/character/hero-anime-2.glb": {
|
|
25778
|
-
"type": "model/gltf-binary",
|
|
25779
|
-
"etag": "\"1058c-J91UapGlsJg/5ODN8k8c7rSNpzw\"",
|
|
25780
|
-
"mtime": "2026-08-26T05:23:14.558Z",
|
|
25781
|
-
"size": 66956,
|
|
25782
|
-
"path": "../public/assets/game/character/hero-anime-2.glb"
|
|
25783
|
-
},
|
|
25784
|
-
"/assets/game/character/hero-anime-4.glb": {
|
|
25785
|
-
"type": "model/gltf-binary",
|
|
25786
|
-
"etag": "\"10544-H4WjfazfTQ6hfF2SkK2BfHU27i8\"",
|
|
25787
|
-
"mtime": "2026-08-26T05:23:14.558Z",
|
|
25788
|
-
"size": 66884,
|
|
25789
|
-
"path": "../public/assets/game/character/hero-anime-4.glb"
|
|
25790
|
-
},
|
|
25791
|
-
"/assets/game/character/knight.png": {
|
|
25792
|
-
"type": "image/png",
|
|
25793
|
-
"etag": "\"3b37-Wyixufl/LcqKO/AeTLuGvzi4goQ\"",
|
|
25794
|
-
"mtime": "2026-08-25T12:20:54.511Z",
|
|
25795
|
-
"size": 15159,
|
|
25796
|
-
"path": "../public/assets/game/character/knight.png"
|
|
25797
|
-
},
|
|
25798
|
-
"/assets/game/character/mage.png": {
|
|
26546
|
+
"/assets/game/player/misa-back-walk.000.png": {
|
|
25799
26547
|
"type": "image/png",
|
|
25800
|
-
"etag": "\"
|
|
25801
|
-
"mtime": "2026-08-25T12:20:54.
|
|
25802
|
-
"size":
|
|
25803
|
-
"path": "../public/assets/game/
|
|
26548
|
+
"etag": "\"157-/Sm0qrBJSHEFTGYwuSqnzRaX3Jk\"",
|
|
26549
|
+
"mtime": "2026-08-25T12:20:54.514Z",
|
|
26550
|
+
"size": 343,
|
|
26551
|
+
"path": "../public/assets/game/player/misa-back-walk.000.png"
|
|
25804
26552
|
},
|
|
25805
26553
|
"/assets/game/player/misa-back-walk.001.png": {
|
|
25806
26554
|
"type": "image/png",
|
|
@@ -25816,12 +26564,12 @@ const assets = {
|
|
|
25816
26564
|
"size": 343,
|
|
25817
26565
|
"path": "../public/assets/game/player/misa-back-walk.002.png"
|
|
25818
26566
|
},
|
|
25819
|
-
"/assets/game/player/misa-back-walk.
|
|
26567
|
+
"/assets/game/player/misa-back-walk.003.png": {
|
|
25820
26568
|
"type": "image/png",
|
|
25821
|
-
"etag": "\"
|
|
26569
|
+
"etag": "\"15c-L+/hkHDyiQ9FJs5w93pxALzvWEg\"",
|
|
25822
26570
|
"mtime": "2026-08-25T12:20:54.514Z",
|
|
25823
|
-
"size":
|
|
25824
|
-
"path": "../public/assets/game/player/misa-back-walk.
|
|
26571
|
+
"size": 348,
|
|
26572
|
+
"path": "../public/assets/game/player/misa-back-walk.003.png"
|
|
25825
26573
|
},
|
|
25826
26574
|
"/assets/game/player/misa-back.png": {
|
|
25827
26575
|
"type": "image/png",
|
|
@@ -25830,13 +26578,6 @@ const assets = {
|
|
|
25830
26578
|
"size": 348,
|
|
25831
26579
|
"path": "../public/assets/game/player/misa-back.png"
|
|
25832
26580
|
},
|
|
25833
|
-
"/assets/game/player/misa-back-walk.003.png": {
|
|
25834
|
-
"type": "image/png",
|
|
25835
|
-
"etag": "\"15c-L+/hkHDyiQ9FJs5w93pxALzvWEg\"",
|
|
25836
|
-
"mtime": "2026-08-25T12:20:54.514Z",
|
|
25837
|
-
"size": 348,
|
|
25838
|
-
"path": "../public/assets/game/player/misa-back-walk.003.png"
|
|
25839
|
-
},
|
|
25840
26581
|
"/assets/game/player/misa-front-walk.000.png": {
|
|
25841
26582
|
"type": "image/png",
|
|
25842
26583
|
"etag": "\"152-+euueT0jvK7OjNDmtrdehgkQatE\"",
|
|
@@ -25844,12 +26585,12 @@ const assets = {
|
|
|
25844
26585
|
"size": 338,
|
|
25845
26586
|
"path": "../public/assets/game/player/misa-front-walk.000.png"
|
|
25846
26587
|
},
|
|
25847
|
-
"/assets/game/player/misa-front-walk.
|
|
26588
|
+
"/assets/game/player/misa-front-walk.003.png": {
|
|
25848
26589
|
"type": "image/png",
|
|
25849
|
-
"etag": "\"155-
|
|
26590
|
+
"etag": "\"155-JVYjyw5Raquze4YHeYII+iXfJx4\"",
|
|
25850
26591
|
"mtime": "2026-08-25T12:20:54.515Z",
|
|
25851
26592
|
"size": 341,
|
|
25852
|
-
"path": "../public/assets/game/player/misa-front-walk.
|
|
26593
|
+
"path": "../public/assets/game/player/misa-front-walk.003.png"
|
|
25853
26594
|
},
|
|
25854
26595
|
"/assets/game/player/misa-front-walk.002.png": {
|
|
25855
26596
|
"type": "image/png",
|
|
@@ -25858,12 +26599,12 @@ const assets = {
|
|
|
25858
26599
|
"size": 341,
|
|
25859
26600
|
"path": "../public/assets/game/player/misa-front-walk.002.png"
|
|
25860
26601
|
},
|
|
25861
|
-
"/assets/game/player/misa-front-walk.
|
|
26602
|
+
"/assets/game/player/misa-front-walk.001.png": {
|
|
25862
26603
|
"type": "image/png",
|
|
25863
|
-
"etag": "\"155-
|
|
26604
|
+
"etag": "\"155-r/wKRG+amQ/2TvYolFC2UPXHdC4\"",
|
|
25864
26605
|
"mtime": "2026-08-25T12:20:54.515Z",
|
|
25865
26606
|
"size": 341,
|
|
25866
|
-
"path": "../public/assets/game/player/misa-front-walk.
|
|
26607
|
+
"path": "../public/assets/game/player/misa-front-walk.001.png"
|
|
25867
26608
|
},
|
|
25868
26609
|
"/assets/game/player/misa-front.png": {
|
|
25869
26610
|
"type": "image/png",
|
|
@@ -25921,13 +26662,6 @@ const assets = {
|
|
|
25921
26662
|
"size": 302,
|
|
25922
26663
|
"path": "../public/assets/game/player/misa-right-walk.001.png"
|
|
25923
26664
|
},
|
|
25924
|
-
"/assets/game/player/misa-right-walk.002.png": {
|
|
25925
|
-
"type": "image/png",
|
|
25926
|
-
"etag": "\"12f-3fV+VP6QPPPljfYuG6yhztcSIXc\"",
|
|
25927
|
-
"mtime": "2026-08-25T12:20:54.517Z",
|
|
25928
|
-
"size": 303,
|
|
25929
|
-
"path": "../public/assets/game/player/misa-right-walk.002.png"
|
|
25930
|
-
},
|
|
25931
26665
|
"/assets/game/player/misa-right-walk.003.png": {
|
|
25932
26666
|
"type": "image/png",
|
|
25933
26667
|
"etag": "\"12e-1Tf+ktOQnj4YEenOBQ+4j9KNxVQ\"",
|
|
@@ -25935,6 +26669,13 @@ const assets = {
|
|
|
25935
26669
|
"size": 302,
|
|
25936
26670
|
"path": "../public/assets/game/player/misa-right-walk.003.png"
|
|
25937
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
|
+
},
|
|
25938
26679
|
"/assets/game/player/misa-right.png": {
|
|
25939
26680
|
"type": "image/png",
|
|
25940
26681
|
"etag": "\"12e-u2oP2dt8nlrp15zVNaNSSzpBs0Y\"",
|
|
@@ -25949,13 +26690,6 @@ const assets = {
|
|
|
25949
26690
|
"size": 90468,
|
|
25950
26691
|
"path": "../public/assets/game/wuwa/world-middle.png"
|
|
25951
26692
|
},
|
|
25952
|
-
"/assets/game/wuwa/scene-map.png": {
|
|
25953
|
-
"type": "image/png",
|
|
25954
|
-
"etag": "\"682db-bU8mh8SeHPotvuaCc6PZzrWoT+A\"",
|
|
25955
|
-
"mtime": "2026-08-25T12:20:54.521Z",
|
|
25956
|
-
"size": 426715,
|
|
25957
|
-
"path": "../public/assets/game/wuwa/scene-map.png"
|
|
25958
|
-
},
|
|
25959
26693
|
"/assets/game/wuwa/wu-aura.png": {
|
|
25960
26694
|
"type": "image/png",
|
|
25961
26695
|
"etag": "\"2055-NKWgEbJfTq5l56FGWi9WDWgBAbU\"",
|
|
@@ -25963,6 +26697,13 @@ const assets = {
|
|
|
25963
26697
|
"size": 8277,
|
|
25964
26698
|
"path": "../public/assets/game/wuwa/wu-aura.png"
|
|
25965
26699
|
},
|
|
26700
|
+
"/assets/game/wuwa/scene-map.png": {
|
|
26701
|
+
"type": "image/png",
|
|
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
|
+
},
|
|
25966
26707
|
"/assets/game/wuwa/world-far.png": {
|
|
25967
26708
|
"type": "image/png",
|
|
25968
26709
|
"etag": "\"6b391-DRcUWDyPUwUxDpAWplDh9StwdO0\"",
|
|
@@ -25970,13 +26711,6 @@ const assets = {
|
|
|
25970
26711
|
"size": 439185,
|
|
25971
26712
|
"path": "../public/assets/game/wuwa/world-far.png"
|
|
25972
26713
|
},
|
|
25973
|
-
"/assets/game/wuwa/wu-slash.png": {
|
|
25974
|
-
"type": "image/png",
|
|
25975
|
-
"etag": "\"185-fVjcllSJOBMFcBWLIgBzTrzWGaY\"",
|
|
25976
|
-
"mtime": "2026-08-25T12:20:54.527Z",
|
|
25977
|
-
"size": 389,
|
|
25978
|
-
"path": "../public/assets/game/wuwa/wu-slash.png"
|
|
25979
|
-
},
|
|
25980
26714
|
"/assets/game/wuwa/wu-lead.png": {
|
|
25981
26715
|
"type": "image/png",
|
|
25982
26716
|
"etag": "\"3b04-agK45Y3g7QDPns/kmkhTGYSTPDM\"",
|
|
@@ -25991,6 +26725,13 @@ const assets = {
|
|
|
25991
26725
|
"size": 26028,
|
|
25992
26726
|
"path": "../public/assets/game/wuwa/wu-ring.png"
|
|
25993
26727
|
},
|
|
26728
|
+
"/assets/game/wuwa/wu-slash.png": {
|
|
26729
|
+
"type": "image/png",
|
|
26730
|
+
"etag": "\"185-fVjcllSJOBMFcBWLIgBzTrzWGaY\"",
|
|
26731
|
+
"mtime": "2026-08-25T12:20:54.527Z",
|
|
26732
|
+
"size": 389,
|
|
26733
|
+
"path": "../public/assets/game/wuwa/wu-slash.png"
|
|
26734
|
+
},
|
|
25994
26735
|
"/assets/game/wuwa/wu-worker-0.png": {
|
|
25995
26736
|
"type": "image/png",
|
|
25996
26737
|
"etag": "\"3c59-fILvgyTv9TKRgrI9GQlRhaSR96U\"",
|
|
@@ -26012,12 +26753,12 @@ const assets = {
|
|
|
26012
26753
|
"size": 15489,
|
|
26013
26754
|
"path": "../public/assets/game/wuwa/wu-worker-2.png"
|
|
26014
26755
|
},
|
|
26015
|
-
"/_nuxt/builds/meta/
|
|
26756
|
+
"/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json": {
|
|
26016
26757
|
"type": "application/json",
|
|
26017
|
-
"etag": "\"58-
|
|
26018
|
-
"mtime": "2026-09-
|
|
26758
|
+
"etag": "\"58-0hRGfGurnK/hj51yHgmkUwC+Y4U\"",
|
|
26759
|
+
"mtime": "2026-09-02T12:06:05.932Z",
|
|
26019
26760
|
"size": 88,
|
|
26020
|
-
"path": "../public/_nuxt/builds/meta/
|
|
26761
|
+
"path": "../public/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json"
|
|
26021
26762
|
},
|
|
26022
26763
|
"/assets/game/wuwa/world-near.png": {
|
|
26023
26764
|
"type": "image/png",
|