@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,163 +0,0 @@
1
- /**
2
- * Pure mapping helpers for converting roadmap hierarchy data into mission/task planning handoffs.
3
- *
4
- * These helpers are read-only transformations that preserve source lineage and deterministic
5
- * ordering without coupling to MissionStore or task persistence.
6
- *
7
- * @module roadmap-handoff
8
- */
9
-
10
- import type {
11
- Roadmap,
12
- RoadmapMilestone,
13
- RoadmapFeature,
14
- RoadmapWithHierarchy,
15
- RoadmapFeatureTaskPlanningHandoff,
16
- RoadmapMissionPlanningHandoff,
17
- RoadmapFeatureSourceRef,
18
- RoadmapMissionPlanningMilestoneHandoff,
19
- } from "../roadmap-types.js";
20
-
21
- import {
22
- normalizeRoadmapMilestoneOrder,
23
- normalizeRoadmapFeatureOrder,
24
- } from "./roadmap-ordering.js";
25
-
26
- /**
27
- * Build a source reference for a roadmap feature.
28
- *
29
- * Includes roadmap and milestone context for downstream planning prompts.
30
- */
31
- function buildFeatureSourceRef(
32
- roadmap: Roadmap,
33
- milestone: RoadmapMilestone,
34
- feature: RoadmapFeature,
35
- ): RoadmapFeatureSourceRef {
36
- return {
37
- roadmapId: roadmap.id,
38
- milestoneId: milestone.id,
39
- featureId: feature.id,
40
- roadmapTitle: roadmap.title,
41
- milestoneTitle: milestone.title,
42
- milestoneOrderIndex: milestone.orderIndex,
43
- featureOrderIndex: feature.orderIndex,
44
- };
45
- }
46
-
47
- /**
48
- * Convert a single roadmap feature into a task planning handoff payload.
49
- *
50
- * The handoff preserves source lineage for traceability and deterministic ordering
51
- * for consistent downstream processing.
52
- */
53
- export function mapFeatureToTaskHandoff(
54
- roadmap: Roadmap,
55
- milestone: RoadmapMilestone,
56
- feature: RoadmapFeature,
57
- ): RoadmapFeatureTaskPlanningHandoff {
58
- return {
59
- source: buildFeatureSourceRef(roadmap, milestone, feature),
60
- title: feature.title,
61
- description: feature.description,
62
- };
63
- }
64
-
65
- /**
66
- * Convert a full roadmap hierarchy into a mission planning handoff payload.
67
- *
68
- * The handoff preserves deterministic ordering by normalizing milestone and feature
69
- * order indices before building the payload.
70
- *
71
- * @param roadmap - The roadmap to convert
72
- * @param milestones - Ordered milestones (will be re-normalized for deterministic output)
73
- * @param featuresByMilestoneId - Features grouped by milestone ID
74
- * @returns Mission planning handoff payload
75
- */
76
- export function mapRoadmapToMissionHandoff(
77
- roadmap: Roadmap,
78
- milestones: readonly RoadmapMilestone[],
79
- featuresByMilestoneId: ReadonlyMap<string, readonly RoadmapFeature[]>,
80
- ): RoadmapMissionPlanningHandoff {
81
- // Normalize milestone ordering deterministically
82
- const normalizedMilestones = normalizeRoadmapMilestoneOrder(milestones);
83
-
84
- const milestoneHandoffs: RoadmapMissionPlanningMilestoneHandoff[] = normalizedMilestones.map((milestone) => {
85
- // Get features for this milestone and normalize their order
86
- const rawFeatures = featuresByMilestoneId.get(milestone.id) ?? [];
87
- const normalizedFeatures = normalizeRoadmapFeatureOrder(rawFeatures);
88
-
89
- return {
90
- sourceMilestoneId: milestone.id,
91
- title: milestone.title,
92
- description: milestone.description,
93
- orderIndex: milestone.orderIndex,
94
- features: normalizedFeatures.map((feature) => ({
95
- sourceFeatureId: feature.id,
96
- title: feature.title,
97
- description: feature.description,
98
- orderIndex: feature.orderIndex,
99
- })),
100
- };
101
- });
102
-
103
- return {
104
- sourceRoadmapId: roadmap.id,
105
- title: roadmap.title,
106
- description: roadmap.description,
107
- milestones: milestoneHandoffs,
108
- };
109
- }
110
-
111
- /**
112
- * Convert a roadmap with full hierarchy into a mission planning handoff payload.
113
- *
114
- * Convenience overload that accepts the composite RoadmapWithHierarchy type.
115
- */
116
- export function mapRoadmapWithHierarchyToMissionHandoff(
117
- roadmapWithHierarchy: RoadmapWithHierarchy,
118
- ): RoadmapMissionPlanningHandoff {
119
- // Build features by milestone ID map
120
- const featuresByMilestoneId = new Map<string, readonly RoadmapFeature[]>();
121
- for (const milestone of roadmapWithHierarchy.milestones) {
122
- featuresByMilestoneId.set(milestone.id, milestone.features);
123
- }
124
-
125
- return mapRoadmapToMissionHandoff(
126
- roadmapWithHierarchy,
127
- roadmapWithHierarchy.milestones,
128
- featuresByMilestoneId,
129
- );
130
- }
131
-
132
- /**
133
- * Convert all features from a roadmap into task planning handoff payloads.
134
- *
135
- * Flattens the roadmap hierarchy into individual feature handoffs, each preserving
136
- * source lineage and deterministic ordering.
137
- *
138
- * @param roadmap - The parent roadmap
139
- * @param milestones - Ordered milestones (will be re-normalized for deterministic output)
140
- * @param featuresByMilestoneId - Features grouped by milestone ID
141
- * @returns Array of feature task planning handoffs, ordered by milestone order then feature order
142
- */
143
- export function mapAllFeaturesToTaskHandoffs(
144
- roadmap: Roadmap,
145
- milestones: readonly RoadmapMilestone[],
146
- featuresByMilestoneId: ReadonlyMap<string, readonly RoadmapFeature[]>,
147
- ): RoadmapFeatureTaskPlanningHandoff[] {
148
- // Normalize milestone ordering deterministically
149
- const normalizedMilestones = normalizeRoadmapMilestoneOrder(milestones);
150
-
151
- const handoffs: RoadmapFeatureTaskPlanningHandoff[] = [];
152
-
153
- for (const milestone of normalizedMilestones) {
154
- const rawFeatures = featuresByMilestoneId.get(milestone.id) ?? [];
155
- const normalizedFeatures = normalizeRoadmapFeatureOrder(rawFeatures);
156
-
157
- for (const feature of normalizedFeatures) {
158
- handoffs.push(mapFeatureToTaskHandoff(roadmap, milestone, feature));
159
- }
160
- }
161
-
162
- return handoffs;
163
- }
@@ -1,37 +0,0 @@
1
- import type { RoadmapFeature, RoadmapFeatureMoveInput, RoadmapFeatureMoveResult, RoadmapFeatureReorderInput, RoadmapMilestone, RoadmapMilestoneReorderInput } from "../roadmap-types.js";
2
- /**
3
- * Repairs milestone ordering for a single roadmap scope.
4
- *
5
- * Deterministic repair order is `orderIndex ASC`, `createdAt ASC`, then `id ASC`.
6
- */
7
- export declare function normalizeRoadmapMilestoneOrder(milestones: readonly RoadmapMilestone[]): RoadmapMilestone[];
8
- /**
9
- * Applies an explicit milestone reorder for a single roadmap scope.
10
- *
11
- * The caller must provide the complete milestone ID set exactly once. Partial
12
- * or duplicate lists are rejected to keep reorders deterministic.
13
- */
14
- export declare function applyRoadmapMilestoneReorder(milestones: readonly RoadmapMilestone[], input: RoadmapMilestoneReorderInput): RoadmapMilestone[];
15
- /**
16
- * Repairs feature ordering for a single milestone scope.
17
- *
18
- * Deterministic repair order is `orderIndex ASC`, `createdAt ASC`, then `id ASC`.
19
- */
20
- export declare function normalizeRoadmapFeatureOrder(features: readonly RoadmapFeature[]): RoadmapFeature[];
21
- /**
22
- * Applies an explicit feature reorder for a single milestone scope.
23
- *
24
- * The caller must provide the complete feature ID set exactly once. Partial or
25
- * duplicate lists are rejected to keep reorder behavior deterministic.
26
- */
27
- export declare function applyRoadmapFeatureReorder(features: readonly RoadmapFeature[], input: RoadmapFeatureReorderInput): RoadmapFeature[];
28
- /**
29
- * Moves a feature within the affected milestone scope and deterministically
30
- * normalizes both source and destination order.
31
- *
32
- * For cross-milestone moves, pass the combined feature list from the source and
33
- * target milestones. For within-milestone moves, pass the current milestone's
34
- * feature list. `targetOrderIndex` is clamped into the destination range.
35
- */
36
- export declare function moveRoadmapFeature(features: readonly RoadmapFeature[], input: RoadmapFeatureMoveInput): RoadmapFeatureMoveResult;
37
- //# sourceMappingURL=roadmap-ordering.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roadmap-ordering.d.ts","sourceRoot":"","sources":["roadmap-ordering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,gBAAgB,EAChB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAC;AA8I7B;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,SAAS,gBAAgB,EAAE,GACtC,gBAAgB,EAAE,CAUpB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,KAAK,EAAE,4BAA4B,GAClC,gBAAgB,EAAE,CAWpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,cAAc,EAAE,CAUlB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,KAAK,EAAE,0BAA0B,GAChC,cAAc,EAAE,CAWlB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,KAAK,EAAE,uBAAuB,GAC7B,wBAAwB,CAoE1B"}
@@ -1,188 +0,0 @@
1
- function compareOrderedEntities(a, b) {
2
- if (a.orderIndex !== b.orderIndex) {
3
- return a.orderIndex - b.orderIndex;
4
- }
5
- if (a.createdAt !== b.createdAt) {
6
- return a.createdAt.localeCompare(b.createdAt);
7
- }
8
- return a.id.localeCompare(b.id);
9
- }
10
- function clampInsertionIndex(targetIndex, length) {
11
- if (!Number.isFinite(targetIndex)) {
12
- return length;
13
- }
14
- const normalized = Math.trunc(targetIndex);
15
- if (normalized < 0) {
16
- return 0;
17
- }
18
- if (normalized > length) {
19
- return length;
20
- }
21
- return normalized;
22
- }
23
- function assertScopedRoadmapMilestones(milestones, roadmapId) {
24
- for (const milestone of milestones) {
25
- if (milestone.roadmapId !== roadmapId) {
26
- throw new Error(`Milestone ${milestone.id} does not belong to roadmap ${roadmapId}`);
27
- }
28
- }
29
- }
30
- function assertScopedMilestoneFeatures(features, milestoneId) {
31
- for (const feature of features) {
32
- if (feature.milestoneId !== milestoneId) {
33
- throw new Error(`Feature ${feature.id} does not belong to milestone ${milestoneId}`);
34
- }
35
- }
36
- }
37
- function assertScopedMoveFeatures(features, fromMilestoneId, toMilestoneId) {
38
- const validMilestoneIds = new Set([fromMilestoneId, toMilestoneId]);
39
- for (const feature of features) {
40
- if (!validMilestoneIds.has(feature.milestoneId)) {
41
- throw new Error(`Feature ${feature.id} is outside the affected milestone scope (${fromMilestoneId} → ${toMilestoneId})`);
42
- }
43
- }
44
- }
45
- function assertExactIdSet(entityLabel, actualIds, orderedIds) {
46
- const requestedIds = new Set();
47
- for (const id of orderedIds) {
48
- if (requestedIds.has(id)) {
49
- throw new Error(`Duplicate ${entityLabel} id in requested order: ${id}`);
50
- }
51
- requestedIds.add(id);
52
- }
53
- if (actualIds.length !== orderedIds.length) {
54
- throw new Error(`Expected ${actualIds.length} ${entityLabel} ids but received ${orderedIds.length}`);
55
- }
56
- const actualIdSet = new Set(actualIds);
57
- for (const id of orderedIds) {
58
- if (!actualIdSet.has(id)) {
59
- throw new Error(`${capitalize(entityLabel)} ${id} not found in scoped list`);
60
- }
61
- }
62
- for (const id of actualIds) {
63
- if (!requestedIds.has(id)) {
64
- throw new Error(`Missing ${entityLabel} id in requested order: ${id}`);
65
- }
66
- }
67
- }
68
- function capitalize(value) {
69
- return value.charAt(0).toUpperCase() + value.slice(1);
70
- }
71
- function assignContiguousOrder(items) {
72
- return items.map((item, orderIndex) => {
73
- if (item.orderIndex === orderIndex) {
74
- return { ...item };
75
- }
76
- return {
77
- ...item,
78
- orderIndex,
79
- };
80
- });
81
- }
82
- /**
83
- * Repairs milestone ordering for a single roadmap scope.
84
- *
85
- * Deterministic repair order is `orderIndex ASC`, `createdAt ASC`, then `id ASC`.
86
- */
87
- export function normalizeRoadmapMilestoneOrder(milestones) {
88
- if (milestones.length === 0) {
89
- return [];
90
- }
91
- assertScopedRoadmapMilestones(milestones, milestones[0].roadmapId);
92
- return assignContiguousOrder([...milestones].sort(compareOrderedEntities));
93
- }
94
- /**
95
- * Applies an explicit milestone reorder for a single roadmap scope.
96
- *
97
- * The caller must provide the complete milestone ID set exactly once. Partial
98
- * or duplicate lists are rejected to keep reorders deterministic.
99
- */
100
- export function applyRoadmapMilestoneReorder(milestones, input) {
101
- assertScopedRoadmapMilestones(milestones, input.roadmapId);
102
- const normalized = normalizeRoadmapMilestoneOrder(milestones);
103
- const ids = normalized.map((milestone) => milestone.id);
104
- assertExactIdSet("milestone", ids, input.orderedMilestoneIds);
105
- const byId = new Map(normalized.map((milestone) => [milestone.id, milestone]));
106
- return assignContiguousOrder(input.orderedMilestoneIds.map((id) => byId.get(id)));
107
- }
108
- /**
109
- * Repairs feature ordering for a single milestone scope.
110
- *
111
- * Deterministic repair order is `orderIndex ASC`, `createdAt ASC`, then `id ASC`.
112
- */
113
- export function normalizeRoadmapFeatureOrder(features) {
114
- if (features.length === 0) {
115
- return [];
116
- }
117
- assertScopedMilestoneFeatures(features, features[0].milestoneId);
118
- return assignContiguousOrder([...features].sort(compareOrderedEntities));
119
- }
120
- /**
121
- * Applies an explicit feature reorder for a single milestone scope.
122
- *
123
- * The caller must provide the complete feature ID set exactly once. Partial or
124
- * duplicate lists are rejected to keep reorder behavior deterministic.
125
- */
126
- export function applyRoadmapFeatureReorder(features, input) {
127
- assertScopedMilestoneFeatures(features, input.milestoneId);
128
- const normalized = normalizeRoadmapFeatureOrder(features);
129
- const ids = normalized.map((feature) => feature.id);
130
- assertExactIdSet("feature", ids, input.orderedFeatureIds);
131
- const byId = new Map(normalized.map((feature) => [feature.id, feature]));
132
- return assignContiguousOrder(input.orderedFeatureIds.map((id) => byId.get(id)));
133
- }
134
- /**
135
- * Moves a feature within the affected milestone scope and deterministically
136
- * normalizes both source and destination order.
137
- *
138
- * For cross-milestone moves, pass the combined feature list from the source and
139
- * target milestones. For within-milestone moves, pass the current milestone's
140
- * feature list. `targetOrderIndex` is clamped into the destination range.
141
- */
142
- export function moveRoadmapFeature(features, input) {
143
- assertScopedMoveFeatures(features, input.fromMilestoneId, input.toMilestoneId);
144
- const existingFeature = features.find((feature) => feature.id === input.featureId);
145
- if (!existingFeature) {
146
- throw new Error(`Feature ${input.featureId} not found in affected milestone scope`);
147
- }
148
- if (existingFeature.milestoneId !== input.fromMilestoneId) {
149
- throw new Error(`Feature ${input.featureId} does not belong to milestone ${input.fromMilestoneId}`);
150
- }
151
- const sourceFeatures = normalizeRoadmapFeatureOrder(features.filter((feature) => feature.milestoneId === input.fromMilestoneId));
152
- const sourceWithoutFeature = sourceFeatures.filter((feature) => feature.id !== input.featureId);
153
- if (input.fromMilestoneId === input.toMilestoneId) {
154
- const insertionIndex = clampInsertionIndex(input.targetOrderIndex, sourceWithoutFeature.length);
155
- const reordered = [...sourceWithoutFeature];
156
- reordered.splice(insertionIndex, 0, {
157
- ...existingFeature,
158
- milestoneId: input.toMilestoneId,
159
- orderIndex: insertionIndex,
160
- });
161
- const normalized = assignContiguousOrder(reordered);
162
- const movedFeature = normalized.find((feature) => feature.id === input.featureId);
163
- return {
164
- movedFeature,
165
- affectedFeatures: normalized,
166
- sourceMilestoneFeatures: normalized,
167
- targetMilestoneFeatures: normalized,
168
- };
169
- }
170
- const targetFeatures = normalizeRoadmapFeatureOrder(features.filter((feature) => feature.milestoneId === input.toMilestoneId));
171
- const insertionIndex = clampInsertionIndex(input.targetOrderIndex, targetFeatures.length);
172
- const targetWithInsertedFeature = [...targetFeatures];
173
- targetWithInsertedFeature.splice(insertionIndex, 0, {
174
- ...existingFeature,
175
- milestoneId: input.toMilestoneId,
176
- orderIndex: insertionIndex,
177
- });
178
- const normalizedSource = assignContiguousOrder(sourceWithoutFeature);
179
- const normalizedTarget = assignContiguousOrder(targetWithInsertedFeature);
180
- const movedFeature = normalizedTarget.find((feature) => feature.id === input.featureId);
181
- return {
182
- movedFeature,
183
- affectedFeatures: [...normalizedSource, ...normalizedTarget],
184
- sourceMilestoneFeatures: normalizedSource,
185
- targetMilestoneFeatures: normalizedTarget,
186
- };
187
- }
188
- //# sourceMappingURL=roadmap-ordering.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roadmap-ordering.js","sourceRoot":"","sources":["roadmap-ordering.ts"],"names":[],"mappings":"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"}