@shgroup/dsh-serenity-hooks 1.71.0 → 1.73.0

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.
Files changed (44) hide show
  1. package/dsh.plugin.json +2 -2
  2. package/lib/{ccc-Dkoa2oW3.js → ccc-CZUOq3NY.js} +1 -1
  3. package/lib/{ccc-roots-jZYR2GVE.js → ccc-roots-BhoA7G-0.js} +3 -3
  4. package/lib/client.js +50 -58
  5. package/lib/{wake/cro.d.ts → cro/core.d.ts} +2 -2
  6. package/lib/{wake/cro-guide.d.ts → cro/guide.d.ts} +3 -3
  7. package/lib/{wake/cro-log.d.ts → cro/log.d.ts} +2 -2
  8. package/lib/{wake/cro-turns.d.ts → cro/turns.d.ts} +2 -2
  9. package/lib/guard/seam.d.ts +1 -1
  10. package/lib/{ilink-DEpmE3yi.js → ilink-BMk2w2KY.js} +1 -1
  11. package/lib/im/accounts.d.ts +105 -0
  12. package/lib/im/bridge.d.ts +33 -62
  13. package/lib/im/endpoint.d.ts +1 -1
  14. package/lib/im/feishu-account.d.ts +92 -0
  15. package/lib/im/inbound-event.d.ts +162 -0
  16. package/lib/im/route.d.ts +37 -2
  17. package/lib/im/weixin-account.d.ts +45 -0
  18. package/lib/index.d.ts +0 -22
  19. package/lib/index.js +1070 -996
  20. package/lib/kernel/ccc.d.ts +78 -2
  21. package/lib/kernel/ports.d.ts +2 -4
  22. package/lib/lib-TxscFKeo.js +119355 -0
  23. package/lib/{message-source-kVoNK0C5.js → message-source-ChyVfev9.js} +2 -2
  24. package/lib/{profile-DyMJ_bfr.js → profile-BIQ2widI.js} +14 -11
  25. package/lib/rolldown-runtime-B4iAMlE-.js +35 -0
  26. package/lib/{route-CPneN5iv.js → route-ItCgAsnz.js} +96 -35
  27. package/lib/seams/guards.d.ts +1 -1
  28. package/lib/seams/system-prompt.d.ts +3 -1
  29. package/lib/{settings-lt1i3OZv.js → settings-UcwIPJhM.js} +13 -62
  30. package/lib/skills/resource-index.d.ts +1 -1
  31. package/lib/surface/settings.d.ts +0 -6
  32. package/lib/surface/text.d.ts +72 -0
  33. package/lib/surface/usage.d.ts +2 -2
  34. package/lib/{role/worker/idle.d.ts → trajectory/carrier.d.ts} +12 -2
  35. package/lib/{role/worker → trajectory/delegate}/core.d.ts +7 -1
  36. package/lib/{role/worker → trajectory/delegate}/preset.d.ts +9 -2
  37. package/lib/{role/skiff → trajectory/policy}/profile.d.ts +9 -2
  38. package/lib/{role/skiff/config.d.ts → trajectory/policy/rules.d.ts} +9 -3
  39. package/lib/{role/skiff/registry.d.ts → trajectory/policy/window.d.ts} +7 -1
  40. package/lib/trajectory/prompt.d.ts +101 -0
  41. package/lib/{role/skiff/core.d.ts → trajectory/session.d.ts} +13 -4
  42. package/package.json +3 -2
  43. package/lib/role/skiff/debug.d.ts +0 -88
  44. package/lib/rolldown-runtime-8H4AJuhK.js +0 -14
