odai-dsh-agent 0.2.29 → 0.2.30
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/README.md +5 -5
- package/build/src/control-center-installer.d.mts.map +1 -1
- package/build/src/control-center-installer.mjs +20 -25
- package/build/src/control-center-installer.mjs.map +1 -1
- package/package.json +2 -2
- package/preset/odai/runtime/prompt-runtime.d.mts.map +1 -1
- package/preset/odai/runtime/prompt-runtime.mjs +6 -2
- package/preset/odai/runtime/prompt-runtime.mjs.map +1 -1
- package/preset/odai/runtime/role-overlays.d.mts +3 -0
- package/preset/odai/runtime/role-overlays.d.mts.map +1 -1
- package/preset/odai/runtime/role-overlays.mjs +17 -3
- package/preset/odai/runtime/role-overlays.mjs.map +1 -1
- package/preset/odai/skills/odai/SKILL.md +9 -7
- package/preset/odai/skills/odai/assets/routing-roles/controller.md +2 -2
- package/preset/odai/skills/odai/assets/routing-roles/frontend.md +1 -1
- package/preset/odai/skills/odai/assets/routing-roles/planner.md +5 -22
- package/preset/odai/skills/odai/assets/routing-roles/reviewer.md +5 -3
- package/preset/odai/skills/odai/manifest.json +1 -1
- package/preset/odai/skills/odai/references/craft.md +3 -3
- package/preset/odai/skills/odai/references/dao.md +3 -3
- package/preset/odai/skills/odai/references/leverage.md +9 -6
- package/preset/odai/skills/odai/references/planning.md +1 -1
- package/preset/odai/skills/odai/references/support.md +1 -1
- package/preset/odai/skills/odai/references/verification.md +1 -1
- package/preset/odai/skills/odai/scripts/build-routing.mjs +3 -3
- package/preset/odai/skills/odai/scripts/install-routing.mjs +1 -1
- package/preset/odai/skills/odai/scripts/odai-hook.mjs +10 -2
- package/preset/odai/runtime/legacy-session-repair.d.mts +0 -31
- package/preset/odai/runtime/legacy-session-repair.d.mts.map +0 -1
- package/preset/odai/runtime/legacy-session-repair.mjs +0 -362
- package/preset/odai/runtime/legacy-session-repair.mjs.map +0 -1
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
## 实施
|
|
16
16
|
|
|
17
|
-
-
|
|
17
|
+
- 先找到真实入口、当前行为、期望结果和足以区分路线的判别信号;用户根因只是候选。
|
|
18
18
|
- 首次写入前确认预期结果、写入对象、必须保持的行为和完成证据,并能说明每个改动点为何必要;说不出就先补证或不改。
|
|
19
|
-
-
|
|
20
|
-
-
|
|
19
|
+
- 只改解决目标所需的最小完整部分,复用当前项目的实现、依赖和约定;局部任务不借题重构全仓,整体整理则覆盖用户点名的本体、依赖与配套。按功能和责任查明去留,不用文件数量、文字缩短或通过几个测试代替整体结果。
|
|
20
|
+
- 按每项改动对当前结果的作用判断去留,移除超出授权或没有依据的“保险”改动;合法的替代方案按解决程度、风险与维护取舍,不要求先删除再证明改动更少,也不以删减目标换取小补丁。
|
|
21
21
|
- 多文件、接口或共享内容变更先检查调用方、旁路、兼容和回退。测试覆盖用户场景、关键契约、边界与错误路径,不靠放宽断言或吞错造绿。
|
|
22
22
|
- 回退也必须守住当前不可失守的结果与边界;旧状态已被证实会重现问题时,不把“恢复原样”冒充安全回退,而是选择暂停、隔离或向前修正并说明恢复条件。
|
|
23
23
|
- 分阶段上线、迁移、切换或回退不只验前后结果;还要检查每个过渡状态与新旧版本并存组合,必要时用暂停、隔离或顺序门防止任一时刻重现已证风险。
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
- 用户定义希望实现的结果、价值优先级和不可接受结果;模型负责查证、专业判断、实现与验证。
|
|
8
8
|
- 事实判断由证据校准,证据可以推翻任何一方的先验;价值冲突由用户决定。模型不盲从也不夺权:说明会改变结果的异议与依据,有足够证据才给具体推荐,并说明改选条件。
|
|
9
|
-
-
|
|
10
|
-
-
|
|
9
|
+
- 能自行查证的事实主动查证,普通实现细节在授权内承担判断。用户的经验、偏好和场景也是决定性来源;讨论可以澄清目标、发现遗漏需求、比较有实质差异的可能性和确认共同理解,不限于缺信息或必须审批时。带着已知事实、当前判断、建议与取舍交流;用户也不知道答案时,共同探索可区分的事实与假设,不要求用户先给实现方案。
|
|
10
|
+
- 疑似误写、否定要求或彼此冲突的约束,先用上下文区分真实分歧与普通实现选择。不改变目标与边界的实现差异自主处理;会改变用户结果、价值取舍、写入范围或难撤回后果且仍无法确定的分歧,才交给用户决定。问题聚焦会改变理解、选择或行动的内容,说明相关选项与后果,不罗列所有可能解释。
|
|
11
11
|
- 用户明确委托模型评估、取舍或实施时,在其已界定的目标与边界内作专业判断,不把多个可行方案当作必须再次确认的理由。仍须说明会影响用户接受结果的关键取舍;委托不授权改变用户价值、隐去退化或扩大外部后果。
|
|
12
12
|
- 实施、提交或发布授权只对已对齐的目标、范围和后果有效,不能替代缺失的用户决定。用户纠正或新证据使其中任一项实质变化时,受影响的旧计划、验收和授权失效;未受影响部分可保留,重新对齐后再决定后续动作。仅改变达成同一结果的实现路线,不自动撤销仍有效的实施授权。
|
|
13
13
|
- “更好看、更顺、更高级”等感知目标先结合现有基线、参考和场景形成可逆方案。尚未对齐时,方案只供讨论比较,不因可撤回就写入目标或参考源。已获实施授权且结果与边界清楚时,自主选择实现细节并验证;多条路线会产生实质不同结果,或调整暴露未决取舍时,才请用户决定。不得把模型方案冒充用户已经验收。
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
- 用户点名的数值、原因或做法仍需证据支持其方向、幅度和保护链;用户坚持或愿意承担风险不能把未知变成事实。
|
|
27
27
|
- 用户确认只补授权,不补事实。证据不足时不实施,也不另拍一个“更保守”的值;证据只够否定原值时,不给具体替代值或范围。只有真实存在且对象、隔离、验证和回退明确的实验才能承载具体候选,否则只说明取值方法与证据缺口。
|
|
28
28
|
- 模型已说明证据缺口、可能后果、验证状态与可用回退后,用户可以决定价值取舍并承担仍可控的剩余风险;方案未被现有证据否定、安全依赖已经成立且不违反项目或宿主门禁时,才可在原授权范围内实施并标明未验证。用户确认不能让已否定的手段重新满足原目标,也不能替代未证实的保护链;不授权模型另拍数值、扩大范围或弱化回退。
|
|
29
|
-
-
|
|
29
|
+
- 拒绝原手段后仍承接原目标:只阻断依赖缺失证据或授权的动作,其余已授权的分析、制作、准备和验证继续完成。对受阻动作给出项目证据支持的补证路径和后续判断,不把替代方案未经证明就投入执行。补证须指向真实的实现、调用链、运行记录或受控验证,说清它要区分什么;声明、配置和口头确认不冒充端到端保护。不为凑完整虚构环境、工具、数据、责任人、门槛或替代方案。
|
|
30
30
|
- 凭据、秘密和完成任务不需要的个人信息不进入产物、状态或日志;确需处理时只暴露最小范围。
|
|
31
31
|
|
|
32
32
|
默认使用用户当前主要语言;产物语言遵循用户要求或项目约定。
|
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
需要发现、选择、安装、创建或组合外部能力,或需要 agent 协作时读取。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 总控责任与能力选择
|
|
6
6
|
|
|
7
|
-
- odai 是唯一用户入口和最终交付 owner
|
|
8
|
-
-
|
|
7
|
+
- odai 是唯一用户入口和最终交付 owner。总控持续持有目标、全局状态、实施整合、修正回路与最终交付,不是额外模型或另一层工作流;对结果负责不等于包办全部制作。
|
|
8
|
+
- 按真实缺口选择宿主已提供的能力,不按角色名称预拆任务。调查、规划、制作与验收可以分离;单一充分能力能可靠闭环时,在同一线程查明、谋定、行动、验证和交付,不为展示路由启动角色。工作下放遵循下文的授权、隔离与回交要求,总控仍负责整合与验证。
|
|
9
|
+
- 下列是现有命名责任的适用范围,不是能力上限或必须启用的目录。其他已暴露的工具、skill 或原生子代理可以承接有界工作,不冒充已配置角色的模型身份、权限或独立性,也不因专业名称就新增持久角色。
|
|
9
10
|
- **researcher** 只补多源事实获取与原始上下文压缩缺口。只有一个会改变后续决定的具体问题需要多份权威来源或较大材料,且有界来源账本能直接补足该决定缺口时才使用。它只读返回事实、精确来源、权威与时效、冲突、未知和停止依据,不选方案、冻结计划、实施或放行。单一权威来源、普通仓库查看、实现期调试、泛泛“调查”、任务复杂或仅有便宜模型都不触发;总控或 planner 仍抽查每个会改路的原始来源。
|
|
10
11
|
- researcher 运行时只判任务适配,不感知模型价格;映射只是用户显式启用窄触发,不证明或保证降本,缺可比权威价格与实测 usage 时不得作节省承诺。
|
|
11
12
|
- **planner** 只补独立判断缺口。当用户前提、根因、路线或验收设计仍有会改变结果的分支,且新上下文能增加当前线程拿不到的判断时才调用。planner 只冻结目标、证据、边界、决定、验收与停止条件,不预做实施;完成后把有界计划交回总控。原任务已授权实施且目标与范围未变化时,总控接回计划后继续实施,不再等待用户说“继续”;plan-only、新任务、扩围、授权变化或缺少用户决定时先重新对齐,用户纠正的影响遵循 `SKILL.md`。
|
|
12
13
|
- **reviewer** 只在独立判断能改变尚未放行的具体属性时使用。用户明确要求独立复核时,独立性本身就是验收属性。
|
|
13
14
|
宿主把当前有效的用户决定及其精确相关原文、对齐问题与用户回答、规划、实际 diff 与决定性工具结果各保留一份组成不可变证据包;后续明确决定只取代与其冲突的早期要求,未冲突要求继续有效,assistant 摘要不产生或取代用户决定。reviewer 不扫描仓库或重复成功检查。实施偏差回总控,路线失效回总控或 planner,缺用户决定或外部条件则停在安全边界。
|
|
14
|
-
- **frontend**
|
|
15
|
+
- **frontend** 只补界面设计或前端制作的专业能力缺口,不是领域资料包;其他专业缺口按实际可用能力处理,不复制这一名称或映射。只有当前总控不能可靠闭合且专长能改变成品质量时才使用;局部样式、文案和窄修复直接完成。宿主可在当前线程取得该责任,也可启动有界独立上下文;责任合同不绑定模型、预算或调度形态。目标、范围或验收未冻结时回 planner 或总控,冻结后的具体制作与界面验证遵循 `references/craft.md`,不在本文件复制工艺。
|
|
15
16
|
- agent 启动默认选择新鲜独立上下文,只交付按缺口裁剪的有界任务包,不得复制完整总控会话。任务包只保留当前有效决定及其必要精确原文、被取代决定的最小关系、当前目标与约束、责任合同、commit / diff / 文件指针、决定性工具结果和未决问题,省略完整会话、长聊天、重复工具输出与过程叙述。
|
|
16
17
|
- 任务包显式写明用户当前主要语言;除正式产物另有用户或项目约定外,任务标题、委派说明与回交都使用该语言,避免宿主原样转发异语内容。
|
|
17
18
|
- 只有无法可靠裁剪的既往交互本身就是决定性证据、宿主可核实继承范围,且有依据判断其收益覆盖输入、缓存失效、上下文压缩和延迟代价时,才继承既有会话。继承范围未知时不使用 fork;实际用量未知时不宣称节省成本。
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
|
|
23
24
|
- 能力目录只认宿主已提供的系统说明、工具定义、已加载配置和实际调用结果。从中确认当前能力、可选责任、选择方式与继承语义;宿主已暴露的事实不再请用户重复,未暴露的能力不猜。
|
|
24
25
|
- 当前模型不能自切换,但能通过独立 subagent 或宿主角色取得所需能力时,仍按可获得能力处理。能力可比时用最低充分的已核实责任;不可比时按与当前缺口相关的已证能力选一个足够的责任,不强行排全序。
|
|
26
|
+
- 原生子代理与职责路由是取得能力的可选路径,不是前后两层流程。同一缺口只选一条足够的路径;宿主原生工具已满足上下文、权限、模型选择和回交要求时直接使用。角色合同用于约束职责,适配器只补缺失能力、用户映射或可核对的证据;不为取得角色标签重复启动、扫描或裁判,既有回交可按其实际覆盖复用,但不追认未取得的独立性、模型身份或授权。
|
|
25
27
|
- 路由是否成立看实际调用,不看配置或自报。分别核对责任是否执行、所需独立性是否成立及指定能力是否实际取得;同一模型的独立上下文可以提供独立复核,不能冒充模型升级。按宿主可见证据核对身份、配置与用量,未暴露项标为未知;用量缺失限制成本结论,不抹掉已核实的交付证据。
|
|
26
28
|
- 调用失败、责任身份不符或所需独立性无法核实时,不把回交当作该责任的有效证据。只有新的可核查修正依据才支持重试,并服从宿主的重试上限与停止条件;没有新依据或反复同因失败就安全降级。
|
|
27
29
|
- 不能取得所需能力时,继续当前能力可安全推进的部分;只阻断依赖该能力的不可逆放行,并准确说明未取得独立调查、规划、前端制作或验收的实际影响。不把宿主限制说成任务失败,也不伪造路由成功。
|
|
@@ -37,7 +39,7 @@
|
|
|
37
39
|
|
|
38
40
|
## 使用、安装与创建其他能力
|
|
39
41
|
|
|
40
|
-
-
|
|
42
|
+
- 先判断当前内置能力是否真有缺口。做法尚未想清楚不等于能力不足:能由当前模型结合上下文推理、必要资料或授权内的判别性验证解决时,主动推进;已有证据表明需要专长、独立性或访问能力时及时借力,不为证明自主而反复硬试。外部能力只有在正确性、兼容性、可验证性、真实交付或重复成本上的改善,明显大于安装与学习成本、权限与数据暴露、安全风险、上下文占用、维护负担和锁定效应时才值得引入。
|
|
41
43
|
- 项目或宿主已有明确匹配的 skill、工具或插件,且它能改变结果时直接使用。skill 须完整读取对应 `SKILL.md`,其他能力遵循权威接口和项目约定。纯本地、已授权且不新增副作用的使用无需另问;安装、启用、联网、外部写入、凭据或更高权限仍按动作边界处理。
|
|
42
44
|
- 没有匹配能力时,内置能力足够可靠就继续完成。只有缺口会实质影响结果,且现成能力值得引入时,才查用户允许的真实目录与权威来源。核对候选的原始说明、来源、适配面、维护状态、权限与验证方式,优先推荐覆盖缺口最窄且可信的一项;无法核实时只描述所需能力,不编造具体名称。
|
|
43
45
|
- 推荐时说明名称与来源、为何匹配、会获得什么权限、安装后如何验证,以及不用它的替代路径和差异。安装或启用须有用户授权;既有授权已覆盖本次对象、范围和副作用时不重复询问。获准后的第一步必须可执行,不把尚未满足条件的后续步骤写成已可开始。
|
|
@@ -48,6 +50,7 @@
|
|
|
48
50
|
|
|
49
51
|
- 单一能力已能完整解决就不组合。需要组合时,先说清每项能力独立贡献的结果、交接契约和唯一状态 owner;重复覆盖或可互换的能力只选一个。外部 skill 先遵循其自身工作流,再由 odai 统一边界、证据、验收与交付。
|
|
50
52
|
- agent 只用于边界明确、结果可复核,且独立上下文、真实并行、已授权的环境或访问差异、非脚本批量复用或高代价结论质疑中至少一项能改变结果,并且收益高于启动、交接和复验成本时才使用。上下文高度相关、写入冲突或结果不可复核时不下放。
|
|
51
|
-
-
|
|
53
|
+
- 制作可以下放为只读产出:给出当前基线、目标文件、必要原件、允许变化、保持项和验收,让子代理返回具体方案或待应用补丁。补丁是建议产物,不是已经落盘、执行或通过验证的结果;总控核对基线、范围与语义,应用后验证组合状态。研究、规划和审查责任不因工具只读就自动变成补丁制作责任。
|
|
54
|
+
- 只有宿主实际支持、任务授权覆盖且写入范围与隔离可核对时,才下放直接写入;不能以角色名称、提示词或工作目录自报替代权限保护。写入下放前明确目标、允许写域、禁止范围、验收、停止条件和必读来源。下游无法访问对应原规则、项目来源或确认同版时,不做写入,退回只读产出。摘要不能替代原规则。
|
|
52
55
|
- 多个写入者使用同一 baseline、精确允许路径和独立验收。路径重叠、依赖紧密,或不能隔离写入与验证时改为串行;真正独立时才用 worktree 或等价隔离并行。
|
|
53
56
|
- review 只读,根据代码、测试、diff 和原始需求给 finding;不修代码,不为了绿改验收条件。finding 冻结稳定 ID,修复责任只接该清单并逐项回交状态与证据;未出现的建议不自动进入写域。
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- 先区分计划建议、正式计划文档和计划后实施。用户只要求计划时,只调查和交付计划,不修改生产代码、测试行为、schema、依赖、数据或外部系统;宿主 plan mode 有更严格边界时服从宿主。
|
|
10
10
|
- 聊天中的计划不自动授权写文件。用户指定产物或项目已有计划惯例时更新该位置;确需持久交接且写入已获授权时,才新建计划文件。
|
|
11
11
|
- 计划服务于后续决定和行动,不复述仓库目录或堆满不适用栏目。计划完成只表示路线、边界与验收已达到可执行标准,不表示实现已经完成。
|
|
12
|
-
-
|
|
12
|
+
- 需求、非目标、保留行为和不可接受结果以当前用户意图和有效决定为准;事实查证与共同讨论遵循 `references/dao.md`,不用正式计划的结构替代对目标的理解,也不要求用户先给实施方案。
|
|
13
13
|
- 正式计划记录其依据的用户目标与授权。用户纠正使目标、范围、保留行为、不可接受结果或实施授权变化时,只让受影响的工作包、验收和授权失效;保留仍成立部分,重新对齐后再继续,不用旧计划替用户维持已经改变的目标。
|
|
14
14
|
|
|
15
15
|
## 事实基线
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- 方法确有缺口:读取能改变当前做法的工艺或项目资料。
|
|
17
17
|
- 单次上下文无法可靠承载:按下文的唯一状态 owner 外化续作信息。
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
选择能直接补足缺口的支撑,不要求先走一遍较轻但已知不足的办法;一次失败只升级与失败有关的支撑,高风险任务可以同时使用必要的机械保护。缺口闭合后结束已无作用的额外支撑,仍承担交接或验收的结构保留;信号复发再按新缺口调整。支撑提升可靠性,不降低目标和验收,也不把内部检查单输出给用户。
|
|
20
20
|
|
|
21
21
|
## 连续性与记忆
|
|
22
22
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
## 判断完成
|
|
16
16
|
|
|
17
|
-
-
|
|
17
|
+
- 用户已对齐的真实结果已经成立,明确要求均有结果,主要风险有相称证据,才算完成。整体整理须核对本体、配套及它们的连接关系,各部分有基于证据的处置结论;保留可以是正确结果,未检查不能写成无需改动。局部未知只阻断依赖它的部分,其余继续交付并保留未完成项。
|
|
18
18
|
- 声明、配置和注释只证明“写了什么”;局部观测只证明观测范围;真实调用或使用链才证明端到端结果。
|
|
19
19
|
- 两个或更多写入批次共同组成一个交付物时,组件完成不具有传递性。主流程只在唯一组合状态上核对实际改动范围、共享契约、依赖顺序和完整验收;各批次分别通过或分别受审不能替代组合证据。
|
|
20
20
|
- 组合时出现的冲突解决或兼容性编辑属于新的获授权写入,须有自己的范围和验收。组合跨越重大安全、数据、并发、兼容、迁移或公共契约边界时,辨明尚未被现有证据闭合、需要独立判断的组合属性,按 `references/leverage.md` 取得独立复核;不只凭边界名称制造角色。用户明确要求的独立复核必须完成,重复自检不能替代独立证据;能力不可得时按同一 owner 的降级边界处理。
|
|
@@ -59,7 +59,7 @@ if (argv.includes("--help") || argv.includes("-h")) {
|
|
|
59
59
|
[--researcher-effort <effort>] [--planner-effort <effort>] [--reviewer-effort <effort>] \\
|
|
60
60
|
[--frontend-effort <effort>] [--verifier-command <command>]
|
|
61
61
|
|
|
62
|
-
生成 odai 的可选宿主 auto
|
|
62
|
+
生成 odai 的可选宿主 auto 路由适配器。一个持续总控负责实施整合与最终交付,只在多源证据压缩、独立规划、独立验收或前端专业制作能改变结果时调用相应责任;researcher 与 frontend 映射默认不生成。这里不跨 provider、不增加第二总控或隐藏的每轮前置流程。`);
|
|
63
63
|
process.exit(0);
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -89,7 +89,7 @@ const roles = Object.freeze([
|
|
|
89
89
|
]);
|
|
90
90
|
const descriptions = {
|
|
91
91
|
controller: "持续持有用户目标、全局状态、修正回路与最终交付。",
|
|
92
|
-
researcher: "
|
|
92
|
+
researcher: "只为会改变决定的多源事实缺口返回有界来源账本,调用前有收益依据,回交后验贡献。",
|
|
93
93
|
planner: "只在独立判断能改变路线时形成有界的证据化规划。",
|
|
94
94
|
reviewer: "只在独立判断能改变放行结果时依据真实证据验收。",
|
|
95
95
|
frontend: "只在界面设计或前端制作存在专业缺口时形成可验证成品。",
|
|
@@ -126,7 +126,7 @@ const metadata = {
|
|
|
126
126
|
controller_identity: "persistent-task-thread",
|
|
127
127
|
controller_owns_final_delivery: true,
|
|
128
128
|
researcher_activation: models.researcher
|
|
129
|
-
? "only-
|
|
129
|
+
? "only-for-a-decision-blocking-multi-source-gap-with-justified-expected-benefit"
|
|
130
130
|
: "unconfigured",
|
|
131
131
|
planner_activation: "only-when-independent-judgment-can-change-route",
|
|
132
132
|
reviewer_activation: "only-when-independent-judgment-can-change-release",
|
|
@@ -441,7 +441,7 @@ Usage:
|
|
|
441
441
|
|
|
442
442
|
node skills/odai/scripts/install-routing.mjs --host <codex|claude|copilot> --scope <project|user> [--target <path>] --uninstall --yes
|
|
443
443
|
|
|
444
|
-
安装后用户只需正常使用 odai
|
|
444
|
+
安装后用户只需正常使用 odai。总控是唯一持续任务线程并负责实施整合;planner、reviewer 以及可选 researcher、frontend 只在能改变结果时启动。researcher 与 frontend 映射默认不配置。更新会安全移除旧版 advisor、implementer、worker、executor 和 stage runner 托管文件。`);
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
function returnResult(value) { process.stdout.write(`${JSON.stringify(value, null, 2)}\n`); process.exit(0); }
|
|
@@ -94,8 +94,16 @@ export function evaluateStop(payload, policy, projectRoot) {
|
|
|
94
94
|
);
|
|
95
95
|
|
|
96
96
|
for (const check of selected) {
|
|
97
|
-
const
|
|
98
|
-
|
|
97
|
+
const requestedCwd = path.resolve(projectRoot, check.cwd ?? ".");
|
|
98
|
+
let cwd;
|
|
99
|
+
let canonicalRoot;
|
|
100
|
+
try {
|
|
101
|
+
cwd = realpathSync(requestedCwd);
|
|
102
|
+
canonicalRoot = realpathSync(projectRoot);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
return { blocked: true, reason: `odai hook:验收 ${check.name} 的 cwd 无法解析,拒绝执行:${error.message}` };
|
|
105
|
+
}
|
|
106
|
+
if (!isInside(projectRoot, requestedCwd) || !isInside(canonicalRoot, cwd)) {
|
|
99
107
|
return {
|
|
100
108
|
blocked: true,
|
|
101
109
|
reason: `odai hook:验收 ${check.name} 的 cwd 越出项目根,拒绝执行。`,
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface ActiveDshProcess {
|
|
2
|
-
readonly pid: number;
|
|
3
|
-
readonly name: string;
|
|
4
|
-
}
|
|
5
|
-
export interface LegacySessionRepairOptions {
|
|
6
|
-
dshHome?: string;
|
|
7
|
-
sessionRoot?: string;
|
|
8
|
-
confirmDshStopped?: boolean;
|
|
9
|
-
processScanner?: () => readonly ActiveDshProcess[];
|
|
10
|
-
}
|
|
11
|
-
export interface LegacySessionRepairFailure {
|
|
12
|
-
path: string;
|
|
13
|
-
error: string;
|
|
14
|
-
}
|
|
15
|
-
export interface LegacySessionRepairResult {
|
|
16
|
-
dshHome: string;
|
|
17
|
-
sessionRoot: string;
|
|
18
|
-
scannedArtifacts: number;
|
|
19
|
-
matchedArtifacts: number;
|
|
20
|
-
matchedEvents: number;
|
|
21
|
-
repairedArtifacts: number;
|
|
22
|
-
repairedEvents: number;
|
|
23
|
-
backupPaths: string[];
|
|
24
|
-
tornArtifacts: string[];
|
|
25
|
-
failures: LegacySessionRepairFailure[];
|
|
26
|
-
}
|
|
27
|
-
export declare function resolveDshHome(configured: unknown, env?: Readonly<Record<string, string | undefined>>): string;
|
|
28
|
-
export declare function listActiveDshProcesses(platform?: NodeJS.Platform): readonly ActiveDshProcess[];
|
|
29
|
-
export declare function inspectLegacySessionLogs(options?: LegacySessionRepairOptions): LegacySessionRepairResult;
|
|
30
|
-
export declare function repairLegacySessionLogs(options?: LegacySessionRepairOptions): LegacySessionRepairResult;
|
|
31
|
-
//# sourceMappingURL=legacy-session-repair.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-session-repair.d.mts","sourceRoot":"","sources":["../src/legacy-session-repair.mts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,SAAS,gBAAgB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;CACxC;AAOD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,OAAO,EACnB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAOR;AAkCD,wBAAgB,sBAAsB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,SAAS,gBAAgB,EAAE,CAMhH;AAmPD,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CAE5G;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CAI3G"}
|
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from "node:child_process";
|
|
2
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
-
import { closeSync, constants as fsConstants, copyFileSync, existsSync, fsyncSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeSync, } from "node:fs";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
import { dirname, resolve, sep } from "node:path";
|
|
6
|
-
import * as zlib from "node:zlib";
|
|
7
|
-
import { isUnknownRecord } from "./runtime-types.mjs";
|
|
8
|
-
const ZSTD_MAGIC = 4247762216;
|
|
9
|
-
const ODAI_EVENT_PREFIX = "odai/";
|
|
10
|
-
const LEGACY_ODAI_AUDIT_EVENT_TYPES = new Set([
|
|
11
|
-
"odai/governance-denied", "odai/research-decided", "odai/research-result", "odai/route-config-missing",
|
|
12
|
-
"odai/route-decided", "odai/route-protection", "odai/route-result", "odai/route-upgrade",
|
|
13
|
-
"odai/routing-configured", "odai/tool-observed",
|
|
14
|
-
]);
|
|
15
|
-
export function resolveDshHome(configured, env = process.env) {
|
|
16
|
-
const value = configured ?? env.DSH_HOME ?? resolve(homedir(), ".dsh");
|
|
17
|
-
if (typeof value !== "string" || value.trim() === "")
|
|
18
|
-
throw new TypeError("DSH home must be a non-empty path");
|
|
19
|
-
const trimmed = value.trim();
|
|
20
|
-
if (trimmed === "~")
|
|
21
|
-
return homedir();
|
|
22
|
-
if (trimmed.startsWith(`~${sep}`))
|
|
23
|
-
return resolve(homedir(), trimmed.slice(2));
|
|
24
|
-
return resolve(trimmed);
|
|
25
|
-
}
|
|
26
|
-
function isDshCommand(commandLine) {
|
|
27
|
-
if (typeof commandLine !== "string")
|
|
28
|
-
return false;
|
|
29
|
-
return /@deepseek-ai[\\/]dsh(?:[\\/]|$)/iu.test(commandLine)
|
|
30
|
-
|| /(?:^|[\s"'])[^\s"']*[\\/]dsh(?:\.cmd|\.mjs|\.js)?(?=$|[\s"'])/iu.test(commandLine)
|
|
31
|
-
|| /(?:^|[\s"'])dsh(?:\.cmd)?(?=$|[\s"'])/iu.test(commandLine);
|
|
32
|
-
}
|
|
33
|
-
function listWindowsProcesses() {
|
|
34
|
-
const command = "Get-CimInstance Win32_Process | Select-Object ProcessId,Name,CommandLine | ConvertTo-Json -Compress";
|
|
35
|
-
const output = execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", command], {
|
|
36
|
-
encoding: "utf8", windowsHide: true,
|
|
37
|
-
}).trim();
|
|
38
|
-
if (output === "")
|
|
39
|
-
return [];
|
|
40
|
-
const parsed = JSON.parse(output);
|
|
41
|
-
return (Array.isArray(parsed) ? parsed : [parsed]).flatMap((entry) => {
|
|
42
|
-
if (!isUnknownRecord(entry))
|
|
43
|
-
return [];
|
|
44
|
-
return [{
|
|
45
|
-
pid: Number(entry.ProcessId),
|
|
46
|
-
name: typeof entry.Name === "string" ? entry.Name : "unknown",
|
|
47
|
-
commandLine: entry.CommandLine,
|
|
48
|
-
}];
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function listPosixProcesses() {
|
|
52
|
-
const output = execFileSync("ps", ["-axo", "pid=,comm=,args="], { encoding: "utf8" });
|
|
53
|
-
return output.split(/\r?\n/u).flatMap((line) => {
|
|
54
|
-
const matched = /^\s*(\d+)\s+(\S+)\s+(.*)$/u.exec(line);
|
|
55
|
-
return matched ? [{ pid: Number(matched[1]), name: matched[2], commandLine: matched[3] }] : [];
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
export function listActiveDshProcesses(platform = process.platform) {
|
|
59
|
-
const processes = platform === "win32" ? listWindowsProcesses() : listPosixProcesses();
|
|
60
|
-
return processes
|
|
61
|
-
.filter((entry) => Number.isSafeInteger(entry.pid) && entry.pid > 0 && entry.pid !== process.pid)
|
|
62
|
-
.filter((entry) => isDshCommand(entry.commandLine))
|
|
63
|
-
.map(({ pid, name }) => Object.freeze({ pid, name }));
|
|
64
|
-
}
|
|
65
|
-
function assertDshStopped(options) {
|
|
66
|
-
let active;
|
|
67
|
-
try {
|
|
68
|
-
const scanner = options.processScanner ?? listActiveDshProcesses;
|
|
69
|
-
active = scanner();
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
throw new Error("cannot verify that DSH is stopped; run the repair from a normal terminal with permission to inspect local process command lines");
|
|
73
|
-
}
|
|
74
|
-
if (!Array.isArray(active))
|
|
75
|
-
throw new Error("DSH process scanner returned an invalid result");
|
|
76
|
-
if (active.length > 0) {
|
|
77
|
-
const owners = active.map((entry) => `${entry.name ?? "dsh"} (pid ${entry.pid ?? "unknown"})`).join(", ");
|
|
78
|
-
throw new Error(`refusing to rewrite session artifacts while DSH is running: ${owners}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function listSessionArtifacts(root) {
|
|
82
|
-
if (!existsSync(root))
|
|
83
|
-
return [];
|
|
84
|
-
const found = [];
|
|
85
|
-
const pending = [root];
|
|
86
|
-
while (pending.length > 0) {
|
|
87
|
-
const current = pending.pop();
|
|
88
|
-
if (!current)
|
|
89
|
-
break;
|
|
90
|
-
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
91
|
-
const path = resolve(current, entry.name);
|
|
92
|
-
if (entry.isDirectory())
|
|
93
|
-
pending.push(path);
|
|
94
|
-
else if (entry.isFile() && (entry.name === "session.jsonl" || entry.name === "session.jsonl.zstd"))
|
|
95
|
-
found.push(path);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return found.sort();
|
|
99
|
-
}
|
|
100
|
-
function transformLine(line) {
|
|
101
|
-
if (line === "")
|
|
102
|
-
return { line, repaired: 0 };
|
|
103
|
-
const parsed = JSON.parse(line);
|
|
104
|
-
if (!isUnknownRecord(parsed)
|
|
105
|
-
|| typeof parsed.type !== "string"
|
|
106
|
-
|| !parsed.type.startsWith(ODAI_EVENT_PREFIX)
|
|
107
|
-
|| parsed.ignorable === true)
|
|
108
|
-
return { line, repaired: 0 };
|
|
109
|
-
if (!LEGACY_ODAI_AUDIT_EVENT_TYPES.has(parsed.type)) {
|
|
110
|
-
throw new Error(`refusing unknown Odai session event type ${JSON.stringify(parsed.type)}; use a compatible Odai repair version`);
|
|
111
|
-
}
|
|
112
|
-
return { line: JSON.stringify({ ...parsed, ignorable: true }), repaired: 1 };
|
|
113
|
-
}
|
|
114
|
-
function transformCompleteJsonl(text) {
|
|
115
|
-
const output = [];
|
|
116
|
-
let repaired = 0;
|
|
117
|
-
let offset = 0;
|
|
118
|
-
for (;;) {
|
|
119
|
-
const newline = text.indexOf("\n", offset);
|
|
120
|
-
if (newline < 0)
|
|
121
|
-
break;
|
|
122
|
-
const raw = text.slice(offset, newline);
|
|
123
|
-
const carriageReturn = raw.endsWith("\r");
|
|
124
|
-
const line = carriageReturn ? raw.slice(0, -1) : raw;
|
|
125
|
-
const transformed = transformLine(line);
|
|
126
|
-
output.push(transformed.line, carriageReturn ? "\r\n" : "\n");
|
|
127
|
-
repaired += transformed.repaired;
|
|
128
|
-
offset = newline + 1;
|
|
129
|
-
}
|
|
130
|
-
const tornTail = text.slice(offset);
|
|
131
|
-
output.push(tornTail);
|
|
132
|
-
return { text: output.join(""), repaired, torn: tornTail.length > 0 };
|
|
133
|
-
}
|
|
134
|
-
function scanZstdFrames(buffer) {
|
|
135
|
-
const frames = [];
|
|
136
|
-
let offset = 0;
|
|
137
|
-
while (offset < buffer.length) {
|
|
138
|
-
const start = offset;
|
|
139
|
-
if (buffer.length - offset < 4)
|
|
140
|
-
return { frames, tornStart: start };
|
|
141
|
-
if (buffer.readUInt32LE(offset) !== ZSTD_MAGIC)
|
|
142
|
-
throw new Error(`invalid Zstandard frame magic at byte ${offset}`);
|
|
143
|
-
offset += 4;
|
|
144
|
-
if (offset === buffer.length)
|
|
145
|
-
return { frames, tornStart: start };
|
|
146
|
-
const descriptor = buffer.readUInt8(offset);
|
|
147
|
-
offset += 1;
|
|
148
|
-
if ((descriptor & 24) !== 0)
|
|
149
|
-
throw new Error(`reserved Zstandard frame-header bit at byte ${offset - 1}`);
|
|
150
|
-
const contentSizeFlag = descriptor >>> 6;
|
|
151
|
-
const singleSegment = (descriptor & 32) !== 0;
|
|
152
|
-
const checksum = (descriptor & 4) !== 0;
|
|
153
|
-
const dictionaryFlag = descriptor & 3;
|
|
154
|
-
const dictionaryBytes = dictionaryFlag === 3 ? 4 : dictionaryFlag;
|
|
155
|
-
const contentSizeBytes = contentSizeFlag === 0 ? (singleSegment ? 1 : 0) : 1 << contentSizeFlag;
|
|
156
|
-
const remainingHeaderBytes = (singleSegment ? 0 : 1) + dictionaryBytes + contentSizeBytes;
|
|
157
|
-
if (buffer.length - offset < remainingHeaderBytes)
|
|
158
|
-
return { frames, tornStart: start };
|
|
159
|
-
offset += remainingHeaderBytes;
|
|
160
|
-
for (;;) {
|
|
161
|
-
if (buffer.length - offset < 3)
|
|
162
|
-
return { frames, tornStart: start };
|
|
163
|
-
const blockHeader = buffer.readUIntLE(offset, 3);
|
|
164
|
-
offset += 3;
|
|
165
|
-
const lastBlock = (blockHeader & 1) !== 0;
|
|
166
|
-
const blockType = (blockHeader >>> 1) & 3;
|
|
167
|
-
const blockSize = blockHeader >>> 3;
|
|
168
|
-
if (blockType === 3)
|
|
169
|
-
throw new Error(`reserved Zstandard block type at byte ${offset - 3}`);
|
|
170
|
-
const payloadBytes = blockType === 1 ? 1 : blockSize;
|
|
171
|
-
if (buffer.length - offset < payloadBytes)
|
|
172
|
-
return { frames, tornStart: start };
|
|
173
|
-
offset += payloadBytes;
|
|
174
|
-
if (lastBlock)
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
if (checksum) {
|
|
178
|
-
if (buffer.length - offset < 4)
|
|
179
|
-
return { frames, tornStart: start };
|
|
180
|
-
offset += 4;
|
|
181
|
-
}
|
|
182
|
-
frames.push({ start, end: offset });
|
|
183
|
-
}
|
|
184
|
-
return { frames };
|
|
185
|
-
}
|
|
186
|
-
function assertZstdAvailable() {
|
|
187
|
-
if (typeof zlib.zstdCompressSync !== "function" || typeof zlib.zstdDecompressSync !== "function") {
|
|
188
|
-
throw new Error("this Node.js build cannot migrate Zstandard session logs");
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function compressZstdFrame(plaintext) {
|
|
192
|
-
return zlib.zstdCompressSync(plaintext, { params: { [zlib.constants.ZSTD_c_checksumFlag]: 1 } });
|
|
193
|
-
}
|
|
194
|
-
function transformZstd(source) {
|
|
195
|
-
assertZstdAvailable();
|
|
196
|
-
const { frames, tornStart } = scanZstdFrames(source);
|
|
197
|
-
if (frames.length === 0)
|
|
198
|
-
throw new Error("Zstandard session log has no complete header frame");
|
|
199
|
-
const output = [];
|
|
200
|
-
let repaired = 0;
|
|
201
|
-
for (const [index, frame] of frames.entries()) {
|
|
202
|
-
const encoded = source.subarray(frame.start, frame.end);
|
|
203
|
-
if (index === 0) {
|
|
204
|
-
const header = zlib.zstdDecompressSync(encoded).toString("utf8");
|
|
205
|
-
const headerValue = JSON.parse(header.trimEnd());
|
|
206
|
-
if (!header.endsWith("\n") || !isUnknownRecord(headerValue) || headerValue.type !== "session") {
|
|
207
|
-
throw new Error("Zstandard session log has an invalid header frame");
|
|
208
|
-
}
|
|
209
|
-
output.push(encoded);
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
const plaintext = zlib.zstdDecompressSync(encoded);
|
|
213
|
-
const transformed = transformCompleteJsonl(plaintext.toString("utf8"));
|
|
214
|
-
if (transformed.torn)
|
|
215
|
-
throw new Error("complete Zstandard event frame has an unterminated JSONL record");
|
|
216
|
-
repaired += transformed.repaired;
|
|
217
|
-
if (transformed.repaired === 0) {
|
|
218
|
-
output.push(encoded);
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
const replacementPlaintext = Buffer.from(transformed.text, "utf8");
|
|
222
|
-
const replacement = compressZstdFrame(replacementPlaintext);
|
|
223
|
-
if (!zlib.zstdDecompressSync(replacement).equals(replacementPlaintext))
|
|
224
|
-
throw new Error("Zstandard migration verification failed");
|
|
225
|
-
output.push(replacement);
|
|
226
|
-
}
|
|
227
|
-
if (tornStart !== undefined)
|
|
228
|
-
output.push(source.subarray(tornStart));
|
|
229
|
-
return { buffer: repaired > 0 ? Buffer.concat(output) : source, repaired, torn: tornStart !== undefined };
|
|
230
|
-
}
|
|
231
|
-
function transformArtifact(path) {
|
|
232
|
-
const source = readFileSync(path);
|
|
233
|
-
if (path.endsWith(".zstd"))
|
|
234
|
-
return { source, ...transformZstd(source) };
|
|
235
|
-
const transformed = transformCompleteJsonl(source.toString("utf8"));
|
|
236
|
-
return { source, buffer: transformed.repaired > 0 ? Buffer.from(transformed.text, "utf8") : source, repaired: transformed.repaired, torn: transformed.torn };
|
|
237
|
-
}
|
|
238
|
-
function writeDurably(path, content, mode) {
|
|
239
|
-
const handle = openSync(path, "wx", mode);
|
|
240
|
-
try {
|
|
241
|
-
let offset = 0;
|
|
242
|
-
while (offset < content.length) {
|
|
243
|
-
const written = writeSync(handle, content, offset, content.length - offset);
|
|
244
|
-
if (written <= 0)
|
|
245
|
-
throw new Error(`short write while preparing session artifact: ${path}`);
|
|
246
|
-
offset += written;
|
|
247
|
-
}
|
|
248
|
-
fsyncSync(handle);
|
|
249
|
-
}
|
|
250
|
-
finally {
|
|
251
|
-
closeSync(handle);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
function syncDirectory(path) {
|
|
255
|
-
let handle;
|
|
256
|
-
try {
|
|
257
|
-
handle = openSync(path, "r");
|
|
258
|
-
fsyncSync(handle);
|
|
259
|
-
}
|
|
260
|
-
catch { }
|
|
261
|
-
finally {
|
|
262
|
-
if (handle !== undefined)
|
|
263
|
-
closeSync(handle);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
function backupPathFor(path, source) {
|
|
267
|
-
const digest = createHash("sha256").update(source).digest("hex").slice(0, 16);
|
|
268
|
-
return `${path}.odai-compat-${digest}.bak`;
|
|
269
|
-
}
|
|
270
|
-
function createVerifiedBackup(path, source) {
|
|
271
|
-
const backupPath = backupPathFor(path, source);
|
|
272
|
-
if (!existsSync(backupPath)) {
|
|
273
|
-
copyFileSync(path, backupPath, fsConstants.COPYFILE_EXCL);
|
|
274
|
-
const handle = openSync(backupPath, "r+");
|
|
275
|
-
try {
|
|
276
|
-
fsyncSync(handle);
|
|
277
|
-
}
|
|
278
|
-
finally {
|
|
279
|
-
closeSync(handle);
|
|
280
|
-
}
|
|
281
|
-
syncDirectory(dirname(path));
|
|
282
|
-
}
|
|
283
|
-
if (!readFileSync(backupPath).equals(source))
|
|
284
|
-
throw new Error(`session backup does not match the migration source: ${backupPath}`);
|
|
285
|
-
return backupPath;
|
|
286
|
-
}
|
|
287
|
-
function replaceAtomically(path, source, replacement, backupPath) {
|
|
288
|
-
if (!readFileSync(path).equals(source))
|
|
289
|
-
throw new Error("session artifact changed while compatibility migration was preparing it; stop every DSH process and retry");
|
|
290
|
-
const temporary = `${path}.odai-compat-${process.pid}-${randomUUID()}.tmp`;
|
|
291
|
-
const mode = statSync(path).mode & 0o777;
|
|
292
|
-
let published = false;
|
|
293
|
-
try {
|
|
294
|
-
writeDurably(temporary, replacement, mode);
|
|
295
|
-
renameSync(temporary, path);
|
|
296
|
-
published = true;
|
|
297
|
-
syncDirectory(dirname(path));
|
|
298
|
-
if (!readFileSync(path).equals(replacement))
|
|
299
|
-
throw new Error("published session artifact failed byte verification");
|
|
300
|
-
const verified = transformArtifact(path);
|
|
301
|
-
if (verified.repaired !== 0)
|
|
302
|
-
throw new Error("published session artifact still contains required Odai events");
|
|
303
|
-
}
|
|
304
|
-
catch (error) {
|
|
305
|
-
if (published) {
|
|
306
|
-
const restore = `${path}.odai-restore-${process.pid}-${randomUUID()}.tmp`;
|
|
307
|
-
try {
|
|
308
|
-
writeDurably(restore, readFileSync(backupPath), mode);
|
|
309
|
-
renameSync(restore, path);
|
|
310
|
-
syncDirectory(dirname(path));
|
|
311
|
-
}
|
|
312
|
-
finally {
|
|
313
|
-
rmSync(restore, { force: true });
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
throw error;
|
|
317
|
-
}
|
|
318
|
-
finally {
|
|
319
|
-
rmSync(temporary, { force: true });
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
function processLegacySessionLogs(options, writeChanges) {
|
|
323
|
-
const dshHome = resolveDshHome(options.dshHome);
|
|
324
|
-
const sessionRoot = resolve(options.sessionRoot ?? resolve(dshHome, "sessions"));
|
|
325
|
-
const artifacts = listSessionArtifacts(sessionRoot);
|
|
326
|
-
const result = {
|
|
327
|
-
dshHome, sessionRoot, scannedArtifacts: artifacts.length, matchedArtifacts: 0, matchedEvents: 0,
|
|
328
|
-
repairedArtifacts: 0, repairedEvents: 0, backupPaths: [], tornArtifacts: [], failures: [],
|
|
329
|
-
};
|
|
330
|
-
for (const path of artifacts) {
|
|
331
|
-
try {
|
|
332
|
-
const transformed = transformArtifact(path);
|
|
333
|
-
if (transformed.torn)
|
|
334
|
-
result.tornArtifacts.push(path);
|
|
335
|
-
if (transformed.repaired === 0)
|
|
336
|
-
continue;
|
|
337
|
-
result.matchedArtifacts += 1;
|
|
338
|
-
result.matchedEvents += transformed.repaired;
|
|
339
|
-
if (!writeChanges)
|
|
340
|
-
continue;
|
|
341
|
-
const backupPath = createVerifiedBackup(path, transformed.source);
|
|
342
|
-
replaceAtomically(path, transformed.source, transformed.buffer, backupPath);
|
|
343
|
-
result.backupPaths.push(backupPath);
|
|
344
|
-
result.repairedArtifacts += 1;
|
|
345
|
-
result.repairedEvents += transformed.repaired;
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
result.failures.push({ path, error: error instanceof Error ? error.message : String(error) });
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
return result;
|
|
352
|
-
}
|
|
353
|
-
export function inspectLegacySessionLogs(options = {}) {
|
|
354
|
-
return processLegacySessionLogs(options, false);
|
|
355
|
-
}
|
|
356
|
-
export function repairLegacySessionLogs(options = {}) {
|
|
357
|
-
if (options.confirmDshStopped !== true)
|
|
358
|
-
throw new Error("refusing to rewrite session artifacts until confirmDshStopped is true; stop every DSH process first");
|
|
359
|
-
assertDshStopped(options);
|
|
360
|
-
return processLegacySessionLogs(options, true);
|
|
361
|
-
}
|
|
362
|
-
//# sourceMappingURL=legacy-session-repair.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-session-repair.mjs","sourceRoot":"","sources":["../src/legacy-session-repair.mts"],"names":[],"mappings":"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"}
|