@shgroup/dsh-serenity-hooks 1.25.2 → 1.25.4
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/dsh.plugin.json +1 -1
- package/lib/index.js +130 -31
- package/package.json +1 -1
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.4",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"description": "宁静号 ACC harness(Native Cordis 插件):真实 DSH 工具 cc_fs/session/acc_msm/eap/neat/cce/handyman/session_rebuild/skiff_admin + 拦截缝机械约束(safe-mode/路径守卫)+ 高级设定面板(双端口网关/账号管理)+ Skiff 认知子集角色(实验性)。适配 DSH 公开版(0.1.0-rc,deepseek-ai/deepseek-harness)。",
|
|
6
6
|
"engines": {
|
package/lib/index.js
CHANGED
|
@@ -756,6 +756,7 @@ function isWriteTool(toolName, action) {
|
|
|
756
756
|
function decideGuard(input) {
|
|
757
757
|
const { root, toolName, safeModeOn, blacklist, pathArg, action } = input;
|
|
758
758
|
if (input.skiffSessionId !== void 0 && isSkiffSessionId(input.skiffSessionId)) {
|
|
759
|
+
if (toolName === "skill") return { kind: "allow" };
|
|
759
760
|
const roleName = input.skiffSessionId ? skiffRoleFor$1(input.skiffSessionId) : null;
|
|
760
761
|
if (!roleToolWhitelist(roleName ? readSkiffRoles(root).get(roleName) : void 0).has(toolName)) return {
|
|
761
762
|
deny: "tool not allowed in this skiff role",
|
|
@@ -2360,9 +2361,13 @@ function registerSkiffSession(sessionId, role, agent) {
|
|
|
2360
2361
|
skiffAgents.set(sessionId, agent);
|
|
2361
2362
|
registerSkiffSession$1(sessionId, role);
|
|
2362
2363
|
}
|
|
2364
|
+
/** Skiff agent 挂载的 DSH preset(v1.25.3 修复:read/grep/glob 等平台工具由 preset 决定工具面;
|
|
2365
|
+
* handyman 经 composeFrom 继承父、skiff 无父上下文——直接挂 DSH 默认 standard preset;
|
|
2366
|
+
* guard 角色白名单再按角色过滤可见/可用面——白名单外工具仍 deny) */
|
|
2367
|
+
const SKIFF_PRESET = "standard";
|
|
2363
2368
|
/**
|
|
2364
2369
|
* 创建 Skiff agent:标准 DSH agent + cwd=CCC root + 角色模型 +
|
|
2365
|
-
* scoped 系统提示词(基础提示词 + CCC 定义段,全替换 ACC 默认注入)。
|
|
2370
|
+
* standard preset(平台工具面)+ scoped 系统提示词(基础提示词 + CCC 定义段,全替换 ACC 默认注入)。
|
|
2366
2371
|
*/
|
|
2367
2372
|
async function createSkiffAgent(ctx, root, roleName, role, defaultModel) {
|
|
2368
2373
|
if (!ctx.agents) throw new Error("skiff: ctx.agents unavailable");
|
|
@@ -2370,7 +2375,15 @@ async function createSkiffAgent(ctx, root, roleName, role, defaultModel) {
|
|
|
2370
2375
|
const sessionId = `${SKIFF_SESSION_PREFIX}${roleName}-${randomUUID()}`;
|
|
2371
2376
|
const handle = await ctx.agents.create({
|
|
2372
2377
|
sessionId,
|
|
2373
|
-
meta: {
|
|
2378
|
+
meta: {
|
|
2379
|
+
cwd: root,
|
|
2380
|
+
agentPreset: SKIFF_PRESET
|
|
2381
|
+
},
|
|
2382
|
+
setup: async (agentCtx) => {
|
|
2383
|
+
try {
|
|
2384
|
+
await agentCtx.get("agentPresets")?.mount?.(agentCtx, SKIFF_PRESET);
|
|
2385
|
+
} catch {}
|
|
2386
|
+
},
|
|
2374
2387
|
...model ? { agentOptions: splitModel(model) } : {}
|
|
2375
2388
|
});
|
|
2376
2389
|
const agent = handle.agent;
|
|
@@ -6821,7 +6834,10 @@ dsp 只提供机制(双白名单强制 + 基础提示词 + 调试问答页)
|
|
|
6821
6834
|
── 运行 ──
|
|
6822
6835
|
调试:设置面板「Serenity」页 Skiff 区块开启 → http://127.0.0.1:<debugPort> 问答页实测
|
|
6823
6836
|
(v1.25.0 唯一客户端面;ACP stdio 协议 F4c 后续,与调试页共用同一会话核心)
|
|
6824
|
-
启停 =
|
|
6837
|
+
启停 = 人工(设置面板开关,不随插件加载自动启动);未开启零资源占用
|
|
6838
|
+
生效机制:角色配置**实时读取**(改 .opencode/serenity.json → 刷新调试页即生效);
|
|
6839
|
+
改配置后用 skiff_admin apply 做显式校验 + 应用确认(绑定 CCC + 角色清单)
|
|
6840
|
+
注意:skill 加载对 skiff **恒可用**(不设白名单——读知识面,无写能力)`;
|
|
6825
6841
|
/** 校验当前 CCC 的 skiff 配置:roles schema 合法 / msms 均已注册 / model ∈ handyman.models / systemPrompt 非空 */
|
|
6826
6842
|
function validateSkiffConfig(root) {
|
|
6827
6843
|
const roles = readSkiffRoles(root);
|
|
@@ -6870,18 +6886,45 @@ function listSkiffRoles(root) {
|
|
|
6870
6886
|
count: items.length
|
|
6871
6887
|
};
|
|
6872
6888
|
}
|
|
6889
|
+
/**
|
|
6890
|
+
* 应用当前 skiff 配置(v1.25.3,S142 用户:改了 json 应该有个生效机制)。
|
|
6891
|
+
*
|
|
6892
|
+
* 语义:配置是**每次请求实时读取**的(v1.25.2)——apply 不是"推送",而是**显式校验 + 应用确认**:
|
|
6893
|
+
* ① 校验配置合法(复用 validate:msms 注册 / model 白名单 / systemPrompt 非空)
|
|
6894
|
+
* ② 非法 → 报告问题清单,不应用(提示修复后重跑 apply)
|
|
6895
|
+
* ③ 合法 → 应用确认:绑定 CCC + 角色清单 + 说明(调试页刷新即生效)
|
|
6896
|
+
*/
|
|
6897
|
+
function applySkiffConfig(root) {
|
|
6898
|
+
const validation = validateSkiffConfig(root);
|
|
6899
|
+
const roles = readSkiffRoles(root);
|
|
6900
|
+
if (!validation.ok) return {
|
|
6901
|
+
applied: false,
|
|
6902
|
+
cccRoot: root,
|
|
6903
|
+
roleCount: roles.size,
|
|
6904
|
+
issues: validation.issues,
|
|
6905
|
+
hint: "fix the issues above, then run skiff_admin apply again"
|
|
6906
|
+
};
|
|
6907
|
+
return {
|
|
6908
|
+
applied: true,
|
|
6909
|
+
cccRoot: root,
|
|
6910
|
+
roleCount: roles.size,
|
|
6911
|
+
roles: [...roles.keys()],
|
|
6912
|
+
note: "roles are read live from .opencode/serenity.json — the skiff debug page reflects changes on refresh; skill loading is always available to skiff sessions (not whitelisted)"
|
|
6913
|
+
};
|
|
6914
|
+
}
|
|
6873
6915
|
const skiffAdminTool = defineTool({
|
|
6874
6916
|
name: "skiff_admin",
|
|
6875
|
-
description: "Skiff (F4, experimental): CCC cognitive-subset roles (subsets of the full serenity trajectory). guide: definition tutorial (concept/role schema/cognitive MSM writing/dual whitelist/trajectory subset/examples); validate: check the CCC skiff config (roles schema legal / msms registered / model in handyman.models / systemPrompt non-empty); list: role summary (name/model/msms/tools/trajectory). Roles are defined by the CCC in .opencode/serenity.json skiff.roles.",
|
|
6917
|
+
description: "Skiff (F4, experimental): CCC cognitive-subset roles (subsets of the full serenity trajectory). guide: definition tutorial (concept/role schema/cognitive MSM writing/dual whitelist/trajectory subset/examples); validate: check the CCC skiff config (roles schema legal / msms registered / model in handyman.models / systemPrompt non-empty); apply: validate then confirm the config is live (bound CCC + role list; roles are read live on every request); list: role summary (name/model/msms/tools/trajectory). Roles are defined by the CCC in .opencode/serenity.json skiff.roles; skill loading is always available to skiff sessions (not whitelisted).",
|
|
6876
6918
|
parameters: { action: {
|
|
6877
6919
|
type: "string",
|
|
6878
6920
|
enum: [
|
|
6879
6921
|
"guide",
|
|
6880
6922
|
"validate",
|
|
6923
|
+
"apply",
|
|
6881
6924
|
"list"
|
|
6882
6925
|
],
|
|
6883
6926
|
required: true,
|
|
6884
|
-
description: "Subcommand: guide (definition tutorial) / validate (config check) / list (role summary)"
|
|
6927
|
+
description: "Subcommand: guide (definition tutorial) / validate (config check) / apply (validate + confirm live) / list (role summary)"
|
|
6885
6928
|
} },
|
|
6886
6929
|
output: {
|
|
6887
6930
|
schema: { type: "json" },
|
|
@@ -6893,8 +6936,9 @@ const skiffAdminTool = defineTool({
|
|
|
6893
6936
|
switch (args.action) {
|
|
6894
6937
|
case "guide": return { guide: SKIFF_GUIDE };
|
|
6895
6938
|
case "validate": return validateSkiffConfig(root);
|
|
6939
|
+
case "apply": return applySkiffConfig(root);
|
|
6896
6940
|
case "list": return listSkiffRoles(root);
|
|
6897
|
-
default: throw new Error("skiff_admin requires action: guide | validate | list");
|
|
6941
|
+
default: throw new Error("skiff_admin requires action: guide | validate | apply | list");
|
|
6898
6942
|
}
|
|
6899
6943
|
}
|
|
6900
6944
|
});
|
|
@@ -9294,13 +9338,17 @@ function registerGateway(ctx) {
|
|
|
9294
9338
|
//#endregion
|
|
9295
9339
|
//#region src/skiff-debug.ts
|
|
9296
9340
|
/**
|
|
9297
|
-
* skiff-debug.ts — Skiff 调试问答页(F4a',v1.25.
|
|
9341
|
+
* skiff-debug.ts — Skiff 调试问答页(F4a',v1.25.x 实验性)
|
|
9298
9342
|
*
|
|
9299
9343
|
* node:http 调试端口(默认关,仅监听 127.0.0.1;启停 = 人工——设置面板「Serenity」
|
|
9300
9344
|
* 页 Skiff 区块开关,不随插件加载自动启动)。
|
|
9301
9345
|
*
|
|
9302
|
-
* - GET / → 问答 HTML
|
|
9303
|
-
* - POST /ask → {role, question} → 走会话核心(skiff-core)→ {answer, sessionId, trajectory}
|
|
9346
|
+
* - GET / → 问答 HTML 页(**CCC 选择器** + 角色下拉 + 输入框 + 答案区 + 轨迹区 + WebUI 链接)
|
|
9347
|
+
* - POST /ask → {ccc?, role, question} → 走会话核心(skiff-core)→ {answer, sessionId, trajectory}
|
|
9348
|
+
*
|
|
9349
|
+
* **多 CCC 手工切换(v1.25.4,S142 用户)**:dsh 管理多个 CCC 时,调试页顶部 CCC
|
|
9350
|
+
* 下拉列出全部候选(live 会话 cwd 上溯 .serenity 去重 + 默认绑定 root 兜底),
|
|
9351
|
+
* 切换后角色下拉联动(各 CCC 的 skiff.roles 实时读取),提问按所选 CCC 创建 agent。
|
|
9304
9352
|
*
|
|
9305
9353
|
* 与 ACP stdio 协议(F4c 后续)共用同一会话核心(createSkiffAgent + askSkiff),
|
|
9306
9354
|
* 协议层后加不返工。轨迹 = session.events 结构化返回(与 dsh WebUI 同源数据),
|
|
@@ -9333,10 +9381,32 @@ function sendHtml(res, html) {
|
|
|
9333
9381
|
});
|
|
9334
9382
|
res.end(html);
|
|
9335
9383
|
}
|
|
9336
|
-
/**
|
|
9337
|
-
|
|
9338
|
-
|
|
9339
|
-
|
|
9384
|
+
/**
|
|
9385
|
+
* 发现候选 CCC 列表(多 CCC 手工切换,v1.25.4):
|
|
9386
|
+
* live 会话 cwd 上溯 .serenity 去重 + 默认绑定 root 兜底(不在列表时放首位)。
|
|
9387
|
+
*/
|
|
9388
|
+
function discoverCccs(ctx, defaultRoot) {
|
|
9389
|
+
const roots = [];
|
|
9390
|
+
try {
|
|
9391
|
+
const sessions = ctx.sessions;
|
|
9392
|
+
for (const s of sessions?.list?.() ?? []) {
|
|
9393
|
+
const cwd = s?.header?.cwd;
|
|
9394
|
+
if (typeof cwd === "string") {
|
|
9395
|
+
const r = findSerenityRoot(cwd);
|
|
9396
|
+
if (r && !roots.includes(r)) roots.push(r);
|
|
9397
|
+
}
|
|
9398
|
+
}
|
|
9399
|
+
} catch {}
|
|
9400
|
+
if (!roots.includes(defaultRoot)) roots.unshift(defaultRoot);
|
|
9401
|
+
return roots.map((root) => ({
|
|
9402
|
+
root,
|
|
9403
|
+
name: basename(root) || root,
|
|
9404
|
+
roles: [...readSkiffRoles(root).keys()]
|
|
9405
|
+
}));
|
|
9406
|
+
}
|
|
9407
|
+
/** 问答页 HTML:CCC 切换器 + 角色下拉 + 输入 + 答案区 + 轨迹区(JS 渲染)+ WebUI 链接 */
|
|
9408
|
+
function skiffDebugPage(cccs, defaultRoot, webPort) {
|
|
9409
|
+
const data = JSON.stringify(cccs);
|
|
9340
9410
|
return `<!DOCTYPE html>
|
|
9341
9411
|
<html lang="zh">
|
|
9342
9412
|
<head>
|
|
@@ -9373,32 +9443,61 @@ function skiffDebugPage(roles, cccRoot, webPort) {
|
|
|
9373
9443
|
<body>
|
|
9374
9444
|
<main>
|
|
9375
9445
|
<h1>Skiff Debug</h1>
|
|
9376
|
-
<div class="sub">宁静号 trajectory 子集角色问答页(v1.25.
|
|
9377
|
-
<div class="ccc"
|
|
9446
|
+
<div class="sub">宁静号 trajectory 子集角色问答页(v1.25.4 实验性)— 多 CCC 可切换,走 DSH agent-loop 会话核心,轨迹与 WebUI 同源</div>
|
|
9447
|
+
<div class="ccc" id="cccBadge"></div>
|
|
9448
|
+
<label for="ccc">认知容器</label>
|
|
9449
|
+
<select id="ccc"></select>
|
|
9378
9450
|
<label for="role">角色</label>
|
|
9379
|
-
<select id="role"
|
|
9451
|
+
<select id="role"></select>
|
|
9380
9452
|
<label for="q">问题</label>
|
|
9381
9453
|
<textarea id="q" placeholder="向该角色提问…"></textarea>
|
|
9382
9454
|
<button id="ask">提问</button>
|
|
9383
9455
|
<div id="answer" class="muted">等待提问…</div>
|
|
9384
9456
|
<div id="trajectory"></div>
|
|
9385
|
-
<p class="muted"><a href="${
|
|
9457
|
+
<p class="muted"><a href="${`http://127.0.0.1:${webPort}`}" target="_blank" rel="noopener">在 dsh WebUI 查看完整会话</a>(会话列表搜索 sessionId;WebUI 有完整交互)</p>
|
|
9386
9458
|
</main>
|
|
9459
|
+
<script id="skiff-data" type="application/json" data-default="${escapeHtml(defaultRoot)}">${escapeHtml(data)}<\/script>
|
|
9387
9460
|
<script>
|
|
9461
|
+
const CCCS = JSON.parse(document.getElementById('skiff-data').textContent)
|
|
9462
|
+
const defaultRoot = document.getElementById('skiff-data').dataset.default
|
|
9463
|
+
const cccSel = document.getElementById('ccc')
|
|
9464
|
+
const roleSel = document.getElementById('role')
|
|
9465
|
+
const badge = document.getElementById('cccBadge')
|
|
9388
9466
|
const btn = document.getElementById('ask')
|
|
9389
9467
|
const answer = document.getElementById('answer')
|
|
9390
9468
|
const traj = document.getElementById('trajectory')
|
|
9391
9469
|
const esc = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]))
|
|
9470
|
+
function currentCcc() {
|
|
9471
|
+
return CCCS.find((c) => c.root === cccSel.value) || (CCCS[0] || { root: '', name: '', roles: [] })
|
|
9472
|
+
}
|
|
9473
|
+
function fillCccs() {
|
|
9474
|
+
cccSel.innerHTML = CCCS.map((c) => {
|
|
9475
|
+
const n = c.roles.length
|
|
9476
|
+
return '<option value="' + esc(c.root) + '">' + esc(c.name) + (n ? ' (' + n + ' 角色)' : ' (无角色)') + '</option>'
|
|
9477
|
+
}).join('') || '<option value="">(未发现 CCC)</option>'
|
|
9478
|
+
if (defaultRoot) cccSel.value = CCCS.some((c) => c.root === defaultRoot) ? defaultRoot : (CCCS[0] && CCCS[0].root)
|
|
9479
|
+
fillRoles()
|
|
9480
|
+
}
|
|
9481
|
+
function fillRoles() {
|
|
9482
|
+
const c = currentCcc()
|
|
9483
|
+
badge.textContent = 'CCC: ' + c.root
|
|
9484
|
+
roleSel.innerHTML = (c.roles && c.roles.length)
|
|
9485
|
+
? c.roles.map((r) => '<option value="' + esc(r) + '">' + esc(r) + '</option>').join('')
|
|
9486
|
+
: '<option value="">(未配置角色)</option>'
|
|
9487
|
+
}
|
|
9488
|
+
cccSel.addEventListener('change', fillRoles)
|
|
9489
|
+
fillCccs()
|
|
9392
9490
|
btn.addEventListener('click', async () => {
|
|
9393
|
-
const
|
|
9491
|
+
const c = currentCcc()
|
|
9492
|
+
const role = roleSel.value
|
|
9394
9493
|
const q = document.getElementById('q').value.trim()
|
|
9395
|
-
if (!role || !q) { answer.className = 'err'; answer.textContent = '
|
|
9494
|
+
if (!c.root || !role || !q) { answer.className = 'err'; answer.textContent = '请选择认知容器与角色并输入问题'; return }
|
|
9396
9495
|
btn.disabled = true
|
|
9397
9496
|
answer.className = 'muted'
|
|
9398
9497
|
answer.textContent = '运行中…'
|
|
9399
9498
|
traj.innerHTML = ''
|
|
9400
9499
|
try {
|
|
9401
|
-
const res = await fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ role, question: q }) })
|
|
9500
|
+
const res = await fetch('/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ccc: c.root, role, question: q }) })
|
|
9402
9501
|
const data = await res.json()
|
|
9403
9502
|
if (!res.ok) throw new Error(data.error || ('HTTP ' + res.status))
|
|
9404
9503
|
answer.className = ''
|
|
@@ -9435,12 +9534,11 @@ function escapeHtml(s) {
|
|
|
9435
9534
|
/**
|
|
9436
9535
|
* 启动调试问答服务(单实例;重复启动幂等返回既有实例)。
|
|
9437
9536
|
*
|
|
9438
|
-
* **CCC 绑定(v1.25.2
|
|
9439
|
-
* 解析:live 会话中**含 skiff.roles 的 CCC
|
|
9440
|
-
*
|
|
9441
|
-
* 页面顶部显示绑定的 CCC root,绑定可核对。
|
|
9537
|
+
* **CCC 绑定(v1.25.2 用户指出)**:服务绑定一个默认 CCC root(调用方 resolveSkiffRoot
|
|
9538
|
+
* 解析:live 会话中**含 skiff.roles 的 CCC 优先**);v1.25.4 起页面可**手工切换**到
|
|
9539
|
+
* 其它候选 CCC(live 会话发现的全部 CCC);角色配置**每次请求实时读取**(不缓存快照)。
|
|
9442
9540
|
*
|
|
9443
|
-
* @param root
|
|
9541
|
+
* @param root 默认绑定的 CCC 根(首次加载选中;角色配置读取 + skiff agent cwd)
|
|
9444
9542
|
* @param port 调试端口(仅 127.0.0.1)
|
|
9445
9543
|
* @param webPort 主 WebUI 端口(WebUI 链接)
|
|
9446
9544
|
*/
|
|
@@ -9457,7 +9555,7 @@ async function startSkiffDebugServer(ctx, root, port, webPort) {
|
|
|
9457
9555
|
server,
|
|
9458
9556
|
port
|
|
9459
9557
|
};
|
|
9460
|
-
console.log(`[serenity-hooks] ✓ Skiff 调试问答页: http://127.0.0.1:${port}
|
|
9558
|
+
console.log(`[serenity-hooks] ✓ Skiff 调试问答页: http://127.0.0.1:${port}(默认 CCC: ${root},WebUI: ${webPort})`);
|
|
9461
9559
|
}
|
|
9462
9560
|
function stopSkiffDebugServer() {
|
|
9463
9561
|
if (!active) return;
|
|
@@ -9466,11 +9564,11 @@ function stopSkiffDebugServer() {
|
|
|
9466
9564
|
} catch {}
|
|
9467
9565
|
active = null;
|
|
9468
9566
|
}
|
|
9469
|
-
async function handle(ctx,
|
|
9567
|
+
async function handle(ctx, defaultRoot, webPort, req, res) {
|
|
9470
9568
|
try {
|
|
9471
9569
|
const url = (req.url ?? "/").split("?")[0] ?? "/";
|
|
9472
9570
|
if (req.method === "GET" && url === "/") {
|
|
9473
|
-
sendHtml(res, skiffDebugPage(
|
|
9571
|
+
sendHtml(res, skiffDebugPage(discoverCccs(ctx, defaultRoot), defaultRoot, webPort));
|
|
9474
9572
|
return;
|
|
9475
9573
|
}
|
|
9476
9574
|
if (req.method === "POST" && url === "/ask") {
|
|
@@ -9483,18 +9581,19 @@ async function handle(ctx, root, webPort, req, res) {
|
|
|
9483
9581
|
sendJson(res, 400, { error: "invalid JSON body" });
|
|
9484
9582
|
return;
|
|
9485
9583
|
}
|
|
9584
|
+
const ccc = typeof body.ccc === "string" && body.ccc !== "" ? body.ccc : defaultRoot;
|
|
9486
9585
|
const roleName = typeof body.role === "string" ? body.role : "";
|
|
9487
9586
|
const question = typeof body.question === "string" ? body.question : "";
|
|
9488
|
-
const role = readSkiffRoles(
|
|
9587
|
+
const role = readSkiffRoles(ccc).get(roleName);
|
|
9489
9588
|
if (!roleName || !role) {
|
|
9490
|
-
sendJson(res, 400, { error: `unknown role: ${roleName}` });
|
|
9589
|
+
sendJson(res, 400, { error: `unknown role: ${roleName} (ccc: ${ccc})` });
|
|
9491
9590
|
return;
|
|
9492
9591
|
}
|
|
9493
9592
|
if (!question.trim()) {
|
|
9494
9593
|
sendJson(res, 400, { error: "empty question" });
|
|
9495
9594
|
return;
|
|
9496
9595
|
}
|
|
9497
|
-
const result = await askSkiff(ctx, (await createSkiffAgent(ctx,
|
|
9596
|
+
const result = await askSkiff(ctx, (await createSkiffAgent(ctx, ccc, roleName, role, readHandymanConfig(ccc)?.defaultModel)).agent, question);
|
|
9498
9597
|
sendJson(res, 200, {
|
|
9499
9598
|
answer: result.answer,
|
|
9500
9599
|
sessionId: result.sessionId,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shgroup/dsh-serenity-hooks",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.4",
|
|
4
4
|
"description": "宁静号 ACC harness — Native Cordis 插件(DeepSeek Harness 运行时)。真实 DSH 工具注册(cc_fs/session/acc_msm 等 9 工具)+ 拦截缝机械约束(safe-mode/路径守卫/会话落盘)+ 系统提示词注入(ACC/CCE/Constraints/SKILL/Session 五块)。适配 DSH 公开版(deepseek-ai/deepseek-harness 0.1.0-rc)。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|