@grifhinz/logics-manager 2.2.0 → 2.3.1

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 (43) hide show
  1. package/README.md +95 -1
  2. package/VERSION +1 -1
  3. package/clients/README.md +9 -0
  4. package/clients/shared-web/media/css/board.css +658 -0
  5. package/clients/shared-web/media/css/details.css +457 -0
  6. package/clients/shared-web/media/css/layout.css +123 -0
  7. package/clients/shared-web/media/css/toolbar.css +576 -0
  8. package/clients/shared-web/media/harnessApi.js +324 -0
  9. package/clients/shared-web/media/hostApi.js +213 -0
  10. package/clients/shared-web/media/hostApiContract.js +55 -0
  11. package/clients/shared-web/media/icon.png +0 -0
  12. package/clients/shared-web/media/layoutController.js +246 -0
  13. package/clients/shared-web/media/logics.svg +7 -0
  14. package/clients/shared-web/media/logicsModel.js +910 -0
  15. package/clients/shared-web/media/main.css +112 -0
  16. package/clients/shared-web/media/main.js +3 -0
  17. package/clients/shared-web/media/mainApp.js +1005 -0
  18. package/clients/shared-web/media/mainCore.js +604 -0
  19. package/clients/shared-web/media/mainInteractionHandlers.js +324 -0
  20. package/clients/shared-web/media/mainInteractions.js +378 -0
  21. package/clients/shared-web/media/renderBoard.js +3 -0
  22. package/clients/shared-web/media/renderBoardApp.js +1339 -0
  23. package/clients/shared-web/media/renderDetails.js +685 -0
  24. package/clients/shared-web/media/renderMarkdown.js +449 -0
  25. package/clients/shared-web/media/toolsPanelLayout.js +172 -0
  26. package/clients/shared-web/media/uiStatus.js +54 -0
  27. package/clients/shared-web/media/webviewChrome.js +405 -0
  28. package/clients/shared-web/media/webviewPersistence.js +116 -0
  29. package/clients/shared-web/media/webviewSelectors.js +491 -0
  30. package/clients/viewer/README.md +5 -0
  31. package/clients/viewer/browser-host.js +847 -0
  32. package/clients/viewer/index.html +237 -0
  33. package/clients/viewer/viewer.css +433 -0
  34. package/logics_manager/assist.py +9 -142
  35. package/logics_manager/assist_handoff.py +132 -0
  36. package/logics_manager/assist_surface.py +38 -0
  37. package/logics_manager/cli.py +78 -5
  38. package/logics_manager/flow.py +126 -24
  39. package/logics_manager/flow_evidence.py +63 -0
  40. package/logics_manager/update_check.py +138 -0
  41. package/logics_manager/viewer.py +533 -0
  42. package/package.json +12 -6
  43. package/pyproject.toml +1 -1
