diff --git a/packages/libro-jupyter/src/libro-jupyter-model.ts b/packages/libro-jupyter/src/libro-jupyter-model.ts index 8a6b7806..85a64574 100644 --- a/packages/libro-jupyter/src/libro-jupyter-model.ts +++ b/packages/libro-jupyter/src/libro-jupyter-model.ts @@ -3,6 +3,7 @@ import type { VirtualizedManager } from '@difizen/libro-core'; import { ContentsManager, ExecutableNotebookModel, + isDisplayDataMsg, LibroKernelConnectionManager, ServerConnection, ServerManager, @@ -16,6 +17,7 @@ import { l10n } from '@difizen/mana-l10n'; import { ExecutedWithKernelCellModel, + libroArgsMimetype, LibroFileService, } from './libro-jupyter-protocol.js'; import { SaveFileErrorModal } from './toolbar/save-file-error.js'; @@ -81,6 +83,21 @@ export class LibroJupyterModel extends LibroModel implements ExecutableNotebookM this.modalService = modalService; this.dndAreaNullEnable = true; this.virtualizedManager = virtualizedManagerHelper.getOrCreate(this); + this.kcReady + .then(() => { + this.kernelConnection?.futureMessage((msg) => { + if (isDisplayDataMsg(msg) && libroArgsMimetype in msg.content.data) { + this.metadata = { + ...this.metadata, + args: msg.content.data[libroArgsMimetype], + }; + } + }); + return; + }) + .catch(() => { + return; + }); } get isKernelIdle() { diff --git a/packages/libro-jupyter/src/libro-jupyter-protocol.ts b/packages/libro-jupyter/src/libro-jupyter-protocol.ts index 723eddce..208ea1f4 100644 --- a/packages/libro-jupyter/src/libro-jupyter-protocol.ts +++ b/packages/libro-jupyter/src/libro-jupyter-protocol.ts @@ -57,3 +57,5 @@ export const ServerLaunchManager = Symbol('ServerLaunchManager'); export interface ServerLaunchManager { launch: () => Promise; } + +export const libroArgsMimetype = 'application/vnd.libro.args+json'; diff --git a/packages/libro-kernel/src/kernel/kernel-connection.ts b/packages/libro-kernel/src/kernel/kernel-connection.ts index 95f08b5f..3b92f992 100644 --- a/packages/libro-kernel/src/kernel/kernel-connection.ts +++ b/packages/libro-kernel/src/kernel/kernel-connection.ts @@ -222,6 +222,10 @@ export class KernelConnection implements IKernelConnection { return this.iopubMessageEmitter.event; } + get futureMessage(): ManaEvent> { + return this.futureMessageEmitter.event; + } + /** * A signal emitted for unhandled kernel message. * @@ -381,6 +385,7 @@ export class KernelConnection implements IKernelConnection { this.statusChangedEmitter.dispose(); this.onDisposedEmitter.dispose(); this.iopubMessageEmitter.dispose(); + this.futureMessageEmitter.dispose(); this.anyMessageEmitter.dispose(); this.pendingInputEmitter.dispose(); this.unhandledMessageEmitter.dispose(); @@ -1529,6 +1534,7 @@ export class KernelConnection implements IKernelConnection { const future = this._futures?.get(parentHeader.msg_id); if (future) { await future.handleMsg(msg); + this.futureMessageEmitter.fire(msg); this._assertCurrentMessage(msg); } else { // If the message was sent by us and was not iopub, it is orphaned. @@ -1756,6 +1762,9 @@ export class KernelConnection implements IKernelConnection { protected connectionStatusChangedEmitter = new Emitter(); protected onDisposedEmitter = new Emitter(); protected iopubMessageEmitter = new Emitter(); + protected futureMessageEmitter = new Emitter< + KernelMessage.IMessage + >(); protected anyMessageEmitter = new Emitter(); protected pendingInputEmitter = new Emitter(); protected unhandledMessageEmitter = new Emitter(); diff --git a/packages/libro-kernel/src/kernel/libro-kernel-protocol.ts b/packages/libro-kernel/src/kernel/libro-kernel-protocol.ts index a35ed10d..8a51cb22 100644 --- a/packages/libro-kernel/src/kernel/libro-kernel-protocol.ts +++ b/packages/libro-kernel/src/kernel/libro-kernel-protocol.ts @@ -774,6 +774,7 @@ export interface IKernelConnection extends ObservableDisposable { */ iopubMessage: Event; + futureMessage: Event>; /** * A signal emitted for unhandled non-iopub kernel messages that claimed to * be responses for messages we sent using this kernel object.