@parhelia/core 0.1.12749 → 0.1.12752

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 (101) hide show
  1. package/dist/agents-view/AgentsView.js +1 -1
  2. package/dist/agents-view/AgentsView.js.map +1 -1
  3. package/dist/agents-view/AgentsWorkspaceView.js +41 -21
  4. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  5. package/dist/components/ui/PlaceholderInput.js +3 -3
  6. package/dist/components/ui/PlaceholderInput.js.map +1 -1
  7. package/dist/components/ui/PlaceholderInputTypes.js +2 -2
  8. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
  9. package/dist/components/ui/PlaceholderItemSelector.js +2 -2
  10. package/dist/components/ui/PlaceholderItemSelector.js.map +1 -1
  11. package/dist/editor/LinkEditorDialog.js +2 -2
  12. package/dist/editor/LinkEditorDialog.js.map +1 -1
  13. package/dist/editor/ai/AgentBanners.d.ts +11 -0
  14. package/dist/editor/ai/AgentBanners.js +16 -0
  15. package/dist/editor/ai/AgentBanners.js.map +1 -0
  16. package/dist/editor/ai/AgentCostDisplay.d.ts +12 -0
  17. package/dist/editor/ai/AgentCostDisplay.js +24 -1
  18. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  19. package/dist/editor/ai/AgentDocumentList.js +5 -4
  20. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  21. package/dist/editor/ai/AgentInlineDialogContent.d.ts +17 -0
  22. package/dist/editor/ai/AgentInlineDialogContent.js +32 -0
  23. package/dist/editor/ai/AgentInlineDialogContent.js.map +1 -0
  24. package/dist/editor/ai/AgentSharingSection.d.ts +6 -0
  25. package/dist/editor/ai/AgentSharingSection.js +149 -0
  26. package/dist/editor/ai/AgentSharingSection.js.map +1 -0
  27. package/dist/editor/ai/AgentTerminal.d.ts +2 -1
  28. package/dist/editor/ai/AgentTerminal.js +278 -969
  29. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  30. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +18 -0
  31. package/dist/editor/ai/AgentTerminalStatusBar.js +431 -126
  32. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  33. package/dist/editor/ai/Agents.js +1 -1
  34. package/dist/editor/ai/Agents.js.map +1 -1
  35. package/dist/editor/ai/HeartbeatMessage.d.ts +4 -0
  36. package/dist/editor/ai/HeartbeatMessage.js +7 -0
  37. package/dist/editor/ai/HeartbeatMessage.js.map +1 -0
  38. package/dist/editor/ai/InitialThinkingSplash.d.ts +3 -0
  39. package/dist/editor/ai/InitialThinkingSplash.js +9 -0
  40. package/dist/editor/ai/InitialThinkingSplash.js.map +1 -0
  41. package/dist/editor/ai/InlineAiDialog.js +49 -1
  42. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  43. package/dist/editor/ai/QueuedPromptsPanel.d.ts +4 -0
  44. package/dist/editor/ai/QueuedPromptsPanel.js +36 -0
  45. package/dist/editor/ai/QueuedPromptsPanel.js.map +1 -0
  46. package/dist/editor/ai/TodoListPanel.d.ts +5 -0
  47. package/dist/editor/ai/TodoListPanel.js +113 -0
  48. package/dist/editor/ai/TodoListPanel.js.map +1 -0
  49. package/dist/editor/ai/ToolCallDisplay.js +54 -10
  50. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  51. package/dist/editor/ai/UserMessage.d.ts +4 -0
  52. package/dist/editor/ai/UserMessage.js +42 -0
  53. package/dist/editor/ai/UserMessage.js.map +1 -0
  54. package/dist/editor/ai/agentMessageConversion.d.ts +11 -0
  55. package/dist/editor/ai/agentMessageConversion.js +134 -0
  56. package/dist/editor/ai/agentMessageConversion.js.map +1 -0
  57. package/dist/editor/ai/agentMessageGrouping.d.ts +22 -0
  58. package/dist/editor/ai/agentMessageGrouping.js +103 -0
  59. package/dist/editor/ai/agentMessageGrouping.js.map +1 -0
  60. package/dist/editor/ai/agentMessageHelpers.d.ts +23 -0
  61. package/dist/editor/ai/agentMessageHelpers.js +124 -0
  62. package/dist/editor/ai/agentMessageHelpers.js.map +1 -0
  63. package/dist/editor/ai/agentMessageMarkdown.d.ts +2 -0
  64. package/dist/editor/ai/agentMessageMarkdown.js +14 -0
  65. package/dist/editor/ai/agentMessageMarkdown.js.map +1 -0
  66. package/dist/editor/ai/agentTodoExtraction.d.ts +12 -0
  67. package/dist/editor/ai/agentTodoExtraction.js +205 -0
  68. package/dist/editor/ai/agentTodoExtraction.js.map +1 -0
  69. package/dist/editor/client/editContext.d.ts +1 -0
  70. package/dist/editor/client/editContext.js.map +1 -1
  71. package/dist/editor/client/operations.d.ts +3 -1
  72. package/dist/editor/client/operations.js +20 -2
  73. package/dist/editor/client/operations.js.map +1 -1
  74. package/dist/editor/menubar/VersionPreviewCard.js +34 -3
  75. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  76. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +2 -2
  77. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
  78. package/dist/editor/reviews/SuggestedEdit.js +65 -48
  79. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  80. package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -1
  81. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  82. package/dist/editor/services/agentService.d.ts +24 -0
  83. package/dist/editor/services/agentService.js +40 -0
  84. package/dist/editor/services/agentService.js.map +1 -1
  85. package/dist/editor/services/aiService.d.ts +10 -0
  86. package/dist/editor/services/aiService.js.map +1 -1
  87. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +1 -1
  88. package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
  89. package/dist/revision.d.ts +2 -2
  90. package/dist/revision.js +2 -2
  91. package/dist/task-board/TaskBoardWorkspace.js +57 -26
  92. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  93. package/dist/task-board/components/ProjectDashboard.js +2 -3
  94. package/dist/task-board/components/ProjectDashboard.js.map +1 -1
  95. package/dist/task-board/components/TaskBoardTitlebar.js +2 -1
  96. package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
  97. package/dist/task-board/components/TaskDetailPanel.d.ts +8 -0
  98. package/dist/task-board/components/TaskDetailPanel.js +5 -3
  99. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  100. package/package.json +1 -1
  101. package/styles.css +11 -10
