cjm-transcript-segment-align 0.0.32__tar.gz → 0.0.34__tar.gz

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 (31) hide show
  1. {cjm_transcript_segment_align-0.0.32/cjm_transcript_segment_align.egg-info → cjm_transcript_segment_align-0.0.34}/PKG-INFO +29 -21
  2. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/README.md +19 -11
  3. cjm_transcript_segment_align-0.0.34/cjm_transcript_segment_align/__init__.py +1 -0
  4. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/routes/init.py +47 -70
  5. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34/cjm_transcript_segment_align.egg-info}/PKG-INFO +29 -21
  6. cjm_transcript_segment_align-0.0.34/cjm_transcript_segment_align.egg-info/requires.txt +10 -0
  7. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/pyproject.toml +1 -1
  8. cjm_transcript_segment_align-0.0.32/cjm_transcript_segment_align/__init__.py +0 -1
  9. cjm_transcript_segment_align-0.0.32/cjm_transcript_segment_align.egg-info/requires.txt +0 -10
  10. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/LICENSE +0 -0
  11. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/MANIFEST.in +0 -0
  12. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/_modidx.py +0 -0
  13. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/__init__.py +0 -0
  14. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/handlers.py +0 -0
  15. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/helpers.py +0 -0
  16. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/keyboard_config.py +0 -0
  17. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/step_renderer.py +0 -0
  18. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/sync_controls.py +0 -0
  19. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/components/toolbar_state.py +0 -0
  20. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/html_ids.py +0 -0
  21. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/models.py +0 -0
  22. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/routes/__init__.py +0 -0
  23. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/routes/chrome.py +0 -0
  24. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/routes/forced_alignment.py +0 -0
  25. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/services/__init__.py +0 -0
  26. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align/services/forced_alignment.py +0 -0
  27. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align.egg-info/SOURCES.txt +0 -0
  28. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align.egg-info/dependency_links.txt +0 -0
  29. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align.egg-info/entry_points.txt +0 -0
  30. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/cjm_transcript_segment_align.egg-info/top_level.txt +0 -0
  31. {cjm_transcript_segment_align-0.0.32 → cjm_transcript_segment_align-0.0.34}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cjm-transcript-segment-align
3
- Version: 0.0.32
3
+ Version: 0.0.34
4
4
  Summary: FastHTML dual-column text segmentation & VAD alignment UI for transcript decomposition workflows with forced alignment-based text splitting for aligning text segments with VAD chunks.
5
5
  Author-email: "Christian J. Mills" <9126128+cj-mills@users.noreply.github.com>
6
6
  License: Apache-2.0
@@ -16,15 +16,15 @@ Requires-Python: >=3.12
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: python-fasthtml
19
- Requires-Dist: cjm-fasthtml-app-core>=0.0.17
20
- Requires-Dist: cjm-plugin-system
21
- Requires-Dist: cjm_transcription_plugin_system
22
- Requires-Dist: cjm_transcript_segmentation>=0.0.22
23
- Requires-Dist: cjm_transcript_vad_align>=0.0.28
24
- Requires-Dist: cjm_fasthtml_keyboard_navigation>=0.0.22
25
- Requires-Dist: cjm_fasthtml_job_monitor>=0.0.11
26
- Requires-Dist: cjm_fasthtml_web_audio>=0.0.11
27
- Requires-Dist: cjm_fasthtml_design_system>=0.0.8
19
+ Requires-Dist: cjm-fasthtml-app-core>=0.0.19
20
+ Requires-Dist: cjm-plugin-system>=0.0.30
21
+ Requires-Dist: cjm_transcription_plugin_system>=0.0.15
22
+ Requires-Dist: cjm_transcript_segmentation>=0.0.25
23
+ Requires-Dist: cjm_transcript_vad_align>=0.0.30
24
+ Requires-Dist: cjm_fasthtml_keyboard_navigation>=0.0.25
25
+ Requires-Dist: cjm_fasthtml_job_monitor>=0.0.14
26
+ Requires-Dist: cjm_fasthtml_web_audio>=0.0.14
27
+ Requires-Dist: cjm_fasthtml_design_system>=0.0.11
28
28
  Dynamic: license-file
