kiokuko-dsh 0.2.30 → 0.2.32
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.ja.md +1 -0
- package/dist/client.cjs +208 -3
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/dsh/composition.d.ts.map +1 -1
- package/dist/dsh/composition.js +2 -0
- package/dist/dsh/composition.js.map +1 -1
- package/dist/dsh/core/host.d.ts.map +1 -1
- package/dist/dsh/core/host.js +0 -10
- package/dist/dsh/core/host.js.map +1 -1
- package/dist/dsh/host-adapter/routing.d.ts.map +1 -1
- package/dist/dsh/host-adapter/routing.js +131 -114
- package/dist/dsh/host-adapter/routing.js.map +1 -1
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +2 -1
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/index.d.ts.map +1 -1
- package/dist/dsh/index.js +0 -8
- package/dist/dsh/index.js.map +1 -1
- package/dist/dsh/lisp/coding-preparation.d.ts +1 -1
- package/dist/dsh/lisp/coding-preparation.d.ts.map +1 -1
- package/dist/dsh/lisp/coding-preparation.js +1 -1
- package/dist/dsh/lisp/coding-preparation.js.map +1 -1
- package/dist/dsh/lisp/compiled-cache.d.ts +1 -1
- package/dist/dsh/lisp/compiled-cache.d.ts.map +1 -1
- package/dist/dsh/lisp/compiled-cache.js +12 -3
- package/dist/dsh/lisp/compiled-cache.js.map +1 -1
- package/dist/dsh/lisp/manager.d.ts +1 -0
- package/dist/dsh/lisp/manager.d.ts.map +1 -1
- package/dist/dsh/lisp/manager.js +52 -51
- package/dist/dsh/lisp/manager.js.map +1 -1
- package/dist/dsh/lisp/store.d.ts +4 -0
- package/dist/dsh/lisp/store.d.ts.map +1 -1
- package/dist/dsh/lisp/store.js +61 -15
- package/dist/dsh/lisp/store.js.map +1 -1
- package/dist/dsh/lisp/surface.d.ts.map +1 -1
- package/dist/dsh/lisp/surface.js +30 -5
- package/dist/dsh/lisp/surface.js.map +1 -1
- package/dist/dsh/lisp-tool-identity.d.ts +5 -0
- package/dist/dsh/lisp-tool-identity.d.ts.map +1 -1
- package/dist/dsh/lisp-tool-identity.js +10 -0
- package/dist/dsh/lisp-tool-identity.js.map +1 -1
- package/dist/dsh/model-routing.d.ts +1 -0
- package/dist/dsh/model-routing.d.ts.map +1 -1
- package/dist/dsh/model-routing.js +4 -0
- package/dist/dsh/model-routing.js.map +1 -1
- package/dist/dsh/models/index.d.ts +6 -0
- package/dist/dsh/models/index.d.ts.map +1 -0
- package/dist/dsh/models/index.js +8 -0
- package/dist/dsh/models/index.js.map +1 -0
- package/dist/dsh/models/surface.d.ts +1 -1
- package/dist/dsh/models/surface.d.ts.map +1 -1
- package/dist/dsh/models/surface.js +21 -13
- package/dist/dsh/models/surface.js.map +1 -1
- package/dist/dsh/native-tool-surface.d.ts +16 -0
- package/dist/dsh/native-tool-surface.d.ts.map +1 -0
- package/dist/dsh/native-tool-surface.js +64 -0
- package/dist/dsh/native-tool-surface.js.map +1 -0
- package/dist/dsh/on-demand-intake.d.ts.map +1 -1
- package/dist/dsh/on-demand-intake.js +57 -25
- package/dist/dsh/on-demand-intake.js.map +1 -1
- package/dist/dsh/session-recovery-surface.d.ts +7 -0
- package/dist/dsh/session-recovery-surface.d.ts.map +1 -0
- package/dist/dsh/session-recovery-surface.js +86 -0
- package/dist/dsh/session-recovery-surface.js.map +1 -0
- package/dist/dsh/session-recovery.d.ts +78 -0
- package/dist/dsh/session-recovery.d.ts.map +1 -0
- package/dist/dsh/session-recovery.js +303 -0
- package/dist/dsh/session-recovery.js.map +1 -0
- package/dist/dsh/skill-prompts.json +1 -1
- package/dist/locale/en.json +1 -1
- package/dist/locale/ja.json +1 -1
- package/dist/locale/ko.json +1 -1
- package/dist/locale/zh-CN.json +1 -1
- package/dist/recovery-client.d.ts +5 -0
- package/dist/recovery-client.d.ts.map +1 -0
- package/dist/recovery-client.js +166 -0
- package/dist/recovery-client.js.map +1 -0
- package/docs/lisp.md +20 -2
- package/docs/session-recovery.md +24 -0
- package/dsh/cordis.patch.yml +4 -0
- package/migrations/049_lisp_session_hosts.sql +10 -0
- package/package.json +6 -2
- package/skills/coding-ideal-routine-skill/SKILL.md +28 -1
- package/skills/kiokuko-lisp/SKILL.md +4 -4
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { isAbsolute } from 'node:path';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
export class SessionRecoveryError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
status;
|
|
6
|
+
constructor(code, message, status = 409) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.status = status;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const RECORD = 'plugin:kiokuko-dsh/session-recovery';
|
|
13
|
+
const CAUTION = '中断した処理の結果を成功とみなさず、現在のファイルや外部状態を確認してください。結果不明の変更・送信・削除を無条件に再実行しないでください。前プロセスのバックグラウンドジョブ ID は復元できません。古い ID を再利用せず、必要な処理は状態を確認してから開始してください。';
|
|
14
|
+
function requestOf(events) {
|
|
15
|
+
const messages = events.filter(event => event.type === 'user/message' && event.data?.source?.kind === 'user' && !String(event.data.id ?? '').startsWith('kiokuko-recovery:'));
|
|
16
|
+
const texts = messages.map(event => (Array.isArray(event.data.content) ? event.data.content : []).filter((block) => block.type === 'text').map((block) => block.text).join('\n'));
|
|
17
|
+
const text = texts.length === 1 ? texts[0] : texts.map((value, index) => `【ユーザーの依頼 ${index + 1}】\n${value}`).join('\n\n');
|
|
18
|
+
return { text: text ?? '', attachments: messages.reduce((sum, event) => sum + (Array.isArray(event.data.content) ? event.data.content : []).filter((block) => block.type !== 'text').length, 0) };
|
|
19
|
+
}
|
|
20
|
+
function recordedSelection(events) {
|
|
21
|
+
let used, pending;
|
|
22
|
+
for (const event of events) {
|
|
23
|
+
const value = event.type === 'model/selection' ? event.data : event.type === 'request/header' ? event.data?.header?.config : undefined;
|
|
24
|
+
if (typeof value?.provider !== 'string' || !value.provider || typeof value.model !== 'string' || !value.model)
|
|
25
|
+
continue;
|
|
26
|
+
const next = { provider: value.provider, model: value.model, ...(event.type === 'request/header' && event.data?.header?.adapterDefaults?.reasoningEffort === true || value.reasoningEffort === undefined ? {} : { reasoningEffort: value.reasoningEffort }) };
|
|
27
|
+
if (event.type === 'model/selection')
|
|
28
|
+
pending = next;
|
|
29
|
+
else {
|
|
30
|
+
used = next;
|
|
31
|
+
if (pending && pending.provider === next.provider && pending.model === next.model && pending.reasoningEffort === next.reasoningEffort)
|
|
32
|
+
pending = undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return pending ?? used;
|
|
36
|
+
}
|
|
37
|
+
function targetId(source, operation) {
|
|
38
|
+
const hash = createHash('sha256').update(source).update('\0').update(operation).digest('hex');
|
|
39
|
+
return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-4${hash.slice(13, 16)}-a${hash.slice(17, 20)}-${hash.slice(20, 32)}`;
|
|
40
|
+
}
|
|
41
|
+
/** Native history is retained; only an explicit human recovery action may enqueue work. */
|
|
42
|
+
export class SessionRecovery {
|
|
43
|
+
host;
|
|
44
|
+
queues = new Map();
|
|
45
|
+
handles = [];
|
|
46
|
+
lifetime = new AbortController();
|
|
47
|
+
constructor(host) {
|
|
48
|
+
this.host = host;
|
|
49
|
+
}
|
|
50
|
+
assertOpen() { if (this.lifetime.signal.aborted)
|
|
51
|
+
throw new SessionRecoveryError('host_stopped', '復旧機能は停止しました。元の履歴は保持されています。', 503); }
|
|
52
|
+
agent(id) { return this.host.get('agents', false)?.get(id); }
|
|
53
|
+
assertCurrent(agent, idle = true) {
|
|
54
|
+
if (this.lifetime.signal.aborted || this.agent(agent.id) !== agent || this.host.get('sessions', false)?.get(agent.session.id) !== agent.session)
|
|
55
|
+
throw new SessionRecoveryError('session_changed', 'セッションの接続が変わりました。状態を再確認してください。');
|
|
56
|
+
if (idle && agent.status !== 'idle')
|
|
57
|
+
throw new SessionRecoveryError('session_busy', '実行中のセッションは復旧操作できません。現在の処理が終わってから再確認してください。');
|
|
58
|
+
}
|
|
59
|
+
async snapshot(id) {
|
|
60
|
+
this.assertOpen();
|
|
61
|
+
const agent = this.agent(id);
|
|
62
|
+
if (agent && agent.status !== 'disposed') {
|
|
63
|
+
if (agent.id !== id || agent.session.id !== id || this.host.get('sessions', false)?.get(id) !== agent.session)
|
|
64
|
+
throw new SessionRecoveryError('session_identity', 'セッションの識別情報が一致しません。');
|
|
65
|
+
return { session: agent.session, agent };
|
|
66
|
+
}
|
|
67
|
+
const persistence = this.host.get('sessionPersistence', false);
|
|
68
|
+
if (!persistence?.open)
|
|
69
|
+
throw new SessionRecoveryError('session_unavailable', '保存済みセッションを読み込めません。', 404);
|
|
70
|
+
const handle = await persistence.open(id, 'read', { signal: this.lifetime.signal });
|
|
71
|
+
try {
|
|
72
|
+
const value = await handle.read();
|
|
73
|
+
const header = value.meta ?? value.header ?? handle.header;
|
|
74
|
+
if (header?.id !== id || !Array.isArray(value.events))
|
|
75
|
+
throw new SessionRecoveryError('session_identity', '保存済みセッションの識別情報が一致しません。');
|
|
76
|
+
return { session: { id, header, snapshotEvents: () => value.events } };
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await handle.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async inspect(id) {
|
|
83
|
+
const { session, agent } = await this.snapshot(id);
|
|
84
|
+
const events = session.snapshotEvents();
|
|
85
|
+
const lastEnd = [...events].reverse().find(event => event.type === 'turn/end');
|
|
86
|
+
const lastStart = [...events].reverse().find(event => event.type === 'turn/start');
|
|
87
|
+
const calls = new Map();
|
|
88
|
+
for (const event of events) {
|
|
89
|
+
if (event.type === 'tool/call' && typeof event.data.callId === 'string')
|
|
90
|
+
calls.set(`${event.data.turn}:${event.data.callId}`, { id: event.data.callId, name: String(event.data.name ?? 'tool') });
|
|
91
|
+
if (event.type === 'tool/result' && event.data.error?.code !== 'TOOL_OUTCOME_UNKNOWN')
|
|
92
|
+
calls.delete(`${event.data.turn}:${event.data.message?.toolCallId}`);
|
|
93
|
+
}
|
|
94
|
+
const reason = lastEnd?.data?.reason?.kind;
|
|
95
|
+
const interrupted = calls.size > 0 || !!lastStart && (!lastEnd || lastStart.seq > lastEnd.seq || ['interrupted', 'error', 'cancelled'].includes(reason));
|
|
96
|
+
const model = agent?.model?.current() ?? recordedSelection(events) ?? null;
|
|
97
|
+
const providers = this.host.get('llm', false)?.listProviders?.() ?? [];
|
|
98
|
+
const modelAvailable = !!model && providers.some((provider) => provider.id === model.provider);
|
|
99
|
+
const archived = this.host.get('workspaceRegistry', false)?.archivedSessionIds?.includes(id) === true;
|
|
100
|
+
const busy = agent?.status === 'running';
|
|
101
|
+
const root = session.header.origin !== 'subagent' && !archived;
|
|
102
|
+
const hasDirectory = typeof session.header.cwd === 'string' && isAbsolute(session.header.cwd);
|
|
103
|
+
const request = requestOf(events);
|
|
104
|
+
const warnings = interrupted ? [CAUTION] : [];
|
|
105
|
+
if (!hasDirectory)
|
|
106
|
+
warnings.push('元の作業場所が不明です。通常の新規会話から作業場所を選択してください。');
|
|
107
|
+
if (request.text.length > 131072)
|
|
108
|
+
warnings.push('元の依頼が長いため自動転記できません。必要な部分を元の会話からコピーしてください。');
|
|
109
|
+
if (!modelAvailable)
|
|
110
|
+
warnings.push('保存されたモデル接続が利用できません。接続を復旧するかモデルを選び直してください。新規会話は作成できます。');
|
|
111
|
+
if (request.attachments)
|
|
112
|
+
warnings.push('新しい会話では、元の添付ファイルを再添付してください。');
|
|
113
|
+
const restarted = [...events].reverse().find(event => event.type === RECORD && event.data?.action === 'new' && event.data?.version === 1 && event.data?.sourceSessionId === id && typeof event.data.operationId === 'string' && event.data.targetSessionId === targetId(id, event.data.operationId))?.data;
|
|
114
|
+
const lastRestart = restarted && (this.agent(restarted.targetSessionId) || await this.host.get('sessionPersistence', false)?.stat?.(restarted.targetSessionId)) ? { sessionId: restarted.targetSessionId, draft: this.draft(requestOf(events.filter(event => event.seq <= restarted.expectedSeq)).text) } : undefined;
|
|
115
|
+
return { sessionId: id, seq: events.at(-1)?.seq ?? -1, interrupted, busy, canContinue: root && interrupted && !busy && modelAvailable, canRestart: root && !busy && hasDirectory && !!(this.host.get('sessionController', false)?.create || this.host.get('agents', false)?.create), model, modelAvailable, originalRequest: request.text.length > 131072 ? '' : request.text, ...(lastRestart ? { lastRestart } : {}), attachments: request.attachments, unknownCalls: [...calls.values()], warnings };
|
|
116
|
+
}
|
|
117
|
+
draft(text) { return text.length > 131072 ? '' : `${text}\n\n【中断後のやり直し】\n${CAUTION}`; }
|
|
118
|
+
async activate(id) {
|
|
119
|
+
let agent = this.agent(id);
|
|
120
|
+
if (!agent || agent.status === 'disposed') {
|
|
121
|
+
const controller = this.host.get('sessionController', false);
|
|
122
|
+
if (!controller?.follow)
|
|
123
|
+
throw new SessionRecoveryError('open_session_first', 'このセッションを通常の履歴画面または /resume で開いてから操作してください。');
|
|
124
|
+
const iterator = controller.follow({ sessionId: id, activate: true }, this.lifetime.signal)[Symbol.asyncIterator]();
|
|
125
|
+
try {
|
|
126
|
+
await iterator.next();
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await iterator.return?.();
|
|
130
|
+
}
|
|
131
|
+
agent = this.agent(id);
|
|
132
|
+
}
|
|
133
|
+
if (!agent)
|
|
134
|
+
throw new SessionRecoveryError('session_unavailable', 'セッションを再接続できませんでした。');
|
|
135
|
+
this.assertCurrent(agent, false);
|
|
136
|
+
return agent;
|
|
137
|
+
}
|
|
138
|
+
async act(input) {
|
|
139
|
+
input = { ...input };
|
|
140
|
+
const previous = this.queues.get(input.sessionId) ?? Promise.resolve();
|
|
141
|
+
const operation = previous.catch(() => { }).then(() => this.perform(input));
|
|
142
|
+
this.queues.set(input.sessionId, operation);
|
|
143
|
+
try {
|
|
144
|
+
return await operation;
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
if (this.queues.get(input.sessionId) === operation)
|
|
148
|
+
this.queues.delete(input.sessionId);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async restart(input) {
|
|
152
|
+
const { appendPluginRecord } = await import('@deepseek-ai/dsh-session');
|
|
153
|
+
const { session, agent } = await this.snapshot(input.sessionId);
|
|
154
|
+
const events = session.snapshotEvents();
|
|
155
|
+
const status = await this.inspect(input.sessionId);
|
|
156
|
+
const target = targetId(input.sessionId, input.operationId);
|
|
157
|
+
const original = requestOf(events.filter(event => event.seq <= input.expectedSeq));
|
|
158
|
+
const result = () => ({ sessionId: target, sourceSessionId: input.sessionId, action: 'new', draft: this.draft(original.text), warnings: status.warnings });
|
|
159
|
+
const check = (value) => {
|
|
160
|
+
if (value && (value.version !== 1 || value.action !== 'new' || value.expectedSeq !== input.expectedSeq || value.sourceSessionId !== input.sessionId || value.targetSessionId !== target))
|
|
161
|
+
throw new SessionRecoveryError('operation_conflict', '同じ復旧操作 ID が別の操作に使われています。');
|
|
162
|
+
};
|
|
163
|
+
const sourceReceipt = events.find(event => event.type === RECORD && event.data?.operationId === input.operationId)?.data;
|
|
164
|
+
check(sourceReceipt);
|
|
165
|
+
let targetAgent = this.agent(target);
|
|
166
|
+
const stored = targetAgent ? { session: targetAgent.session } : await this.host.get('sessionPersistence', false)?.stat?.(target) ? await this.snapshot(target) : undefined;
|
|
167
|
+
const targetReceipt = stored?.session.snapshotEvents().find(event => event.type === RECORD && event.data?.operationId === input.operationId)?.data;
|
|
168
|
+
check(targetReceipt);
|
|
169
|
+
if (sourceReceipt?.state === 'accepted' || targetReceipt?.state === 'accepted')
|
|
170
|
+
return result();
|
|
171
|
+
if (status.busy)
|
|
172
|
+
throw new SessionRecoveryError('session_busy', '実行中の会話を中断せず、処理が終わってから操作してください。');
|
|
173
|
+
if (!status.canRestart)
|
|
174
|
+
throw new SessionRecoveryError('restart_unavailable', 'このホストでは新しい会話を作成できません。');
|
|
175
|
+
if (status.seq !== input.expectedSeq)
|
|
176
|
+
throw new SessionRecoveryError('session_changed', 'セッションが更新されました。状態を再確認してください。');
|
|
177
|
+
this.assertOpen();
|
|
178
|
+
const checkSource = () => {
|
|
179
|
+
this.assertOpen();
|
|
180
|
+
const current = this.agent(input.sessionId);
|
|
181
|
+
if (agent)
|
|
182
|
+
this.assertCurrent(agent);
|
|
183
|
+
if (current && current.status !== 'disposed' && (current !== agent || current.status !== 'idle' || current.session.snapshotEvents().at(-1)?.seq !== input.expectedSeq))
|
|
184
|
+
throw new SessionRecoveryError('session_changed', '準備中にセッションが更新されました。状態を再確認してください。');
|
|
185
|
+
};
|
|
186
|
+
checkSource();
|
|
187
|
+
const controller = this.host.get('sessionController', false);
|
|
188
|
+
const registry = this.host.get('workspaceRegistry', false);
|
|
189
|
+
let workspace = registry?.list?.().find((item) => item.sessionIds.includes(input.sessionId) || item.path === session.header.cwd);
|
|
190
|
+
if (controller?.create && !workspace && registry?.create)
|
|
191
|
+
workspace = await registry.create(session.header.cwd);
|
|
192
|
+
checkSource();
|
|
193
|
+
if (stored) {
|
|
194
|
+
if (stored.session.header.cwd !== session.header.cwd || stored.session.snapshotEvents().some(event => event.type === 'turn/start' || event.type === 'tool/call' || event.type === 'user/message' && event.data?.source?.kind === 'user'))
|
|
195
|
+
throw new SessionRecoveryError('target_changed', '作成先の会話は既に使われています。元の履歴と作成済みの会話を確認してください。');
|
|
196
|
+
if (!targetAgent)
|
|
197
|
+
targetAgent = await this.activate(target);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
if (controller?.create) {
|
|
201
|
+
const created = await controller.create({ sessionId: target, ...(workspace ? { workspaceId: workspace.id } : { cwd: session.header.cwd }), ...(session.header.agentPreset ? { agentPreset: session.header.agentPreset } : {}) });
|
|
202
|
+
if (created.sessionId !== target)
|
|
203
|
+
throw new SessionRecoveryError('target_changed', '作成先が変わりました。新しい会話の一覧を確認してください。');
|
|
204
|
+
targetAgent = this.agent(target);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
const presets = this.host.get('agentPresets', false), preset = session.header.agentPreset;
|
|
208
|
+
const handle = await this.host.get('agents', false).create({ sessionId: target, meta: { cwd: session.header.cwd, ...(preset ? { agentPreset: preset } : {}) }, ...(status.modelAvailable ? { agentOptions: status.model } : {}), ...(preset && presets?.mount ? { setup: async (context) => { await presets.mount(context, preset); } } : {}) });
|
|
209
|
+
this.handles.push(handle);
|
|
210
|
+
targetAgent = handle.agent;
|
|
211
|
+
}
|
|
212
|
+
if (status.modelAvailable && targetAgent?.model) {
|
|
213
|
+
const revision = targetAgent.session.snapshotEvents().at(-1)?.seq;
|
|
214
|
+
let modelReady = true;
|
|
215
|
+
try {
|
|
216
|
+
await this.host.get('llm', false).resolveCallConfig(status.model, this.lifetime.signal);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
modelReady = false;
|
|
220
|
+
status.warnings.push('元のモデルを新しい会話へ設定できませんでした。送信前にモデルを選び直してください。');
|
|
221
|
+
}
|
|
222
|
+
this.assertCurrent(targetAgent);
|
|
223
|
+
if (targetAgent.session.snapshotEvents().at(-1)?.seq !== revision)
|
|
224
|
+
throw new SessionRecoveryError('target_changed', '準備中に作成先の会話が更新されました。内容を確認してください。');
|
|
225
|
+
if (modelReady)
|
|
226
|
+
targetAgent.model.select(status.model);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
this.assertOpen();
|
|
230
|
+
if (!targetAgent || targetAgent.session.header.cwd !== session.header.cwd)
|
|
231
|
+
throw new SessionRecoveryError('target_identity', '新しい会話の作業場所を確認できません。');
|
|
232
|
+
this.assertCurrent(targetAgent);
|
|
233
|
+
if (stored && workspace?.attachSession) {
|
|
234
|
+
await workspace.attachSession(target);
|
|
235
|
+
this.assertCurrent(targetAgent);
|
|
236
|
+
}
|
|
237
|
+
const receipt = { version: 1, ...input, sourceSessionId: input.sessionId, targetSessionId: target, state: 'accepted' };
|
|
238
|
+
appendPluginRecord(targetAgent.session, RECORD, receipt);
|
|
239
|
+
await this.host.get('sessions', false)?.flush?.(targetAgent.session);
|
|
240
|
+
if (agent && this.agent(agent.id) === agent && agent.status === 'idle' && agent.session.snapshotEvents().at(-1)?.seq === status.seq)
|
|
241
|
+
appendPluginRecord(agent.session, RECORD, receipt);
|
|
242
|
+
return result();
|
|
243
|
+
}
|
|
244
|
+
async perform(input) {
|
|
245
|
+
if (input.action === 'new')
|
|
246
|
+
return this.restart(input);
|
|
247
|
+
// The public plugin can load without optional native model peers. Resolve
|
|
248
|
+
// this dependency only for continuation, before capturing mutable state.
|
|
249
|
+
const [{ createUserMessage, MessageId }, { appendPluginRecord }] = await Promise.all([
|
|
250
|
+
import('@deepseek-ai/dsh-llm'), import('@deepseek-ai/dsh-session'),
|
|
251
|
+
]);
|
|
252
|
+
const agent = await this.activate(input.sessionId);
|
|
253
|
+
const events = agent.session.snapshotEvents();
|
|
254
|
+
const receipts = events.filter(event => event.type === RECORD && event.data?.operationId === input.operationId);
|
|
255
|
+
const receipt = receipts.at(-1)?.data;
|
|
256
|
+
if (receipt && (receipt.version !== 1 || !['planned', 'accepted'].includes(receipt.state)))
|
|
257
|
+
throw new SessionRecoveryError('operation_version', 'この復旧記録の形式には対応していません。元の履歴は保持されています。');
|
|
258
|
+
if (receipt && (receipt.action !== input.action || receipt.expectedSeq !== input.expectedSeq || receipt.sourceSessionId !== input.sessionId))
|
|
259
|
+
throw new SessionRecoveryError('operation_conflict', '同じ復旧操作 ID が別の操作に使われています。');
|
|
260
|
+
const status = await this.inspect(input.sessionId);
|
|
261
|
+
this.assertCurrent(agent, false);
|
|
262
|
+
const messageId = `kiokuko-recovery:${input.operationId}`;
|
|
263
|
+
const result = (sessionId) => ({ sessionId, sourceSessionId: input.sessionId, action: 'continue', warnings: status.warnings });
|
|
264
|
+
if (receipt?.state === 'accepted' || events.some(event => event.type === 'user/message' && event.data?.id === messageId) || [...agent.inbox?.nextStep ?? [], ...agent.inbox?.nextTurn ?? []].some(message => message.id === messageId))
|
|
265
|
+
return result(input.sessionId);
|
|
266
|
+
this.assertCurrent(agent);
|
|
267
|
+
if (status.seq !== (receipt ? receipts.at(-1).seq : input.expectedSeq))
|
|
268
|
+
throw new SessionRecoveryError('session_changed', 'セッションが更新されました。内容を再確認してから操作してください。');
|
|
269
|
+
if (input.action === 'continue' && !status.canContinue)
|
|
270
|
+
throw new SessionRecoveryError('model_unavailable', '続行できません。モデル接続とセッションの状態を確認してください。');
|
|
271
|
+
if (input.action === 'continue') {
|
|
272
|
+
try {
|
|
273
|
+
await this.host.get('llm', false).resolveCallConfig(status.model, this.lifetime.signal);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
throw new SessionRecoveryError('model_unavailable', '保存されたモデル接続を準備できません。接続を復旧するかモデルを選び直してください。');
|
|
277
|
+
}
|
|
278
|
+
this.assertCurrent(agent);
|
|
279
|
+
if (agent.session.snapshotEvents().at(-1)?.seq !== status.seq)
|
|
280
|
+
throw new SessionRecoveryError('session_changed', 'セッションが更新されました。再確認してください。');
|
|
281
|
+
}
|
|
282
|
+
const target = input.sessionId;
|
|
283
|
+
const record = (state) => appendPluginRecord(agent.session, RECORD, { version: 1, ...input, sourceSessionId: input.sessionId, targetSessionId: target, state });
|
|
284
|
+
if (!receipt)
|
|
285
|
+
record('planned');
|
|
286
|
+
const intentSeq = agent.session.snapshotEvents().at(-1)?.seq;
|
|
287
|
+
await this.host.get('sessions', false)?.flush?.(agent.session);
|
|
288
|
+
this.assertCurrent(agent);
|
|
289
|
+
if (agent.session.snapshotEvents().at(-1)?.seq !== intentSeq)
|
|
290
|
+
throw new SessionRecoveryError('session_changed', '復旧の準備中にセッションが更新されました。再確認してください。');
|
|
291
|
+
agent.followup({ ...createUserMessage({ content: [{ type: 'text', text: `中断した作業を、保存された履歴を確認して続けてください。\n${CAUTION}` }], source: { kind: 'user' } }), id: MessageId(messageId) });
|
|
292
|
+
if (this.agent(agent.id) === agent)
|
|
293
|
+
record('accepted');
|
|
294
|
+
return result(target);
|
|
295
|
+
}
|
|
296
|
+
async dispose() {
|
|
297
|
+
this.lifetime.abort();
|
|
298
|
+
await Promise.allSettled(this.queues.values());
|
|
299
|
+
for (const handle of this.handles.splice(0))
|
|
300
|
+
await handle.dispose();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=session-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-recovery.js","sourceRoot":"","sources":["../../src/dsh/session-recovery.ts"],"names":[],"mappings":"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"}
|