@@ -1,5 +1,5 @@
1
1
  /**
2
- * role/skiff/profile.ts — **skiff 的唯一判据**:目录下有 `skiff.json` 的认知轨迹(零 DSH 依赖,可独立单测)
2
+ * trajectory/policy/profile.ts — **skiff 的唯一判据**:目录下有 `skiff.json` 的认知轨迹(零 DSH 依赖,可独立单测)
3
3
  *
4
4
  * ## 🔴 owner 2026-10-19 重做令(逐字,本文件存在的全部理由)
5
5
  *
@@ -23,6 +23,13 @@
23
23
  * **机制在 ACC**(文件叫什么、怎么读、怎么判、缺省值、如何施加约束);
24
24
  * **内容在 CCC**(`skiff.json` 里填什么:模型、白名单、提示词路径)。
25
25
  * ⇒ ACC 代码里**不出现任何具体角色名**,也不读 `serenity.json` 的 skiff 段(该段已退役)。
26
+ *
27
+ * ## S12(2026-10-19,轨迹中心重构):此前位于 `role/skiff/` 下(该目录已随本重构消失)
28
+ *
29
+ * 落点 = `trajectory/policy/`。判据(判读表 §3.1):本文件判的是**某条轨迹的约束面**,
30
+ * 主语是轨迹 ⇒ 它一直就是轨迹切面,只是旧目录把它挂在"角色"这个**平行概念**下。
31
+ * ⚠️ **文件名 `profile` 与 `skiff.json` / `SkiffProfile` 等符号名一律不动**:
32
+ * 那是有具体指称的东西(一个固定文件名 + 它的解析结果),不是组织单位。
26
33
  */
27
34
  /** `skiff.json` 的固定文件名(**判据就是它存在**——不是目录名前缀,也不是配置里的一行) */
28
35
  export declare const SKIFF_PROFILE_FILENAME = "skiff.json";
@@ -95,7 +102,7 @@ export declare function findDirNameByCode(root: string, code: string): string |
95
102
  *
96
103
  * ## 为什么"绑定的轨迹"从两个来源取(R↓,一个失败模式)
97
104
  * ① **持久绑定**(`readLastBound`,宿主存储域/`.bindings.json`)—— 权威,跨重启成立;
98
- * ② **内存注册表**(`skiff/registry`)—— 覆盖绑定的**窗口期**(轨迹刚定、bound 还没落盘)。
105
+ * ② **内存注册表**(`trajectory/policy/window`)—— 覆盖绑定的**窗口期**(轨迹刚定、bound 还没落盘)。
99
106
  * ⇒ 只取 ① 会在建会话的第一轮判成"不是 skiff"(工具面不收窄,模型看见不该有的工具);
100
107
  * 只取 ② 会在进程重启后全判成"不是"(skiff 失去约束,**权限面静默放开**)。
101
108
  * ⇒ **两来源并取**,都不中才 `null`。
@@ -1,16 +1,22 @@
1
1
  /**
2
- * role/skiff/config.ts — skiff 约束面的**纯逻辑助手**(零 DSH 依赖,可独立单测)
2
+ * trajectory/policy/rules.ts — 轨迹约束面的**纯逻辑助手**(零 DSH 依赖,可独立单测)
3
3
  *
4
4
  * ## 2026-10-19 重做后的职责边界(R↓,别再混起来)
5
5
  *
6
6
  * | 模块 | 管什么 |
7
7
  * |---|---|
8
8
  * | `./profile.ts` | **判据 + 读盘**("这是不是 skiff"、"约束面是什么") |
9
- * | `./config.ts`(本文件) | **从约束面派生出的纯函数**(白名单集合、提示词读取器、基础提示词文本) |
10
- * | `./core.ts` | 会话创建/复用、提问、守门查询 |
9
+ * | `./rules.ts`(本文件) | **从约束面派生出的纯函数**(白名单集合、提示词读取器、基础提示词文本) |
10
+ * | `../session-create.ts` | 会话创建/复用、提问、守门查询 |
11
11
  *
12
12
  * ⇒ 本文件**不再读 `serenity.json`**:`skiff.roles` 整段已退役(owner 2026-10-19 重做)。
13
13
  * 它只接收一个已解析好的 `SkiffProfile`,因此**不涉及任何 IO**(除提示词文件,那是刻意懒读的)。
14
+ *
15
+ * ## S12(2026-10-19,轨迹中心重构)
16
+ *
17
+ * 原名 `role/skiff/config.ts`。改名理由(框架 §6.3「角色不是一个概念,是一段历史」):
18
+ * 它派生的是**某条轨迹的约束面**,与"配置读取"无关(本文件零配置读取,见上一段)
19
+ * ⇒ `config` 这个名字描述的是**它曾经的样子**,`rules` 描述它**现在做的事**。
14
20
  */
15
21
  import type { SkiffProfile } from './profile.js';
16
22
  /** 白名单推导 ────────────────────────────────────────────────────────────── */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * role/skiff/registry.ts — skiff 会话注册表(sessionId → {trajectory, ccc};零 DSH 依赖)
