@runfusion/fusion 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +6 -0
  2. package/dist/bin.js +18646 -15669
  3. package/dist/client/assets/AgentDetailView-Cv-vgOj3.js +18 -0
  4. package/dist/client/assets/{AgentsView-BkB9FiMT.js → AgentsView-D6Zi5zfP.js} +4 -4
  5. package/dist/client/assets/ChatView-CAHjY9uO.js +1 -0
  6. package/dist/client/assets/{DevServerView-BkvtjZBa.js → DevServerView--_WBvIDQ.js} +1 -1
  7. package/dist/client/assets/{DirectoryPicker-BK-KbnhP.js → DirectoryPicker-xedtR-Rd.js} +1 -1
  8. package/dist/client/assets/{DocumentsView-BEg1CQAk.js → DocumentsView-Bg2oaZks.js} +1 -1
  9. package/dist/client/assets/{EvalsView-Berf9bQm.js → EvalsView-B3uOCXfr.js} +1 -1
  10. package/dist/client/assets/{ExperimentalAgentOnboardingModal-jcInE50G.js → ExperimentalAgentOnboardingModal-Bx6yXVS5.js} +1 -1
  11. package/dist/client/assets/{InsightsView-BX5bSF1J.js → InsightsView-Q1zvtF4F.js} +1 -1
  12. package/dist/client/assets/MemoryView-xcN_eouf.js +2 -0
  13. package/dist/client/assets/MemoryView-zaXewZzi.css +1 -0
  14. package/dist/client/assets/{NodesView-DLUOBLf6.js → NodesView-RxXg58_Q.js} +1 -1
  15. package/dist/client/assets/{PiExtensionsManager-COlJf0Kx.js → PiExtensionsManager-Cc8aAZXg.js} +2 -2
  16. package/dist/client/assets/PluginManager-BEkyBajl.js +1 -0
  17. package/dist/client/assets/{ResearchView-BzCcDAS4.css → ResearchView-BEI4ZSGs.css} +1 -1
  18. package/dist/client/assets/ResearchView-CERNf7sJ.js +1 -0
  19. package/dist/client/assets/{SettingsModal-yRqM4DV8.js → SettingsModal-B1r0yASu.js} +1 -1
  20. package/dist/client/assets/SettingsModal-BLsac7CJ.js +31 -0
  21. package/dist/client/assets/SettingsModal-Cis-4Lot.css +1 -0
  22. package/dist/client/assets/{SetupWizardModal-uUZk3TKT.js → SetupWizardModal-D1q548_L.js} +1 -1
  23. package/dist/client/assets/{SkillsView-CP8JX0P_.js → SkillsView-ClLM6u6p.js} +1 -1
  24. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +1 -0
  25. package/dist/client/assets/StashRecoveryView-ze0pEZ5U.js +1 -0
  26. package/dist/client/assets/{TodoView-DCRIkDZ-.js → TodoView-CTmIfy2M.js} +1 -1
  27. package/dist/client/assets/{dashboard-view-lR7YYmSC.js → dashboard-view-4xAN3yO5.js} +2 -2
  28. package/dist/client/assets/{folder-open-DHjELt8-.js → folder-open-BZuKESeq.js} +1 -1
  29. package/dist/client/assets/index-Bdw6llW6.js +692 -0
  30. package/dist/client/assets/index-CZGlyJuS.css +1 -0
  31. package/dist/client/assets/{star-DYesq1AV.js → star-D75YKEq-.js} +1 -1
  32. package/dist/client/assets/{upload-DTWF3Db5.js → upload-BYYTgWFj.js} +1 -1
  33. package/dist/client/assets/{users--syrel4l.js → users-RS90Aii3.js} +1 -1
  34. package/dist/client/index.html +2 -2
  35. package/dist/client/version.json +1 -1
  36. package/dist/droid-cli/package.json +1 -1
  37. package/dist/extension.js +5640 -3618
  38. package/dist/pi-claude-cli/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-cli-printing-press/manifest.json +6 -0
  40. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +26 -0
  41. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/manifest.test.ts +20 -0
  42. package/dist/plugins/fusion-plugin-cli-printing-press/src/index.ts +14 -0
  43. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +9 -11
  44. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +30 -0
  46. package/dist/plugins/fusion-plugin-dependency-graph/package.json +3 -28
  47. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +899 -895
  48. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +68 -71
  50. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +47 -50
  52. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  53. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +155 -109
  54. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  55. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  56. package/dist/plugins/fusion-plugin-reports/src/index.ts +49 -3
  57. package/dist/plugins/fusion-plugin-reports/src/report-schema.ts +38 -0
  58. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-schema.test.ts +66 -0
  59. package/dist/plugins/fusion-plugin-reports/src/store/__tests__/report-store.test.ts +177 -0
  60. package/dist/plugins/fusion-plugin-reports/src/store/report-store.ts +341 -0
  61. package/dist/plugins/fusion-plugin-reports/src/store/report-types.ts +77 -0
  62. package/dist/plugins/fusion-plugin-roadmap/{src/dashboard/RoadmapsView.css → bundled.css} +13 -219
  63. package/dist/plugins/fusion-plugin-roadmap/bundled.js +29535 -0
  64. package/dist/plugins/fusion-plugin-roadmap/package.json +4 -41
  65. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  66. package/package.json +2 -3
  67. package/dist/client/assets/AgentDetailView-gy_5SUj2.js +0 -18
  68. package/dist/client/assets/ChatView-B_-B8fqu.js +0 -1
  69. package/dist/client/assets/MemoryView-CKElJY_3.js +0 -2
  70. package/dist/client/assets/MemoryView-DiajLXby.css +0 -1
  71. package/dist/client/assets/PluginManager-CfW55BF4.js +0 -1
  72. package/dist/client/assets/ResearchView-B256Lr8I.js +0 -1
  73. package/dist/client/assets/SettingsModal-BeA_nQtW.js +0 -31
  74. package/dist/client/assets/SettingsModal-DzsLquBu.css +0 -1
  75. package/dist/client/assets/index-CQyVRLOb.js +0 -692
  76. package/dist/client/assets/index-CxA2Nn0_.css +0 -1
  77. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.css +0 -58
  78. package/dist/plugins/fusion-plugin-dependency-graph/src/DependencyGraph.tsx +0 -301
  79. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphHighlight.css +0 -27
  80. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.css +0 -157
  81. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphTaskNode.tsx +0 -126
  82. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.css +0 -35
  83. package/dist/plugins/fusion-plugin-dependency-graph/src/GraphToolbar.tsx +0 -36
  84. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.highlighting.test.tsx +0 -112
  85. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.persistence.test.tsx +0 -115
  86. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/DependencyGraph.test.tsx +0 -128
  87. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.drag.test.tsx +0 -82
  88. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphTaskNode.test.tsx +0 -307
  89. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/GraphToolbar.test.tsx +0 -60
  90. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/edges.test.tsx +0 -75
  91. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filtering.test.tsx +0 -62
  92. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/filters.test.ts +0 -78
  93. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/graphPositionStorage.test.ts +0 -95
  94. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/host-integration.test.ts +0 -74
  95. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/index.test.ts +0 -58
  96. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/interactions.test.tsx +0 -121
  97. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/layout.test.ts +0 -70
  98. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/persistence.test.tsx +0 -89
  99. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphData.test.ts +0 -86
  100. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphInteraction.test.ts +0 -167
  101. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useGraphPositions.test.ts +0 -66
  102. package/dist/plugins/fusion-plugin-dependency-graph/src/__tests__/useNodeDrag.test.ts +0 -81
  103. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-interop.d.ts +0 -35
  104. package/dist/plugins/fusion-plugin-dependency-graph/src/dashboard-view.tsx +0 -19
  105. package/dist/plugins/fusion-plugin-dependency-graph/src/edges.tsx +0 -70
  106. package/dist/plugins/fusion-plugin-dependency-graph/src/filters.ts +0 -8
  107. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/__tests__/useDependencyChain.test.ts +0 -53
  108. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useDependencyChain.ts +0 -60
  109. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useGraphPositions.ts +0 -45
  110. package/dist/plugins/fusion-plugin-dependency-graph/src/hooks/useNodeDrag.ts +0 -114
  111. package/dist/plugins/fusion-plugin-dependency-graph/src/index.ts +0 -24
  112. package/dist/plugins/fusion-plugin-dependency-graph/src/layout.ts +0 -91
  113. package/dist/plugins/fusion-plugin-dependency-graph/src/styles/drag.css +0 -15
  114. package/dist/plugins/fusion-plugin-dependency-graph/src/types.ts +0 -21
  115. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphData.ts +0 -17
  116. package/dist/plugins/fusion-plugin-dependency-graph/src/useGraphInteraction.ts +0 -292
  117. package/dist/plugins/fusion-plugin-dependency-graph/src/utils/graphPositionStorage.ts +0 -65
  118. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/api-client.test.ts +0 -101
  119. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/index.test.ts +0 -92
  120. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-routes.test.ts +0 -48
  121. package/dist/plugins/fusion-plugin-roadmap/src/__tests__/roadmap-suggestions.test.ts +0 -31
  122. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/RoadmapsView.tsx +0 -2559
  123. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/RoadmapsView.test.tsx +0 -1144
  124. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/__tests__/useRoadmaps.test.ts +0 -1756
  125. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/api.ts +0 -70
  126. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/test-setup.ts +0 -7
  127. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/types.ts +0 -1
  128. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useConfirm.ts +0 -8
  129. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useRoadmaps.ts +0 -1188
  130. package/dist/plugins/fusion-plugin-roadmap/src/dashboard/useViewportMode.ts +0 -20
  131. package/dist/plugins/fusion-plugin-roadmap/src/dashboard-view.tsx +0 -6
  132. package/dist/plugins/fusion-plugin-roadmap/src/index.ts +0 -74
  133. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-routes.ts +0 -1
  134. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-schema.ts +0 -41
  135. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.d.ts +0 -15
  136. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-suggestions.ts +0 -15
  137. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts +0 -283
  138. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.d.ts.map +0 -1
  139. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js +0 -21
  140. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.js.map +0 -1
  141. package/dist/plugins/fusion-plugin-roadmap/src/roadmap-types.ts +0 -310
  142. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts +0 -5
  143. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.d.ts.map +0 -1
  144. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js +0 -361
  145. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.js.map +0 -1
  146. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-routes.ts +0 -408
  147. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts +0 -68
  148. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.d.ts.map +0 -1
  149. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js +0 -300
  150. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.js.map +0 -1
  151. package/dist/plugins/fusion-plugin-roadmap/src/routes/roadmap-suggestions.ts +0 -381
  152. package/dist/plugins/fusion-plugin-roadmap/src/server/index.d.ts +0 -3
  153. package/dist/plugins/fusion-plugin-roadmap/src/server/index.ts +0 -1
  154. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-handoff.test.ts +0 -445
  155. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-ordering.test.ts +0 -334
  156. package/dist/plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts +0 -1318
  157. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-handoff.ts +0 -163
  158. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts +0 -37
  159. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.d.ts.map +0 -1
  160. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js +0 -188
  161. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.js.map +0 -1
  162. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-ordering.ts +0 -311
  163. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts +0 -299
  164. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.d.ts.map +0 -1
  165. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js +0 -765
  166. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.js.map +0 -1
  167. package/dist/plugins/fusion-plugin-roadmap/src/store/roadmap-store.ts +0 -1001
