@parhelia/core 0.3.12827 → 0.3.12832

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 (171) hide show
  1. package/dist/editor/agent-changes/agentChangeTargets.d.ts +58 -0
  2. package/dist/editor/agent-changes/agentChangeTargets.js +174 -0
  3. package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -0
  4. package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +57 -0
  5. package/dist/editor/agent-changes/agentChangeTextHighlight.js +109 -0
  6. package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -0
  7. package/dist/editor/ai/activityRowNavigation.d.ts +28 -0
  8. package/dist/editor/ai/activityRowNavigation.js +53 -0
  9. package/dist/editor/ai/activityRowNavigation.js.map +1 -0
  10. package/dist/editor/ai/terminal/activeReasoningModel.d.ts +9 -0
  11. package/dist/editor/ai/terminal/activeReasoningModel.js +20 -0
  12. package/dist/editor/ai/terminal/activeReasoningModel.js.map +1 -0
  13. package/dist/editor/ai/terminal/agentDurations.d.ts +27 -0
  14. package/dist/editor/ai/terminal/agentDurations.js +89 -0
  15. package/dist/editor/ai/terminal/agentDurations.js.map +1 -0
  16. package/dist/editor/ai/terminal/agentTurnTiming.d.ts +35 -0
  17. package/dist/editor/ai/terminal/agentTurnTiming.js +128 -0
  18. package/dist/editor/ai/terminal/agentTurnTiming.js.map +1 -0
  19. package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.d.ts +9 -0
  20. package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.js +75 -0
  21. package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.js.map +1 -0
  22. package/dist/editor/ai/terminal/components/AgentProfileRecovery.d.ts +10 -0
  23. package/dist/editor/ai/terminal/components/AgentProfileRecovery.js +12 -0
  24. package/dist/editor/ai/terminal/components/AgentProfileRecovery.js.map +1 -0
  25. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.d.ts +3 -0
  26. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +47 -0
  27. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -0
  28. package/dist/editor/ai/terminal/components/ResponseTurnDuration.d.ts +15 -0
  29. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +63 -0
  30. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -0
  31. package/dist/editor/ai/terminal/components/toolCallResultJson.d.ts +1 -0
  32. package/dist/editor/ai/terminal/components/toolCallResultJson.js +46 -0
  33. package/dist/editor/ai/terminal/components/toolCallResultJson.js.map +1 -0
  34. package/dist/editor/ai/terminal/reasoningEffortLevels.d.ts +8 -0
  35. package/dist/editor/ai/terminal/reasoningEffortLevels.js +54 -0
  36. package/dist/editor/ai/terminal/reasoningEffortLevels.js.map +1 -0
  37. package/dist/editor/ai/terminal/requestUsage.d.ts +3 -0
  38. package/dist/editor/ai/terminal/requestUsage.js +22 -0
  39. package/dist/editor/ai/terminal/requestUsage.js.map +1 -0
  40. package/dist/editor/ai/terminal/useAgentProviderWait.d.ts +18 -0
  41. package/dist/editor/ai/terminal/useAgentProviderWait.js +23 -0
  42. package/dist/editor/ai/terminal/useAgentProviderWait.js.map +1 -0
  43. package/dist/editor/ai/terminal/useAgentReasoningEffortState.d.ts +5 -0
  44. package/dist/editor/ai/terminal/useAgentReasoningEffortState.js +10 -0
  45. package/dist/editor/ai/terminal/useAgentReasoningEffortState.js.map +1 -0
  46. package/dist/editor/bridge/bridgeKeys.d.ts +5 -0
  47. package/dist/editor/bridge/bridgeKeys.js +8 -0
  48. package/dist/editor/bridge/bridgeKeys.js.map +1 -0
  49. package/dist/editor/client/SessionsDialog.d.ts +2 -0
  50. package/dist/editor/client/SessionsDialog.js +27 -0
  51. package/dist/editor/client/SessionsDialog.js.map +1 -0
  52. package/dist/editor/client/agentLoadItemPolicy.d.ts +22 -0
  53. package/dist/editor/client/agentLoadItemPolicy.js +60 -0
  54. package/dist/editor/client/agentLoadItemPolicy.js.map +1 -0
  55. package/dist/editor/client/localUserEditActivity.d.ts +3 -0
  56. package/dist/editor/client/localUserEditActivity.js +12 -0
  57. package/dist/editor/client/localUserEditActivity.js.map +1 -0
  58. package/dist/editor/commands/mediaCommands.d.ts +5 -0
  59. package/dist/editor/commands/mediaCommands.js +59 -0
  60. package/dist/editor/commands/mediaCommands.js.map +1 -0
  61. package/dist/editor/componentVisualMode.d.ts +14 -0
  62. package/dist/editor/componentVisualMode.js +43 -0
  63. package/dist/editor/componentVisualMode.js.map +1 -0
  64. package/dist/editor/field-types/FieldHistoryBoundary.d.ts +7 -0
  65. package/dist/editor/field-types/FieldHistoryBoundary.js +19 -0
  66. package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -0
  67. package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +18 -0
  68. package/dist/editor/field-types/richtext/utils/changeHighlight.js +57 -0
  69. package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -0
  70. package/dist/editor/itemContextMenuGroups.d.ts +16 -0
  71. package/dist/editor/itemContextMenuGroups.js +48 -0
  72. package/dist/editor/itemContextMenuGroups.js.map +1 -0
  73. package/dist/editor/media-selector/UploadMediaFileDialog.d.ts +5 -0
  74. package/dist/editor/media-selector/UploadMediaFileDialog.js +14 -0
  75. package/dist/editor/media-selector/UploadMediaFileDialog.js.map +1 -0
  76. package/dist/editor/menubar/OpenPublishedPageButton.d.ts +1 -0
  77. package/dist/editor/menubar/OpenPublishedPageButton.js +22 -0
  78. package/dist/editor/menubar/OpenPublishedPageButton.js.map +1 -0
  79. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +20 -0
  80. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +31 -0
  81. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -0
  82. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +33 -0
  83. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +290 -0
  84. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -0
  85. package/dist/editor/page-editor-chrome/diffRulerSegments.d.ts +18 -0
  86. package/dist/editor/page-editor-chrome/diffRulerSegments.js +37 -0
  87. package/dist/editor/page-editor-chrome/diffRulerSegments.js.map +1 -0
  88. package/dist/editor/page-viewer/PreviewModeNotice.d.ts +7 -0
  89. package/dist/editor/page-viewer/PreviewModeNotice.js +19 -0
  90. package/dist/editor/page-viewer/PreviewModeNotice.js.map +1 -0
  91. package/dist/editor/page-viewer/previewEditAttempt.d.ts +31 -0
  92. package/dist/editor/page-viewer/previewEditAttempt.js +68 -0
  93. package/dist/editor/page-viewer/previewEditAttempt.js.map +1 -0
  94. package/dist/editor/services/migrationService.d.ts +31 -0
  95. package/dist/editor/services/migrationService.js +22 -0
  96. package/dist/editor/services/migrationService.js.map +1 -0
  97. package/dist/editor/services/publicSiteService.d.ts +40 -0
  98. package/dist/editor/services/publicSiteService.js +5 -0
  99. package/dist/editor/services/publicSiteService.js.map +1 -0
  100. package/dist/editor/settings/MigrationJournalCard.d.ts +12 -0
  101. package/dist/editor/settings/MigrationJournalCard.js +114 -0
  102. package/dist/editor/settings/MigrationJournalCard.js.map +1 -0
  103. package/dist/editor/settings/panels/PublicSiteEntryDialog.d.ts +8 -0
  104. package/dist/editor/settings/panels/PublicSiteEntryDialog.js +113 -0
  105. package/dist/editor/settings/panels/PublicSiteEntryDialog.js.map +1 -0
  106. package/dist/editor/settings/panels/PublicSitesPanel.d.ts +1 -0
  107. package/dist/editor/settings/panels/PublicSitesPanel.js +153 -0
  108. package/dist/editor/settings/panels/PublicSitesPanel.js.map +1 -0
  109. package/dist/editor/settings/panels/publicSiteHelpers.d.ts +6 -0
  110. package/dist/editor/settings/panels/publicSiteHelpers.js +30 -0
  111. package/dist/editor/settings/panels/publicSiteHelpers.js.map +1 -0
  112. package/dist/editor/sidebar/OperationDetailsContent.d.ts +14 -0
  113. package/dist/editor/sidebar/OperationDetailsContent.js +521 -0
  114. package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -0
  115. package/dist/editor/sidebar/liveComponentThumbnails.d.ts +53 -0
  116. package/dist/editor/sidebar/liveComponentThumbnails.js +204 -0
  117. package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -0
  118. package/dist/editor/ui/PublishReadinessSummary.d.ts +12 -0
  119. package/dist/editor/ui/PublishReadinessSummary.js +34 -0
  120. package/dist/editor/ui/PublishReadinessSummary.js.map +1 -0
  121. package/dist/editor/ui/publishReadiness.d.ts +98 -0
  122. package/dist/editor/ui/publishReadiness.js +307 -0
  123. package/dist/editor/ui/publishReadiness.js.map +1 -0
  124. package/dist/editor/ui/usePublishingItem.d.ts +8 -0
  125. package/dist/editor/ui/usePublishingItem.js +47 -0
  126. package/dist/editor/ui/usePublishingItem.js.map +1 -0
  127. package/dist/editor/utils/linkDisplay.d.ts +12 -0
  128. package/dist/editor/utils/linkDisplay.js +23 -0
  129. package/dist/editor/utils/linkDisplay.js.map +1 -0
  130. package/dist/editor/validation/ValidationIssuesPopover.d.ts +39 -0
  131. package/dist/editor/validation/ValidationIssuesPopover.js +51 -0
  132. package/dist/editor/validation/ValidationIssuesPopover.js.map +1 -0
  133. package/dist/editor/validation/navigateToValidationIssue.d.ts +13 -0
  134. package/dist/editor/validation/navigateToValidationIssue.js +43 -0
  135. package/dist/editor/validation/navigateToValidationIssue.js.map +1 -0
  136. package/dist/editor/validation/validationFixAgent.d.ts +26 -0
  137. package/dist/editor/validation/validationFixAgent.js +124 -0
  138. package/dist/editor/validation/validationFixAgent.js.map +1 -0
  139. package/dist/editor/validation/validationSeverity.d.ts +15 -0
  140. package/dist/editor/validation/validationSeverity.js +47 -0
  141. package/dist/editor/validation/validationSeverity.js.map +1 -0
  142. package/dist/lib/viewportClip.d.ts +18 -0
  143. package/dist/lib/viewportClip.js +22 -0
  144. package/dist/lib/viewportClip.js.map +1 -0
  145. package/dist/revision.d.ts +2 -2
  146. package/dist/revision.js +2 -2
  147. package/dist/task-board/components/ProjectProgressIndicator.d.ts +8 -0
  148. package/dist/task-board/components/ProjectProgressIndicator.js +17 -0
  149. package/dist/task-board/components/ProjectProgressIndicator.js.map +1 -0
  150. package/dist/task-board/components/commentAuthor.d.ts +14 -0
  151. package/dist/task-board/components/commentAuthor.js +25 -0
  152. package/dist/task-board/components/commentAuthor.js.map +1 -0
  153. package/dist/task-board/utils/projectDashboardModel.d.ts +68 -0
  154. package/dist/task-board/utils/projectDashboardModel.js +355 -0
  155. package/dist/task-board/utils/projectDashboardModel.js.map +1 -0
  156. package/dist/task-board/views/ProjectDashboardView.d.ts +28 -0
  157. package/dist/task-board/views/ProjectDashboardView.js +316 -0
  158. package/dist/task-board/views/ProjectDashboardView.js.map +1 -0
  159. package/dist/tour/TourInputBoundary.d.ts +6 -0
  160. package/dist/tour/TourInputBoundary.js +82 -0
  161. package/dist/tour/TourInputBoundary.js.map +1 -0
  162. package/dist/tour/sandbox-tour-copy.d.ts +48 -0
  163. package/dist/tour/sandbox-tour-copy.js +48 -0
  164. package/dist/tour/sandbox-tour-copy.js.map +1 -0
  165. package/dist/tour/sandbox-tour.d.ts +3 -0
  166. package/dist/tour/sandbox-tour.js +212 -0
  167. package/dist/tour/sandbox-tour.js.map +1 -0
  168. package/dist/tour/tour-utils.d.ts +32 -0
  169. package/dist/tour/tour-utils.js +148 -0
  170. package/dist/tour/tour-utils.js.map +1 -0
  171. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ import { stripGuid } from "../utils";