29
29
 
30
30
  # cjm-transcript-segment-align
@@ -77,35 +77,35 @@ graph LR
77
77
  services_forced_alignment[services.forced_alignment<br/>forced_alignment]
78
78
 
79
79
  components_handlers --> components_step_renderer
80
- components_handlers --> services_forced_alignment
81
- components_handlers --> html_ids
82
80
  components_handlers --> components_keyboard_config
81
+ components_handlers --> services_forced_alignment
83
82
  components_handlers --> components_sync_controls
83
+ components_handlers --> html_ids
84
84
  components_handlers --> routes_forced_alignment
85
85
  components_keyboard_config --> components_sync_controls
86
86
  components_keyboard_config --> html_ids
87
- components_step_renderer --> html_ids
88
87
  components_step_renderer --> components_keyboard_config
89
- components_step_renderer --> components_sync_controls
90
- components_step_renderer --> components_toolbar_state
91
88
  components_step_renderer --> components_helpers
89
+ components_step_renderer --> components_toolbar_state
90
+ components_step_renderer --> components_sync_controls
91
+ components_step_renderer --> html_ids
92
92
  components_toolbar_state --> components_sync_controls
93
93
  routes_chrome --> components_step_renderer
94
94
  routes_chrome --> components_handlers
95
- routes_chrome --> html_ids
96
95
  routes_chrome --> components_sync_controls
96
+ routes_chrome --> html_ids
97
97
  routes_forced_alignment --> components_step_renderer
98
- routes_forced_alignment --> html_ids
99
98
  routes_forced_alignment --> components_sync_controls
99
+ routes_forced_alignment --> html_ids
100
+ routes_init --> components_keyboard_config
101
+ routes_init --> components_step_renderer
100
102
  routes_init --> components_handlers
103
+ routes_init --> routes_forced_alignment
101
104
  routes_init --> components_sync_controls
102
- routes_init --> services_forced_alignment
103
105
  routes_init --> html_ids
104
- routes_init --> routes_forced_alignment
105
- routes_init --> components_keyboard_config
106
106
  routes_init --> models
107
107
  routes_init --> routes_chrome
108
- routes_init --> components_step_renderer
108
+ routes_init --> services_forced_alignment
109
109
  ```
110
110
 
111
111
  *30 cross-module dependencies detected*
@@ -666,6 +666,14 @@ def init_segment_align_routers(
666
666
  Internally creates services, initializes sub-library routers,
667
667
  wires mutation wrappers, chrome switching, forced alignment,
668
668
  and job monitor integration.
669
+
670
+ Routes the wrapped segmentation handlers (init + mutations) through
671
+ segmentation's `wrapped_handlers` parameter — not via duplicate-route
672
+ overrides — so segmentation registers each URL exactly once and the
673
+ wrappers fire deterministically. `compute_segmentation_urls` resolves
674
+ the chicken-and-egg dependency between URL bundle and wrapper construction
675
+ (FA, JM, chrome need seg_urls; wrappers need fa_toggle_url + switch_chrome_url;
676
+ segmentation needs wrappers).
669
677
  """
670
678
  ```
671
679
 
@@ -48,35 +48,35 @@ graph LR
48
48
  services_forced_alignment[services.forced_alignment<br/>forced_alignment]
49
49
 
50
50
  components_handlers --> components_step_renderer
51
- components_handlers --> services_forced_alignment
52
- components_handlers --> html_ids
53
51
  components_handlers --> components_keyboard_config
52
+ components_handlers --> services_forced_alignment
54
53
  components_handlers --> components_sync_controls
54
+ components_handlers --> html_ids
55
55
  components_handlers --> routes_forced_alignment
56
56
  components_keyboard_config --> components_sync_controls
57
57
  components_keyboard_config --> html_ids