2
+ * trajectory/policy/window.ts — 会话 → 轨迹 的内存映射(零 DSH 依赖)
3
3
  *
4
4
  * ## 它现在只做一件事:**把「会话」映到「轨迹」**
5
5
  *
@@ -8,6 +8,12 @@
8
8
  * ⇒ 本表退化为一张**会话 → 轨迹目录名**的内存映射,供**同步**热路径(guards / system-prompt)查询;
9
9
  * 权威来源仍是持久绑定(`trajectory/bound.ts` 的 `readLastBound`)。
10
10
  *
11
+ * ## S12(2026-10-19,轨迹中心重构):原名 `role/skiff/registry.ts`
12
+ *
13
+ * 改名理由:它**不是**一张"注册表"(注册表的语义是权威名单),它是**权威来源之外的一个窗口**——
14
+ * 覆盖「轨迹已定、绑定还没落盘」那一段(见下方「为什么还需要这张内存表」)。
15
+ * `registry` 这个名字会让下一个人以为它是权威,而权威在 `bound.ts` ⇒ 改叫 `window`。
16
+ *
11
17
  * ## 为什么还需要这张内存表(R↓,一个窗口期)
12
18
  *
13
19
  * 持久绑定是**异步落盘**的(宿主存储域写入)。会话刚建立、`skiff.json` 已生效、绑定的记录
