@codingame/monaco-vscode-chat-service-override 26.1.0 → 26.1.2

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 (137) hide show
  1. package/package.json +5 -5
  2. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +4 -1
  3. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCustomizationDiagnosticsAction.d.ts +19 -7
  4. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCustomizationDiagnosticsAction.js +209 -57
  5. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +3 -3
  6. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
  7. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatImportExport.js +3 -3
  8. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatLanguageModelActions.js +13 -13
  9. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.js +6 -6
  10. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.js +10 -10
  11. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPromptNavigationActions.js +2 -2
  12. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.d.ts +33 -0
  13. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.js +255 -0
  14. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.js +8 -8
  15. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.js +11 -11
  16. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.js +12 -12
  17. package/vscode/src/vs/workbench/contrib/chat/browser/actions/codeBlockOperations.js +18 -18
  18. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +3 -3
  19. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +51 -51
  20. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +5 -5
  21. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +1 -1
  22. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjection.js +1 -1
  23. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +5 -5
  24. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.js +1 -1
  25. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionsExperiments.contribution.js +4 -4
  26. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +24 -24
  27. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccess.js +17 -17
  28. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccessActions.js +4 -4
  29. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +1 -1
  30. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/simpleBrowserEditorOverlay.js +19 -19
  31. package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +329 -145
  32. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +1 -1
  33. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +3 -3
  34. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +2 -2
  35. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +1 -1
  36. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +1 -1
  37. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +3 -3
  38. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +1 -1
  39. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookEditorIntegration.js +1 -1
  40. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.js +8 -8
  41. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditor.js +13 -13
  42. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +4 -4
  43. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.js +2 -2
  44. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +51 -51
  45. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatUsageWidget.js +10 -10
  46. package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +3 -3
  47. package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +30 -30
  48. package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
  49. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +16 -16
  50. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +10 -10
  51. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +24 -24
  52. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +13 -13
  53. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +58 -58
  54. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +12 -12
  55. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +6 -6
  56. package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +2 -2
  57. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/chatModeActions.js +6 -6
  58. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.d.ts +10 -0
  59. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +591 -0
  60. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.d.ts +48 -0
  61. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +162 -0
  62. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptCodingAgentActionOverlay.js +2 -2
  63. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptFileActions.js +2 -0
  64. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.js +30 -15
  65. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptUrlHandler.js +8 -8
  66. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/runPromptAction.js +7 -7
  67. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.js +3 -3
  68. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/skillActions.js +3 -3
  69. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.js +31 -31
  70. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.d.ts +24 -4
  71. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +251 -72
  72. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.js +13 -13
  73. package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
  74. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.d.ts +45 -0
  75. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +191 -0
  76. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.js +6 -6
  77. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +13 -9
  78. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorHover.js +1 -1
  79. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/chatQuick.js +1 -1
  80. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/editor/chatEditor.js +1 -1
  81. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +3 -3
  82. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
  83. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.d.ts +19 -3
  84. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +203 -25
  85. package/vscode/src/vs/workbench/contrib/chat/common/model/chatProgressTypes/chatToolInvocation.d.ts +18 -2
  86. package/vscode/src/vs/workbench/contrib/chat/common/model/chatProgressTypes/chatToolInvocation.js +50 -6
  87. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionOperationLog.js +11 -1
  88. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +2 -2
  89. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +23 -17
  90. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.d.ts +63 -0
  91. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.js +121 -0
  92. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.d.ts +76 -0
  93. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.js +120 -0
  94. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.d.ts +15 -0
  95. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.js +27 -0
  96. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptCodeActions.js +22 -11
  97. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptDocumentSemanticTokensProvider.js +3 -2
  98. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.js +135 -54
  99. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +64 -43
  100. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/promptFileContributions.js +1 -1
  101. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +24 -5
  102. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +341 -24
  103. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +12 -5
  104. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +95 -26
  105. package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
  106. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.js +4 -4
  107. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +8 -8
  108. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +6 -6
  109. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +8 -8
  110. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.js +14 -14
  111. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/chat/notebookChatUtils.js +1 -1
  112. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +10 -10
  113. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +5 -5
  114. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.js +1 -1
  115. package/vscode/src/vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution.js +7 -7
  116. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp.js +16 -16
  117. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.js +20 -20
  118. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.js +1 -1
  119. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalHelpers.js +6 -6
  120. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +3 -3
  121. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/awaitTerminalTool.js +3 -3
  122. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/npmScriptAutoApprover.js +1 -1
  123. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAutoApproveAnalyzer.js +12 -12
  124. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineFileWriteAnalyzer.js +2 -2
  125. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +3 -3
  126. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +3 -3
  127. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +3 -3
  128. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +3 -3
  129. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.js +8 -8
  130. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +2 -2
  131. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.js +14 -13
  132. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +14 -14
  133. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +7 -7
  134. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +14 -14
  135. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/taskHelpers.js +1 -1
  136. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.d.ts +0 -63
  137. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +0 -955
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingame/monaco-vscode-chat-service-override",
3
- "version": "26.1.0",
3
+ "version": "26.1.2",
4
4
  "private": false,
