@@ -6,6 +6,7 @@ import * as Host from '../../core/host/host.js';
66import * as i18n from '../../core/i18n/i18n.js' ;
77import type * as Platform from '../../core/platform/platform.js' ;
88import * as SDK from '../../core/sdk/sdk.js' ;
9+ import * as Persistence from '../../models/persistence/persistence.js' ;
910import * as Workspace from '../../models/workspace/workspace.js' ;
1011import * as UI from '../../ui/legacy/legacy.js' ;
1112import * as LitHtml from '../../ui/lit-html/lit-html.js' ;
@@ -34,6 +35,7 @@ import {
3435 NetworkAgent ,
3536 RequestContext ,
3637} from './agents/NetworkAgent.js' ;
38+ import { PatchAgent , ProjectContext } from './agents/PatchAgent.js' ;
3739import { CallTreeContext , PerformanceAgent } from './agents/PerformanceAgent.js' ;
3840import { NodeContext , StylingAgent } from './agents/StylingAgent.js' ;
3941import styles from './aiAssistancePanel.css.js' ;
@@ -158,6 +160,13 @@ function createFileContext(file: Workspace.UISourceCode.UISourceCode|null): File
158160 return new FileContext ( file ) ;
159161}
160162
163+ function createProjectContext ( project : Persistence . FileSystemWorkspaceBinding . FileSystem | null ) : ProjectContext | null {
164+ if ( ! project ) {
165+ return null ;
166+ }
167+ return new ProjectContext ( project ) ;
168+ }
169+
161170function createRequestContext ( request : SDK . NetworkRequest . NetworkRequest | null ) : RequestContext | null {
162171 if ( ! request ) {
163172 return null ;
@@ -196,6 +205,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
196205 #currentAgent?: AiAgent < unknown > ;
197206
198207 #previousSameOriginContext?: ConversationContext < unknown > ;
208+ #project: ProjectContext | null = null ;
199209 #selectedFile: FileContext | null = null ;
200210 #selectedElement: NodeContext | null = null ;
201211 #selectedCallTree: CallTreeContext | null = null ;
@@ -330,6 +340,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
330340 agent = new PerformanceAgent ( options ) ;
331341 break ;
332342 }
343+ case AgentType . PATCH : {
344+ agent = new PatchAgent ( options ) ;
345+ break ;
346+ }
333347 }
334348
335349 if ( history ) {
@@ -421,6 +435,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
421435 this . #selectedCallTree =
422436 createCallTreeContext ( UI . Context . Context . instance ( ) . flavor ( TimelineUtils . AICallTree . AICallTree ) ) ,
423437 this . #selectedFile = createFileContext ( UI . Context . Context . instance ( ) . flavor ( Workspace . UISourceCode . UISourceCode ) ) ,
438+ this . #project =
439+ createProjectContext ( UI . Context . Context . instance ( ) . flavor ( Persistence . FileSystemWorkspaceBinding . FileSystem ) ) ,
424440 this . #viewProps = {
425441 ...this . #viewProps,
426442 agentType : this . #currentAgent?. type ,
@@ -441,6 +457,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
441457 TimelineUtils . AICallTree . AICallTree , this . #handleTraceEntryNodeFlavorChange) ;
442458 UI . Context . Context . instance ( ) . addFlavorChangeListener (
443459 Workspace . UISourceCode . UISourceCode , this . #handleUISourceCodeFlavorChange) ;
460+ UI . Context . Context . instance ( ) . addFlavorChangeListener (
461+ Persistence . FileSystemWorkspaceBinding . FileSystem , this . #handlePersistenceFileSystemChange) ;
444462 UI . Context . Context . instance ( ) . addFlavorChangeListener (
445463 ElementsPanel . ElementsPanel . ElementsPanel , this . #selectDefaultAgentIfNeeded, this ) ;
446464 UI . Context . Context . instance ( ) . addFlavorChangeListener (
@@ -566,6 +584,19 @@ export class AiAssistancePanel extends UI.Panel.Panel {
566584 this . #updateAgentState( this . #currentAgent) ;
567585 } ;
568586
587+ #handlePersistenceFileSystemChange =
588+ ( ev : Common . EventTarget . EventTargetEvent < Persistence . FileSystemWorkspaceBinding . FileSystem > ) : void => {
589+ const newProject = ev . data ;
590+ if ( ! newProject ) {
591+ return ;
592+ }
593+ if ( this . #project?. getItem ( ) === newProject ) {
594+ return ;
595+ }
596+ this . #project = new ProjectContext ( ev . data as Workspace . Workspace . Project ) ;
597+ this . #updateAgentState( this . #currentAgent) ;
598+ } ;
599+
569600 #handleAiAssistanceEnabledSettingChanged = ( ) : void => {
570601 const nextChatUiState = this . #getChatUiState( ) ;
571602 if ( this . #viewProps. state === nextChatUiState ) {
@@ -627,6 +658,11 @@ export class AiAssistancePanel extends UI.Panel.Panel {
627658
628659 let targetAgentType : AgentType | undefined ;
629660 switch ( actionId ) {
661+ case 'ai-assistance.filesystem' : {
662+ // TODO: metrics if needed.
663+ targetAgentType = AgentType . PATCH ;
664+ break ;
665+ }
630666 case 'freestyler.elements-floating-button' : {
631667 Host . userMetrics . actionTaken ( Host . UserMetrics . Action . AiAssistanceOpenedFromElementsPanelFloatingButton ) ;
632668 targetAgentType = AgentType . STYLING ;
@@ -806,6 +842,9 @@ export class AiAssistancePanel extends UI.Panel.Panel {
806842 case AgentType . PERFORMANCE :
807843 context = this . #selectedCallTree;
808844 break ;
845+ case AgentType . PATCH :
846+ context = this . #project;
847+ break ;
809848 }
810849 return context ;
811850 }
@@ -966,7 +1005,8 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
9661005 case 'drjones.network-panel-context' :
9671006 case 'drjones.performance-panel-context' :
9681007 case 'drjones.sources-floating-button' :
969- case 'drjones.sources-panel-context' : {
1008+ case 'drjones.sources-panel-context' :
1009+ case 'ai-assistance.filesystem' : {
9701010 void ( async ( ) => {
9711011 const view = UI . ViewManager . ViewManager . instance ( ) . view (
9721012 AiAssistancePanel . panelName ,
0 commit comments