@inspecto-dev/core 0.3.9 → 0.3.11

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.
package/dist/index.cjs CHANGED
@@ -172,7 +172,7 @@ var init_annotate_session = __esm({
172
172
  });
173
173
 
174
174
  // src/styles-classes.ts
175
- var overlayClass, menuClass, menuTitleClass, menuMetaClass, menuSectionClass, menuItemClass, loadingSpinnerClass, errorMsgClass, badgeClass, menuInputClass, menuInputWrapperClass, menuInputIconClass, menuContextSummaryClass, menuContextPreviewClass, menuContextToggleClass, runtimeToggleClass, runtimeToggleIconClass, runtimeToggleBadgeClass, annotateSidebarClass, annotateSidebarHeaderClass, annotateSidebarSectionClass, annotateTargetListClass, annotateQueueListClass, annotateBadgeClass, annotateSidebarFooterClass, annotateSidebarActionsClass, annotateSidebarButtonClass, annotateSidebarInputClass, annotateSidebarSelectClass, annotateSidebarTextClass, annotateSidebarEmptyClass, annotateSidebarQueueMetaClass, annotateSidebarQueueItemClass, annotateSidebarTargetItemClass, annotateSidebarLabelClass, annotateSidebarInlineActionClass, annotateSidebarChipListClass, annotateSidebarChipClass, annotateSidebarChipPanelClass, annotateSidebarChipFieldClass, annotateSidebarHintClass, tooltipClass, tooltipTopClass, tooltipBottomClass, tagClass, idClass, classClass, dimClass, separatorClass, sourceClass, shortcutIconClass;
175
+ var overlayClass, menuClass, menuTitleClass, menuMetaClass, menuSectionClass, menuItemClass, loadingSpinnerClass, errorMsgClass, badgeClass, menuInputClass, menuInputWrapperClass, menuInputIconClass, menuContextSummaryClass, menuContextPreviewClass, menuContextToggleClass, runtimeToggleClass, runtimeToggleIconClass, runtimeToggleBadgeClass, annotateSidebarClass, annotateSidebarHeaderClass, annotateSidebarSectionClass, annotateTargetListClass, annotateQueueListClass, annotateBadgeClass, annotateSidebarFooterClass, annotateSidebarActionsClass, annotateSidebarButtonClass, annotateSidebarInputClass, annotateSidebarSelectClass, annotateSidebarTextClass, annotateSidebarEmptyClass, annotateSidebarQueueMetaClass, annotateSidebarQueueItemClass, annotateSidebarTargetItemClass, annotateSidebarLabelClass, annotateSidebarInlineActionClass, annotateSidebarChipListClass, annotateSidebarChipClass, annotateSidebarChipPanelClass, annotateSidebarChipFieldClass, annotateSidebarHintClass, annotateConfirmDialogClass, tooltipClass, tooltipTopClass, tooltipBottomClass, tagClass, idClass, classClass, dimClass, separatorClass, sourceClass, shortcutIconClass;
176
176
  var init_styles_classes = __esm({
177
177
  "src/styles-classes.ts"() {
178
178
  "use strict";
@@ -217,6 +217,7 @@ var init_styles_classes = __esm({
217
217
  annotateSidebarChipPanelClass = "inspecto-annotate-sidebar-chip-panel";
218
218
  annotateSidebarChipFieldClass = "inspecto-annotate-sidebar-chip-field";
219
219
  annotateSidebarHintClass = "inspecto-annotate-sidebar-hint";
220
+ annotateConfirmDialogClass = "inspecto-annotate-confirm-dialog";
220
221
  tooltipClass = "inspecto-tooltip";
221
222
  tooltipTopClass = "inspecto-tooltip-top";
222
223
  tooltipBottomClass = "inspecto-tooltip-bottom";
@@ -573,7 +574,7 @@ var init_styles_annotate = __esm({
573
574
  .${annotateSidebarSectionClass}[data-variant="modes"] .${annotateSidebarButtonClass}[data-role="mode"] { flex: 1 1 0; justify-content: center; padding: 8px 10px; background: transparent; border-color: transparent; color: var(--inspecto-text-secondary); }
574
575
  .${annotateSidebarHeaderClass} .${annotateSidebarButtonClass} { width: 30px; height: 30px; padding: 0; border-radius: var(--inspecto-radius-pill); display: inline-flex; align-items: center; justify-content: center; font-size: 12px; line-height: 1; flex: 0 0 auto; }
575
576
  .${annotateSidebarHeaderClass} .${runtimeToggleClass} { overflow: visible; }
576
- .${annotateSidebarHeaderClass} [data-inspecto-annotate-header-actions="true"] { padding: 4px; border-radius: 999px; background: rgba(255, 255, 255, 0.025); border: 1px solid rgba(255, 255, 255, 0.05); gap: 4px; flex-wrap: nowrap; flex: 0 0 auto; margin-top: 1px; }
577
+ .${annotateSidebarHeaderClass} [data-inspecto-annotate-header-actions-left="true"], .${annotateSidebarHeaderClass} [data-inspecto-annotate-header-actions-right="true"] { padding: 4px; border-radius: 999px; background: rgba(255, 255, 255, 0.025); border: 1px solid rgba(255, 255, 255, 0.05); gap: 4px; flex-wrap: nowrap; flex: 0 0 auto; margin-top: 1px; }
577
578
  .${annotateSidebarButtonClass}:hover { background: var(--inspecto-surface-hover); color: #ffffff; border-color: rgba(148, 163, 184, 0.12); transform: translateY(-1px); }
578
579
  .${annotateSidebarButtonClass}:disabled { opacity: 0.5; cursor: not-allowed; }
579
580
  .${annotateSidebarClass} .${annotateSidebarButtonClass}.primary {
@@ -653,6 +654,73 @@ var init_styles_annotate = __esm({
653
654
  .${annotateSidebarSectionClass}[data-variant="full-prompt"] > summary { list-style: none; cursor: pointer; font-size: 10px; font-weight: 600; color: var(--inspecto-text-tertiary); text-transform: none; letter-spacing: 0.01em; }
654
655
  .${annotateSidebarSectionClass}[data-variant="full-prompt"] > summary::-webkit-details-marker { display: none; }
655
656
  .${annotateSidebarTextClass}[data-variant="full-prompt"] { margin: 6px 0 0; padding: 9px 10px; border: 1px solid var(--inspecto-border-muted); border-radius: var(--inspecto-radius-sm); background: rgba(255, 255, 255, 0.02); color: var(--inspecto-text-secondary); font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; font-size: 10px; line-height: 1.5; white-space: pre-wrap; word-break: break-word; max-height: 220px; overflow: auto; }
657
+
658
+ .${annotateConfirmDialogClass} {
659
+ position: absolute;
660
+ inset: 0;
661
+ z-index: 100;
662
+ display: flex;
663
+ align-items: center;
664
+ justify-content: center;
665
+ background: rgba(13, 20, 31, 0.5);
666
+ backdrop-filter: blur(4px);
667
+ -webkit-backdrop-filter: blur(4px);
668
+ border-radius: 28px;
669
+ }
670
+ .${annotateConfirmDialogClass} .content {
671
+ width: calc(100% - 48px);
672
+ background: rgba(30, 35, 45, 0.95);
673
+ border: 1px solid rgba(255, 255, 255, 0.12);
674
+ border-radius: 20px;
675
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.05);
676
+ padding: 18px;
677
+ display: flex;
678
+ flex-direction: column;
679
+ gap: 18px;
680
+ }
681
+ .${annotateConfirmDialogClass} p {
682
+ margin: 0;
683
+ font-size: 13px;
684
+ line-height: 1.5;
685
+ color: rgba(255, 255, 255, 0.9);
686
+ }
687
+ .${annotateConfirmDialogClass} .actions {
688
+ display: flex;
689
+ gap: 8px;
690
+ justify-content: flex-end;
691
+ }
692
+
693
+ @keyframes inspecto-fade-out {
694
+ 0% { opacity: 1; transform: translateY(0); }
695
+ 100% { opacity: 0; transform: translateY(-4px); pointer-events: none; }
696
+ }
697
+
698
+ .inspecto-workflow-toast {
699
+ position: absolute;
700
+ bottom: calc(100% + 8px);
701
+ left: 50%;
702
+ transform: translateX(-50%);
703
+ background: rgba(28, 28, 28, 0.95);
704
+ border: 1px solid rgba(255, 255, 255, 0.1);
705
+ border-radius: var(--inspecto-radius-pill);
706
+ box-shadow: var(--inspecto-shadow-floating);
707
+ backdrop-filter: blur(16px);
708
+ -webkit-backdrop-filter: blur(16px);
709
+ padding: 6px 14px;
710
+ z-index: 100;
711
+ font-size: 11px;
712
+ font-weight: 600;
713
+ color: #5ad496;
714
+ display: flex;
715
+ align-items: center;
716
+ gap: 6px;
717
+ pointer-events: none;
718
+ animation: inspecto-fade-out 0.3s ease 1.7s forwards;
719
+ }
720
+ .inspecto-workflow-toast::before {
721
+ content: '\u2713';
722
+ font-size: 12px;
723
+ }
656
724
  `;
657
725
  }
658
726
  });
@@ -1733,7 +1801,10 @@ var init_i18n = __esm({
1733
1801
  "runtime.summary.error.one": "{count} runtime error",
1734
1802
  "runtime.summary.error.other": "{count} runtime errors",
1735
1803
  "runtime.summary.request.one": "{count} failed request",
1736
- "runtime.summary.request.other": "{count} failed requests"
1804
+ "runtime.summary.request.other": "{count} failed requests",
1805
+ "workflow.confirm": 'Confirm to execute "{label}"?',
1806
+ "workflow.confirm.ok": "Confirm",
1807
+ "workflow.feedback.executed": "Execution started"
1737
1808
  };
1738
1809
  ZH_CN_MESSAGES = {
1739
1810
  "launcher.panel.title": "\u9009\u62E9\u6A21\u5F0F",
@@ -1830,7 +1901,10 @@ var init_i18n = __esm({
1830
1901
  "runtime.summary.error.one": "{count} \u4E2A\u8FD0\u884C\u65F6\u9519\u8BEF",
1831
1902
  "runtime.summary.error.other": "{count} \u4E2A\u8FD0\u884C\u65F6\u9519\u8BEF",
1832
1903
  "runtime.summary.request.one": "{count} \u4E2A\u5931\u8D25\u8BF7\u6C42",
1833
- "runtime.summary.request.other": "{count} \u4E2A\u5931\u8D25\u8BF7\u6C42"
1904
+ "runtime.summary.request.other": "{count} \u4E2A\u5931\u8D25\u8BF7\u6C42",
1905
+ "workflow.confirm": "\u786E\u8BA4\u6267\u884C\u300C{label}\u300D\uFF1F",
1906
+ "workflow.confirm.ok": "\u786E\u8BA4\u6267\u884C",
1907
+ "workflow.feedback.executed": "\u6267\u884C\u5DF2\u542F\u52A8"
1834
1908
  };
1835
1909
  BUILTIN_MESSAGES = {
1836
1910
  en: EN_MESSAGES,
@@ -3140,7 +3214,7 @@ var init_http = __esm({
3140
3214
  "src/http.ts"() {
3141
3215
  "use strict";
3142
3216
  import_types = require("@inspecto-dev/types");
3143
- BASE_URL = globalThis.__AI_INSPECTOR_SERVER_URL__ || "http://0.0.0.0:5678";
3217
+ BASE_URL = globalThis.__AI_INSPECTOR_SERVER_URL__ || "http://127.0.0.1:5678";
3144
3218
  AI_BATCH_DISPATCH_PATH = (_a = import_types.INSPECTO_API_PATHS.AI_BATCH_DISPATCH) != null ? _a : "/inspecto/api/v1/ai/dispatch/annotations";
3145
3219
  cachedConfig = null;
3146
3220
  }
@@ -3265,23 +3339,24 @@ function toAnnotationTransportFromRecordUi(_ctx, record) {
3265
3339
  ]
3266
3340
  };
3267
3341
  }
3268
- function sendAnnotationBatch(ctx, annotations, scope, instruction, deliveryMode, onSuccess) {
3342
+ function sendAnnotationBatch(ctx, annotations, scope, instruction, deliveryMode, onSuccess, extraPayload) {
3269
3343
  return __async(this, null, function* () {
3270
3344
  var _a2, _b;
3271
3345
  const state = asAnnotateContext(ctx);
3272
- if (annotations.length === 0 || state.annotateSendState.isSending) return;
3346
+ if (state.annotateSendState.isSending) return;
3347
+ if (annotations.length === 0 && (extraPayload == null ? void 0 : extraPayload.source) !== "workflow") return;
3273
3348
  state.annotateSendState = { isSending: true, scope };
3274
3349
  state.updateAnnotateSidebar();
3275
3350
  try {
3276
3351
  yield state.configLoadPromise;
3277
3352
  const runtimeContext = state.getAnnotateRuntimeContext(annotations);
3278
3353
  const cssContextPrompt = state.getAnnotateCssContextPrompt(annotations);
3279
- const result = yield sendAnnotationsToAi(__spreadProps(__spreadValues(__spreadValues({
3354
+ const result = yield sendAnnotationsToAi(__spreadValues(__spreadProps(__spreadValues(__spreadValues({
3280
3355
  instruction,
3281
3356
  annotations
3282
3357
  }, runtimeContext ? { runtimeContext } : {}), cssContextPrompt ? { cssContextPrompt } : {}), {
3283
3358
  deliveryMode
3284
- }));
3359
+ }), extraPayload || {}));
3285
3360
  if (!result.success) {
3286
3361
  state.annotateErrorMessage = toAnnotateErrorMessage(state, result.errorCode, result.error);
3287
3362
  state.updateAnnotateSidebar();
@@ -3314,6 +3389,47 @@ function sendAnnotationBatch(ctx, annotations, scope, instruction, deliveryMode,
3314
3389
  }
3315
3390
  });
3316
3391
  }
3392
+ function triggerWorkflow(ctx, workflowId) {
3393
+ return __async(this, null, function* () {
3394
+ var _a2;
3395
+ const state = asAnnotateContext(ctx);
3396
+ if (state.annotateSendState.isSending) return;
3397
+ const workflowPrompt = ((_a2 = state.annotateWorkflows.find((w) => w.id === workflowId)) == null ? void 0 : _a2.prompt) || "";
3398
+ if (!workflowPrompt.trim()) return;
3399
+ const scope = state.annotateDeliveryMode === "ide" ? "quick-ask" : "create-task";
3400
+ state.annotateSendState = { isSending: true, scope };
3401
+ state.updateAnnotateSidebar();
3402
+ try {
3403
+ yield state.configLoadPromise;
3404
+ const result = yield sendToAi({
3405
+ prompt: workflowPrompt
3406
+ });
3407
+ if (!result.success) {
3408
+ state.annotateErrorMessage = toAnnotateErrorMessage(state, result.errorCode, result.error);
3409
+ state.updateAnnotateSidebar();
3410
+ return;
3411
+ }
3412
+ state.annotateInstructionDraft = "";
3413
+ state.annotateSession = createEmptySession();
3414
+ state.annotateEditingRecord = null;
3415
+ state.annotateElements.clear();
3416
+ state.annotateErrorMessage = "";
3417
+ state.showAnnotateSuccess(scope);
3418
+ state.renderAnnotateSelectionOverlay();
3419
+ state.updateAnnotateSidebar();
3420
+ } catch (err) {
3421
+ state.annotateErrorMessage = toAnnotateErrorMessage(
3422
+ state,
3423
+ err.errorCode,
3424
+ err.message
3425
+ );
3426
+ state.updateAnnotateSidebar();
3427
+ } finally {
3428
+ state.annotateSendState = { isSending: false, scope: null };
3429
+ state.updateAnnotateSidebar();
3430
+ }
3431
+ });
3432
+ }
3317
3433
  function refreshLatestAnnotateSession(ctx) {
3318
3434
  return __async(this, null, function* () {
3319
3435
  var _a2, _b, _c, _d;
@@ -3384,7 +3500,7 @@ function getAnnotateSidebarOptions(ctx) {
3384
3500
  const fullInstruction = composeAnnotateInstruction(state);
3385
3501
  const allRuntimeContext = state.getAnnotateRuntimeContext(allAnnotations);
3386
3502
  const allCssContextPrompt = state.getAnnotateCssContextPrompt(allAnnotations);
3387
- const deliveryPreference = (_a2 = state.annotateDeliveryMode) != null ? _a2 : "both";
3503
+ const deliveryPreference = (_a2 = state.annotateDeliveryMode) != null ? _a2 : "agent";
3388
3504
  let preferredAction = "create-task";
3389
3505
  if (deliveryPreference === "ide") preferredAction = "quick-ask";
3390
3506
  if (deliveryPreference === "agent") preferredAction = "create-task";
@@ -3410,6 +3526,7 @@ function getAnnotateSidebarOptions(ctx) {
3410
3526
  successScope: state.annotateSuccessScope,
3411
3527
  preferredAction,
3412
3528
  annotateDeliveryMode: state.annotateDeliveryMode,
3529
+ workflows: state.annotateWorkflows,
3413
3530
  latestSessionSummary: state.annotateLatestSessionSummary,
3414
3531
  latestSessionDetail: state.annotateLatestSessionDetail,
3415
3532
  latestSessionLoading: state.annotateLatestSessionLoading,
@@ -3556,6 +3673,9 @@ function getAnnotateSidebarOptions(ctx) {
3556
3673
  }
3557
3674
  );
3558
3675
  },
3676
+ onWorkflow: (workflowId) => {
3677
+ void triggerWorkflow(state, workflowId);
3678
+ },
3559
3679
  onExit: () => {
3560
3680
  state.setMode("inspect");
3561
3681
  }
@@ -4984,13 +5104,13 @@ function showIntentMenu(shadowRoot, location, clickX, clickY, options, onClose,
4984
5104
  if (!options.askPlaceholder) {
4985
5105
  input.placeholder = intents.length > 0 ? t("menu.ask.placeholder.default") : t("menu.ask.placeholder.fallback");
4986
5106
  }
4987
- const aiIntents = intents;
5107
+ const aiIntents = intents.filter(import_types2.isAiIntentConfig);
4988
5108
  const hasFixIntent = aiIntents.some(isFixIntent);
4989
5109
  const hasNonFixIntent = aiIntents.some((intent) => !isFixIntent(intent));
4990
5110
  runtimeContextDefaultMode = hasFixIntent ? hasNonFixIntent ? "mixed" : "all-on" : "off";
4991
5111
  renderRuntimeContextUi();
4992
5112
  const aiActions = createIntentActionButtons({
4993
- intents,
5113
+ intents: aiIntents,
4994
5114
  location,
4995
5115
  includeSnippet,
4996
5116
  maxSnippetLines,
@@ -5041,6 +5161,7 @@ function showIntentMenu(shadowRoot, location, clickX, clickY, options, onClose,
5041
5161
  });
5042
5162
  return cleanup;
5043
5163
  }
5164
+ var import_types2;
5044
5165
  var init_menu = __esm({
5045
5166
  "src/menu.ts"() {
5046
5167
  "use strict";
@@ -5052,6 +5173,7 @@ var init_menu = __esm({
5052
5173
  init_menu_helpers();
5053
5174
  init_i18n();
5054
5175
  init_styles();
5176
+ import_types2 = require("@inspecto-dev/types");
5055
5177
  }
5056
5178
  });
5057
5179
 
@@ -5912,9 +6034,29 @@ function createAnnotateSidebarDom(shadowRoot) {
5912
6034
  const headerStatus = document.createElement("div");
5913
6035
  headerStatus.setAttribute("data-inspecto-annotate-header-status", "true");
5914
6036
  headerCopy.append(headerTitle, headerStatus);
5915
- const headerActions = document.createElement("div");
5916
- headerActions.className = annotateSidebarActionsClass;
5917
- headerActions.setAttribute("data-inspecto-annotate-header-actions", "true");
6037
+ const headerActionsLeft = document.createElement("div");
6038
+ headerActionsLeft.className = annotateSidebarActionsClass;
6039
+ headerActionsLeft.setAttribute("data-inspecto-annotate-header-actions-left", "true");
6040
+ const previewButton = createSidebarButton("</>", annotateSidebarButtonClass);
6041
+ previewButton.dataset.role = "raw-preview-toggle";
6042
+ previewButton.setAttribute("aria-label", t("annotate.previewRawPrompt"));
6043
+ previewButton.title = t("annotate.previewRawPrompt");
6044
+ const copyContextButton = createSidebarButton(
6045
+ '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',
6046
+ annotateSidebarButtonClass,
6047
+ true
6048
+ );
6049
+ copyContextButton.dataset.role = "raw-preview";
6050
+ copyContextButton.setAttribute("aria-label", t("annotate.copyContext"));
6051
+ copyContextButton.title = t("annotate.copyContext");
6052
+ headerActionsLeft.append(previewButton, copyContextButton);
6053
+ const headerActionsRight = document.createElement("div");
6054
+ headerActionsRight.className = annotateSidebarActionsClass;
6055
+ headerActionsRight.setAttribute("data-inspecto-annotate-header-actions-right", "true");
6056
+ const headerActionsContainer = document.createElement("div");
6057
+ headerActionsContainer.style.display = "flex";
6058
+ headerActionsContainer.style.gap = "8px";
6059
+ headerActionsContainer.style.alignItems = "center";
5918
6060
  const quickCaptureButton = createSidebarButton(pureMarkIconSvg, annotateSidebarButtonClass, true);
5919
6061
  quickCaptureButton.dataset.role = "quick-capture";
5920
6062
  quickCaptureButton.classList.add(runtimeToggleClass);
@@ -5964,14 +6106,15 @@ function createAnnotateSidebarDom(shadowRoot) {
5964
6106
  exitButton.style.justifyContent = "center";
5965
6107
  exitButton.setAttribute("aria-label", t("annotate.exitMode"));
5966
6108
  exitButton.title = t("annotate.exitMode");
5967
- headerActions.append(
6109
+ headerActionsRight.append(
5968
6110
  quickCaptureButton,
5969
6111
  cssContextButton,
5970
6112
  runtimeContextButton,
5971
6113
  modeButton,
5972
6114
  exitButton
5973
6115
  );
5974
- header.append(headerCopy, headerActions);
6116
+ headerActionsContainer.append(headerActionsLeft, headerActionsRight);
6117
+ header.append(headerCopy, headerActionsContainer);
5975
6118
  const emptyState = document.createElement("section");
5976
6119
  emptyState.className = annotateSidebarSectionClass;
5977
6120
  emptyState.dataset.variant = "empty-state";
@@ -6083,7 +6226,12 @@ function createAnnotateSidebarDom(shadowRoot) {
6083
6226
  latestSessionRefreshButton.style.fontSize = "12px";
6084
6227
  latestSessionRefreshButton.title = t("annotate.latestSession.refresh");
6085
6228
  latestSessionRefreshButton.style.marginLeft = "auto";
6086
- latestSessionHeader.append(latestSessionTitle, latestSessionStatus, latestSessionMeta, latestSessionRefreshButton);
6229
+ latestSessionHeader.append(
6230
+ latestSessionTitle,
6231
+ latestSessionStatus,
6232
+ latestSessionMeta,
6233
+ latestSessionRefreshButton
6234
+ );
6087
6235
  const latestSessionMessage = document.createElement("div");
6088
6236
  latestSessionMessage.className = annotateSidebarTextClass;
6089
6237
  latestSessionMessage.style.fontSize = "12px";
@@ -6149,24 +6297,17 @@ function createAnnotateSidebarDom(shadowRoot) {
6149
6297
  footerActionRowContainer.style.justifyContent = "space-between";
6150
6298
  footerActionRowContainer.style.width = "100%";
6151
6299
  footerActionRowContainer.style.gap = "8px";
6300
+ const workflowRow = document.createElement("div");
6301
+ workflowRow.className = annotateSidebarActionsClass;
6302
+ workflowRow.style.display = "none";
6303
+ workflowRow.style.gap = "8px";
6304
+ workflowRow.style.width = "100%";
6152
6305
  const footerLeftActions = document.createElement("div");
6153
6306
  footerLeftActions.className = annotateSidebarActionsClass;
6154
6307
  footerLeftActions.style.flex = "0 0 auto";
6155
6308
  footerLeftActions.style.display = "none";
6156
6309
  footerLeftActions.style.alignItems = "center";
6157
6310
  footerLeftActions.style.gap = "8px";
6158
- const previewButton = createSidebarButton("</>", annotateSidebarButtonClass);
6159
- previewButton.dataset.role = "raw-preview-toggle";
6160
- previewButton.setAttribute("aria-label", t("annotate.previewRawPrompt"));
6161
- previewButton.title = t("annotate.previewRawPrompt");
6162
- const copyContextButton = createSidebarButton(
6163
- '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',
6164
- annotateSidebarButtonClass,
6165
- true
6166
- );
6167
- copyContextButton.dataset.role = "raw-preview";
6168
- copyContextButton.setAttribute("aria-label", t("annotate.copyContext"));
6169
- copyContextButton.title = t("annotate.copyContext");
6170
6311
  const previewFloat = document.createElement("div");
6171
6312
  previewFloat.dataset.inspectoAnnotateRawPreview = "true";
6172
6313
  previewFloat.style.display = "none";
@@ -6193,6 +6334,50 @@ function createAnnotateSidebarDom(shadowRoot) {
6193
6334
  previewFloatContent.style.lineHeight = "1.4";
6194
6335
  previewFloatContent.style.color = "rgba(255, 255, 255, 0.7)";
6195
6336
  previewFloat.appendChild(previewFloatContent);
6337
+ const confirmDialog = document.createElement("div");
6338
+ confirmDialog.className = annotateConfirmDialogClass;
6339
+ confirmDialog.style.display = "none";
6340
+ const confirmContent = document.createElement("div");
6341
+ confirmContent.className = "content";
6342
+ const confirmMessage = document.createElement("p");
6343
+ const confirmActions = document.createElement("div");
6344
+ confirmActions.className = "actions";
6345
+ const confirmCancelBtn = createSidebarButton(t("annotate.cancel"), annotateSidebarButtonClass);
6346
+ confirmCancelBtn.dataset.emphasis = "secondary";
6347
+ const confirmOkBtn = createSidebarButton(t("workflow.confirm.ok"), annotateSidebarButtonClass);
6348
+ confirmOkBtn.classList.add("primary");
6349
+ confirmActions.append(confirmCancelBtn, confirmOkBtn);
6350
+ confirmContent.append(confirmMessage, confirmActions);
6351
+ confirmDialog.append(confirmContent);
6352
+ let currentConfirmCallback = null;
6353
+ confirmCancelBtn.addEventListener("click", (event) => {
6354
+ event.preventDefault();
6355
+ event.stopPropagation();
6356
+ confirmDialog.style.display = "none";
6357
+ currentConfirmCallback = null;
6358
+ });
6359
+ confirmOkBtn.addEventListener("click", (event) => {
6360
+ event.preventDefault();
6361
+ event.stopPropagation();
6362
+ confirmDialog.style.display = "none";
6363
+ if (currentConfirmCallback) {
6364
+ currentConfirmCallback();
6365
+ currentConfirmCallback = null;
6366
+ }
6367
+ const toast = document.createElement("div");
6368
+ toast.className = "inspecto-workflow-toast";
6369
+ toast.textContent = t("workflow.feedback.executed");
6370
+ workflowRow.style.position = "relative";
6371
+ workflowRow.appendChild(toast);
6372
+ setTimeout(() => {
6373
+ toast.remove();
6374
+ }, 2e3);
6375
+ });
6376
+ function showConfirmDialog(message, onConfirm) {
6377
+ confirmMessage.textContent = message;
6378
+ currentConfirmCallback = onConfirm;
6379
+ confirmDialog.style.display = "flex";
6380
+ }
6196
6381
  function updateRawPromptPreviewPosition() {
6197
6382
  const viewportPadding = 12;
6198
6383
  const gap = 8;
@@ -6226,8 +6411,11 @@ function createAnnotateSidebarDom(shadowRoot) {
6226
6411
  if (!previewFloat.contains(clickTarget) && !previewButton.contains(clickTarget)) {
6227
6412
  setRawPromptPreviewVisible(false);
6228
6413
  }
6414
+ if (!confirmContent.contains(clickTarget) && !workflowRow.contains(clickTarget)) {
6415
+ confirmDialog.style.display = "none";
6416
+ currentConfirmCallback = null;
6417
+ }
6229
6418
  });
6230
- footerLeftActions.append(previewButton, copyContextButton);
6231
6419
  const footerActions = document.createElement("div");
6232
6420
  footerActions.className = annotateSidebarActionsClass;
6233
6421
  footerActions.style.display = "flex";
@@ -6246,10 +6434,10 @@ function createAnnotateSidebarDom(shadowRoot) {
6246
6434
  createTaskButton.style.whiteSpace = "nowrap";
6247
6435
  footerActions.append(quickAskButton, createTaskButton);
6248
6436
  footerActionRowContainer.append(footerLeftActions, footerActions);
6249
- footerActionRow.append(footerActionRowContainer);
6437
+ footerActionRow.append(footerActionRowContainer, workflowRow);
6250
6438
  footerLayout.append(recommendedActionLabel, footerActionRow);
6251
6439
  footer.append(previewFloat, statusMessage, errorMessage, footerLayout);
6252
- element.append(header, emptyState, draftSection, footer);
6440
+ element.append(header, emptyState, draftSection, footer, confirmDialog);
6253
6441
  shadowRoot.appendChild(element);
6254
6442
  return {
6255
6443
  element,
@@ -6262,6 +6450,7 @@ function createAnnotateSidebarDom(shadowRoot) {
6262
6450
  exitButton,
6263
6451
  emptyState,
6264
6452
  draftSection,
6453
+ workflowRow,
6265
6454
  instructionInput,
6266
6455
  includedSummary,
6267
6456
  recordsList,
@@ -6286,7 +6475,8 @@ function createAnnotateSidebarDom(shadowRoot) {
6286
6475
  quickAskButton,
6287
6476
  createTaskButton,
6288
6477
  updateRawPromptPreviewPosition,
6289
- setRawPromptPreviewVisible
6478
+ setRawPromptPreviewVisible,
6479
+ showConfirmDialog
6290
6480
  };
6291
6481
  }
6292
6482
  var init_annotate_sidebar_dom = __esm({
@@ -6604,6 +6794,7 @@ function createAnnotateSidebar(shadowRoot, options) {
6604
6794
  exitButton,
6605
6795
  emptyState,
6606
6796
  draftSection,
6797
+ workflowRow,
6607
6798
  instructionInput,
6608
6799
  includedSummary,
6609
6800
  recordsList,
@@ -6830,7 +7021,7 @@ function createAnnotateSidebar(shadowRoot, options) {
6830
7021
  const shouldShowBody = hasSavedRecords || hasCurrentDraft || next.isSending || next.successScope === "quick-ask" || Boolean(next.errorMessage);
6831
7022
  const canSend = next.isSending ? false : next.includedRecords.length > 0 || hasCurrentDraft;
6832
7023
  const preferredAction = (_a2 = next.preferredAction) != null ? _a2 : "create-task";
6833
- const deliveryPreference = (_b = next.annotateDeliveryMode) != null ? _b : "both";
7024
+ const deliveryPreference = (_b = next.annotateDeliveryMode) != null ? _b : "agent";
6834
7025
  const showDebugHelperActions = deliveryPreference !== "agent";
6835
7026
  element.style.display = "";
6836
7027
  emptyState.style.display = shouldShowBody ? "none" : "";
@@ -6878,37 +7069,23 @@ function createAnnotateSidebar(shadowRoot, options) {
6878
7069
  }
6879
7070
  includedSummary.textContent = `Element notes (${next.includedRecords.length})`;
6880
7071
  renderers.renderIncludedRecords(next.includedRecords, recordsList);
6881
- const allowQuickAsk = deliveryPreference === "both" || deliveryPreference === "ide";
6882
- const allowCreateTask = deliveryPreference === "both" || deliveryPreference === "agent";
6883
- const onlyOneAction = allowQuickAsk !== allowCreateTask;
7072
+ const allowQuickAsk = deliveryPreference === "ide";
7073
+ const allowCreateTask = deliveryPreference === "agent";
6884
7074
  quickAskButton.style.display = allowQuickAsk ? "" : "none";
6885
7075
  createTaskButton.style.display = allowCreateTask ? "" : "none";
6886
7076
  quickAskButton.disabled = !canSend;
6887
7077
  createTaskButton.disabled = !canSend;
6888
- if (onlyOneAction) {
6889
- quickAskButton.classList.toggle("primary", true);
6890
- createTaskButton.classList.toggle("primary", true);
6891
- quickAskButton.dataset.emphasis = "primary";
6892
- createTaskButton.dataset.emphasis = "primary";
6893
- quickAskButton.style.flex = "1";
6894
- createTaskButton.style.flex = "1";
6895
- quickAskButton.dataset.layoutRole = "primary";
6896
- createTaskButton.dataset.layoutRole = "primary";
6897
- } else {
6898
- quickAskButton.classList.toggle("primary", false);
6899
- createTaskButton.classList.toggle("primary", false);
6900
- quickAskButton.dataset.emphasis = preferredAction === "quick-ask" ? "primary" : "secondary";
6901
- createTaskButton.dataset.emphasis = preferredAction === "create-task" ? "primary" : "secondary";
6902
- quickAskButton.dataset.layoutRole = preferredAction === "quick-ask" ? "primary" : "secondary";
6903
- createTaskButton.dataset.layoutRole = preferredAction === "create-task" ? "primary" : "secondary";
6904
- quickAskButton.style.order = "1";
6905
- createTaskButton.style.order = "2";
6906
- quickAskButton.style.flex = "1";
6907
- createTaskButton.style.flex = "1";
6908
- }
7078
+ quickAskButton.classList.toggle("primary", true);
7079
+ createTaskButton.classList.toggle("primary", true);
7080
+ quickAskButton.dataset.emphasis = "primary";
7081
+ createTaskButton.dataset.emphasis = "primary";
7082
+ quickAskButton.style.flex = "1";
7083
+ createTaskButton.style.flex = "1";
7084
+ quickAskButton.dataset.layoutRole = "primary";
7085
+ createTaskButton.dataset.layoutRole = "primary";
6909
7086
  quickAskButton.title = t("annotate.askAiHint");
6910
7087
  createTaskButton.title = t("annotate.createTaskHint");
6911
- recommendedActionLabel.style.display = canSend && !onlyOneAction && deliveryPreference === "both" ? "block" : "none";
7088
+ recommendedActionLabel.style.display = "none";
6912
7089
  recommendedActionLabel.textContent = preferredAction === "quick-ask" ? t("annotate.recommendedAction.askHint", {
6913
7090
  action: t("annotate.askAi")
6914
7091
  }) : t("annotate.recommendedAction.agentHint", {
@@ -6916,6 +7093,31 @@ function createAnnotateSidebar(shadowRoot, options) {
6916
7093
  });
6917
7094
  quickAskButton.textContent = next.isSending && next.sendingScope === "quick-ask" ? t("menu.sending") : !next.isSending && next.successScope === "quick-ask" ? t("annotate.sent") : t("annotate.askAi");
6918
7095
  createTaskButton.textContent = next.isSending && next.sendingScope === "create-task" ? t("menu.sending") : t("annotate.createTask");
7096
+ const workflows = next.workflows || [];
7097
+ workflowRow.style.display = workflows.length > 0 ? "flex" : "none";
7098
+ workflowRow.innerHTML = "";
7099
+ for (const wf of workflows) {
7100
+ const btn = createSidebarButton(wf.label, annotateSidebarButtonClass);
7101
+ btn.dataset.workflowId = wf.id;
7102
+ btn.style.flex = "1";
7103
+ btn.style.justifyContent = "center";
7104
+ btn.style.whiteSpace = "nowrap";
7105
+ const isSendingWorkflow = next.isSending && next.sendingScope === `workflow:${wf.id}`;
7106
+ btn.disabled = next.isSending;
7107
+ btn.textContent = isSendingWorkflow ? t("menu.sending") : wf.label;
7108
+ btn.addEventListener("click", () => {
7109
+ var _a3;
7110
+ if (wf.confirm) {
7111
+ dom.showConfirmDialog(t("workflow.confirm", { label: wf.label }), () => {
7112
+ var _a4;
7113
+ (_a4 = next.onWorkflow) == null ? void 0 : _a4.call(next, wf.id);
7114
+ });
7115
+ return;
7116
+ }
7117
+ (_a3 = next.onWorkflow) == null ? void 0 : _a3.call(next, wf.id);
7118
+ });
7119
+ workflowRow.appendChild(btn);
7120
+ }
6919
7121
  const latestSession = next.latestSessionDetail;
6920
7122
  const latestSessionSummary = next.latestSessionSummary;
6921
7123
  latestSessionSection.style.display = latestSession || latestSessionSummary ? "" : "none";
@@ -7046,6 +7248,8 @@ var init_annotate_sidebar = __esm({
7046
7248
  init_annotate_sidebar_helpers();
7047
7249
  init_annotate_sidebar_dom();
7048
7250
  init_annotate_sidebar_renderers();
7251
+ init_annotate_sidebar_helpers();
7252
+ init_styles();
7049
7253
  init_i18n();
7050
7254
  init_icons();
7051
7255
  }
@@ -7319,7 +7523,6 @@ function configure(ctx, options) {
7319
7523
  state.configLoadPromise = fetchIdeInfo(true).then((info) => {
7320
7524
  if ((info == null ? void 0 : info.hotKeys) !== void 0) {
7321
7525
  state.serverHotKeys = info.hotKeys;
7322
- state.syncModeUi();
7323
7526
  }
7324
7527
  if ((info == null ? void 0 : info.theme) !== void 0) {
7325
7528
  applyTheme(state, info.theme);
@@ -7327,6 +7530,9 @@ function configure(ctx, options) {
7327
7530
  if ((info == null ? void 0 : info.annotateDeliveryMode) !== void 0) {
7328
7531
  state.annotateDeliveryMode = info.annotateDeliveryMode;
7329
7532
  }
7533
+ if ((info == null ? void 0 : info.workflows) !== void 0) {
7534
+ state.annotateWorkflows = info.workflows;
7535
+ }
7330
7536
  if ((info == null ? void 0 : info.includeSnippet) !== void 0) {
7331
7537
  state.options.includeSnippet = info.includeSnippet;
7332
7538
  }
@@ -7334,6 +7540,9 @@ function configure(ctx, options) {
7334
7540
  state.options.runtimeContext = __spreadValues(__spreadValues({}, state.options.runtimeContext), info.runtimeContext);
7335
7541
  state.syncRuntimeContextCapture();
7336
7542
  }
7543
+ if (state.mode === "annotate" && state.annotateSidebar) {
7544
+ state.updateAnnotateSidebar();
7545
+ }
7337
7546
  }).catch(() => {
7338
7547
  }).then(() => {
7339
7548
  });
@@ -7547,7 +7756,8 @@ var init_component = __esm({
7547
7756
  this.annotateErrorMessage = "";
7548
7757
  this.annotateRuntimeContextEnabled = false;
7549
7758
  this.annotateCssContextEnabled = false;
7550
- this.annotateDeliveryMode = "both";
7759
+ this.annotateDeliveryMode = "agent";
7760
+ this.annotateWorkflows = [];
7551
7761
  this.annotateSendState = {
7552
7762
  isSending: false,
7553
7763
  scope: null