@parhelia/core 0.3.12831 → 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 (167) 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.js +5 -3
  163. package/dist/tour/sandbox-tour.js.map +1 -1
  164. package/dist/tour/tour-utils.d.ts +6 -0
  165. package/dist/tour/tour-utils.js +10 -0
  166. package/dist/tour/tour-utils.js.map +1 -1
  167. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Duration and timestamp helpers shared by the agent terminal's tool-call
3
+ * rows, activity headers and the per-turn response timer.
4
+ */
5
+ const isUsableDuration = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0;
6
+ const formatMinutesAndAbove = (totalSeconds) => {
7
+ const minutes = Math.floor(totalSeconds / 60);
8
+ const seconds = totalSeconds % 60;
9
+ if (minutes < 60) {
10
+ return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
11
+ }
12
+ const hours = Math.floor(minutes / 60);
13
+ const remainingMinutes = minutes % 60;
14
+ return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;
15
+ };
16
+ /**
17
+ * Formats a measured duration: `850ms`, `1.2s`, `42s`, `3m 5s`, `1h 2m`.
18
+ * Returns null for missing or unusable values.
19
+ */
20
+ export function formatDurationMs(durationMs) {
21
+ if (!isUsableDuration(durationMs)) {
22
+ return null;
23
+ }
24
+ if (durationMs < 1000) {
25
+ return `${Math.round(durationMs)}ms`;
26
+ }
27
+ if (durationMs < 10_000) {
28
+ return `${(durationMs / 1000).toFixed(1)}s`;
29
+ }
30
+ if (durationMs < 60_000) {
31
+ return `${Math.round(durationMs / 1000)}s`;
32
+ }
33
+ return formatMinutesAndAbove(Math.round(durationMs / 1000));
34
+ }
35
+ /**
36
+ * Coarser variant for a ticking clock: whole seconds, so the label advances
37
+ * steadily instead of jittering through sub-second values.
38
+ */
39
+ export function formatElapsedMs(elapsedMs) {
40
+ if (!isUsableDuration(elapsedMs)) {
41
+ return null;
42
+ }
43
+ const totalSeconds = Math.floor(elapsedMs / 1000);
44
+ if (totalSeconds < 60) {
45
+ return `${totalSeconds}s`;
46
+ }
47
+ return formatMinutesAndAbove(totalSeconds);
48
+ }
49
+ /**
50
+ * Sum of the measured execution times in a batch of tool calls. Calls without
51
+ * a measurement are skipped; null when nothing was measured.
52
+ */
53
+ export function sumToolCallDurationsMs(toolCalls) {
54
+ let total = null;
55
+ for (const toolCall of toolCalls) {
56
+ if (isUsableDuration(toolCall.responseTimeMs)) {
57
+ total = (total ?? 0) + toolCall.responseTimeMs;
58
+ }
59
+ }
60
+ return total;
61
+ }
62
+ const NAIVE_ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/;
63
+ /**
64
+ * Parses an agent timestamp to epoch milliseconds. Persisted dates are UTC, so
65
+ * a value without a zone designator is read as UTC rather than local time to
66
+ * keep server and client timestamps comparable.
67
+ */
68
+ export function parseTimestampMs(value) {
69
+ if (value === null || value === undefined) {
70
+ return null;
71
+ }
72
+ if (value instanceof Date) {
73
+ const time = value.getTime();
74
+ return Number.isFinite(time) ? time : null;
75
+ }
76
+ if (typeof value === "number") {
77
+ return Number.isFinite(value) ? value : null;
78
+ }
79
+ const trimmed = value.trim();
80
+ if (!trimmed) {
81
+ return null;
82
+ }
83
+ const normalized = NAIVE_ISO_TIMESTAMP.test(trimmed)
84
+ ? `${trimmed}Z`
85
+ : trimmed;
86
+ const parsed = Date.parse(normalized);
87
+ return Number.isFinite(parsed) ? parsed : null;
88
+ }
89
+ //# sourceMappingURL=agentDurations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentDurations.js","sourceRoot":"","sources":["../../../../src/editor/ai/terminal/agentDurations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { AgentChatMessage } from "../../services/agentService";
2
+ import type { MessageGroup } from "../agentMessageGrouping";
3
+ /**
4
+ * Wall-clock timing of one response turn: from the prompt that opened it to
5
+ * the last persisted activity of the closing assistant response.
6
+ */
7
+ export interface AgentTurnTiming {
8
+ /** Recorded processing time; excludes gaps between attempts and approvals. */
9
+ processingMs?: number;
10
+ /** Epoch ms of the prompt that opened the turn. */
11
+ startedAt: number;
12
+ /**
13
+ * Epoch ms of the last persisted activity in the turn. Null while the turn
14
+ * is still running, or when only stream-time copies of its messages exist.
15
+ */
16
+ endedAt: number | null;
17
+ /** True while the run is still working on this turn. */
18
+ isLive: boolean;
19
+ }
20
+ /**
21
+ * Timing for the assistant group at `groupIndex`, or null when that group is
22
+ * not the closing response of its turn (another assistant group follows
23
+ * before the next prompt) or no prompt precedes it.
24
+ */
25
+ export declare function resolveAssistantGroupTurnTiming(groups: readonly MessageGroup[], groupIndex: number, isExecuting: boolean): AgentTurnTiming | null;
26
+ /**
27
+ * Prompt timestamp of the turn that is currently open, i.e. of the last user
28
+ * message in the transcript.
29
+ */
30
+ export declare function resolveOpenTurnStartedAt(messages: readonly AgentChatMessage[]): number | null;
31
+ /**
32
+ * True when an assistant message already follows the last prompt, i.e. the
33
+ * open turn renders a response group that carries its own live clock.
34
+ */
35
+ export declare function openTurnHasAssistantResponse(messages: readonly AgentChatMessage[]): boolean;
@@ -0,0 +1,128 @@
1
+ import { parseTimestampMs } from "./agentDurations";
2
+ const later = (a, b) => {
3
+ if (a === null)
4
+ return b;
5
+ if (b === null)
6
+ return a;
7
+ return Math.max(a, b);
8
+ };
9
+ const findTurnStartedAt = (groups, groupIndex) => {
10
+ for (let index = groupIndex - 1; index >= 0; index--) {
11
+ const earlier = groups[index];
12
+ if (earlier?.type === "user") {
13
+ return parseTimestampMs(earlier.messages[0]?.createdDate);
14
+ }
15
+ }
16
+ return null;
17
+ };
18
+ /**
19
+ * Rows that came from the server carry a message index; stream-time copies
20
+ * are minted on the client with -1 and keep it even after run settle relabels
21
+ * them as completed, so the index is the reliable persisted-row signal.
22
+ */
23
+ const isPersistedRow = (message) => message.messageIndex >= 0 && message.messageType !== "streaming";
24
+ const resolveTurnEndedAt = (messages) => {
25
+ let endedAt = null;
26
+ for (const message of messages) {
27
+ // Assistant rows are persisted once their response has completed, so the
28
+ // persisted timestamp marks completion. Stream-time copies only carry the
29
+ // client's creation time and must not be read as an end.
30
+ if (isPersistedRow(message)) {
31
+ endedAt = later(endedAt, parseTimestampMs(message.createdDate));
32
+ }
33
+ for (const toolCall of message.toolCalls ?? []) {
34
+ endedAt = later(endedAt, parseTimestampMs(toolCall.executionCompletedAt));
35
+ }
36
+ }
37
+ return endedAt;
38
+ };
39
+ /**
40
+ * Timing for the assistant group at `groupIndex`, or null when that group is
41
+ * not the closing response of its turn (another assistant group follows
42
+ * before the next prompt) or no prompt precedes it.
43
+ */
44
+ export function resolveAssistantGroupTurnTiming(groups, groupIndex, isExecuting) {
45
+ const group = groups[groupIndex];
46
+ if (!group || group.type !== "assistant-group") {
47
+ return null;
48
+ }
49
+ let nextPromptFollows = false;
50
+ for (let index = groupIndex + 1; index < groups.length; index++) {
51
+ const laterGroup = groups[index];
52
+ if (!laterGroup)
53
+ continue;
54
+ if (laterGroup.type === "user") {
55
+ nextPromptFollows = true;
56
+ break;
57
+ }
58
+ if (laterGroup.type === "assistant-group") {
59
+ return null;
60
+ }
61
+ }
62
+ const startedAt = findTurnStartedAt(groups, groupIndex);
63
+ if (startedAt === null) {
64
+ return null;
65
+ }
66
+ const isLive = isExecuting && !nextPromptFollows;
67
+ const processingMs = resolveProcessingMs(group.messages);
68
+ return {
69
+ startedAt,
70
+ endedAt: isLive ? null : resolveTurnEndedAt(group.messages),
71
+ isLive,
72
+ ...(processingMs === null ? {} : { processingMs }),
73
+ };
74
+ }
75
+ function resolveProcessingMs(messages) {
76
+ const rows = messages.filter(isPersistedRow);
77
+ if (!rows.length ||
78
+ rows.some((row) => !Number.isFinite(row.responseTimeMs) || row.responseTimeMs < 0))
79
+ return null;
80
+ let duration = rows.reduce((sum, row) => sum + row.responseTimeMs, 0);
81
+ // Tools in a batch can execute concurrently. Count the union of their intervals.
82
+ const intervals = rows
83
+ .flatMap((row) => (row.toolCalls ?? []).flatMap((tool) => {
84
+ const start = parseTimestampMs(tool.executionStartedAt);
85
+ const end = parseTimestampMs(tool.executionCompletedAt);
86
+ return start !== null && end !== null && end >= start
87
+ ? [[start, end]]
88
+ : [];
89
+ }))
90
+ .sort((a, b) => a[0] - b[0]);
91
+ let previousEnd = -Infinity;
92
+ for (const [start, end] of intervals) {
93
+ duration += Math.max(0, end - Math.max(start, previousEnd));
94
+ previousEnd = Math.max(previousEnd, end);
95
+ }
96
+ return duration;
97
+ }
98
+ /**
99
+ * Prompt timestamp of the turn that is currently open, i.e. of the last user
100
+ * message in the transcript.
101
+ */
102
+ export function resolveOpenTurnStartedAt(messages) {
103
+ for (let index = messages.length - 1; index >= 0; index--) {
104
+ const message = messages[index];
105
+ if (message?.role === "user") {
106
+ return parseTimestampMs(message.createdDate);
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ /**
112
+ * True when an assistant message already follows the last prompt, i.e. the
113
+ * open turn renders a response group that carries its own live clock.
114
+ */
115
+ export function openTurnHasAssistantResponse(messages) {
116
+ for (let index = messages.length - 1; index >= 0; index--) {
117
+ const message = messages[index];
118
+ if (!message)
119
+ continue;
120
+ if (message.role === "user")
121
+ return false;
122
+ if (message.role === "assistant") {
123
+ return true;
124
+ }
125
+ }
126
+ return false;
127
+ }
128
+ //# sourceMappingURL=agentTurnTiming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentTurnTiming.js","sourceRoot":"","sources":["../../../../src/editor/ai/terminal/agentTurnTiming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AiProfile } from "../../../services/aiService";
2
+ export interface AgentMemorySettingsSectionProps {
3
+ activeProfile?: AiProfile;
4
+ }
5
+ /**
6
+ * Memory section of the agent settings popover: the content guidance that applies to the
7
+ * loaded page plus the user's personal memories for the active profile.
8
+ */
9
+ export declare function AgentMemorySettingsSection({ activeProfile, }: AgentMemorySettingsSectionProps): import("react").JSX.Element | null;
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { getAgentMemories, getSubtreeMemories, } from "../../../services/agentService";
4
+ import { useEditContext } from "../../../client/editContext";
5
+ import { AgentMemoryPanel } from "./AgentMemoryPanel";
6
+ import { AgentSettingsSection } from "./AgentSettingsSections";
7
+ /**
8
+ * Memory section of the agent settings popover: the content guidance that applies to the
9
+ * loaded page plus the user's personal memories for the active profile.
10
+ */
11
+ export function AgentMemorySettingsSection({ activeProfile, }) {
12
+ const [expanded, setExpanded] = useState(false);
13
+ const [memoryCount, setMemoryCount] = useState(0);
14
+ const [guidanceCount, setGuidanceCount] = useState(0);
15
+ const editContext = useEditContext();
16
+ const profileId = activeProfile?.enableMemory ? activeProfile.id : null;
17
+ useEffect(() => {
18
+ let cancelled = false;
19
+ setMemoryCount(0);
20
+ if (!profileId)
21
+ return;
22
+ void getAgentMemories(profileId)
23
+ .then((result) => {
24
+ if (!cancelled && result.success) {
25
+ setMemoryCount(result.memories?.length ?? 0);
26
+ }
27
+ })
28
+ .catch((error) => {
29
+ console.error("Failed to load memory count", error);
30
+ });
31
+ return () => {
32
+ cancelled = true;
33
+ };
34
+ }, [profileId]);
35
+ // Content guidance that applies to the loaded page. Independent of the profile's
36
+ // Enable Memory flag: guidance is editorial, not a per-profile agent capability.
37
+ const guidanceItemId = editContext?.currentItemDescriptor?.id ?? null;
38
+ const guidanceLanguage = editContext?.currentItemDescriptor?.language ?? null;
39
+ useEffect(() => {
40
+ let cancelled = false;
41
+ setGuidanceCount(0);
42
+ if (!guidanceItemId)
43
+ return;
44
+ void getSubtreeMemories({
45
+ scopeId: guidanceItemId,
46
+ includeInherited: true,
47
+ language: guidanceLanguage,
48
+ })
49
+ .then((result) => {
50
+ if (!cancelled && result.success) {
51
+ setGuidanceCount(result.memories?.length ?? 0);
52
+ }
53
+ })
54
+ .catch((error) => {
55
+ console.error("Failed to load content guidance count", error);
56
+ });
57
+ return () => {
58
+ cancelled = true;
59
+ };
60
+ }, [guidanceItemId, guidanceLanguage]);
61
+ const handleMemoryCount = useCallback((n) => setMemoryCount(n), []);
62
+ const handleGuidanceCount = useCallback((n) => setGuidanceCount(n), []);
63
+ // Also shown when content guidance applies to the page, even for profiles without
64
+ // Enable Memory - guidance reaches every AI surface regardless of that flag, so hiding it
65
+ // here would leave editors unable to see what is steering the output.
66
+ if (!profileId && guidanceCount === 0)
67
+ return null;
68
+ return (_jsx(AgentSettingsSection, { title: `Memory (${memoryCount + guidanceCount})`, expanded: expanded, onExpandedChange: setExpanded, testId: "agent-memory-section", children: _jsxs("div", { className: "border-border-default bg-neutral-grey-5/50 max-h-72 overflow-y-auto rounded border", "data-testid": "agent-memory-section", children: [guidanceItemId && (_jsxs("div", { "data-testid": "agent-memory-guidance-section", children: [_jsx("div", { className: "text-neutral-grey-50 px-2 pt-2 text-[9px] font-medium tracking-wide uppercase", children: "This page" }), _jsx(AgentMemoryPanel, { scope: {
69
+ kind: "subtree",
70
+ scopeId: guidanceItemId,
71
+ language: guidanceLanguage,
72
+ includeInherited: true,
73
+ }, headerless: true, className: "p-1.5", onCountChange: handleGuidanceCount }, `guidance-${guidanceItemId}`)] })), profileId && (_jsxs("div", { "data-testid": "agent-memory-personal-section", children: [guidanceItemId && (_jsx("div", { className: "border-border-default text-neutral-grey-50 border-t px-2 pt-2 text-[9px] font-medium tracking-wide uppercase", children: "Personal" })), _jsx(AgentMemoryPanel, { scope: { kind: "user", profileId }, headerless: true, className: "p-1.5", onCountChange: handleMemoryCount }, `memory-${profileId}`)] }))] }) }));
74
+ }
75
+ //# sourceMappingURL=AgentMemorySettingsSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentMemorySettingsSection.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/AgentMemorySettingsSection.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type SelectOption } from "../../../../components/ui/select";
2
+ export interface AgentProfileRecoveryProps {
3
+ options: SelectOption[];
4
+ readOnly: boolean;
5
+ isExecuting: boolean;
6
+ isChangingProfile: boolean;
7
+ error: string | null;
8
+ onProfileChange: (profileId: string) => void | Promise<void>;
9
+ }
10
+ export declare function AgentProfileRecovery({ options, readOnly, isExecuting, isChangingProfile, error, onProfileChange, }: AgentProfileRecoveryProps): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Select } from "../../../../components/ui/select";
3
+ export function AgentProfileRecovery({ options, readOnly, isExecuting, isChangingProfile, error, onProfileChange, }) {
4
+ return (_jsxs("div", { className: "border-border-default mx-4 my-3 shrink-0 rounded-xl border bg-white p-4", "data-testid": "agent-profile-recovery", children: [_jsx("p", { className: "text-neutral-grey-100 text-sm font-medium", children: "Agent profile unavailable" }), _jsx("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: readOnly
5
+ ? "This chat's profile is no longer available. Someone with edit access can select another profile."
6
+ : isExecuting
7
+ ? "This chat's profile is no longer available. You can select another profile when the current run finishes."
8
+ : options.length === 0
9
+ ? "This chat's profile is no longer available, and there are no replacement profiles available to you."
10
+ : "This chat's profile is no longer available. Select another profile to continue the conversation." }), !readOnly && options.length > 0 ? (_jsx(Select, { value: "", options: options, placeholder: isChangingProfile ? "Changing profile..." : "Select another profile", disabled: isExecuting || isChangingProfile, searchable: options.length > 5, searchPlaceholder: "Filter profiles...", className: "mt-3 w-full", "data-testid": "agent-replacement-profile-selector", onValueChange: (value) => void onProfileChange(value) })) : null, error ? (_jsx("p", { role: "alert", className: "text-feedback-red mt-2 text-xs", children: error })) : null] }));
11
+ }
12
+ //# sourceMappingURL=AgentProfileRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentProfileRecovery.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/AgentProfileRecovery.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,kCAAkC,CAAC;AAW7E,MAAM,UAAU,oBAAoB,CAAC,EACnC,OAAO,EACP,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,KAAK,EACL,eAAe,GACW;IAC1B,OAAO,CACL,eACE,SAAS,EAAC,yEAAyE,iBACvE,wBAAwB,aAEpC,YAAG,SAAS,EAAC,2CAA2C,0CAEpD,EACJ,YAAG,SAAS,EAAC,mCAAmC,YAC7C,QAAQ;oBACP,CAAC,CAAC,kGAAkG;oBACpG,CAAC,CAAC,WAAW;wBACX,CAAC,CAAC,2GAA2G;wBAC7G,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;4BACpB,CAAC,CAAC,qGAAqG;4BACvG,CAAC,CAAC,kGAAkG,GACxG,EACH,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,KAAC,MAAM,IACL,KAAK,EAAC,EAAE,EACR,OAAO,EAAE,OAAO,EAChB,WAAW,EACT,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,wBAAwB,EAEtE,QAAQ,EAAE,WAAW,IAAI,iBAAiB,EAC1C,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAC9B,iBAAiB,EAAC,oBAAoB,EACtC,SAAS,EAAC,aAAa,iBACX,oCAAoC,EAChD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,GACrD,CACH,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,CAAC,CAAC,CAAC,CACP,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,gCAAgC,YACvD,KAAK,GACJ,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolCallContentContext } from "./toolCallContentRenderers";
2
+ export declare function resolveCreateItemHeaderAction(context: ToolCallContentContext): import("react").JSX.Element | null;
3
+ export declare function resolveCreateItemDetails(context: ToolCallContentContext): import("react").JSX.Element | null;
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../../../../components/ui/button";
3
+ import { useEditContext } from "../../../client/editContext";
4
+ import { isSameLoadTarget } from "../../../client/agentLoadItemPolicy";
5
+ import { parseJsonString } from "./toolCallResultJson";
6
+ function parseCreatedItem(context) {
7
+ const result = parseJsonString(context.toolCall.function?.result ?? "");
8
+ if (!result || typeof result.id !== "string" || !result.id.trim())
9
+ return null;
10
+ return {
11
+ id: result.id,
12
+ name: typeof result.name === "string" ? result.name : undefined,
13
+ path: typeof result.path === "string" ? result.path : undefined,
14
+ templateName: typeof result.templateName === "string" ? result.templateName : undefined,
15
+ language: typeof result.language === "string" ? result.language : undefined,
16
+ version: typeof result.version === "number" ? result.version : undefined,
17
+ database: typeof result.database === "string" ? result.database : undefined,
18
+ };
19
+ }
20
+ function CreateItemOpenButton({ item, }) {
21
+ const editContext = useEditContext();
22
+ if (!editContext)
23
+ return null;
24
+ return (_jsx(Button, { size: "sm", variant: "secondary", "data-testid": "create-item-open", onClick: () => {
25
+ const current = editContext.currentItemDescriptor;
26
+ const target = {
27
+ id: item.id,
28
+ language: item.language ?? current?.language ?? "en",
29
+ version: item.version ?? 0,
30
+ database: item.database ?? current?.database,
31
+ };
32
+ if (!isSameLoadTarget(target, current))
33
+ void editContext.loadItem(target);
34
+ editContext.switchWorkspace("editor");
35
+ }, children: "Open" }));
36
+ }
37
+ export function resolveCreateItemHeaderAction(context) {
38
+ const item = parseCreatedItem(context);
39
+ return item ? _jsx(CreateItemOpenButton, { item: item }) : null;
40
+ }
41
+ export function resolveCreateItemDetails(context) {
42
+ const item = parseCreatedItem(context);
43
+ if (!item)
44
+ return null;
45
+ return (_jsxs("div", { "data-testid": "create-item-details", className: "space-y-1 p-2 text-xs", children: [_jsx("div", { className: "font-medium", children: item.name || item.id }), _jsx("div", { className: "text-neutral-grey-50 break-words", children: [item.path, item.templateName].filter(Boolean).join(" · ") })] }));
46
+ }
47
+ //# sourceMappingURL=CreateItemToolCallContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateItemToolCallContent.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/CreateItemToolCallContent.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AgentTurnTiming } from "../agentTurnTiming";
2
+ /**
3
+ * Current time that refreshes once per interval while `active`. Stops ticking
4
+ * when inactive and keeps the last value, so a settled turn reads the moment
5
+ * it settled until persisted timestamps arrive.
6
+ */
7
+ export declare function useNowTicker(active: boolean, intervalMs?: number): number;
8
+ /**
9
+ * Wall-clock duration of one response turn. Ticks while the turn is running
10
+ * and settles on the persisted timing once the response has completed.
11
+ */
12
+ export declare function ResponseTurnDuration({ timing, className, }: {
13
+ timing: AgentTurnTiming;
14
+ className?: string;
15
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { Timer } from "lucide-react";
4
+ import { Tooltip, TooltipContent, TooltipTrigger, } from "../../../../components/ui/tooltip";
5
+ import { cn } from "../../../../lib/utils";
6
+ import { formatTime } from "../../../utils";
7
+ import { formatDurationMs, formatElapsedMs } from "../agentDurations";
8
+ const TICK_INTERVAL_MS = 1000;
9
+ /**
10
+ * Current time that refreshes once per interval while `active`. Stops ticking
11
+ * when inactive and keeps the last value, so a settled turn reads the moment
12
+ * it settled until persisted timestamps arrive.
13
+ */
14
+ export function useNowTicker(active, intervalMs = TICK_INTERVAL_MS) {
15
+ const [now, setNow] = useState(() => Date.now());
16
+ useEffect(() => {
17
+ if (!active) {
18
+ return undefined;
19
+ }
20
+ const handle = window.setInterval(() => {
21
+ setNow(Date.now());
22
+ }, intervalMs);
23
+ return () => {
24
+ window.clearInterval(handle);
25
+ };
26
+ }, [active, intervalMs]);
27
+ return now;
28
+ }
29
+ const formatClock = (epochMs) => formatTime(new Date(epochMs), { second: "numeric" });
30
+ /**
31
+ * Wall-clock duration of one response turn. Ticks while the turn is running
32
+ * and settles on the persisted timing once the response has completed.
33
+ */
34
+ export function ResponseTurnDuration({ timing, className, }) {
35
+ const { startedAt, endedAt, isLive } = timing;
36
+ const now = useNowTicker(isLive);
37
+ const wasLive = useRef(isLive);
38
+ if (isLive)
39
+ wasLive.current = true;
40
+ // While live the clock is the end. Once settled, prefer the persisted end;
41
+ // until the snapshot brings it, the last tick is within a second of it.
42
+ const effectiveEnd = isLive ? now : (endedAt ?? now);
43
+ const durationMs = !isLive && timing.processingMs !== undefined
44
+ ? timing.processingMs
45
+ : Math.max(0, effectiveEnd - startedAt);
46
+ const label = isLive
47
+ ? formatElapsedMs(durationMs)
48
+ : formatDurationMs(durationMs);
49
+ if (!label ||
50
+ (!isLive &&
51
+ !wasLive.current &&
52
+ endedAt === null &&
53
+ timing.processingMs === undefined)) {
54
+ return null;
55
+ }
56
+ const tooltip = isLive
57
+ ? `Responding for ${label}, since ${formatClock(startedAt)}`
58
+ : timing.processingMs !== undefined
59
+ ? `Processing took ${label}; time waiting between attempts and approvals is excluded.`
60
+ : `Elapsed time from prompt to response: ${label} (${formatClock(startedAt)} to ${formatClock(effectiveEnd)}), including time waiting.`;
61
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: cn("text-neutral-grey-50 inline-flex shrink-0 cursor-help items-center gap-1 text-[10px] leading-4 tabular-nums", className), "data-testid": "agent-turn-duration", "data-live": isLive ? "true" : "false", "data-duration-ms": durationMs, children: [_jsx(Timer, { size: 12, strokeWidth: 1, "aria-hidden": "true" }), _jsx("span", { children: label })] }) }), _jsx(TooltipContent, { side: "top", children: tooltip })] }));
62
+ }
63
+ //# sourceMappingURL=ResponseTurnDuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseTurnDuration.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/ResponseTurnDuration.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const parseJsonString: (json: string | object) => any | null;
@@ -0,0 +1,46 @@
1
+ const MAX_AUTO_PARSE_JSON_CHARS = 25_000;
2
+ // Helper function to parse JSON string to object
3
+ export const parseJsonString = (json) => {
4
+ // If it's already an object, return it directly
5
+ if (typeof json === "object" && json !== null) {
6
+ return json;
7
+ }
8
+ // Convert to string if not already
9
+ const jsonString = typeof json === "string" ? json : String(json);
10
+ const trimmed = jsonString.trim();
11
+ if (!trimmed || trimmed.length > MAX_AUTO_PARSE_JSON_CHARS) {
12
+ return null;
13
+ }
14
+ const firstChar = trimmed[0];
15
+ if (firstChar !== "{" && firstChar !== "[" && firstChar !== '"') {
16
+ return null;
17
+ }
18
+ // Try to parse as JSON
19
+ try {
20
+ let parsed = JSON.parse(trimmed);
21
+ // If the result is still a string that looks like JSON, parse it again
22
+ if (typeof parsed === "string" &&
23
+ (parsed.startsWith("{") || parsed.startsWith("["))) {
24
+ try {
25
+ parsed = JSON.parse(parsed);
26
+ }
27
+ catch {
28
+ // Keep the first parsed value when nested JSON is incomplete.
29
+ }
30
+ }
31
+ return parsed;
32
+ }
33
+ catch {
34
+ // Try to handle double-escaped JSON
35
+ try {
36
+ const unescaped = trimmed.replace(/\\"/g, '"').replace(/\\\\/g, "\\");
37
+ const parsed = JSON.parse(unescaped);
38
+ return parsed;
39
+ }
40
+ catch {
41
+ // If all parsing fails, return null to indicate we should display as plain text
42
+ return null;
43
+ }
44
+ }
45
+ };
46
+ //# sourceMappingURL=toolCallResultJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolCallResultJson.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/toolCallResultJson.ts"],"names":[],"mappings":"AAAA,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAqB,EAAc,EAAE;IACnE,gDAAgD;IAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAElC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC;QACH,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjC,uEAAuE;QACvE,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAClD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AiModel } from "../../services/aiService";
2
+ export declare const REASONING_EFFORT_LADDER: readonly ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export declare function getReasoningEffortOptions(model?: AiModel): {
4
+ value: string;
5
+ label: string;
6
+ }[];
7
+ export declare function getEffectiveReasoningEffort(selected: string, model?: AiModel): string | undefined;
8
+ export declare function getReasoningEffortHint(selected: string, model?: AiModel, activeModel?: AiModel): string;