import type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from "@earendil-works/pi-coding-agent"; import type { ActiveManual, SessionState } from "./session.js"; /** v18.x(issue pt-turncontext-llm-call-trigger 决策 6):lastTurnRef 持久化 entry。 * 与 PT_MANUAL_ENTRY 同寿命周期——session_start 读恢复 / 调 pt_inject + pt_doc start 写。 */ declare const PT_LAST_TURN_REF_ENTRY = "pt:last-turn-ref"; /** TurnContext 线索结构(引用指针,非内容缓存)。 */ export interface LastTurnRef { turnInjectDomain: string; manualPath: string | null; } /** 把当前 ActiveManual 写入 session JSONL。 * 失败静默(ephemeral session / 旧版 pi 无 appendEntry)——内存中 activeManual 仍可用本进程。 * P3:issue 字段透传到 entry——只在有值时写(undefined 不写),避免旧 entry 读出 undefined * 与"未填 issue"语义混淆。 */ declare function persistManualToSession(pi: ExtensionAPI, m: ActiveManual): void; /** 刷新 footer 注入状态 + manual 后缀(合并写一次 setStatus)。 * v14.x(issue pt-asset-migration-visibility Layer 2):assetHealthIssues.length 透传给 * renderInjectionFooter → footer 末尾追加 ⚠ N issues(染色)。 * v14.x(tagline):从 cachedProfile.tagline 读,footer 拼 `: `。 * P1:与上次 setStatus 字符串比较去重——tool_result + turn_end 双钩子刷新时,injectionState * 与 activeProfile 等字段通常未变,footer 文本也不会变,跳过 setStatus 避免无变化 IPC。 * 字符串比较覆盖所有写入 base/suffix/healthCount/tagline 的字段。 */ declare function refreshInjectionFooter(ui: { setStatus(name: string, text: string): void; }, session: SessionState): void; /** 刷新 widget(aboveEditor)。根据 session.activeManual 决定显示/撤掉。 * - 无 activeManual → 撤 widget * - 文件不存在 / 真完成(status=completed + stepDone===stepTotal + 无 —/INCONCLUSIVE)→ 清 activeManual + 撤 widget * - 伪完成(status=completed 但 step 未全勾或有 —/INCONCLUSIVE)→ 仍渲染 widget,加 ⚠ fake done 提示 * - in-progress → 渲染 3 行 widget + 更新 cachedManualProgress(footer 同步读) * v12.x:state 全部从 session 参数读,不再读写 module-level 单例。 * v15.x(issue pt-manual-completion-check-too-loose):用 checkManualCompletion 替代 `p.status === "completed"`, * 让伪完成的 manual 仍 active(widget 重新挂载,提示用户步骤未全完成)。 * P1:用 manualProgressEqual 浅比较去重——tool_result / turn_end 双钩子高频调用本函数, * 进度未变时只更新缓存不发 setWidget IPC(节省 ~70% 无效 IPC,见 pt-workspace-boundary-calibration §2.3)。 */ declare function refreshManualWidget(ui: ExtensionUIContext, session: SessionState): Promise; /** v18.x(决策 6):把 lastTurnRef 写入 session JSONL。 * resume / --session 启动时读出恢复(与 persistManualToSession 同机制)。 * 失败静默(ephemeral session / 旧版 pi 无 appendEntry)。 */ declare function persistLastTurnRef(pi: ExtensionAPI, ref: LastTurnRef): void; /** v18.x(决策 6):session_start 时试恢复 lastTurnRef。 * 独立于 manual 恢复链——compaction 线索是 session lifecycle 维度, * 无 manual 时也能有线索(只调过 pt_inject 没调 pt_doc start)。 */ declare function tryRestoreLastTurnRef(ctx: ExtensionContext, session: SessionState): void; /** session_start 时试恢复 manual:读 pt:active-manual entry → 校验文件存在 + status !== completed。 * 独立于 profile 加载链——profile 失败 / 无 profile 也能恢复 manual 追踪。 */ declare function tryRestoreManual(ctx: ExtensionContext, session: SessionState): Promise; /** 重置 module-level 缓存(session_shutdown 时调,避免新 session 残留旧 manual 状态)。 * v12.x:改 no-op——cachedManualProgress / activeManual 都搬到 SessionState, * session_shutdown 时由 `clearSessionById(sessionId)` 整体删除 entry 即可。 */ declare function resetManualSession(_session: SessionState): void; /** 跨平台路径归一比较(resolve 后字符串比较)。 * - 绝对路径优先:path.resolve 解析 `..`/`./`/`~/` 与当前 cwd,等价字符串视为同一文件 * - resolve 抛错时退化为原字符串等比(极少触发,相对路径在某些 cwd 下解析失败) * P1:tool_result 钩子按 filePath 过滤 edit/write 时调用,规避 edit 工具 input.path 给的是 * 绝对/相对/cwd-相对混合形态时漏刷。 */ declare function pathEquals(a: string, b: string): boolean; export { pathEquals, persistManualToSession, refreshInjectionFooter, refreshManualWidget, resetManualSession, tryRestoreManual, tryRestoreLastTurnRef, persistLastTurnRef, PT_LAST_TURN_REF_ENTRY, };