@@ -0,0 +1,324 @@
1
+ (() => {
2
+ window.createCdxLogicsMainInteractionHandlers = function createCdxLogicsMainInteractionHandlers(options) {
3
+ const { core, hostApi, layoutController, stackedQuery, compactListQuery, state } = options;
4
+
5
+ const render = core && typeof core.render === "function" ? () => core.render() : () => undefined;
6
+ const persistState = core && typeof core.persistState === "function" ? () => core.persistState() : () => undefined;
7
+ const captureScrollState =
8
+ core && typeof core.captureScrollState === "function" ? () => core.captureScrollState() : () => undefined;
9
+ const schedulePersistState =
10
+ core && typeof core.schedulePersistState === "function"
11
+ ? () => core.schedulePersistState()
12
+ : () => undefined;
13
+ const resetPersistedUiState =
14
+ core && typeof core.resetPersistedUiState === "function"
15
+ ? () => core.resetPersistedUiState()
16
+ : () => undefined;
17
+ const setFilterPanelOpen =
18
+ core && typeof core.setFilterPanelOpen === "function" ? (isOpen) => core.setFilterPanelOpen(isOpen) : () => undefined;
19
+ const setToolsPanelOpen =
20
+ core && typeof core.setToolsPanelOpen === "function"
21
+ ? (viewNameOrOpen, maybeOpen) => {
22
+ if (typeof maybeOpen === "boolean") {
23
+ return core.setToolsPanelOpen(viewNameOrOpen, maybeOpen);
24
+ }
25
+ return core.setToolsPanelOpen(undefined, Boolean(viewNameOrOpen));
26
+ }
27
+ : () => undefined;
28
+ const restoreDefaultFilters =
29
+ core && typeof core.restoreDefaultFilters === "function" ? () => core.restoreDefaultFilters() : () => undefined;
30
+ const openSelectedItem =
31
+ core && typeof core.openSelectedItem === "function" ? (mode) => core.openSelectedItem(mode) : () => undefined;
32
+ const handleChangeProjectRoot =
33
+ core && typeof core.handleChangeProjectRoot === "function"
34
+ ? () => core.handleChangeProjectRoot()
35
+ : async () => undefined;
36
+ const handleResetProjectRoot =
37
+ core && typeof core.handleResetProjectRoot === "function"
38
+ ? () => core.handleResetProjectRoot()
39
+ : () => undefined;
40
+ const handleBootstrapLogics =
41
+ core && typeof core.handleBootstrapLogics === "function" ? () => core.handleBootstrapLogics() : () => undefined;
42
+ const handleAbout = core && typeof core.handleAbout === "function" ? () => core.handleAbout() : () => undefined;
43
+ const handleHostMessage =
44
+ core && typeof core.handleHostMessage === "function" ? (event) => core.handleHostMessage(event) : () => undefined;
45
+ const renderBoardErrorState =
46
+ core && typeof core.renderBoardErrorState === "function"
47
+ ? (message) => core.renderBoardErrorState(message)
48
+ : () => undefined;
49
+ const handleDocumentClick =
50
+ core && typeof core.handleDocumentClick === "function"
51
+ ? (event) => core.handleDocumentClick(event)
52
+ : () => undefined;
53
+ const handleDocumentKeydown =
54
+ core && typeof core.handleDocumentKeydown === "function"
55
+ ? (event) => core.handleDocumentKeydown(event)
56
+ : () => undefined;
57
+ const handleSplitterKeydown =
58
+ core && typeof core.handleSplitterKeydown === "function"
59
+ ? (event) => core.handleSplitterKeydown(event)
60
+ : () => undefined;
61
+ const handleResponsiveLayoutChange =
62
+ core && typeof core.handleResponsiveLayoutChange === "function"
63
+ ? () => core.handleResponsiveLayoutChange()
64
+ : () => undefined;
65
+
66
+ return {
67
+ onNewRequest() {
68
+ hostApi.newRequest();
69
+ setToolsPanelOpen(false);
70
+ },
71
+ onAbout() {
72
+ handleAbout();
73
+ setToolsPanelOpen(false);
74
+ },
75
+ onActivityToggle() {
76
+ const nextOpen = !state.activityPanelOpen;
77
+ const shouldCollapseForStackedLayout =
78
+ nextOpen &&
79
+ ((stackedQuery && stackedQuery.matches) ||
80
+ (layoutController &&
81
+ typeof layoutController.isStackedLayout === "function" &&
82
+ layoutController.isStackedLayout()));
83
+ if (shouldCollapseForStackedLayout) {
84
+ state.uiState.detailsCollapsed = true;
85
+ }
86
+ state.activityPanelOpen = !state.activityPanelOpen;
87
+ persistState();
88
+ render();
89
+ },
90
+ onBoardScroll() {
91
+ captureScrollState();
92
+ schedulePersistState();
93
+ },
94
+ onBootstrapLogics() {
95
+ handleBootstrapLogics();
96
+ setToolsPanelOpen(false);
97
+ },
98
+ onUpdateLogicsKit() {
99
+ hostApi.updateLogicsKit();
100
+ setToolsPanelOpen(false);
101
+ },
102
+ onRepairLogicsKit() {
103
+ hostApi.repairLogicsKit();
104
+ setToolsPanelOpen(false);
105
+ },
106
+ onCheckEnvironment() {
107
+ hostApi.checkEnvironment();
108
+ setToolsPanelOpen(false);
109
+ },
110
+ onCheckHybridRuntime() {
111
+ hostApi.checkHybridRuntime();
112
+ setToolsPanelOpen(false);
113
+ },
114
+ onOpenHybridInsights() {
115
+ hostApi.openHybridInsights();
116
+ setToolsPanelOpen(false);
117
+ },
118
+ onOpenLogicsInsights() {
119
+ hostApi.openLogicsInsights();
120
+ setToolsPanelOpen(false);
121
+ },
122
+ onOpenOnboarding() {
123
+ hostApi.openOnboarding();
124
+ setToolsPanelOpen(false);
125
+ },
126
+ onAssistCommitAll() {
127
+ hostApi.assistCommitAll();
128
+ setToolsPanelOpen(false);
129
+ },
130
+ onAssistNextStep() {
131
+ hostApi.assistNextStep();
132
+ setToolsPanelOpen(false);
133
+ },
134
+ onAssistTriage() {
135
+ hostApi.assistTriage(state.selectedId || undefined);
136
+ setToolsPanelOpen(false);
137
+ },
138
+ onAssistDiffRisk() {
139
+ hostApi.assistDiffRisk();
140
+ setToolsPanelOpen(false);
141
+ },
142
+ onAssistSummarizeChangelog() {
143
+ hostApi.assistSummarizeChangelog();
144
+ setToolsPanelOpen(false);
145
+ },
146
+ onAssistPrepareRelease() {
147
+ hostApi.assistPrepareRelease();
148
+ setToolsPanelOpen(false);
149
+ },
150
+ onAssistPublishRelease() {
151
+ hostApi.assistPublishRelease();
152
+ setToolsPanelOpen(false);
153
+ },
154
+ onAssistSummarizeValidation() {
155
+ hostApi.assistSummarizeValidation();
156
+ setToolsPanelOpen(false);
157
+ },
158
+ onAssistValidationChecklist() {
159
+ hostApi.assistValidationChecklist();
160
+ setToolsPanelOpen(false);
161
+ },
162
+ onAssistDocConsistency() {
163
+ hostApi.assistDocConsistency();
164
+ setToolsPanelOpen(false);
165
+ },
166
+ onChangeProjectRoot() {
167
+ return handleChangeProjectRoot();
168
+ },
169
+ onCreateCompanionDoc(action) {
170
+ if (action === "new-request-guided") {
171
+ hostApi.newGuidedRequest();
172
+ } else {
173
+ hostApi.createCompanionDoc(state.selectedId || undefined);
174
+ }
175
+ setToolsPanelOpen(false);
176
+ },
177
+ onDetailsScroll() {
178
+ captureScrollState();
179
+ schedulePersistState();
180
+ },
181
+ onDetailsToggle() {
182
+ state.uiState.detailsCollapsed = !state.uiState.detailsCollapsed;
183
+ persistState();
184
+ render();
185
+ },
186
+ onDocumentClick(event) {
187
+ handleDocumentClick(event);
188
+ },
189
+ onDocumentKeydown(event) {
190
+ handleDocumentKeydown(event);
191
+ },
192
+ onFilterPanelToggle(event) {
193
+ event.stopPropagation();
194
+ if (state.toolsPanelOpen) {
195
+ setToolsPanelOpen(false);
196
+ }
197
+ setFilterPanelOpen(!state.secondaryToolbarOpen);
198
+ },
199
+ onFilterReset() {
200
+ restoreDefaultFilters();
201
+ persistState();
202
+ render();
203
+ },
204
+ onGroupChange(event) {
205
+ state.groupMode = event.target ? String(event.target.value || "stage") : "stage";
206
+ persistState();
207
+ render();
208
+ },
209
+ onHelpDismiss() {
210
+ state.helpDismissed = true;
211
+ persistState();
212
+ render();
213
+ },
214
+ onHideCompleteChange(event) {
215
+ state.hideCompleted = Boolean(event.target && event.target.checked);
216
+ persistState();
217
+ render();
218
+ },
219
+ onHideEmptyColumnsChange(event) {
220
+ state.hideEmptyColumns = Boolean(event.target && event.target.checked);
221
+ persistState();
222
+ render();
223
+ },
224
+ onHideProcessedRequestsChange(event) {
225
+ state.hideProcessedRequests = Boolean(event.target && event.target.checked);
226
+ persistState();
227
+ render();
228
+ },
229
+ onHideSpecChange(event) {
230
+ state.hideSpec = Boolean(event.target && event.target.checked);
231
+ persistState();
232
+ render();
233
+ },
234
+ onMarkDone() {
235
+ const item = state.items.find((entry) => entry.id === state.selectedId);
236
+ if (!item) {
237
+ return;
238
+ }
239
+ hostApi.markDone(item);
240
+ },
241
+ onMarkObsolete() {
242
+ const item = state.items.find((entry) => entry.id === state.selectedId);
243
+ if (!item) {
244
+ return;
245
+ }
246
+ hostApi.markObsolete(item);
247
+ },
248
+ onChangeStatus() {
249
+ const item = state.items.find((entry) => entry.id === state.selectedId);
250
+ if (!item) {
251
+ return;
252
+ }
253
+ hostApi.changeStatus(item);
254
+ },
255
+ onOpenSelectedItem() {
256
+ openSelectedItem("open");
257
+ },
258
+ onPromoteSelectedItem() {
259
+ if (!state.selectedId) {
260
+ return;
261
+ }
262
+ hostApi.promote(state.selectedId);
263
+ },
264
+ onReadSelectedItem() {
265
+ openSelectedItem("read");
266
+ },
267
+ onResetProjectRoot() {
268
+ handleResetProjectRoot();
269
+ setToolsPanelOpen(false);
270
+ },
271
+ onSearchInput(event) {
272
+ state.searchQuery = event.target ? String(event.target.value || "") : "";
273
+ persistState();
274
+ render();
275
+ },
276
+ onSelectAgent() {
277
+ hostApi.selectAgent();
278
+ setToolsPanelOpen(false);
279
+ },
280
+ onShowCompanionDocsChange(event) {
281
+ state.showCompanionDocs = Boolean(event.target && event.target.checked);
282
+ persistState();
283
+ render();
284
+ },
285
+ onSortChange(event) {
286
+ state.sortMode = event.target ? String(event.target.value || "default") : "default";
287
+ persistState();
288
+ render();
289
+ },
290
+ onSplitterKeydown(event) {
291
+ handleSplitterKeydown(event);
292
+ },
293
+ onToggleAttention() {
294
+ state.attentionOnly = !state.attentionOnly;
295
+ persistState();
296
+ render();
297
+ },
298
+ onToggleViewMode() {
299
+ if (compactListQuery && compactListQuery.matches) {
300
+ return;
301
+ }
302
+ state.uiState.viewMode = state.uiState.viewMode === "list" ? "board" : "list";
303
+ persistState();
304
+ render();
305
+ },
306
+ onToolsPanelToggle(viewName, event) {
307
+ const activeView = typeof viewName === "string" && viewName ? viewName : "workflow";
308
+ const nativeEvent = event && typeof event === "object" && "stopPropagation" in event ? event : null;
309
+ if (nativeEvent && typeof nativeEvent.stopPropagation === "function") {
310
+ nativeEvent.stopPropagation();
311
+ }
312
+ const shouldOpen = !state.toolsPanelOpen || state.toolsPanelView !== activeView;
313
+ state.toolsPanelView = shouldOpen ? activeView : state.toolsPanelView;
314
+ setToolsPanelOpen(activeView, shouldOpen);
315
+ },
316
+ onWindowMessage(event) {
317
+ handleHostMessage(event);
318
+ },
319
+ onWindowResize() {
320
+ handleResponsiveLayoutChange();
321
+ }
322
+ };
323
+ };
324
+ })();
@@ -0,0 +1,378 @@
1
+ (() => {
2
+ window.createCdxLogicsMainInteractions = function createCdxLogicsMainInteractions(options) {
3
+ const {
4
+ activityToggle,
5
+ attentionToggle,
6
+ headerLogicsInsightsButton,
7
+ board,
8
+ assistCommitAllButton,
9
+ assistNextStepButton,
10
+ assistTriageButton,
11
+ assistDiffRiskButton,
12
+ assistSummarizeChangelogButton,
13
+ assistPrepareReleaseButton,
14
+ assistPublishReleaseButton,
15
+ assistSummarizeValidationButton,
16
+ assistValidationChecklistButton,
17
+ assistDocConsistencyButton,
18
+ bootstrapLogicsButton,
19
+ checkHybridRuntimeButton,
20
+ checkEnvironmentButton,
21
+ openHybridInsightsButton,
22
+ openLogicsInsightsButton,
23
+ openOnboardingButton,
24
+ changeProjectRootButton,
25
+ compactListQuery,
26
+ createCompanionDocToolButton,
27
+ detailsBody,
28
+ detailsToggle,
29
+ filterPanel,
30
+ filterResetButton,
31
+ filterToggle,
32
+ groupBySelect,
33
+ helpBannerDismiss,
34
+ hideCompleteToggle,
35
+ hideEmptyColumnsToggle,
36
+ hideProcessedRequestsToggle,
37
+ hideSpecToggle,
38
+ layoutController,
39
+ repairLogicsKitButton,
40
+ mainPane,
41
+ markDoneButton,
42
+ markObsoleteButton,
43
+ changeStatusButton,
44
+ newRequestToolButton,
45
+ onNewRequest,
46
+ onAbout,
47
+ onActivityToggle,
48
+ onBoardScroll,
49
+ onBootstrapLogics,
50
+ onCheckHybridRuntime,
51
+ onCheckEnvironment,
52
+ onOpenHybridInsights,
53
+ onOpenLogicsInsights,
54
+ onOpenOnboarding,
55
+ onChangeProjectRoot,
56
+ onAssistCommitAll,
57
+ onAssistNextStep,
58
+ onAssistTriage,
59
+ onAssistDiffRisk,
60
+ onAssistSummarizeChangelog,
61
+ onAssistPrepareRelease,
62
+ onAssistPublishRelease,
63
+ onAssistSummarizeValidation,
64
+ onAssistValidationChecklist,
65
+ onAssistDocConsistency,
66
+ onCreateCompanionDoc,
67
+ onDetailsScroll,
68
+ onDetailsToggle,
69
+ onDocumentClick,
70
+ onDocumentKeydown,
71
+ onFilterPanelToggle,
72
+ onFilterReset,
73
+ onGroupChange,
74
+ onHelpDismiss,
75
+ onHideCompleteChange,
76
+ onHideEmptyColumnsChange,
77
+ onHideProcessedRequestsChange,
78
+ onHideSpecChange,
79
+ onMarkDone,
80
+ onMarkObsolete,
81
+ onChangeStatus,
82
+ onOpenSelectedItem,
83
+ onPromoteSelectedItem,
84
+ onReadSelectedItem,
85
+ onResetProjectRoot,
86
+ onSearchInput,
87
+ onSelectAgent,
88
+ onShowCompanionDocsChange,
89
+ onSortChange,
90
+ onSplitterKeydown,
91
+ onToggleViewMode,
92
+ onToggleAttention,
93
+ onToolsPanelToggle,
94
+ onUpdateLogicsKit,
95
+ onRepairLogicsKit,
96
+ onWindowMessage,
97
+ onWindowResize,
98
+ openButton,
99
+ promoteButton,
100
+ readButton,
101
+ getToolsPanelView,
102
+ resetProjectRootButton,
103
+ searchInput,
104
+ selectAgentButton,
105
+ setControlDescription,
106
+ showCompanionDocsToggle,
107
+ sortBySelect,
108
+ splitter,
109
+ stackedQuery,
110
+ toolsPanel,
111
+ toolsToggle,
112
+ updateLogicsKitButton,
113
+ viewModeToggleButton,
114
+ aboutButton
115
+ } = options;
116
+
117
+ function attachMediaQueryListener(query, callback) {
118
+ if (!query || typeof callback !== "function") {
119
+ return;
120
+ }
121
+ if (typeof query.addEventListener === "function") {
122
+ query.addEventListener("change", callback);
123
+ return;
124
+ }
125
+ if (typeof query.addListener === "function") {
126
+ query.addListener(callback);
127
+ }
128
+ }
129
+
130
+ function attach() {
131
+ if (headerLogicsInsightsButton) {
132
+ headerLogicsInsightsButton.addEventListener("click", () => onOpenLogicsInsights());
133
+ }
134
+ if (viewModeToggleButton) {
135
+ viewModeToggleButton.addEventListener("click", () => onToggleViewMode());
136
+ }
137
+ if (bootstrapLogicsButton) {
138
+ bootstrapLogicsButton.addEventListener("click", () => onBootstrapLogics());
139
+ }
140
+ if (updateLogicsKitButton) {
141
+ updateLogicsKitButton.addEventListener("click", () => onUpdateLogicsKit());
142
+ }
143
+ if (repairLogicsKitButton) {
144
+ repairLogicsKitButton.addEventListener("click", () => onRepairLogicsKit());
145
+ }
146
+ if (checkEnvironmentButton) {
147
+ checkEnvironmentButton.addEventListener("click", () => onCheckEnvironment());
148
+ }
149
+ if (checkHybridRuntimeButton) {
150
+ checkHybridRuntimeButton.addEventListener("click", () => onCheckHybridRuntime());
151
+ }
152
+ if (openHybridInsightsButton) {
153
+ openHybridInsightsButton.addEventListener("click", () => onOpenHybridInsights());
154
+ }
155
+ if (openLogicsInsightsButton) {
156
+ openLogicsInsightsButton.addEventListener("click", () => onOpenLogicsInsights());
157
+ }
158
+ if (openOnboardingButton) {
159
+ openOnboardingButton.addEventListener("click", () => onOpenOnboarding());
160
+ }
161
+ if (assistCommitAllButton) {
162
+ assistCommitAllButton.addEventListener("click", () => onAssistCommitAll());
163
+ }
164
+ if (assistNextStepButton) {
165
+ assistNextStepButton.addEventListener("click", () => onAssistNextStep());
166
+ }
167
+ if (assistTriageButton) {
168
+ assistTriageButton.addEventListener("click", () => onAssistTriage());
169
+ }
170
+ if (assistDiffRiskButton) {
171
+ assistDiffRiskButton.addEventListener("click", () => onAssistDiffRisk());
172
+ }
173
+ if (assistSummarizeChangelogButton) {
174
+ assistSummarizeChangelogButton.addEventListener("click", () => onAssistSummarizeChangelog());
175
+ }
176
+ if (assistPrepareReleaseButton) {
177
+ assistPrepareReleaseButton.addEventListener("click", () => onAssistPrepareRelease());
178
+ }
179
+ if (assistPublishReleaseButton) {
180
+ assistPublishReleaseButton.addEventListener("click", () => onAssistPublishRelease());
181
+ }
182
+ if (assistSummarizeValidationButton) {
183
+ assistSummarizeValidationButton.addEventListener("click", () => onAssistSummarizeValidation());
184
+ }
185
+ if (assistValidationChecklistButton) {
186
+ assistValidationChecklistButton.addEventListener("click", () => onAssistValidationChecklist());
187
+ }
188
+ if (assistDocConsistencyButton) {
189
+ assistDocConsistencyButton.addEventListener("click", () => onAssistDocConsistency());
190
+ }
191
+ if (newRequestToolButton) {
192
+ newRequestToolButton.addEventListener("click", () => onNewRequest());
193
+ }
194
+ if (createCompanionDocToolButton) {
195
+ createCompanionDocToolButton.addEventListener("click", () => onCreateCompanionDoc("create-companion-doc"));
196
+ }
197
+ if (selectAgentButton) {
198
+ selectAgentButton.addEventListener("click", () => onSelectAgent());
199
+ }
200
+ if (changeProjectRootButton) {
201
+ changeProjectRootButton.addEventListener("click", () => onChangeProjectRoot());
202
+ }
203
+ if (resetProjectRootButton) {
204
+ resetProjectRootButton.addEventListener("click", () => onResetProjectRoot());
205
+ }
206
+ if (aboutButton) {
207
+ aboutButton.addEventListener("click", () => onAbout());
208
+ }
209
+ if (filterToggle) {
210
+ filterToggle.addEventListener("click", (event) => onFilterPanelToggle(event));
211
+ }
212
+ if (toolsToggle) {
213
+ toolsToggle.addEventListener(
214
+ "click",
215
+ (event) => onToolsPanelToggle(typeof getToolsPanelView === "function" ? getToolsPanelView() || "workflow" : "workflow", event)
216
+ );
217
+ }
218
+ if (hideCompleteToggle) {
219
+ hideCompleteToggle.addEventListener("change", (event) => onHideCompleteChange(event));
220
+ }
221
+ if (hideProcessedRequestsToggle) {
222
+ hideProcessedRequestsToggle.addEventListener("change", (event) => onHideProcessedRequestsChange(event));
223
+ }
224
+ if (hideSpecToggle) {
225
+ hideSpecToggle.addEventListener("change", (event) => onHideSpecChange(event));
226
+ }
227
+ if (showCompanionDocsToggle) {
228
+ showCompanionDocsToggle.addEventListener("change", (event) => onShowCompanionDocsChange(event));
229
+ }
230
+ if (hideEmptyColumnsToggle) {
231
+ hideEmptyColumnsToggle.addEventListener("change", (event) => onHideEmptyColumnsChange(event));
232
+ }
233
+ if (filterResetButton) {
234
+ filterResetButton.addEventListener("click", () => onFilterReset());
235
+ }
236
+ if (searchInput) {
237
+ searchInput.addEventListener("input", (event) => onSearchInput(event));
238
+ }
239
+ if (groupBySelect) {
240
+ groupBySelect.addEventListener("change", (event) => onGroupChange(event));
241
+ }
242
+ if (sortBySelect) {
243
+ sortBySelect.addEventListener("change", (event) => onSortChange(event));
244
+ }
245
+ if (attentionToggle) {
246
+ attentionToggle.addEventListener("click", () => onToggleAttention());
247
+ }
248
+ if (activityToggle) {
249
+ activityToggle.addEventListener("click", () => onActivityToggle());
250
+ }
251
+ if (helpBannerDismiss) {
252
+ helpBannerDismiss.addEventListener("click", () => onHelpDismiss());
253
+ }
254
+ if (board) {
255
+ board.addEventListener("scroll", () => onBoardScroll());
256
+ }
257
+ if (detailsBody) {
258
+ detailsBody.addEventListener("scroll", () => onDetailsScroll());
259
+ }
260
+ if (detailsToggle) {
261
+ detailsToggle.addEventListener("click", () => onDetailsToggle());
262
+ }
263
+ if (openButton) {
264
+ openButton.addEventListener("click", () => onOpenSelectedItem());
265
+ }
266
+ if (readButton) {
267
+ readButton.addEventListener("click", () => onReadSelectedItem());
268
+ }
269
+ if (promoteButton) {
270
+ promoteButton.addEventListener("click", () => onPromoteSelectedItem());
271
+ }
272
+ if (markDoneButton) {
273
+ markDoneButton.addEventListener("click", () => onMarkDone());
274
+ }
275
+ if (markObsoleteButton) {
276
+ markObsoleteButton.addEventListener("click", () => onMarkObsolete());
277
+ }
278
+ if (changeStatusButton) {
279
+ changeStatusButton.addEventListener("click", () => onChangeStatus());
280
+ }
281
+ if (toolsPanel) {
282
+ const toolsPanelCloseButton = toolsPanel.querySelector("[data-tools-panel-close]");
283
+ if (toolsPanelCloseButton instanceof HTMLElement) {
284
+ toolsPanelCloseButton.addEventListener("click", () => setToolsPanelOpen(false));
285
+ }
286
+ Array.from(toolsPanel.querySelectorAll("[data-tools-view-switch]")).forEach((button) => {
287
+ if (!(button instanceof HTMLElement)) {
288
+ return;
289
+ }
290
+ const viewName = button.getAttribute("data-tools-view-switch") || "workflow";
291
+ button.addEventListener("click", (event) => onToolsPanelToggle(viewName, event));
292
+ });
293
+ }
294
+
295
+ window.addEventListener("message", (event) => onWindowMessage(event));
296
+ document.addEventListener("click", (event) => onDocumentClick(event));
297
+ document.addEventListener("keydown", (event) => onDocumentKeydown(event));
298
+
299
+ if (splitter) {
300
+ splitter.addEventListener("pointerdown", (event) => {
301
+ if (layoutController && typeof layoutController.startSplitDrag === "function") {
302
+ layoutController.startSplitDrag(event);
303
+ }
304
+ });
305
+ splitter.addEventListener("pointermove", (event) => {
306
+ if (layoutController && typeof layoutController.updateSplitDrag === "function") {
307
+ layoutController.updateSplitDrag(event);
308
+ }
309
+ });
310
+ splitter.addEventListener("pointerup", (event) => {
311
+ if (layoutController && typeof layoutController.endSplitDrag === "function") {
312
+ layoutController.endSplitDrag(event);
313
+ }
314
+ });
315
+ splitter.addEventListener("pointercancel", (event) => {
316
+ if (layoutController && typeof layoutController.endSplitDrag === "function") {
317
+ layoutController.endSplitDrag(event);
318
+ }
319
+ });
320
+ splitter.addEventListener("keydown", (event) => onSplitterKeydown(event));
321
+ }
322
+
323
+ attachMediaQueryListener(stackedQuery, onWindowResize);
324
+ attachMediaQueryListener(compactListQuery, onWindowResize);
325
+ window.addEventListener("resize", () => onWindowResize());
326
+
327
+ setControlDescription(filterToggle, "Show view controls");
328
+ setControlDescription(toolsToggle, "Open tools menu");
329
+ setControlDescription(viewModeToggleButton, "Switch display mode");
330
+ setControlDescription(selectAgentButton, "Select active agent");
331
+ setControlDescription(newRequestToolButton, "Create a new request document");
332
+ setControlDescription(bootstrapLogicsButton, "Bootstrap Logics");
333
+ setControlDescription(checkEnvironmentButton, "Review environment health and recommended fixes");
334
+ setControlDescription(checkHybridRuntimeButton, "Check hybrid assist runtime health");
335
+ setControlDescription(openHybridInsightsButton, "Open the hybrid assist ROI insights panel");
336
+ setControlDescription(openLogicsInsightsButton, "Open repository-level Logics stats and relationship signals");
337
+ setControlDescription(assistCommitAllButton, "Suggest or execute a bounded commit plan");
338
+ setControlDescription(assistNextStepButton, "Suggest the next bounded workflow step");
339
+ setControlDescription(assistTriageButton, "Classify a workflow doc through the shared runtime");
340
+ setControlDescription(assistDiffRiskButton, "Assess the current diff risk through the shared runtime");
341
+ setControlDescription(assistSummarizeChangelogButton, "Generate bounded changelog entries through the shared runtime");
342
+ setControlDescription(assistPrepareReleaseButton, "Generate changelog via AI if missing, update README badge, and commit prep changes");
343
+ setControlDescription(assistPublishReleaseButton, "Create the release tag, push, and publish the GitHub release");
344
+ setControlDescription(assistSummarizeValidationButton, "Summarize validation status");
345
+ setControlDescription(assistValidationChecklistButton, "Build a bounded validation checklist through the shared runtime");
346
+ setControlDescription(assistDocConsistencyButton, "Review workflow doc consistency through the shared runtime");
347
+ setControlDescription(changeProjectRootButton, "Change project root");
348
+ setControlDescription(resetProjectRootButton, "Use workspace root");
349
+ setControlDescription(repairLogicsKitButton, "Check current Logics runtime state and repair the shared kit publication or bridge files.");
350
+ setControlDescription(aboutButton, "About this extension");
351
+ setControlDescription(detailsToggle, detailsToggle?.getAttribute("aria-label") || "Collapse details");
352
+ setControlDescription(markDoneButton, "Mark selected item as done");
353
+ setControlDescription(markObsoleteButton, "Mark selected item as obsolete");
354
+ setControlDescription(changeStatusButton, "Change selected item status");
355
+ setControlDescription(openButton, "Edit selected item");
356
+ setControlDescription(readButton, "Read selected item");
357
+ setControlDescription(promoteButton, "Promote selected item");
358
+ if (toolsPanel) {
359
+ toolsPanel.setAttribute("role", "menu");
360
+ }
361
+ if (filterPanel) {
362
+ filterPanel.setAttribute("role", "group");
363
+ filterPanel.setAttribute("aria-label", "View controls");
364
+ }
365
+ if (filterToggle && filterPanel && filterPanel.id) {
366
+ filterToggle.setAttribute("aria-controls", filterPanel.id);
367
+ }
368
+ if (toolsToggle && toolsPanel && toolsPanel.id) {
369
+ toolsToggle.setAttribute("aria-controls", toolsPanel.id);
370
+ }
371
+ if (mainPane) {
372
+ mainPane.classList.toggle("layout__main--activity", false);
373
+ }
374
+ }
375
+
376
+ return { attach };
377
+ };
378
+ })();