@@ -0,0 +1,101 @@
1
+ /**
2
+ * trajectory/prompt.ts — **轨迹提示词**(Trajectory Prompt):一条轨迹"是谁、按什么章程工作"
3
+ *
4
+ * ## 概念(owner 2026-10-19 定向,逐字)
5
+ *
6
+ * > 「参考会话的系统提示词,我们建立**轨迹提示词**概念来代替人格。架构上会好很多」
7
+ *
8
+ * **轨迹提示词** = 一条认知轨迹的**可编辑章程声明**,由 ACC 按固定顺序装配进系统提示词。
9
+ * 三个关键词各是一条判据:
10
+ * - **可编辑**:住在 CCC(盘上),改它**不发版**(D23 归属判据的直接推论)
11
+ * - **声明**:它声明**身份/章程/方法论**,**不声明能力**(能力面归 `skiff.json` 白名单与工具 schema)
12
+ * - **固定顺序**:装配顺序由 ACC 定死(见 `seams/system-prompt.ts` 的 ⑧ 位)
13
+ *
14
+ * ## 为什么取代「人格」
15
+ *
16
+ * 「人格」把身份绑在"像不像一个人"上 ⇒ 因为叫人格,它被设计成**可以整体替换**
17
+ * (`persona` 置换 EAP 块,即 review F-05/R-14 那个悬置冲突)。而身份与章程**不该被替换,
18
+ * 只该被特化**。⇒ 本模块把"替换"改成"叠加":容器层与质量层永远保留,轨迹提示词只往上加。
19
+ *
20
+ * ## 落点(为什么在轨迹目录里)
21
+ *
22
+ * `AGENT_SESSIONS/<轨迹目录>/PROMPT.md`
23
+ *
24
+ * - **跟着轨迹走**:`archive` 时整个目录搬走,章程不会掉队(旧形态 `.opencode/skiff/<name>.md`
25
+ * 与轨迹**分居两处** —— 多条轨迹共用一份文件正是那个后果)。
26
+ * - **每条轨迹都能有**:不只是 skiff。普通轨迹同样需要"我是谁、按什么章程"。
27
+ * - 与 `SESSION.md`(身体:延续/日志)、`skiff.json`(约束面:能力)三件并列,
28
+ * 各管一件事,不合并(合并会让"改能力"与"改身份"互相牵连)。
29
+ *
30
+ * ## 兼容(不静默坏)
31
+ *
32
+ * `PROMPT.md` 不存在时**不报错**(普通轨迹常态)。skiff 的旧字段 `systemPromptFile`
33
+ * 在兼容期仍被读取——优先级见 {@link resolveTrajectoryPrompt}。
34
+ */
35
+ import type { SkiffProfile } from './policy/profile.js';
36
+ /** 轨迹提示词的固定文件名(**判据就是它存在**——不是目录名前缀,也不是配置里的一行) */
37
+ export declare const TRAJECTORY_PROMPT_FILENAME = "PROMPT.md";
38
+ /** 一次解析的结果(`source` 说明正文**从哪来**,便于诊断与「为什么我改的不生效」) */
39
+ export interface TrajectoryPromptResolution {
40
+ /** 提示词正文(已 trim);无来源 ⇒ 空串 */
41
+ text: string;
42
+ /** 来源:轨迹目录的 PROMPT.md / skiff 旧字段 / 无 */
43
+ source: 'trajectory-file' | 'skiff-legacy' | 'none';
44
+ /** 实际读取的绝对路径(`none` ⇒ null) */
45
+ path: string | null;
46
+ }
47
+ /** 轨迹目录的 PROMPT.md 绝对路径(不论存在与否——调用方自己判存在性) */
48
+ export declare function trajectoryPromptPath(root: string, dirName: string): string;
49
+ /**
50
+ * 该轨迹**有没有**轨迹提示词(单一判据)。
51
+ *
52
+ * 用途:兼容期的"让位"判定 —— 若已有 `PROMPT.md`,skiff 旧字段 `systemPromptFile`
53
+ * 必须**让位**,否则同一份章程会在两处各注入一遍(第 ⑧ 段 + `serenity-skiff` 段)。
54
+ * 🔴 判据只有这一处:别在 skiff 那边自己拼路径再判(两处会漂)。
55
+ */
56
+ export declare function hasTrajectoryPrompt(root: string, dirName: string): boolean;
57
+ /**
58
+ * 解析一条轨迹的**轨迹提示词**(一次性读;`create` / 诊断 / 预览用)。
59
+ *
60
+ * 🔴 热路径**不要**用它(那会每次工具调用都读盘)——热路径用 {@link createTrajectoryPromptReader}。
61
+ *
62
+ * 优先级(**确定性,只有这一条**):
63
+ * ① `<轨迹目录>/PROMPT.md` —— 新形态,**所有轨迹**都能有
64
+ * ② skiff 的 `systemPromptFile` —— **兼容期**旧形态(存量 CCC 不必同批迁移)
65
+ * ③ 无 ⇒ 空串(**不是错误**:没有章程的轨迹是常态)
66
+ *
67
+ * ⚠️ 读失败(权限/坏文件)⇒ 空串而不是抛错:提示词读不到不该阻断会话创建;
68
+ * 但**会告警**(见 reader 版本),不静默。
69
+ */
70
+ export declare function resolveTrajectoryPrompt(root: string, dirName: string, legacyProfile?: SkiffProfile | null): TrajectoryPromptResolution;
71
+ /**
72
+ * 轨迹提示词的**读取器**(长期热更新;改文件即生效,无需重启)。
73
+ *
74
+ * ## 为什么返回函数而不是字符串(R↓,实证代价)
75
+ *
76
+ * 旧实现把提示词**快照**进系统提示词段的闭包 ⇒ CCC 改了文件必须重启 dsh web 才生效
77
+ * (实测:改完 18KB 提示词,live agent 仍用旧文本)。现形态由系统提示词段的 `text()`
78
+ * **每轮调用**本读取器:按 **mtime + size** 缓存重读(命中缓存零 IO)。
79
+ *
80
+ * ## 三条失败语义(各治一个失败模式)
81
+ *
82
+ * - **文件不存在** ⇒ 返回空串(**不是错误**:普通轨迹没有章程是常态,且删掉即失效
83
+ * 必须是立即可见的——这就是"删掉 PROMPT.md 即恢复默认"的机制)
84
+ * - **读取失败** ⇒ 返回**上次成功内容**(⛔ 绝不返回空:空提示词会让轨迹失去章程),
85
+ * 并按去重标签告警一次
86
+ * - **首次就读不到** ⇒ 空串 + 告警一次(区分"本来没有"与"有但读不了")
87
+ *
88
+ * @param root CCC 根
89
+ * @param dirName 轨迹目录名(**不是编码**:目录名才是落盘位置)
90
+ */
91
+ export declare function createTrajectoryPromptReader(root: string, dirName: string): () => string;
92
+ /**
93
+ * 装配用的**提示词段**(幂等:无内容 ⇒ 空串,宿主会丢弃空 section/空块)。
94
+ *
95
+ * 标记头 `=== Serenity Trajectory Prompt ===`:
96
+ * ① 让模型知道"下面是**这条轨迹自己的章程**",不是容器规则;
97
+ * ② 让诊断可以按块名 grep。
98
+ *
99
+ * 🔴 这段**追加**在容器层与质量层之后,**永不替换它们**——那正是本概念相对「人格」的核心修正。
100
+ */
101
+ export declare function trajectoryPromptBlock(text: string): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * role/skiff/core.ts — skiff 会话核心(**2026-10-19 重做**:skiff = 带 `skiff.json` 的认知轨迹)
2
+ * trajectory/session.ts — 轨迹的**会话(载体)管理**(**2026-10-19 重做**:skiff = 带 `skiff.json` 的认知轨迹)
3
3
  *
