Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2e404c8
Add job code apply coordination to AI assistant
lmac-1 Dec 29, 2025
fb98934
Add job code apply UI with multi-user coordination
lmac-1 Dec 29, 2025
c652038
Add Monaco diff editor infrastructure
lmac-1 Dec 31, 2025
9274483
Add PREVIEW button and auto-preview for job code suggestions
lmac-1 Dec 31, 2025
866c705
Add tests for AI code extraction and multi-user coordination
lmac-1 Jan 5, 2026
13417a4
Add tests for auto-preview and Monaco diff display
lmac-1 Jan 5, 2026
b0fa314
Fix auto-preview for new AI code responses
lmac-1 Jan 6, 2026
304506d
Make extract_code_from_markdown/1 public and update docs
lmac-1 Jan 6, 2026
974de71
Unify Monaco editor styling between main and diff editors
lmac-1 Jan 6, 2026
aa6e9da
Disable AI Assistant when viewing workflow snapshots
lmac-1 Jan 6, 2026
babdb9a
Close AI chat gracefully when switching workflow versions
lmac-1 Jan 6, 2026
84cdce6
Clear diff preview when closing AI chat panel
lmac-1 Jan 6, 2026
fc165df
Track message ID for AI job code apply coordination
lmac-1 Jan 6, 2026
78e8a5e
Fix context mutation and add error notification in AI Assistant
lmac-1 Jan 7, 2026
2714e5e
Fix memory leak and race conditions in AI code preview
lmac-1 Jan 7, 2026
3248e89
Fix Monaco diff editor disposal error when dismissing preview
lmac-1 Jan 7, 2026
250d251
Refactor Monaco diff dismissal to callback registration pattern
lmac-1 Jan 8, 2026
21c2b02
Extract tooltip content to variable in AIButton
lmac-1 Jan 8, 2026
866f248
Updates changelog
lmac-1 Jan 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ and this project adheres to

### Added

- AI Assistant can now preview and apply code suggestions directly to job code
with Monaco diff editor
[#3369](https://github.com/OpenFn/lightning/issues/3369)

### Changed

### Fixed
Expand Down
80 changes: 44 additions & 36 deletions assets/js/collaborative-editor/CollaborativeEditor.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { useMemo } from 'react';
import { useMemo, useRef } from 'react';

import { SocketProvider } from '../react/contexts/SocketProvider';
import { useURLState } from '#/react/lib/use-url-state';

import { SocketProvider } from '../react/contexts/SocketProvider';
import type { WithActionProps } from '../react/lib/with-props';

import { AIAssistantPanelWrapper } from './components/AIAssistantPanelWrapper';
import { BreadcrumbLink, BreadcrumbText } from './components/Breadcrumbs';
import type { MonacoHandle } from './components/CollaborativeMonaco';
import { Header } from './components/Header';
import { LoadingBoundary } from './components/LoadingBoundary';
import { Toaster } from './components/ui/Toaster';
Expand All @@ -14,6 +16,7 @@ import { VersionDropdown } from './components/VersionDropdown';
import { WorkflowEditor } from './components/WorkflowEditor';
import { CredentialModalProvider } from './contexts/CredentialModalContext';
import { LiveViewActionsProvider } from './contexts/LiveViewActionsContext';
import { MonacoRefProvider } from './contexts/MonacoRefContext';
import { SessionProvider } from './contexts/SessionProvider';
import { StoreProvider } from './contexts/StoreProvider';
import {
Expand Down Expand Up @@ -167,6 +170,9 @@ export const CollaborativeEditor: WithActionProps<
navigate: props.navigate,
};

// Monaco ref for diff preview - shared between FullScreenIDE and AIAssistantPanelWrapper
const monacoRef = useRef<MonacoHandle>(null);

return (
<KeyboardProvider>
<div
Expand All @@ -183,41 +189,43 @@ export const CollaborativeEditor: WithActionProps<
<StoreProvider>
<LiveViewActionsProvider actions={liveViewActions}>
<CredentialModalProvider>
<VersionDebugLogger />
<Toaster />
<div className="flex-1 min-h-0 overflow-hidden flex flex-col relative">
<BreadcrumbContent
workflowId={workflowId}
workflowName={workflowName}
isNewWorkflow={isNewWorkflow}
{...(projectId !== undefined && {
projectIdFallback: projectId,
})}
{...(projectName !== undefined && {
projectNameFallback: projectName,
})}
{...(projectEnv !== undefined && {
projectEnvFallback: projectEnv,
})}
{...(rootProjectId !== null && {
rootProjectIdFallback: rootProjectId,
})}
{...(rootProjectName !== null && {
rootProjectNameFallback: rootProjectName,
})}
/>
<div className="flex-1 min-h-0 overflow-hidden relative">
<LoadingBoundary>
<div className="h-full w-full">
<WorkflowEditor
parentProjectId={rootProjectId}
parentProjectName={rootProjectName}
/>
</div>
</LoadingBoundary>
<MonacoRefProvider monacoRef={monacoRef}>
<VersionDebugLogger />
<Toaster />
<div className="flex-1 min-h-0 overflow-hidden flex flex-col relative">
<BreadcrumbContent
workflowId={workflowId}
workflowName={workflowName}
isNewWorkflow={isNewWorkflow}
{...(projectId !== undefined && {
projectIdFallback: projectId,
})}
{...(projectName !== undefined && {
projectNameFallback: projectName,
})}
{...(projectEnv !== undefined && {
projectEnvFallback: projectEnv,
})}
{...(rootProjectId !== null && {
rootProjectIdFallback: rootProjectId,
})}
{...(rootProjectName !== null && {
rootProjectNameFallback: rootProjectName,
})}
/>
<div className="flex-1 min-h-0 overflow-hidden relative">
<LoadingBoundary>
<div className="h-full w-full">
<WorkflowEditor
parentProjectId={rootProjectId}
parentProjectName={rootProjectName}
/>
</div>
</LoadingBoundary>
</div>
</div>
</div>
<AIAssistantPanelWrapper />
<AIAssistantPanelWrapper />
</MonacoRefProvider>
</CredentialModalProvider>
</LiveViewActionsProvider>
</StoreProvider>
Expand Down
Loading