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.
Files changed (85) hide show
  1. package/README.ja.md +1 -0
  2. package/dist/client.cjs +208 -3
  3. package/dist/client.d.ts +1 -0
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/dsh/composition.d.ts.map +1 -1
  6. package/dist/dsh/composition.js +2 -0
  7. package/dist/dsh/composition.js.map +1 -1
  8. package/dist/dsh/core/host.d.ts.map +1 -1
  9. package/dist/dsh/core/host.js +0 -10
  10. package/dist/dsh/core/host.js.map +1 -1
  11. package/dist/dsh/host-adapter/routing.d.ts.map +1 -1
  12. package/dist/dsh/host-adapter/routing.js +131 -114
  13. package/dist/dsh/host-adapter/routing.js.map +1 -1
  14. package/dist/dsh/host-adapter.d.ts.map +1 -1
  15. package/dist/dsh/host-adapter.js +2 -1
  16. package/dist/dsh/host-adapter.js.map +1 -1
  17. package/dist/dsh/index.d.ts.map +1 -1
  18. package/dist/dsh/index.js +0 -8
  19. package/dist/dsh/index.js.map +1 -1
  20. package/dist/dsh/lisp/coding-preparation.d.ts +1 -1
  21. package/dist/dsh/lisp/coding-preparation.d.ts.map +1 -1
  22. package/dist/dsh/lisp/coding-preparation.js +1 -1
  23. package/dist/dsh/lisp/coding-preparation.js.map +1 -1
  24. package/dist/dsh/lisp/compiled-cache.d.ts +1 -1
  25. package/dist/dsh/lisp/compiled-cache.d.ts.map +1 -1
  26. package/dist/dsh/lisp/compiled-cache.js +12 -3
  27. package/dist/dsh/lisp/compiled-cache.js.map +1 -1
  28. package/dist/dsh/lisp/manager.d.ts +1 -0
  29. package/dist/dsh/lisp/manager.d.ts.map +1 -1
  30. package/dist/dsh/lisp/manager.js +52 -51
  31. package/dist/dsh/lisp/manager.js.map +1 -1
  32. package/dist/dsh/lisp/store.d.ts +4 -0
  33. package/dist/dsh/lisp/store.d.ts.map +1 -1
  34. package/dist/dsh/lisp/store.js +61 -15
  35. package/dist/dsh/lisp/store.js.map +1 -1
  36. package/dist/dsh/lisp/surface.d.ts.map +1 -1
  37. package/dist/dsh/lisp/surface.js +30 -5
  38. package/dist/dsh/lisp/surface.js.map +1 -1
  39. package/dist/dsh/lisp-tool-identity.d.ts +5 -0
  40. package/dist/dsh/lisp-tool-identity.d.ts.map +1 -1
  41. package/dist/dsh/lisp-tool-identity.js +10 -0
  42. package/dist/dsh/lisp-tool-identity.js.map +1 -1
  43. package/dist/dsh/model-routing.d.ts +1 -0
  44. package/dist/dsh/model-routing.d.ts.map +1 -1
  45. package/dist/dsh/model-routing.js +4 -0
  46. package/dist/dsh/model-routing.js.map +1 -1
  47. package/dist/dsh/models/index.d.ts +6 -0
  48. package/dist/dsh/models/index.d.ts.map +1 -0
  49. package/dist/dsh/models/index.js +8 -0
  50. package/dist/dsh/models/index.js.map +1 -0
  51. package/dist/dsh/models/surface.d.ts +1 -1
  52. package/dist/dsh/models/surface.d.ts.map +1 -1
  53. package/dist/dsh/models/surface.js +21 -13
  54. package/dist/dsh/models/surface.js.map +1 -1
  55. package/dist/dsh/native-tool-surface.d.ts +16 -0
  56. package/dist/dsh/native-tool-surface.d.ts.map +1 -0
  57. package/dist/dsh/native-tool-surface.js +64 -0
  58. package/dist/dsh/native-tool-surface.js.map +1 -0
  59. package/dist/dsh/on-demand-intake.d.ts.map +1 -1
  60. package/dist/dsh/on-demand-intake.js +57 -25
  61. package/dist/dsh/on-demand-intake.js.map +1 -1
  62. package/dist/dsh/session-recovery-surface.d.ts +7 -0
  63. package/dist/dsh/session-recovery-surface.d.ts.map +1 -0
  64. package/dist/dsh/session-recovery-surface.js +86 -0
  65. package/dist/dsh/session-recovery-surface.js.map +1 -0
  66. package/dist/dsh/session-recovery.d.ts +78 -0
  67. package/dist/dsh/session-recovery.d.ts.map +1 -0
  68. package/dist/dsh/session-recovery.js +303 -0
  69. package/dist/dsh/session-recovery.js.map +1 -0
  70. package/dist/dsh/skill-prompts.json +1 -1
  71. package/dist/locale/en.json +1 -1
  72. package/dist/locale/ja.json +1 -1
  73. package/dist/locale/ko.json +1 -1
  74. package/dist/locale/zh-CN.json +1 -1
  75. package/dist/recovery-client.d.ts +5 -0
  76. package/dist/recovery-client.d.ts.map +1 -0
  77. package/dist/recovery-client.js +166 -0
  78. package/dist/recovery-client.js.map +1 -0
  79. package/docs/lisp.md +20 -2
  80. package/docs/session-recovery.md +24 -0
  81. package/dsh/cordis.patch.yml +4 -0
  82. package/migrations/049_lisp_session_hosts.sql +10 -0
  83. package/package.json +6 -2
  84. package/skills/coding-ideal-routine-skill/SKILL.md +28 -1
  85. 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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"}