2
+ import { getValidationSeverity, validationSeverityStyles, } from "./validationSeverity";
3
+ export function hasAgentsPanel(editContext) {
4
+ return !!editContext?.configuration?.editor?.sidebars?.some((sidebar) => sidebar.id === "agents-panel");
5
+ }
6
+ function describeItem(item, fallbackName) {
7
+ const name = item.displayName || item.name || fallbackName || item.id;
8
+ const details = [
9
+ item.path,
10
+ item.language ? `${item.language} v${item.version ?? 0}` : undefined,
11
+ ].filter(Boolean);
12
+ return details.length ? `"${name}" (${details.join(", ")})` : `"${name}"`;
13
+ }
14
+ /**
15
+ * Prompt for the agent. The vocabulary (field, validator, level, message)
16
+ * mirrors the validate-items tool's findings so the agent can match them
17
+ * after re-running the validation.
18
+ */
19
+ export function buildValidationFixPrompt(target) {
20
+ const { item, issues, field } = target;
21
+ const scope = field
22
+ ? `, field "${field.fieldName || issues[0]?.fieldName || field.fieldId}"`
23
+ : "";
24
+ const lines = issues.map((issue) => {
25
+ const level = validationSeverityStyles[getValidationSeverity(issue.result)]
26
+ .label;
27
+ const fieldPart = !field && issue.fieldName ? ` — Field "${issue.fieldName}"` : "";
28
+ return `- [${level}] ${issue.validator}${fieldPart}: ${issue.message}`;
29
+ });
30
+ return [
31
+ `Fix the following validation ${issues.length === 1 ? "issue" : "issues"} on ${describeItem(item, issues[0]?.itemName)}${scope}:`,
32
+ ...lines,
33
+ "",
34
+ "Make the smallest content change that resolves each issue, then run validate-items on this item to confirm nothing is left, and summarize what you changed.",
35
+ ].join("\n");
36
+ }
37
+ /**
38
+ * Opens the Agents panel and starts a new agent that fixes the given
39
+ * validation issues. Mirrors openAiAgentForComment (reviews/commentAi.ts).
40
+ * Returns false when nothing was started (no panel, quota exceeded, error).
41
+ */
42
+ export function openAiAgentForValidationIssues(target, editContext) {
43
+ if (!editContext)
44
+ return false;
45
+ if (!hasAgentsPanel(editContext))
46
+ return false;
47
+ if (target.issues.length === 0)
48
+ return false;
49
+ if (editContext.isQuotaExceeded) {
50
+ editContext.showToast?.("AI quota exceeded. Please try again later or adjust settings.");
51
+ return false;
52
+ }
53
+ try {
54
+ if (editContext.isMobile) {
55
+ editContext.openSidebar("agents-panel");
56
+ }
57
+ else {
58
+ editContext.setShowAgentsPanel(true);
59
+ }
60
+ const { item, issues, field } = target;
61
+ const itemName = item.name || issues[0]?.itemName;
62
+ const targetItem = {
63
+ id: item.id,
64
+ language: item.language,
65
+ version: item.version,
66
+ name: itemName,
67
+ path: item.path,
68
+ };
69
+ // The loaded page gives the agent the surrounding context when the
70
+ // issues sit on an embedded component item of that page.
71
+ const pageItem = editContext.item;
72
+ const pageDiffers = !!pageItem?.id && stripGuid(pageItem.id) !== stripGuid(item.id);
73
+ const items = pageDiffers
74
+ ? [
75
+ {
76
+ id: pageItem.id,
77
+ language: pageItem.language,
78
+ version: pageItem.version,
79
+ name: pageItem.name,
80
+ path: pageItem.path,
81
+ },
82
+ targetItem,
83
+ ]
84
+ : [targetItem];
85
+ const metadata = {
86
+ items,
87
+ currentItemId: item.id,
88
+ field: field
89
+ ? {
90
+ fieldId: field.fieldId,
91
+ fieldName: field.fieldName || issues[0]?.fieldName,
92
+ item: targetItem,
93
+ }
94
+ : undefined,
95
+ additionalData: {
96
+ initialPrompt: buildValidationFixPrompt(target),
97
+ profileId: editContext.parheliaSettings?.validationFixProfileId || undefined,
98
+ profileName: editContext.parheliaSettings?.validationFixProfileName || undefined,
99
+ },
100
+ };
101
+ const dispatchEvent = () => {
102
+ try {
103
+ window.dispatchEvent(new CustomEvent("editor:addNewAgent", {
104
+ detail: { metadata },
105
+ }));
106
+ }
107
+ catch { }
108
+ };
109
+ if (editContext.isMobile) {
110
+ // Mobile: the sidebar needs a moment to mount and start listening.
111
+ setTimeout(dispatchEvent, 500);
112
+ }
113
+ else {
114
+ dispatchEvent();
115
+ }
116
+ return true;
117
+ }
118
+ catch (e) {
119
+ console.error("Failed to start agent for validation issues:", e);
120
+ editContext.showToast?.("Failed to start AI agent for these issues.");
121
+ return false;
122
+ }
123
+ }
124
+ //# sourceMappingURL=validationFixAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationFixAgent.js","sourceRoot":"","sources":["../../../src/editor/validation/validationFixAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { AlertCircle } from "lucide-react";
2
+ import { SingleValidatorResult } from "../../types";
3
+ export type ValidationSeverity = "suggestion" | "warning" | "error";
4
+ export declare function getValidationSeverity(result: SingleValidatorResult["result"] | number): ValidationSeverity;
5
+ export declare const validationSeverityStyles: Record<ValidationSeverity, {
6
+ label: string;
7
+ icon: typeof AlertCircle;
8
+ text: string;
9
+ badge: string;
10
+ bar: string;
11
+ }>;
12
+ /** Keeps only results above "Valid", worst first. */
13
+ export declare function filterValidationIssues<T extends SingleValidatorResult>(results: readonly T[] | undefined): T[];
14
+ export declare function getWorstValidationSeverity(issues: readonly SingleValidatorResult[]): ValidationSeverity | undefined;
15
+ export declare function formatValidationIssueCount(count: number): string;
@@ -0,0 +1,47 @@
1
+ import { AlertCircle, AlertTriangle, Lightbulb } from "lucide-react";
2
+ export function getValidationSeverity(result) {
3
+ if (result >= 4)
4
+ return "error";
5
+ if (result === 3)
6
+ return "warning";
7
+ return "suggestion";
8
+ }
9
+ export const validationSeverityStyles = {
10
+ error: {
11
+ label: "Error",
12
+ icon: AlertCircle,
13
+ text: "text-feedback-red",
14
+ badge: "bg-feedback-red-light text-feedback-red",
15
+ bar: "border-feedback-red",
16
+ },
17
+ warning: {
18
+ label: "Warning",
19
+ icon: AlertTriangle,
20
+ text: "text-feedback-orange",
21
+ badge: "bg-feedback-orange-light text-feedback-orange",
22
+ bar: "border-feedback-orange",
23
+ },
24
+ suggestion: {
25
+ label: "Suggestion",
26
+ icon: Lightbulb,
27
+ text: "text-feedback-blue",
28
+ badge: "bg-feedback-blue-light text-feedback-blue",
29
+ bar: "border-feedback-blue",
30
+ },
31
+ };
32
+ /** Keeps only results above "Valid", worst first. */
33
+ export function filterValidationIssues(results) {
34
+ return [...(results ?? [])]
35
+ .filter((x) => x.result > 1)
36
+ .sort((a, b) => b.result - a.result);
37
+ }
38
+ export function getWorstValidationSeverity(issues) {
39
+ if (issues.length === 0)
40
+ return undefined;
41
+ const worst = issues.reduce((max, issue) => Math.max(max, issue.result), 0);
42
+ return getValidationSeverity(worst);
43
+ }
44
+ export function formatValidationIssueCount(count) {
45
+ return `${count} ${count === 1 ? "issue" : "issues"}`;
46
+ }
47
+ //# sourceMappingURL=validationSeverity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationSeverity.js","sourceRoot":"","sources":["../../../src/editor/validation/validationSeverity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQrE,MAAM,UAAU,qBAAqB,CACnC,MAAgD;IAEhD,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAChC,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GASjC;IACF,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,yCAAyC;QAChD,GAAG,EAAE,qBAAqB;KAC3B;IACD,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,+CAA+C;QACtD,GAAG,EAAE,wBAAwB;KAC9B;IACD,UAAU,EAAE;QACV,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,2CAA2C;QAClD,GAAG,EAAE,sBAAsB;KAC5B;CACF,CAAC;AAEF,qDAAqD;AACrD,MAAM,UAAU,sBAAsB,CACpC,OAAiC;IAEjC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAwC;IAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAC3C,CAAW,CACZ,CAAC;IACF,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type ViewportClipBounds = {
2
+ left: number;
3
+ top: number;
4
+ right: number;
5
+ bottom: number;
6
+ };
7
+ export type ViewportClipRect = {
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ export type ViewportClipOptions = {
14
+ horizontal?: boolean;
15
+ vertical?: boolean;
16
+ };
17
+ /** Clips a fixed-position overlay to the viewport that owns its anchor. */
18
+ export declare function getViewportClipPath(rect: ViewportClipRect, bounds: ViewportClipBounds | undefined, options?: ViewportClipOptions): string | undefined;
@@ -0,0 +1,22 @@
1
+ /** Clips a fixed-position overlay to the viewport that owns its anchor. */
2
+ export function getViewportClipPath(rect, bounds, options = {}) {
3
+ if (!bounds)
4
+ return undefined;
5
+ const clipHorizontal = options.horizontal !== false;
6
+ const clipVertical = options.vertical !== false;
7
+ const right = rect.left + rect.width;
8
+ const bottom = rect.top + rect.height;
9
+ if ((clipHorizontal && (right <= bounds.left || rect.left >= bounds.right)) ||
10
+ (clipVertical && (bottom <= bounds.top || rect.top >= bounds.bottom))) {
11
+ return "inset(100%)";
12
+ }
13
+ const top = clipVertical ? Math.max(0, bounds.top - rect.top) : 0;
14
+ const rightInset = clipHorizontal ? Math.max(0, right - bounds.right) : 0;
15
+ const bottomInset = clipVertical ? Math.max(0, bottom - bounds.bottom) : 0;
16
+ const left = clipHorizontal ? Math.max(0, bounds.left - rect.left) : 0;
17
+ if (top === 0 && rightInset === 0 && bottomInset === 0 && left === 0) {
18
+ return undefined;
19
+ }
20
+ return `inset(${top}px ${rightInset}px ${bottomInset}px ${left}px)`;
21
+ }
22
+ //# sourceMappingURL=viewportClip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewportClip.js","sourceRoot":"","sources":["../../src/lib/viewportClip.ts"],"names":[],"mappings":"AAmBA,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CACjC,IAAsB,EACtB,MAAsC,EACtC,OAAO,GAAwB,EAAE;IAEjC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtC,IACE,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,YAAY,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,EACrE,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,IAAI,GAAG,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,GAAG,MAAM,UAAU,MAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACtE,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "0.3.12827";
2
- export declare const buildDate = "2026-09-03 11:58:26";
1
+ export declare const version = "0.3.12832";
2
+ export declare const buildDate = "2026-09-14 17:21:22";
package/dist/revision.js CHANGED
@@ -1,3 +1,3 @@
1
- export const version = "0.3.12827";
2
- export const buildDate = "2026-09-03 11:58:26";
1
+ export const version = "0.3.12832";
2
+ export const buildDate = "2026-09-14 17:21:22";
3
3
  //# sourceMappingURL=revision.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Compact done/total indicator for a project row: a percentage while work is
3
+ * in progress, a green check once everything is done, nothing without tasks.
4
+ */
5
+ export declare function ProjectProgressIndicator({ done, total, }: {
6
+ done?: number;
7
+ total?: number;
8
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check } from "lucide-react";
3
+ /**
4
+ * Compact done/total indicator for a project row: a percentage while work is
5
+ * in progress, a green check once everything is done, nothing without tasks.
6
+ */
7
+ export function ProjectProgressIndicator({ done, total, }) {
8
+ if (!total || total <= 0) {
9
+ return null;
10
+ }
11
+ const progress = Math.max(0, Math.min(100, Math.round(((done ?? 0) / total) * 100)));
12
+ if (progress >= 100) {
13
+ return (_jsx("span", { className: "bg-feedback-green flex size-4 shrink-0 items-center justify-center rounded-full text-white", title: "Completed", "aria-label": "Completed", children: _jsx(Check, { size: 10, strokeWidth: 1.5, absoluteStrokeWidth: true }) }));
14
+ }
15
+ return (_jsxs("span", { className: "text-neutral-grey-50 shrink-0 text-xs font-medium tabular-nums", children: [progress, "%"] }));
16
+ }
17
+ //# sourceMappingURL=ProjectProgressIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectProgressIndicator.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectProgressIndicator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,IAAI,EACJ,KAAK,GAIN;IACC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CACvD,CAAC;IAEF,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CACL,eACE,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAC,WAAW,gBACN,WAAW,YAEtB,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,mBAAmB,SAAG,GACpD,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,gBAAM,SAAS,EAAC,gEAAgE,aAC7E,QAAQ,SACJ,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { TaskComment } from "../types";
2
+ export type CommentAuthorPresentation = {
3
+ /** The comment was written by an agent on behalf of the execution user. */
4
+ isAgent: boolean;
5
+ /** A human comment written by the viewer. Never true for agent comments. */
6
+ isCurrentUser: boolean;
7
+ /** The name shown in the comment header. */
8
+ label: string;
9
+ /** The viewer owns the row (execution user) and may delete it, agent comments included. */
10
+ canDelete: boolean;
11
+ };
12
+ export declare function normalizeUserName(value: string | null | undefined): string;
13
+ export declare function isAgentComment(comment: Pick<TaskComment, "authorType">): boolean;
14
+ export declare function resolveCommentAuthorPresentation(comment: TaskComment, currentUsername: string | null | undefined, resolvedDisplayName: string): CommentAuthorPresentation;
@@ -0,0 +1,25 @@
1
+ export function normalizeUserName(value) {
2
+ return (value || "").trim().toLowerCase();
3
+ }
4
+ export function isAgentComment(comment) {
5
+ return (comment.authorType ?? "").trim().toLowerCase() === "agent";
6
+ }
7
+ export function resolveCommentAuthorPresentation(comment, currentUsername, resolvedDisplayName) {
8
+ const isAgent = isAgentComment(comment);
9
+ const normalizedCurrentUser = normalizeUserName(currentUsername);
10
+ const authorMatchesViewer = !!normalizedCurrentUser &&
11
+ normalizeUserName(comment.author) === normalizedCurrentUser;
12
+ const isCurrentUser = !isAgent && authorMatchesViewer;
13
+ const label = isAgent
14
+ ? comment.authorDisplayName?.trim() || "Agent"
15
+ : isCurrentUser
16
+ ? "You"
17
+ : resolvedDisplayName;
18
+ return {
19
+ isAgent,
20
+ isCurrentUser,
21
+ label,
22
+ canDelete: authorMatchesViewer,
23
+ };
24
+ }
25
+ //# sourceMappingURL=commentAuthor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentAuthor.js","sourceRoot":"","sources":["../../../src/task-board/components/commentAuthor.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,iBAAiB,CAAC,KAAgC;IAChE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAwC;IAExC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAoB,EACpB,eAA0C,EAC1C,mBAA2B;IAE3B,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,mBAAmB,GACvB,CAAC,CAAC,qBAAqB;QACvB,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,qBAAqB,CAAC;IAC9D,MAAM,aAAa,GAAG,CAAC,OAAO,IAAI,mBAAmB,CAAC;IAEtD,MAAM,KAAK,GAAG,OAAO;QACnB,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,OAAO;QAC9C,CAAC,CAAC,aAAa;YACb,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,mBAAmB,CAAC;IAE1B,OAAO;QACL,OAAO;QACP,aAAa;QACb,KAAK;QACL,SAAS,EAAE,mBAAmB;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,68 @@
1
+ import type { GoalDisplaySpec } from "../components/goalDisplaySpec";
2
+ import type { Goal, TaskItem } from "../types";
3
+ /**
4
+ * The dashboard reduces the fifteen execution states to four buckets that a
5
+ * project owner acts on differently: nothing (done), watch (running), act
6
+ * (attention) or wait (open, which includes blocked and unassigned work).
7
+ */
8
+ export type DashboardTaskBucket = "done" | "running" | "attention" | "open";
9
+ export declare function getDashboardTaskBucket(task: TaskItem): DashboardTaskBucket;
10
+ export declare function isFailedTask(task: TaskItem): boolean;
11
+ export type DashboardPhase = "empty" | "finished" | "running" | "attention" | "idle";
12
+ export type DashboardStatusSummary = {
13
+ total: number;
14
+ done: number;
15
+ running: number;
16
+ attention: number;
17
+ failed: number;
18
+ open: number;
19
+ phase: DashboardPhase;
20
+ /** Short lead ("Running.") shown in bold. */
21
+ headline: string;
22
+ /** Plain-language sentence(s) after the headline. */
23
+ detail: string;
24
+ };
25
+ export declare function buildDashboardStatusSummary(tasks: TaskItem[]): DashboardStatusSummary;
26
+ export type DashboardAttentionAction = "Review" | "Answer" | "Open";
27
+ export type DashboardAttentionEntry = {
28
+ task: TaskItem;
29
+ /** What the task needs from the user, in plain words. */
30
+ description: string;
31
+ action: DashboardAttentionAction;
32
+ };
33
+ export declare function describeAttention(task: TaskItem): {
34
+ description: string;
35
+ action: DashboardAttentionAction;
36
+ };
37
+ export declare function listAttentionTasks(tasks: TaskItem[]): DashboardAttentionEntry[];
38
+ export declare function listRunningTasks(tasks: TaskItem[]): TaskItem[];
39
+ /** Row label for the pipeline; null means the row shows no status text. */
40
+ export declare function getDashboardTaskStatusLabel(task: TaskItem, isBlocked: boolean): string | null;
41
+ /** Wall-clock duration of a finished execution, or null when unknown. */
42
+ export declare function getTaskDurationMs(task: TaskItem): number | null;
43
+ /** Time since the execution started, or null when the task never started. */
44
+ export declare function getTaskElapsedMs(task: TaskItem, now: number): number | null;
45
+ export declare function formatDurationShort(ms: number): string;
46
+ /** Earliest execution start across the run, or null when nothing started. */
47
+ export declare function getRunStartedAt(tasks: TaskItem[]): number | null;
48
+ export type DashboardTile = {
49
+ key: string;
50
+ label: string;
51
+ value: string;
52
+ suffix?: string;
53
+ /** Muted trailing text under the value. */
54
+ detail?: string;
55
+ /** Emphasised (red) lead-in for `detail`, e.g. "9 high". */
56
+ emphasis?: string;
57
+ /** 0..100 progress bar under the value. */
58
+ progress?: number | null;
59
+ tone?: "ok" | "neutral";
60
+ };
61
+ export declare const MAX_GOAL_TILES = 4;
62
+ export declare function readGoalSummary(goal: Goal): string | null;
63
+ /**
64
+ * Turns the generic goal widgets (coverage, score, severity counts, metrics)
65
+ * into at most four figures. The goal template's display spec decides the
66
+ * order, so no project type needs its own dashboard code.
67
+ */
68
+ export declare function buildGoalTiles(goal: Goal, spec: GoalDisplaySpec | null): DashboardTile[];