kiokuko-dsh 0.1.22 → 0.1.23

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 CHANGED
@@ -198,9 +198,31 @@ window.__ModuleLoader__.load({
198
198
  document.head.appendChild(style);
199
199
  return () => style.remove();
200
200
  }
201
- const inject = ['slots', 'locale'];
201
+ const inject = ['slots', 'locale', 'uiConversation'];
202
+ /** A plugin-owned result in chat, never forged as a model assistant message. */
203
+ const completionReportDefinition = {
204
+ kind: 'kiokuko-completion-report', target: 'chat',
205
+ match: (event) => event.type === 'kiokuko/completion-report' && typeof event.data.reportId === 'string' && typeof event.data.text === 'string'
206
+ ? { id: event.data.reportId, role: 'start' } : null,
207
+ start: (_context, match) => ({ seq: match.event.seq, text: match.event.data.text }),
208
+ update: (context) => context.state,
209
+ buildViewNode: (context) => context.state === undefined ? null : {
210
+ key: context.key, id: context.id, kind: 'kiokuko-completion-report', target: 'chat',
211
+ anchorSeq: context.state.seq, location: context.start?.location ?? { kind: 'session' },
212
+ visibility: 'visible', data: { text: context.state.text },
213
+ },
214
+ };
215
+ function CompletionReport(props) {
216
+ const node = props.node;
217
+ return jsx('section', { role: 'status', 'aria-live': 'polite',
218
+ style: { whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', padding: '12px 0' }, children: node.data.text });
219
+ }
202
220
  /** Register Kiokuko's streaming Session-export browser surface. */
203
221
  function apply(ctx) {
222
+ ctx.uiConversation.events.register(completionReportDefinition);
223
+ ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({
224
+ name: 'conversation.chat.node', key: 'kiokuko-completion-report', locale: LOCALE_NAMESPACE,
225
+ }, CompletionReport));
204
226
  const controller = new SessionLogDownloadController();
205
227
  ctx.effect(() => async () => controller.dispose(), 'kiokuko-dsh: browser download lifecycle');
206
228
  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,10 @@ interface DshClientContext {
21
26
  inject(name: string, register: () => unknown): unknown;
22
27
  register(definition: {
23
28
  readonly name: string;
24
- readonly id: string;
29
+ readonly id?: string;
30
+ readonly key?: string;
25
31
  readonly locale: string;
26
- readonly inject: () => Record<string, unknown>;
32
+ readonly inject?: () => Record<string, unknown>;
27
33
  }, component: (props: Record<string, unknown>) => unknown): unknown;
28
34
  };
29
35
  effect(setup: () => void | (() => void | Promise<void>), label: string): unknown;
@@ -33,7 +39,7 @@ interface DshClientContext {
33
39
  }
34
40
  /** Browser helper that never builds a whole-log Blob in application memory. */
35
41
  export declare function downloadDshSessionLog(options: DshSessionDownloadOptions): Promise<'streamed' | 'navigated'>;
36
- export declare const inject: readonly ["slots", "locale"];
42
+ export declare const inject: readonly ["slots", "locale", "uiConversation"];
37
43
  /** Register Kiokuko's streaming Session-export browser surface. */
38
44
  export declare function apply(ctx: DshClientContext): void;
39
45
  export {};
@@ -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;YACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;YACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAC/C,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;AAuED,+EAA+E;AAC/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAqBjH;AAuHD,eAAO,MAAM,MAAM,8BAA+B,CAAA;AAElD,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAkBjD"}
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,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;AAuED,+EAA+E;AAC/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAqBjH;AAuHD,eAAO,MAAM,MAAM,gDAAiD,CAAA;AAwBpE,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAsBjD"}
@@ -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,EAML,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,KAAK,qBAAqB,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAA;IACrG,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,KAC5B,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,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAChG,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;;gBAahB,OAAO,EAAE,wBAAwB;IAW7C,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAwF9C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAEzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
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
- #tail = Promise.resolve();
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 timer = this.#retryTimers.get(sessionId);
39
- if (timer !== undefined) {
40
- clearTimeout(timer);
41
- this.#retryTimers.delete(sessionId);
42
- }
43
- this.#tail = this.#tail.then(() => this.#drain(sessionId)).catch(() => undefined);
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
- if (job === undefined)
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
- await this.#dispatch(job, deliveryItem);
90
- await this.#runtime.withDatabase((database) => withImmediateTransaction(database, () => {
91
- markOutboxDispatchedInTransaction(database, deliveryItem.continuationId, this.#now());
92
- }));
93
- completion = { kind: 'completed' };
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() { await this.#tail; }
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.#tail;
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,GAIlB,MAAM,mBAAmB,CAAA;AAqB1B;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,QAAQ,CAAqC;IAC7C,QAAQ,CAAqC;IAC7C,MAAM,CAAmC;IACzC,SAAS,CAAsC;IAC/C,eAAe,CAA4C;IAC3D,cAAc,CAA2C;IACzD,IAAI,CAAc;IAClB,gBAAgB,CAA6C;IACtE,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IACxC,SAAS,GAAG,KAAK,CAAA;IACR,YAAY,GAAG,IAAI,GAAG,EAAyC,CAAA;IAExE,YAAY,OAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAA;QACjC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAA;QAC7C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAA;QAC3C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAA;QAC/C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC,SAAkB,EAAE,WAAoB;QAC3C,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,IAAI,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACzG,IAAI,SAAS,KAAK,SAAS;YAAE,OAAM;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACrC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACnF,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,OAAe;QAC/C,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACjD,IAAI,QAAQ,KAAK,SAAS;YAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACnC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;QACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAkB;QAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,UAAU,EAAE,CAAA;YAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAClG,6BAA6B,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAC5E,CAAC,CAAC,CAAA;YACH,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAM;YAC7B,IAAI,CAAC;gBACH,IAAI,UAAiC,CAAA;gBACrC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;yBACxG,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;oBACpD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;wBAC3F,UAAU,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;oBACrC,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,SAAS,CAAA;wBACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;4BACvB,UAAU,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;wBAC7B,CAAC;6BAAM,CAAC;4BACN,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;iCAC9G,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;4BACpD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gCAC/B,UAAU,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;gCACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE;oCACrF,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gCAC1E,CAAC,CAAC,CAAC,CAAA;gCACH,SAAQ;4BACV,CAAC;4BACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;4BACtB,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;4BACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE;gCACrF,iCAAiC,CAAC,QAAQ,EAAE,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;4BACvF,CAAC,CAAC,CAAC,CAAA;4BACH,UAAU,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;wBACpC,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACvC,CAAC;gBACD,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACrF,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC1E,CAAC,CAAC,CAAC,CAAA;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAoE,CAAA;gBACxE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE;wBACrF,OAAO,GAAG,4BAA4B,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;oBAC3E,CAAC,CAAC,CAAC,CAAA;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,oEAAoE;oBACpE,sDAAsD;gBACxD,CAAC;gBACD,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;gBACrF,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;oBACrC,IAAI,CAAC;wBACH,IAAI,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;4BAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;oBAC1E,CAAC;oBAAC,MAAM,CAAC,CAAC,mCAAmC,CAAC,CAAC;gBACjD,CAAC;gBACD,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,KAAoB,MAAM,IAAI,CAAC,KAAK,CAAA,CAAC,CAAC;IAEpD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;QACnE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;CACF"}
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;AA8F3G,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,CAkqDtG;AAsBD,OAAO,EAAE,wBAAwB,EAAE,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,CAyuDtG;AAsBD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}