kiokuko-dsh 0.1.22 → 0.1.24
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/dist/client.cjs +163 -1
- package/dist/client.d.ts +11 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/dsh/boundary-worker.d.ts +6 -3
- package/dist/dsh/boundary-worker.d.ts.map +1 -1
- package/dist/dsh/boundary-worker.js +80 -28
- package/dist/dsh/boundary-worker.js.map +1 -1
- package/dist/dsh/completion-report.d.ts +25 -0
- package/dist/dsh/completion-report.d.ts.map +1 -0
- package/dist/dsh/completion-report.js +88 -0
- package/dist/dsh/completion-report.js.map +1 -0
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +103 -25
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/tools.d.ts.map +1 -1
- package/dist/dsh/tools.js +35 -14
- package/dist/dsh/tools.js.map +1 -1
- package/dist/dsh/turn-process.d.ts +7 -0
- package/dist/dsh/turn-process.d.ts.map +1 -1
- package/dist/dsh/turn-process.js +47 -10
- package/dist/dsh/turn-process.js.map +1 -1
- package/dist/dsh/user-interaction.d.ts +7 -1
- package/dist/dsh/user-interaction.d.ts.map +1 -1
- package/dist/dsh/user-interaction.js +52 -2
- package/dist/dsh/user-interaction.js.map +1 -1
- package/dist/enno-oduno/schemas.d.ts +16 -16
- package/dist/enno-oduno/schemas.d.ts.map +1 -1
- package/dist/enno-oduno/schemas.js +19 -17
- package/dist/enno-oduno/schemas.js.map +1 -1
- package/docs/database.md +6 -0
- package/docs/dsh-plugin.md +31 -6
- package/migrations/005_dsh_completion_recovery.sql +118 -0
- package/package.json +1 -1
- package/skills/kiokuko-enno-oduno/SKILL.md +1 -0
package/dist/client.cjs
CHANGED
|
@@ -5,6 +5,7 @@ window.__ModuleLoader__.load({
|
|
|
5
5
|
var exports = module.exports;
|
|
6
6
|
const { createSnapshotStore } = require("@deepseek-ai/dsh-client-store");
|
|
7
7
|
const { jsx, jsxs, Fragment } = require("react/jsx-runtime");
|
|
8
|
+
const { useState, useRef, useEffect } = require("react");
|
|
8
9
|
const { Modal, Button, IconDownloadOutline16 } = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
9
10
|
const SESSION_EXPORT_PATH = '/api/session.export';
|
|
10
11
|
const LOCALE_NAMESPACE = 'kiokuko-session-log-download';
|
|
@@ -198,9 +199,170 @@ window.__ModuleLoader__.load({
|
|
|
198
199
|
document.head.appendChild(style);
|
|
199
200
|
return () => style.remove();
|
|
200
201
|
}
|
|
201
|
-
const inject = ['slots', 'locale'];
|
|
202
|
+
const inject = ['slots', 'locale', 'uiConversation'];
|
|
203
|
+
/** A plugin-owned result in chat, never forged as a model assistant message. */
|
|
204
|
+
const completionReportDefinition = {
|
|
205
|
+
kind: 'kiokuko-completion-report', target: 'chat',
|
|
206
|
+
match: (event) => event.type === 'kiokuko/completion-report' && typeof event.data.reportId === 'string' && typeof event.data.text === 'string'
|
|
207
|
+
? { id: event.data.reportId, role: 'start' } : null,
|
|
208
|
+
start: (_context, match) => ({ seq: match.event.seq, text: match.event.data.text }),
|
|
209
|
+
update: (context) => context.state,
|
|
210
|
+
buildViewNode: (context) => context.state === undefined ? null : {
|
|
211
|
+
key: context.key, id: context.id, kind: 'kiokuko-completion-report', target: 'chat',
|
|
212
|
+
anchorSeq: context.state.seq, location: context.start?.location ?? { kind: 'session' },
|
|
213
|
+
visibility: 'visible', data: { text: context.state.text },
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
function CompletionReport(props) {
|
|
217
|
+
const node = props.node;
|
|
218
|
+
return jsx('section', { role: 'status', 'aria-live': 'polite',
|
|
219
|
+
style: { whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', padding: '12px 0' }, children: node.data.text });
|
|
220
|
+
}
|
|
221
|
+
const intakeDrafts = new WeakMap();
|
|
222
|
+
function intakePending(props) {
|
|
223
|
+
const pending = props.pendingInteraction;
|
|
224
|
+
const question = pending?.questions?.[0];
|
|
225
|
+
return pending?.kind === 'question' && pending.questions.length === 1
|
|
226
|
+
&& question?.id === 'taskType' && question.header === 'Kiokuko · 作業の選択'
|
|
227
|
+
&& question.multiSelect !== true && question.options?.length > 0 && question.options.length <= 9
|
|
228
|
+
&& typeof pending.answer === 'function' && typeof pending.cancel === 'function'
|
|
229
|
+
? pending : null;
|
|
230
|
+
}
|
|
231
|
+
/** Native pending carrier, plugin-only presentation. Other DSH questions remain untouched. */
|
|
232
|
+
function IntakeQuestion(props) {
|
|
233
|
+
const pending = props.matched;
|
|
234
|
+
return jsx(IntakeQuestionCard, { key: pending.key, pending });
|
|
235
|
+
}
|
|
236
|
+
function IntakeQuestionCard(props) {
|
|
237
|
+
const pending = props.pending;
|
|
238
|
+
const question = pending.questions[0];
|
|
239
|
+
const [draft, setDraft] = useState(() => intakeDrafts.get(pending) ?? { selected: null, custom: '' });
|
|
240
|
+
const [busy, setBusy] = useState(false);
|
|
241
|
+
const [error, setError] = useState('');
|
|
242
|
+
const inFlight = useRef(false);
|
|
243
|
+
const mounted = useRef(false);
|
|
244
|
+
const card = useRef(null);
|
|
245
|
+
const optionElements = useRef([]);
|
|
246
|
+
useEffect(() => {
|
|
247
|
+
mounted.current = true;
|
|
248
|
+
card.current?.focus();
|
|
249
|
+
return () => { mounted.current = false; };
|
|
250
|
+
}, [pending]);
|
|
251
|
+
useEffect(() => {
|
|
252
|
+
if (draft.selected !== null)
|
|
253
|
+
optionElements.current[draft.selected]?.scrollIntoView({ block: 'nearest' });
|
|
254
|
+
}, [draft.selected]);
|
|
255
|
+
const update = (value) => {
|
|
256
|
+
intakeDrafts.set(pending, value);
|
|
257
|
+
setDraft(value);
|
|
258
|
+
setError('');
|
|
259
|
+
};
|
|
260
|
+
const settle = (cancel = false, skip = false) => {
|
|
261
|
+
if (inFlight.current)
|
|
262
|
+
return;
|
|
263
|
+
const custom = draft.custom.trim();
|
|
264
|
+
if (!cancel && !skip && draft.selected === null && custom === '') {
|
|
265
|
+
setError('選択肢を選ぶか、自由入力してください。');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (!cancel && !skip && /^[0-90-9]+$/u.test(custom)) {
|
|
269
|
+
const ordinal = Number(custom.normalize('NFKC'));
|
|
270
|
+
if (ordinal < 1 || ordinal > question.options.length) {
|
|
271
|
+
setError(`番号は1〜${question.options.length}で入力してください。`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
inFlight.current = true;
|
|
276
|
+
setBusy(true);
|
|
277
|
+
setError('');
|
|
278
|
+
// Enter is a separate confirmation. Typing, key-repeat and IME cannot submit twice.
|
|
279
|
+
void Promise.resolve().then(() => cancel ? pending.cancel() : pending.answer({ answers: [{
|
|
280
|
+
id: question.id,
|
|
281
|
+
selected: skip || draft.selected === null ? [] : [question.options[draft.selected].label],
|
|
282
|
+
...(!skip && custom ? { custom } : {}),
|
|
283
|
+
}] })).then(() => { intakeDrafts.delete(pending); }).catch(cause => {
|
|
284
|
+
if (!mounted.current)
|
|
285
|
+
return;
|
|
286
|
+
inFlight.current = false;
|
|
287
|
+
setBusy(false);
|
|
288
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
const keyDown = (event) => {
|
|
292
|
+
if (busy || event.repeat || event.nativeEvent?.isComposing || event.nativeEvent?.keyCode === 229
|
|
293
|
+
|| event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)
|
|
294
|
+
return;
|
|
295
|
+
const editing = event.target?.isContentEditable || ['INPUT', 'TEXTAREA', 'SELECT'].includes(event.target?.tagName ?? '');
|
|
296
|
+
if (!editing && /^[1-9]$/u.test(event.key)) {
|
|
297
|
+
const index = Number(event.key) - 1;
|
|
298
|
+
if (index >= question.options.length)
|
|
299
|
+
return;
|
|
300
|
+
event.preventDefault();
|
|
301
|
+
event.stopPropagation();
|
|
302
|
+
update({ selected: index, custom: '' });
|
|
303
|
+
card.current?.focus();
|
|
304
|
+
}
|
|
305
|
+
else if (event.key === 'Enter' && event.target?.tagName !== 'BUTTON') {
|
|
306
|
+
event.preventDefault();
|
|
307
|
+
event.stopPropagation();
|
|
308
|
+
settle();
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
const titleId = `kiokuko-intake-${pending.key}`;
|
|
312
|
+
return jsxs('section', {
|
|
313
|
+
className: 'kiokuko-intake', tabIndex: 0, ref: (element) => { card.current = element; },
|
|
314
|
+
'aria-labelledby': titleId, 'aria-busy': busy, onKeyDown: keyDown,
|
|
315
|
+
children: [
|
|
316
|
+
jsxs('header', { children: [jsx('h2', { id: titleId, children: question.question }),
|
|
317
|
+
jsx('button', { type: 'button', disabled: busy, onClick: () => settle(true), 'aria-label': '質問を閉じる', children: '閉じる' })] }),
|
|
318
|
+
jsxs('div', { className: 'kiokuko-intake-body', children: [
|
|
319
|
+
jsx('p', { children: question.detail }),
|
|
320
|
+
jsx('p', { children: `1〜${question.options.length}キーで選択、Enterで確定。自由入力中の数字は文字として入力されます。` }),
|
|
321
|
+
jsx('div', { 'aria-label': '作業の選択肢', children: question.options.map((option, index) => jsxs('button', {
|
|
322
|
+
key: option.label, type: 'button', className: 'kiokuko-intake-option', disabled: busy,
|
|
323
|
+
ref: (element) => { optionElements.current[index] = element; },
|
|
324
|
+
'aria-pressed': draft.selected === index, 'aria-keyshortcuts': String(index + 1),
|
|
325
|
+
onClick: () => update({ selected: index, custom: '' }),
|
|
326
|
+
onKeyDown: (event) => {
|
|
327
|
+
if (event.key !== 'Enter' || event.repeat || event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.nativeEvent?.isComposing || event.nativeEvent?.keyCode === 229 || draft.selected !== index)
|
|
328
|
+
return;
|
|
329
|
+
event.preventDefault();
|
|
330
|
+
event.stopPropagation();
|
|
331
|
+
settle();
|
|
332
|
+
},
|
|
333
|
+
children: [jsx('strong', { children: `${index + 1}. ${option.label}` }), jsx('span', { children: option.description })],
|
|
334
|
+
})) }),
|
|
335
|
+
jsx('label', { htmlFor: `${titleId}-custom`, children: '自由入力(番号でも回答できます)' }),
|
|
336
|
+
jsx('textarea', { id: `${titleId}-custom`, rows: 2, disabled: busy, value: draft.custom,
|
|
337
|
+
onChange: (event) => update({ selected: null, custom: event.target.value }),
|
|
338
|
+
}),
|
|
339
|
+
] }),
|
|
340
|
+
jsxs('footer', { children: [
|
|
341
|
+
jsx('span', { role: 'status', 'aria-live': 'polite', children: error || (busy ? '送信中…' : draft.selected === null ? '' : `${draft.selected + 1}. ${question.options[draft.selected].label}を選択中`) }),
|
|
342
|
+
jsx('button', { type: 'button', disabled: busy, onClick: () => settle(false, true), children: '作業を始めず会話する' }),
|
|
343
|
+
jsx('button', { type: 'button', disabled: busy || (draft.selected === null && !draft.custom.trim()), onClick: () => settle(), children: '確定(Enter)' }),
|
|
344
|
+
] }),
|
|
345
|
+
],
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
function installIntakeStyle() {
|
|
349
|
+
if (typeof document === 'undefined')
|
|
350
|
+
return undefined;
|
|
351
|
+
const style = document.createElement('style');
|
|
352
|
+
style.textContent = '.kiokuko-intake{border:1px solid var(--dsw-alias-border-l4,#bbb);border-radius:16px;padding:16px;background:var(--dsw-alias-background-primary,Canvas);color:var(--dsw-alias-label-primary,CanvasText);display:flex;flex-direction:column;max-height:70dvh;gap:12px}.kiokuko-intake header,.kiokuko-intake footer{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.kiokuko-intake h2{font-size:18px;margin:0;flex:1}.kiokuko-intake-body{overflow:auto;min-height:0}.kiokuko-intake p{white-space:pre-wrap;line-height:1.5}.kiokuko-intake button{font:inherit;color:inherit;background:transparent;border:1px solid var(--dsw-alias-border-l4,#bbb);border-radius:8px;padding:10px;min-height:44px;cursor:pointer}.kiokuko-intake button:disabled{cursor:default;opacity:.6}.kiokuko-intake-option{display:flex;width:100%;text-align:left;flex-direction:column;gap:4px;margin-bottom:8px;overflow-wrap:anywhere}.kiokuko-intake-option[aria-pressed=true]{border:2px solid var(--dsw-alias-label-primary,CanvasText);background:var(--dsw-alias-interactive-bg-hover,#eee)}.kiokuko-intake-option span{font-size:13px;line-height:1.5}.kiokuko-intake textarea{box-sizing:border-box;width:100%;font:inherit;color:inherit;background:transparent;border:1px solid var(--dsw-alias-border-l4,#bbb);padding:8px;border-radius:8px}.kiokuko-intake :focus-visible,.kiokuko-intake:focus-visible{outline:2px solid Highlight;outline-offset:3px}.kiokuko-intake footer [role=status]{flex:1;min-width:120px}';
|
|
353
|
+
document.head.appendChild(style);
|
|
354
|
+
return () => style.remove();
|
|
355
|
+
}
|
|
202
356
|
/** Register Kiokuko's streaming Session-export browser surface. */
|
|
203
357
|
function apply(ctx) {
|
|
358
|
+
ctx.slots.inject('conversation.composer', () => ctx.slots.register({
|
|
359
|
+
name: 'conversation.composer', priority: -10, select: intakePending, locale: LOCALE_NAMESPACE,
|
|
360
|
+
}, IntakeQuestion));
|
|
361
|
+
ctx.effect(installIntakeStyle, 'kiokuko-dsh: intake style');
|
|
362
|
+
ctx.uiConversation.events.register(completionReportDefinition);
|
|
363
|
+
ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({
|
|
364
|
+
name: 'conversation.chat.node', key: 'kiokuko-completion-report', locale: LOCALE_NAMESPACE,
|
|
365
|
+
}, CompletionReport));
|
|
204
366
|
const controller = new SessionLogDownloadController();
|
|
205
367
|
ctx.effect(() => async () => controller.dispose(), 'kiokuko-dsh: browser download lifecycle');
|
|
206
368
|
ctx.effect(installStyle, 'kiokuko-dsh: browser download style');
|
package/dist/client.d.ts
CHANGED
|
@@ -14,6 +14,11 @@ export interface DshSessionDownloadOptions {
|
|
|
14
14
|
readonly window?: DshSessionDownloadWindow;
|
|
15
15
|
}
|
|
16
16
|
interface DshClientContext {
|
|
17
|
+
readonly uiConversation: {
|
|
18
|
+
readonly events: {
|
|
19
|
+
register(definition: unknown): unknown;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
17
22
|
readonly locale: {
|
|
18
23
|
register(namespace: string, dictionaries: Record<string, Record<string, string>>): unknown;
|
|
19
24
|
};
|
|
@@ -21,9 +26,12 @@ interface DshClientContext {
|
|
|
21
26
|
inject(name: string, register: () => unknown): unknown;
|
|
22
27
|
register(definition: {
|
|
23
28
|
readonly name: string;
|
|
24
|
-
readonly id
|
|
29
|
+
readonly id?: string;
|
|
30
|
+
readonly key?: string;
|
|
31
|
+
readonly priority?: number;
|
|
32
|
+
readonly select?: (props: Record<string, unknown>) => unknown;
|
|
25
33
|
readonly locale: string;
|
|
26
|
-
readonly inject
|
|
34
|
+
readonly inject?: () => Record<string, unknown>;
|
|
27
35
|
}, component: (props: Record<string, unknown>) => unknown): unknown;
|
|
28
36
|
};
|
|
29
37
|
effect(setup: () => void | (() => void | Promise<void>), label: string): unknown;
|
|
@@ -33,7 +41,7 @@ interface DshClientContext {
|
|
|
33
41
|
}
|
|
34
42
|
/** Browser helper that never builds a whole-log Blob in application memory. */
|
|
35
43
|
export declare function downloadDshSessionLog(options: DshSessionDownloadOptions): Promise<'streamed' | 'navigated'>;
|
|
36
|
-
export declare const inject: readonly ["slots", "locale"];
|
|
44
|
+
export declare const inject: readonly ["slots", "locale", "uiConversation"];
|
|
37
45
|
/** Register Kiokuko's streaming Session-export browser surface. */
|
|
38
46
|
export declare function apply(ctx: DshClientContext): void;
|
|
39
47
|
export {};
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,UAAU,wBAAwB;IAChC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,CAAC,CAAA;IAC7G,QAAQ,EAAE;QAAE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACxC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAA;CAC3C;AAYD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAA;KAC3F,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,GAAG,OAAO,CAAA;QACtD,QAAQ,CACN,UAAU,EAAE;YACV,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;YACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,UAAU,wBAAwB;IAChC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,CAAC,CAAA;IAC7G,QAAQ,EAAE;QAAE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACxC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAA;CAC3C;AAYD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE;YAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;IACxF,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAA;KAC3F,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,GAAG,OAAO,CAAA;QACtD,QAAQ,CACN,UAAU,EAAE;YACV,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;YACrB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;YACpB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;YACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;YAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;YAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;YACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAChD,EACD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GACrD,OAAO,CAAA;KACX,CAAA;IACD,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IAChF,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAA;CACtI;AA0ED,+EAA+E;AAC/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAqBjH;AAuHD,eAAO,MAAM,MAAM,gDAAiD,CAAA;AAqKpE,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CA0BjD"}
|
|
@@ -3,15 +3,15 @@ import { type DshBoundaryCompletion, type DshBoundaryJob, type DshContinuationOu
|
|
|
3
3
|
export interface DshBoundaryWorkerOptions {
|
|
4
4
|
readonly runtime: Pick<DshRuntime, 'withDatabase'>;
|
|
5
5
|
/** One bounded job stage. It must be idempotent under lease recovery. */
|
|
6
|
-
readonly process: (job: DshBoundaryJob) => DshBoundaryCompletion | PromiseLike<DshBoundaryCompletion>;
|
|
6
|
+
readonly process: (job: DshBoundaryJob, signal: AbortSignal) => DshBoundaryCompletion | PromiseLike<DshBoundaryCompletion>;
|
|
7
7
|
/** Native durability barrier. Failure is fail-closed for delivery only. */
|
|
8
8
|
readonly flush: (job: DshBoundaryJob) => void | PromiseLike<void>;
|
|
9
9
|
/** Enqueue one deterministic plugin-owned message into the native Agent. */
|
|
10
10
|
readonly dispatch: (job: DshBoundaryJob, item: DshContinuationOutboxItem) => void | PromiseLike<void>;
|
|
11
11
|
/** Last durable gate before native delivery. */
|
|
12
|
-
readonly beforeDelivery?: (job: DshBoundaryJob, item: DshContinuationOutboxItem) => 'deliver' | 'waiting_user' | 'superseded' | PromiseLike<'deliver' | 'waiting_user' | 'superseded'>;
|
|
12
|
+
readonly beforeDelivery?: (job: DshBoundaryJob, item: DshContinuationOutboxItem, signal: AbortSignal) => 'deliver' | 'waiting_user' | 'superseded' | PromiseLike<'deliver' | 'waiting_user' | 'superseded'>;
|
|
13
13
|
/** Best-effort notification after retries are durably exhausted. Never retried by this worker. */
|
|
14
|
-
readonly onWaitingUser?: (job: DshBoundaryJob, error: unknown) => boolean | PromiseLike<boolean>;
|
|
14
|
+
readonly onWaitingUser?: (job: DshBoundaryJob, error: unknown, signal: AbortSignal) => boolean | PromiseLike<boolean>;
|
|
15
15
|
readonly bindNativeAgent?: (sessionId: string, nativeAgent: object) => void;
|
|
16
16
|
readonly now?: () => string;
|
|
17
17
|
}
|
|
@@ -24,7 +24,10 @@ export declare class DshBoundaryWorker {
|
|
|
24
24
|
#private;
|
|
25
25
|
constructor(options: DshBoundaryWorkerOptions);
|
|
26
26
|
kick(sessionId?: string, nativeAgent?: object): void;
|
|
27
|
+
cancelSession(sessionId: string): void;
|
|
27
28
|
whenIdle(): Promise<void>;
|
|
28
29
|
dispose(): Promise<void>;
|
|
29
30
|
}
|
|
31
|
+
/** Uncooperative question adapters cannot hold shutdown or a newer user turn. */
|
|
32
|
+
export declare function abortable<T>(value: T | PromiseLike<T>, signal: AbortSignal): Promise<T>;
|
|
30
33
|
//# sourceMappingURL=boundary-worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary-worker.d.ts","sourceRoot":"","sources":["../../src/dsh/boundary-worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"boundary-worker.d.ts","sourceRoot":"","sources":["../../src/dsh/boundary-worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC/B,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAClD,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,KAAK,qBAAqB,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAA;IAC1H,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACjE,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,yBAAyB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACrG,gDAAgD;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,WAAW,KAChB,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC,SAAS,GAAG,cAAc,GAAG,YAAY,CAAC,CAAA;IACvG,kGAAkG;IAClG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACrH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAchB,OAAO,EAAE,wBAAwB;IAW7C,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAapD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAuGhC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAOvF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { withImmediateTransaction } from '../db/transaction.js';
|
|
3
|
-
import { claimBoundaryJobInTransaction, completeBoundaryJobInTransaction, failBoundaryJobInTransaction, markOutboxDispatchedInTransaction, readPendingOutbox, } from './turn-process.js';
|
|
3
|
+
import { claimBoundaryJobInTransaction, completeBoundaryJobInTransaction, failBoundaryJobInTransaction, markOutboxDispatchedInTransaction, readPendingOutbox, nextBoundaryWakeAt, } from './turn-process.js';
|
|
4
4
|
/**
|
|
5
5
|
* Durable, no-idle outbox driver. `agent/turn-stopping` only calls `kick`;
|
|
6
6
|
* confirmation, verification, advisory, context, and delivery run as separate
|
|
@@ -15,7 +15,8 @@ export class DshBoundaryWorker {
|
|
|
15
15
|
#onWaitingUser;
|
|
16
16
|
#now;
|
|
17
17
|
#bindNativeAgent;
|
|
18
|
-
#
|
|
18
|
+
#tails = new Map();
|
|
19
|
+
#controllers = new Map();
|
|
19
20
|
#disposed = false;
|
|
20
21
|
#retryTimers = new Map();
|
|
21
22
|
constructor(options) {
|
|
@@ -35,12 +36,17 @@ export class DshBoundaryWorker {
|
|
|
35
36
|
this.#bindNativeAgent?.(sessionId, nativeAgent);
|
|
36
37
|
if (sessionId === undefined)
|
|
37
38
|
return;
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.#
|
|
42
|
-
}
|
|
43
|
-
this.#
|
|
39
|
+
const tail = (this.#tails.get(sessionId) ?? Promise.resolve())
|
|
40
|
+
.then(() => this.#drain(sessionId)).catch(() => {
|
|
41
|
+
// A failed claim must not permanently lose the durable wake-up.
|
|
42
|
+
this.#scheduleRetry(sessionId, new Date(Date.parse(this.#now()) + 1_000).toISOString());
|
|
43
|
+
});
|
|
44
|
+
this.#tails.set(sessionId, tail);
|
|
45
|
+
void tail.finally(() => { if (this.#tails.get(sessionId) === tail)
|
|
46
|
+
this.#tails.delete(sessionId); });
|
|
47
|
+
}
|
|
48
|
+
cancelSession(sessionId) {
|
|
49
|
+
this.#controllers.get(sessionId)?.abort(new Error('Boundary superseded or disposed'));
|
|
44
50
|
}
|
|
45
51
|
#scheduleRetry(sessionId, retryAt) {
|
|
46
52
|
if (this.#disposed)
|
|
@@ -60,8 +66,30 @@ export class DshBoundaryWorker {
|
|
|
60
66
|
while (!this.#disposed) {
|
|
61
67
|
const ownerNonce = randomUUID();
|
|
62
68
|
const job = await this.#runtime.withDatabase((database) => withImmediateTransaction(database, () => (claimBoundaryJobInTransaction(database, ownerNonce, this.#now(), sessionId))));
|
|
63
|
-
|
|
69
|
+
// Disposal can race the asynchronous claim before a controller exists.
|
|
70
|
+
// Leave the durable lease recoverable; never start new work after shutdown.
|
|
71
|
+
if (this.#disposed)
|
|
72
|
+
return;
|
|
73
|
+
if (job === undefined) {
|
|
74
|
+
const next = await this.#runtime.withDatabase(database => nextBoundaryWakeAt(database, sessionId));
|
|
75
|
+
if (next !== undefined)
|
|
76
|
+
this.#scheduleRetry(sessionId, next);
|
|
64
77
|
return;
|
|
78
|
+
}
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const { signal } = controller;
|
|
81
|
+
this.#controllers.set(sessionId, controller);
|
|
82
|
+
// User questions can outlive a job lease. Renew only while we own it.
|
|
83
|
+
const heartbeat = setInterval(() => {
|
|
84
|
+
void this.#runtime.withDatabase(database => {
|
|
85
|
+
const changed = database.prepare(`UPDATE dsh_boundary_jobs SET lease_expires_at = ?
|
|
86
|
+
WHERE job_id = ? AND status = 'processing' AND owner_nonce = ? RETURNING job_id`)
|
|
87
|
+
.get(new Date(Date.parse(this.#now()) + 60_000).toISOString(), job.jobId, job.ownerNonce);
|
|
88
|
+
if (changed === undefined)
|
|
89
|
+
controller.abort(new Error('Boundary lease lost'));
|
|
90
|
+
}).catch(error => controller.abort(error));
|
|
91
|
+
}, 20_000);
|
|
92
|
+
heartbeat.unref?.();
|
|
65
93
|
try {
|
|
66
94
|
let completion;
|
|
67
95
|
if (job.kind === 'delivery') {
|
|
@@ -71,37 +99,38 @@ export class DshBoundaryWorker {
|
|
|
71
99
|
completion = { kind: 'superseded' };
|
|
72
100
|
}
|
|
73
101
|
else {
|
|
74
|
-
const gate = await this.#beforeDelivery?.(job, outbox) ?? 'deliver';
|
|
102
|
+
const gate = await abortable(this.#beforeDelivery?.(job, outbox, signal) ?? 'deliver', signal);
|
|
75
103
|
if (gate !== 'deliver') {
|
|
76
104
|
completion = { kind: gate };
|
|
77
105
|
}
|
|
78
106
|
else {
|
|
79
|
-
const deliveryItem = await this.#runtime.withDatabase((database) => readPendingOutbox(database, job.dshSessionId)
|
|
80
|
-
.find((item) => item.receiptId === job.receiptId));
|
|
81
|
-
if (deliveryItem === undefined) {
|
|
82
|
-
completion = { kind: 'superseded' };
|
|
83
|
-
await this.#runtime.withDatabase((database) => withImmediateTransaction(database, () => {
|
|
84
|
-
completeBoundaryJobInTransaction(database, job, completion, this.#now());
|
|
85
|
-
}));
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
107
|
await this.#flush(job);
|
|
89
|
-
|
|
90
|
-
await this.#runtime.withDatabase(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
108
|
+
signal.throwIfAborted();
|
|
109
|
+
const delivered = await this.#runtime.withDatabase(async (database) => {
|
|
110
|
+
const owned = database.prepare(`SELECT job_id FROM dsh_boundary_jobs
|
|
111
|
+
WHERE job_id = ? AND status = 'processing' AND owner_nonce = ?`).get(job.jobId, job.ownerNonce);
|
|
112
|
+
const fresh = readPendingOutbox(database, job.dshSessionId).find(item => item.receiptId === job.receiptId);
|
|
113
|
+
if (!owned || !fresh || signal.aborted)
|
|
114
|
+
return false;
|
|
115
|
+
// No await between the last authoritative check and native enqueue.
|
|
116
|
+
await this.#dispatch(job, fresh);
|
|
117
|
+
markOutboxDispatchedInTransaction(database, fresh.continuationId, this.#now());
|
|
118
|
+
return true;
|
|
119
|
+
});
|
|
120
|
+
completion = { kind: delivered ? 'completed' : 'superseded' };
|
|
94
121
|
}
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
124
|
else {
|
|
98
|
-
completion = await this.#process(job);
|
|
125
|
+
completion = await abortable(this.#process(job, signal), signal);
|
|
99
126
|
}
|
|
100
127
|
await this.#runtime.withDatabase((database) => withImmediateTransaction(database, () => {
|
|
101
128
|
completeBoundaryJobInTransaction(database, job, completion, this.#now());
|
|
102
129
|
}));
|
|
103
130
|
}
|
|
104
131
|
catch (error) {
|
|
132
|
+
if (signal.aborted)
|
|
133
|
+
return;
|
|
105
134
|
let failure;
|
|
106
135
|
try {
|
|
107
136
|
await this.#runtime.withDatabase((database) => withImmediateTransaction(database, () => {
|
|
@@ -115,23 +144,46 @@ export class DshBoundaryWorker {
|
|
|
115
144
|
if (failure?.kind === 'retry')
|
|
116
145
|
this.#scheduleRetry(job.dshSessionId, failure.retryAt);
|
|
117
146
|
if (failure?.kind === 'waiting_user') {
|
|
147
|
+
clearInterval(heartbeat);
|
|
118
148
|
try {
|
|
119
|
-
if (await this.#onWaitingUser?.(job, error))
|
|
149
|
+
if (await abortable(this.#onWaitingUser?.(job, error, signal) ?? false, signal))
|
|
120
150
|
this.kick(job.dshSessionId);
|
|
121
151
|
}
|
|
122
152
|
catch { /* durable wait is authoritative */ }
|
|
123
153
|
}
|
|
124
154
|
return;
|
|
125
155
|
}
|
|
156
|
+
finally {
|
|
157
|
+
clearInterval(heartbeat);
|
|
158
|
+
if (this.#controllers.get(sessionId) === controller)
|
|
159
|
+
this.#controllers.delete(sessionId);
|
|
160
|
+
}
|
|
126
161
|
}
|
|
127
162
|
}
|
|
128
|
-
async whenIdle() {
|
|
163
|
+
async whenIdle() {
|
|
164
|
+
while (this.#tails.size > 0)
|
|
165
|
+
await Promise.all([...this.#tails.values()]);
|
|
166
|
+
}
|
|
129
167
|
async dispose() {
|
|
130
168
|
this.#disposed = true;
|
|
169
|
+
for (const controller of this.#controllers.values())
|
|
170
|
+
controller.abort(new Error('Boundary worker disposed'));
|
|
131
171
|
for (const timer of this.#retryTimers.values())
|
|
132
172
|
clearTimeout(timer);
|
|
133
173
|
this.#retryTimers.clear();
|
|
134
|
-
await this
|
|
174
|
+
await this.whenIdle();
|
|
135
175
|
}
|
|
136
176
|
}
|
|
177
|
+
/** Uncooperative question adapters cannot hold shutdown or a newer user turn. */
|
|
178
|
+
export function abortable(value, signal) {
|
|
179
|
+
return new Promise((resolve, reject) => {
|
|
180
|
+
const aborted = () => reject(signal.reason);
|
|
181
|
+
if (signal.aborted) {
|
|
182
|
+
reject(signal.reason);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
signal.addEventListener('abort', aborted, { once: true });
|
|
186
|
+
Promise.resolve(value).then(resolve, reject).finally(() => signal.removeEventListener('abort', aborted));
|
|
187
|
+
});
|
|
188
|
+
}
|
|
137
189
|
//# sourceMappingURL=boundary-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary-worker.js","sourceRoot":"","sources":["../../src/dsh/boundary-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EACL,6BAA6B,EAC7B,gCAAgC,EAChC,4BAA4B,EAC5B,iCAAiC,EACjC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"boundary-worker.js","sourceRoot":"","sources":["../../src/dsh/boundary-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DshRuntime } from './runtime.js';
|
|
2
|
+
import type { DshLogEvent } from './session-memory-finalizer.js';
|
|
3
|
+
import type { EnnoRunSnapshot } from '../enno-oduno/types.js';
|
|
4
|
+
export declare const DSH_COMPLETION_REPORT_EVENT = "kiokuko/completion-report";
|
|
5
|
+
interface ReportSession {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
snapshotEvents(): readonly DshLogEvent[];
|
|
8
|
+
append(type: string, data: unknown, options: {
|
|
9
|
+
ignorable: true;
|
|
10
|
+
}): {
|
|
11
|
+
seq: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Recorded facts only; a missing model response is never interpreted as failed implementation. */
|
|
15
|
+
export declare function completionReportText(snapshot: EnnoRunSnapshot): string;
|
|
16
|
+
/** Flush-before-ack outbox. Native event identity makes crash replay harmless. */
|
|
17
|
+
export declare class DshCompletionReporter {
|
|
18
|
+
#private;
|
|
19
|
+
private readonly runtime;
|
|
20
|
+
private readonly flush;
|
|
21
|
+
constructor(runtime: Pick<DshRuntime, 'withDatabase'>, flush: (session: object) => PromiseLike<unknown>);
|
|
22
|
+
deliver(session: ReportSession): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=completion-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-report.d.ts","sourceRoot":"","sources":["../../src/dsh/completion-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,eAAO,MAAM,2BAA2B,8BAA8B,CAAA;AAEtE,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,cAAc,IAAI,SAAS,WAAW,EAAE,CAAA;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CACnF;AAMD,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAiBtE;AAED,kFAAkF;AAClF,qBAAa,qBAAqB;;IAEpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAoC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAjE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAmB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC;IAEzI,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA8C/C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readEnnoSnapshot } from '../enno-oduno/store.js';
|
|
2
|
+
import { canonicalContentHash } from '../serialization/validate.js';
|
|
3
|
+
export const DSH_COMPLETION_REPORT_EVENT = 'kiokuko/completion-report';
|
|
4
|
+
function record(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null ? value : undefined;
|
|
6
|
+
}
|
|
7
|
+
/** Recorded facts only; a missing model response is never interpreted as failed implementation. */
|
|
8
|
+
export function completionReportText(snapshot) {
|
|
9
|
+
const ja = snapshot.userFacingLanguage === 'ja';
|
|
10
|
+
const done = snapshot.status === 'completed';
|
|
11
|
+
const heading = ja ? (done ? '依頼された作業は完了しました。' : '作業は未完了のまま停止しました。')
|
|
12
|
+
: (done ? 'The requested work is complete.' : 'Work stopped before completion.');
|
|
13
|
+
const lines = [heading, '', ja ? '記録済みの作業結果:' : 'Recorded work results:'];
|
|
14
|
+
for (const unit of snapshot.workUnits) {
|
|
15
|
+
lines.push(`- ${unit.workUnit.objective}: ${unit.status}${unit.result?.summary ? ` — ${unit.result.summary}` : ''}`);
|
|
16
|
+
if (unit.result?.changedPaths.length)
|
|
17
|
+
lines.push(` ${unit.result.changedPaths.join(', ')}`);
|
|
18
|
+
}
|
|
19
|
+
lines.push('', ja ? '最終検証:' : 'Final verification:');
|
|
20
|
+
for (const check of snapshot.finalEvidence)
|
|
21
|
+
lines.push(`- ${check.verifier.id}: ${check.status}`);
|
|
22
|
+
if (!snapshot.finalEvidence.length)
|
|
23
|
+
lines.push(ja ? '- 記録なし。検証成功とは判定していません。' : '- No recorded results; verification success is not assumed.');
|
|
24
|
+
if (snapshot.blocker)
|
|
25
|
+
lines.push('', snapshot.blocker);
|
|
26
|
+
if (snapshot.meditation)
|
|
27
|
+
lines.push('', snapshot.meditation.summary);
|
|
28
|
+
lines.push('', ja ? '最終回答が表示されなかったため、ホストの記録から結果を表示しています。' : 'The final response was missing; this report is provided from host records.');
|
|
29
|
+
return lines.join('\n').slice(0, 32_768);
|
|
30
|
+
}
|
|
31
|
+
/** Flush-before-ack outbox. Native event identity makes crash replay harmless. */
|
|
32
|
+
export class DshCompletionReporter {
|
|
33
|
+
runtime;
|
|
34
|
+
flush;
|
|
35
|
+
#active = new Map();
|
|
36
|
+
constructor(runtime, flush) {
|
|
37
|
+
this.runtime = runtime;
|
|
38
|
+
this.flush = flush;
|
|
39
|
+
}
|
|
40
|
+
deliver(session) {
|
|
41
|
+
const existing = this.#active.get(session.id);
|
|
42
|
+
if (existing)
|
|
43
|
+
return existing;
|
|
44
|
+
const done = this.#deliver(session).finally(() => this.#active.delete(session.id));
|
|
45
|
+
this.#active.set(session.id, done);
|
|
46
|
+
return done;
|
|
47
|
+
}
|
|
48
|
+
async #deliver(session) {
|
|
49
|
+
const pending = await this.runtime.withDatabase(database => database.prepare(`
|
|
50
|
+
SELECT report.run_id AS runId, report.native_turn AS nativeTurn,
|
|
51
|
+
contract.workspace, contract.orchestration_session_id AS orchestrationId
|
|
52
|
+
FROM dsh_completion_reports AS report JOIN enno_contracts AS contract ON contract.run_id = report.run_id
|
|
53
|
+
WHERE report.dsh_session_id = ? AND report.status = 'pending' ORDER BY report.native_turn
|
|
54
|
+
`).all(session.id));
|
|
55
|
+
for (const item of pending) {
|
|
56
|
+
const id = canonicalContentHash({ runId: item.runId, kind: DSH_COMPLETION_REPORT_EVENT });
|
|
57
|
+
const events = session.snapshotEvents();
|
|
58
|
+
const resultIndex = events.findIndex(event => event.type === 'tool/result' && record(event.data)?.turn === item.nativeTurn
|
|
59
|
+
&& JSON.stringify(event.data).includes('ennoOduno'));
|
|
60
|
+
let delivered = events.find(event => event.type === DSH_COMPLETION_REPORT_EVENT && record(event.data)?.reportId === id);
|
|
61
|
+
if (!delivered && resultIndex >= 0)
|
|
62
|
+
delivered = events.slice(resultIndex + 1).find(event => {
|
|
63
|
+
const data = record(event.data);
|
|
64
|
+
const message = record(data?.message);
|
|
65
|
+
return event.type === 'assistant/message' && data?.turn === item.nativeTurn && data?.interrupted !== true
|
|
66
|
+
&& Array.isArray(message?.content) && message.content.some(block => {
|
|
67
|
+
const value = record(block);
|
|
68
|
+
return value?.type === 'text' && typeof value.text === 'string' && value.text.trim().length > 0;
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
let seq = delivered?.seq;
|
|
72
|
+
if (seq === undefined) {
|
|
73
|
+
const snapshot = await this.runtime.withDatabase(database => readEnnoSnapshot(database, item));
|
|
74
|
+
// Re-read after the DB await: another native callback may have published the same report.
|
|
75
|
+
const replay = session.snapshotEvents().find(event => event.type === DSH_COMPLETION_REPORT_EVENT && record(event.data)?.reportId === id);
|
|
76
|
+
seq = replay?.seq ?? session.append(DSH_COMPLETION_REPORT_EVENT, {
|
|
77
|
+
reportId: id, text: completionReportText(snapshot), source: { kind: 'plugin', plugin: 'kiokuko-dsh' },
|
|
78
|
+
}, { ignorable: true }).seq;
|
|
79
|
+
}
|
|
80
|
+
await this.flush(session);
|
|
81
|
+
await this.runtime.withDatabase(database => {
|
|
82
|
+
database.prepare(`UPDATE dsh_completion_reports SET status = 'delivered', delivered_seq = ? WHERE run_id = ?`)
|
|
83
|
+
.run(seq, item.runId);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=completion-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-report.js","sourceRoot":"","sources":["../../src/dsh/completion-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-adapter.d.ts","sourceRoot":"","sources":["../../src/dsh/host-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAA;AAkBzB,OAAO,EAA0C,KAAK,MAAM,EAAgD,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEvK,OAAO,EAAqB,KAAK,eAAe,EAA+B,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"host-adapter.d.ts","sourceRoot":"","sources":["../../src/dsh/host-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAA;AAkBzB,OAAO,EAA0C,KAAK,MAAM,EAAgD,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEvK,OAAO,EAAqB,KAAK,eAAe,EAA+B,MAAM,sBAAsB,CAAA;AAiG3G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAClF,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9D;AAMD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAA;IACvC,oEAAoE;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAoOD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CA6uDtG;AAsBD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}
|