@theia/ai-chat 1.58.2 → 1.59.0-next.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/lib/browser/ai-chat-frontend-module.d.ts.map +1 -1
  2. package/lib/browser/ai-chat-frontend-module.js +10 -13
  3. package/lib/browser/ai-chat-frontend-module.js.map +1 -1
  4. package/lib/browser/ai-chat-preferences.d.ts +1 -0
  5. package/lib/browser/ai-chat-preferences.d.ts.map +1 -1
  6. package/lib/browser/ai-chat-preferences.js +12 -3
  7. package/lib/browser/ai-chat-preferences.js.map +1 -1
  8. package/lib/browser/change-set-file-element.d.ts +24 -6
  9. package/lib/browser/change-set-file-element.d.ts.map +1 -1
  10. package/lib/browser/change-set-file-element.js +105 -15
  11. package/lib/browser/change-set-file-element.js.map +1 -1
  12. package/lib/browser/change-set-file-resource.d.ts +40 -8
  13. package/lib/browser/change-set-file-resource.d.ts.map +1 -1
  14. package/lib/browser/change-set-file-resource.js +123 -37
  15. package/lib/browser/change-set-file-resource.js.map +1 -1
  16. package/lib/browser/change-set-file-service.d.ts +9 -3
  17. package/lib/browser/change-set-file-service.d.ts.map +1 -1
  18. package/lib/browser/change-set-file-service.js +35 -13
  19. package/lib/browser/change-set-file-service.js.map +1 -1
  20. package/lib/browser/context-file-variable-label-provider.d.ts +14 -0
  21. package/lib/browser/context-file-variable-label-provider.d.ts.map +1 -0
  22. package/lib/browser/context-file-variable-label-provider.js +63 -0
  23. package/lib/browser/context-file-variable-label-provider.js.map +1 -0
  24. package/lib/browser/context-variable-label-provider.d.ts +9 -0
  25. package/lib/browser/context-variable-label-provider.d.ts.map +1 -0
  26. package/lib/browser/context-variable-label-provider.js +55 -0
  27. package/lib/browser/context-variable-label-provider.js.map +1 -0
  28. package/lib/browser/file-chat-variable-contribution.d.ts +18 -0
  29. package/lib/browser/file-chat-variable-contribution.d.ts.map +1 -0
  30. package/lib/browser/file-chat-variable-contribution.js +135 -0
  31. package/lib/browser/file-chat-variable-contribution.js.map +1 -0
  32. package/lib/browser/frontend-chat-service.d.ts +10 -3
  33. package/lib/browser/frontend-chat-service.d.ts.map +1 -1
  34. package/lib/browser/frontend-chat-service.js +39 -19
  35. package/lib/browser/frontend-chat-service.js.map +1 -1
  36. package/lib/common/chat-agents.d.ts +47 -24
  37. package/lib/common/chat-agents.d.ts.map +1 -1
  38. package/lib/common/chat-agents.js +50 -19
  39. package/lib/common/chat-agents.js.map +1 -1
  40. package/lib/common/chat-history-entry.js +1 -1
  41. package/lib/common/chat-history-entry.js.map +1 -1
  42. package/lib/common/chat-model.d.ts +58 -35
  43. package/lib/common/chat-model.d.ts.map +1 -1
  44. package/lib/common/chat-model.js +96 -53
  45. package/lib/common/chat-model.js.map +1 -1
  46. package/lib/common/chat-service.d.ts +32 -12
  47. package/lib/common/chat-service.d.ts.map +1 -1
  48. package/lib/common/chat-service.js +77 -19
  49. package/lib/common/chat-service.js.map +1 -1
  50. package/lib/common/chat-tool-request-service.d.ts +5 -5
  51. package/lib/common/chat-tool-request-service.d.ts.map +1 -1
  52. package/lib/common/chat-tool-request-service.js.map +1 -1
  53. package/lib/common/custom-chat-agent.d.ts +7 -10
  54. package/lib/common/custom-chat-agent.d.ts.map +1 -1
  55. package/lib/common/custom-chat-agent.js +7 -11
  56. package/lib/common/custom-chat-agent.js.map +1 -1
  57. package/lib/common/index.d.ts +0 -3
  58. package/lib/common/index.d.ts.map +1 -1
  59. package/lib/common/index.js +0 -3
  60. package/lib/common/index.js.map +1 -1
  61. package/lib/common/parse-contents.d.ts +2 -2
  62. package/lib/common/parse-contents.d.ts.map +1 -1
  63. package/lib/common/parse-contents.js.map +1 -1
  64. package/lib/common/parse-contents.spec.d.ts.map +1 -1
  65. package/lib/common/parse-contents.spec.js.map +1 -1
  66. package/lib/common/response-content-matcher.d.ts +3 -3
  67. package/lib/common/response-content-matcher.d.ts.map +1 -1
  68. package/lib/common/response-content-matcher.js.map +1 -1
  69. package/package.json +12 -10
  70. package/src/browser/ai-chat-frontend-module.ts +14 -18
  71. package/src/browser/ai-chat-preferences.ts +13 -2
  72. package/src/browser/change-set-file-element.ts +99 -20
  73. package/src/browser/change-set-file-resource.ts +125 -39
  74. package/src/browser/change-set-file-service.ts +38 -16
  75. package/src/browser/context-file-variable-label-provider.ts +62 -0
  76. package/src/browser/context-variable-label-provider.ts +56 -0
  77. package/src/browser/file-chat-variable-contribution.ts +143 -0
  78. package/src/browser/frontend-chat-service.ts +40 -26
  79. package/src/common/chat-agents.ts +72 -27
  80. package/src/common/chat-history-entry.ts +1 -1
  81. package/src/common/chat-model.ts +138 -74
  82. package/src/common/chat-service.ts +96 -23
  83. package/src/common/chat-tool-request-service.ts +5 -5
  84. package/src/common/custom-chat-agent.ts +8 -20
  85. package/src/common/index.ts +0 -3
  86. package/src/common/parse-contents.spec.ts +2 -2
  87. package/src/common/parse-contents.ts +2 -2
  88. package/src/common/response-content-matcher.ts +3 -3
  89. package/lib/common/command-chat-agents.d.ts +0 -33
  90. package/lib/common/command-chat-agents.d.ts.map +0 -1
  91. package/lib/common/command-chat-agents.js +0 -329
  92. package/lib/common/command-chat-agents.js.map +0 -1
  93. package/lib/common/orchestrator-chat-agent.d.ts +0 -22
  94. package/lib/common/orchestrator-chat-agent.d.ts.map +0 -1
  95. package/lib/common/orchestrator-chat-agent.js +0 -167
  96. package/lib/common/orchestrator-chat-agent.js.map +0 -1
  97. package/lib/common/universal-chat-agent.d.ts +0 -16
  98. package/lib/common/universal-chat-agent.d.ts.map +0 -1
  99. package/lib/common/universal-chat-agent.js +0 -109
  100. package/lib/common/universal-chat-agent.js.map +0 -1
  101. package/src/common/command-chat-agents.ts +0 -354
  102. package/src/common/orchestrator-chat-agent.ts +0 -179
  103. package/src/common/universal-chat-agent.ts +0 -117