4
- * ## 与旧版的根本差别(R↓,这是本次重做的全部内容)
4
+ * ## 与旧版的根本差别(R↓,这是那次重做的全部内容)
5
5
  *
6
6
  * 旧版:skiff 是**一个角色**(`serenity.json` 的 `skiff.roles.<name>`),会话身份由
7
7
  * dsh sessionId 前缀 `skiff-` 判定,工作台由 `ensureSkiffSession` **另建一个 SESSION**。
@@ -9,7 +9,7 @@
9
9
  * 新版:skiff 是**一条认知轨迹**(目录里有 `skiff.json`)——
10
10
  * · **身份 = 轨迹编码**(不是角色名,不是 sessionId 前缀);
11
11
  * · **工作台 = 该轨迹自己的 SESSION.md**(不再另建,`ensureSkiffSession` 已删除);
12
- * · **判据 = 绑定的轨迹有没有 `skiff.json`**(唯一入口 `profile.ts` 的 `skiffProfileForSession`)。
12
+ * · **判据 = 绑定的轨迹有没有 `skiff.json`**(唯一入口 `policy/profile.ts` 的 `skiffProfileForSession`)。
13
13
  *
14
14
  * ⇒ 删掉的东西(它们只是旧模型的补丁,不是通用机制):
15
15
  * `SKIFF_SESSION_PREFIX` 判定 / `ensureSkiffSession` 自动建工作台 /
@@ -17,10 +17,19 @@
17
17
  *
18
18
  * ## 本文件仍负责
19
19
  * agent 创建/复用(resume-or-create)/系统提示词段注册/提问与等本轮回答/守门查询。
20
+ *
21
+ * ## S13(2026-10-19,轨迹中心重构):此前位于 `role/skiff/` 下(该目录已随本重构消失)
22
+ *
23
+ * 文件名从 `core` 改为 `session`:它管的是**轨迹的会话(载体)**——
24
+ * 与同目录 `live.ts`(活载体查询)/`rebuild.ts`(换船板)/`cleanup.ts`(清理)同族。
25
+ * `core` 描述的是"它在角色目录里居中",而那层含义随目录一起消失了。
26
+ *
27
+ * 🔴 **不拆**(S13 判据):26 KB 未过 30 KB 阈值 ⇒ 按计划 R-d 的候选 ②,
28
+ * 本期是**零语义改动**,拆函数体属另一件事。
20
29
  */
21
30
  import type { Context } from 'cordis';
22
31
  import type { Agent, AgentHandle } from '@deepseek-ai/dsh-agent';
23
- import { type SkiffProfile } from './profile.js';
32
+ import { type SkiffProfile } from './policy/profile.js';
24
33
  export type { SkiffProfile };
25
34
  /** 查 sessionId 承载的轨迹目录名(无 → null) */
26
35
  export declare function skiffTrajectoryDirNameFor(sessionId: string): string | null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shgroup/dsh-serenity-hooks",
3
- "version": "1.71.0",
4
- "description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/cheap-worker/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/微信桥/认知轨迹唤醒注册表。skiff = 目录下有 skiff.json 的认知轨迹(约束面住在轨迹里)。适配 DSH 0.1.7-rc.1 / 0.2.0-rc.1 / 0.2.1-rc.1(三档)。",
3
+ "version": "1.73.0",
4
+ "description": "宁静号 ACC harness(Native Cordis 插件)——给 DeepSeek Harness 装一个「AI 工作区」:14 个工具(container_fs/cognitive_trajectory/dashboard/container_git/msm/praxis/ontology/serenity-skill-creator/cheap-worker/localstore/container_admin;另三个 im-bridge/acc-diag/diagram 按配置条件出现)+ 机械约束(安全模式/工作区围墙/密钥守卫/对外输出守卫)+ 认知轨迹日志与原地重建 + 网页登录入口/微信桥/认知轨迹唤醒注册表。skiff = 目录下有 skiff.json 的认知轨迹(约束面住在轨迹里);轨迹提示词 = 轨迹目录下的 PROMPT.md(一条轨迹「是谁、按什么章程工作」,所有轨迹通用,追加在容器层与质量层之后,不替换它们)。适配 DSH 0.1.7-rc.1 / 0.2.0-rc.1 / 0.2.1-rc.1(三档)。",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -150,6 +150,7 @@
150
150
  "@deepseek-ai/dsh-web-fetch-http": "0.1.7-rc.1",
