feat(coding-runtime): add managed Pi extension host
This commit is contained in:
1 parent
47159b3cbd
commit
3861c3286a
22 files changed
+1673
-16
No files matched your search
@@ -0,0 +1,44 @@
|
||||
// @vitest-environment node
|
||||
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { PiExtensionUiProjector } from '../../electron/coding-runtime/pi/extension-ui-projector';
|
||||
|
||||
describe('Pi extension UI projector', () => {
|
||||
it('projects registered UI safely and refuses stale editor revisions', () => {
|
||||
let draftRevision = 4;
|
||||
const projector = new PiExtensionUiProjector({
|
||||
getDraftRevision: () => draftRevision,
|
||||
knownWidgetKeys: ['makelore.runtime'],
|
||||
});
|
||||
projector.beginRun('conversation-a', 1, 'run-1');
|
||||
expect(projector.project('conversation-a', 1, 'run-1', {
|
||||
type: 'extension_ui_request', id: 'status', method: 'setStatus',
|
||||
statusKey: 'makelore.write-lease', statusText: '等待项目写入',
|
||||
})).toMatchObject({ kind: 'status', key: 'makelore.write-lease' });
|
||||
expect(projector.project('conversation-a', 1, 'run-1', {
|
||||
type: 'extension_ui_request', id: 'draft', method: 'set_editor_text', text: 'new text',
|
||||
})).toEqual({
|
||||
kind: 'editor-text', conversationId: 'conversation-a', text: 'new text', draftRevision: 4,
|
||||
});
|
||||
|
||||
draftRevision = 5;
|
||||
expect(projector.project('conversation-a', 1, 'run-1', {
|
||||
type: 'extension_ui_request', id: 'stale-draft', method: 'set_editor_text', text: 'overwrite',
|
||||
})).toBeNull();
|
||||
expect(projector.getDiagnostics()).toContainEqual({
|
||||
method: 'set_editor_text', reason: 'stale-draft-revision',
|
||||
});
|
||||
});
|
||||
|
||||
it('records bounded diagnostics instead of projecting unknown widget payloads', () => {
|
||||
const projector = new PiExtensionUiProjector({ getDraftRevision: () => 0 });
|
||||
projector.beginRun('conversation-a', 1, 'run-1');
|
||||
expect(projector.project('conversation-a', 1, 'run-1', {
|
||||
type: 'extension_ui_request', id: 'unknown', method: 'setWidget',
|
||||
widgetKey: 'third-party-widget', widgetLines: ['raw detail'],
|
||||
})).toBeNull();
|
||||
expect(projector.getDiagnostics()).toEqual([{
|
||||
method: 'setWidget', reason: 'unsupported-ui-method',
|
||||
}]);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user