5
5
  "description": "VSCode public API plugged on the monaco editor - chat service-override",
6
6
  "keywords": [],
@@ -15,10 +15,10 @@
15
15
  },
16
16
  "type": "module",
17
17
  "dependencies": {
18
- "@codingame/monaco-vscode-api": "26.1.0",
19
- "@codingame/monaco-vscode-katex-common": "26.1.0",
20
- "@codingame/monaco-vscode-xterm-addons-common": "26.1.0",
21
- "@codingame/monaco-vscode-xterm-common": "26.1.0"
18
+ "@codingame/monaco-vscode-api": "26.1.2",
19
+ "@codingame/monaco-vscode-katex-common": "26.1.2",
20
+ "@codingame/monaco-vscode-xterm-addons-common": "26.1.2",
21
+ "@codingame/monaco-vscode-xterm-common": "26.1.2"
22
22
  },
23
23
  "main": "index.js",
24
24
  "module": "index.js",
@@ -27,7 +27,7 @@ function registerChatCopyActions() {
27
27
  run(accessor, context) {
28
28
  const clipboardService = accessor.get(IClipboardService);
29
29
  const chatWidgetService = accessor.get(IChatWidgetService);
30
- const widget = (context?.sessionResource && chatWidgetService.getWidgetBySessionResource(context.sessionResource)) || chatWidgetService.lastFocusedWidget;
30
+ const widget = ((isRequestVM(context) || isResponseVM(context)) && chatWidgetService.getWidgetBySessionResource(context.sessionResource)) || chatWidgetService.lastFocusedWidget;
31
31
  if (widget) {
32
32
  const viewModel = widget.viewModel;
33
33
  const sessionAsText = viewModel?.getItems().filter(
@@ -70,6 +70,9 @@ function registerChatCopyActions() {
70
70
  await clipboardService.writeText(selectedText);
71
71
  return;
72
72
  }
73
+ if (!isRequestVM(item) && !isResponseVM(item)) {
74
+ return;
75
+ }
73
76
  const text = stringifyItem(item, false);
74
77
  await clipboardService.writeText(text);
75
78
  }
@@ -2,6 +2,7 @@ import { PromptsStorage } from "@codingame/monaco-vscode-api/vscode/vs/workbench
2
2
  import { PromptsType } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes";
3
3
  import { URI } from "@codingame/monaco-vscode-api/vscode/vs/base/common/uri";
4
4
  import { IWorkspaceFolder } from "@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace";
5
+ import { IParsedHook } from "../promptSyntax/hookUtils.js";
5
6
  /**
6
7
  * Information about a file that was loaded or skipped.
7
8
  */
@@ -15,6 +16,10 @@ export interface IFileStatusInfo {
15
16
  overwrittenBy?: string;
16
17
  /** Extension ID if this file comes from an extension */
17
18
  extensionId?: string;
19
+ /** If true, hidden from / menu (user-invokable: false) */
20
+ userInvokable?: boolean;
21
+ /** If true, won't be auto-loaded by agent (disable-model-invocation: true) */
22
+ disableModelInvocation?: boolean;
18
23
  }
19
24
  /**
20
25
  * Path information with scan order.
@@ -38,17 +43,14 @@ export interface ITypeStatusInfo {
38
43
  paths: IPathInfo[];
39
44
  files: IFileStatusInfo[];
40
45
  enabled: boolean;
46
+ /** For hooks only: parsed hooks grouped by lifecycle */
47
+ parsedHooks?: IParsedHook[];
41
48
  }
42
49
  /**
43
50
  * Registers the Diagnostics action for the chat context menu.
44
51
  */
45
52
  export declare function registerChatCustomizationDiagnosticsAction(): void;
46
- /**
47
- * Formats the status output as a compact markdown string with tree structure.
48
- * Files are grouped under their parent paths.
49
- * Special files (AGENTS.md, copilot-instructions.md) are merged into their respective sections.
50
- */
51
- export declare function formatStatusOutput(statusInfos: ITypeStatusInfo[], specialFiles: {
53
+ export interface ISpecialFilesStatus {
52
54
  agentsMd: {
53
55
  enabled: boolean;
54
56
  files: URI[];
@@ -57,4 +59,14 @@ export declare function formatStatusOutput(statusInfos: ITypeStatusInfo[], speci
57
59
  enabled: boolean;
58
60
  files: URI[];
59
61
  };
60
- }, workspaceFolders: readonly IWorkspaceFolder[]): string;
62
+ claudeMd: {
63
+ enabled: boolean;
64
+ files: URI[];
65
+ };
66
+ }
67
+ /**
68
+ * Formats the status output as a compact markdown string with tree structure.
69
+ * Files are grouped under their parent paths.
70
+ * Special files (AGENTS.md, copilot-instructions.md) are merged into their respective sections.
71
+ */
72
+ export declare function formatStatusOutput(statusInfos: ITypeStatusInfo[], specialFiles: ISpecialFilesStatus, workspaceFolders: readonly IWorkspaceFolder[]): string;
@@ -5,6 +5,7 @@ import { localize2, localize } from '@codingame/monaco-vscode-api/vscode/vs/nls'
5
5
  import { registerAction2, Action2, MenuId } from '@codingame/monaco-vscode-api/vscode/vs/platform/actions/common/actions';
6
6
  import { ContextKeyExpr } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey';
7
7
  import { ICommandService } from '@codingame/monaco-vscode-api/vscode/vs/platform/commands/common/commands.service';
8
+ import { AgentFileType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService';
8
9
  import { IPromptsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService.service';
9
10
  import { PromptsConfig } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/config';
10
11
  import { PromptsType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes';
@@ -17,6 +18,11 @@ import { CHAT_CONFIG_MENU_ID, CHAT_CATEGORY } from '@codingame/monaco-vscode-api
17
18
  import { ChatViewId } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/chat';
18
19
  import { ChatContextKeys } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/actions/chatContextKeys';
19
20
  import { IWorkspaceContextService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace.service';
21
+ import { IPathService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/path/common/pathService.service';
22
+ import { parseAllHookFiles } from '../promptSyntax/hookUtils.js';
23
+ import { ILabelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/label/common/label.service';
24
+ import { IRemoteAgentService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/remote/common/remoteAgentService.service';
25
+ import { OS } from '@codingame/monaco-vscode-api/vscode/vs/base/common/platform';
20
26
 
21
27
  function encodePathForMarkdown(path) {
22
28
  return ( path.split("/").map(segment => encodeURIComponent(segment))).join("/");
@@ -37,6 +43,8 @@ const TREE_BRANCH = "├─";
37
43
  const TREE_END = "└─";
38
44
  const ICON_ERROR = "❌";
39
45
  const ICON_WARN = "⚠️";
46
+ const ICON_MANUAL = "🔧";
47
+ const ICON_HIDDEN = "👁️‍🗨️";
40
48
  function registerChatCustomizationDiagnosticsAction() {
41
49
  registerAction2(class DiagnosticsAction extends Action2 {
42
50
  constructor() {
@@ -69,8 +77,11 @@ function registerChatCustomizationDiagnosticsAction() {
69
77
  const untitledTextEditorService = accessor.get(IUntitledTextEditorService);
70
78
  const commandService = accessor.get(ICommandService);
71
79
  const workspaceContextService = accessor.get(IWorkspaceContextService);
80
+ const labelService = accessor.get(ILabelService);
81
+ const remoteAgentService = accessor.get(IRemoteAgentService);
72
82
  const token = CancellationToken.None;
73
83
  const workspaceFolders = workspaceContextService.getWorkspace().folders;
84
+ const pathService = accessor.get(IPathService);
74
85
  const statusInfos = [];
75
86
  const agentsStatus = await collectAgentsStatus(promptsService, fileService, token);
76
87
  statusInfos.push(agentsStatus);
@@ -80,6 +91,16 @@ function registerChatCustomizationDiagnosticsAction() {
80
91
  statusInfos.push(promptsStatus);
81
92
  const skillsStatus = await collectSkillsStatus(promptsService, configurationService, fileService, token);
82
93
  statusInfos.push(skillsStatus);
94
+ const hooksStatus = await collectHooksStatus(
95
+ promptsService,
96
+ fileService,
97
+ labelService,
98
+ pathService,
99
+ workspaceContextService,
100
+ remoteAgentService,
101
+ token
102
+ );
103
+ statusInfos.push(hooksStatus);
83
104
  const specialFilesStatus = await collectSpecialFilesStatus(promptsService, configurationService, token);
84
105
  const output = formatStatusOutput(statusInfos, specialFilesStatus, workspaceFolders);
85
106
  const untitledModel = untitledTextEditorService.create({
@@ -146,25 +167,86 @@ async function collectSkillsStatus(promptsService, configurationService, fileSer
146
167
  enabled
147
168
  };
148
169
  }
170
+ async function collectHooksStatus(
171
+ promptsService,
172
+ fileService,
173
+ labelService,
174
+ pathService,
175
+ workspaceContextService,
176
+ remoteAgentService,
177
+ token
178
+ ) {
179
+ const type = PromptsType.hook;
180
+ const enabled = true;
181
+ const resolvedFolders = await promptsService.getResolvedSourceFolders(type);
182
+ const paths = await convertResolvedFoldersToPathInfo(resolvedFolders, fileService);
183
+ const discoveryInfo = await promptsService.getPromptDiscoveryInfo(type, token);
184
+ const files = ( discoveryInfo.files.map(convertDiscoveryResultToFileStatus));
185
+ const disabledFileUris = ( discoveryInfo.files.filter(f => f.status === "skipped" && f.skipReason === "all-hooks-disabled").map(f => f.uri));
186
+ const parsedHooks = await parseHookFiles(
187
+ promptsService,
188
+ fileService,
189
+ labelService,
190
+ pathService,
191
+ workspaceContextService,
192
+ remoteAgentService,
193
+ token,
194
+ disabledFileUris
195
+ );
196
+ return {
197
+ type,
198
+ paths,
199
+ files,
200
+ enabled,
201
+ parsedHooks
202
+ };
203
+ }
204
+ async function parseHookFiles(
205
+ promptsService,
206
+ fileService,
207
+ labelService,
208
+ pathService,
209
+ workspaceContextService,
210
+ remoteAgentService,
211
+ token,
212
+ additionalDisabledFileUris
213
+ ) {
214
+ const workspaceFolder = workspaceContextService.getWorkspace().folders[0];
215
+ const workspaceRootUri = workspaceFolder?.uri;
216
+ const userHomeUri = await pathService.userHome();
217
+ const userHome = userHomeUri.fsPath ?? userHomeUri.path;
218
+ const remoteEnv = await remoteAgentService.getEnvironment();
219
+ const targetOS = remoteEnv?.os ?? OS;
220
+ return parseAllHookFiles(
221
+ promptsService,
222
+ fileService,
223
+ labelService,
224
+ workspaceRootUri,
225
+ userHome,
226
+ targetOS,
227
+ token,
228
+ {
229
+ additionalDisabledFileUris
230
+ }
231
+ );
232
+ }
149
233
  async function collectSpecialFilesStatus(promptsService, configurationService, token) {
150
234
  const useAgentMd = configurationService.getValue(PromptsConfig.USE_AGENT_MD) ?? false;
151
- let agentMdFiles = [];
152
- if (useAgentMd) {
153
- agentMdFiles = await promptsService.listAgentMDs(token, false);
154
- }
235
+ const useClaudeMd = configurationService.getValue(PromptsConfig.USE_CLAUDE_MD) ?? false;
155
236
  const useCopilotInstructions = configurationService.getValue(PromptsConfig.USE_COPILOT_INSTRUCTION_FILES) ?? false;
156
- let copilotInstructionsFiles = [];
157
- if (useCopilotInstructions) {
158
- copilotInstructionsFiles = await promptsService.listCopilotInstructionsMDs(token);
159
- }
237
+ const allFiles = await promptsService.listAgentInstructions(token);
160
238
  return {
161
239
  agentsMd: {
162
240
  enabled: useAgentMd,
163
- files: agentMdFiles
241
+ files: ( allFiles.filter(f => f.type === AgentFileType.agentsMd).map(f => f.uri))
242
+ },
243
+ claudeMd: {
244
+ enabled: useClaudeMd,
245
+ files: ( allFiles.filter(f => f.type === AgentFileType.claudeMd).map(f => f.uri))
164
246
  },
165
247
  copilotInstructions: {
166
248
  enabled: useCopilotInstructions,
167
- files: copilotInstructionsFiles
249
+ files: ( allFiles.filter(f => f.type === AgentFileType.copilotInstructionsMd).map(f => f.uri))
168
250
  }
169
251
  };
170
252
  }
@@ -206,8 +288,12 @@ function getSkipReasonMessage(skipReason, errorMessage) {
206
288
  return errorMessage ?? ( localize(4748, "Parse error"));
207
289
  case "disabled":
208
290
  return localize(4749, "Disabled");
291
+ case "all-hooks-disabled":
292
+ return localize(4750, "All hooks disabled via disableAllHooks");
293
+ case "claude-hooks-disabled":
294
+ return localize(4751, "Claude hooks disabled via chat.useClaudeHooks setting");
209
295
  default:
210
- return errorMessage ?? ( localize(4750, "Unknown error"));
296
+ return errorMessage ?? ( localize(4752, "Unknown error"));
211
297
  }
212
298
  }
213
299
  function convertDiscoveryResultToFileStatus(result) {
@@ -217,7 +303,9 @@ function convertDiscoveryResultToFileStatus(result) {
217
303
  status: "loaded",
218
304
  name: result.name,
219
305
  storage: result.storage,
220
- extensionId: result.extensionId
306
+ extensionId: result.extensionId,
307
+ userInvokable: result.userInvokable,
308
+ disableModelInvocation: result.disableModelInvocation
221
309
  };
222
310
  }
223
311
  if (result.skipReason === "duplicate-name" && result.duplicateOf) {
@@ -241,21 +329,21 @@ function convertDiscoveryResultToFileStatus(result) {
241
329
  }
242
330
  function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
243
331
  const lines = [];
244
- lines.push(`## ${( localize(4751, "Chat Customization Diagnostics"))}`);
245
- lines.push(`*${( localize(4752, "WARNING: This file may contain sensitive information."))}*`);
332
+ lines.push(`## ${( localize(4753, "Chat Customization Diagnostics"))}`);
333
+ lines.push(`*${( localize(4754, "WARNING: This file may contain sensitive information."))}*`);
246
334
  lines.push("");
247
335
  for (const info of statusInfos) {
248
336
  const typeName = getTypeName(info.type);
249
337
  if (info.type === PromptsType.skill && !info.enabled) {
250
338
  lines.push(`**${typeName}**`);
251
339
  lines.push(`*${( localize(
252
- 4753,
340
+ 4755,
253
341
  "Skills are disabled. Enable them by setting `chat.useAgentSkills` to `true` in your settings."
254
342
  ))}*`);
255
343
  lines.push("");
256
344
  continue;
257
345
  }
258
- const enabledStatus = info.enabled ? "" : ` *(${( localize(4754, "disabled"))})*`;
346
+ const enabledStatus = info.enabled ? "" : ` *(${( localize(4756, "disabled"))})*`;
259
347
  let loadedCount = info.files.filter(f => f.status === "loaded").length;
260
348
  const skippedCount = info.files.filter(f => f.status === "skipped" || f.status === "overwritten").length;
261
349
  if (info.type === PromptsType.instructions) {
@@ -265,18 +353,29 @@ function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
265
353
  if (specialFiles.copilotInstructions.enabled) {
266
354
  loadedCount += specialFiles.copilotInstructions.files.length;
267
355
  }
356
+ if (specialFiles.claudeMd.enabled) {
357
+ loadedCount += specialFiles.claudeMd.files.length;
358
+ }
268
359
  }
269
360
  lines.push(`**${typeName}**${enabledStatus}<br>`);
270
361
  const statsParts = [];
271
- if (loadedCount > 0) {
362
+ if (info.type === PromptsType.hook) {
363
+ if (loadedCount > 0) {
364
+ statsParts.push(loadedCount === 1 ? ( localize(4757, "1 file loaded")) : ( localize(4758, "{0} files loaded", loadedCount)));
365
+ }
366
+ if (info.parsedHooks && info.parsedHooks.length > 0) {
367
+ const hookCount = info.parsedHooks.length;
368
+ statsParts.push(hookCount === 1 ? ( localize(4759, "1 hook loaded")) : ( localize(4760, "{0} hooks loaded", hookCount)));
369
+ }
370
+ } else if (loadedCount > 0) {
272
371
  if (info.type === PromptsType.skill) {
273
- statsParts.push(loadedCount === 1 ? ( localize(4755, "1 skill loaded")) : ( localize(4756, "{0} skills loaded", loadedCount)));
372
+ statsParts.push(loadedCount === 1 ? ( localize(4761, "1 skill loaded")) : ( localize(4762, "{0} skills loaded", loadedCount)));
274
373
  } else {
275
374
  statsParts.push(loadedCount === 1 ? ( localize(4757, "1 file loaded")) : ( localize(4758, "{0} files loaded", loadedCount)));
276
375
  }
277
376
  }
278
377
  if (skippedCount > 0) {
279
- statsParts.push(( localize(4759, "{0} skipped", skippedCount)));
378
+ statsParts.push(( localize(4763, "{0} skipped", skippedCount)));
280
379
  }
281
380
  if (statsParts.length > 0) {
282
381
  lines.push(`*${statsParts.join(", ")}*`);
@@ -304,41 +403,43 @@ function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
304
403
  }
305
404
  }
306
405
  let hasContent = false;
307
- for (const path of allPaths) {
308
- const pathFiles = filesByPath.get(( path.uri.toString())) || [];
309
- if (path.exists) {
310
- lines.push(`${path.displayPath}<br>`);
311
- } else if (path.isDefault) {
312
- lines.push(`${path.displayPath}<br>`);
313
- } else {
314
- lines.push(`${ICON_ERROR} ${path.displayPath} - *${( localize(4760, "Folder does not exist"))}*<br>`);
315
- }
316
- if (path.exists && pathFiles.length > 0) {
317
- for (let i = 0; i < pathFiles.length; i++) {
318
- const file = pathFiles[i];
319
- let fileName;
320
- if (info.type === PromptsType.skill) {
321
- fileName = file.name || `${basename(dirname(file.uri))}`;
322
- } else {
323
- fileName = basename(file.uri);
324
- }
325
- const isLast = i === pathFiles.length - 1;
326
- const prefix = isLast ? TREE_END : TREE_BRANCH;
327
- const filePath = getRelativePath(file.uri, workspaceFolders);
328
- if (file.status === "loaded") {
329
- lines.push(`${prefix} [\`${fileName}\`](${filePath})<br>`);
330
- } else if (file.status === "overwritten") {
331
- lines.push(`${prefix} ${ICON_WARN} [\`${fileName}\`](${filePath}) - *${( localize(4747, "Overwritten by higher priority file"))}*<br>`);
332
- } else {
333
- lines.push(
334
- `${prefix} ${ICON_ERROR} [\`${fileName}\`](${filePath}) - *${file.reason}*<br>`
335
- );
406
+ if (info.type !== PromptsType.hook) {
407
+ for (const path of allPaths) {
408
+ const pathFiles = filesByPath.get(( path.uri.toString())) || [];
409
+ if (path.exists) {
410
+ lines.push(`${path.displayPath}<br>`);
411
+ } else if (path.isDefault) {
412
+ lines.push(`${path.displayPath}<br>`);
413
+ } else {
414
+ lines.push(`${ICON_ERROR} ${path.displayPath} - *${( localize(4764, "Folder does not exist"))}*<br>`);
415
+ }
416
+ if (path.exists && pathFiles.length > 0) {
417
+ for (let i = 0; i < pathFiles.length; i++) {
418
+ const file = pathFiles[i];
419
+ let fileName;
420
+ if (info.type === PromptsType.skill) {
421
+ fileName = file.name || `${basename(dirname(file.uri))}`;
422
+ } else {
423
+ fileName = basename(file.uri);
424
+ }
425
+ const isLast = i === pathFiles.length - 1;
426
+ const prefix = isLast ? TREE_END : TREE_BRANCH;
427
+ const filePath = getRelativePath(file.uri, workspaceFolders);
428
+ if (file.status === "loaded") {
429
+ lines.push(`${prefix} [\`${fileName}\`](${filePath})<br>`);
430
+ } else if (file.status === "overwritten") {
431
+ lines.push(`${prefix} ${ICON_WARN} [\`${fileName}\`](${filePath}) - *${( localize(4747, "Overwritten by higher priority file"))}*<br>`);
432
+ } else {
433
+ lines.push(
434
+ `${prefix} ${ICON_ERROR} [\`${fileName}\`](${filePath}) - *${file.reason}*<br>`
435
+ );
436
+ }
336
437
  }
337
438
  }
439
+ hasContent = true;
338
440
  }
339
- hasContent = true;
340
441
  }
341
- if (unmatchedFiles.length > 0) {
442
+ if (info.type !== PromptsType.hook && unmatchedFiles.length > 0) {
342
443
  const filesByExtension = ( new Map());
343
444
  for (const file of unmatchedFiles) {
344
445
  const extId = file.extensionId || "unknown";
@@ -348,7 +449,7 @@ function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
348
449
  filesByExtension.get(extId).push(file);
349
450
  }
350
451
  for (const [extId, extFiles] of filesByExtension) {
351
- lines.push(`${( localize(4761, "Extension"))}: ${extId}<br>`);
452
+ lines.push(`${( localize(4765, "Extension"))}: ${extId}<br>`);
352
453
  for (let i = 0; i < extFiles.length; i++) {
353
454
  const file = extFiles[i];
354
455
  let fileName;
@@ -361,7 +462,8 @@ function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
361
462
  const prefix = isLast ? TREE_END : TREE_BRANCH;
362
463
  const filePath = getRelativePath(file.uri, workspaceFolders);
363
464
  if (file.status === "loaded") {
364
- lines.push(`${prefix} [\`${fileName}\`](${filePath})<br>`);
465
+ const flags = getSkillFlags(file, info.type);
466
+ lines.push(`${prefix} [\`${fileName}\`](${filePath})${flags}<br>`);
365
467
  } else if (file.status === "overwritten") {
366
468
  lines.push(`${prefix} ${ICON_WARN} [\`${fileName}\`](${filePath}) - *${( localize(4747, "Overwritten by higher priority file"))}*<br>`);
367
469
  } else {
@@ -405,13 +507,61 @@ function formatStatusOutput(statusInfos, specialFiles, workspaceFolders) {
405
507
  hasContent = true;
406
508
  }
407
509
  }
510
+ if (info.type === PromptsType.hook && info.parsedHooks && info.parsedHooks.length > 0) {
511
+ const hooksByFile = ( new Map());
512
+ for (const hook of info.parsedHooks) {
513
+ const fileKey = ( hook.fileUri.toString());
514
+ const existing = hooksByFile.get(fileKey) ?? [];
515
+ existing.push(hook);
516
+ hooksByFile.set(fileKey, existing);
517
+ }
518
+ const fileUris = Array.from(( hooksByFile.keys()));
519
+ for (let fileIdx = 0; fileIdx < fileUris.length; fileIdx++) {
520
+ const fileKey = fileUris[fileIdx];
521
+ const fileHooks = hooksByFile.get(fileKey);
522
+ const firstHook = fileHooks[0];
523
+ const filePath = getRelativePath(firstHook.fileUri, workspaceFolders);
524
+ const fileDisabled = fileHooks[0].disabled;
525
+ if (fileDisabled) {
526
+ lines.push(`[${firstHook.filePath}](${filePath}) - *${( localize(4766, "all hooks disabled via disableAllHooks"))}*<br>`);
527
+ } else {
528
+ lines.push(`[${firstHook.filePath}](${filePath})<br>`);
529
+ }
530
+ for (let i = 0; i < fileHooks.length; i++) {
531
+ const hook = fileHooks[i];
532
+ const isLast = i === fileHooks.length - 1;
533
+ const prefix = isLast ? TREE_END : TREE_BRANCH;
534
+ const disabledPrefix = hook.disabled ? `${ICON_ERROR} ` : "";
535
+ lines.push(
536
+ `${prefix} ${disabledPrefix}${hook.hookTypeLabel}: \`${hook.commandLabel}\`<br>`
537
+ );
538
+ }
539
+ }
540
+ hasContent = true;
541
+ }
408
542
  if (!hasContent && info.enabled) {
409
- lines.push(`*${( localize(4762, "No files loaded"))}*`);
543
+ lines.push(`*${( localize(4767, "No files loaded"))}*`);
410
544
  }
411
545
  lines.push("");
412
546
  }
413
547
  return lines.join("\n");
414
548
  }
549
+ function getSkillFlags(file, type) {
550
+ if (type !== PromptsType.skill) {
551
+ return "";
552
+ }
553
+ const flags = [];
554
+ if (file.disableModelInvocation) {
555
+ flags.push(`${ICON_MANUAL} *${( localize(4768, "manual only"))}*`);
556
+ }
557
+ if (file.userInvokable === false) {
558
+ flags.push(`${ICON_HIDDEN} *${( localize(4769, "hidden from menu"))}*`);
559
+ }
560
+ if (flags.length === 0) {
561
+ return "";
562
+ }
563
+ return ` - ${flags.join(", ")}`;
564
+ }
415
565
  function isFileUnderPath(fileUri, pathUri) {
416
566
  const filePath = ( fileUri.toString());
417
567
  const folderPath = ( pathUri.toString());
@@ -420,13 +570,15 @@ function isFileUnderPath(fileUri, pathUri) {
420
570
  function getTypeName(type) {
421
571
  switch (type) {
422
572
  case PromptsType.agent:
423
- return localize(4763, "Custom Agents");
573
+ return localize(4770, "Custom Agents");
424
574
  case PromptsType.instructions:
425
- return localize(4764, "Instructions");
575
+ return localize(4771, "Instructions");
426
576
  case PromptsType.prompt:
427
- return localize(4765, "Prompt Files");
577
+ return localize(4772, "Prompt Files");
428
578
  case PromptsType.skill:
429
- return localize(4766, "Skills");
579
+ return localize(4773, "Skills");
580
+ case PromptsType.hook:
581
+ return localize(4774, "Hooks");
430
582
  default:
431
583
  return type;
432
584
  }
@@ -30,7 +30,7 @@ class LogChatInputHistoryAction extends Action2 {
30
30
  constructor() {
31
31
  super({
32
32
  id: LogChatInputHistoryAction.ID,
33
- title: ( localize2(4767, "Log Chat Input History")),
33
+ title: ( localize2(4775, "Log Chat Input History")),
34
34
  icon: Codicon.attach,
35
35
  category: Categories.Developer,
36
36
  f1: true,
@@ -49,7 +49,7 @@ class LogChatIndexAction extends Action2 {
49
49
  constructor() {
50
50
  super({
51
51
  id: LogChatIndexAction.ID,
52
- title: ( localize2(4768, "Log Chat Index")),
52
+ title: ( localize2(4776, "Log Chat Index")),
53
53
  icon: Codicon.attach,
54
54
  category: Categories.Developer,
55
55
  f1: true,
@@ -68,7 +68,7 @@ class InspectChatModelAction extends Action2 {
68
68
  constructor() {
69
69
  super({
70
70
  id: InspectChatModelAction.ID,
71
- title: ( localize2(4769, "Inspect Chat Model")),
71
+ title: ( localize2(4777, "Inspect Chat Model")),
72
72
  icon: Codicon.inspect,
73
73
  category: Categories.Developer,
74
74
  f1: true,
@@ -13,7 +13,7 @@ function registerChatFileTreeActions() {
13
13
  constructor() {
14
14
  super({
15
15
  id: "workbench.action.chat.nextFileTree",
16
- title: ( localize2(4800, "Next File Tree")),
16
+ title: ( localize2(4808, "Next File Tree")),
17
17
  keybinding: {
18
18
  primary: KeyMod.CtrlCmd | KeyCode.F9,
19
19
  weight: KeybindingWeight.WorkbenchContrib,
@@ -32,7 +32,7 @@ function registerChatFileTreeActions() {
32
32
  constructor() {
33
33
  super({
34
34
  id: "workbench.action.chat.previousFileTree",
35
- title: ( localize2(4801, "Previous File Tree")),
35
+ title: ( localize2(4809, "Previous File Tree")),
36
36
  keybinding: {
37
37
  primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.F9,
38
38
  weight: KeybindingWeight.WorkbenchContrib,
@@ -16,7 +16,7 @@ import { revive } from '@codingame/monaco-vscode-api/vscode/vs/base/common/marsh
16
16
 
17
17
  const defaultFileName = "chat.json";
18
18
  const filters = [{
19
- name: ( localize(4802, "Chat Session")),
19
+ name: ( localize(4810, "Chat Session")),
20
20
  extensions: ["json"]
21
21
  }];
22
22
  function registerChatExportActions() {
@@ -25,7 +25,7 @@ function registerChatExportActions() {
25
25
  super({
26
26
  id: "workbench.action.chat.export",
27
27
  category: CHAT_CATEGORY,
28
- title: ( localize2(4803, "Export Chat...")),
28
+ title: ( localize2(4811, "Export Chat...")),
29
29
  precondition: ChatContextKeys.enabled,
30
30
  f1: true
31
31
  });
@@ -62,7 +62,7 @@ function registerChatExportActions() {
62
62
  constructor() {
63
63
  super({
64
64
  id: "workbench.action.chat.import",
65
- title: ( localize2(4804, "Import Chat...")),
65
+ title: ( localize2(4812, "Import Chat...")),
66
66
  category: CHAT_CATEGORY,
67
67
  precondition: ChatContextKeys.enabled,
68
68
  f1: true