@milkdown/crepe 7.20.0 → 7.21.0

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 (173) hide show
  1. package/lib/cjs/builder.js +1 -0
  2. package/lib/cjs/builder.js.map +1 -1
  3. package/lib/cjs/feature/ai/index.js +1492 -0
  4. package/lib/cjs/feature/ai/index.js.map +1 -0
  5. package/lib/cjs/feature/block-edit/index.js +1 -0
  6. package/lib/cjs/feature/block-edit/index.js.map +1 -1
  7. package/lib/cjs/feature/code-mirror/index.js +1 -0
  8. package/lib/cjs/feature/code-mirror/index.js.map +1 -1
  9. package/lib/cjs/feature/cursor/index.js +1 -0
  10. package/lib/cjs/feature/cursor/index.js.map +1 -1
  11. package/lib/cjs/feature/image-block/index.js +1 -0
  12. package/lib/cjs/feature/image-block/index.js.map +1 -1
  13. package/lib/cjs/feature/latex/index.js +2 -0
  14. package/lib/cjs/feature/latex/index.js.map +1 -1
  15. package/lib/cjs/feature/link-tooltip/index.js +1 -0
  16. package/lib/cjs/feature/link-tooltip/index.js.map +1 -1
  17. package/lib/cjs/feature/list-item/index.js +1 -0
  18. package/lib/cjs/feature/list-item/index.js.map +1 -1
  19. package/lib/cjs/feature/placeholder/index.js +1 -0
  20. package/lib/cjs/feature/placeholder/index.js.map +1 -1
  21. package/lib/cjs/feature/table/index.js +1 -0
  22. package/lib/cjs/feature/table/index.js.map +1 -1
  23. package/lib/cjs/feature/toolbar/index.js +488 -3
  24. package/lib/cjs/feature/toolbar/index.js.map +1 -1
  25. package/lib/cjs/feature/top-bar/index.js +1 -0
  26. package/lib/cjs/feature/top-bar/index.js.map +1 -1
  27. package/lib/cjs/index.js +1424 -25
  28. package/lib/cjs/index.js.map +1 -1
  29. package/lib/cjs/llm-providers/anthropic/index.js +147 -0
  30. package/lib/cjs/llm-providers/anthropic/index.js.map +1 -0
  31. package/lib/cjs/llm-providers/openai/index.js +138 -0
  32. package/lib/cjs/llm-providers/openai/index.js.map +1 -0
  33. package/lib/esm/builder.js +1 -0
  34. package/lib/esm/builder.js.map +1 -1
  35. package/lib/esm/feature/ai/index.js +1487 -0
  36. package/lib/esm/feature/ai/index.js.map +1 -0
  37. package/lib/esm/feature/block-edit/index.js +1 -0
  38. package/lib/esm/feature/block-edit/index.js.map +1 -1
  39. package/lib/esm/feature/code-mirror/index.js +1 -0
  40. package/lib/esm/feature/code-mirror/index.js.map +1 -1
  41. package/lib/esm/feature/cursor/index.js +1 -0
  42. package/lib/esm/feature/cursor/index.js.map +1 -1
  43. package/lib/esm/feature/image-block/index.js +1 -0
  44. package/lib/esm/feature/image-block/index.js.map +1 -1
  45. package/lib/esm/feature/latex/index.js +2 -0
  46. package/lib/esm/feature/latex/index.js.map +1 -1
  47. package/lib/esm/feature/link-tooltip/index.js +1 -0
  48. package/lib/esm/feature/link-tooltip/index.js.map +1 -1
  49. package/lib/esm/feature/list-item/index.js +1 -0
  50. package/lib/esm/feature/list-item/index.js.map +1 -1
  51. package/lib/esm/feature/placeholder/index.js +1 -0
  52. package/lib/esm/feature/placeholder/index.js.map +1 -1
  53. package/lib/esm/feature/table/index.js +1 -0
  54. package/lib/esm/feature/table/index.js.map +1 -1
  55. package/lib/esm/feature/toolbar/index.js +490 -5
  56. package/lib/esm/feature/toolbar/index.js.map +1 -1
  57. package/lib/esm/feature/top-bar/index.js +1 -0
  58. package/lib/esm/feature/top-bar/index.js.map +1 -1
  59. package/lib/esm/index.js +1414 -15
  60. package/lib/esm/index.js.map +1 -1
  61. package/lib/esm/llm-providers/anthropic/index.js +145 -0
  62. package/lib/esm/llm-providers/anthropic/index.js.map +1 -0
  63. package/lib/esm/llm-providers/openai/index.js +136 -0
  64. package/lib/esm/llm-providers/openai/index.js.map +1 -0
  65. package/lib/theme/common/ai.css +446 -0
  66. package/lib/theme/common/code-mirror.css +14 -0
  67. package/lib/theme/common/diff.css +177 -0
  68. package/lib/theme/common/style.css +2 -0
  69. package/lib/tsconfig.tsbuildinfo +1 -1
  70. package/lib/types/feature/ai/ai.spec.d.ts +2 -0
  71. package/lib/types/feature/ai/ai.spec.d.ts.map +1 -0
  72. package/lib/types/feature/ai/commands.d.ts +24 -0
  73. package/lib/types/feature/ai/commands.d.ts.map +1 -0
  74. package/lib/types/feature/ai/context.d.ts +4 -0
  75. package/lib/types/feature/ai/context.d.ts.map +1 -0
  76. package/lib/types/feature/ai/diff-actions/index.d.ts +12 -0
  77. package/lib/types/feature/ai/diff-actions/index.d.ts.map +1 -0
  78. package/lib/types/feature/ai/diff-actions/view.d.ts +21 -0
  79. package/lib/types/feature/ai/diff-actions/view.d.ts.map +1 -0
  80. package/lib/types/feature/ai/index.d.ts +7 -0
  81. package/lib/types/feature/ai/index.d.ts.map +1 -0
  82. package/lib/types/feature/ai/instruction-tooltip/component.d.ts +26 -0
  83. package/lib/types/feature/ai/instruction-tooltip/component.d.ts.map +1 -0
  84. package/lib/types/feature/ai/instruction-tooltip/index.d.ts +17 -0
  85. package/lib/types/feature/ai/instruction-tooltip/index.d.ts.map +1 -0
  86. package/lib/types/feature/ai/instruction-tooltip/suggestions.d.ts +50 -0
  87. package/lib/types/feature/ai/instruction-tooltip/suggestions.d.ts.map +1 -0
  88. package/lib/types/feature/ai/instruction-tooltip/view.d.ts +19 -0
  89. package/lib/types/feature/ai/instruction-tooltip/view.d.ts.map +1 -0
  90. package/lib/types/feature/ai/streaming-indicator.d.ts +9 -0
  91. package/lib/types/feature/ai/streaming-indicator.d.ts.map +1 -0
  92. package/lib/types/feature/ai/types.d.ts +58 -0
  93. package/lib/types/feature/ai/types.d.ts.map +1 -0
  94. package/lib/types/feature/index.d.ts +4 -1
  95. package/lib/types/feature/index.d.ts.map +1 -1
  96. package/lib/types/feature/latex/inline-tooltip/inline-tooltip.spec.d.ts +2 -0
  97. package/lib/types/feature/latex/inline-tooltip/inline-tooltip.spec.d.ts.map +1 -0
  98. package/lib/types/feature/latex/inline-tooltip/view.d.ts.map +1 -1
  99. package/lib/types/feature/loader.d.ts.map +1 -1
  100. package/lib/types/feature/toolbar/config.d.ts.map +1 -1
  101. package/lib/types/feature/toolbar/index.d.ts +1 -0
  102. package/lib/types/feature/toolbar/index.d.ts.map +1 -1
  103. package/lib/types/icons/ai.d.ts +2 -0
  104. package/lib/types/icons/ai.d.ts.map +1 -0
  105. package/lib/types/icons/chevron-left.d.ts +2 -0
  106. package/lib/types/icons/chevron-left.d.ts.map +1 -0
  107. package/lib/types/icons/chevron-right.d.ts +2 -0
  108. package/lib/types/icons/chevron-right.d.ts.map +1 -0
  109. package/lib/types/icons/enter-key.d.ts +2 -0
  110. package/lib/types/icons/enter-key.d.ts.map +1 -0
  111. package/lib/types/icons/grammar-check.d.ts +2 -0
  112. package/lib/types/icons/grammar-check.d.ts.map +1 -0
  113. package/lib/types/icons/index.d.ts +11 -0
  114. package/lib/types/icons/index.d.ts.map +1 -1
  115. package/lib/types/icons/longer.d.ts +2 -0
  116. package/lib/types/icons/longer.d.ts.map +1 -0
  117. package/lib/types/icons/retry.d.ts +2 -0
  118. package/lib/types/icons/retry.d.ts.map +1 -0
  119. package/lib/types/icons/send-prompt.d.ts +2 -0
  120. package/lib/types/icons/send-prompt.d.ts.map +1 -0
  121. package/lib/types/icons/send.d.ts +2 -0
  122. package/lib/types/icons/send.d.ts.map +1 -0
  123. package/lib/types/icons/shorter.d.ts +2 -0
  124. package/lib/types/icons/shorter.d.ts.map +1 -0
  125. package/lib/types/icons/translate.d.ts +2 -0
  126. package/lib/types/icons/translate.d.ts.map +1 -0
  127. package/lib/types/llm-providers/anthropic/index.d.ts +21 -0
  128. package/lib/types/llm-providers/anthropic/index.d.ts.map +1 -0
  129. package/lib/types/llm-providers/openai/index.d.ts +15 -0
  130. package/lib/types/llm-providers/openai/index.d.ts.map +1 -0
  131. package/lib/types/llm-providers/providers.spec.d.ts +2 -0
  132. package/lib/types/llm-providers/providers.spec.d.ts.map +1 -0
  133. package/lib/types/llm-providers/shared.d.ts +16 -0
  134. package/lib/types/llm-providers/shared.d.ts.map +1 -0
  135. package/package.json +18 -2
  136. package/src/feature/ai/ai.spec.ts +742 -0
  137. package/src/feature/ai/commands.ts +257 -0
  138. package/src/feature/ai/context.ts +45 -0
  139. package/src/feature/ai/diff-actions/index.ts +95 -0
  140. package/src/feature/ai/diff-actions/view.ts +237 -0
  141. package/src/feature/ai/index.ts +118 -0
  142. package/src/feature/ai/instruction-tooltip/component.tsx +414 -0
  143. package/src/feature/ai/instruction-tooltip/index.ts +101 -0
  144. package/src/feature/ai/instruction-tooltip/suggestions.ts +249 -0
  145. package/src/feature/ai/instruction-tooltip/view.ts +159 -0
  146. package/src/feature/ai/streaming-indicator.ts +183 -0
  147. package/src/feature/ai/types.ts +178 -0
  148. package/src/feature/index.ts +8 -2
  149. package/src/feature/latex/inline-tooltip/inline-tooltip.spec.ts +81 -0
  150. package/src/feature/latex/inline-tooltip/view.ts +2 -0
  151. package/src/feature/loader.ts +4 -0
  152. package/src/feature/toolbar/config.ts +27 -1
  153. package/src/feature/toolbar/index.ts +1 -0
  154. package/src/icons/ai.ts +14 -0
  155. package/src/icons/chevron-left.ts +15 -0
  156. package/src/icons/chevron-right.ts +15 -0
  157. package/src/icons/enter-key.ts +13 -0
  158. package/src/icons/grammar-check.ts +13 -0
  159. package/src/icons/index.ts +11 -0
  160. package/src/icons/longer.ts +13 -0
  161. package/src/icons/retry.ts +13 -0
  162. package/src/icons/send-prompt.ts +13 -0
  163. package/src/icons/send.ts +13 -0
  164. package/src/icons/shorter.ts +13 -0
  165. package/src/icons/translate.ts +13 -0
  166. package/src/llm-providers/anthropic/index.ts +132 -0
  167. package/src/llm-providers/openai/index.ts +109 -0
  168. package/src/llm-providers/providers.spec.ts +472 -0
  169. package/src/llm-providers/shared.ts +160 -0
  170. package/src/theme/common/ai.css +430 -0
  171. package/src/theme/common/code-mirror.css +14 -0
  172. package/src/theme/common/diff.css +196 -0
  173. package/src/theme/common/style.css +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/core/slice.ts","../../../../src/feature/index.ts","../../../../src/feature/ai/context.ts","../../../../src/feature/ai/commands.ts","../../../../src/icons/ai.ts","../../../../src/icons/chevron-left.ts","../../../../src/icons/chevron-right.ts","../../../../src/icons/clear.ts","../../../../src/icons/confirm.ts","../../../../src/icons/edit.ts","../../../../src/icons/enter-key.ts","../../../../src/icons/grammar-check.ts","../../../../src/icons/longer.ts","../../../../src/icons/retry.ts","../../../../src/icons/send.ts","../../../../src/icons/send-prompt.ts","../../../../src/icons/shorter.ts","../../../../src/icons/translate.ts","../../../../src/feature/ai/diff-actions/view.ts","../../../../src/feature/ai/diff-actions/index.ts","../../../../src/feature/ai/instruction-tooltip/suggestions.ts","../../../../src/utils/keep-alive.ts","../../../../src/feature/ai/instruction-tooltip/component.tsx","../../../../src/feature/ai/instruction-tooltip/view.ts","../../../../src/feature/ai/instruction-tooltip/index.ts","../../../../src/feature/ai/streaming-indicator.ts","../../../../src/feature/ai/index.ts"],"sourcesContent":["import { createSlice, type Ctx } from '@milkdown/kit/ctx'\n\nimport type { CrepeFeature } from '../feature'\nimport type { CrepeBuilder } from './builder'\n\n/// @internal\n/// The feature flags context.\n/// ⚠️ Most of the time, you should use `useCrepeFeatures` to get the features.\nexport const FeaturesCtx = createSlice([] as CrepeFeature[], 'FeaturesCtx')\n\n/// @internal\n/// The crepe editor context.\n/// ⚠️ Most of the time, you should use `useCrepe` to get the crepe editor instance.\nexport const CrepeCtx = createSlice({} as CrepeBuilder, 'CrepeCtx')\n\n/// The crepe editor context.\n/// You can use this context to access the crepe editor instance within Milkdown plugins.\n/// ```ts\n/// import { crepeCtx } from '@milkdown/crepe'\n/// const plugin = (ctx: Ctx) => {\n/// return () => {\n/// const crepe = useCrepe(ctx)\n/// crepe.setReadonly(true)\n/// }\n/// }\n/// ```\nexport function useCrepe(ctx: Ctx) {\n // We should use string slice here to avoid the slice to be bundled in multiple entries\n return ctx.get<CrepeBuilder, 'CrepeCtx'>('CrepeCtx')\n}\n\n/// Check the enabled FeatureFlags\n/// ```ts\n/// import { useCrepeFeatures } from '@milkdown/crepe'\n/// const plugin = (ctx: Ctx) => {\n/// const features = useCrepeFeatures(ctx)\n/// if (features.get().includes(CrepeFeature.CodeMirror)) {\n/// // Do something with CodeMirror\n/// }\n/// }\nexport function useCrepeFeatures(ctx: Ctx) {\n // We should use string slice here to avoid the slice to be bundled in multiple entries\n return ctx.use<CrepeFeature[], 'FeaturesCtx'>('FeaturesCtx')\n}\n\n/// @internal\nexport function crepeFeatureConfig(feature: CrepeFeature) {\n return (ctx: Ctx) => {\n useCrepeFeatures(ctx).update((features) => {\n if (features.includes(feature)) {\n return features\n }\n return [...features, feature]\n })\n }\n}\n","import type { AIFeatureConfig } from './ai'\nimport type { BlockEditFeatureConfig } from './block-edit'\nimport type { CodeMirrorFeatureConfig } from './code-mirror'\nimport type { CursorFeatureConfig } from './cursor'\nimport type { ImageBlockFeatureConfig } from './image-block'\nimport type { LatexFeatureConfig } from './latex'\nimport type { LinkTooltipFeatureConfig } from './link-tooltip'\nimport type { ListItemFeatureConfig } from './list-item'\nimport type { PlaceholderFeatureConfig } from './placeholder'\nimport type { TableFeatureConfig } from './table'\nimport type { ToolbarFeatureConfig } from './toolbar'\nimport type { TopBarFeatureConfig } from './top-bar'\n\n/// The crepe editor feature flags.\n/// Most features are enabled by default; `TopBar` and `AI` are opt-in.\n/// See `defaultFeatures` for the per-flag default.\nexport enum CrepeFeature {\n /// Syntax highlighting and editing for code blocks with language support, theme customization, and preview capabilities.\n CodeMirror = 'code-mirror',\n\n /// Support for bullet lists, ordered lists, and todo lists with customizable icons and formatting.\n ListItem = 'list-item',\n\n /// Enhanced link editing and preview with customizable tooltips, edit/remove actions, and copy functionality.\n LinkTooltip = 'link-tooltip',\n\n /// Enhanced cursor experience with drop cursor and gap cursor for better content placement.\n Cursor = 'cursor',\n\n /// Image upload and management with resizing, captions, and support for both inline and block images.\n ImageBlock = 'image-block',\n\n /// Drag-and-drop block management and slash commands for quick content insertion and organization.\n BlockEdit = 'block-edit',\n\n /// Formatting toolbar for selected text with customizable icons and actions.\n Toolbar = 'toolbar',\n\n /// Document or block level placeholders to guide users when content is empty.\n Placeholder = 'placeholder',\n\n /// Full-featured table editing with row/column management, alignment options, and drag-and-drop functionality.\n Table = 'table',\n\n /// Mathematical formula support with both inline and block math rendering using KaTeX.\n Latex = 'latex',\n\n /// Fixed top toolbar with heading selector, formatting buttons, insert actions, and block commands.\n TopBar = 'top-bar',\n\n /// AI-assisted editing: streaming input, diff review, and provider integration.\n AI = 'ai',\n}\n\nexport interface CrepeFeatureConfig {\n [CrepeFeature.Cursor]?: CursorFeatureConfig\n [CrepeFeature.ListItem]?: ListItemFeatureConfig\n [CrepeFeature.LinkTooltip]?: LinkTooltipFeatureConfig\n [CrepeFeature.ImageBlock]?: ImageBlockFeatureConfig\n [CrepeFeature.BlockEdit]?: BlockEditFeatureConfig\n [CrepeFeature.Placeholder]?: PlaceholderFeatureConfig\n [CrepeFeature.Toolbar]?: ToolbarFeatureConfig\n [CrepeFeature.CodeMirror]?: CodeMirrorFeatureConfig\n [CrepeFeature.Table]?: TableFeatureConfig\n [CrepeFeature.Latex]?: LatexFeatureConfig\n [CrepeFeature.TopBar]?: TopBarFeatureConfig\n [CrepeFeature.AI]?: AIFeatureConfig\n}\n\nexport const defaultFeatures: Record<CrepeFeature, boolean> = {\n [CrepeFeature.Cursor]: true,\n [CrepeFeature.ListItem]: true,\n [CrepeFeature.LinkTooltip]: true,\n [CrepeFeature.ImageBlock]: true,\n [CrepeFeature.BlockEdit]: true,\n [CrepeFeature.Placeholder]: true,\n [CrepeFeature.Toolbar]: true,\n [CrepeFeature.CodeMirror]: true,\n [CrepeFeature.Table]: true,\n [CrepeFeature.Latex]: true,\n [CrepeFeature.TopBar]: false,\n [CrepeFeature.AI]: false,\n}\n","import type { Ctx } from '@milkdown/kit/ctx'\n\nimport { editorViewCtx, serializerCtx } from '@milkdown/kit/core'\n\nimport type { AIPromptContext } from './types'\n\n/// Default prompt context builder. Serializes the full document and\n/// the current selection (if any) as markdown, then pairs them with\n/// the user instruction.\nexport function defaultBuildContext(\n ctx: Ctx,\n instruction: string\n): AIPromptContext {\n const view = ctx.get(editorViewCtx)\n const serializer = ctx.get(serializerCtx)\n const { state } = view\n\n // Full document as markdown\n const document = serializer(state.doc)\n\n // Selected text as markdown (empty if selection is collapsed).\n // For block-level selections (whole paragraphs, list items, etc.)\n // we wrap the slice content in a doc node and serialize it. For\n // inline-only selections (text inside a single paragraph),\n // createAndFill on the doc type returns null because inline content\n // isn't valid as direct doc children — wrap it in a paragraph first\n // so marks (bold, italic, links) survive into the markdown output.\n let selection = ''\n if (!state.selection.empty) {\n const { from, to } = state.selection\n const slice = state.doc.slice(from, to)\n const { schema } = state.doc.type\n let wrapper = schema.topNodeType.createAndFill(null, slice.content)\n if (!wrapper) {\n const paragraph = schema.nodes.paragraph?.createAndFill(\n null,\n slice.content\n )\n if (paragraph) wrapper = schema.topNodeType.createAndFill(null, paragraph)\n }\n selection = wrapper ? serializer(wrapper) : state.doc.textBetween(from, to)\n }\n\n return { document, selection, instruction }\n}\n","import type { Ctx } from '@milkdown/kit/ctx'\nimport type { MilkdownError } from '@milkdown/kit/exception'\n\nimport { commandsCtx } from '@milkdown/kit/core'\nimport { aiBuildContextError, aiProviderError } from '@milkdown/kit/exception'\nimport { diffPluginKey } from '@milkdown/kit/plugin/diff'\nimport {\n abortStreamingCmd,\n endStreamingCmd,\n pushChunkCmd,\n startStreamingCmd,\n streamingPluginKey,\n} from '@milkdown/kit/plugin/streaming'\nimport { $command, $ctx } from '@milkdown/kit/utils'\n\nimport type { AIProvider, AIPromptContext, RunAIOptions } from './types'\n\nimport { defaultBuildContext } from './context'\n\n// ---------------------------------------------------------------------------\n// Context slices\n// ---------------------------------------------------------------------------\n\n/// Holds the user-supplied provider and prompt builder. Populated by\n/// the AI feature's setup function from `AIFeatureConfig`. `aiIcon`\n/// lives here too so that other features (notably the toolbar) can pick\n/// up the AI feature's icon override at render time.\nexport const aiProviderConfig = $ctx(\n {\n provider: undefined as AIProvider | undefined,\n buildContext: undefined as\n | ((ctx: Ctx, instruction: string) => AIPromptContext)\n | undefined,\n diffReviewOnEnd: true,\n onError: (error: MilkdownError) => {\n console.error(`[milkdown/ai] [${error.code}]`, error)\n },\n aiIcon: undefined as string | undefined,\n },\n 'aiProviderConfig'\n)\n\n/// Holds the AbortController and active-form label for the current AI\n/// session (null/empty when idle). `label` is shown in the streaming\n/// indicator. `lastInstruction`, `lastLabel`, `lastFrom`, `lastTo` are\n/// kept after the session ends so the diff-actions Retry button can\n/// re-run the same prompt on the same text range. `diffOwnedByAI` is\n/// flipped on right before our `endStreamingCmd` activates diff review\n/// and back off when the diff panel sees the diff close, so a manually\n/// started diff review (via `startDiffReviewCmd`) doesn't inherit the\n/// previous AI session's Retry affordance.\nexport const aiSessionCtx = $ctx(\n {\n abortController: null as AbortController | null,\n label: '',\n lastInstruction: '',\n lastLabel: undefined as string | undefined,\n lastFrom: -1,\n lastTo: -1,\n diffOwnedByAI: false,\n },\n 'aiSession'\n)\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction emitAIError(ctx: Ctx, error: MilkdownError): void {\n const config = ctx.get(aiProviderConfig.key)\n try {\n config.onError(error)\n } catch (handlerError) {\n console.error('[milkdown/ai] onError handler failed:', handlerError)\n }\n}\n\n/// Clear the live (`abortController`, `label`) portion of the session\n/// while preserving the `last*` fields used by the diff-actions Retry\n/// button.\nfunction clearActiveSession(ctx: Ctx): void {\n const current = ctx.get(aiSessionCtx.key)\n ctx.set(aiSessionCtx.key, {\n ...current,\n abortController: null,\n label: '',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Async provider runner\n// ---------------------------------------------------------------------------\n\nasync function runProvider(\n ctx: Ctx,\n provider: AIProvider,\n promptContext: AIPromptContext,\n abortController: AbortController\n): Promise<void> {\n try {\n const iterable = provider(promptContext, abortController.signal)\n const commands = ctx.get(commandsCtx)\n for await (const chunk of iterable) {\n if (abortController.signal.aborted) break\n commands.call(pushChunkCmd.key, chunk)\n }\n if (abortController.signal.aborted) return\n // Streaming complete — hand off to diff review if configured. The\n // ownership flag is flipped *before* the dispatch so the diff-actions\n // panel reads `true` during the same transaction's update cycle.\n // If the dispatch is rejected (e.g. host code already ended the\n // streaming session), revert the flag so the next manually-started\n // diff review isn't misclassified as AI-owned — `clearActiveSession`\n // intentionally preserves `diffOwnedByAI` because the panel is\n // responsible for clearing it on the diff true→false edge, but no\n // such edge fires when the dispatch never landed.\n const config = ctx.get(aiProviderConfig.key)\n if (config.diffReviewOnEnd) {\n const cur = ctx.get(aiSessionCtx.key)\n ctx.set(aiSessionCtx.key, { ...cur, diffOwnedByAI: true })\n }\n const dispatched = commands.call(endStreamingCmd.key, {\n diffReview: config.diffReviewOnEnd,\n })\n if (config.diffReviewOnEnd && !dispatched) {\n const cur = ctx.get(aiSessionCtx.key)\n ctx.set(aiSessionCtx.key, { ...cur, diffOwnedByAI: false })\n }\n } catch (error) {\n if (abortController.signal.aborted) return\n const milkdownError = aiProviderError(error)\n emitAIError(ctx, milkdownError)\n const commands = ctx.get(commandsCtx)\n commands.call(abortStreamingCmd.key, { keep: false })\n } finally {\n // Only clean up if this session is still the active one. If the\n // user aborted and immediately started a new session, the new\n // session owns the ctx now and we must not clobber it.\n const current = ctx.get(aiSessionCtx.key)\n if (current.abortController === abortController) {\n clearActiveSession(ctx)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\n/// Start an AI session: capture context, start streaming, and call the\n/// provider asynchronously. The command returns synchronously; the\n/// provider runs in the background.\n///\n/// When the user has a text selection, the streamed output replaces the\n/// selected text. The provider also receives the selected text in\n/// `AIPromptContext.selection` for context-aware generation.\nexport const runAICmd = $command('RunAI', (ctx) => {\n return (options?: RunAIOptions) => (state, dispatch) => {\n if (!options?.instruction) return false\n\n const config = ctx.get(aiProviderConfig.key)\n if (!config.provider) return false\n\n // Reject if a session is already running, streaming is active, or\n // diff review is active (the diff plugin blocks non-diff transactions,\n // so streaming flushes would be silently rejected).\n const session = ctx.get(aiSessionCtx.key)\n if (session.abortController) return false\n if (streamingPluginKey.getState(state)?.active) return false\n if (diffPluginKey.getState(state)?.active) return false\n\n // Dry-run: when dispatch is undefined, ProseMirror is probing\n // whether this command can execute. All precondition checks above\n // are side-effect-free so we can return true here.\n if (!dispatch) return true\n\n // Set the session label before starting the streaming plugin, so\n // the streaming-indicator widget reads the right label when its\n // decoration is first built. Empty string means \"no caller-supplied\n // label\" — the indicator widget falls through to its configured\n // `fallbackLabel`. `lastInstruction` / `lastLabel` are also stored\n // here so the diff-actions Retry button can re-run the same prompt\n // later.\n const abortController = new AbortController()\n const { from, to } = state.selection\n ctx.set(aiSessionCtx.key, {\n abortController,\n label: options.label ?? '',\n lastInstruction: options.instruction,\n lastLabel: options.label,\n lastFrom: from,\n lastTo: to,\n // Reset every run; only the success path that hands off to diff\n // review flips it back on.\n diffOwnedByAI: false,\n })\n\n // Start streaming — replaces the selection if non-empty.\n const commands = ctx.get(commandsCtx)\n const insertAt = state.selection.empty\n ? ('cursor' as const)\n : ('selection' as const)\n if (!commands.call(startStreamingCmd.key, { insertAt })) {\n clearActiveSession(ctx)\n return false\n }\n\n // Everything after startStreamingCmd is wrapped in try/catch: if\n // buildContext or anything else throws, we must abort the streaming\n // session to avoid leaving the editor locked with no way to recover.\n let promptContext: AIPromptContext\n try {\n const buildContext = config.buildContext ?? defaultBuildContext\n promptContext = buildContext(ctx, options.instruction)\n } catch (error) {\n const milkdownError = aiBuildContextError(error)\n emitAIError(ctx, milkdownError)\n commands.call(abortStreamingCmd.key, { keep: false })\n clearActiveSession(ctx)\n return false\n }\n\n // Fire-and-forget: the provider pushes chunks asynchronously.\n // startStreamingCmd already dispatched its own transaction — we\n // must NOT dispatch state.tr here as it would overwrite the\n // streaming plugin's state with a stale doc.\n void runProvider(ctx, config.provider, promptContext, abortController)\n\n return true\n }\n})\n\n/// Abort the current AI session. Signals the provider to stop and\n/// delegates to `abortStreamingCmd` if streaming is still active.\n/// Returns true whenever an AI session was actually cleaned up.\nexport const abortAICmd = $command('AbortAI', (ctx) => {\n return (options?: { keep?: boolean }) => (state, dispatch) => {\n const session = ctx.get(aiSessionCtx.key)\n // Dry-run: return whether there's something to abort, without\n // performing any side effects.\n if (!dispatch) return !!session.abortController\n\n if (!session.abortController) return false\n\n session.abortController.abort()\n clearActiveSession(ctx)\n\n // Only call abortStreamingCmd if the streaming plugin is still\n // active — it may have already finished/errored by the time the\n // user clicks abort.\n if (streamingPluginKey.getState(state)?.active) {\n const commands = ctx.get(commandsCtx)\n commands.call(abortStreamingCmd.key, options)\n }\n return true\n }\n})\n","export const aiIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M19 9l1.25-2.75L23 5l-2.75-1.25L19 1l-1.25 2.75L15 5l2.75 1.25zm0 14l1.25-2.75L23 19l-2.75-1.25L19 15l-1.25 2.75L15 19l2.75 1.25zM9 20l3-6.5L18 10l-6-3.5L9 0L6 6.5L0 10l6 3.5z\"\n transform=\"translate(3 3) scale(0.75)\"\n />\n </svg>\n`\n","export const chevronLeftIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M15.75 19.5L8.25 12l7.5-7.5\"\n />\n </svg>\n`\n","export const chevronRightIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M8.25 4.5l7.5 7.5-7.5 7.5\"\n />\n </svg>\n`\n","export const clearIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <g clip-path=\"url(#clip0_1098_15553)\">\n <path\n d=\"M18.3007 5.70973C17.9107 5.31973 17.2807 5.31973 16.8907 5.70973L12.0007 10.5897L7.1107 5.69973C6.7207 5.30973 6.0907 5.30973 5.7007 5.69973C5.3107 6.08973 5.3107 6.71973 5.7007 7.10973L10.5907 11.9997L5.7007 16.8897C5.3107 17.2797 5.3107 17.9097 5.7007 18.2997C6.0907 18.6897 6.7207 18.6897 7.1107 18.2997L12.0007 13.4097L16.8907 18.2997C17.2807 18.6897 17.9107 18.6897 18.3007 18.2997C18.6907 17.9097 18.6907 17.2797 18.3007 16.8897L13.4107 11.9997L18.3007 7.10973C18.6807 6.72973 18.6807 6.08973 18.3007 5.70973Z\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1098_15553\">\n <rect width=\"24\" height=\"24\" />\n </clipPath>\n </defs>\n </svg>\n`\n","export const confirmIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <g clip-path=\"url(#clip0_1013_1606)\">\n <path\n d=\"M9.00012 16.1998L5.50012 12.6998C5.11012 12.3098 4.49012 12.3098 4.10012 12.6998C3.71012 13.0898 3.71012 13.7098 4.10012 14.0998L8.29012 18.2898C8.68012 18.6798 9.31012 18.6798 9.70012 18.2898L20.3001 7.69982C20.6901 7.30982 20.6901 6.68982 20.3001 6.29982C19.9101 5.90982 19.2901 5.90982 18.9001 6.29982L9.00012 16.1998Z\"\n fill=\"#817567\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1013_1606\">\n <rect width=\"24\" height=\"24\" />\n </clipPath>\n </defs>\n </svg>\n`\n","export const editIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <g clip-path=\"url(#clip0_1013_1585)\">\n <path\n d=\"M14.06 9.02L14.98 9.94L5.92 19H5V18.08L14.06 9.02ZM17.66 3C17.41 3 17.15 3.1 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C18.17 3.09 17.92 3 17.66 3ZM14.06 6.19L3 17.25V21H6.75L17.81 9.94L14.06 6.19Z\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1013_1585\">\n <rect width=\"24\" height=\"24\" />\n </clipPath>\n </defs>\n </svg>\n`\n","export const enterKeyIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M9 16l-5-5l5-5l1.4 1.4L7.825 10H18V6h2v6H7.825l2.575 2.6z\"\n />\n </svg>\n`\n","export const grammarCheckIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M9.55 17.575L4.225 12.25l1.4-1.425L9.55 14.75l8.825-8.825l1.4 1.425z\"\n />\n </svg>\n`\n","export const longerIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M3 18v-2h13v2zm0-5v-2h18v2zm0-5V6h18v2zm15 13v-3h-3v-2h3v-3h2v3h3v2h-3v3z\"\n />\n </svg>\n`\n","export const retryIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M12 20q-3.35 0-5.675-2.325T4 12q0-3.35 2.325-5.675T12 4q1.725 0 3.3.713T18 6.75V4h2v7h-7V9h4.2q-.8-1.4-2.187-2.2T12 6Q9.5 6 7.75 7.75T6 12q0 2.5 1.75 4.25T12 18q1.925 0 3.475-1.1T17.65 14h2.1q-.7 2.65-2.85 4.325T12 20\"\n />\n </svg>\n`\n","export const sendIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M11 20V7.825l-5.6 5.6L4 12l8-8l8 8l-1.4 1.425l-5.6-5.6V20z\"\n />\n </svg>\n`\n","export const sendPromptIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M3 20v-6l8-2l-8-2V4l19 8z\"\n />\n </svg>\n`\n","export const shorterIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M5 13v-2h14v2z\"\n />\n </svg>\n`\n","export const translateIcon = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"m12.9 16l-2.55-2.5l.05-.05q1.45-1.6 2.262-3.117T13.95 7H16V5h-6V3H8v2H2v2h9.1q-.5 1.2-1.225 2.387T8 11.7q-.6-.6-1.187-1.412T5.85 8.6H3.85q.5 1.4 1.3 2.7T6.95 13.7L2.85 17.75L4.25 19.15L8 15.4L10.55 17.95zM18.5 22h-2L21 10h2l4.5 12h-2l-1.05-3h-4.9zm1.6-5h3.6l-1.8-5.1z\"\n />\n </svg>\n`\n","import type { Ctx } from '@milkdown/kit/ctx'\nimport type { Node } from '@milkdown/kit/prose/model'\nimport type { PluginView } from '@milkdown/kit/prose/state'\nimport type { EditorView } from '@milkdown/kit/prose/view'\n\nimport { commandsCtx, editorViewCtx } from '@milkdown/kit/core'\nimport {\n acceptAllDiffsCmd,\n clearDiffReviewCmd,\n diffPluginKey,\n} from '@milkdown/kit/plugin/diff'\nimport { TextSelection } from '@milkdown/kit/prose/state'\nimport DOMPurify from 'dompurify'\n\nimport { aiSessionCtx, runAICmd } from '../commands'\n\nconst PANEL_CLASS = 'milkdown-ai-diff-actions'\n\n/// Icons in `ResolvedDiffActionsConfig` are user-supplied SVG strings,\n/// so route them through DOMPurify before assigning to `innerHTML` —\n/// matches the sanitization the shared `Icon` component already does\n/// for Vue-rendered icons.\nfunction setSanitizedIcon(host: HTMLElement, svg: string): void {\n host.innerHTML = DOMPurify.sanitize(svg.trim())\n}\n\n/// Fully resolved diff actions config — every field has a value, so the\n/// view doesn't have to know about defaults.\nexport interface ResolvedDiffActionsConfig {\n retryLabel: string\n rejectAllLabel: string\n acceptAllLabel: string\n retryIcon: string\n rejectIcon: string\n acceptIcon: string\n enterKeyIcon: string\n modSymbol: string\n}\n\nfunction createIcon(svg: string): HTMLElement {\n const span = document.createElement('span')\n span.className = `${PANEL_CLASS}-icon`\n setSanitizedIcon(span, svg)\n return span\n}\n\nexport class DiffActionsPanelView implements PluginView {\n readonly #panel: HTMLElement\n readonly #host: HTMLElement\n readonly #retryBtn: HTMLButtonElement\n readonly #config: ResolvedDiffActionsConfig\n #visible = false\n /// Tracks the diff plugin's `active` flag across transactions so we\n /// can detect false→true / true→false edges independently of whether\n /// the panel is actually being shown.\n #diffActive = false\n /// Doc snapshot at the moment diff review activated. If the live doc\n /// drifts from this snapshot the user has accepted some per-change\n /// diffs and the stored `lastFrom`/`lastTo` no longer point at the\n /// original range — Retry is unsafe at that point.\n #diffStartDoc: Node | null = null\n /// Whether the active diff review came from this AI session's\n /// streaming hand-off (vs being started manually via\n /// `startDiffReviewCmd`). Captured at the false→true transition.\n /// The panel only renders when this is true so it doesn't take over\n /// non-AI diff flows that exist independently of the AI feature.\n #ownedByAI = false\n\n constructor(\n readonly ctx: Ctx,\n view: EditorView,\n config: ResolvedDiffActionsConfig\n ) {\n this.#config = config\n this.#host = this.#findHost(view)\n\n const panel = document.createElement('div')\n panel.className = PANEL_CLASS\n panel.dataset.show = 'false'\n\n this.#retryBtn = this.#makeButton(\n 'retry',\n config.retryIcon,\n config.retryLabel,\n this.#retry\n )\n panel.appendChild(this.#retryBtn)\n panel.appendChild(\n this.#makeButton(\n 'reject',\n config.rejectIcon,\n config.rejectAllLabel,\n this.#rejectAll\n )\n )\n const acceptBtn = this.#makeButton(\n 'accept',\n config.acceptIcon,\n config.acceptAllLabel,\n this.#acceptAll\n )\n acceptBtn.appendChild(this.#makeShortcutChip())\n panel.appendChild(acceptBtn)\n\n this.#panel = panel\n this.#host.appendChild(panel)\n this.update(view)\n }\n\n #findHost(view: EditorView): HTMLElement {\n return (view.dom.closest('.milkdown') as HTMLElement) ?? document.body\n }\n\n #makeButton(\n variant: 'retry' | 'reject' | 'accept',\n icon: string,\n label: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = `${PANEL_CLASS}-btn ${PANEL_CLASS}-btn-${variant}`\n btn.appendChild(createIcon(icon))\n const text = document.createElement('span')\n text.textContent = label\n btn.appendChild(text)\n btn.addEventListener('mousedown', (e) => e.preventDefault())\n btn.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n onClick()\n })\n return btn\n }\n\n #makeShortcutChip(): HTMLElement {\n const shortcut = document.createElement('span')\n shortcut.className = `${PANEL_CLASS}-shortcut`\n const cmd = document.createElement('span')\n cmd.textContent = this.#config.modSymbol\n const enter = document.createElement('span')\n enter.className = `${PANEL_CLASS}-shortcut-icon`\n setSanitizedIcon(enter, this.#config.enterKeyIcon)\n shortcut.append(cmd, enter)\n return shortcut\n }\n\n #retry = (): void => {\n const session = this.ctx.get(aiSessionCtx.key)\n if (!session.lastInstruction) return\n // Refuse to retry when the active diff didn't originate from this\n // AI session, or once the user has accepted any individual diff —\n // `clearDiffReviewCmd` only exits diff mode, it doesn't roll back\n // accepted changes, so the stored range would point at shifted text.\n if (!this.#ownedByAI || !this.#canRetry()) return\n\n const commands = this.ctx.get(commandsCtx)\n commands.call(clearDiffReviewCmd.key)\n const editorView = this.ctx.get(editorViewCtx)\n const { doc } = editorView.state\n const from = Math.min(Math.max(session.lastFrom, 0), doc.content.size)\n const to = Math.min(Math.max(session.lastTo, 0), doc.content.size)\n editorView.dispatch(\n editorView.state.tr.setSelection(\n TextSelection.create(editorView.state.doc, from, to)\n )\n )\n commands.call(runAICmd.key, {\n instruction: session.lastInstruction,\n label: session.lastLabel,\n })\n }\n\n #canRetry(): boolean {\n if (!this.#diffStartDoc) return false\n const editorView = this.ctx.get(editorViewCtx)\n return editorView.state.doc.eq(this.#diffStartDoc)\n }\n\n #rejectAll = (): void => {\n this.ctx.get(commandsCtx).call(clearDiffReviewCmd.key)\n }\n\n #acceptAll = (): void => {\n this.ctx.get(commandsCtx).call(acceptAllDiffsCmd.key)\n }\n\n update(view: EditorView): void {\n const diffActive = !!diffPluginKey.getState(view.state)?.active\n\n if (diffActive !== this.#diffActive) {\n this.#diffActive = diffActive\n if (diffActive) {\n // false → true. Capture ownership now; from this point on any\n // doc drift means the user has accepted individual diffs.\n const session = this.ctx.get(aiSessionCtx.key)\n this.#ownedByAI = session.diffOwnedByAI\n this.#diffStartDoc = view.state.doc\n } else {\n // true → false. Clear local state and the session-level flag so\n // a subsequent manual diff doesn't pick up stale ownership.\n this.#ownedByAI = false\n this.#diffStartDoc = null\n const session = this.ctx.get(aiSessionCtx.key)\n if (session.diffOwnedByAI) {\n this.ctx.set(aiSessionCtx.key, {\n ...session,\n diffOwnedByAI: false,\n })\n }\n }\n }\n\n // Render only for AI-owned diff reviews. Non-AI diffs (started via\n // `startDiffReviewCmd` directly) are left to whatever UX the host\n // had in place before this feature shipped.\n const shouldShow = diffActive && this.#ownedByAI\n if (shouldShow !== this.#visible) {\n this.#visible = shouldShow\n this.#panel.dataset.show = shouldShow ? 'true' : 'false'\n }\n\n if (shouldShow) {\n // Re-evaluate Retry every transaction so the button disables the\n // moment a per-change accept shifts the doc out of its initial\n // form.\n const session = this.ctx.get(aiSessionCtx.key)\n const docUntouched =\n !!this.#diffStartDoc && view.state.doc.eq(this.#diffStartDoc)\n this.#retryBtn.disabled = !session.lastInstruction || !docUntouched\n }\n }\n\n destroy(): void {\n this.#panel.remove()\n }\n}\n","import { commandsCtx } from '@milkdown/kit/core'\nimport { acceptAllDiffsCmd, diffPluginKey } from '@milkdown/kit/plugin/diff'\nimport { Plugin, PluginKey } from '@milkdown/kit/prose/state'\nimport { $prose } from '@milkdown/kit/utils'\n\nimport type { AIDiffActionsConfig } from '../types'\n\nimport {\n clearIcon as defaultRejectIcon,\n confirmIcon as defaultAcceptIcon,\n enterKeyIcon as defaultEnterKeyIcon,\n retryIcon as defaultRetryIcon,\n} from '../../../icons'\nimport { aiSessionCtx } from '../commands'\nimport { DiffActionsPanelView, type ResolvedDiffActionsConfig } from './view'\n\nconst diffActionsPanelKey = new PluginKey('CREPE_AI_DIFF_ACTIONS_PANEL')\n\nexport const DEFAULT_DIFF_ACTIONS_RETRY_LABEL = 'Retry'\nexport const DEFAULT_DIFF_ACTIONS_REJECT_ALL_LABEL = 'Reject all'\nexport const DEFAULT_DIFF_ACTIONS_ACCEPT_ALL_LABEL = 'Accept all'\n\nfunction detectModSymbol(): string {\n if (typeof navigator === 'undefined') return '⌘'\n // `userAgentData.platform` is the modern accessor; fall back to the\n // legacy `platform` / `userAgent` strings for older browsers and\n // jsdom-based test environments.\n const ua = navigator as unknown as {\n userAgentData?: { platform?: string }\n platform?: string\n userAgent?: string\n }\n const platform =\n ua.userAgentData?.platform ?? ua.platform ?? ua.userAgent ?? ''\n return /mac|iphone|ipad|ipod/i.test(platform) ? '⌘' : 'Ctrl'\n}\n\n/// Detected per renderer process. Override via\n/// `AIDiffActionsConfig.modSymbol` when the UI should diverge from the\n/// runtime platform (e.g. always render `⌘` in a macOS-themed product).\nexport const DEFAULT_DIFF_ACTIONS_MOD_SYMBOL = detectModSymbol()\n\ninterface DiffActionsPluginOptions {\n config?: AIDiffActionsConfig\n /// The enter-key icon is owned by the top-level `AIFeatureConfig` so a\n /// single override applies to both the instruction tooltip and this\n /// panel's shortcut chip.\n enterKeyIcon?: string\n}\n\nfunction resolveDiffActionsConfig(\n options: DiffActionsPluginOptions\n): ResolvedDiffActionsConfig {\n const { config, enterKeyIcon } = options\n return {\n retryLabel: config?.retryLabel ?? DEFAULT_DIFF_ACTIONS_RETRY_LABEL,\n rejectAllLabel:\n config?.rejectAllLabel ?? DEFAULT_DIFF_ACTIONS_REJECT_ALL_LABEL,\n acceptAllLabel:\n config?.acceptAllLabel ?? DEFAULT_DIFF_ACTIONS_ACCEPT_ALL_LABEL,\n retryIcon: config?.retryIcon ?? defaultRetryIcon,\n rejectIcon: config?.rejectIcon ?? defaultRejectIcon,\n acceptIcon: config?.acceptIcon ?? defaultAcceptIcon,\n enterKeyIcon: enterKeyIcon ?? defaultEnterKeyIcon,\n modSymbol: config?.modSymbol ?? DEFAULT_DIFF_ACTIONS_MOD_SYMBOL,\n }\n}\n\nexport function diffActionsPanelPlugin(options: DiffActionsPluginOptions = {}) {\n const resolved = resolveDiffActionsConfig(options)\n\n return $prose((ctx) => {\n return new Plugin({\n key: diffActionsPanelKey,\n view(view) {\n return new DiffActionsPanelView(ctx, view, resolved)\n },\n props: {\n handleKeyDown(view, event) {\n if (event.key !== 'Enter') return false\n if (!(event.metaKey || event.ctrlKey)) return false\n if (!diffPluginKey.getState(view.state)?.active) return false\n // Only intercept Mod-Enter for diffs this AI session started.\n // Manual `startDiffReviewCmd` flows shouldn't have their key\n // bindings mutated just because the AI feature is loaded.\n if (!ctx.get(aiSessionCtx.key).diffOwnedByAI) return false\n event.preventDefault()\n const commands = ctx.get(commandsCtx)\n commands.call(acceptAllDiffsCmd.key)\n return true\n },\n },\n })\n })\n}\n","import {\n aiIcon,\n editIcon,\n grammarCheckIcon,\n longerIcon,\n shorterIcon,\n translateIcon,\n} from '../../../icons'\n\n/// A single AI suggestion. `prompt` is sent to the provider; `streamingLabel`\n/// is the active-form text shown in the streaming indicator while AI runs.\nexport interface AISuggestionItem {\n icon: string\n label: string\n streamingLabel?: string\n prompt: string\n}\n\n/// A submenu definition. `title` is shown next to the back arrow when the\n/// submenu is open; `searchPlaceholder` replaces the input placeholder.\nexport interface AISubmenuDef {\n icon: string\n label: string\n title: string\n searchPlaceholder: string\n}\n\n/// Mutates a submenu's items in place. Obtained from\n/// `AISuggestionsBuilder.addSubmenu` (via the build callback) or\n/// `AISuggestionsBuilder.getSubmenu(id)`.\nexport interface AISubmenuBuilder {\n addItem: (id: string, item: AISuggestionItem) => AISubmenuBuilder\n removeItem: (id: string) => AISubmenuBuilder\n getItem: (id: string) => AISuggestionItem | undefined\n clear: () => AISubmenuBuilder\n}\n\ninterface SubmenuNode {\n def: AISubmenuDef\n items: Map<string, AISuggestionItem>\n}\n\nfunction createSubmenuBuilder(node: SubmenuNode): AISubmenuBuilder {\n const builder: AISubmenuBuilder = {\n addItem: (id, item) => {\n node.items.set(id, item)\n return builder\n },\n removeItem: (id) => {\n node.items.delete(id)\n return builder\n },\n getItem: (id) => node.items.get(id),\n clear: () => {\n node.items.clear()\n return builder\n },\n }\n return builder\n}\n\ntype RootNode =\n | { kind: 'item'; id: string; item: AISuggestionItem }\n | { kind: 'submenu'; id: string; node: SubmenuNode }\n\nexport type ResolvedItemEntry = {\n kind: 'item'\n id: string\n item: AISuggestionItem\n}\n\nexport type ResolvedSubmenuEntry = {\n kind: 'submenu'\n id: string\n def: AISubmenuDef\n}\n\n/// Resolved tree consumed by the tooltip view. `submenus` is keyed by\n/// submenu id so the view can switch between main and submenu lists.\nexport interface ResolvedSuggestions {\n main: Array<ResolvedItemEntry | ResolvedSubmenuEntry>\n submenus: Record<\n string,\n { def: AISubmenuDef; items: Array<{ id: string; item: AISuggestionItem }> }\n >\n}\n\nexport class AISuggestionsBuilder {\n #nodes: RootNode[] = []\n\n addItem = (id: string, item: AISuggestionItem) => {\n this.#removeById(id)\n this.#nodes.push({ kind: 'item', id, item })\n return this\n }\n\n /// Add a submenu. Populate items via the optional `build` callback,\n /// or call `getSubmenu(id)` afterward. Returns `this` so calls can be\n /// chained at the parent level alongside `addItem`.\n addSubmenu = (\n id: string,\n def: AISubmenuDef,\n build?: (sub: AISubmenuBuilder) => void\n ) => {\n this.#removeById(id)\n const node: SubmenuNode = { def, items: new Map() }\n if (build) build(createSubmenuBuilder(node))\n this.#nodes.push({ kind: 'submenu', id, node })\n return this\n }\n\n removeItem = (id: string) => {\n this.#removeById(id)\n return this\n }\n\n getItem = (id: string) => {\n const node = this.#nodes.find((n) => n.kind === 'item' && n.id === id)\n return node?.kind === 'item' ? node.item : undefined\n }\n\n /// Return a builder that mutates the submenu's items in place.\n /// Multiple calls return distinct builder objects backed by the same\n /// underlying node, so changes are always visible.\n getSubmenu = (id: string) => {\n const node = this.#nodes.find((n) => n.kind === 'submenu' && n.id === id)\n return node?.kind === 'submenu'\n ? createSubmenuBuilder(node.node)\n : undefined\n }\n\n clear = () => {\n this.#nodes = []\n return this\n }\n\n build = (): ResolvedSuggestions => {\n const main: ResolvedSuggestions['main'] = []\n const submenus: ResolvedSuggestions['submenus'] = {}\n for (const node of this.#nodes) {\n if (node.kind === 'item') {\n main.push({ kind: 'item', id: node.id, item: node.item })\n } else {\n main.push({ kind: 'submenu', id: node.id, def: node.node.def })\n submenus[node.id] = {\n def: node.node.def,\n items: Array.from(node.node.items.entries()).map(([id, item]) => ({\n id,\n item,\n })),\n }\n }\n }\n return { main, submenus }\n }\n\n #removeById = (id: string) => {\n this.#nodes = this.#nodes.filter((n) => n.id !== id)\n }\n}\n\n/// Populate a builder with the built-in defaults. Called before the\n/// user's `buildAISuggestions` callback so the user can add to,\n/// inspect, or remove any default.\nexport function applyDefaultSuggestions(builder: AISuggestionsBuilder): void {\n builder\n .addItem('improve', {\n icon: aiIcon,\n label: 'Improve writing',\n streamingLabel: 'Improving writing',\n prompt: 'Improve the writing while preserving the original meaning.',\n })\n .addItem('grammar', {\n icon: grammarCheckIcon,\n label: 'Fix grammar & spelling',\n streamingLabel: 'Fixing grammar & spelling',\n prompt:\n 'Fix any grammar and spelling errors without changing the meaning.',\n })\n .addItem('shorter', {\n icon: shorterIcon,\n label: 'Make shorter',\n streamingLabel: 'Making shorter',\n prompt: 'Make this shorter while preserving the key information.',\n })\n .addItem('longer', {\n icon: longerIcon,\n label: 'Make longer',\n streamingLabel: 'Expanding',\n prompt: 'Expand this with more detail and examples.',\n })\n\n builder.addSubmenu(\n 'tone',\n {\n icon: editIcon,\n label: 'Change tone…',\n title: 'Change tone',\n searchPlaceholder: 'Search tones…',\n },\n (sub) => {\n const tones: Array<[string, string]> = [\n ['professional', 'Professional'],\n ['casual', 'Casual'],\n ['confident', 'Confident'],\n ['friendly', 'Friendly'],\n ['direct', 'Direct'],\n ['formal', 'Formal'],\n ]\n for (const [id, label] of tones) {\n sub.addItem(id, {\n icon: editIcon,\n label,\n streamingLabel: 'Adjusting tone',\n prompt: `Rewrite this in a ${label.toLowerCase()} tone.`,\n })\n }\n }\n )\n\n builder.addSubmenu(\n 'translate',\n {\n icon: translateIcon,\n label: 'Translate…',\n title: 'Translate',\n searchPlaceholder: 'Search languages…',\n },\n (sub) => {\n const languages: Array<[string, string, string]> = [\n ['english', 'English', 'English'],\n ['chinese', 'Chinese', 'Chinese (Simplified)'],\n ['japanese', 'Japanese', 'Japanese'],\n ['korean', 'Korean', 'Korean'],\n ['spanish', 'Spanish', 'Spanish'],\n ['french', 'French', 'French'],\n ['german', 'German', 'German'],\n ]\n for (const [id, label, promptName] of languages) {\n sub.addItem(id, {\n icon: translateIcon,\n label,\n streamingLabel: `Translating to ${label}`,\n prompt: `Translate this to ${promptName}.`,\n })\n }\n }\n )\n}\n","// Prevent tree-shaking from removing Vue's `h` and `Fragment`,\n// which are required at runtime for TSX to work.\nexport function keepAlive(..._args: unknown[]) {}\n","import { Icon } from '@milkdown/kit/component'\nimport {\n computed,\n defineComponent,\n h,\n nextTick,\n ref,\n watch,\n type Ref,\n} from 'vue'\n\nimport type { AISuggestionItem, ResolvedSuggestions } from './suggestions'\n\nimport { keepAlive } from '../../../utils/keep-alive'\n\nkeepAlive(h)\n\n/// Resolved chrome (icons + labels) for the tooltip. All fields required —\n/// the view layer fills in defaults before mounting the component.\nexport interface AIInstructionTooltipChrome {\n aiIcon: string\n sendIcon: string\n sendPromptIcon: string\n enterKeyIcon: string\n chevronLeftIcon: string\n chevronRightIcon: string\n suggestionsHeaderLabel: string\n sendAsPromptHeaderLabel: string\n sendAsPromptLabel: string\n submitButtonLabel: string\n listboxLabel: string\n}\n\ntype ViewMode = { kind: 'main' } | { kind: 'submenu'; id: string }\n\ninterface DisplayItem {\n id: string\n icon: string\n label: string\n hasSubmenu: boolean\n /// undefined when the item opens a submenu; defined when it sends a prompt\n prompt?: { text: string; streamingLabel?: string }\n}\n\nfunction renderHighlighted(label: string, query: string) {\n const q = query.trim()\n if (!q) return [label]\n const lower = label.toLowerCase()\n const lq = q.toLowerCase()\n const idx = lower.indexOf(lq)\n if (idx === -1) return [label]\n return [\n label.slice(0, idx),\n h('mark', null, label.slice(idx, idx + q.length)),\n label.slice(idx + q.length),\n ]\n}\n\ntype AIInstructionInputProps = {\n placeholder: Ref<string>\n /// Bumped by the view layer every time the tooltip is shown, so the\n /// component can reset transient state (input value, submenu, cursor).\n resetSignal: Ref<number>\n suggestions: ResolvedSuggestions\n chrome: AIInstructionTooltipChrome\n onConfirm: (instruction: string, label?: string) => void\n onCancel: () => void\n}\n\nexport const AIInstructionInput = defineComponent<AIInstructionInputProps>({\n props: {\n placeholder: { type: Object, required: true },\n resetSignal: { type: Object, required: true },\n suggestions: { type: Object, required: true },\n chrome: { type: Object, required: true },\n onConfirm: { type: Function, required: true },\n onCancel: { type: Function, required: true },\n },\n setup({\n placeholder,\n resetSignal,\n suggestions,\n chrome,\n onConfirm,\n onCancel,\n }) {\n const inputValue = ref('')\n const view = ref<ViewMode>({ kind: 'main' })\n const selectedIndex = ref(0)\n const inputRef = ref<HTMLInputElement | null>(null)\n const listRef = ref<HTMLDivElement | null>(null)\n\n // Stable id pair used to wire the input ↔ listbox combobox so that\n // screen readers announce the highlighted option as the user moves\n // through the suggestions with the arrow keys.\n const listboxId = `ai-instruction-list-${Math.random().toString(36).slice(2, 9)}`\n const optionId = (idx: number) => `${listboxId}-opt-${idx}`\n\n watch(resetSignal, () => {\n inputValue.value = ''\n view.value = { kind: 'main' }\n selectedIndex.value = 0\n })\n\n const allItems = computed<DisplayItem[]>(() => {\n if (view.value.kind === 'submenu') {\n const submenu = suggestions.submenus[view.value.id]\n if (!submenu) return []\n return submenu.items.map(({ id, item }) => ({\n id,\n icon: item.icon,\n label: item.label,\n hasSubmenu: false,\n prompt: { text: item.prompt, streamingLabel: item.streamingLabel },\n }))\n }\n return suggestions.main.map((entry) => {\n if (entry.kind === 'item') {\n return {\n id: entry.id,\n icon: entry.item.icon,\n label: entry.item.label,\n hasSubmenu: false,\n prompt: {\n text: entry.item.prompt,\n streamingLabel: entry.item.streamingLabel,\n },\n }\n }\n return {\n id: entry.id,\n icon: entry.def.icon,\n label: entry.def.label,\n hasSubmenu: true,\n }\n })\n })\n\n const currentSubmenuDef = computed(() => {\n if (view.value.kind !== 'submenu') return null\n return suggestions.submenus[view.value.id]?.def ?? null\n })\n\n const filteredItems = computed(() => {\n const q = inputValue.value.trim().toLowerCase()\n if (!q) return allItems.value\n return allItems.value.filter((item) =>\n item.label.toLowerCase().includes(q)\n )\n })\n\n const showSendAsPrompt = computed(() => inputValue.value.trim().length > 0)\n\n const totalItems = computed(\n () => filteredItems.value.length + (showSendAsPrompt.value ? 1 : 0)\n )\n\n watch([filteredItems, view, showSendAsPrompt], () => {\n // When the user has typed something, default the highlight to the\n // \"Send as prompt\" row (always last in the list) so pressing Enter\n // sends the typed text instead of running whichever built-in\n // suggestion happens to substring-match the query.\n selectedIndex.value = showSendAsPrompt.value\n ? filteredItems.value.length\n : 0\n })\n\n const focusInput = () => {\n void nextTick(() => inputRef.value?.focus())\n }\n\n const enterSubmenu = (id: string) => {\n view.value = { kind: 'submenu', id }\n inputValue.value = ''\n selectedIndex.value = 0\n focusInput()\n }\n\n const exitSubmenu = () => {\n view.value = { kind: 'main' }\n inputValue.value = ''\n selectedIndex.value = 0\n focusInput()\n }\n\n const runItem = (item: DisplayItem) => {\n if (item.hasSubmenu) {\n enterSubmenu(item.id)\n } else if (item.prompt) {\n onConfirm(item.prompt.text, item.prompt.streamingLabel)\n inputValue.value = ''\n }\n }\n\n const submitRaw = () => {\n const v = inputValue.value.trim()\n if (!v) return\n onConfirm(v)\n inputValue.value = ''\n }\n\n const onSelectCurrent = () => {\n const idx = selectedIndex.value\n const items = filteredItems.value\n if (idx < items.length) {\n runItem(items[idx]!)\n } else if (showSendAsPrompt.value) {\n submitRaw()\n }\n }\n\n const scrollToSelected = () => {\n void nextTick(() => {\n const list = listRef.value\n if (!list) return\n const el = list.querySelector(\n `[data-index=\"${selectedIndex.value}\"]`\n ) as HTMLElement | null\n el?.scrollIntoView({ block: 'nearest' })\n })\n }\n\n const onKeydown = (e: KeyboardEvent) => {\n e.stopPropagation()\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n if (totalItems.value === 0) return\n selectedIndex.value = (selectedIndex.value + 1) % totalItems.value\n scrollToSelected()\n return\n }\n\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n if (totalItems.value === 0) return\n selectedIndex.value =\n (selectedIndex.value - 1 + totalItems.value) % totalItems.value\n scrollToSelected()\n return\n }\n\n if (e.key === 'Enter') {\n e.preventDefault()\n onSelectCurrent()\n return\n }\n\n if (e.key === 'Escape') {\n e.preventDefault()\n if (view.value.kind === 'submenu') exitSubmenu()\n else onCancel()\n return\n }\n\n if (\n e.key === 'Backspace' &&\n inputValue.value === '' &&\n view.value.kind === 'submenu'\n ) {\n e.preventDefault()\n exitSubmenu()\n }\n }\n\n const onItemPointerDown = (e: Event) => {\n e.preventDefault()\n }\n\n return () => {\n const items = filteredItems.value\n const showPrompt = showSendAsPrompt.value\n const submenuDef = currentSubmenuDef.value\n\n return (\n <div class=\"ai-instruction\">\n <div class=\"ai-instruction-input\">\n <span class=\"ai-instruction-input-prefix\">\n <Icon icon={chrome.aiIcon} />\n </span>\n <input\n ref={inputRef}\n class=\"ai-instruction-input-field\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n totalItems.value > 0 ? optionId(selectedIndex.value) : undefined\n }\n placeholder={\n submenuDef ? submenuDef.searchPlaceholder : placeholder.value\n }\n value={inputValue.value}\n onInput={(e: Event) => {\n inputValue.value = (e.target as HTMLInputElement).value\n }}\n onKeydown={onKeydown}\n />\n <button\n type=\"button\"\n class=\"ai-instruction-submit\"\n aria-label={chrome.submitButtonLabel}\n disabled={!showPrompt}\n onMousedown={onItemPointerDown}\n onClick={submitRaw}\n >\n <Icon icon={chrome.sendIcon} />\n </button>\n </div>\n\n <div\n class=\"ai-instruction-list\"\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={chrome.listboxLabel}\n >\n {submenuDef && (\n <button\n type=\"button\"\n class=\"ai-instruction-back\"\n onMousedown={onItemPointerDown}\n onClick={exitSubmenu}\n >\n <span class=\"ai-instruction-back-icon\" aria-hidden=\"true\">\n <Icon icon={chrome.chevronLeftIcon} />\n </span>\n <span>{submenuDef.title}</span>\n </button>\n )}\n\n {items.length > 0 && (\n <div class=\"ai-instruction-section\">\n <div class=\"ai-instruction-section-header\">\n {chrome.suggestionsHeaderLabel}\n </div>\n {items.map((item, idx) => (\n <div\n key={item.id}\n id={optionId(idx)}\n data-index={idx}\n role=\"option\"\n aria-selected={idx === selectedIndex.value}\n class={[\n 'ai-instruction-item',\n idx === selectedIndex.value ? 'active' : '',\n ]}\n onMousedown={onItemPointerDown}\n onClick={() => runItem(item)}\n onPointerenter={() => {\n selectedIndex.value = idx\n }}\n >\n <span class=\"ai-instruction-item-icon\">\n <Icon icon={item.icon} />\n </span>\n <span class=\"ai-instruction-item-label\">\n {renderHighlighted(item.label, inputValue.value)}\n </span>\n {item.hasSubmenu && (\n <span class=\"ai-instruction-item-arrow\">\n <Icon icon={chrome.chevronRightIcon} />\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {showPrompt && (\n <div class=\"ai-instruction-section\">\n <div class=\"ai-instruction-section-header\">\n {chrome.sendAsPromptHeaderLabel}\n </div>\n <div\n id={optionId(items.length)}\n data-index={items.length}\n role=\"option\"\n aria-selected={selectedIndex.value === items.length}\n class={[\n 'ai-instruction-item',\n 'ai-instruction-item-prompt',\n selectedIndex.value === items.length ? 'active' : '',\n ]}\n onMousedown={onItemPointerDown}\n onClick={submitRaw}\n onPointerenter={() => {\n selectedIndex.value = items.length\n }}\n >\n <span class=\"ai-instruction-item-icon\">\n <Icon icon={chrome.sendPromptIcon} />\n </span>\n <span class=\"ai-instruction-item-label\">\n {chrome.sendAsPromptLabel}{' '}\n <span class=\"ai-instruction-item-quote\">\n \"{inputValue.value}\"\n </span>\n </span>\n <span class=\"ai-instruction-item-shortcut\">\n <Icon icon={chrome.enterKeyIcon} />\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n }\n },\n})\n\nexport type { AISuggestionItem }\n","import type { Ctx } from '@milkdown/kit/ctx'\nimport type { EditorState, PluginView } from '@milkdown/kit/prose/state'\nimport type { EditorView } from '@milkdown/kit/prose/view'\n\nimport { commandsCtx, editorViewCtx } from '@milkdown/kit/core'\nimport { TooltipProvider } from '@milkdown/kit/plugin/tooltip'\nimport { posToDOMRect } from '@milkdown/kit/prose'\nimport { TextSelection } from '@milkdown/kit/prose/state'\nimport { createApp, ref, type App } from 'vue'\n\nimport type { ResolvedSuggestions } from './suggestions'\n\nimport { runAICmd } from '../commands'\nimport {\n AIInstructionInput,\n type AIInstructionTooltipChrome,\n} from './component'\n\nexport interface AIInstructionTooltipViewConfig {\n placeholder: string\n chrome: AIInstructionTooltipChrome\n suggestions: ResolvedSuggestions\n}\n\nexport class AIInstructionTooltipView implements PluginView {\n #content: HTMLElement\n #provider: TooltipProvider\n #app: App\n #placeholder\n #resetSignal\n #from = -1\n #to = -1\n /// Source of truth for \"should the palette currently be showing\".\n /// `TooltipProvider.shouldShow` reads this so that forwarding `update()`\n /// to the provider on every editor transition (needed to keep the\n /// floating position in sync with layout changes) doesn't dismiss the\n /// palette behind our back.\n #wantsShow = false\n\n constructor(\n readonly ctx: Ctx,\n view: EditorView,\n config: AIInstructionTooltipViewConfig\n ) {\n // Wrapped in a ref so the Vue component re-renders if it ever\n // changes; today there's no setter, but keeping it reactive lets a\n // future API (e.g. context-sensitive placeholders) plug in cleanly.\n this.#placeholder = ref(config.placeholder)\n // Bumped on each `show()` so the component clears input/submenu/cursor\n // state — the Vue app stays mounted across hide/show cycles, so its\n // local state would otherwise persist into the next session.\n this.#resetSignal = ref(0)\n\n const content = document.createElement('div')\n content.className = 'milkdown-ai-instruction'\n\n const app = createApp(AIInstructionInput, {\n placeholder: this.#placeholder,\n resetSignal: this.#resetSignal,\n suggestions: config.suggestions,\n chrome: config.chrome,\n onConfirm: this.#onConfirm,\n onCancel: this.#onCancel,\n })\n app.mount(content)\n this.#app = app\n this.#content = content\n\n this.#provider = new TooltipProvider({\n content,\n debounce: 0,\n offset: 10,\n shouldShow: () => this.#wantsShow,\n floatingUIOptions: {\n placement: 'bottom',\n },\n })\n this.#provider.onHide = () => {\n this.#wantsShow = false\n requestAnimationFrame(() => {\n try {\n // Only restore focus to the editor when the palette itself\n // was holding focus at hide time (Escape, Enter-to-confirm,\n // selection-driven dismissal). If the user dismissed the\n // palette by clicking somewhere else, focus is already on\n // that target and stealing it back would frustrate keyboard\n // and assistive-technology users trying to leave the editor.\n const root = this.#content.getRootNode() as Document | ShadowRoot\n const active = root.activeElement\n if (!active || !this.#content.contains(active)) return\n const v = this.ctx.get(editorViewCtx)\n v.dom.focus({ preventScroll: true })\n } catch {\n // Editor may be destroyed\n }\n })\n }\n this.#provider.update(view)\n }\n\n #onConfirm = (instruction: string, label?: string) => {\n if (!instruction.trim()) return\n // Dispatch first and only dismiss the palette on success. If\n // `runAICmd` rejects (no provider, an active streaming session, an\n // active diff review, …) the user's typed instruction stays visible\n // so they can retry once the editor is in a state that accepts it.\n const commands = this.ctx.get(commandsCtx)\n const accepted = commands.call(runAICmd.key, { instruction, label })\n if (!accepted) return\n this.#wantsShow = false\n this.#provider.hide()\n }\n\n #onCancel = () => {\n this.#wantsShow = false\n this.#provider.hide()\n }\n\n show = (from: number, to: number) => {\n this.#from = from\n this.#to = to\n this.#resetSignal.value++\n this.#wantsShow = true\n const view = this.ctx.get(editorViewCtx)\n this.#provider.show(\n { getBoundingClientRect: () => posToDOMRect(view, from, to) },\n view\n )\n requestAnimationFrame(() => {\n this.#content.querySelector('input')?.focus()\n })\n }\n\n update = (view: EditorView, prevState?: EditorState) => {\n const { selection } = view.state\n // Hide whenever the anchor selection moves OR becomes a non-text\n // selection (e.g. user clicks an image or table node). Otherwise the\n // tooltip would stay orphaned on screen with no valid range.\n const isTextSelection = selection instanceof TextSelection\n const movedRange =\n selection.from !== this.#from || selection.to !== this.#to\n if (!isTextSelection || movedRange) {\n this.#wantsShow = false\n this.#provider.hide()\n return\n }\n\n // Forward to the provider so floating UI re-runs its position\n // calculation against the current view (anchor coordinates can shift\n // with layout/document changes even when from/to stay the same).\n this.#provider.update(view, prevState)\n }\n\n destroy = () => {\n this.#app.unmount()\n this.#provider.destroy()\n this.#content.remove()\n }\n}\n","import type { Ctx } from '@milkdown/kit/ctx'\n\nimport { tooltipFactory } from '@milkdown/kit/plugin/tooltip'\nimport { $ctx } from '@milkdown/kit/utils'\n\nimport type { AIFeatureConfig } from '../types'\nimport type { AIInstructionTooltipChrome } from './component'\n\nimport {\n aiIcon as defaultAiIcon,\n chevronLeftIcon as defaultChevronLeftIcon,\n chevronRightIcon as defaultChevronRightIcon,\n enterKeyIcon as defaultEnterKeyIcon,\n sendIcon as defaultSendIcon,\n sendPromptIcon as defaultSendPromptIcon,\n} from '../../../icons'\nimport { AISuggestionsBuilder, applyDefaultSuggestions } from './suggestions'\nimport {\n AIInstructionTooltipView,\n type AIInstructionTooltipViewConfig,\n} from './view'\n\nexport interface AIInstructionTooltipAPI {\n show: (from: number, to: number) => void\n}\n\nconst defaultAPI: AIInstructionTooltipAPI = {\n show: () => {},\n}\n\nexport const aiInstructionTooltipAPI = $ctx(\n { ...defaultAPI },\n 'aiInstructionTooltipAPI'\n)\n\nexport const aiInstructionTooltip = tooltipFactory('CREPE_AI_INSTRUCTION')\n\n/// Default strings for the instruction tooltip. Exported so the JSDoc on\n/// `AIFeatureConfig` and consumers stay in sync with what the resolver\n/// actually uses.\nexport const DEFAULT_SUGGESTIONS_HEADER_LABEL = 'SUGGESTIONS'\nexport const DEFAULT_SEND_AS_PROMPT_HEADER_LABEL = 'SEND AS PROMPT'\nexport const DEFAULT_SEND_AS_PROMPT_LABEL = 'Ask AI:'\nexport const DEFAULT_SUBMIT_BUTTON_LABEL = 'Send prompt'\nexport const DEFAULT_LISTBOX_LABEL = 'AI suggestions'\nexport const DEFAULT_INSTRUCTION_PLACEHOLDER =\n 'Tell AI what to do with the selection…'\n\nfunction resolveChrome(config?: AIFeatureConfig): AIInstructionTooltipChrome {\n return {\n aiIcon: config?.aiIcon ?? defaultAiIcon,\n sendIcon: config?.sendIcon ?? defaultSendIcon,\n sendPromptIcon: config?.sendPromptIcon ?? defaultSendPromptIcon,\n enterKeyIcon: config?.enterKeyIcon ?? defaultEnterKeyIcon,\n chevronLeftIcon: config?.chevronLeftIcon ?? defaultChevronLeftIcon,\n chevronRightIcon: config?.chevronRightIcon ?? defaultChevronRightIcon,\n suggestionsHeaderLabel:\n config?.suggestionsHeaderLabel ?? DEFAULT_SUGGESTIONS_HEADER_LABEL,\n sendAsPromptHeaderLabel:\n config?.sendAsPromptHeaderLabel ?? DEFAULT_SEND_AS_PROMPT_HEADER_LABEL,\n sendAsPromptLabel:\n config?.sendAsPromptLabel ?? DEFAULT_SEND_AS_PROMPT_LABEL,\n submitButtonLabel: config?.submitButtonLabel ?? DEFAULT_SUBMIT_BUTTON_LABEL,\n listboxLabel: config?.listboxLabel ?? DEFAULT_LISTBOX_LABEL,\n }\n}\n\nfunction resolveViewConfig(\n config?: AIFeatureConfig\n): AIInstructionTooltipViewConfig {\n const builder = new AISuggestionsBuilder()\n applyDefaultSuggestions(builder)\n config?.buildAISuggestions?.(builder)\n return {\n placeholder:\n config?.instructionPlaceholder ?? DEFAULT_INSTRUCTION_PLACEHOLDER,\n chrome: resolveChrome(config),\n suggestions: builder.build(),\n }\n}\n\nexport function configureAIInstructionTooltip(config?: AIFeatureConfig) {\n return (ctx: Ctx) => {\n const viewConfig = resolveViewConfig(config)\n let tooltipView: AIInstructionTooltipView | null = null\n\n ctx.update(aiInstructionTooltipAPI.key, (api) => ({\n ...api,\n show: (from, to) => {\n tooltipView?.show(from, to)\n },\n }))\n\n ctx.set(aiInstructionTooltip.key, {\n view: (view) => {\n tooltipView = new AIInstructionTooltipView(ctx, view, viewConfig)\n return tooltipView\n },\n })\n }\n}\n","import type { Ctx } from '@milkdown/kit/ctx'\nimport type { Node } from '@milkdown/kit/prose/model'\n\nimport { commandsCtx } from '@milkdown/kit/core'\nimport {\n abortStreamingCmd,\n streamingPluginKey,\n} from '@milkdown/kit/plugin/streaming'\nimport { Plugin, PluginKey } from '@milkdown/kit/prose/state'\nimport { Decoration, DecorationSet } from '@milkdown/kit/prose/view'\nimport { $prose } from '@milkdown/kit/utils'\n\nimport type { AIStreamingIndicatorConfig } from './types'\n\nimport { abortAICmd, aiSessionCtx } from './commands'\n\nconst CLASS_PREFIX = 'milkdown-ai-streaming'\nconst SPINNER_PERIOD_MS = 800\n\nexport const DEFAULT_STREAMING_FALLBACK_LABEL = 'Generating'\nexport const DEFAULT_STREAMING_CANCEL_HINT = 'Esc to cancel'\n\nconst indicatorKey = new PluginKey<DecorationSet>(\n 'CREPE_AI_STREAMING_INDICATOR'\n)\n\n/// One spinner per streaming session. The rotation is driven by\n/// requestAnimationFrame instead of CSS keyframes so that DOM moves\n/// (which happen every chunk as the indicator's position advances) do\n/// not reset the animation back to 0deg.\nclass IndicatorWidget {\n readonly dom: HTMLElement\n readonly #spinner: HTMLElement\n readonly #label: HTMLElement\n readonly #fallbackLabel: string\n readonly #start = performance.now()\n #lastLabelText = ''\n #rafId = 0\n\n constructor(ctx: Ctx, fallbackLabel: string, cancelHint: string) {\n this.#fallbackLabel = fallbackLabel\n\n const dom = document.createElement('span')\n dom.className = `${CLASS_PREFIX}-indicator`\n dom.contentEditable = 'false'\n // Treat the pill as a status live region so assistive technologies\n // get notified when AI starts streaming and when the active-form\n // label changes between sessions (\"Improving writing…\",\n // \"Translating to French…\", etc.).\n dom.setAttribute('role', 'status')\n dom.setAttribute('aria-live', 'polite')\n\n const spinner = document.createElement('span')\n spinner.className = `${CLASS_PREFIX}-spinner`\n // The decorative rotation has no semantic value for screen readers.\n spinner.setAttribute('aria-hidden', 'true')\n dom.appendChild(spinner)\n\n const label = document.createElement('span')\n label.className = `${CLASS_PREFIX}-label`\n dom.appendChild(label)\n\n const escHint = document.createElement('span')\n escHint.className = `${CLASS_PREFIX}-esc`\n escHint.textContent = cancelHint\n dom.appendChild(escHint)\n\n this.dom = dom\n this.#spinner = spinner\n this.#label = label\n this.setLabel(ctx)\n this.#tick()\n }\n\n setLabel(ctx: Ctx) {\n const session = ctx.get(aiSessionCtx.key)\n const text = `${session.label || this.#fallbackLabel}…`\n if (text === this.#lastLabelText) return\n this.#lastLabelText = text\n this.#label.textContent = text\n }\n\n destroy() {\n if (this.#rafId) cancelAnimationFrame(this.#rafId)\n this.#rafId = 0\n }\n\n #tick = () => {\n const elapsed = performance.now() - this.#start\n const angle = (elapsed / SPINNER_PERIOD_MS) * 360\n this.#spinner.style.transform = `rotate(${angle}deg)`\n this.#rafId = requestAnimationFrame(this.#tick)\n }\n}\n\ninterface StreamingIndicatorPluginOptions {\n config?: AIStreamingIndicatorConfig\n}\n\nexport function streamingIndicatorPlugin(\n options: StreamingIndicatorPluginOptions = {}\n) {\n const { config } = options\n const fallbackLabel =\n config?.fallbackLabel ?? DEFAULT_STREAMING_FALLBACK_LABEL\n const cancelHint = config?.cancelHint ?? DEFAULT_STREAMING_CANCEL_HINT\n\n return $prose((ctx) => {\n let widget: IndicatorWidget | null = null\n\n function ensureWidget(): IndicatorWidget {\n if (!widget) widget = new IndicatorWidget(ctx, fallbackLabel, cancelHint)\n else widget.setLabel(ctx)\n return widget\n }\n\n function dropWidget(): void {\n if (widget) {\n widget.destroy()\n widget = null\n }\n }\n\n function buildSet(doc: Node, insertEndPos: number): DecorationSet {\n const pos = Math.min(insertEndPos, doc.content.size)\n const decoration = Decoration.widget(pos, ensureWidget().dom, {\n side: 1,\n key: 'ai-streaming-indicator',\n })\n return DecorationSet.create(doc, [decoration])\n }\n\n return new Plugin<DecorationSet>({\n key: indicatorKey,\n state: {\n init: () => DecorationSet.empty,\n apply(tr, decorations, _oldState, newState) {\n const streaming = streamingPluginKey.getState(newState)\n if (!streaming?.active || streaming.insertEndPos == null) {\n dropWidget()\n return DecorationSet.empty\n }\n if (tr.getMeta(streamingPluginKey) || tr.docChanged) {\n return buildSet(newState.doc, streaming.insertEndPos)\n }\n return decorations.map(tr.mapping, tr.doc)\n },\n },\n view() {\n return {\n destroy() {\n dropWidget()\n },\n }\n },\n props: {\n decorations(state) {\n return indicatorKey.getState(state) ?? DecorationSet.empty\n },\n handleKeyDown(view, event) {\n if (event.key !== 'Escape') return false\n const commands = ctx.get(commandsCtx)\n // AI-driven session: route through abortAICmd so the AI\n // session state (abortController, label) cleans up too.\n if (ctx.get(aiSessionCtx.key).abortController) {\n event.preventDefault()\n commands.call(abortAICmd.key, { keep: true })\n return true\n }\n // Manual streaming session (no AI session in flight) — abort\n // the streaming plugin directly so the \"Esc to cancel\" hint\n // shown in the pill isn't misleading.\n if (streamingPluginKey.getState(view.state)?.active) {\n event.preventDefault()\n commands.call(abortStreamingCmd.key, { keep: true })\n return true\n }\n return false\n },\n },\n })\n })\n}\n","import {\n diffComponent,\n diffComponentConfig,\n} from '@milkdown/kit/component/diff'\nimport { diff, diffConfig } from '@milkdown/kit/plugin/diff'\nimport { streaming, streamingConfig } from '@milkdown/kit/plugin/streaming'\n\nimport type { DefineFeature } from '../shared'\nimport type { AIFeatureConfig } from './types'\n\nimport { crepeFeatureConfig } from '../../core/slice'\nimport { CrepeFeature } from '../index'\nimport {\n aiProviderConfig,\n aiSessionCtx,\n abortAICmd,\n runAICmd,\n} from './commands'\nimport { diffActionsPanelPlugin } from './diff-actions'\nimport {\n aiInstructionTooltip,\n aiInstructionTooltipAPI,\n configureAIInstructionTooltip,\n} from './instruction-tooltip'\nimport { streamingIndicatorPlugin } from './streaming-indicator'\n\n/// Default node types in Crepe that use custom node views.\nconst CREPE_CUSTOM_BLOCK_TYPES = ['table', 'image-block', 'code_block']\n\n/// Default attrs to ignore in Crepe's diff and streaming features.\nconst CREPE_IGNORE_ATTRS: Record<string, string[]> = { heading: ['id'] }\n\nexport type {\n AIDiffActionsConfig,\n AIFeatureConfig,\n AIPromptContext,\n AIProvider,\n AIStreamingIndicatorConfig,\n AISubmenuBuilder,\n AISubmenuDef,\n AISuggestionItem,\n AISuggestionsBuilder,\n} from './types'\nexport { runAICmd, abortAICmd } from './commands'\nexport { defaultBuildContext } from './context'\n\nexport const ai: DefineFeature<AIFeatureConfig> = (editor, config) => {\n const diffCfg = config?.diff ?? {}\n const streamingCfg = config?.streaming ?? {}\n\n editor\n .config(crepeFeatureConfig(CrepeFeature.AI))\n // -- Diff plugin + component --\n .config((ctx) => {\n ctx.update(diffConfig.key, (prev) => ({\n ...prev,\n ignoreAttrs: diffCfg.ignoreAttrs ?? CREPE_IGNORE_ATTRS,\n }))\n const { ignoreAttrs: _, ...componentConfig } = diffCfg\n ctx.update(diffComponentConfig.key, (prev) => ({\n ...prev,\n customBlockTypes:\n componentConfig.customBlockTypes ?? CREPE_CUSTOM_BLOCK_TYPES,\n ...componentConfig,\n }))\n })\n .use(diff)\n .use(diffComponent)\n // -- Streaming plugin --\n .config((ctx) => {\n ctx.update(streamingConfig.key, (prev) => ({\n ...prev,\n ...streamingCfg,\n ignoreAttrs: streamingCfg.ignoreAttrs ?? CREPE_IGNORE_ATTRS,\n // Wire diffReviewOnEnd into the streaming plugin so manual\n // endStreamingCmd calls (outside runAICmd) also respect it.\n // Only override if the user explicitly set it — otherwise\n // keep the streaming plugin's own default so tests and\n // manual-streaming use cases aren't surprised.\n ...(config?.diffReviewOnEnd !== undefined\n ? { diffReviewOnEnd: config.diffReviewOnEnd }\n : {}),\n }))\n })\n .use(streaming)\n // -- AI orchestration --\n .config((ctx) => {\n ctx.update(aiProviderConfig.key, (prev) => ({\n ...prev,\n ...(config?.provider !== undefined\n ? { provider: config.provider }\n : {}),\n ...(config?.buildContext !== undefined\n ? { buildContext: config.buildContext }\n : {}),\n diffReviewOnEnd: config?.diffReviewOnEnd ?? prev.diffReviewOnEnd,\n ...(config?.onError !== undefined ? { onError: config.onError } : {}),\n ...(config?.aiIcon !== undefined ? { aiIcon: config.aiIcon } : {}),\n }))\n })\n .use(aiProviderConfig)\n .use(aiSessionCtx)\n .use(runAICmd)\n .use(abortAICmd)\n // -- AI instruction tooltip --\n .config(configureAIInstructionTooltip(config))\n .use(aiInstructionTooltipAPI)\n .use(aiInstructionTooltip)\n // -- Streaming indicator --\n .use(streamingIndicatorPlugin({ config: config?.streamingIndicator }))\n // -- Diff actions panel --\n .use(\n diffActionsPanelPlugin({\n config: config?.diffActions,\n enterKeyIcon: config?.enterKeyIcon,\n })\n )\n}\n"],"names":["createSlice","CrepeFeature","editorViewCtx","serializerCtx","$ctx","commandsCtx","pushChunkCmd","endStreamingCmd","aiProviderError","abortStreamingCmd","$command","startStreamingCmd","aiBuildContextError","streamingPluginKey","__privateAdd","__privateGet","clearDiffReviewCmd","TextSelection","acceptAllDiffsCmd","__privateSet","diffPluginKey","PluginKey","enterKeyIcon","defaultRetryIcon","defaultRejectIcon","defaultAcceptIcon","defaultEnterKeyIcon","$prose","Plugin","h","defineComponent","ref","watch","computed","nextTick","Icon","posToDOMRect","createApp","TooltipProvider","tooltipFactory","defaultAiIcon","defaultSendIcon","defaultSendPromptIcon","defaultChevronLeftIcon","defaultChevronRightIcon","Decoration","DecorationSet","streaming","_a","diffConfig","diffComponentConfig","diff","diffComponent","streamingConfig"],"mappings":"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"}
@@ -41,6 +41,7 @@ var CrepeFeature = /* @__PURE__ */ ((CrepeFeature2) => {
41
41
  CrepeFeature2["Table"] = "table";
42
42
  CrepeFeature2["Latex"] = "latex";
43
43
  CrepeFeature2["TopBar"] = "top-bar";
44
+ CrepeFeature2["AI"] = "ai";
44
45
  return CrepeFeature2;
45
46
  })(CrepeFeature || {});
46
47