58
- components_step_renderer --> html_ids
59
58
  components_step_renderer --> components_keyboard_config
60
- components_step_renderer --> components_sync_controls
61
- components_step_renderer --> components_toolbar_state
62
59
  components_step_renderer --> components_helpers
60
+ components_step_renderer --> components_toolbar_state
61
+ components_step_renderer --> components_sync_controls
62
+ components_step_renderer --> html_ids
63
63
  components_toolbar_state --> components_sync_controls
64
64
  routes_chrome --> components_step_renderer
65
65
  routes_chrome --> components_handlers
66
- routes_chrome --> html_ids
67
66
  routes_chrome --> components_sync_controls
67
+ routes_chrome --> html_ids
68
68
  routes_forced_alignment --> components_step_renderer
69
- routes_forced_alignment --> html_ids
70
69
  routes_forced_alignment --> components_sync_controls
70
+ routes_forced_alignment --> html_ids
71
+ routes_init --> components_keyboard_config
72
+ routes_init --> components_step_renderer
71
73
  routes_init --> components_handlers
74
+ routes_init --> routes_forced_alignment
72
75
  routes_init --> components_sync_controls
73
- routes_init --> services_forced_alignment
74
76
  routes_init --> html_ids
75
- routes_init --> routes_forced_alignment
76
- routes_init --> components_keyboard_config
77
77
  routes_init --> models
78
78
  routes_init --> routes_chrome
79
- routes_init --> components_step_renderer
79
+ routes_init --> services_forced_alignment
80
80
  ```
81
81
 
82
82
  *30 cross-module dependencies detected*
@@ -637,6 +637,14 @@ def init_segment_align_routers(
637
637
  Internally creates services, initializes sub-library routers,
638
638
  wires mutation wrappers, chrome switching, forced alignment,
639
639
  and job monitor integration.
640
+
641
+ Routes the wrapped segmentation handlers (init + mutations) through
642
+ segmentation's `wrapped_handlers` parameter — not via duplicate-route
643
+ overrides — so segmentation registers each URL exactly once and the
644
+ wrappers fire deterministically. `compute_segmentation_urls` resolves
645
+ the chicken-and-egg dependency between URL bundle and wrapper construction
646
+ (FA, JM, chrome need seg_urls; wrappers need fa_toggle_url + switch_chrome_url;
647
+ segmentation needs wrappers).
640
648
  """
641
649
  ```
642
650
 
@@ -0,0 +1 @@
1
+ __version__ = "0.0.34"
@@ -17,7 +17,9 @@ from cjm_workflow_state.state_store import SQLiteWorkflowStateStore
17
17
  from cjm_fasthtml_interactions.core.state_store import get_session_id
18
18
 
19
19
  # Sub-library route init
20
- from cjm_transcript_segmentation.routes.init import init_segmentation_routers
20
+ from cjm_transcript_segmentation.routes.init import (
21
+ init_segmentation_routers, compute_segmentation_urls,
22
+ )
21
23
  from cjm_transcript_segmentation.services.segmentation import SegmentationService
22
24
  from cjm_transcript_segmentation.models import SegmentationUrls
23
25
  from cjm_transcript_vad_align.routes.init import init_alignment_routers
