@shgroup/dsh-serenity-hooks 1.26.15 → 1.26.17
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/experiments/autotrajectory/SKILL.md +14 -8
- package/experiments/autotrajectory/scripts/autotrajectory-exp.ts +23 -6
- package/lib/acp-core.d.ts +100 -0
- package/lib/acp-http.d.ts +29 -0
- package/lib/api.d.ts +47 -0
- package/lib/autotrajectory.d.ts +193 -0
- package/lib/ccc-CfDrlfA7.js +141 -0
- package/lib/ccc.d.ts +162 -0
- package/lib/client.js +5 -0
- package/lib/config-ops.d.ts +166 -0
- package/lib/constants.d.ts +8 -0
- package/lib/fs-ops.d.ts +36 -0
- package/lib/gateway-auth.d.ts +89 -0
- package/lib/gateway-proxy.d.ts +39 -0
- package/lib/gateway.d.ts +80 -0
- package/lib/git-ops.d.ts +28 -0
- package/lib/handyman-ops.d.ts +68 -0
- package/lib/handyman-preset-inherit.d.ts +34 -0
- package/lib/index.d.ts +68 -0
- package/lib/index.js +10 -8
- package/lib/invariant.d.ts +29 -0
- package/lib/json.d.ts +9 -0
- package/lib/kit-ops.d.ts +23 -0
- package/lib/localstore-ops.d.ts +85 -0
- package/lib/msm-ops.d.ts +78 -0
- package/lib/output-guard-seam.d.ts +21 -0
- package/lib/output-guard.d.ts +68 -0
- package/lib/rebuild.d.ts +118 -0
- package/lib/seams/bootstrap.d.ts +83 -0
- package/lib/seams/compact.d.ts +31 -0
- package/lib/seams/context.d.ts +48 -0
- package/lib/seams/env.d.ts +16 -0
- package/lib/seams/guards.d.ts +72 -0
- package/lib/seams/keeper.d.ts +61 -0
- package/lib/seams/opencode-skills.d.ts +14 -0
- package/lib/seams/system-prompt.d.ts +113 -0
- package/lib/session-ops.d.ts +127 -0
- package/lib/settings-section.d.ts +113 -0
- package/lib/skiff-core.d.ts +78 -0
- package/lib/skiff-debug.d.ts +86 -0
- package/lib/skiff-registry.d.ts +25 -0
- package/lib/skiff-role.d.ts +50 -0
- package/lib/skills/opencode-scan.d.ts +27 -0
- package/lib/skills-discovery.d.ts +25 -0
- package/lib/status.d.ts +38 -0
- package/lib/tools/autotrajectory-exp.d.ts +24 -0
- package/lib/tools/cc-fs.d.ts +7 -0
- package/lib/tools/cce.d.ts +9 -0
- package/lib/tools/eap.d.ts +7 -0
- package/lib/tools/git.d.ts +4 -0
- package/lib/tools/handyman.d.ts +43 -0
- package/lib/tools/kit.d.ts +4 -0
- package/lib/tools/localstore.d.ts +8 -0
- package/lib/tools/msm.d.ts +4 -0
- package/lib/tools/neat.d.ts +5 -0
- package/lib/tools/rebuild.d.ts +19 -0
- package/lib/tools/session.d.ts +78 -0
- package/lib/tools/skiff-admin.d.ts +25 -0
- package/lib/totp.d.ts +40 -0
- package/package.json +6 -4
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-serenity-hooks",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.17",
|
|
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": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: autotrajectory-experiment
|
|
3
|
-
description: 自主轨迹实验(Self-Sustaining Trajectory Experiment)参与 skill。本 skill 让 CCC 完整理解实验的背景(人类 waiting 是 trajectory 速度瓶颈)、目的(验证"无人等待的 trajectory"能否加速认知推进)、方式(时钟唤起 + 先验偏见 + 前台运行),并提供一站式实验管理 MSM(autotrajectory-exp:无参全报告 / init 初始化 / random 验证偏见内容)。任何希望参与实验的 CCC 复制本目录到 .opencode/skills/ 即可开始。
|
|
3
|
+
description: 自主轨迹实验(Self-Sustaining Trajectory Experiment)参与 skill。本 skill 让 CCC 完整理解实验的背景(人类 waiting 是 trajectory 速度瓶颈)、目的(验证"无人等待的 trajectory"能否加速认知推进)、方式(时钟唤起 + 先验偏见 + 轨迹焦点 + 前台运行),并提供一站式实验管理 MSM(autotrajectory-exp:无参全报告 / init 初始化 / random 验证偏见内容)。任何希望参与实验的 CCC 复制本目录到 .opencode/skills/ 即可开始。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Skill: autotrajectory-experiment
|
|
@@ -35,7 +35,7 @@ description: 自主轨迹实验(Self-Sustaining Trajectory Experiment)参与
|
|
|
35
35
|
| P5 | 轨迹运转速度提升 → 更快产生让人类满意的效果 |
|
|
36
36
|
| 反证 | 熵增失控 / 自我确认循环 / 随机噪音化 / 资源无界 / 反馈脱节——任一显著 → 猜想不成立 |
|
|
37
37
|
|
|
38
|
-
## 3. 参与方式(CCC
|
|
38
|
+
## 3. 参与方式(CCC 侧四步——第一步可一键 init)
|
|
39
39
|
|
|
40
40
|
### ① 初始化(一键):`acc_msm exec autotrajectory-exp init`
|
|
41
41
|
|
|
@@ -48,16 +48,21 @@ description: 自主轨迹实验(Self-Sustaining Trajectory Experiment)参与
|
|
|
48
48
|
"enabled": true, // 总开关(缺省 false,默认关零资源占用)
|
|
49
49
|
"intervalHours": 12, // 无人类活动 N 小时后唤起(缺省 12)
|
|
50
50
|
"biasProvider": "autotrajectory-bias.ts", // 偏见内容提供者脚本(CCC 根下)
|
|
51
|
+
"topPrompt": "本轨迹的核心焦点:<CCC 填写>", // 轨迹焦点(v1.26.17):CCC 定义,每次唤起最先注入
|
|
51
52
|
"avoidWakeHours": { "start": 8, "end": 18 } // 可选:避开北京高峰(缺省 8~18 省钱)
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
### ②
|
|
57
|
+
### ② 定义轨迹焦点(topPrompt——CCC 自己填写)
|
|
58
|
+
|
|
59
|
+
**CCC 定义 autotrajectory 时同时定义本轨迹的顶层提示词**(`topPrompt`):核心目标/纪律/质量要求(示例:"持续深化某领域认知,产出可重建的结论与决策记录")。它会在**每次唤起时最先注入**(`[轨迹焦点]` 段,位于身份锚定之前,影响力最大),作为**稳定焦点锚定 trajectory**——**实验观察:无焦点锚定时,多轮自主唤起中轨迹腐化严重(焦点丢失)**。与偏见内容的分工:**焦点=稳定锚(每轮不变),偏见=随机探索方向(每轮不同),互补**。init 生成占位,CCC 按自己轨迹目标改写(勿留空——留空 = 唤起无焦点锚定,轨迹易漂移)。
|
|
60
|
+
|
|
61
|
+
### ③ 实现偏见内容提供者(`autotrajectory-bias.ts`)
|
|
57
62
|
|
|
58
63
|
CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容**(反事实问题/探索方向/任何让轨迹偏离既有路径的输入)。**偏见内容归 CCC**——用本 CCC 自己的反馈信息来源保证"足够随机"。`acc_msm exec autotrajectory-exp random` 可验证输出。
|
|
59
64
|
|
|
60
|
-
###
|
|
65
|
+
### ④ 标记目标会话(可选自生动机段)
|
|
61
66
|
|
|
62
67
|
- 目标会话目录名加 `--auto` 后缀:`AGENT_SESSIONS/<date>--<desc>--auto/`——**只有带标志的轨迹走自主形态**,同 CCC 其他会话不受影响
|
|
63
68
|
- 可选:该 SESSION.md 写「下一轮动机」段(上一轮预写 → 下一轮唤起的自生偏见)
|
|
@@ -66,9 +71,10 @@ CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容*
|
|
|
66
71
|
|
|
67
72
|
```
|
|
68
73
|
定时器(每 10min)→ 唤起条件全满足 →
|
|
69
|
-
①
|
|
70
|
-
②
|
|
71
|
-
③
|
|
74
|
+
① 读 topPrompt(CCC 定义的轨迹焦点)→ 唤起消息首段注入
|
|
75
|
+
② 运行 <biasProvider> 脚本 → stdout = 偏见内容(CCC 自定)
|
|
76
|
+
③ 读 SESSION.md「下一轮动机」段 → 自生动机
|
|
77
|
+
④ 定位活跃会话 agent → 注入唤起消息(前台运行——用户全程可见、随时可介入)
|
|
72
78
|
→ 模型自动继续:探索/反事实检验 → 产出落 SESSION.md「自主探索日志」+ 预写「下一轮动机」
|
|
73
79
|
```
|
|
74
80
|
|
|
@@ -84,7 +90,7 @@ CCC 根目录下一个脚本,**stdout 输出本轮唤起注入的偏见内容*
|
|
|
84
90
|
| `acc_msm exec autotrajectory-exp init` | **一键初始化**:写配置 + 生成偏见提供者脚本模板(CCC 根 autotrajectory-bias.ts) |
|
|
85
91
|
| `acc_msm exec autotrajectory-exp random` | 运行偏见提供者脚本,输出当前偏见内容(验证) |
|
|
86
92
|
| `acc_msm exec autotrajectory-exp doc` | 实验定义说明全文(本 SKILL.md) |
|
|
87
|
-
| `acc_msm exec autotrajectory-exp check` |
|
|
93
|
+
| `acc_msm exec autotrajectory-exp check` | 仅就绪度检查(配置/轨迹焦点 topPrompt/偏见提供者/--auto 标志/动机段) |
|
|
88
94
|
| `acc_msm exec autotrajectory-exp status` | 仅当前状态(配置快照/目标会话/距上次活动/唤起窗口/可唤起性) |
|
|
89
95
|
| `acc_msm exec autotrajectory-exp guide` | 仅步骤指引 |
|
|
90
96
|
|
|
@@ -67,6 +67,8 @@ interface AutoConfig {
|
|
|
67
67
|
enabled?: boolean
|
|
68
68
|
intervalHours?: number
|
|
69
69
|
biasProvider?: string
|
|
70
|
+
/** 顶层提示词(v1.26.17):CCC 定义的稳定提示词,每次唤起最先注入(顶层约束/质量要求) */
|
|
71
|
+
topPrompt?: string
|
|
70
72
|
session?: string
|
|
71
73
|
avoidWakeHours?: { start?: number; end?: number }
|
|
72
74
|
}
|
|
@@ -190,6 +192,11 @@ function check(root: string): string {
|
|
|
190
192
|
lines.push(`✓ enabled = true`)
|
|
191
193
|
lines.push(` intervalHours = ${cfg.intervalHours ?? 12}`)
|
|
192
194
|
lines.push(` biasProvider = ${cfg.biasProvider?.trim() || DEFAULT_BIAS_PROVIDER}`)
|
|
195
|
+
if (cfg.topPrompt?.trim()) {
|
|
196
|
+
lines.push(`✓ topPrompt(轨迹焦点)已定义: ${cfg.topPrompt.trim().slice(0, 60)}${cfg.topPrompt.trim().length > 60 ? '…' : ''}(每次唤起最先注入,锚定防漂移)`)
|
|
197
|
+
} else {
|
|
198
|
+
lines.push(`⚠ topPrompt(轨迹焦点)未定义——建议 CCC 定义 autotrajectory 时填写本轨迹核心焦点(实验观察:无焦点锚定,多轮唤起轨迹易漂移腐化)`)
|
|
199
|
+
}
|
|
193
200
|
if (cfg.session) lines.push(` session = ${cfg.session}`)
|
|
194
201
|
const avoid = cfg.avoidWakeHours
|
|
195
202
|
lines.push(` 唤起窗口避开北京 ${avoid?.start ?? 8}~${avoid?.end ?? 18} 点(用量峰谷省钱)`)
|
|
@@ -241,7 +248,7 @@ function status(root: string): string {
|
|
|
241
248
|
lines.push('autotrajectory 未启用(enabled=false 或未配置)——零资源占用')
|
|
242
249
|
return lines.join('\n')
|
|
243
250
|
}
|
|
244
|
-
lines.push(`配置: intervalHours=${cfg.intervalHours ?? 12} | biasProvider=${cfg.biasProvider?.trim() || DEFAULT_BIAS_PROVIDER}${cfg.session ? ` | session=${cfg.session}` : ''}`)
|
|
251
|
+
lines.push(`配置: intervalHours=${cfg.intervalHours ?? 12} | biasProvider=${cfg.biasProvider?.trim() || DEFAULT_BIAS_PROVIDER}${cfg.session ? ` | session=${cfg.session}` : ''}${cfg.topPrompt?.trim() ? ' | topPrompt ✓' : ''}`)
|
|
245
252
|
const md = resolveTargetMd(root, cfg)
|
|
246
253
|
if (!md) {
|
|
247
254
|
lines.push('目标会话:未找到')
|
|
@@ -264,14 +271,19 @@ function guide(): string {
|
|
|
264
271
|
'',
|
|
265
272
|
'① 初始化(一键):acc_msm exec autotrajectory-exp init',
|
|
266
273
|
' ——写配置(.opencode/serenity.json autotrajectory 段)+ 生成偏见提供者脚本模板(CCC 根 autotrajectory-bias.ts)',
|
|
267
|
-
'②
|
|
274
|
+
'② **定义轨迹焦点(topPrompt)**:编辑配置中的 topPrompt——**CCC 自己填写**本轨迹的核心',
|
|
275
|
+
' 目标/纪律/质量要求(示例:"持续深化某领域认知,产出可重建的结论与决策记录")。',
|
|
276
|
+
' 它会在每次唤起时最先注入([轨迹焦点] 段),作为稳定焦点锚定 trajectory 防漂移——',
|
|
277
|
+
' **实验观察:无焦点锚定时多轮唤起轨迹腐化严重(焦点丢失)**。勿留空。',
|
|
278
|
+
'③ 实现偏见内容提供者:编辑 autotrajectory-bias.ts,stdout 输出偏见内容(反事实方向/探索动机,',
|
|
268
279
|
' 用本 CCC 自己的信息来源保证"足够随机");acc_msm exec autotrajectory-exp random 验证',
|
|
269
|
-
'
|
|
280
|
+
'④ 标记目标会话:目录名加 --auto 后缀 AGENT_SESSIONS/<date>--<desc>--auto/',
|
|
270
281
|
' (可选)该 SESSION.md 写「下一轮动机」段作自生偏见',
|
|
271
|
-
'
|
|
272
|
-
'
|
|
282
|
+
'⑤ 验证就绪:acc_msm exec autotrajectory-exp(一站式报告应为 ✅;topPrompt 未定义会 ⚠ 提示)',
|
|
283
|
+
'⑥ 观察:无人类活动满 intervalHours 且北京非高峰 → 前台会话自动出现 [自主轨迹唤起]',
|
|
273
284
|
' 产出落 SESSION.md「自主探索日志」+ 预写「下一轮动机」',
|
|
274
285
|
'',
|
|
286
|
+
'分工:焦点(topPrompt)= 稳定锚,每轮不变;偏见(biasProvider)= 随机探索方向,每轮不同——两者都由 CCC 定义。',
|
|
275
287
|
'完整定义见 SKILL.md(acc_msm exec autotrajectory-exp doc)',
|
|
276
288
|
].join('\n')
|
|
277
289
|
}
|
|
@@ -300,11 +312,16 @@ function init(root: string): string {
|
|
|
300
312
|
enabled: true,
|
|
301
313
|
intervalHours: 12,
|
|
302
314
|
biasProvider: DEFAULT_BIAS_PROVIDER,
|
|
315
|
+
// 轨迹焦点(topPrompt):**CCC 自己定义**本轨迹的核心目标/纪律/质量要求——每次唤起最先
|
|
316
|
+
// 注入,作为稳定焦点锚定 trajectory,防止多轮自主唤起中焦点丢失(腐化)。请按本 CCC
|
|
317
|
+
// 的轨迹目标改写,不要留空(留空 = 唤起无焦点锚定,轨迹易漂移)。
|
|
318
|
+
topPrompt: '本轨迹的核心焦点:<CCC 填写——例如:持续深化某领域认知,产出可重建的结论与决策记录>',
|
|
303
319
|
...at,
|
|
304
320
|
}
|
|
305
321
|
writeFileSync(cfgPath, `${JSON.stringify(merged, null, 2)}\n`)
|
|
306
322
|
out.push(`✓ 配置写入: ${cfgPath}`)
|
|
307
323
|
out.push(` autotrajectory = ${JSON.stringify(merged.autotrajectory)}`)
|
|
324
|
+
out.push(` ⚠ 请编辑 topPrompt 为**本 CCC 的轨迹焦点**(现为占位——每次唤起最先注入,防轨迹漂移,勿留空)`)
|
|
308
325
|
|
|
309
326
|
// ② 生成偏见提供者脚本模板
|
|
310
327
|
const scriptAbs = biasProviderPath(root, DEFAULT_BIAS_PROVIDER)
|
|
@@ -315,7 +332,7 @@ function init(root: string): string {
|
|
|
315
332
|
out.push(`✓ 已生成偏见提供者脚本模板: ${DEFAULT_BIAS_PROVIDER}(编辑它,stdout 输出偏见内容)`)
|
|
316
333
|
}
|
|
317
334
|
|
|
318
|
-
out.push('', '
|
|
335
|
+
out.push('', '下一步:② 编辑配置 topPrompt(轨迹焦点——CCC 自己填写本轨迹核心目标,勿留空)→ ③ 标记目标会话 --auto 后缀 → ⑤ acc_msm exec autotrajectory-exp 验证就绪')
|
|
319
336
|
return out.join('\n')
|
|
320
337
|
}
|
|
321
338
|
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* acp-core.ts — ACP 会话管理层(F4c,v1.26.0 实验性)
|
|
3
|
+
*
|
|
4
|
+
* **传输无关**:方法处理器(initialize/session/new/prompt/cancel/list/close/request_permission)
|
|
5
|
+
* 不依赖任何传输(stdio/HTTP/直调)——企业微信桥同进程直调处理器函数,
|
|
6
|
+
* acp-http 端点(外部程序化面)与未来 stdio 独立进程复用同一处理器。
|
|
7
|
+
*
|
|
8
|
+
* Skiff 映射(S142 用户拍板:指定 认知容器+角色+会话(可选)进行对话):
|
|
9
|
+
* - session/new { ccc, role, sessionId? } → createSkiffAgent / getSkiffAgent 复用
|
|
10
|
+
* (无 sessionId → 新建;有 → 进程内延续——与 v1.25.10 调试页同语义)
|
|
11
|
+
* - session/prompt → askSkiff(agent, question, 0)(全量轨迹)
|
|
12
|
+
* - session/cancel → agent.interrupt(DSH 能力)
|
|
13
|
+
* - session/close → unregisterSkiffSession(释放 agent + 注册表清理)
|
|
14
|
+
* - session/request_permission → 恒 allow(G9:白名单即授权)
|
|
15
|
+
*
|
|
16
|
+
* 实验性质:仅当 ACP 服务装配(settings acpEnabled)且 CCC 配置了角色时才创建 agent;
|
|
17
|
+
* 未启用时本模块零副作用(无监听、无 agent)。
|
|
18
|
+
*/
|
|
19
|
+
import type { Context } from 'cordis';
|
|
20
|
+
import type { SessionId } from '@deepseek-ai/dsh-session';
|
|
21
|
+
export interface JsonRpcRequest {
|
|
22
|
+
jsonrpc: '2.0';
|
|
23
|
+
id?: string | number;
|
|
24
|
+
method: string;
|
|
25
|
+
params?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
export interface JsonRpcResponse {
|
|
28
|
+
jsonrpc: '2.0';
|
|
29
|
+
id: string | number | null;
|
|
30
|
+
result?: unknown;
|
|
31
|
+
error?: {
|
|
32
|
+
code: number;
|
|
33
|
+
message: string;
|
|
34
|
+
data?: unknown;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface JsonRpcNotification {
|
|
38
|
+
jsonrpc: '2.0';
|
|
39
|
+
method: string;
|
|
40
|
+
params?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/** JSON-RPC 错误码(对齐标准) */
|
|
43
|
+
export declare const RPC_ERROR: {
|
|
44
|
+
readonly PARSE: -32700;
|
|
45
|
+
readonly INVALID_REQUEST: -32600;
|
|
46
|
+
readonly METHOD_NOT_FOUND: -32601;
|
|
47
|
+
readonly INVALID_PARAMS: -32602;
|
|
48
|
+
readonly INTERNAL: -32603;
|
|
49
|
+
};
|
|
50
|
+
export interface AcpSessionHandle {
|
|
51
|
+
sessionId: string;
|
|
52
|
+
role: string;
|
|
53
|
+
ccc: string;
|
|
54
|
+
/** 会话是否可复用(进程内延续) */
|
|
55
|
+
continued: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* ACP 会话管理器:持有 skiff agent 会话(与 skiff-core 注册表同源——
|
|
59
|
+
* 创建走 createSkiffAgent(自动注册),关闭走 unregisterSkiffSession)。
|
|
60
|
+
* 传输无关:HTTP 端点/企业微信桥/未来 stdio 都调 handle(method, params)。
|
|
61
|
+
*/
|
|
62
|
+
export declare class AcpServer {
|
|
63
|
+
private readonly ctx;
|
|
64
|
+
constructor(ctx: Context);
|
|
65
|
+
/** 实现级方法调度(返回 result 或抛 JSON-RPC 语义错误) */
|
|
66
|
+
handle(method: string, params: Record<string, unknown> | undefined): Promise<unknown>;
|
|
67
|
+
private initialize;
|
|
68
|
+
/**
|
|
69
|
+
* session/new:{ ccc, role, sessionId? } → 创建或延续 skiff 会话。
|
|
70
|
+
* 无 sessionId → createSkiffAgent(新会话,continued:false);
|
|
71
|
+
* 有 → 进程内延续(getSkiffAgent 命中 + role/ccc 绑定校验;未命中 → 错误)。
|
|
72
|
+
*/
|
|
73
|
+
private newSession;
|
|
74
|
+
private listSessions;
|
|
75
|
+
/**
|
|
76
|
+
* session/prompt:{ sessionId, question } → 答案(**v1.26.10:不返回 trajectory**——
|
|
77
|
+
* 3100 对外只提供问答,轨迹含工具结果等内部信息;3099 调试页另走 /ask 保留)
|
|
78
|
+
*/
|
|
79
|
+
private prompt;
|
|
80
|
+
/** session/cancel:{ sessionId } → 中断当前 prompt(DSH interrupt) */
|
|
81
|
+
private cancel;
|
|
82
|
+
/** session/close:{ sessionId } → 释放 agent + 注册表清理(进程内) */
|
|
83
|
+
private closeSession;
|
|
84
|
+
}
|
|
85
|
+
/** 方法不存在错误(JSON-RPC -32601) */
|
|
86
|
+
export declare class RpcMethodError extends Error {
|
|
87
|
+
constructor(message: string);
|
|
88
|
+
}
|
|
89
|
+
/** 参数错误(JSON-RPC -32602) */
|
|
90
|
+
export declare class RpcInvalidParams extends Error {
|
|
91
|
+
constructor(message: string);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* JSON-RPC 2.0 批处理(单帧):解析请求/通知 → 调 AcpServer.handle → 响应。
|
|
95
|
+
* 传输无关:acp-http 端点 / 未来 stdio 共用。
|
|
96
|
+
* @returns 响应帧数组(请求有响应;通知无;解析失败 → 单错误响应)
|
|
97
|
+
*/
|
|
98
|
+
export declare function dispatchRpc(server: AcpServer, frame: unknown): Promise<JsonRpcResponse[]>;
|
|
99
|
+
/** 断言 SessionId 类型(ACP 会话 id 即 skiff sessionId) */
|
|
100
|
+
export type { SessionId };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* acp-http.ts — ACP HTTP JSON-RPC + 建议问答页(F4c/F4d,v1.26.x 实验性)
|
|
3
|
+
*
|
|
4
|
+
* node:http 服务(默认关,仅监听 127.0.0.1;启停 = 人工——设置面板「Serenity」
|
|
5
|
+
* 页 ACP 区块开关 / 问答页开关,不随插件加载自动启动;仿 skiff 调试服务模式)。
|
|
6
|
+
*
|
|
7
|
+
* - POST / → JSON-RPC 2.0 单帧/批处理(acpEnabled 门控;ACP 程序化面)
|
|
8
|
+
* - GET / → 容器列表页(publicAskEnabled 门控;v1.26.2:只列已开放容器)
|
|
9
|
+
* - GET /c/<name> → 单容器问答页(v1.26.2:URL 体现容器名,用户只输 key)
|
|
10
|
+
* - POST /c/<name>/ask → 该容器问答(key 校验 + allowed 白名单校验)
|
|
11
|
+
* - POST /ask → 兼容旧形态 { key, ccc, ... }(key 校验 + allowed 校验)
|
|
12
|
+
*
|
|
13
|
+
* 与 skiff 调试页(人工测试面)共享同一会话核心(acp-core → skiff-core);
|
|
14
|
+
* 企业微信桥(F4c-2)同进程直调 acp-core 处理器函数,不经本端点。
|
|
15
|
+
* stdio 形态(独立进程部署)后续复用同一 acp-core(官方 NDJSON 帧格式)。
|
|
16
|
+
*
|
|
17
|
+
* 实验性质:未开启时零资源占用(无监听、无 agent 创建)。
|
|
18
|
+
*/
|
|
19
|
+
import type { Context } from 'cordis';
|
|
20
|
+
export declare function acpHttpActive(): boolean;
|
|
21
|
+
export declare function acpHttpPort(): number | null;
|
|
22
|
+
/**
|
|
23
|
+
* 启动 ACP HTTP JSON-RPC + 建议问答页服务(单实例;重复启动幂等返回既有实例)。
|
|
24
|
+
* @param ctx 插件上下文(AcpServer 内部经 skiff-core 创建 agent)
|
|
25
|
+
* @param port 监听端口(仅 127.0.0.1)
|
|
26
|
+
* @param defaultRoot 默认 CCC 根(问答页候选发现兜底;resolveSkiffRoot 传入)
|
|
27
|
+
*/
|
|
28
|
+
export declare function startAcpHttpServer(ctx: Context, port: number, defaultRoot?: string): Promise<void>;
|
|
29
|
+
export declare function stopAcpHttpServer(): void;
|
package/lib/api.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api.ts — HTTP 状态接口(WebUI 停靠栏数据源/开关通道 + 图片落盘)
|
|
3
|
+
*
|
|
4
|
+
* 路由:
|
|
5
|
+
* GET /serenity/status ?workspace=<路径> → 状态(root/accVersion/safeModeOn/...)
|
|
6
|
+
* POST /serenity/status { workspace, on } → 切换安全模式(WebUI 专属头)
|
|
7
|
+
* GET /serenity/handymen → handyman 运行状态(v1.24.0:loop → handyman)
|
|
8
|
+
* POST /serenity/image-upload { workspace?, mediaType, data(base64) } → 图片写 _tmp/images_from_user/(client 专属)
|
|
9
|
+
*
|
|
10
|
+
* 经 ctx.webServer(webserver 服务,公开版由 httpServer 改名)注册;客户端与服务器同源,调用无信任围栏问题。
|
|
11
|
+
*/
|
|
12
|
+
import type { Context } from 'cordis';
|
|
13
|
+
/** 图片落盘目录(CCC 根相对;S142 图片自动识别基础设施——粘贴图片落盘供 agent 经 CCC vlm MSM 自主处理) */
|
|
14
|
+
export declare const IMAGE_UPLOAD_DIR = "_tmp/images_from_user";
|
|
15
|
+
export declare const IMAGE_MEDIA_TYPES: Set<string>;
|
|
16
|
+
/** 文件落盘目录(CCC 根相对;v1.24.1 粘贴任意文件自动落盘——agent 经 CCC 既有 MSM(pdf-extract/archive-extract 等)自主处理) */
|
|
17
|
+
export declare const FILE_UPLOAD_DIR = "_tmp/files_from_user";
|
|
18
|
+
/** 拒绝的可执行/危险扩展名(安全边界:不落盘可执行文件,防 agent 被诱导执行) */
|
|
19
|
+
export declare const BLOCKED_FILE_EXTS: Set<string>;
|
|
20
|
+
/**
|
|
21
|
+
* 图片落盘核心逻辑(可测):校验 mediaType 白名单 + base64 解码 + 大小上限 →
|
|
22
|
+
* 写 CCC 根 _tmp/images_from_user/<ts>-<rand>.<ext>,返回相对路径。
|
|
23
|
+
* 校验失败抛 Error(handler 转 400)。
|
|
24
|
+
*/
|
|
25
|
+
export declare function saveImageToTmp(root: string, mediaType: string, data: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* 文件名脱敏(路径逃逸 + 非法字符):取 basename(去 / 与 \),剥离前导点/空,
|
|
28
|
+
* 非法字符 → '-',限长。返回空则 'file'。
|
|
29
|
+
*/
|
|
30
|
+
export declare function sanitizeFileName(name: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* 任意文件落盘核心逻辑(可测):文件名校验 + 可执行扩展名拒绝 + base64 解码 +
|
|
33
|
+
* 大小上限(10MB)→ 写 CCC 根 _tmp/files_from_user/<ts>-<rand>-<safeName>,返回相对路径。
|
|
34
|
+
* 校验失败抛 Error(handler 转 400)。
|
|
35
|
+
*/
|
|
36
|
+
export declare function saveFileToTmp(root: string, fileName: string, data: string): string;
|
|
37
|
+
export interface StatusApiRegistration {
|
|
38
|
+
configPaths?: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 从请求参数解析 workspace:优先 sessionId → 会话 header.cwd;其次 workspace 参数;
|
|
42
|
+
* 无参 → 遍历 live sessions 找第一个 CCC 会话的 cwd(远程访问时 sessionId 可能缺失,
|
|
43
|
+
* 回退 process.cwd()=$HOME 会错误显示"未激活"——v1.22.2 修复);最后进程 cwd。
|
|
44
|
+
* 纯逻辑(可单测):resolveWorkspaceCore(sessionCwd, workspaceParam, listCwds)。
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveWorkspaceCore(sessionCwd: string | undefined, workspaceParam: string | undefined, listCwds: () => string[], fallback: string): string;
|
|
47
|
+
export declare function registerStatusApi(ctx: Context, opts?: StatusApiRegistration): void;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autotrajectory.ts — 自主轨迹(Self-Sustaining Trajectory)验证机制(v1.26.12)
|
|
3
|
+
*
|
|
4
|
+
* 依据:serenity-acc-specs/docs/self-sustaining-trajectory-hypothesis.md(v0.1 实验提案;
|
|
5
|
+
* S142 2026-08-30 用户提出猜想 + 三项裁决:① 时钟驱动 ② 先验偏见自生+随机(随机充分引入)
|
|
6
|
+
* ③ 人类=反馈来源(不直接参与))。
|
|
7
|
+
*
|
|
8
|
+
* 形态(用户审核定稿 v0.5):
|
|
9
|
+
* · **前台运行**:时钟唤起 = 向活跃会话注入唤起消息(agent.steer,v1.22.5 自动继续同款
|
|
10
|
+
* 通道)→ 模型自动继续 → 用户全程可见、随时可介入(人类反馈天然并入——同会话)。
|
|
11
|
+
* · **偏见内容提供者 = CCC 根目录下脚本**(用户拍板:不再让 CCC 注册 MSM;tool 直接运行脚本;
|
|
12
|
+
* 命名修正:它不是"随机脚本",本质是**偏见内容提供者**——biasProvider):
|
|
13
|
+
* 配置 biasProvider(相对 CCC 根,缺省 autotrajectory-bias.ts)——tool 直接运行取
|
|
14
|
+
* stdout 作为偏见内容;脚本缺失 → **报错要求实现**(偏见内容归 CCC,实现 = 根目录放脚本)。
|
|
15
|
+
* · **会话标志 = 目录名后缀 --auto**(用户拍板:后缀,验证用方便):
|
|
16
|
+
* AGENT_SESSIONS/<date>--<desc>--auto/ → 该轨迹为自主形态;无标志会话不受影响。
|
|
17
|
+
* · **轨迹焦点 topPrompt = CCC 定义**(v1.26.17,用户"确保自动轨迹质量"):CCC 在定义
|
|
18
|
+
* autotrajectory 时自己填写本轨迹的顶层提示词(核心目标/纪律/质量要求),**每次唤起最先
|
|
19
|
+
* 注入**——稳定焦点锚定 trajectory,防止多轮自主唤起中焦点丢失(实验观察:轨迹腐化严重)。
|
|
20
|
+
* 与偏见内容分工:焦点=稳定锚(每轮不变),偏见=随机探索方向(每轮不同),互补。
|
|
21
|
+
* · **唤起窗口避开北京时间 8~18 点**(用户拍板:用量峰谷省钱)——avoidWakeHours 可覆盖。
|
|
22
|
+
* · **默认关**:serenity.json autotrajectory.enabled=false → 定时器不启动,零资源占用。
|
|
23
|
+
* · **零影响**:不修改任何现有工具 / seams / 外部面;新增独立模块 + ccc.ts 纯类型扩展。
|
|
24
|
+
*/
|
|
25
|
+
import type { Context } from 'cordis';
|
|
26
|
+
import { type AutoTrajectorySettings } from './ccc.js';
|
|
27
|
+
/** 偏见内容提供者脚本缺省名(CCC 根目录下;用户拍板:tool 直接运行,缺失报错要求实现) */
|
|
28
|
+
export declare const DEFAULT_BIAS_PROVIDER = "autotrajectory-bias.ts";
|
|
29
|
+
/** 自主轨迹会话目录后缀标志(用户拍板:后缀) */
|
|
30
|
+
export declare const AUTO_DIR_SUFFIX = "--auto";
|
|
31
|
+
/** 调度 tick 周期(10min——验证形态"一个就够") */
|
|
32
|
+
export declare const TICK_MS: number;
|
|
33
|
+
/** SESSION.md 内「下一轮动机」段标记(自生偏见载体——轨迹预设自己的未来) */
|
|
34
|
+
export declare const MOTIVATION_MARKER = "\u4E0B\u4E00\u8F6E\u52A8\u673A";
|
|
35
|
+
/** 缺省避开的高峰时段(北京时间 [start, end) 不唤起——用量峰谷省钱) */
|
|
36
|
+
export declare const DEFAULT_AVOID_HOURS: {
|
|
37
|
+
start: number;
|
|
38
|
+
end: number;
|
|
39
|
+
};
|
|
40
|
+
export declare function readAutoTrajectorySettings(root: string): AutoTrajectorySettings | null;
|
|
41
|
+
/**
|
|
42
|
+
* 北京时间(UTC+8)当前小时——不依赖服务器时区(服务器可能 UTC/本地任意)。
|
|
43
|
+
*/
|
|
44
|
+
export declare function beijingHour(nowMs: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* 唤起窗口判定:北京时间 [avoidStart, avoidEnd) 内不唤起(缺省 8~18)。
|
|
47
|
+
* 单段避开(start<=end):窗口 = [0,start) ∪ [end,24);跨零点避开(start>end):窗口 = [end,start)。
|
|
48
|
+
*/
|
|
49
|
+
export declare function inAllowedWakeWindow(nowMs: number, avoid?: {
|
|
50
|
+
start?: number;
|
|
51
|
+
end?: number;
|
|
52
|
+
}): boolean;
|
|
53
|
+
/** 标志位判定:SESSION.md 所在目录名以 --auto 结尾 → 自主轨迹形态 */
|
|
54
|
+
export declare function isAutoTrajectorySession(mdPath: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 目标会话定位:**必须配置 cfg.session**(S###/目录名)——CCC 日常有多条 trajectory 在跑,
|
|
57
|
+
* 绝不默认唤起(缺省最近活跃会误伤其他正在运行的轨迹;用户拍板:必须配置才生效)。
|
|
58
|
+
* 未配置 session 或未命中 → null(不唤起)。
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveTargetMd(root: string, cfg: AutoTrajectorySettings): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* 唤起条件(纯逻辑,可测):enabled + 未在运行 + 目录标志 + mtime 超间隔 + 窗口允许。
|
|
63
|
+
*/
|
|
64
|
+
export declare function shouldWake(settings: AutoTrajectorySettings, mdPath: string | null, nowMs: number, running: boolean): boolean;
|
|
65
|
+
/** 自生动机读取:SESSION.md「下一轮动机」段内容(到下一个二级标题或文件尾;无 → null) */
|
|
66
|
+
export declare function readSelfGeneratedMotivation(mdPath: string): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* 偏见内容:直接运行 CCC 根目录下偏见提供者脚本(biasProvider,缺省 autotrajectory-bias.ts)→ stdout。
|
|
69
|
+
* 脚本缺失 → 返回 { text: null, error: 提示实现 }(唤起侧报错要求实现,不静默跳过)。
|
|
70
|
+
* 路径逃逸校验(resolveInside);bun 优先,node 兜底;600s 超时。
|
|
71
|
+
*/
|
|
72
|
+
export declare function fetchBiasContent(root: string, providerRel: string): Promise<{
|
|
73
|
+
text: string | null;
|
|
74
|
+
error: string | null;
|
|
75
|
+
}>;
|
|
76
|
+
/** 唤起消息(四段式:轨迹焦点[CCC 定义,稳定] / 身份锚定 / 先验偏见[自生动机+偏见内容] / 任务)——注入前台会话,用户可见 */
|
|
77
|
+
export declare function buildWakeMessage(opts: {
|
|
78
|
+
sessionName: string;
|
|
79
|
+
mdPath: string;
|
|
80
|
+
intervalHours: number;
|
|
81
|
+
topPrompt: string | null;
|
|
82
|
+
motivation: string | null;
|
|
83
|
+
biasContent: string | null;
|
|
84
|
+
}): string;
|
|
85
|
+
/**
|
|
86
|
+
* 执行一次唤起(时钟 tick 与面板「立即唤起」共用):
|
|
87
|
+
* - force=false(时钟):完整校验——enabled / 目标命中 / --auto 标志 / 窗口 / 间隔 / 偏见脚本
|
|
88
|
+
* - force=true(手动调试,用户在场):跳过窗口与间隔,仍校验 enabled / 目标命中 / --auto / 偏见脚本
|
|
89
|
+
* 成功 → 注入前台会话(agent.steer,用户可见);返回结果供调用方(tick 打日志 / 面板显示)。
|
|
90
|
+
*/
|
|
91
|
+
export interface WakeResult {
|
|
92
|
+
ok: boolean;
|
|
93
|
+
detail: string;
|
|
94
|
+
}
|
|
95
|
+
export declare function performAutoTrajectoryWake(ctx: Context, root: string, settings: AutoTrajectorySettings, opts?: {
|
|
96
|
+
force?: boolean;
|
|
97
|
+
}): Promise<WakeResult>;
|
|
98
|
+
/**
|
|
99
|
+
* 装配(index.ts apply 调用)。时钟唤起(v1.26.14 修复——用户"手动唤起正常,时钟唤起不工作"):
|
|
100
|
+
*
|
|
101
|
+
* 根因:旧实现启动时一次性 `resolveAutoTrajectoryRoot(ctx)`——web 进程启动时 live 会话
|
|
102
|
+
* 往往为空(用户尚未打开实验 CCC 会话)→ root=null → settings=null → **定时器根本不启动**;
|
|
103
|
+
* 手动唤起走 HTTP 端点(点击时重新解析 root)→ 正常。
|
|
104
|
+
*
|
|
105
|
+
* 修复:
|
|
106
|
+
* ① **动态解析**:每次 tick 重新解析 root + settings(不绑定启动时值)——live 会话变化即跟上;
|
|
107
|
+
* ② **事件驱动启动**:监听 `session/created`(live 会话出现)→ 启动定时器(进程启动时若
|
|
108
|
+
* 已有实验 CCC 会话则立即启动);
|
|
109
|
+
* ③ **优先实验 CCC**:resolveAutoTrajectoryCcc(配置了 autotrajectory 的 live CCC)优先于
|
|
110
|
+
* 进程 cwd/任一 live(多 CCC 同实例时时钟唤起绑定实验 CCC,而非当前维护会话 CCC)。
|
|
111
|
+
*
|
|
112
|
+
* 零资源占用语义保留:未配置/未启用 → tick 内直接 return(定时器存在但每 10min 一次空检查,
|
|
113
|
+
* unref 不阻塞进程退出)。
|
|
114
|
+
*/
|
|
115
|
+
export declare function registerAutoTrajectory(ctx: Context): void;
|
|
116
|
+
/**
|
|
117
|
+
* 面板状态(GET /serenity/autotrajectory 数据源;纯逻辑,可单测)——
|
|
118
|
+
* WebUI 设置面板「自主轨迹」只读区块展示的完整状态:配置摘要 + 目标会话
|
|
119
|
+
* 命中/标志/空闲时长 + 当前窗口/可唤起判定(唤起逻辑同 registerAutoTrajectory)。
|
|
120
|
+
* 不运行偏见脚本(只报脚本是否就绪——运行验证走 autotrajectory-exp random)。
|
|
121
|
+
*/
|
|
122
|
+
export interface AutoTrajectoryStatus {
|
|
123
|
+
/** 是否配置了 autotrajectory 段(.opencode/serenity.json) */
|
|
124
|
+
configured: boolean;
|
|
125
|
+
/** 总开关(缺省 false——未开零资源占用) */
|
|
126
|
+
enabled: boolean;
|
|
127
|
+
/** 无人类活动 N 小时后自动唤起(缺省 12) */
|
|
128
|
+
intervalHours: number;
|
|
129
|
+
/** 偏见内容提供者脚本(相对 CCC 根;缺省 autotrajectory-bias.ts) */
|
|
130
|
+
biasProvider: string;
|
|
131
|
+
/** 顶层提示词(v1.26.17:每次唤起最先注入的稳定指令;未配置 → null) */
|
|
132
|
+
topPrompt: string | null;
|
|
133
|
+
/** 目标会话(S###/目录名;未配置 = 不唤起) */
|
|
134
|
+
session: string | null;
|
|
135
|
+
/** 避开唤起的高峰时段(北京时间) */
|
|
136
|
+
avoidWakeHours: {
|
|
137
|
+
start: number;
|
|
138
|
+
end: number;
|
|
139
|
+
};
|
|
140
|
+
/** 目标会话状态(未配置/未命中 → null) */
|
|
141
|
+
target: {
|
|
142
|
+
/** 目录名(含 --auto 后缀时为自主形态) */
|
|
143
|
+
dirName: string;
|
|
144
|
+
/** 目录名是否带 --auto 标志 */
|
|
145
|
+
autoFlag: boolean;
|
|
146
|
+
/** 距上次轨迹活动(小时) */
|
|
147
|
+
idleHours: number;
|
|
148
|
+
/** 当前时刻是否满足唤起条件(标志+间隔+窗口,未运行中) */
|
|
149
|
+
wakeable: boolean;
|
|
150
|
+
} | null;
|
|
151
|
+
/** 当前北京时间小时 */
|
|
152
|
+
beijingHour: number;
|
|
153
|
+
/** 当前是否在唤起窗口内(避开高峰之外) */
|
|
154
|
+
windowAllowed: boolean;
|
|
155
|
+
}
|
|
156
|
+
export declare function getAutoTrajectoryStatus(root: string): AutoTrajectoryStatus;
|
|
157
|
+
/** live 会话条目(诊断/面板解析用;标题从 events 读) */
|
|
158
|
+
export interface LiveSessionEntry {
|
|
159
|
+
id: string;
|
|
160
|
+
cwd: string | null;
|
|
161
|
+
cccRoot: string | null;
|
|
162
|
+
title: string | null;
|
|
163
|
+
}
|
|
164
|
+
/** 遍历 live 会话(sessions.list())+ 补标题(events session/title latest-wins)+ ccc 归属 */
|
|
165
|
+
export declare function listLiveSessions(ctx: Context): LiveSessionEntry[];
|
|
166
|
+
/**
|
|
167
|
+
* 面板解析:GET /serenity/autotrajectory 无 workspace 参数时——
|
|
168
|
+
* **优先「配置了 autotrajectory 的 live CCC」**(用户实验状态所在;v1.26.14 修复:
|
|
169
|
+
* 原 resolveWorkspace 解析到第一个 live 会话(如 home-serenity)→ 面板显示"未配置",
|
|
170
|
+
* 用户实验 CCC(pangu)检测不到)。优先级:已启用 → 已配置(未启用)→ null。
|
|
171
|
+
*/
|
|
172
|
+
export declare function resolveAutoTrajectoryCcc(ctx: Context): string | null;
|
|
173
|
+
/**
|
|
174
|
+
* 进程内诊断(autotrajectory-exp diag-live 数据源;用户"排查访问不到 pangu 写个 msm")——
|
|
175
|
+
* 输出当前实例 live 会话清单(id/cwd/ccc/标题)+ 每个配置了 autotrajectory 的 CCC
|
|
176
|
+
* 状态(配置摘要/目标命中/可唤起)+ 目标 agent 定位结果。脚本 diag 看不到运行时,
|
|
177
|
+
* 本函数在插件进程内运行(能读 sessions/agents)。
|
|
178
|
+
*/
|
|
179
|
+
export interface DiagLiveReport {
|
|
180
|
+
processCwd: string;
|
|
181
|
+
processCcc: string | null;
|
|
182
|
+
liveSessions: LiveSessionEntry[];
|
|
183
|
+
autotrajectoryCccs: Array<{
|
|
184
|
+
root: string;
|
|
185
|
+
enabled: boolean;
|
|
186
|
+
session: string | null;
|
|
187
|
+
target: AutoTrajectoryStatus['target'];
|
|
188
|
+
agentResolved: boolean;
|
|
189
|
+
agentDiagnosis: string | null;
|
|
190
|
+
}>;
|
|
191
|
+
panelResolved: string | null;
|
|
192
|
+
}
|
|
193
|
+
export declare function diagLive(ctx: Context): DiagLiveReport;
|