chore: checkpoint turso and ai runtime work
This commit is contained in:
@@ -7,8 +7,16 @@
|
||||
|
||||
var connections = new Map();
|
||||
var sidebarRefreshQueues = new Map();
|
||||
var fileChangeQueues = new Map();
|
||||
var lastSource = '';
|
||||
var lastReason = '';
|
||||
var lastFileChangeDiagnostics = {
|
||||
source: '',
|
||||
changedCount: 0,
|
||||
droppedCount: 0,
|
||||
lastReaction: '',
|
||||
lastBatchSchema: ''
|
||||
};
|
||||
|
||||
function root() {
|
||||
return document.documentElement;
|
||||
@@ -21,6 +29,11 @@
|
||||
root().setAttribute('data-mnote-local-folder-event-bus-connections', String(connections.size));
|
||||
root().setAttribute('data-mnote-local-folder-event-bus-last-source', lastSource);
|
||||
root().setAttribute('data-mnote-local-folder-event-bus-last-reason', lastReason);
|
||||
root().setAttribute('data-mnote-file-change-service', 'ready');
|
||||
root().setAttribute('data-mnote-file-change-service-last-source', lastFileChangeDiagnostics.source || lastSource);
|
||||
root().setAttribute('data-mnote-file-change-service-last-count', String(lastFileChangeDiagnostics.changedCount || 0));
|
||||
root().setAttribute('data-mnote-file-change-service-dropped-count', String(lastFileChangeDiagnostics.droppedCount || 0));
|
||||
root().setAttribute('data-mnote-file-change-service-last-reaction', lastFileChangeDiagnostics.lastReaction || '');
|
||||
}
|
||||
|
||||
function normalizeRootUri(rootUri) {
|
||||
@@ -53,6 +66,375 @@
|
||||
return [String(value)].filter(Boolean);
|
||||
}
|
||||
|
||||
function safeNow() {
|
||||
return Date.now ? Date.now() : new Date().getTime();
|
||||
}
|
||||
|
||||
function decodeFileUriPath(rootUri) {
|
||||
var value = String(rootUri || '').trim();
|
||||
if (!value) return '';
|
||||
try {
|
||||
var url = new URL(value);
|
||||
if (url.protocol !== 'file:') return '';
|
||||
return decodeURIComponent(url.pathname || '').replace(/\/+$/, '');
|
||||
} catch (_) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeSlashes(value) {
|
||||
return String(value || '').trim().replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
function rootRelativePath(rawPath, rootUri) {
|
||||
var value = normalizeSlashes(rawPath).replace(/^file:\/\//, '');
|
||||
if (!value) return '';
|
||||
if (/^[A-Za-z]:\//.test(value) || value.charAt(0) === '/') {
|
||||
var rootPath = normalizeSlashes(decodeFileUriPath(rootUri));
|
||||
if (rootPath && (value === rootPath || value.indexOf(rootPath + '/') === 0)) {
|
||||
return value.slice(rootPath.length).replace(/^\/+/, '');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
return value.replace(/^\/+/, '');
|
||||
}
|
||||
|
||||
function localMarkdownDocumentId(relativePath) {
|
||||
var normalized = normalizeSlashes(relativePath).replace(/^\/+/, '');
|
||||
if (!/\.md(?:own)?$/i.test(normalized)) return '';
|
||||
return 'local-md:' + normalized.replace(/\//g, '~2F');
|
||||
}
|
||||
|
||||
function normalizeChangeType(item, fallback) {
|
||||
var raw = String(
|
||||
(item && (item.changeType || item.change_type || item.eventKind || item.event_kind || item.kind))
|
||||
|| fallback
|
||||
|| 'modified'
|
||||
).trim();
|
||||
if (/remove|delete/i.test(raw)) return 'deleted';
|
||||
if (/create/i.test(raw)) return 'created';
|
||||
if (/rename|name/i.test(raw)) return 'renamed';
|
||||
return 'modified';
|
||||
}
|
||||
|
||||
function resourceKindForPath(relativePath) {
|
||||
return /\.md(?:own)?$/i.test(String(relativePath || '')) ? 'markdown' : 'resource';
|
||||
}
|
||||
|
||||
function normalizeFileChangeItem(item, context) {
|
||||
var source = String((context && context.source) || (item && item.source) || 'watcher').trim() || 'watcher';
|
||||
var rootUri = normalizeRootUri((context && context.rootUri) || (item && item.rootUri));
|
||||
var workspaceId = normalizeWorkspaceId((context && context.workspaceId) || (item && item.workspaceId));
|
||||
var rawPath = typeof item === 'string'
|
||||
? item
|
||||
: String(item && (
|
||||
item.relativePath
|
||||
|| item.relative_path
|
||||
|| item.path
|
||||
|| item.sourcePath
|
||||
|| item.source_path
|
||||
|| item.filePath
|
||||
|| item.file_path
|
||||
) || '');
|
||||
var relativePath = rootRelativePath(rawPath, rootUri);
|
||||
if (!relativePath) {
|
||||
return { dropped: true, reason: 'outside_root_or_empty_path', rawPath: rawPath };
|
||||
}
|
||||
var eventKind = String(item && (item.eventKind || item.event_kind || item.kind || item.changeType || item.change_type) || '').trim();
|
||||
var documentId = String(item && (item.documentId || item.document_id) || '').trim() || localMarkdownDocumentId(relativePath);
|
||||
var observedFileVersion = String(item && (item.observedFileVersion || item.observed_file_version || '') || '').trim();
|
||||
var bufferFileVersion = String(item && (item.bufferFileVersion || item.buffer_file_version || '') || '').trim();
|
||||
var fileVersion = String(item && (item.fileVersion || item.file_version || '') || '').trim()
|
||||
|| observedFileVersion
|
||||
|| bufferFileVersion
|
||||
|| String(item && item.revision || (context && context.revision) || '').trim();
|
||||
return {
|
||||
schema: 'mnote.file_change.v1',
|
||||
rootUri: rootUri,
|
||||
workspaceId: workspaceId,
|
||||
relativePath: relativePath,
|
||||
documentId: documentId,
|
||||
resourceKind: String(item && (item.resourceKind || item.resource_kind) || resourceKindForPath(relativePath)),
|
||||
changeType: normalizeChangeType(item, eventKind),
|
||||
eventKind: eventKind,
|
||||
fileVersion: fileVersion,
|
||||
source: source,
|
||||
selfWriteEcho: Boolean(item && (item.selfWriteEcho || item.self_write_echo)),
|
||||
observedFileVersion: observedFileVersion,
|
||||
bufferFileVersion: bufferFileVersion,
|
||||
lastWriteIntentId: String(item && (item.lastWriteIntentId || item.last_write_intent_id || '') || '').trim(),
|
||||
lastSaveOperationId: String(item && (item.lastSaveOperationId || item.last_save_operation_id || '') || '').trim(),
|
||||
createdAt: Number(item && (item.createdAt || item.created_at) || safeNow())
|
||||
};
|
||||
}
|
||||
|
||||
function standardBatchToCompatPayload(batch) {
|
||||
return {
|
||||
schema: 'mnote.local_folder.watch_batch.v1',
|
||||
kind: 'watch_batch',
|
||||
sourceKind: 'local_folder',
|
||||
source: batch.source,
|
||||
rootUri: batch.rootUri,
|
||||
workspaceId: batch.workspaceId,
|
||||
revision: batch.revision,
|
||||
changedPaths: batch.changes.map(function(change) {
|
||||
return {
|
||||
relativePath: change.relativePath,
|
||||
documentId: change.documentId,
|
||||
kind: change.eventKind || change.changeType,
|
||||
eventKind: change.eventKind || change.changeType,
|
||||
changeType: change.changeType,
|
||||
revision: change.fileVersion || batch.revision,
|
||||
fileVersion: change.fileVersion,
|
||||
observedFileVersion: change.observedFileVersion,
|
||||
bufferFileVersion: change.bufferFileVersion,
|
||||
lastWriteIntentId: change.lastWriteIntentId,
|
||||
lastSaveOperationId: change.lastSaveOperationId,
|
||||
selfWriteEcho: change.selfWriteEcho,
|
||||
source: change.source
|
||||
};
|
||||
}),
|
||||
affectedParents: batch.affectedParents,
|
||||
eventKinds: Array.from(new Set(batch.changes.map(function(change) {
|
||||
return change.eventKind || change.changeType || '';
|
||||
}).filter(Boolean))),
|
||||
fallbackResync: batch.resyncRequired === true
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeFileChangeBatch(entry, event, payload, meta) {
|
||||
var revision = revisionOf(payload, event);
|
||||
var source = String((meta && meta.source) || payload.source || payload.sourceKind || 'watcher_sse').trim() || 'watcher_sse';
|
||||
var reason = String((meta && meta.reason) || payload.reason || 'watch_batch').trim() || 'watch_batch';
|
||||
var rootUri = normalizeRootUri((entry && entry.rootUri) || payload.rootUri);
|
||||
var workspaceId = normalizeWorkspaceId((entry && entry.workspaceId) || payload.workspaceId);
|
||||
var raw = []
|
||||
.concat(Array.isArray(payload.changedPaths) ? payload.changedPaths : [])
|
||||
.concat(Array.isArray(payload.changed_paths) ? payload.changed_paths : [])
|
||||
.concat(Array.isArray(payload.paths) ? payload.paths : [])
|
||||
.concat(Array.isArray(payload.events) ? payload.events : []);
|
||||
if (!raw.length && payload.relativePath) raw.push(payload);
|
||||
var dropped = [];
|
||||
var changes = [];
|
||||
raw.forEach(function(item) {
|
||||
var normalized = normalizeFileChangeItem(item, {
|
||||
source: source,
|
||||
rootUri: rootUri,
|
||||
workspaceId: workspaceId,
|
||||
revision: revision
|
||||
});
|
||||
if (normalized && normalized.dropped) {
|
||||
dropped.push(normalized);
|
||||
} else if (normalized) {
|
||||
changes.push(normalized);
|
||||
}
|
||||
});
|
||||
var affectedParents = collectAffectedParents(payload).map(function(parent) {
|
||||
return { relativePath: parent, reason: reason };
|
||||
});
|
||||
changes.forEach(function(change) {
|
||||
var parent = change.relativePath.indexOf('/') >= 0 ? change.relativePath.split('/').slice(0, -1).join('/') : '';
|
||||
if (!affectedParents.some(function(item) { return item.relativePath === parent; })) {
|
||||
affectedParents.push({ relativePath: parent, reason: reason });
|
||||
}
|
||||
});
|
||||
return {
|
||||
schema: 'mnote.file_change_batch.v1',
|
||||
rootUri: rootUri,
|
||||
workspaceId: workspaceId,
|
||||
source: source,
|
||||
reason: reason,
|
||||
changes: changes,
|
||||
affectedParents: affectedParents,
|
||||
revision: revision,
|
||||
dropped: dropped,
|
||||
resyncRequired: payload.fallbackResync === true
|
||||
|| payload.requiresResync === true
|
||||
|| payload.resyncRequired === true
|
||||
|| payload.resync_required === true,
|
||||
rawPayload: payload,
|
||||
bootstrap: entry && entry.bootstrap || null
|
||||
};
|
||||
}
|
||||
|
||||
function mergeFileChange(existing, change) {
|
||||
if (!existing) return change;
|
||||
return Object.assign({}, existing, change, {
|
||||
source: change.source || existing.source,
|
||||
selfWriteEcho: change.selfWriteEcho === true ? true : (change.selfWriteEcho === false ? false : existing.selfWriteEcho),
|
||||
observedFileVersion: change.observedFileVersion || existing.observedFileVersion,
|
||||
bufferFileVersion: change.bufferFileVersion || existing.bufferFileVersion,
|
||||
fileVersion: change.fileVersion || existing.fileVersion,
|
||||
createdAt: Math.max(Number(existing.createdAt || 0), Number(change.createdAt || 0))
|
||||
});
|
||||
}
|
||||
|
||||
function fileChangeQueueKey(batch) {
|
||||
return [batch.rootUri || '', batch.workspaceId || 'default'].join('#');
|
||||
}
|
||||
|
||||
function enqueueFileChangeBatch(batch) {
|
||||
if (!batch || !batch.rootUri) return;
|
||||
var key = fileChangeQueueKey(batch);
|
||||
var queue = fileChangeQueues.get(key);
|
||||
if (!queue) {
|
||||
queue = {
|
||||
rootUri: batch.rootUri,
|
||||
workspaceId: batch.workspaceId,
|
||||
sources: new Set(),
|
||||
reasons: new Set(),
|
||||
revisions: new Set(),
|
||||
changes: new Map(),
|
||||
affectedParents: new Map(),
|
||||
dropped: [],
|
||||
resyncRequired: false,
|
||||
bootstrap: batch.bootstrap || null,
|
||||
timer: 0
|
||||
};
|
||||
fileChangeQueues.set(key, queue);
|
||||
}
|
||||
if (batch.source) queue.sources.add(batch.source);
|
||||
if (batch.reason) queue.reasons.add(batch.reason);
|
||||
if (batch.revision) queue.revisions.add(String(batch.revision));
|
||||
queue.dropped = queue.dropped.concat(batch.dropped || []);
|
||||
queue.resyncRequired = queue.resyncRequired || batch.resyncRequired === true;
|
||||
(batch.changes || []).forEach(function(change) {
|
||||
var changeKey = [change.rootUri || batch.rootUri, change.relativePath, change.fileVersion || ''].join('#');
|
||||
queue.changes.set(changeKey, mergeFileChange(queue.changes.get(changeKey), change));
|
||||
});
|
||||
(batch.affectedParents || []).forEach(function(parent) {
|
||||
var relativePath = String(parent && parent.relativePath || parent || '');
|
||||
queue.affectedParents.set(relativePath, {
|
||||
relativePath: relativePath,
|
||||
reason: String(parent && parent.reason || batch.reason || 'file-change')
|
||||
});
|
||||
});
|
||||
if (!queue.timer) {
|
||||
queue.timer = window.setTimeout(function() {
|
||||
flushFileChangeQueue(key);
|
||||
}, 80);
|
||||
}
|
||||
}
|
||||
|
||||
function currentDocumentSessionState(change) {
|
||||
var snapshot = null;
|
||||
try {
|
||||
snapshot = window.__mnoteDebugDocumentSessions
|
||||
&& window.__mnoteDebugDocumentSessions.snapshot
|
||||
&& window.__mnoteDebugDocumentSessions.snapshot();
|
||||
} catch (_) {
|
||||
snapshot = null;
|
||||
}
|
||||
root().setAttribute('data-mnote-file-change-service-session-api', snapshot ? 'available' : 'unavailable');
|
||||
var sessions = Array.isArray(snapshot && snapshot.sessions) ? snapshot.sessions : [];
|
||||
return sessions.find(function(session) {
|
||||
if (!session || session.sourceKind !== 'local_folder') return false;
|
||||
if (change.rootUri && session.rootUri && change.rootUri !== session.rootUri) return false;
|
||||
if (change.documentId && session.documentId === change.documentId) return true;
|
||||
return false;
|
||||
}) || null;
|
||||
}
|
||||
|
||||
function reactionTypeForChange(change) {
|
||||
if (change.selfWriteEcho) return 'ignore_self_write_echo';
|
||||
if (change.resourceKind !== 'markdown') return 'refresh_resource_tab';
|
||||
var session = currentDocumentSessionState(change);
|
||||
if (session && /dirty|external/i.test(String(session.dirtyState || session.status || ''))) {
|
||||
return 'external_conflict_current_document';
|
||||
}
|
||||
if (session) return 'refresh_current_document';
|
||||
if (change.changeType === 'created' || change.changeType === 'deleted' || change.changeType === 'renamed') {
|
||||
return 'refresh_page_tree_projection';
|
||||
}
|
||||
return 'refresh_filetree_parents';
|
||||
}
|
||||
|
||||
function emitFileChangeReactions(detail) {
|
||||
var reactionTypes = new Set();
|
||||
(detail.fileChangeBatch.changes || []).forEach(function(change) {
|
||||
var type = reactionTypeForChange(change);
|
||||
reactionTypes.add(type);
|
||||
emit('mnote:file-change-reaction', {
|
||||
schema: 'mnote.file_change_reaction.v1',
|
||||
type: type,
|
||||
rootUri: detail.rootUri,
|
||||
workspaceId: detail.workspaceId,
|
||||
source: detail.source,
|
||||
change: change,
|
||||
batch: detail.fileChangeBatch
|
||||
});
|
||||
});
|
||||
if (detail.affectedParents && detail.affectedParents.length) {
|
||||
reactionTypes.add('refresh_filetree_parents');
|
||||
}
|
||||
lastFileChangeDiagnostics.lastReaction = Array.from(reactionTypes).join(',') || '';
|
||||
root().setAttribute('data-mnote-file-change-service-last-reaction', lastFileChangeDiagnostics.lastReaction);
|
||||
return reactionTypes;
|
||||
}
|
||||
|
||||
function flushFileChangeQueue(key) {
|
||||
var queue = fileChangeQueues.get(key);
|
||||
if (!queue) return;
|
||||
fileChangeQueues.delete(key);
|
||||
var sources = Array.from(queue.sources);
|
||||
var reasons = Array.from(queue.reasons);
|
||||
var revision = Array.from(queue.revisions).pop() || null;
|
||||
var batch = {
|
||||
schema: 'mnote.file_change_batch.v1',
|
||||
rootUri: queue.rootUri,
|
||||
workspaceId: queue.workspaceId,
|
||||
source: sources.join(',') || 'watcher',
|
||||
reason: reasons.join(',') || 'watch_batch',
|
||||
changes: Array.from(queue.changes.values()),
|
||||
affectedParents: Array.from(queue.affectedParents.values()),
|
||||
revision: revision,
|
||||
dropped: queue.dropped,
|
||||
resyncRequired: queue.resyncRequired
|
||||
};
|
||||
var compatPayload = standardBatchToCompatPayload(batch);
|
||||
var detail = {
|
||||
schema: 'mnote.local_folder.event_bus.watch_batch.v1',
|
||||
source: batch.source,
|
||||
reason: batch.reason,
|
||||
rootUri: batch.rootUri,
|
||||
workspaceId: batch.workspaceId,
|
||||
revision: batch.revision,
|
||||
payload: compatPayload,
|
||||
bootstrap: queue.bootstrap || null,
|
||||
changedPaths: compatPayload.changedPaths,
|
||||
affectedParents: batch.affectedParents,
|
||||
fileChangeBatch: batch,
|
||||
resyncRequired: batch.resyncRequired,
|
||||
viaEventBus: true
|
||||
};
|
||||
lastFileChangeDiagnostics = {
|
||||
source: batch.source,
|
||||
changedCount: batch.changes.length,
|
||||
droppedCount: batch.dropped.length,
|
||||
lastReaction: '',
|
||||
lastBatchSchema: batch.schema
|
||||
};
|
||||
setDiagnostics(batch.source, batch.reason);
|
||||
root().setAttribute('data-mnote-tree-live-revision', String(batch.revision || ''));
|
||||
root().setAttribute('data-mnote-file-change-service-last-schema', batch.schema);
|
||||
emit('mnote:file-change-batch', batch);
|
||||
emit('mnote:local-folder:watch-batch', detail);
|
||||
emit('tree:local-folder-watch-batch', detail);
|
||||
var reactionTypes = emitFileChangeReactions(detail);
|
||||
if (batch.affectedParents.length > 0 || reactionTypes.has('refresh_filetree_parents')) {
|
||||
emit('mnote:local-folder:filetree-parent-changed', detail);
|
||||
}
|
||||
if (batch.changes.length > 0) {
|
||||
emit('mnote:local-folder:document-changed', detail);
|
||||
emit('mnote:local-folder:resource-changed', detail);
|
||||
emit('mnote:local-folder:knowledge-rag-source-updated', detail);
|
||||
}
|
||||
queueSidebarRefresh(detail);
|
||||
if (batch.resyncRequired) {
|
||||
emit('mnote:local-folder:resync-required', detail);
|
||||
}
|
||||
}
|
||||
|
||||
function pathArrayOf(value) {
|
||||
if (!value) return [];
|
||||
var list = Array.isArray(value) ? value : [value];
|
||||
@@ -191,47 +573,7 @@
|
||||
}
|
||||
|
||||
function dispatchWatchBatch(entry, event, payload, meta) {
|
||||
var revision = revisionOf(payload, event);
|
||||
var changedPaths = collectChangedPaths(payload);
|
||||
var affectedParents = collectAffectedParents(payload);
|
||||
var source = String((meta && meta.source) || payload.source || 'watcher_sse').trim() || 'watcher_sse';
|
||||
var reason = String((meta && meta.reason) || payload.reason || 'watch_batch').trim() || 'watch_batch';
|
||||
var resyncRequired = payload.fallbackResync === true
|
||||
|| payload.requiresResync === true
|
||||
|| payload.resyncRequired === true
|
||||
|| payload.resync_required === true;
|
||||
var detail = {
|
||||
schema: 'mnote.local_folder.event_bus.watch_batch.v1',
|
||||
source: source,
|
||||
reason: reason,
|
||||
rootUri: entry.rootUri,
|
||||
workspaceId: entry.workspaceId,
|
||||
revision: revision,
|
||||
payload: payload,
|
||||
bootstrap: entry.bootstrap || null,
|
||||
changedPaths: collectChangedPathItems(payload, reason),
|
||||
affectedParents: pathItems(affectedParents, reason),
|
||||
resyncRequired: resyncRequired,
|
||||
viaEventBus: true
|
||||
};
|
||||
|
||||
setDiagnostics(source, reason);
|
||||
root().setAttribute('data-mnote-tree-live-revision', String(revision || ''));
|
||||
emit('mnote:local-folder:watch-batch', detail);
|
||||
emit('tree:local-folder-watch-batch', detail);
|
||||
|
||||
if (affectedParents.length > 0) {
|
||||
emit('mnote:local-folder:filetree-parent-changed', detail);
|
||||
}
|
||||
if (changedPaths.length > 0) {
|
||||
emit('mnote:local-folder:document-changed', detail);
|
||||
emit('mnote:local-folder:resource-changed', detail);
|
||||
emit('mnote:local-folder:knowledge-rag-source-updated', detail);
|
||||
}
|
||||
queueSidebarRefresh(detail);
|
||||
if (resyncRequired) {
|
||||
emit('mnote:local-folder:resync-required', detail);
|
||||
}
|
||||
enqueueFileChangeBatch(normalizeFileChangeBatch(entry, event, payload, meta));
|
||||
}
|
||||
|
||||
function closeEntry(entry) {
|
||||
@@ -326,6 +668,32 @@
|
||||
});
|
||||
}
|
||||
|
||||
function emitChangedFiles(detail) {
|
||||
var payload = detail && detail.payload && typeof detail.payload === 'object' ? detail.payload : {};
|
||||
var changedFiles = []
|
||||
.concat(Array.isArray(detail && detail.changedFiles) ? detail.changedFiles : [])
|
||||
.concat(Array.isArray(payload.changedFiles) ? payload.changedFiles : [])
|
||||
.concat(Array.isArray(payload.changed_files) ? payload.changed_files : []);
|
||||
if (!changedFiles.length) return;
|
||||
var rootUri = normalizeRootUri((detail && detail.rootUri) || payload.rootUri);
|
||||
var workspaceId = normalizeWorkspaceId((detail && detail.workspaceId) || payload.workspaceId);
|
||||
emitSyntheticWatchBatch({
|
||||
source: (detail && detail.source) || payload.source || 'changed_files_adapter',
|
||||
reason: (detail && detail.reason) || payload.reason || 'changed_files_adapter',
|
||||
rootUri: rootUri,
|
||||
workspaceId: workspaceId,
|
||||
payload: {
|
||||
schema: 'mnote.local_folder.watch_batch.v1',
|
||||
source: (detail && detail.source) || payload.source || 'changed_files_adapter',
|
||||
rootUri: rootUri,
|
||||
workspaceId: workspaceId,
|
||||
revision: (detail && detail.revision) || payload.revision || null,
|
||||
changedPaths: changedFiles,
|
||||
affectedParents: Array.isArray(detail && detail.affectedParents) ? detail.affectedParents : []
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function closeAll() {
|
||||
Array.from(connections.values()).forEach(function(entry) {
|
||||
closeEntry(entry);
|
||||
@@ -337,6 +705,7 @@
|
||||
window.__mnoteLocalFolderEventBus = {
|
||||
startLocalFolderWatcher: startLocalFolderWatcher,
|
||||
emitSyntheticWatchBatch: emitSyntheticWatchBatch,
|
||||
emitChangedFiles: emitChangedFiles,
|
||||
closeAll: closeAll,
|
||||
flushSidebarRefresh: function(rootUri) {
|
||||
flushSidebarRefresh(normalizeRootUri(rootUri));
|
||||
@@ -346,7 +715,8 @@
|
||||
return {
|
||||
connections: connections.size,
|
||||
lastSource: lastSource,
|
||||
lastReason: lastReason
|
||||
lastReason: lastReason,
|
||||
fileChange: Object.assign({}, lastFileChangeDiagnostics)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user