@@ -0,0 +1,124 @@
1
+ export const AGENT_HISTORY_LIMIT = 1000;
2
+ export const MACHINE_CAPACITY_REASON = "machineCapacity";
3
+ export const MACHINE_CAPACITY_DETAIL = "waitingForCapacity";
4
+ export function mergeAgentOperationHistory(existing, incoming, limit = AGENT_HISTORY_LIMIT) {
5
+ const merged = new Map(existing.map((operation) => [operation.id, operation]));
6
+ for (const operation of incoming) {
7
+ merged.set(operation.id, operation);
8
+ }
9
+ return Array.from(merged.values())
10
+ .sort((left, right) => new Date(right.date).getTime() - new Date(left.date).getTime())
11
+ .slice(0, limit);
12
+ }
13
+ export function buildPlaceholderAgentDetails(agentStub) {
14
+ const now = new Date().toISOString();
15
+ const updated = agentStub.updatedDate || now;
16
+ // AgentDetails has required fields, but some workspaces only pass an Agent stub initially.
17
+ // This placeholder keeps streaming/tool-call UI working until `getAgent()` returns full details.
18
+ return {
19
+ ...agentStub,
20
+ name: agentStub.name || "Agent",
21
+ userId: agentStub.userId || "",
22
+ updatedDate: updated,
23
+ profileName: agentStub.profileName || "",
24
+ model: agentStub.model || "",
25
+ createdDate: agentStub.createdDate || updated,
26
+ totalTokensUsed: 0,
27
+ totalInputTokens: 0,
28
+ totalOutputTokens: 0,
29
+ totalCachedInputTokens: 0,
30
+ totalInputTokenCost: 0,
31
+ totalOutputTokenCost: 0,
32
+ totalCachedInputTokenCost: 0,
33
+ totalImageCost: 0,
34
+ totalCost: 0,
35
+ currency: agentStub.currency || "USD",
36
+ messageCount: agentStub.messageCount || 0,
37
+ };
38
+ }
39
+ export function normalizeDialogAgentId(value) {
40
+ return value?.trim().toLowerCase() || "";
41
+ }
42
+ export function normalizeServerExecutionStatus(value) {
43
+ return (value || "").replace(/\s+/g, "").toLowerCase();
44
+ }
45
+ export function isFinishedServerExecutionStatus(value) {
46
+ const normalized = normalizeServerExecutionStatus(value);
47
+ return normalized === "completed" || normalized === "cancelled";
48
+ }
49
+ export function formatAllowanceSource(source) {
50
+ const normalized = source?.trim();
51
+ if (!normalized)
52
+ return null;
53
+ if (normalized === "user")
54
+ return "User granted";
55
+ if (normalized.startsWith("preconfigured:profile:"))
56
+ return "Profile";
57
+ if (normalized.startsWith("preconfigured:skill:"))
58
+ return "Skill";
59
+ if (normalized.startsWith("system:")) {
60
+ return normalized.slice("system:".length).replace(/[-_]+/g, " ").trim();
61
+ }
62
+ return normalized;
63
+ }
64
+ export function formatAllowanceLabel(allowance) {
65
+ return `${allowance.operationType || "*"}${"itemPath" in allowance
66
+ ? ` ${allowance.itemPath}`
67
+ : ` ${allowance.normalizedPath}`}`;
68
+ }
69
+ export function normalizeProfileAllowanceOperations(operationTypes) {
70
+ const normalized = (operationTypes || [])
71
+ .map((operationType) => String(operationType || "").trim())
72
+ .filter((operationType) => operationType.length > 0);
73
+ return normalized.length > 0 ? normalized : ["*"];
74
+ }
75
+ export function getAgentRunMessageAgentId(payload) {
76
+ const agentId = payload?.agentId;
77
+ return typeof agentId === "string" ? normalizeDialogAgentId(agentId) : null;
78
+ }
79
+ export function getAgentRunMessageSeq(payload) {
80
+ const seq = payload?.seq;
81
+ return typeof seq === "number" ? seq : null;
82
+ }
83
+ export function getAgentRunMessageDetail(type, payload) {
84
+ if (type === "agent:run:delta") {
85
+ return payload?.type || null;
86
+ }
87
+ if (type === "agent:run:status") {
88
+ if (payload?.data?.reason === MACHINE_CAPACITY_REASON) {
89
+ return MACHINE_CAPACITY_DETAIL;
90
+ }
91
+ return payload?.data?.state || payload?.data?.status || null;
92
+ }
93
+ if (type === "agent:run:error") {
94
+ return payload?.error || null;
95
+ }
96
+ if (type === "agent:run:complete") {
97
+ return payload?.finalStatus || null;
98
+ }
99
+ if (type === "agent:run:start") {
100
+ return payload?.agentName || null;
101
+ }
102
+ return null;
103
+ }
104
+ export function isHeartbeatRunEventMessage(message) {
105
+ if (!message)
106
+ return false;
107
+ if (message.type === "agent:run:delta") {
108
+ const deltaType = message.payload?.type;
109
+ return String(deltaType || "").toLowerCase() === "heartbeat";
110
+ }
111
+ if (message.type === "agent:run:status") {
112
+ const state = message.payload?.data?.state || message.payload?.data?.status;
113
+ return String(state || "").toLowerCase() === "heartbeat";
114
+ }
115
+ return false;
116
+ }
117
+ export function getVisibleDialogRegistry() {
118
+ const registry = globalThis.__agentDialogVisibleCallbacks;
119
+ return registry && typeof registry === "object" ? registry : {};
120
+ }
121
+ export function isAgentErrorStatusValue(status) {
122
+ return status === "error";
123
+ }
124
+ //# sourceMappingURL=agentMessageHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentMessageHelpers.js","sourceRoot":"","sources":["../../../src/editor/ai/agentMessageHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type MarkdownComponentOverrides } from "../../components/MarkdownDisplay";
2
+ export declare const userMessageMarkdownComponents: MarkdownComponentOverrides;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const userMessageMarkdownComponents = {
3
+ h1: (props) => (_jsx("h1", { ...props, className: "mb-2 text-sm leading-5 font-semibold text-gray-900" })),
4
+ h2: (props) => (_jsx("h2", { ...props, className: "mb-1.5 text-[13px] leading-5 font-semibold text-gray-900" })),
5
+ h3: (props) => (_jsx("h3", { ...props, className: "mb-1 text-[12px] leading-5 font-semibold text-gray-900" })),
6
+ h4: (props) => (_jsx("h4", { ...props, className: "mb-1 text-[12px] leading-5 font-medium text-gray-800" })),
7
+ p: (props) => (_jsx("p", { ...props, className: "my-1 text-[12px] leading-5 text-gray-700" })),
8
+ ul: (props) => (_jsx("ul", { ...props, className: "my-2 ml-5 list-disc space-y-1 text-[12px] leading-5 text-gray-700" })),
9
+ ol: (props) => (_jsx("ol", { ...props, className: "my-2 ml-5 list-decimal space-y-1 text-[12px] leading-5 text-gray-700" })),
10
+ li: (props) => (_jsx("li", { ...props, className: "text-[12px] leading-5 text-gray-700" })),
11
+ pre: (props) => (_jsx("pre", { ...props, className: "my-2 overflow-auto rounded-md bg-slate-100 px-3 py-2 text-[11px] leading-4 text-slate-700" })),
12
+ code: ({ inline, className, ...props }) => inline ? (_jsx("code", { ...props, className: "rounded bg-slate-100 px-1 py-0.5 text-[11px] text-slate-700" })) : (_jsx("code", { ...props, className: className })),
13
+ };
14
+ //# sourceMappingURL=agentMessageMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentMessageMarkdown.js","sourceRoot":"","sources":["../../../src/editor/ai/agentMessageMarkdown.tsx"],"names":[],"mappings":";AAGA,MAAM,CAAC,MAAM,6BAA6B,GAA+B;IACvE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,oDAAoD,GAC9D,CACH;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,0DAA0D,GACpE,CACH;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,wDAAwD,GAClE,CACH;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,sDAAsD,GAChE,CACH;IACD,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACZ,eAAO,KAAK,EAAE,SAAS,EAAC,0CAA0C,GAAG,CACtE;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,mEAAmE,GAC7E,CACH;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBACM,KAAK,EACT,SAAS,EAAC,sEAAsE,GAChF,CACH;IACD,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACb,gBAAQ,KAAK,EAAE,SAAS,EAAC,qCAAqC,GAAG,CAClE;IACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CACd,iBACM,KAAK,EACT,SAAS,EAAC,2FAA2F,GACrG,CACH;IACD,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CACxC,MAAM,CAAC,CAAC,CAAC,CACP,kBACM,KAAK,EACT,SAAS,EAAC,6DAA6D,GACvE,CACH,CAAC,CAAC,CAAC,CACF,kBAAU,KAAK,EAAE,SAAS,EAAE,SAAS,GAAI,CAC1C;CACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { AgentChatMessage } from "../services/agentService";
2
+ export interface TodoItem {
3
+ id?: string;
4
+ title: string;
5
+ status?: string;
6
+ instructions?: string;
7
+ agentProfileId?: string;
8
+ messageId?: string;
9
+ sourceTitle?: string;
10
+ }
11
+ export declare const extractPartialTodos: (jsonText: string) => any[];
12
+ export declare const extractTodosFromMessages: (messages: AgentChatMessage[]) => TodoItem[];
@@ -0,0 +1,205 @@
1
+ export const extractPartialTodos = (jsonText) => {
2
+ try {
3
+ const parsed = JSON.parse(jsonText);
4
+ const result = Array.isArray(parsed) ? parsed : parsed?.items || [];
5
+ return result;
6
+ }
7
+ catch (e) {
8
+ const items = [];
9
+ const textPattern = /"text"\s*:\s*"([^"]+)"/g;
10
+ const textMatches = [];
11
+ let textMatch;
12
+ while ((textMatch = textPattern.exec(jsonText)) !== null) {
13
+ if (textMatch[1]) {
14
+ textMatches.push({
15
+ text: textMatch[1],
16
+ startIdx: textMatch.index,
17
+ });
18
+ }
19
+ }
20
+ for (const { startIdx } of textMatches) {
21
+ let openBrace = -1;
22
+ for (let i = startIdx - 1; i >= 0; i--) {
23
+ if (jsonText[i] === "{") {
24
+ openBrace = i;
25
+ break;
26
+ }
27
+ if (jsonText[i] === "}")
28
+ break;
29
+ }
30
+ if (openBrace === -1)
31
+ continue;
32
+ let closeBrace = -1;
33
+ let depth = 0;
34
+ for (let i = openBrace; i < jsonText.length; i++) {
35
+ if (jsonText[i] === "{")
36
+ depth++;
37
+ if (jsonText[i] === "}") {
38
+ depth--;
39
+ if (depth === 0) {
40
+ closeBrace = i;
41
+ break;
42
+ }
43
+ }
44
+ }
45
+ const objStr = closeBrace !== -1
46
+ ? jsonText.substring(openBrace, closeBrace + 1)
47
+ : jsonText.substring(openBrace) + "}";
48
+ try {
49
+ const obj = JSON.parse(objStr);
50
+ if (obj.title || obj.text) {
51
+ items.push({
52
+ title: obj.title || obj.text,
53
+ status: obj.status || "pending",
54
+ instructions: obj.instructions || obj.note || undefined,
55
+ agentProfileId: obj.agentProfileId || undefined,
56
+ });
57
+ }
58
+ }
59
+ catch (e) {
60
+ // Skip malformed objects
61
+ }
62
+ }
63
+ const lines = jsonText.split("\n");
64
+ for (let i = lines.length - 1; i >= 0; i--) {
65
+ const partialJson = lines.slice(0, i + 1).join("\n");
66
+ let testJson = partialJson;
67
+ const openBraces = (testJson.match(/\{/g) || []).length;
68
+ const closeBraces = (testJson.match(/\}/g) || []).length;
69
+ const openBrackets = (testJson.match(/\[/g) || []).length;
70
+ const closeBrackets = (testJson.match(/\]/g) || []).length;
71
+ testJson += "]".repeat(openBrackets - closeBrackets);
72
+ testJson += "}".repeat(openBraces - closeBraces);
73
+ try {
74
+ const parsed = JSON.parse(testJson);
75
+ const partialItems = Array.isArray(parsed)
76
+ ? parsed
77
+ : parsed?.items || [];
78
+ if (partialItems.length > items.length) {
79
+ return partialItems;
80
+ }
81
+ }
82
+ catch (e) {
83
+ continue;
84
+ }
85
+ }
86
+ return items;
87
+ }
88
+ };
89
+ export const extractTodosFromMessages = (messages) => {
90
+ const todos = [];
91
+ const fencedTodoToken = "```todo_list";
92
+ const plainTodoToken = "todo_list";
93
+ for (const message of messages) {
94
+ if (message.role !== "assistant" || !message.content)
95
+ continue;
96
+ const content = message.content;
97
+ let cursor = 0;
98
+ while (cursor < content.length) {
99
+ const nextFenced = content.indexOf(fencedTodoToken, cursor);
100
+ const nextPlain = content.indexOf(plainTodoToken, cursor);
101
+ let todoStart = -1;
102
+ let isFenced = false;
103
+ if (nextFenced !== -1 && (nextPlain === -1 || nextFenced < nextPlain)) {
104
+ todoStart = nextFenced;
105
+ isFenced = true;
106
+ }
107
+ else if (nextPlain !== -1) {
108
+ const before = nextPlain > 0 ? content[nextPlain - 1] : "\n";
109
+ if (before === "\n" || before === "\r" || nextPlain === 0) {
110
+ todoStart = nextPlain;
111
+ isFenced = false;
112
+ }
113
+ }
114
+ if (todoStart === -1)
115
+ break;
116
+ try {
117
+ let jsonText = "";
118
+ let isComplete = true;
119
+ if (isFenced) {
120
+ const afterToken = todoStart + fencedTodoToken.length;
121
+ const closePos = content.indexOf("```", afterToken);
122
+ if (closePos === -1) {
123
+ jsonText = content.slice(afterToken).trim();
124
+ isComplete = false;
125
+ cursor = content.length;
126
+ }
127
+ else {
128
+ jsonText = content.slice(afterToken, closePos).trim();
129
+ cursor = closePos + 3;
130
+ }
131
+ }
132
+ else {
133
+ const afterToken = todoStart + plainTodoToken.length;
134
+ const braceStart = content.indexOf("{", afterToken);
135
+ if (braceStart === -1)
136
+ break;
137
+ let depth = 0;
138
+ let braceEnd = -1;
139
+ for (let i = braceStart; i < content.length; i++) {
140
+ if (content[i] === "{")
141
+ depth++;
142
+ if (content[i] === "}") {
143
+ depth--;
144
+ if (depth === 0) {
145
+ braceEnd = i;
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ if (braceEnd === -1) {
151
+ jsonText = content.slice(braceStart).trim();
152
+ isComplete = false;
153
+ cursor = content.length;
154
+ }
155
+ else {
156
+ jsonText = content.slice(braceStart, braceEnd + 1).trim();
157
+ cursor = braceEnd + 1;
158
+ }
159
+ }
160
+ const todoItems = isComplete
161
+ ? (() => {
162
+ try {
163
+ const parsed = JSON.parse(jsonText);
164
+ return Array.isArray(parsed) ? parsed : parsed?.items || [];
165
+ }
166
+ catch (e) {
167
+ return [];
168
+ }
169
+ })()
170
+ : extractPartialTodos(jsonText);
171
+ todoItems.forEach((item) => {
172
+ if (!item)
173
+ return;
174
+ const title = item.title ||
175
+ item.text ||
176
+ item.content ||
177
+ item.label ||
178
+ String(item.task || "");
179
+ if (!title)
180
+ return;
181
+ todos.push({
182
+ id: item.id,
183
+ title,
184
+ status: item.status || "pending",
185
+ instructions: item.instructions || item.note || item.description,
186
+ agentProfileId: item.agentProfileId,
187
+ messageId: message.id,
188
+ sourceTitle: item.sourceTitle,
189
+ });
190
+ });
191
+ }
192
+ catch (e) {
193
+ cursor++;
194
+ continue;
195
+ }
196
+ }
197
+ }
198
+ const todoMap = new Map();
199
+ for (const todo of todos) {
200
+ const key = todo.id || todo.title;
201
+ todoMap.set(key, todo);
202
+ }
203
+ return Array.from(todoMap.values());
204
+ };
205
+ //# sourceMappingURL=agentTodoExtraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentTodoExtraction.js","sourceRoot":"","sources":["../../../src/editor/ai/agentTodoExtraction.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,7 @@ export type EditContextType = {
70
70
  field: FieldDescriptor;
71
71
  value?: any;
72
72
  rawValue?: string | null;
73
+ forceMode?: EditorMode;
73
74
  refresh?: "none" | "immediate" | "delayed" | "waitForQuietPeriod";
74
75
  }) => Promise<void>;
75
76
  updateRenderingParameters: (componentId: string, parameters: Record<string, string | null>) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"editContext.js","sourceRoot":"","sources":["../../../src/editor/client/editContext.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAGZ,UAAU,EACV,SAAS,EACT,MAAM,GACP,MAAM,OAAO,CAAC;AA6mBf,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAA8B,SAAS,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,QAAQ,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAE5D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,UAAU,CAAC;AACpB,CAAC;AAyCD,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAE3C,SAAS,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AAEpE,mDAAmD;AACnD,MAAM,UAAU,uBAAuB;IACrC,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,UAAU,CAAC;AACpB,CAAC;AASD,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAE3C,SAAS,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,QAAQ,CAAC"}
1
+ {"version":3,"file":"editContext.js","sourceRoot":"","sources":["../../../src/editor/client/editContext.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,EAAE,EAGZ,UAAU,EACV,SAAS,EACT,MAAM,GACP,MAAM,OAAO,CAAC;AA8mBf,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAA8B,SAAS,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,QAAQ,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAE5D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,UAAU,CAAC;AACpB,CAAC;AAyCD,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAE3C,SAAS,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AAEpE,mDAAmD;AACnD,MAAM,UAAU,uBAAuB;IACrC,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,UAAU,CAAC;AACpB,CAAC;AASD,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAE3C,SAAS,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,QAAQ,CAAC"}
@@ -8,6 +8,7 @@ import { EditorMode } from "./editContext";
8
8
  export declare function cleanupPendingSuggestedEditOperations(suggestedEdit: SuggestedEdit, user?: {
9
9
  name: string;
10
10
  }): void;
11
+ export declare function waitForPendingSuggestedEditSave(suggestedEdit: SuggestedEdit): Promise<void>;
11
12
  export declare function getOperationsContext(state: {
12
13
  page?: Page;
13
14
  item?: FullItem;
@@ -44,10 +45,11 @@ export declare function getOperationsContext(state: {
44
45
  lockItems: (items: ItemDescriptor[]) => Promise<void>;
45
46
  unlockItems: (items: ItemDescriptor[]) => Promise<void>;
46
47
  executeWorkflowCommand: (item: ItemDescriptor, commandId: string) => Promise<void>;
47
- editField: ({ field, value, rawValue, refresh, }: {
48
+ editField: ({ field, value, rawValue, forceMode, refresh, }: {
48
49
  field: FieldDescriptor;
49
50
  value?: string;
50
51
  rawValue?: string | null;
52
+ forceMode?: EditorMode;
51
53
  refresh?: "none" | "immediate" | "delayed" | "waitForQuietPeriod";
52
54
  }) => Promise<void>;
53
55
  updateRenderingParameters: (componentId: string, parameters: Record<string, string | null>) => Promise<void>;
@@ -40,6 +40,23 @@ export function cleanupPendingSuggestedEditOperations(suggestedEdit, user) {
40
40
  pendingSuggestedEdits.delete(pendingFieldKey);
41
41
  pendingSuggestedEditSaves.delete(saveKey);
42
42
  }
43
+ export async function waitForPendingSuggestedEditSave(suggestedEdit) {
44
+ const saveKey = `${suggestedEdit.itemId}:${suggestedEdit.mainItemLanguage}:${suggestedEdit.mainItemVersion}:${suggestedEdit.fieldId}`;
45
+ const pendingSave = pendingSuggestedEditSaves.get(saveKey);
46
+ if (!pendingSave)
47
+ return;
48
+ try {
49
+ await pendingSave;
50
+ }
51
+ catch (error) {
52
+ console.warn("Pending suggested edit save failed before apply:", error);
53
+ }
54
+ finally {
55
+ if (pendingSuggestedEditSaves.get(saveKey) === pendingSave) {
56
+ pendingSuggestedEditSaves.delete(saveKey);
57
+ }
58
+ }
59
+ }
43
60
  export function getOperationsContext(state, ui) {
44
61
  const [editOperationExecuted, setEditOperationExecuted] = useState();
45
62
  const [executingEditOperations, setExecutingEditOperations] = useState([]);
@@ -267,8 +284,9 @@ export function getOperationsContext(state, ui) {
267
284
  }
268
285
  }, [itemsRepository, executeOp]);
269
286
  const lastEditField = useRef(undefined);
270
- const editField = useCallback(async ({ field, value, rawValue, refresh = "immediate", }) => {
271
- if (stateRef.current.mode === "suggestions" && stateRef.current.page) {
287
+ const editField = useCallback(async ({ field, value, rawValue, forceMode, refresh = "immediate", }) => {
288
+ const effectiveMode = forceMode ?? stateRef.current.mode;
289
+ if (effectiveMode === "suggestions" && stateRef.current.page) {
272
290
  // Create a unique key for this field to track pending saves
273
291
  const fieldKey = `${field.item.id}:${field.item.language}:${field.item.version}:${field.fieldId}`;
274
292
  // If there's already a save in progress for this field, await it first