@@ -79,6 +81,14 @@ def init_segment_align_routers(
79
81
  Internally creates services, initializes sub-library routers,
80
82
  wires mutation wrappers, chrome switching, forced alignment,
81
83
  and job monitor integration.
84
+
85
+ Routes the wrapped segmentation handlers (init + mutations) through
86
+ segmentation's `wrapped_handlers` parameter — not via duplicate-route
87
+ overrides — so segmentation registers each URL exactly once and the
88
+ wrappers fire deterministically. `compute_segmentation_urls` resolves
89
+ the chicken-and-egg dependency between URL bundle and wrapper construction
90
+ (FA, JM, chrome need seg_urls; wrappers need fa_toggle_url + switch_chrome_url;
91
+ segmentation needs wrappers).
82
92
  """
83
93
  # -----------------------------------------------------------------
84
94
  # 1. Create services
@@ -87,9 +97,15 @@ def init_segment_align_routers(
87
97
  alignment_service = AlignmentService(plugin_manager, vad_plugin)
88
98
 
89
99
  # -----------------------------------------------------------------
90
- # 2. Initialize sub-library routers
100
+ # 2. Compute segmentation URLs upfront (without registering routes).
101
+ # Lets FA / JM / chrome receive populated URLs at construction time
102
+ # and lets wrappers be built before init_segmentation_routers runs.
103
+ # -----------------------------------------------------------------
104
+ seg_urls = compute_segmentation_urls(prefix=f"{prefix}/seg")
105
+
106
+ # -----------------------------------------------------------------
107
+ # 3. Alignment routers (with combined init wrapper via wrapped_init parameter)
91
108
  # -----------------------------------------------------------------
92
- # Alignment routers (with combined init wrapper)
93
109
  wrapped_align_init = create_align_init_chrome_wrapper(should_play_fn=SHOULD_PLAY_FN)
94
110
 
95
111
  align_routers, align_urls, align_routes = init_alignment_routers(
@@ -102,18 +118,8 @@ def init_segment_align_routers(
102
118
  wrapped_init=wrapped_align_init,
103
119
  )
104
120
 
105
- # Segmentation routers (without mutation wrappers — need FA URLs first)
106
- seg_routers, seg_urls, seg_routes = init_segmentation_routers(
107
- state_store=state_store,
108
- workflow_id=workflow_id,
109
- source_service=source_service,
110
- segmentation_service=segmentation_service,
111
- prefix=f"{prefix}/seg",
112
- max_history_depth=max_history_depth,
113
- )
114
-
115
121
  # -----------------------------------------------------------------
116
- # 3. Forced alignment service + toggle route
122
+ # 4. Forced alignment service + toggle route
117
123
  # -----------------------------------------------------------------
118
124
  fa_is_available = False
119
125
  fa_toggle_url = ""
@@ -142,9 +148,9 @@ def init_segment_align_routers(
142
148
  fa_routers = [fa_router]
143
149
  fa_toggle_url = fa_routes["toggle"].to()
144
150
 
145
- # ----------------------------------------------------------------
146
- # 4. Job monitor routes for FA
147
- # ----------------------------------------------------------------
151
+ # -----------------------------------------------------------------
152
+ # 5. Job monitor routes for FA
153
+ # -----------------------------------------------------------------
148
154
  monitor_service = JobMonitorService(
149
155
  queue=job_queue,
150
156
  manager=plugin_manager,
@@ -189,7 +195,7 @@ def init_segment_align_routers(
189
195
  sse_headers = list(get_sse_headers())
190
196
 
191
197
  # -----------------------------------------------------------------
192
- # 5. Chrome switching router
198
+ # 6. Chrome switching router
193
199
  # -----------------------------------------------------------------
194
200
  chrome_router, chrome_routes = init_chrome_router(
195
201
  state_store=state_store,
@@ -204,53 +210,14 @@ def init_segment_align_routers(
204
210
  switch_chrome_url = chrome_routes["switch_chrome"].to()
205
211
 
206
212
  # -----------------------------------------------------------------
207
- # 6. Mutation wrappers + override routes
213
+ # 7. Build wrapped handlers (init + mutations) for segmentation
208
214
  # -----------------------------------------------------------------
209
- wrapped_handlers = create_seg_mutation_wrappers(
215
+ wrapped_mutation_handlers = create_seg_mutation_wrappers(
210
216
  jm_trigger=jm_trigger_el,
211
217
  fa_toggle_url=fa_toggle_url,
212
218
  fa_available=fa_is_available,
213
219
  )
214
220
 
215
- seg_mutation_router = APIRouter(prefix=f"{prefix}/seg/workflow")
216
-
217
- @seg_mutation_router
218
- async def split(request, sess, segment_index: int):
219
- return await wrapped_handlers["split"](
220
- state_store, workflow_id, request, sess, segment_index,
221
- urls=seg_urls, max_history_depth=max_history_depth,
222
- )
223
-
224
- @seg_mutation_router
225
- async def merge(request, sess, segment_index: int):
226
- return await wrapped_handlers["merge"](
227
- state_store, workflow_id, request, sess, segment_index,
228
- urls=seg_urls, max_history_depth=max_history_depth,
229
- )
230
-
231
- @seg_mutation_router
232
- async def undo(request, sess):
233
- return await wrapped_handlers["undo"](
234
- state_store, workflow_id, request, sess, urls=seg_urls,
235
- )
236
-
237
- @seg_mutation_router
238
- async def reset(request, sess):
239
- return await wrapped_handlers["reset"](
240
- state_store, workflow_id, request, sess,
241
- urls=seg_urls, max_history_depth=max_history_depth,
242
- )
243
-
244
- @seg_mutation_router
245
- async def ai_split(request, sess):
246
- return await wrapped_handlers["ai_split"](
247
- state_store, workflow_id, segmentation_service, request, sess,
248
- urls=seg_urls, max_history_depth=max_history_depth,
249
- )
250
-
251
- # -----------------------------------------------------------------
252
- # 7. Seg init wrapper (combined KB system + shared chrome)
253
- # -----------------------------------------------------------------
254
221
  wrapped_seg_init = create_seg_init_chrome_wrapper(
255
222
  align_urls=align_urls,
256
223
  switch_chrome_url=switch_chrome_url,
@@ -259,17 +226,29 @@ def init_segment_align_routers(
259
226
  fa_available=fa_is_available,
260
227
  )
261
228
 
262
- seg_init_router = APIRouter(prefix=f"{prefix}/seg/workflow")
229
+ seg_wrapped_handlers = {
230
+ "init": wrapped_seg_init,
231
+ **wrapped_mutation_handlers,
232
+ }
263
233
 
264
- @seg_init_router
265
- async def init(request, sess):
266
- return await wrapped_seg_init(
267
- state_store, workflow_id, source_service, segmentation_service,
268
- request, sess, urls=seg_urls,
269
- )
234
+ # -----------------------------------------------------------------
235
+ # 8. Initialize segmentation routers WITH wrapped handlers + pre-computed URLs.
236
+ # Segmentation registers each URL exactly once, binding wrapped handlers
237
+ # natively — no duplicate-route override pattern, no resolution-order fragility.
238
+ # -----------------------------------------------------------------
239
+ seg_routers, seg_urls, seg_routes = init_segmentation_routers(
240
+ state_store=state_store,
241
+ workflow_id=workflow_id,
242
+ source_service=source_service,
243
+ segmentation_service=segmentation_service,
244
+ prefix=f"{prefix}/seg",
245
+ max_history_depth=max_history_depth,
246
+ wrapped_handlers=seg_wrapped_handlers,
247
+ urls=seg_urls,
248
+ )
270
249
 
271
250
  # -----------------------------------------------------------------
272
- # 8. Build render closure (checks for in-flight jobs on each render)
251
+ # 9. Build render closure (checks for in-flight jobs on each render)
273
252
  # -----------------------------------------------------------------
274
253
  def _render_step(ctx):
275
254
  """Pre-configured render callable for the combined step."""
@@ -311,11 +290,10 @@ def init_segment_align_routers(
311
290
  )
312
291
 
313
292
  # -----------------------------------------------------------------
314
- # 9. Assemble and return
293
+ # 10. Assemble and return
315
294
  # -----------------------------------------------------------------
316
295
  all_routers = (
317
296
  [chrome_router] + fa_routers + jm_routers +
318
- [seg_mutation_router, seg_init_router] +
319
297
  seg_routers + align_routers
320
298
  )
321
299
 
@@ -333,4 +311,3 @@ def init_segment_align_routers(
333
311
  )
334
312
 
335
313
  return all_routers, result
336
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cjm-transcript-segment-align
3
- Version: 0.0.32
3
+ Version: 0.0.34
4
4
  Summary: FastHTML dual-column text segmentation & VAD alignment UI for transcript decomposition workflows with forced alignment-based text splitting for aligning text segments with VAD chunks.
5
5
  Author-email: "Christian J. Mills" <9126128+cj-mills@users.noreply.github.com>
6
6
  License: Apache-2.0
@@ -16,15 +16,15 @@ Requires-Python: >=3.12
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: python-fasthtml
19
- Requires-Dist: cjm-fasthtml-app-core>=0.0.17
20
- Requires-Dist: cjm-plugin-system
21
- Requires-Dist: cjm_transcription_plugin_system
22
- Requires-Dist: cjm_transcript_segmentation>=0.0.22
23
- Requires-Dist: cjm_transcript_vad_align>=0.0.28
24
- Requires-Dist: cjm_fasthtml_keyboard_navigation>=0.0.22
25
- Requires-Dist: cjm_fasthtml_job_monitor>=0.0.11
26
- Requires-Dist: cjm_fasthtml_web_audio>=0.0.11
27
- Requires-Dist: cjm_fasthtml_design_system>=0.0.8
19
+ Requires-Dist: cjm-fasthtml-app-core>=0.0.19
20
+ Requires-Dist: cjm-plugin-system>=0.0.30
21
+ Requires-Dist: cjm_transcription_plugin_system>=0.0.15
22
+ Requires-Dist: cjm_transcript_segmentation>=0.0.25
23
+ Requires-Dist: cjm_transcript_vad_align>=0.0.30
24
+ Requires-Dist: cjm_fasthtml_keyboard_navigation>=0.0.25
25
+ Requires-Dist: cjm_fasthtml_job_monitor>=0.0.14
26
+ Requires-Dist: cjm_fasthtml_web_audio>=0.0.14
27
+ Requires-Dist: cjm_fasthtml_design_system>=0.0.11
28
28
  Dynamic: license-file
29
29
 
30
30
  # cjm-transcript-segment-align
@@ -77,35 +77,35 @@ graph LR
77
77
  services_forced_alignment[services.forced_alignment<br/>forced_alignment]
78
78
 
79
79
  components_handlers --> components_step_renderer
80
- components_handlers --> services_forced_alignment
81
- components_handlers --> html_ids
82
80
  components_handlers --> components_keyboard_config
81
+ components_handlers --> services_forced_alignment
83
82
  components_handlers --> components_sync_controls
83
+ components_handlers --> html_ids
84
84
  components_handlers --> routes_forced_alignment
85
85
  components_keyboard_config --> components_sync_controls
86
86
  components_keyboard_config --> html_ids
87
- components_step_renderer --> html_ids
88
87
  components_step_renderer --> components_keyboard_config
89
- components_step_renderer --> components_sync_controls
90
- components_step_renderer --> components_toolbar_state
91
88
  components_step_renderer --> components_helpers
89
+ components_step_renderer --> components_toolbar_state
90
+ components_step_renderer --> components_sync_controls
91
+ components_step_renderer --> html_ids
92
92
  components_toolbar_state --> components_sync_controls
93
93
  routes_chrome --> components_step_renderer
94
94
  routes_chrome --> components_handlers
95
- routes_chrome --> html_ids
96
95
  routes_chrome --> components_sync_controls
96
+ routes_chrome --> html_ids
97
97
  routes_forced_alignment --> components_step_renderer
98
- routes_forced_alignment --> html_ids
99
98
  routes_forced_alignment --> components_sync_controls
99
+ routes_forced_alignment --> html_ids
100
+ routes_init --> components_keyboard_config
101
+ routes_init --> components_step_renderer
100
102
  routes_init --> components_handlers
103
+ routes_init --> routes_forced_alignment
101
104
  routes_init --> components_sync_controls
102
- routes_init --> services_forced_alignment
103
105
  routes_init --> html_ids
104
- routes_init --> routes_forced_alignment
105
- routes_init --> components_keyboard_config
106
106
  routes_init --> models
107
107
  routes_init --> routes_chrome
108
- routes_init --> components_step_renderer
108
+ routes_init --> services_forced_alignment
109
109
  ```
110
110
 
111
111
  *30 cross-module dependencies detected*
@@ -666,6 +666,14 @@ def init_segment_align_routers(
666
666
  Internally creates services, initializes sub-library routers,
667
667
  wires mutation wrappers, chrome switching, forced alignment,
668
668
  and job monitor integration.
669
+
670
+ Routes the wrapped segmentation handlers (init + mutations) through
671
+ segmentation's `wrapped_handlers` parameter — not via duplicate-route
672
+ overrides — so segmentation registers each URL exactly once and the
673
+ wrappers fire deterministically. `compute_segmentation_urls` resolves
674
+ the chicken-and-egg dependency between URL bundle and wrapper construction
675
+ (FA, JM, chrome need seg_urls; wrappers need fa_toggle_url + switch_chrome_url;
676
+ segmentation needs wrappers).
669
677
  """
670
678
  ```
671
679
 
@@ -0,0 +1,10 @@
1
+ python-fasthtml
2
+ cjm-fasthtml-app-core>=0.0.19
3
+ cjm-plugin-system>=0.0.30
4
+ cjm_transcription_plugin_system>=0.0.15
5
+ cjm_transcript_segmentation>=0.0.25
6
+ cjm_transcript_vad_align>=0.0.30
7
+ cjm_fasthtml_keyboard_navigation>=0.0.25
8
+ cjm_fasthtml_job_monitor>=0.0.14
9
+ cjm_fasthtml_web_audio>=0.0.14
10
+ cjm_fasthtml_design_system>=0.0.11
@@ -12,7 +12,7 @@ license = {text = "Apache-2.0"}
12
12
  authors = [{name = "Christian J. Mills", email = "9126128+cj-mills@users.noreply.github.com"}]
13
13
  keywords = ['nbdev', 'jupyter', 'notebook', 'python']
14
14
  classifiers = ["Natural Language :: English", "Intended Audience :: Developers", "Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only"]
15
- dependencies = ['python-fasthtml', 'cjm-fasthtml-app-core>=0.0.17', 'cjm-plugin-system', 'cjm_transcription_plugin_system', 'cjm_transcript_segmentation>=0.0.22', 'cjm_transcript_vad_align>=0.0.28', 'cjm_fasthtml_keyboard_navigation>=0.0.22', 'cjm_fasthtml_job_monitor>=0.0.11', 'cjm_fasthtml_web_audio>=0.0.11', 'cjm_fasthtml_design_system>=0.0.8']
15
+ dependencies = ['python-fasthtml', 'cjm-fasthtml-app-core>=0.0.19', 'cjm-plugin-system>=0.0.30', 'cjm_transcription_plugin_system>=0.0.15', 'cjm_transcript_segmentation>=0.0.25', 'cjm_transcript_vad_align>=0.0.30', 'cjm_fasthtml_keyboard_navigation>=0.0.25', 'cjm_fasthtml_job_monitor>=0.0.14', 'cjm_fasthtml_web_audio>=0.0.14', 'cjm_fasthtml_design_system>=0.0.11']
16
16
 
17
17
  [project.urls]
18
18
  Repository = "https://github.com/cj-mills/cjm-transcript-segment-align"
@@ -1 +0,0 @@
1
- __version__ = "0.0.32"
@@ -1,10 +0,0 @@
1
- python-fasthtml
2
- cjm-fasthtml-app-core>=0.0.17
3
- cjm-plugin-system
4
- cjm_transcription_plugin_system
5
- cjm_transcript_segmentation>=0.0.22
6
- cjm_transcript_vad_align>=0.0.28
7
- cjm_fasthtml_keyboard_navigation>=0.0.22
8
- cjm_fasthtml_job_monitor>=0.0.11
9
- cjm_fasthtml_web_audio>=0.0.11
10
- cjm_fasthtml_design_system>=0.0.8