151
151
  "@deepseek-ai/dsh-workspace": "0.1.7-rc.1",
152
152
  "@deepseek-ai/schemastery": "^3.18.4",
153
+ "@larksuiteoapi/node-sdk": "^1.76.0",
153
154
  "@types/node": "^20.0.0",
154
155
  "@types/qrcode-generator": "^1.0.6",
155
156
  "@types/react": "^18.2.0",
@@ -1,88 +0,0 @@
1
- /**
2
- * role/skiff/debug.ts — Skiff 调试问答页(F4a',v1.25.x 实验性)
3
- *
4
- * node:http 调试端口(默认关,仅监听 127.0.0.1;启停 = 人工——设置面板「Serenity」
5
- * 页 Skiff 区块开关,不随插件加载自动启动)。
6
- *
7
- * - GET / → 问答 HTML 页(**CCC 选择器** + 角色下拉 + 输入框 + 答案区 + 轨迹区 + WebUI 链接)
8
- * - POST /ask → {ccc?, role, question} → 走会话核心(skiff-core)→ {answer, sessionId, cognitiveTrajectory}
9
- *
10
- * **多 CCC 手工切换(v1.25.4,S142 用户)**:dsh 管理多个 CCC 时,调试页顶部 CCC
11
- * 下拉列出全部候选(live 会话 cwd 上溯 .serenity 去重 + 默认绑定 root 兜底),
12
- * 切换后角色下拉联动(各 CCC 的 skiff.roles 实时读取),提问按所选 CCC 创建 agent。
13
- *
14
- * 与 skiff 会话核心(createSkiffAgent + askSkiff)直接共用同一实现;
15
- * (原「与 ACP stdio 协议(F4c 后续)共用同一会话核心」一句已随面 E 退役删除,2026-10-15)
16
- * 轨迹 = session.events 结构化返回(与 dsh WebUI 同源数据),
17
- * 页面 JS 渲染成对话时间线;同时保留原生 WebUI 会话链接供完整交互。
18
- *
19
- * 实验性质:未开启时零资源占用(无监听、无 agent 创建)。
20
- */
21
- import type { Context } from 'cordis';
22
- import { type CccEntry } from '../../kernel/ccc-roots.js';
23
- import { type FaceSpec } from '../../surface/faces.js';
24
- export declare function skiffDebugActive(): boolean;
25
- export declare function skiffDebugPort(): number | null;
26
- /**
27
- * 候选 CCC 条目(调试页 CCC 切换器数据)。
28
- *
29
- * C2:定义已迁至 `kernel/ccc-roots.ts`(L2 枚举的唯一真相源)——此处只在**类型层**转出
30
- * (零运行时重导出,避免把 `ccc-roots` 拉进本模块的运行时静态链)。
31
- */
32
- export type { CccEntry };
33
- /** 问答页 HTML:CCC 切换器 + 角色下拉 + 输入 + 答案区 + 轨迹区(JS 渲染)+ WebUI 链接 */
34
- export declare function skiffDebugPage(cccs: CccEntry[], defaultRoot: string, webPort: number): string;
35
- /**
36
- * JSC (Safari/iOS) JSON.parse 快速路径正则兼容化(v1.26.9,S142 调研定稿)。
37
- *
38
- * 背景:WebKit bug 200190「JavaScriptCore's Regex can't match the content」——JSC 的
39
- * JSON.parse 用**内部正则**预校验字符串;内容含**原始** `\u2028`(行分隔符)/`\u2029`
40
- * (段分隔符)时正则无法匹配 → 对**合法 JSON** 也抛
41
- * `SyntaxError: The string did not match the expected pattern`(sentry-javascript #2487 同源)。
42
- * JSON.stringify **不转义** `\u2028`/`\u2029`/`\uFEFF`(它们都是合法 JSON 字符串字符)→
43
- * 在 JSON **文本层**把它们替换为 `\uXXXX` 转义序列:JSON.parse 后语义完全一致(还原原字符),
44
- * 且 JSC 正则看到的是常规 ASCII 转义(与 JSON.stringify 对控制字符的输出同形态,安全)。
45
- *
46
- * 3099 调试页客户端 `await res.json()` 与页面内嵌 JSON 均需此兼容层
47
- * ——iOS Safari 用户实测"复杂回答"触发。(原同批还列了 3100 问答页,该面已退役,2026-10-15)
48
- *
49
- * @param jsonText JSON.stringify 的输出文本;原地等价替换,返回 JSC 安全文本
50
- */
51
- export declare function jscSafeJsonText(jsonText: string): string;
52
- /**
53
- * Markdown 渲染(v1.25.9,正经库 marked 服务端渲染——替代手写正则渲染器,S142 用户要求):
54
- * ① 提取 `<think>…</think>` 块(v1.26.8 状态机扫描,占位符 \u0001T<idx>\u0001)
55
- * ② 正文与 think 内容**先 escapeHtml 再 marked.parse**(GFM + breaks)——markdown 语法不受
56
- * 转义影响,原始 HTML 注入被消除(安全);代码块内 `<` 显示为实体(可接受)
57
- * ③ think 占位符:默认还原为 `<details class="think">` 折叠卡(🧠 思考过程,默认收起);
58
- * **hideThink=true(v1.26.4,public 口)→ 直接移除**(思考过程对普通用户不展示)
59
- * @param hideThink 为 true 时 `<think>` 内容完全不渲染(public 问答页体验)
60
- */
61
- export declare function renderSkiffMarkdown(raw: string, hideThink?: boolean): string;
62
- /**
63
- * 剥离 `<think>…</think>` 块(v1.27.1,微信桥用户反馈:"过微信桥回复给用户的消息,
64
- * 要去掉 think 标签,用户不应看到")。复用 extractThinkBlocks 状态机(v1.26.8,
65
- * 弃正则)——提取后**只保留正文**(占位符替换为空,think 内容丢弃),
66
- * 未闭合 think 优雅截断。适用于纯文本输出面(微信等不支持 think 折叠的通道)。
67
- */
68
- export declare function stripThink(raw: string): string;
69
- /**
70
- * 本面的规格(C4 块 A/④:**只提供** name/port/host/enabled/handler)。
71
- * 路由/鉴权/HTML 全部仍归本模块的 {@link handle}(面宿主不介入面语义)。
72
- */
73
- export declare function skiffDebugSpec(ctx: Context, root: string, port: number, webPort: number): FaceSpec;
74
- /**
75
- * 启动调试问答服务(单实例;重复启动幂等返回既有实例)。
76
- *
77
- * **CCC 绑定(v1.25.2 用户指出)**:服务绑定一个默认 CCC root(调用方 resolveSkiffRoot
78
- * 解析:live 会话中**含 skiff.roles 的 CCC 优先**);v1.25.4 起页面可**手工切换**到
79
- * 其它候选 CCC(live 会话发现的全部 CCC);角色配置**每次请求实时读取**(不缓存快照)。
80
- *
81
- * C4 块 A:listener 的创建/监听/错误/端口占用/关闭归 `face-host`(本函数只提供规格 + 记日志)。
82
- *
83
- * @param root 默认绑定的 CCC 根(首次加载选中;角色配置读取 + skiff agent cwd)
84
- * @param port 调试端口(仅 127.0.0.1)
85
- * @param webPort 主 WebUI 端口(WebUI 链接)
86
- */
87
- export declare function startSkiffDebugServer(ctx: Context, root: string, port: number, webPort: number): Promise<void>;
88
- export declare function stopSkiffDebugServer(): void;
@@ -1,14 +0,0 @@
1
- import "node:module";
2
- //#region \0rolldown/runtime.js
3
- var __defProp = Object.defineProperty;
4
- var __exportAll = (all, no_symbols) => {
5
- let target = {};
6
- for (var name in all) __defProp(target, name, {
7
- get: all[name],
8
- enumerable: true
9
- });
10
- if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
11
- return target;
12
- };
13
- //#endregion
14
- export { __exportAll as t };