@@ -1,300 +0,0 @@
1
- let injectedCreateAiSession;
2
- export const MILESTONE_SUGGESTION_SYSTEM_PROMPT = `You are a milestone planning assistant for a product roadmap system.
3
-
4
- Your job is to suggest logical milestones that would help achieve a user's roadmap goal.
5
-
6
- ## Guidelines
7
-
8
- 1. **Think about phases**: Break the goal into logical phases
9
- 2. **Use clear titles**: Milestone titles should be concise and descriptive
10
- 3. **Add context**: Include a brief description explaining what this milestone encompasses
11
- 4. **Order matters**: List milestones in the order they should be completed
12
- 5. **Realistic scope**: Each milestone should be achievable in 2-4 weeks
13
-
14
- ## Output Format
15
-
16
- Respond with ONLY a valid JSON array of milestone suggestions.`;
17
- const MAX_GOAL_PROMPT_LENGTH = 4000;
18
- export const SUGGESTION_TIMEOUT_MS = 120_000;
19
- const DEFAULT_SUGGESTION_COUNT = 5;
20
- const MAX_SUGGESTION_COUNT = 10;
21
- const MIN_SUGGESTION_COUNT = 1;
22
- const MAX_PARSE_RETRIES = 1;
23
- export function validateSuggestionInput(input) {
24
- if (!input || typeof input !== "object") {
25
- throw new ValidationError("Request body must be an object");
26
- }
27
- const { goalPrompt, count } = input;
28
- if (typeof goalPrompt !== "string" || !goalPrompt.trim()) {
29
- throw new ValidationError("goalPrompt is required and must be a non-empty string");
30
- }
31
- if (goalPrompt.length > MAX_GOAL_PROMPT_LENGTH) {
32
- throw new ValidationError(`goalPrompt exceeds maximum length of ${MAX_GOAL_PROMPT_LENGTH} characters`);
33
- }
34
- if (count !== undefined) {
35
- if (typeof count !== "number" || !Number.isInteger(count))
36
- throw new ValidationError("count must be an integer");
37
- if (count < MIN_SUGGESTION_COUNT || count > MAX_SUGGESTION_COUNT) {
38
- throw new ValidationError(`count must be between ${MIN_SUGGESTION_COUNT} and ${MAX_SUGGESTION_COUNT}`);
39
- }
40
- }
41
- }
42
- function extractJsonCandidate(text) {
43
- if (!text || !text.trim())
44
- return null;
45
- const codeBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
46
- const source = codeBlockMatch?.[1]?.trim() || text.trim();
47
- const startIndex = source.indexOf("[");
48
- if (startIndex < 0)
49
- return null;
50
- let depth = 0;
51
- let inString = false;
52
- let escaped = false;
53
- for (let index = startIndex; index < source.length; index++) {
54
- const char = source[index];
55
- if (inString) {
56
- if (escaped) {
57
- escaped = false;
58
- }
59
- else if (char === "\\") {
60
- escaped = true;
61
- }
62
- else if (char === '"') {
63
- inString = false;
64
- }
65
- continue;
66
- }
67
- if (char === '"') {
68
- inString = true;
69
- continue;
70
- }
71
- if (char === "[")
72
- depth++;
73
- if (char === "]") {
74
- depth--;
75
- if (depth === 0) {
76
- return source.slice(startIndex, index + 1).trim();
77
- }
78
- }
79
- }
80
- return source.slice(startIndex).trim();
81
- }
82
- function repairJson(text) {
83
- let repaired = text.replace(/,\s*([}\]])/g, "$1");
84
- let depthBraces = 0;
85
- let depthBrackets = 0;
86
- for (const ch of repaired) {
87
- if (ch === "{")
88
- depthBraces++;
89
- if (ch === "}")
90
- depthBraces--;
91
- if (ch === "[")
92
- depthBrackets++;
93
- if (ch === "]")
94
- depthBrackets--;
95
- }
96
- repaired += "]".repeat(Math.max(0, depthBrackets));
97
- repaired += "}".repeat(Math.max(0, depthBraces));
98
- return repaired;
99
- }
100
- function parseMilestoneSuggestions(text) {
101
- const candidate = extractJsonCandidate(text);
102
- if (!candidate)
103
- throw new ParseError("AI returned no valid JSON. Please try again.");
104
- let parsed;
105
- try {
106
- parsed = JSON.parse(candidate);
107
- }
108
- catch {
109
- parsed = JSON.parse(repairJson(candidate));
110
- }
111
- if (!Array.isArray(parsed)) {
112
- throw new ParseError("AI response must be a JSON array of milestone suggestions");
113
- }
114
- const suggestions = [];
115
- for (const item of parsed) {
116
- if (!item || typeof item !== "object")
117
- continue;
118
- const row = item;
119
- if (typeof row.title !== "string" || !row.title.trim())
120
- continue;
121
- suggestions.push({
122
- title: row.title.trim(),
123
- description: typeof row.description === "string" && row.description.trim() ? row.description.trim() : undefined,
124
- });
125
- }
126
- if (suggestions.length === 0)
127
- throw new ParseError("AI returned no valid milestone suggestions");
128
- return suggestions;
129
- }
130
- function pickFactory(explicit) {
131
- return explicit ?? injectedCreateAiSession;
132
- }
133
- async function runPrompt(createAiSession, options, prompt) {
134
- const agent = await createAiSession(options);
135
- await agent.session.prompt(prompt);
136
- const lastMessage = agent.session.state.messages
137
- .filter((m) => m.role === "assistant")
138
- .pop();
139
- let text = "";
140
- if (lastMessage?.content) {
141
- if (typeof lastMessage.content === "string")
142
- text = lastMessage.content;
143
- else {
144
- text = lastMessage.content
145
- .filter((c) => c.type === "text")
146
- .map((c) => c.text)
147
- .join("");
148
- }
149
- }
150
- return { text, dispose: agent.session.dispose };
151
- }
152
- export async function generateMilestoneSuggestions(goalPrompt, count = DEFAULT_SUGGESTION_COUNT, rootDir, modelProvider, modelId, createAiSession) {
153
- const factory = pickFactory(createAiSession);
154
- if (!factory)
155
- throw new ServiceUnavailableError("AI service is not available");
156
- if (!rootDir)
157
- throw new Error("rootDir is required for AI-powered suggestion generation");
158
- const result = await Promise.race([
159
- (async () => {
160
- let dispose;
161
- try {
162
- let response = await runPrompt(factory, {
163
- cwd: rootDir,
164
- systemPrompt: MILESTONE_SUGGESTION_SYSTEM_PROMPT,
165
- tools: "readonly",
166
- ...(modelProvider && modelId ? { defaultProvider: modelProvider, defaultModelId: modelId } : {}),
167
- }, `Please suggest ${count} milestones for the following roadmap goal:\n\n${goalPrompt.trim()}`);
168
- dispose = response.dispose;
169
- let suggestions;
170
- let lastError;
171
- for (let attempt = 0; attempt <= MAX_PARSE_RETRIES; attempt++) {
172
- try {
173
- suggestions = parseMilestoneSuggestions(response.text);
174
- break;
175
- }
176
- catch (error) {
177
- lastError = error instanceof Error ? error : new Error(String(error));
178
- if (attempt === MAX_PARSE_RETRIES)
179
- break;
180
- response = await runPrompt(factory, {
181
- cwd: rootDir,
182
- systemPrompt: MILESTONE_SUGGESTION_SYSTEM_PROMPT,
183
- tools: "readonly",
184
- ...(modelProvider && modelId ? { defaultProvider: modelProvider, defaultModelId: modelId } : {}),
185
- }, "Your previous response could not be parsed as JSON. Respond with only a JSON array.");
186
- dispose = response.dispose;
187
- }
188
- }
189
- if (!suggestions) {
190
- throw new ParseError(`Failed to parse AI response after ${MAX_PARSE_RETRIES + 1} attempts: ${lastError?.message ?? "Unknown error"}`);
191
- }
192
- return suggestions.slice(0, count);
193
- }
194
- finally {
195
- dispose?.();
196
- }
197
- })(),
198
- new Promise((_, reject) => globalThis.setTimeout(() => reject(new ServiceUnavailableError("AI suggestion generation timed out. Please try again.")), SUGGESTION_TIMEOUT_MS)),
199
- ]);
200
- return result;
201
- }
202
- export const FEATURE_SUGGESTION_SYSTEM_PROMPT = `You are a feature planning assistant for a product roadmap system.`;
203
- const MAX_FEATURE_PROMPT_LENGTH = 2000;
204
- export function validateFeatureSuggestionInput(input) {
205
- if (!input || typeof input !== "object" || Array.isArray(input))
206
- throw new ValidationError("Request body must be an object");
207
- const { prompt, count } = input;
208
- if (prompt !== undefined) {
209
- if (typeof prompt !== "string")
210
- throw new ValidationError("prompt must be a string");
211
- if (prompt.length > MAX_FEATURE_PROMPT_LENGTH)
212
- throw new ValidationError(`prompt exceeds maximum length of ${MAX_FEATURE_PROMPT_LENGTH} characters`);
213
- }
214
- if (count !== undefined) {
215
- if (typeof count !== "number" || !Number.isInteger(count))
216
- throw new ValidationError("count must be an integer");
217
- if (count < MIN_SUGGESTION_COUNT || count > MAX_SUGGESTION_COUNT) {
218
- throw new ValidationError(`count must be between ${MIN_SUGGESTION_COUNT} and ${MAX_SUGGESTION_COUNT}`);
219
- }
220
- }
221
- }
222
- function buildMilestoneContextString(context) {
223
- const lines = [];
224
- lines.push(`Roadmap: ${context.roadmapTitle}`);
225
- if (context.roadmapDescription)
226
- lines.push(`Description: ${context.roadmapDescription}`);
227
- lines.push("", `Milestone: ${context.milestoneTitle}`);
228
- if (context.milestoneDescription)
229
- lines.push(`Description: ${context.milestoneDescription}`);
230
- if (context.existingFeatureTitles.length > 0) {
231
- lines.push("", "Existing features in this milestone:");
232
- for (const title of context.existingFeatureTitles)
233
- lines.push(` - ${title}`);
234
- }
235
- return lines.join("\n");
236
- }
237
- function parseFeatureSuggestions(text) {
238
- return parseMilestoneSuggestions(text);
239
- }
240
- export async function generateFeatureSuggestions(context, count = DEFAULT_SUGGESTION_COUNT, prompt, rootDir, modelProvider, modelId, createAiSession) {
241
- const factory = pickFactory(createAiSession);
242
- if (!factory)
243
- throw new ServiceUnavailableError("AI service is not available");
244
- if (!rootDir)
245
- throw new Error("rootDir is required for AI-powered suggestion generation");
246
- const systemPrompt = `${FEATURE_SUGGESTION_SYSTEM_PROMPT}\n\n${buildMilestoneContextString(context)}`;
247
- const userMessage = prompt?.trim()
248
- ? `Please suggest ${count} features for the milestone described above.\n\nAdditional guidance:\n${prompt.trim()}`
249
- : `Please suggest ${count} features for the milestone described above.`;
250
- const result = await Promise.race([
251
- (async () => {
252
- const { text, dispose } = await runPrompt(factory, {
253
- cwd: rootDir,
254
- systemPrompt,
255
- tools: "readonly",
256
- ...(modelProvider && modelId ? { defaultProvider: modelProvider, defaultModelId: modelId } : {}),
257
- }, userMessage);
258
- try {
259
- return parseFeatureSuggestions(text).slice(0, count);
260
- }
261
- finally {
262
- dispose?.();
263
- }
264
- })(),
265
- new Promise((_, reject) => globalThis.setTimeout(() => reject(new ServiceUnavailableError("AI suggestion generation timed out. Please try again.")), SUGGESTION_TIMEOUT_MS)),
266
- ]);
267
- return result;
268
- }
269
- export class ValidationError extends Error {
270
- constructor(message) {
271
- super(message);
272
- this.name = "ValidationError";
273
- }
274
- }
275
- export class ParseError extends Error {
276
- constructor(message) {
277
- super(message);
278
- this.name = "ParseError";
279
- }
280
- }
281
- export class ServiceUnavailableError extends Error {
282
- constructor(message) {
283
- super(message);
284
- this.name = "ServiceUnavailableError";
285
- }
286
- }
287
- export function __resetSuggestionState() {
288
- injectedCreateAiSession = undefined;
289
- }
290
- export function __setCreateFnAgent(mock) {
291
- if (!mock) {
292
- injectedCreateAiSession = undefined;
293
- return;
294
- }
295
- injectedCreateAiSession = async (options) => mock(options);
296
- }
297
- export function __setCreateAiSessionFactory(mock) {
298
- injectedCreateAiSession = mock;
299
- }
300
- //# sourceMappingURL=roadmap-suggestions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roadmap-suggestions.js","sourceRoot":"","sources":["roadmap-suggestions.ts"],"names":[],"mappings":"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"}