@@ -1 +1 @@
1
- {"version":3,"file":"parse-contents.spec.js","sourceRoot":"","sources":["../../src/common/parse-contents.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-contents.spec.js","sourceRoot":"","sources":["../../src/common/parse-contents.spec.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ChatRequestModelImpl, ChatResponseContent } from './chat-model';
2
- export type ResponseContentFactory = (content: string, request: ChatRequestModelImpl) => ChatResponseContent;
1
+ import { MutableChatRequestModel, ChatResponseContent } from './chat-model';
2
+ export type ResponseContentFactory = (content: string, request: MutableChatRequestModel) => ChatResponseContent;
3
3
  export declare const MarkdownContentFactory: ResponseContentFactory;
4
4
  /**
5
5
  * Default response content factory used if no other `ResponseContentMatcher` applies.
@@ -8,7 +8,7 @@ export declare const MarkdownContentFactory: ResponseContentFactory;
8
8
  * @see MarkdownChatResponseContentImpl
9
9
  */
10
10
  export declare class DefaultResponseContentFactory {
11
- create(content: string, request: ChatRequestModelImpl): ChatResponseContent;
11
+ create(content: string, request: MutableChatRequestModel): ChatResponseContent;
12
12
  }
13
13
  /**
14
14
  * Clients can contribute response content matchers to parse a chat response into specific
@@ -1 +1 @@
1
- {"version":3,"file":"response-content-matcher.d.ts","sourceRoot":"","sources":["../../src/common/response-content-matcher.ts"],"names":[],"mappings":"AAeA,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EAGtB,MAAM,cAAc,CAAC;AAGtB,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,mBAAmB,CAAC;AAE7G,eAAO,MAAM,sBAAsB,EAAE,sBACW,CAAC;AAEjD;;;;;GAKG;AACH,qBACa,6BAA6B;IACtC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;CAG9E;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,cAAc,EAAE,sBAAsB,CAAC;CAC1C;AAED,eAAO,MAAM,kBAAkB,EAAE,sBAQhC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,eAA2C,CAAC;AACvF,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC/C;AAED,qBACa,qCAAsC,YAAW,8BAA8B;IACxF,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAwB;CACtE"}
1
+ {"version":3,"file":"response-content-matcher.d.ts","sourceRoot":"","sources":["../../src/common/response-content-matcher.ts"],"names":[],"mappings":"AAeA,OAAO,EACH,uBAAuB,EACvB,mBAAmB,EAGtB,MAAM,cAAc,CAAC;AAGtB,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,KAAK,mBAAmB,CAAC;AAEhH,eAAO,MAAM,sBAAsB,EAAE,sBACW,CAAC;AAEjD;;;;;GAKG;AACH,qBACa,6BAA6B;IACtC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,mBAAmB;CAGjF;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,cAAc,EAAE,sBAAsB,CAAC;CAC1C;AAED,eAAO,MAAM,kBAAkB,EAAE,sBAQhC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,eAA2C,CAAC;AACvF,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC/C;AAED,qBACa,qCAAsC,YAAW,8BAA8B;IACxF,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAwB;CACtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"response-content-matcher.js","sourceRoot":"","sources":["../../src/common/response-content-matcher.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,6CAKsB;AACtB,4DAA0D;AAInD,MAAM,sBAAsB,GAA2B,CAAC,OAAe,EAAE,EAAE,CAC9E,IAAI,4CAA+B,CAAC,OAAO,CAAC,CAAC;AADpC,QAAA,sBAAsB,0BACc;AAEjD;;;;;GAKG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IACtC,MAAM,CAAC,OAAe,EAAE,OAA6B;QACjD,OAAO,IAAA,8BAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ,CAAA;AAJY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,sBAAU,GAAE;GACA,6BAA6B,CAIzC;AAkBY,QAAA,kBAAkB,GAA2B;IACtD,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,QAAQ;IACb,cAAc,EAAE,CAAC,OAAe,EAAE,EAAE;;QAChC,MAAM,QAAQ,GAAG,CAAA,MAAA,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,wCAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACU,QAAA,8BAA8B,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC;AAMhF,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;IAA3C;QACM,aAAQ,GAA6B,CAAC,0BAAkB,CAAC,CAAC;IACvE,CAAC;CAAA,CAAA;AAFY,sFAAqC;gDAArC,qCAAqC;IADjD,IAAA,sBAAU,GAAE;GACA,qCAAqC,CAEjD"}
1
+ {"version":3,"file":"response-content-matcher.js","sourceRoot":"","sources":["../../src/common/response-content-matcher.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,6CAKsB;AACtB,4DAA0D;AAInD,MAAM,sBAAsB,GAA2B,CAAC,OAAe,EAAE,EAAE,CAC9E,IAAI,4CAA+B,CAAC,OAAO,CAAC,CAAC;AADpC,QAAA,sBAAsB,0BACc;AAEjD;;;;;GAKG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IACtC,MAAM,CAAC,OAAe,EAAE,OAAgC;QACpD,OAAO,IAAA,8BAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ,CAAA;AAJY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,sBAAU,GAAE;GACA,6BAA6B,CAIzC;AAkBY,QAAA,kBAAkB,GAA2B;IACtD,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,QAAQ;IACb,cAAc,EAAE,CAAC,OAAe,EAAE,EAAE;;QAChC,MAAM,QAAQ,GAAG,CAAA,MAAA,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,wCAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACU,QAAA,8BAA8B,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC;AAMhF,IAAM,qCAAqC,GAA3C,MAAM,qCAAqC;IAA3C;QACM,aAAQ,GAA6B,CAAC,0BAAkB,CAAC,CAAC;IACvE,CAAC;CAAA,CAAA;AAFY,sFAAqC;gDAArC,qCAAqC;IADjD,IAAA,sBAAU,GAAE;GACA,qCAAqC,CAEjD"}
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "@theia/ai-chat",
3
- "version": "1.58.2",
3
+ "version": "1.59.0-next.62+9e43c93ad",
4
4
  "description": "Theia - AI Chat Extension",
5
5
  "dependencies": {
6
- "@theia/ai-core": "1.58.2",
7
- "@theia/ai-history": "1.58.2",
8
- "@theia/core": "1.58.2",
9
- "@theia/editor": "1.58.2",
10
- "@theia/filesystem": "1.58.2",
11
- "@theia/monaco": "1.58.2",
12
- "@theia/workspace": "1.58.2",
6
+ "@theia/ai-core": "1.59.0-next.62+9e43c93ad",
7
+ "@theia/ai-history": "1.59.0-next.62+9e43c93ad",
8
+ "@theia/core": "1.59.0-next.62+9e43c93ad",
9
+ "@theia/editor": "1.59.0-next.62+9e43c93ad",
10
+ "@theia/file-search": "1.59.0-next.62+9e43c93ad",
11
+ "@theia/filesystem": "1.59.0-next.62+9e43c93ad",
12
+ "@theia/monaco": "1.59.0-next.62+9e43c93ad",
13
+ "@theia/monaco-editor-core": "1.96.302",
14
+ "@theia/workspace": "1.59.0-next.62+9e43c93ad",
13
15
  "minimatch": "^5.1.0",
14
16
  "tslib": "^2.6.2"
15
17
  },
@@ -47,10 +49,10 @@
47
49
  "watch": "theiaext watch"
48
50
  },
49
51
  "devDependencies": {
50
- "@theia/ext-scripts": "1.58.2"
52
+ "@theia/ext-scripts": "1.58.0"
51
53
  },
52
54
  "nyc": {
53
55
  "extends": "../../configs/nyc.json"
54
56
  },
55
- "gitHead": "4af367c0a63547aff14a27c98d929ee77a22aafe"
57
+ "gitHead": "9e43c93ad61ea977db3974207bac5d7c1fd3ccd6"
56
58
  }
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { Agent, AgentService, AIVariableContribution } from '@theia/ai-core/lib/common';
18
18
  import { bindContributionProvider, ResourceResolver } from '@theia/core';
19
- import { FrontendApplicationContribution, PreferenceContribution } from '@theia/core/lib/browser';
19
+ import { FrontendApplicationContribution, LabelProviderContribution, PreferenceContribution } from '@theia/core/lib/browser';
20
20
  import { ContainerModule } from '@theia/core/shared/inversify';
21
21
  import {
22
22
  ChatAgent,
@@ -25,14 +25,12 @@ import {
25
25
  ChatRequestParser,
26
26
  ChatRequestParserImpl,
27
27
  ChatService,
28
- DefaultChatAgentId
28
+ ToolCallChatResponseContentFactory,
29
+ PinChatAgent
29
30
  } from '../common';
30
31
  import { ChatAgentsVariableContribution } from '../common/chat-agents-variable-contribution';
31
- import { CommandChatAgent } from '../common/command-chat-agents';
32
32
  import { CustomChatAgent } from '../common/custom-chat-agent';
33
- import { OrchestratorChatAgent, OrchestratorChatAgentId } from '../common/orchestrator-chat-agent';
34
33
  import { DefaultResponseContentFactory, DefaultResponseContentMatcherProvider, ResponseContentMatcherProvider } from '../common/response-content-matcher';
35
- import { UniversalChatAgent } from '../common/universal-chat-agent';
36
34
  import { aiChatPreferences } from './ai-chat-preferences';
37
35
  import { ChangeSetElementArgs, ChangeSetFileElement, ChangeSetFileElementFactory } from './change-set-file-element';
38
36
  import { AICustomAgentsFrontendApplicationContribution } from './custom-agent-frontend-application-contribution';
@@ -41,6 +39,9 @@ import { CustomAgentFactory } from './custom-agent-factory';
41
39
  import { ChatToolRequestService } from '../common/chat-tool-request-service';
42
40
  import { ChangeSetFileResourceResolver } from './change-set-file-resource';
43
41
  import { ChangeSetFileService } from './change-set-file-service';
42
+ import { ContextVariableLabelProvider } from './context-variable-label-provider';
43
+ import { ContextFileVariableLabelProvider } from './context-file-variable-label-provider';
44
+ import { FileChatVariableContribution } from './file-chat-variable-contribution';
44
45
 
45
46
  export default new ContainerModule(bind => {
46
47
  bindContributionProvider(bind, Agent);
@@ -50,7 +51,7 @@ export default new ContainerModule(bind => {
50
51
 
51
52
  bind(ChatAgentServiceImpl).toSelf().inSingletonScope();
52
53
  bind(ChatAgentService).toService(ChatAgentServiceImpl);
53
- bind(DefaultChatAgentId).toConstantValue({ id: OrchestratorChatAgentId });
54
+ bind(PinChatAgent).toConstantValue(true);
54
55
 
55
56
  bindContributionProvider(bind, ResponseContentMatcherProvider);
56
57
  bind(DefaultResponseContentMatcherProvider).toSelf().inSingletonScope();
@@ -65,18 +66,6 @@ export default new ContainerModule(bind => {
65
66
  bind(FrontendChatServiceImpl).toSelf().inSingletonScope();
66
67
  bind(ChatService).toService(FrontendChatServiceImpl);
67
68
 
68
- bind(OrchestratorChatAgent).toSelf().inSingletonScope();
69
- bind(Agent).toService(OrchestratorChatAgent);
70
- bind(ChatAgent).toService(OrchestratorChatAgent);
71
-
72
- bind(UniversalChatAgent).toSelf().inSingletonScope();
73
- bind(Agent).toService(UniversalChatAgent);
74
- bind(ChatAgent).toService(UniversalChatAgent);
75
-
76
- bind(CommandChatAgent).toSelf().inSingletonScope();
77
- bind(Agent).toService(CommandChatAgent);
78
- bind(ChatAgent).toService(CommandChatAgent);
79
-
80
69
  bind(PreferenceContribution).toConstantValue({ schema: aiChatPreferences });
81
70
 
82
71
  bind(CustomChatAgent).toSelf();
@@ -97,6 +86,11 @@ export default new ContainerModule(bind => {
97
86
  });
98
87
  bind(FrontendApplicationContribution).to(AICustomAgentsFrontendApplicationContribution).inSingletonScope();
99
88
 
89
+ bind(ContextVariableLabelProvider).toSelf().inSingletonScope();
90
+ bind(LabelProviderContribution).toService(ContextVariableLabelProvider);
91
+ bind(ContextFileVariableLabelProvider).toSelf().inSingletonScope();
92
+ bind(LabelProviderContribution).toService(ContextFileVariableLabelProvider);
93
+
100
94
  bind(ChangeSetFileService).toSelf().inSingletonScope();
101
95
  bind(ChangeSetFileElementFactory).toFactory(ctx => (args: ChangeSetElementArgs) => {
102
96
  const container = ctx.container.createChild();
@@ -106,4 +100,6 @@ export default new ContainerModule(bind => {
106
100
  });
107
101
  bind(ChangeSetFileResourceResolver).toSelf().inSingletonScope();
108
102
  bind(ResourceResolver).toService(ChangeSetFileResourceResolver);
103
+ bind(ToolCallChatResponseContentFactory).toSelf().inSingletonScope();
104
+ bind(AIVariableContribution).to(FileChatVariableContribution).inSingletonScope();
109
105
  });
@@ -15,17 +15,28 @@
15
15
  // *****************************************************************************
16
16
 
17
17
  import { AI_CORE_PREFERENCES_TITLE } from '@theia/ai-core/lib/browser/ai-core-preferences';
18
+ import { nls } from '@theia/core';
18
19
  import { PreferenceSchema } from '@theia/core/lib/browser/preferences/preference-contribution';
19
20
 
20
21
  export const DEFAULT_CHAT_AGENT_PREF = 'ai-features.chat.defaultChatAgent';
22
+ export const PIN_CHAT_AGENT_PREF = 'ai-features.chat.pinChatAgent';
21
23
 
22
24
  export const aiChatPreferences: PreferenceSchema = {
23
25
  type: 'object',
24
26
  properties: {
25
27
  [DEFAULT_CHAT_AGENT_PREF]: {
26
28
  type: 'string',
27
- description: 'Optional: <agent-name> of the Chat Agent that shall be invoked, if no agent is explicitly mentioned with @<agent-name> in the user query.\
28
- If no Default Agent is configured, Theia´s defaults will be applied.',
29
+ description: nls.localize('theia/ai/chat/defaultAgent/description',
30
+ 'Optional: <agent-name> of the Chat Agent that shall be invoked, if no agent is explicitly mentioned with @<agent-name> in the user query. \
31
+ If no Default Agent is configured, Theia´s defaults will be applied.'),
32
+ title: AI_CORE_PREFERENCES_TITLE,
33
+ },
34
+ [PIN_CHAT_AGENT_PREF]: {
35
+ type: 'boolean',
36
+ description: nls.localize('theia/ai/chat/pinChatAgent/description',
37
+ 'Enable agent pinning to automatically keep a mentioned chat agent active across prompts, reducing the need for repeated mentions.\
38
+ You can manually unpin or switch agents anytime.'),
39
+ default: true,
29
40
  title: AI_CORE_PREFERENCES_TITLE,
30
41
  }
31
42
  }
@@ -14,14 +14,17 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { URI } from '@theia/core';
17
+ import { DisposableCollection, Emitter, URI } from '@theia/core';
18
18
  import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
19
19
  import { ChangeSetElement, ChangeSetImpl } from '../common';
20
- import { createChangeSetFileUri } from './change-set-file-resource';
20
+ import { ChangeSetFileResourceResolver, createChangeSetFileUri, UpdatableReferenceResource } from './change-set-file-resource';
21
21
  import { ChangeSetFileService } from './change-set-file-service';
22
+ import { FileService } from '@theia/filesystem/lib/browser/file-service';
23
+ import { ConfirmDialog } from '@theia/core/lib/browser';
22
24
 
23
25
  export const ChangeSetFileElementFactory = Symbol('ChangeSetFileElementFactory');
24
26
  export type ChangeSetFileElementFactory = (elementProps: ChangeSetElementArgs) => ChangeSetFileElement;
27
+ type ChangeSetElementState = ChangeSetElement['state'];
25
28
 
26
29
  export const ChangeSetElementArgs = Symbol('ChangeSetElementArgs');
27
30
  export interface ChangeSetElementArgs extends Partial<ChangeSetElement> {
@@ -41,29 +44,84 @@ export interface ChangeSetElementArgs extends Partial<ChangeSetElement> {
41
44
  @injectable()
42
45
  export class ChangeSetFileElement implements ChangeSetElement {
43
46
 
47
+ static toReadOnlyUri(baseUri: URI, sessionId: string): URI {
48
+ return baseUri.withScheme('change-set-immutable').withAuthority(sessionId);
49
+ }
50
+
44
51
  @inject(ChangeSetElementArgs)
45
52
  protected readonly elementProps: ChangeSetElementArgs;
46
53
 
47
54
  @inject(ChangeSetFileService)
48
55
  protected readonly changeSetFileService: ChangeSetFileService;
49
56
 
50
- protected _state: 'pending' | 'applied' | 'discarded' | undefined;
57
+ @inject(FileService)
58
+ protected readonly fileService: FileService;
59
+
60
+ @inject(ChangeSetFileResourceResolver)
61
+ protected readonly resourceResolver: ChangeSetFileResourceResolver;
62
+
63
+ protected readonly toDispose = new DisposableCollection();
64
+ protected _state: ChangeSetElementState;
51
65
 
52
66
  protected originalContent: string | undefined;
53
67
 
68
+ protected readonly onDidChangeEmitter = new Emitter<void>();
69
+ readonly onDidChange = this.onDidChangeEmitter.event;
70
+ protected readOnlyResource: UpdatableReferenceResource;
71
+ protected changeResource: UpdatableReferenceResource;
72
+
54
73
  @postConstruct()
55
74
  init(): void {
75
+ this.getResources();
56
76
  this.obtainOriginalContent();
77
+ this.listenForOriginalFileChanges();
78
+ this.toDispose.push(this.onDidChangeEmitter);
57
79
  }
58
80
 
59
81
  protected async obtainOriginalContent(): Promise<void> {
60
82
  this.originalContent = await this.changeSetFileService.read(this.uri);
83
+ this.readOnlyResource.update({ contents: this.originalContent ?? '' });
84
+ if (this.state === 'applied') {
85
+
86
+ }
87
+ }
88
+
89
+ protected getResources(): void {
90
+ this.readOnlyResource = this.resourceResolver.tryGet(this.readOnlyUri) ?? this.resourceResolver.add(this.readOnlyUri, { autosaveable: false, readOnly: true });
91
+ let changed = this.resourceResolver.tryGet(this.changedUri);
92
+ if (changed) {
93
+ changed.update({ contents: this.targetState, onSave: content => this.writeChanges(content) });
94
+ } else {
95
+ changed = this.resourceResolver.add(this.changedUri, { contents: this.targetState, onSave: content => this.writeChanges(content), autosaveable: false });
96
+ }
97
+ this.changeResource = changed;
98
+ this.toDispose.pushAll([this.readOnlyResource, this.changeResource]);
99
+ }
100
+
101
+ protected listenForOriginalFileChanges(): void {
102
+ this.toDispose.push(this.fileService.onDidFilesChange(async event => {
103
+ if (!event.contains(this.uri)) { return; }
104
+ // If we are applied, the tricky thing becomes the question what to revert to; otherwise, what to apply.
105
+ const newContent = await this.changeSetFileService.read(this.uri).catch(() => '');
106
+ this.readOnlyResource.update({ contents: newContent });
107
+ if (newContent === this.originalContent) {
108
+ this.state = 'pending';
109
+ } else if (newContent === this.targetState) {
110
+ this.state = 'applied';
111
+ } else {
112
+ this.state = 'stale';
113
+ }
114
+ }));
61
115
  }
62
116
 
63
117
  get uri(): URI {
64
118
  return this.elementProps.uri;
65
119
  }
66
120
 
121
+ get readOnlyUri(): URI {
122
+ return ChangeSetFileElement.toReadOnlyUri(this.uri, this.elementProps.chatSessionId);
123
+ }
124
+
67
125
  get changedUri(): URI {
68
126
  return createChangeSetFileUri(this.elementProps.chatSessionId, this.uri);
69
127
  }
@@ -80,13 +138,15 @@ export class ChangeSetFileElement implements ChangeSetElement {
80
138
  return this.changeSetFileService.getAdditionalInfo(this.uri);
81
139
  }
82
140
 
83
- get state(): 'pending' | 'applied' | 'discarded' | undefined {
141
+ get state(): ChangeSetElementState {
84
142
  return this._state ?? this.elementProps.state;
85
143
  }
86
144
 
87
- protected set state(value: 'pending' | 'applied' | 'discarded' | undefined) {
88
- this._state = value;
89
- this.elementProps.changeSet.notifyChange();
145
+ protected set state(value: ChangeSetElementState) {
146
+ if (this._state !== value) {
147
+ this._state = value;
148
+ this.onDidChangeEmitter.fire();
149
+ }
90
150
  }
91
151
 
92
152
  get type(): 'add' | 'modify' | 'delete' | undefined {
@@ -107,31 +167,50 @@ export class ChangeSetFileElement implements ChangeSetElement {
107
167
 
108
168
  async openChange(): Promise<void> {
109
169
  this.changeSetFileService.openDiff(
110
- this.uri,
170
+ this.readOnlyUri,
111
171
  this.changedUri
112
172
  );
113
173
  }
114
174
 
115
- async accept(contents?: string): Promise<void> {
116
- this.state = 'applied';
117
- if (this.type === 'delete') {
118
- await this.changeSetFileService.delete(this.uri);
119
- this.state = 'applied';
120
- return;
175
+ async apply(contents?: string): Promise<void> {
176
+ if (!await this.confirm('Apply')) { return; }
177
+ if (!(await this.changeSetFileService.trySave(this.changedUri))) {
178
+ if (this.type === 'delete') {
179
+ await this.changeSetFileService.delete(this.uri);
180
+ this.state = 'applied';
181
+ } else {
182
+ await this.writeChanges(contents);
183
+ }
121
184
  }
185
+ this.changeSetFileService.closeDiff(this.readOnlyUri);
186
+ }
122
187
 
123
- await this.changeSetFileService.write(this.uri, contents !== undefined ? contents : this.targetState);
188
+ async writeChanges(contents?: string): Promise<void> {
189
+ await this.changeSetFileService.writeFrom(this.changedUri, this.uri, contents ?? this.targetState);
190
+ this.state = 'applied';
124
191
  }
125
192
 
126
- async discard(): Promise<void> {
127
- this.state = 'discarded';
193
+ async revert(): Promise<void> {
194
+ if (!await this.confirm('Revert')) { return; }
195
+ this.state = 'pending';
128
196
  if (this.type === 'add') {
129
197
  await this.changeSetFileService.delete(this.uri);
130
- return;
131
- }
132
- if (this.originalContent) {
198
+ } else if (this.originalContent) {
133
199
  await this.changeSetFileService.write(this.uri, this.originalContent);
134
200
  }
135
201
  }
136
202
 
203
+ async confirm(verb: string): Promise<boolean> {
204
+ if (this._state !== 'stale') { return true; }
205
+ await this.openChange();
206
+ const thing = await new ConfirmDialog({
207
+ title: `${verb} suggestion.`,
208
+ msg: `The file ${this.uri.path.toString()} has changed since this suggestion was created. Are you certain you wish to ${verb.toLowerCase()} the change?`
209
+ }).open(true);
210
+ return !!thing;
211
+ }
212
+
213
+ dispose(): void {
214
+ this.toDispose.dispose();
215
+ }
137
216
  }
@@ -14,61 +14,147 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { Resource, ResourceResolver, ResourceSaveOptions, URI } from '@theia/core';
18
- import { inject, injectable } from '@theia/core/shared/inversify';
19
- import { ChatService } from '../common';
20
- import { ChangeSetFileElement } from './change-set-file-element';
17
+ import { MutableResource, Reference, ReferenceMutableResource, Resource, ResourceResolver, URI } from '@theia/core';
18
+ import { injectable } from '@theia/core/shared/inversify';
21
19
 
22
20
  export const CHANGE_SET_FILE_RESOURCE_SCHEME = 'changeset-file';
23
- const QUERY = 'uri=';
21
+ export type ResourceInitializationOptions = Pick<Resource, 'autosaveable' | 'initiallyDirty' | 'readOnly'> & { contents?: string, onSave?: Resource['saveContents'] };
22
+ export type ResourceUpdateOptions = Pick<ResourceInitializationOptions, 'contents' | 'onSave'>;
24
23
 
25
24
  export function createChangeSetFileUri(chatSessionId: string, elementUri: URI): URI {
26
- return new URI(CHANGE_SET_FILE_RESOURCE_SCHEME + '://' + chatSessionId + '/' + elementUri.path).withQuery(QUERY + encodeURIComponent(elementUri.path.toString()));
25
+ return elementUri.withScheme(CHANGE_SET_FILE_RESOURCE_SCHEME).withAuthority(chatSessionId);
27
26
  }
28
27
 
29
- /**
30
- * A file resource within a chat's change set can be resolved with the following URI:
31
- * changeset-file:/<chat-session-id>?uri=<element-uri-without-scheme>
32
- */
33
- @injectable()
34
- export class ChangeSetFileResourceResolver implements ResourceResolver {
28
+ export class UpdatableReferenceResource extends ReferenceMutableResource {
29
+ static acquire(resource: UpdatableReferenceResource): UpdatableReferenceResource {
30
+ DisposableRefCounter.acquire(resource.reference);
31
+ return resource;
32
+ }
33
+
34
+ constructor(protected override reference: DisposableRefCounter<DisposableMutableResource>) {
35
+ super(reference);
36
+ }
37
+
38
+ update(options: ResourceUpdateOptions): void {
39
+ this.reference.object.update(options);
40
+ }
41
+
42
+ get readOnly(): Resource['readOnly'] {
43
+ return this.reference.object.readOnly;
44
+ }
45
+
46
+ get initiallyDirty(): boolean {
47
+ return this.reference.object.initiallyDirty;
48
+ }
49
+
50
+ get autosaveable(): boolean {
51
+ return this.reference.object.autosaveable;
52
+ }
53
+ }
54
+
55
+ export class DisposableMutableResource extends MutableResource {
56
+ onSave: Resource['saveContents'] | undefined;
57
+ constructor(uri: URI, protected readonly options?: ResourceInitializationOptions) {
58
+ super(uri);
59
+ this.onSave = options?.onSave;
60
+ this.contents = options?.contents ?? '';
61
+ }
62
+
63
+ get readOnly(): Resource['readOnly'] {
64
+ return this.options?.readOnly || !this.onSave;
65
+ }
66
+
67
+ get autosaveable(): boolean {
68
+ return this.options?.autosaveable !== false;
69
+ }
70
+
71
+ get initiallyDirty(): boolean {
72
+ return !!this.options?.initiallyDirty;
73
+ }
35
74
 
36
- @inject(ChatService)
37
- protected readonly chatService: ChatService;
75
+ override async saveContents(contents: string): Promise<void> {
76
+ if (this.options?.onSave) {
77
+ await this.options.onSave(contents);
78
+ this.update({ contents });
79
+ }
80
+ }
38
81
 
39
- async resolve(uri: URI): Promise<Resource> {
40
- if (uri.scheme !== CHANGE_SET_FILE_RESOURCE_SCHEME) {
41
- throw new Error('The given uri is not a change set file uri: ' + uri);
82
+ update(options: ResourceUpdateOptions): void {
83
+ if (options.contents !== undefined && options.contents !== this.contents) {
84
+ this.contents = options.contents;
85
+ this.fireDidChangeContents();
42
86
  }
87
+ if ('onSave' in options && options.onSave !== this.onSave) {
88
+ this.onSave = options.onSave;
89
+ }
90
+ }
43
91
 
44
- const chatSessionId = uri.authority;
45
- const session = this.chatService.getSession(chatSessionId);
46
- if (!session) {
47
- throw new Error('Chat session not found: ' + chatSessionId);
92
+ override dispose(): void {
93
+ this.onDidChangeContentsEmitter.dispose();
94
+ }
95
+ }
96
+
97
+ export class DisposableRefCounter<V = unknown> implements Reference<V> {
98
+ static acquire<V>(item: DisposableRefCounter<V>): DisposableRefCounter<V> {
99
+ item.refs++;
100
+ return item;
101
+ }
102
+ static create<V>(value: V, onDispose: () => void): DisposableRefCounter<V> {
103
+ return this.acquire(new this(value, onDispose));
104
+ }
105
+ readonly object: V;
106
+ protected refs = 0;
107
+ protected constructor(value: V, protected readonly onDispose: () => void) {
108
+ this.object = value;
109
+ }
110
+ dispose(): void {
111
+ this.refs--;
112
+ if (this.refs === 0) {
113
+ this.onDispose();
48
114
  }
115
+ }
116
+ }
117
+
118
+ @injectable()
119
+ export class ChangeSetFileResourceResolver implements ResourceResolver {
120
+ protected readonly cache = new Map<string, UpdatableReferenceResource>();
49
121
 
50
- const changeSet = session.model.changeSet;
51
- if (!changeSet) {
52
- throw new Error('Chat session has no change set: ' + chatSessionId);
122
+ add(uri: URI, options?: ResourceInitializationOptions): UpdatableReferenceResource {
123
+ const key = uri.toString();
124
+ if (this.cache.has(key)) {
125
+ throw new Error(`Resource ${key} already exists.`);
53
126
  }
127
+ const underlyingResource = new DisposableMutableResource(uri, options);
128
+ const ref = DisposableRefCounter.create(underlyingResource, () => {
129
+ underlyingResource.dispose();
130
+ this.cache.delete(key);
131
+ });
132
+ const refResource = new UpdatableReferenceResource(ref);
133
+ this.cache.set(key, refResource);
134
+ return refResource;
135
+ }
54
136
 
55
- const fileUri = decodeURIComponent(uri.query.toString().replace(QUERY, ''));
56
- const element = changeSet.getElements().find(e => e.uri.path.toString() === fileUri);
57
- if (!(element instanceof ChangeSetFileElement)) {
58
- throw new Error('Change set element not found: ' + fileUri);
137
+ tryGet(uri: URI): UpdatableReferenceResource | undefined {
138
+ try {
139
+ return this.resolve(uri);
140
+ } catch {
141
+ return undefined;
59
142
  }
143
+ }
60
144
 
61
- return {
62
- uri,
63
- readOnly: false,
64
- initiallyDirty: true,
65
- readContents: async () => element.targetState ?? '',
66
- saveContents: async (content: string, options?: ResourceSaveOptions): Promise<void> => {
67
- element.accept(content);
68
- },
69
- dispose: () => { }
70
- };
145
+ update(uri: URI, contents: string): void {
146
+ const key = uri.toString();
147
+ const resource = this.cache.get(key);
148
+ if (!resource) {
149
+ throw new Error(`No resource for ${key}.`);
150
+ }
151
+ resource.update({ contents });
71
152
  }
72
153
 
154
+ resolve(uri: URI): UpdatableReferenceResource {
155
+ const key = uri.toString();
156
+ const ref = this.cache.get(key);
157
+ if (!ref) { throw new Error(`No resource for ${key}.`); }
158
+ return UpdatableReferenceResource.acquire(ref);
159
+ }
73
160
  }
74
-