detached 0947903

feat(web): recent actions on the summary and visible status marks (#25)

commit
09479031802551efcc45e4ac5c1782372a8df4f3
author
brice · · 2026-10-14 15:58 UTC
committer
bnema · · 2026-10-14 15:58 UTC
parent
dd8597a
signature
SSH UnverifiedSHA256:VOCA5lYARHcbKDZ7GhTV45VmcjWnJ6ZQIBazj17LivA The key is unknown
13 files · +1125 -656
M internal/adapters/kvstore/ci.go +21 -8
@@ -660,19 +660,32 @@ func (c *CI) ListRuns(ctx context.Context, repo domain.RepoName, before int64, l
660660 if before > 0 {
661661 end = runKey(repo, before)
662662 }
663- // Collect then reverse: the snapshot iterates in key order only.
664- var all []domain.CIRun
663+ // The snapshot iterates in key order only: keep the last limit items in a
664+ // ring and decode only those, so the cost of a page does not grow with the
665+ // decoded history of the repository.
666+ type entry struct {
667+ key []byte
668+ item kv.Item
669+ }
670+ var ring []entry
671+ next := 0
665672 for key, item := range c.db.Snapshot(ctx).Range(ctx, start, end) {
666- r, err := decodeRun(item)
673+ if limit <= 0 || len(ring) < limit {
674+ ring = append(ring, entry{key, item})
675+ continue
676+ }
677+ ring[next] = entry{key, item}
678+ next = (next + 1) % limit
679+ }
680+ ordered := append(ring[next:len(ring):len(ring)], ring[:next]...)
681+ all := make([]domain.CIRun, 0, len(ordered))
682+ for i := len(ordered) - 1; i >= 0; i-- {
683+ r, err := decodeRun(ordered[i].item)
667684 if err != nil {
668- return nil, fmt.Errorf("decode %s: %w", key, err)
685+ return nil, fmt.Errorf("decode %s: %w", ordered[i].key, err)
669686 }
670687 all = append(all, r)
671688 }
672- slices.Reverse(all)
673- if limit > 0 && len(all) > limit {
674- all = all[:limit]
675- }
676689 return all, nil
677690 }
678691
@@ -660,19 +660,32 @@ func (c *CI) ListRuns(ctx context.Context, repo domain.RepoName, before int64, l
660 if before > 0 {660 if before > 0 {
661 end = runKey(repo, before)661 end = runKey(repo, before)
662 }662 }
663- // Collect then reverse: the snapshot iterates in key order only.663+ // The snapshot iterates in key order only: keep the last limit items in a
664- var all []domain.CIRun664+ // ring and decode only those, so the cost of a page does not grow with the
665+ // decoded history of the repository.
666+ type entry struct {
667+ key []byte
668+ item kv.Item
669+ }
670+ var ring []entry
671+ next := 0
665 for key, item := range c.db.Snapshot(ctx).Range(ctx, start, end) {672 for key, item := range c.db.Snapshot(ctx).Range(ctx, start, end) {
666- r, err := decodeRun(item)673+ if limit <= 0 || len(ring) < limit {
674+ ring = append(ring, entry{key, item})
675+ continue
676+ }
677+ ring[next] = entry{key, item}
678+ next = (next + 1) % limit
679+ }
680+ ordered := append(ring[next:len(ring):len(ring)], ring[:next]...)
681+ all := make([]domain.CIRun, 0, len(ordered))
682+ for i := len(ordered) - 1; i >= 0; i-- {
683+ r, err := decodeRun(ordered[i].item)
667 if err != nil {684 if err != nil {
668- return nil, fmt.Errorf("decode %s: %w", key, err)685+ return nil, fmt.Errorf("decode %s: %w", ordered[i].key, err)
669 }686 }
670 all = append(all, r)687 all = append(all, r)
671 }688 }
672- slices.Reverse(all)
673- if limit > 0 && len(all) > limit {
674- all = all[:limit]
675- }
676 return all, nil689 return all, nil
677 }690 }
678 691
M internal/adapters/kvstore/ci_test.go +5 -0
@@ -204,6 +204,11 @@ func TestCIListRunsNewestFirstAndBounded(t *testing.T) {
204204 runs, err = ci.ListRuns(ctx, n, 4, 10)
205205 require.NoError(t, err)
206206 assert.Equal(t, []int64{3, 2}, []int64{runs[0].ID, runs[1].ID})
207+ runs, err = ci.ListRuns(ctx, n, 0, 0)
208+ require.NoError(t, err)
209+ require.Len(t, runs, 5)
210+ assert.Equal(t, int64(6), runs[0].ID)
211+ assert.Equal(t, int64(2), runs[4].ID)
207212 ids, err := ci.RunIDs(ctx, n)
208213 require.NoError(t, err)
209214 assert.Len(t, ids, 5)
@@ -204,6 +204,11 @@ func TestCIListRunsNewestFirstAndBounded(t *testing.T) {
204 runs, err = ci.ListRuns(ctx, n, 4, 10)204 runs, err = ci.ListRuns(ctx, n, 4, 10)
205 require.NoError(t, err)205 require.NoError(t, err)
206 assert.Equal(t, []int64{3, 2}, []int64{runs[0].ID, runs[1].ID})206 assert.Equal(t, []int64{3, 2}, []int64{runs[0].ID, runs[1].ID})
207+ runs, err = ci.ListRuns(ctx, n, 0, 0)
208+ require.NoError(t, err)
209+ require.Len(t, runs, 5)
210+ assert.Equal(t, int64(6), runs[0].ID)
211+ assert.Equal(t, int64(2), runs[4].ID)
207 ids, err := ci.RunIDs(ctx, n)212 ids, err := ci.RunIDs(ctx, n)
208 require.NoError(t, err)213 require.NoError(t, err)
209 assert.Len(t, ids, 5)214 assert.Len(t, ids, 5)
M internal/adapters/web/actions.templ +21 -0
@@ -56,6 +56,27 @@ templ RunListRow(r RunRow) {
5656 </tr>
5757 }
5858
59+// RecentActionsBlock is the "Recent actions" section of the summary rail; its
60+// id is the target of the live updates. Without a run it is hidden.
61+templ RecentActionsBlock(a RecentActions) {
62+ <section id="recent-actions" aria-labelledby="r-actions" hidden?={ len(a.Runs) == 0 }>
63+ <h2 id="r-actions">Recent actions <a href={ templ.SafeURL(a.AllHref) }>View all</a></h2>
64+ <ul class="rruns">
65+ for _, r := range a.Runs {
66+ <li>
67+ @CheckIcon(r.Kind, r.State)
68+ <a class="rr-name" href={ templ.SafeURL(r.Href) } title={ r.Workflow + " " + r.Number + " · " + r.State }>{ r.Workflow }</a>
69+ <span class="mute">{ r.Number }</span>
70+ <a class="rr-ref" href={ templ.SafeURL(r.RefHref) }>{ r.Ref }</a>
71+ if r.WhenAt != "" {
72+ <time class="dim" datetime={ r.WhenAt } title={ r.WhenAt }>{ r.When }</time>
73+ }
74+ </li>
75+ }
76+ </ul>
77+ </section>
78+}
79+
5980 templ RunDetail(l Layout, p RunPage) {
6081 @Shell(l, runRail(p)) {
6182 @LiveSlot("run-notice")
@@ -56,6 +56,27 @@ templ RunListRow(r RunRow) {
56 </tr>56 </tr>
57 }57 }
58 58
59+// RecentActionsBlock is the "Recent actions" section of the summary rail; its
60+// id is the target of the live updates. Without a run it is hidden.
61+templ RecentActionsBlock(a RecentActions) {
62+ <section id="recent-actions" aria-labelledby="r-actions" hidden?={ len(a.Runs) == 0 }>
63+ <h2 id="r-actions">Recent actions <a href={ templ.SafeURL(a.AllHref) }>View all</a></h2>
64+ <ul class="rruns">
65+ for _, r := range a.Runs {
66+ <li>
67+ @CheckIcon(r.Kind, r.State)
68+ <a class="rr-name" href={ templ.SafeURL(r.Href) } title={ r.Workflow + " " + r.Number + " · " + r.State }>{ r.Workflow }</a>
69+ <span class="mute">{ r.Number }</span>
70+ <a class="rr-ref" href={ templ.SafeURL(r.RefHref) }>{ r.Ref }</a>
71+ if r.WhenAt != "" {
72+ <time class="dim" datetime={ r.WhenAt } title={ r.WhenAt }>{ r.When }</time>
73+ }
74+ </li>
75+ }
76+ </ul>
77+ </section>
78+}
79+
59 templ RunDetail(l Layout, p RunPage) {80 templ RunDetail(l Layout, p RunPage) {
60 @Shell(l, runRail(p)) {81 @Shell(l, runRail(p)) {
61 @LiveSlot("run-notice")82 @LiveSlot("run-notice")
M internal/adapters/web/actions_templ.go +808 -609
@@ -446,7 +446,9 @@ func RunListRow(r RunRow) templ.Component {
446446 })
447447 }
448448
449-func RunDetail(l Layout, p RunPage) templ.Component {
449+// RecentActionsBlock is the "Recent actions" section of the summary rail; its
450+// id is the target of the live updates. Without a run it is hidden.
451+func RecentActionsBlock(a RecentActions) templ.Component {
450452 return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
451453 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
452454 if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
@@ -467,7 +469,204 @@ func RunDetail(l Layout, p RunPage) templ.Component {
467469 templ_7745c5c3_Var27 = templ.NopComponent
468470 }
469471 ctx = templ.ClearChildren(ctx)
470- templ_7745c5c3_Var28 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
472+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section id=\"recent-actions\" aria-labelledby=\"r-actions\"")
473+ if templ_7745c5c3_Err != nil {
474+ return templ_7745c5c3_Err
475+ }
476+ if len(a.Runs) == 0 {
477+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " hidden")
478+ if templ_7745c5c3_Err != nil {
479+ return templ_7745c5c3_Err
480+ }
481+ }
482+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "><h2 id=\"r-actions\">Recent actions <a href=\"")
483+ if templ_7745c5c3_Err != nil {
484+ return templ_7745c5c3_Err
485+ }
486+ var templ_7745c5c3_Var28 templ.SafeURL
487+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.AllHref))
488+ if templ_7745c5c3_Err != nil {
489+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 63, Col: 70}
490+ }
491+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
492+ if templ_7745c5c3_Err != nil {
493+ return templ_7745c5c3_Err
494+ }
495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\">View all</a></h2><ul class=\"rruns\">")
496+ if templ_7745c5c3_Err != nil {
497+ return templ_7745c5c3_Err
498+ }
499+ for _, r := range a.Runs {
500+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<li>")
501+ if templ_7745c5c3_Err != nil {
502+ return templ_7745c5c3_Err
503+ }
504+ templ_7745c5c3_Err = CheckIcon(r.Kind, r.State).Render(ctx, templ_7745c5c3_Buffer)
505+ if templ_7745c5c3_Err != nil {
506+ return templ_7745c5c3_Err
507+ }
508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<a class=\"rr-name\" href=\"")
509+ if templ_7745c5c3_Err != nil {
510+ return templ_7745c5c3_Err
511+ }
512+ var templ_7745c5c3_Var29 templ.SafeURL
513+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
514+ if templ_7745c5c3_Err != nil {
515+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 52}
516+ }
517+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
518+ if templ_7745c5c3_Err != nil {
519+ return templ_7745c5c3_Err
520+ }
521+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "\" title=\"")
522+ if templ_7745c5c3_Err != nil {
523+ return templ_7745c5c3_Err
524+ }
525+ var templ_7745c5c3_Var30 string
526+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.Workflow + " " + r.Number + " · " + r.State)
527+ if templ_7745c5c3_Err != nil {
528+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 109}
529+ }
530+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30)
531+ if templ_7745c5c3_Err != nil {
532+ return templ_7745c5c3_Err
533+ }
534+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "\">")
535+ if templ_7745c5c3_Err != nil {
536+ return templ_7745c5c3_Err
537+ }
538+ var templ_7745c5c3_Var31 string
539+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Workflow)
540+ if templ_7745c5c3_Err != nil {
541+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 124}
542+ }
543+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
544+ if templ_7745c5c3_Err != nil {
545+ return templ_7745c5c3_Err
546+ }
547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</a> <span class=\"mute\">")
548+ if templ_7745c5c3_Err != nil {
549+ return templ_7745c5c3_Err
550+ }
551+ var templ_7745c5c3_Var32 string
552+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Number)
553+ if templ_7745c5c3_Err != nil {
554+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 69, Col: 34}
555+ }
556+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
557+ if templ_7745c5c3_Err != nil {
558+ return templ_7745c5c3_Err
559+ }
560+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</span> <a class=\"rr-ref\" href=\"")
561+ if templ_7745c5c3_Err != nil {
562+ return templ_7745c5c3_Err
563+ }
564+ var templ_7745c5c3_Var33 templ.SafeURL
565+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.RefHref))
566+ if templ_7745c5c3_Err != nil {
567+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 70, Col: 54}
568+ }
569+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
570+ if templ_7745c5c3_Err != nil {
571+ return templ_7745c5c3_Err
572+ }
573+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\">")
574+ if templ_7745c5c3_Err != nil {
575+ return templ_7745c5c3_Err
576+ }
577+ var templ_7745c5c3_Var34 string
578+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Ref)
579+ if templ_7745c5c3_Err != nil {
580+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 70, Col: 64}
581+ }
582+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
583+ if templ_7745c5c3_Err != nil {
584+ return templ_7745c5c3_Err
585+ }
586+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a> ")
587+ if templ_7745c5c3_Err != nil {
588+ return templ_7745c5c3_Err
589+ }
590+ if r.WhenAt != "" {
591+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<time class=\"dim\" datetime=\"")
592+ if templ_7745c5c3_Err != nil {
593+ return templ_7745c5c3_Err
594+ }
595+ var templ_7745c5c3_Var35 string
596+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
597+ if templ_7745c5c3_Err != nil {
598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 43}
599+ }
600+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
601+ if templ_7745c5c3_Err != nil {
602+ return templ_7745c5c3_Err
603+ }
604+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\" title=\"")
605+ if templ_7745c5c3_Err != nil {
606+ return templ_7745c5c3_Err
607+ }
608+ var templ_7745c5c3_Var36 string
609+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
610+ if templ_7745c5c3_Err != nil {
611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 62}
612+ }
613+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)
614+ if templ_7745c5c3_Err != nil {
615+ return templ_7745c5c3_Err
616+ }
617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\">")
618+ if templ_7745c5c3_Err != nil {
619+ return templ_7745c5c3_Err
620+ }
621+ var templ_7745c5c3_Var37 string
622+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
623+ if templ_7745c5c3_Err != nil {
624+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 73}
625+ }
626+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
627+ if templ_7745c5c3_Err != nil {
628+ return templ_7745c5c3_Err
629+ }
630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</time>")
631+ if templ_7745c5c3_Err != nil {
632+ return templ_7745c5c3_Err
633+ }
634+ }
635+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</li>")
636+ if templ_7745c5c3_Err != nil {
637+ return templ_7745c5c3_Err
638+ }
639+ }
640+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</ul></section>")
641+ if templ_7745c5c3_Err != nil {
642+ return templ_7745c5c3_Err
643+ }
644+ return nil
645+ })
646+}
647+
648+func RunDetail(l Layout, p RunPage) templ.Component {
649+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
650+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
651+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
652+ return templ_7745c5c3_CtxErr
653+ }
654+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
655+ if !templ_7745c5c3_IsBuffer {
656+ defer func() {
657+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
658+ if templ_7745c5c3_Err == nil {
659+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
660+ }
661+ }()
662+ }
663+ ctx = templ.InitializeContext(ctx)
664+ templ_7745c5c3_Var38 := templ.GetChildren(ctx)
665+ if templ_7745c5c3_Var38 == nil {
666+ templ_7745c5c3_Var38 = templ.NopComponent
667+ }
668+ ctx = templ.ClearChildren(ctx)
669+ templ_7745c5c3_Var39 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
471670 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
472671 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
473672 if !templ_7745c5c3_IsBuffer {
@@ -483,7 +682,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
483682 if templ_7745c5c3_Err != nil {
484683 return templ_7745c5c3_Err
485684 }
486- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, " <div id=\"run-body\">")
685+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, " <div id=\"run-body\">")
487686 if templ_7745c5c3_Err != nil {
488687 return templ_7745c5c3_Err
489688 }
@@ -491,7 +690,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
491690 if templ_7745c5c3_Err != nil {
492691 return templ_7745c5c3_Err
493692 }
494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</div>")
693+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</div>")
495694 if templ_7745c5c3_Err != nil {
496695 return templ_7745c5c3_Err
497696 }
@@ -501,7 +700,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
501700 }
502701 return nil
503702 })
504- templ_7745c5c3_Err = Shell(l, runRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var28), templ_7745c5c3_Buffer)
703+ templ_7745c5c3_Err = Shell(l, runRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var39), templ_7745c5c3_Buffer)
505704 if templ_7745c5c3_Err != nil {
506705 return templ_7745c5c3_Err
507706 }
@@ -526,12 +725,12 @@ func runBodyFragment(p RunPage) templ.Component {
526725 }()
527726 }
528727 ctx = templ.InitializeContext(ctx)
529- templ_7745c5c3_Var29 := templ.GetChildren(ctx)
530- if templ_7745c5c3_Var29 == nil {
531- templ_7745c5c3_Var29 = templ.NopComponent
728+ templ_7745c5c3_Var40 := templ.GetChildren(ctx)
729+ if templ_7745c5c3_Var40 == nil {
730+ templ_7745c5c3_Var40 = templ.NopComponent
532731 }
533732 ctx = templ.ClearChildren(ctx)
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div id=\"run-body\">")
733+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<div id=\"run-body\">")
535734 if templ_7745c5c3_Err != nil {
536735 return templ_7745c5c3_Err
537736 }
@@ -539,7 +738,7 @@ func runBodyFragment(p RunPage) templ.Component {
539738 if templ_7745c5c3_Err != nil {
540739 return templ_7745c5c3_Err
541740 }
542- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</div>")
741+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</div>")
543742 if templ_7745c5c3_Err != nil {
544743 return templ_7745c5c3_Err
545744 }
@@ -564,12 +763,12 @@ func RunBody(p RunPage) templ.Component {
564763 }()
565764 }
566765 ctx = templ.InitializeContext(ctx)
567- templ_7745c5c3_Var30 := templ.GetChildren(ctx)
568- if templ_7745c5c3_Var30 == nil {
569- templ_7745c5c3_Var30 = templ.NopComponent
766+ templ_7745c5c3_Var41 := templ.GetChildren(ctx)
767+ if templ_7745c5c3_Var41 == nil {
768+ templ_7745c5c3_Var41 = templ.NopComponent
570769 }
571770 ctx = templ.ClearChildren(ctx)
572- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<h2 class=\"run-h\">")
771+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<h2 class=\"run-h\">")
573772 if templ_7745c5c3_Err != nil {
574773 return templ_7745c5c3_Err
575774 }
@@ -577,70 +776,70 @@ func RunBody(p RunPage) templ.Component {
577776 if templ_7745c5c3_Err != nil {
578777 return templ_7745c5c3_Err
579778 }
580- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<span>")
779+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "<span>")
581780 if templ_7745c5c3_Err != nil {
582781 return templ_7745c5c3_Err
583782 }
584- var templ_7745c5c3_Var31 string
585- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(p.Workflow)
783+ var templ_7745c5c3_Var42 string
784+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(p.Workflow)
586785 if templ_7745c5c3_Err != nil {
587- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 78, Col: 64}
786+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 99, Col: 64}
588787 }
589- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
788+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
590789 if templ_7745c5c3_Err != nil {
591790 return templ_7745c5c3_Err
592791 }
593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</span> <span class=\"mute\">")
792+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</span> <span class=\"mute\">")
594793 if templ_7745c5c3_Err != nil {
595794 return templ_7745c5c3_Err
596795 }
597- var templ_7745c5c3_Var32 string
598- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(p.Number)
796+ var templ_7745c5c3_Var43 string
797+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(p.Number)
599798 if templ_7745c5c3_Err != nil {
600- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 78, Col: 103}
799+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 99, Col: 103}
601800 }
602- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
801+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
603802 if templ_7745c5c3_Err != nil {
604803 return templ_7745c5c3_Err
605804 }
606- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</span></h2>")
805+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</span></h2>")
607806 if templ_7745c5c3_Err != nil {
608807 return templ_7745c5c3_Err
609808 }
610809 if p.Error != "" {
611- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<pre class=\"run-err\">")
810+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<pre class=\"run-err\">")
612811 if templ_7745c5c3_Err != nil {
613812 return templ_7745c5c3_Err
614813 }
615- var templ_7745c5c3_Var33 string
616- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(p.Error)
814+ var templ_7745c5c3_Var44 string
815+ templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(p.Error)
617816 if templ_7745c5c3_Err != nil {
618- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 80, Col: 32}
817+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 101, Col: 32}
619818 }
620- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
819+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
621820 if templ_7745c5c3_Err != nil {
622821 return templ_7745c5c3_Err
623822 }
624- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</pre>")
823+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</pre>")
625824 if templ_7745c5c3_Err != nil {
626825 return templ_7745c5c3_Err
627826 }
628827 }
629828 if len(p.Annotations) > 0 {
630- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<section class=\"annots\" aria-labelledby=\"run-annots\"><h3 id=\"run-annots\">Annotations <span class=\"count\">")
829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<section class=\"annots\" aria-labelledby=\"run-annots\"><h3 id=\"run-annots\">Annotations <span class=\"count\">")
631830 if templ_7745c5c3_Err != nil {
632831 return templ_7745c5c3_Err
633832 }
634- var templ_7745c5c3_Var34 string
635- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Annotations)))
833+ var templ_7745c5c3_Var45 string
834+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Annotations)))
636835 if templ_7745c5c3_Err != nil {
637- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 84, Col: 81}
836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 105, Col: 81}
638837 }
639- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
838+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
640839 if templ_7745c5c3_Err != nil {
641840 return templ_7745c5c3_Err
642841 }
643- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</span></h3>")
842+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</span></h3>")
644843 if templ_7745c5c3_Err != nil {
645844 return templ_7745c5c3_Err
646845 }
@@ -648,43 +847,43 @@ func RunBody(p RunPage) templ.Component {
648847 if templ_7745c5c3_Err != nil {
649848 return templ_7745c5c3_Err
650849 }
651- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</section>")
850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</section>")
652851 if templ_7745c5c3_Err != nil {
653852 return templ_7745c5c3_Err
654853 }
655854 }
656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<ul class=\"jobs\">")
855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<ul class=\"jobs\">")
657856 if templ_7745c5c3_Err != nil {
658857 return templ_7745c5c3_Err
659858 }
660859 for _, j := range p.Jobs {
661- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<li id=\"")
860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<li id=\"")
662861 if templ_7745c5c3_Err != nil {
663862 return templ_7745c5c3_Err
664863 }
665- var templ_7745c5c3_Var35 string
666- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue("job-" + j.ID)
864+ var templ_7745c5c3_Var46 string
865+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.ResolveAttributeValue("job-" + j.ID)
667866 if templ_7745c5c3_Err != nil {
668- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 90, Col: 25}
867+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 111, Col: 25}
669868 }
670- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
869+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var46)
671870 if templ_7745c5c3_Err != nil {
672871 return templ_7745c5c3_Err
673872 }
674- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\"><a class=\"job-h\" href=\"")
873+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\"><a class=\"job-h\" href=\"")
675874 if templ_7745c5c3_Err != nil {
676875 return templ_7745c5c3_Err
677876 }
678- var templ_7745c5c3_Var36 templ.SafeURL
679- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.Href))
877+ var templ_7745c5c3_Var47 templ.SafeURL
878+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.Href))
680879 if templ_7745c5c3_Err != nil {
681- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 91, Col: 49}
880+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 112, Col: 49}
682881 }
683- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
882+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
684883 if templ_7745c5c3_Err != nil {
685884 return templ_7745c5c3_Err
686885 }
687- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")
886+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")
688887 if templ_7745c5c3_Err != nil {
689888 return templ_7745c5c3_Err
690889 }
@@ -692,118 +891,118 @@ func RunBody(p RunPage) templ.Component {
692891 if templ_7745c5c3_Err != nil {
693892 return templ_7745c5c3_Err
694893 }
695- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<span class=\"j-name\">")
894+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<span class=\"j-name\">")
696895 if templ_7745c5c3_Err != nil {
697896 return templ_7745c5c3_Err
698897 }
699- var templ_7745c5c3_Var37 string
700- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
898+ var templ_7745c5c3_Var48 string
899+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
701900 if templ_7745c5c3_Err != nil {
702- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 93, Col: 34}
901+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 114, Col: 34}
703902 }
704- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
903+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
705904 if templ_7745c5c3_Err != nil {
706905 return templ_7745c5c3_Err
707906 }
708- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</span> <span class=\"dim\">")
907+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</span> <span class=\"dim\">")
709908 if templ_7745c5c3_Err != nil {
710909 return templ_7745c5c3_Err
711910 }
712- var templ_7745c5c3_Var38 string
713- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
911+ var templ_7745c5c3_Var49 string
912+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
714913 if templ_7745c5c3_Err != nil {
715- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 32}
914+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 32}
716915 }
717- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
916+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
718917 if templ_7745c5c3_Err != nil {
719918 return templ_7745c5c3_Err
720919 }
721- var templ_7745c5c3_Var39 string
722- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
920+ var templ_7745c5c3_Var50 string
921+ templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
723922 if templ_7745c5c3_Err != nil {
724- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 39}
923+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 39}
725924 }
726- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
925+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
727926 if templ_7745c5c3_Err != nil {
728927 return templ_7745c5c3_Err
729928 }
730- var templ_7745c5c3_Var40 string
731- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
929+ var templ_7745c5c3_Var51 string
930+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
732931 if templ_7745c5c3_Err != nil {
733- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 53}
932+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 53}
734933 }
735- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
934+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
736935 if templ_7745c5c3_Err != nil {
737936 return templ_7745c5c3_Err
738937 }
739- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</span></a> ")
938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</span></a> ")
740939 if templ_7745c5c3_Err != nil {
741940 return templ_7745c5c3_Err
742941 }
743942 if j.Runner != "" {
744- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<span class=\"mute\">on ")
943+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<span class=\"mute\">on ")
745944 if templ_7745c5c3_Err != nil {
746945 return templ_7745c5c3_Err
747946 }
748- var templ_7745c5c3_Var41 string
749- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(runnerText(j))
947+ var templ_7745c5c3_Var52 string
948+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(runnerText(j))
750949 if templ_7745c5c3_Err != nil {
751- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 97, Col: 42}
950+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 118, Col: 42}
752951 }
753- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
952+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
754953 if templ_7745c5c3_Err != nil {
755954 return templ_7745c5c3_Err
756955 }
757- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</span> ")
956+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</span> ")
758957 if templ_7745c5c3_Err != nil {
759958 return templ_7745c5c3_Err
760959 }
761960 }
762961 if len(j.Needs) > 0 {
763- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<span class=\"mute\">needs ")
962+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<span class=\"mute\">needs ")
764963 if templ_7745c5c3_Err != nil {
765964 return templ_7745c5c3_Err
766965 }
767- var templ_7745c5c3_Var42 string
768- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(joinWords(j.Needs))
966+ var templ_7745c5c3_Var53 string
967+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(joinWords(j.Needs))
769968 if templ_7745c5c3_Err != nil {
770- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 100, Col: 50}
969+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 121, Col: 50}
771970 }
772- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
971+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
773972 if templ_7745c5c3_Err != nil {
774973 return templ_7745c5c3_Err
775974 }
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</span> ")
975+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</span> ")
777976 if templ_7745c5c3_Err != nil {
778977 return templ_7745c5c3_Err
779978 }
780979 }
781980 if j.Error != "" {
782- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "<p class=\"job-err\">")
981+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<p class=\"job-err\">")
783982 if templ_7745c5c3_Err != nil {
784983 return templ_7745c5c3_Err
785984 }
786- var templ_7745c5c3_Var43 string
787- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
985+ var templ_7745c5c3_Var54 string
986+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
788987 if templ_7745c5c3_Err != nil {
789- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 103, Col: 33}
988+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 124, Col: 33}
790989 }
791- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
990+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
792991 if templ_7745c5c3_Err != nil {
793992 return templ_7745c5c3_Err
794993 }
795- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</p>")
994+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</p>")
796995 if templ_7745c5c3_Err != nil {
797996 return templ_7745c5c3_Err
798997 }
799998 }
800999 if len(j.Steps) > 0 {
801- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<ol class=\"steps\">")
1000+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<ol class=\"steps\">")
8021001 if templ_7745c5c3_Err != nil {
8031002 return templ_7745c5c3_Err
8041003 }
8051004 for _, s := range j.Steps {
806- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<li>")
1005+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<li>")
8071006 if templ_7745c5c3_Err != nil {
8081007 return templ_7745c5c3_Err
8091008 }
@@ -811,48 +1010,48 @@ func RunBody(p RunPage) templ.Component {
8111010 if templ_7745c5c3_Err != nil {
8121011 return templ_7745c5c3_Err
8131012 }
814- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<span>")
1013+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<span>")
8151014 if templ_7745c5c3_Err != nil {
8161015 return templ_7745c5c3_Err
8171016 }
818- var templ_7745c5c3_Var44 string
819- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
1017+ var templ_7745c5c3_Var55 string
1018+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
8201019 if templ_7745c5c3_Err != nil {
821- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 108, Col: 53}
1020+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 129, Col: 53}
8221021 }
823- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
1022+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
8241023 if templ_7745c5c3_Err != nil {
8251024 return templ_7745c5c3_Err
8261025 }
827- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</span> <span class=\"dim\">")
1026+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span> <span class=\"dim\">")
8281027 if templ_7745c5c3_Err != nil {
8291028 return templ_7745c5c3_Err
8301029 }
831- var templ_7745c5c3_Var45 string
832- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
1030+ var templ_7745c5c3_Var56 string
1031+ templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
8331032 if templ_7745c5c3_Err != nil {
834- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 108, Col: 93}
1033+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 129, Col: 93}
8351034 }
836- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
1035+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
8371036 if templ_7745c5c3_Err != nil {
8381037 return templ_7745c5c3_Err
8391038 }
840- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</span></li>")
1039+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</span></li>")
8411040 if templ_7745c5c3_Err != nil {
8421041 return templ_7745c5c3_Err
8431042 }
8441043 }
845- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</ol>")
1044+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</ol>")
8461045 if templ_7745c5c3_Err != nil {
8471046 return templ_7745c5c3_Err
8481047 }
8491048 }
850- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</li>")
1049+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</li>")
8511050 if templ_7745c5c3_Err != nil {
8521051 return templ_7745c5c3_Err
8531052 }
8541053 }
855- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</ul>")
1054+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</ul>")
8561055 if templ_7745c5c3_Err != nil {
8571056 return templ_7745c5c3_Err
8581057 }
@@ -880,327 +1079,327 @@ func AnnotationList(anns []AnnotationView, more bool, grouped bool) templ.Compon
8801079 }()
8811080 }
8821081 ctx = templ.InitializeContext(ctx)
883- templ_7745c5c3_Var46 := templ.GetChildren(ctx)
884- if templ_7745c5c3_Var46 == nil {
885- templ_7745c5c3_Var46 = templ.NopComponent
1082+ templ_7745c5c3_Var57 := templ.GetChildren(ctx)
1083+ if templ_7745c5c3_Var57 == nil {
1084+ templ_7745c5c3_Var57 = templ.NopComponent
8861085 }
8871086 ctx = templ.ClearChildren(ctx)
888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<ul class=\"annot-list\">")
1087+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<ul class=\"annot-list\">")
8891088 if templ_7745c5c3_Err != nil {
8901089 return templ_7745c5c3_Err
8911090 }
8921091 for _, a := range anns {
893- var templ_7745c5c3_Var47 = []any{"annot", "annot-" + a.Kind}
894- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var47...)
1092+ var templ_7745c5c3_Var58 = []any{"annot", "annot-" + a.Kind}
1093+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var58...)
8951094 if templ_7745c5c3_Err != nil {
8961095 return templ_7745c5c3_Err
8971096 }
898- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<li class=\"")
1097+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<li class=\"")
8991098 if templ_7745c5c3_Err != nil {
9001099 return templ_7745c5c3_Err
9011100 }
902- var templ_7745c5c3_Var48 string
903- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var47).String())
1101+ var templ_7745c5c3_Var59 string
1102+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var58).String())
9041103 if templ_7745c5c3_Err != nil {
9051104 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
9061105 }
907- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var48)
1106+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
9081107 if templ_7745c5c3_Err != nil {
9091108 return templ_7745c5c3_Err
9101109 }
911- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\">")
1110+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "\">")
9121111 if templ_7745c5c3_Err != nil {
9131112 return templ_7745c5c3_Err
9141113 }
9151114 if grouped && a.StepHead {
916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<p class=\"annot-step\">")
1115+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"annot-step\">")
9171116 if templ_7745c5c3_Err != nil {
9181117 return templ_7745c5c3_Err
9191118 }
9201119 if a.StepHref != "" {
921- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<a href=\"")
1120+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<a href=\"")
9221121 if templ_7745c5c3_Err != nil {
9231122 return templ_7745c5c3_Err
9241123 }
925- var templ_7745c5c3_Var49 templ.SafeURL
926- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.StepHref))
1124+ var templ_7745c5c3_Var60 templ.SafeURL
1125+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.StepHref))
9271126 if templ_7745c5c3_Err != nil {
928- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 128, Col: 42}
1127+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 149, Col: 42}
9291128 }
930- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
1129+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
9311130 if templ_7745c5c3_Err != nil {
9321131 return templ_7745c5c3_Err
9331132 }
934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "\">")
1133+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "\">")
9351134 if templ_7745c5c3_Err != nil {
9361135 return templ_7745c5c3_Err
9371136 }
938- var templ_7745c5c3_Var50 string
939- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
1137+ var templ_7745c5c3_Var61 string
1138+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
9401139 if templ_7745c5c3_Err != nil {
941- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 128, Col: 53}
1140+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 149, Col: 53}
9421141 }
943- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
1142+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
9441143 if templ_7745c5c3_Err != nil {
9451144 return templ_7745c5c3_Err
9461145 }
947- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</a>")
1146+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</a>")
9481147 if templ_7745c5c3_Err != nil {
9491148 return templ_7745c5c3_Err
9501149 }
9511150 } else {
952- var templ_7745c5c3_Var51 string
953- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
1151+ var templ_7745c5c3_Var62 string
1152+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
9541153 if templ_7745c5c3_Err != nil {
955- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 130, Col: 15}
1154+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 151, Col: 15}
9561155 }
957- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1156+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
9581157 if templ_7745c5c3_Err != nil {
9591158 return templ_7745c5c3_Err
9601159 }
9611160 }
962- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</p>")
1161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</p>")
9631162 if templ_7745c5c3_Err != nil {
9641163 return templ_7745c5c3_Err
9651164 }
9661165 }
967- var templ_7745c5c3_Var52 = []any{"an", "an-" + a.Kind}
968- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var52...)
1166+ var templ_7745c5c3_Var63 = []any{"an", "an-" + a.Kind}
1167+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var63...)
9691168 if templ_7745c5c3_Err != nil {
9701169 return templ_7745c5c3_Err
9711170 }
972- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<span class=\"")
1171+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<span class=\"")
9731172 if templ_7745c5c3_Err != nil {
9741173 return templ_7745c5c3_Err
9751174 }
976- var templ_7745c5c3_Var53 string
977- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var52).String())
1175+ var templ_7745c5c3_Var64 string
1176+ templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var63).String())
9781177 if templ_7745c5c3_Err != nil {
9791178 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
9801179 }
981- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var53)
1180+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)
9821181 if templ_7745c5c3_Err != nil {
9831182 return templ_7745c5c3_Err
9841183 }
985- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "\" role=\"img\" aria-label=\"")
1184+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "\" role=\"img\" aria-label=\"")
9861185 if templ_7745c5c3_Err != nil {
9871186 return templ_7745c5c3_Err
9881187 }
989- var templ_7745c5c3_Var54 string
990- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
1188+ var templ_7745c5c3_Var65 string
1189+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
9911190 if templ_7745c5c3_Err != nil {
992- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 134, Col: 72}
1191+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 155, Col: 72}
9931192 }
994- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var54)
1193+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65)
9951194 if templ_7745c5c3_Err != nil {
9961195 return templ_7745c5c3_Err
9971196 }
998- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "\" title=\"")
1197+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "\" title=\"")
9991198 if templ_7745c5c3_Err != nil {
10001199 return templ_7745c5c3_Err
10011200 }
1002- var templ_7745c5c3_Var55 string
1003- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
1201+ var templ_7745c5c3_Var66 string
1202+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
10041203 if templ_7745c5c3_Err != nil {
1005- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 134, Col: 90}
1204+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 155, Col: 90}
10061205 }
1007- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var55)
1206+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var66)
10081207 if templ_7745c5c3_Err != nil {
10091208 return templ_7745c5c3_Err
10101209 }
1011- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "\"></span><div class=\"annot-body\"><p class=\"annot-head\"><span class=\"annot-level\">")
1210+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "\"></span><div class=\"annot-body\"><p class=\"annot-head\"><span class=\"annot-level\">")
10121211 if templ_7745c5c3_Err != nil {
10131212 return templ_7745c5c3_Err
10141213 }
1015- var templ_7745c5c3_Var56 string
1016- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(a.Level)
1214+ var templ_7745c5c3_Var67 string
1215+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(a.Level)
10171216 if templ_7745c5c3_Err != nil {
1018- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 137, Col: 41}
1217+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 158, Col: 41}
10191218 }
1020- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1219+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))
10211220 if templ_7745c5c3_Err != nil {
10221221 return templ_7745c5c3_Err
10231222 }
1024- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span> ")
1223+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</span> ")
10251224 if templ_7745c5c3_Err != nil {
10261225 return templ_7745c5c3_Err
10271226 }
10281227 if !grouped {
10291228 if a.JobHref != "" {
1030- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "<a href=\"")
1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<a href=\"")
10311230 if templ_7745c5c3_Err != nil {
10321231 return templ_7745c5c3_Err
10331232 }
1034- var templ_7745c5c3_Var57 templ.SafeURL
1035- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.JobHref))
1233+ var templ_7745c5c3_Var68 templ.SafeURL
1234+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.JobHref))
10361235 if templ_7745c5c3_Err != nil {
1037- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 140, Col: 42}
1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 161, Col: 42}
10381237 }
1039- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
10401239 if templ_7745c5c3_Err != nil {
10411240 return templ_7745c5c3_Err
10421241 }
1043- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\">")
1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "\">")
10441243 if templ_7745c5c3_Err != nil {
10451244 return templ_7745c5c3_Err
10461245 }
1047- var templ_7745c5c3_Var58 string
1048- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
1246+ var templ_7745c5c3_Var69 string
1247+ templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
10491248 if templ_7745c5c3_Err != nil {
1050- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 140, Col: 52}
1249+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 161, Col: 52}
10511250 }
1052- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1251+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69))
10531252 if templ_7745c5c3_Err != nil {
10541253 return templ_7745c5c3_Err
10551254 }
1056- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</a>")
1255+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</a>")
10571256 if templ_7745c5c3_Err != nil {
10581257 return templ_7745c5c3_Err
10591258 }
10601259 } else {
1061- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<span>")
1260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "<span>")
10621261 if templ_7745c5c3_Err != nil {
10631262 return templ_7745c5c3_Err
10641263 }
1065- var templ_7745c5c3_Var59 string
1066- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
1264+ var templ_7745c5c3_Var70 string
1265+ templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
10671266 if templ_7745c5c3_Err != nil {
1068- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 142, Col: 21}
1267+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 163, Col: 21}
10691268 }
1070- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1269+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
10711270 if templ_7745c5c3_Err != nil {
10721271 return templ_7745c5c3_Err
10731272 }
1074- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</span>")
1273+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "</span>")
10751274 if templ_7745c5c3_Err != nil {
10761275 return templ_7745c5c3_Err
10771276 }
10781277 }
1079- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, " <span class=\"mute\">")
1278+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, " <span class=\"mute\">")
10801279 if templ_7745c5c3_Err != nil {
10811280 return templ_7745c5c3_Err
10821281 }
1083- var templ_7745c5c3_Var60 string
1084- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
1282+ var templ_7745c5c3_Var71 string
1283+ templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
10851284 if templ_7745c5c3_Err != nil {
1086- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 144, Col: 34}
1285+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 165, Col: 34}
10871286 }
1088- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
1287+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
10891288 if templ_7745c5c3_Err != nil {
10901289 return templ_7745c5c3_Err
10911290 }
1092- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</span> ")
1291+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</span> ")
10931292 if templ_7745c5c3_Err != nil {
10941293 return templ_7745c5c3_Err
10951294 }
10961295 }
10971296 if a.Title != "" {
1098- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<strong>")
1297+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "<strong>")
10991298 if templ_7745c5c3_Err != nil {
11001299 return templ_7745c5c3_Err
11011300 }
1102- var templ_7745c5c3_Var61 string
1103- templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(a.Title)
1301+ var templ_7745c5c3_Var72 string
1302+ templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(a.Title)
11041303 if templ_7745c5c3_Err != nil {
1105- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 147, Col: 24}
1304+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 168, Col: 24}
11061305 }
1107- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
1306+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72))
11081307 if templ_7745c5c3_Err != nil {
11091308 return templ_7745c5c3_Err
11101309 }
1111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</strong>")
1310+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</strong>")
11121311 if templ_7745c5c3_Err != nil {
11131312 return templ_7745c5c3_Err
11141313 }
11151314 }
1116- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p><p class=\"annot-msg\">")
1315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "</p><p class=\"annot-msg\">")
11171316 if templ_7745c5c3_Err != nil {
11181317 return templ_7745c5c3_Err
11191318 }
1120- var templ_7745c5c3_Var62 string
1121- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(a.Message)
1319+ var templ_7745c5c3_Var73 string
1320+ templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.JoinStringErrs(a.Message)
11221321 if templ_7745c5c3_Err != nil {
1123- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 150, Col: 37}
1322+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 171, Col: 37}
11241323 }
1125- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
1324+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var73))
11261325 if templ_7745c5c3_Err != nil {
11271326 return templ_7745c5c3_Err
11281327 }
1129- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</p>")
1328+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "</p>")
11301329 if templ_7745c5c3_Err != nil {
11311330 return templ_7745c5c3_Err
11321331 }
11331332 if a.Where != "" {
1134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<p class=\"annot-where\">")
1333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "<p class=\"annot-where\">")
11351334 if templ_7745c5c3_Err != nil {
11361335 return templ_7745c5c3_Err
11371336 }
11381337 if a.WhereHref != "" {
1139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "<a href=\"")
1338+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<a href=\"")
11401339 if templ_7745c5c3_Err != nil {
11411340 return templ_7745c5c3_Err
11421341 }
1143- var templ_7745c5c3_Var63 templ.SafeURL
1144- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.WhereHref))
1342+ var templ_7745c5c3_Var74 templ.SafeURL
1343+ templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.WhereHref))
11451344 if templ_7745c5c3_Err != nil {
1146- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 154, Col: 44}
1345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 44}
11471346 }
1148- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))
1347+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var74))
11491348 if templ_7745c5c3_Err != nil {
11501349 return templ_7745c5c3_Err
11511350 }
1152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "\">")
1351+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "\">")
11531352 if templ_7745c5c3_Err != nil {
11541353 return templ_7745c5c3_Err
11551354 }
1156- var templ_7745c5c3_Var64 string
1157- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
1355+ var templ_7745c5c3_Var75 string
1356+ templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
11581357 if templ_7745c5c3_Err != nil {
1159- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 154, Col: 56}
1358+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 56}
11601359 }
1161- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64))
1360+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))
11621361 if templ_7745c5c3_Err != nil {
11631362 return templ_7745c5c3_Err
11641363 }
1165- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "</a>")
1364+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "</a>")
11661365 if templ_7745c5c3_Err != nil {
11671366 return templ_7745c5c3_Err
11681367 }
11691368 } else {
1170- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "<span>")
1369+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "<span>")
11711370 if templ_7745c5c3_Err != nil {
11721371 return templ_7745c5c3_Err
11731372 }
1174- var templ_7745c5c3_Var65 string
1175- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
1373+ var templ_7745c5c3_Var76 string
1374+ templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
11761375 if templ_7745c5c3_Err != nil {
1177- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 156, Col: 23}
1376+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 177, Col: 23}
11781377 }
1179- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
1378+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76))
11801379 if templ_7745c5c3_Err != nil {
11811380 return templ_7745c5c3_Err
11821381 }
1183- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "</span>")
1382+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "</span>")
11841383 if templ_7745c5c3_Err != nil {
11851384 return templ_7745c5c3_Err
11861385 }
11871386 }
1188- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</p>")
1387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "</p>")
11891388 if templ_7745c5c3_Err != nil {
11901389 return templ_7745c5c3_Err
11911390 }
11921391 }
1193- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</div></li>")
1392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</div></li>")
11941393 if templ_7745c5c3_Err != nil {
11951394 return templ_7745c5c3_Err
11961395 }
11971396 }
1198- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</ul>")
1397+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "</ul>")
11991398 if templ_7745c5c3_Err != nil {
12001399 return templ_7745c5c3_Err
12011400 }
12021401 if more {
1203- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<p class=\"mute\">more annotations exist than are shown.</p>")
1402+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"mute\">more annotations exist than are shown.</p>")
12041403 if templ_7745c5c3_Err != nil {
12051404 return templ_7745c5c3_Err
12061405 }
@@ -1228,30 +1427,30 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component {
12281427 }()
12291428 }
12301429 ctx = templ.InitializeContext(ctx)
1231- templ_7745c5c3_Var66 := templ.GetChildren(ctx)
1232- if templ_7745c5c3_Var66 == nil {
1233- templ_7745c5c3_Var66 = templ.NopComponent
1430+ templ_7745c5c3_Var77 := templ.GetChildren(ctx)
1431+ if templ_7745c5c3_Var77 == nil {
1432+ templ_7745c5c3_Var77 = templ.NopComponent
12341433 }
12351434 ctx = templ.ClearChildren(ctx)
1236- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "<section id=\"job-annotations\" class=\"annots\" aria-label=\"Annotations\">")
1435+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "<section id=\"job-annotations\" class=\"annots\" aria-label=\"Annotations\">")
12371436 if templ_7745c5c3_Err != nil {
12381437 return templ_7745c5c3_Err
12391438 }
12401439 if len(anns) > 0 {
1241- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "<h3>Annotations <span class=\"count\">")
1440+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<h3>Annotations <span class=\"count\">")
12421441 if templ_7745c5c3_Err != nil {
12431442 return templ_7745c5c3_Err
12441443 }
1245- var templ_7745c5c3_Var67 string
1246- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(anns)))
1444+ var templ_7745c5c3_Var78 string
1445+ templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(anns)))
12471446 if templ_7745c5c3_Err != nil {
1248- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 56}
1447+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 196, Col: 56}
12491448 }
1250- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))
1449+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78))
12511450 if templ_7745c5c3_Err != nil {
12521451 return templ_7745c5c3_Err
12531452 }
1254- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</span></h3>")
1453+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</span></h3>")
12551454 if templ_7745c5c3_Err != nil {
12561455 return templ_7745c5c3_Err
12571456 }
@@ -1260,7 +1459,7 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component {
12601459 return templ_7745c5c3_Err
12611460 }
12621461 }
1263- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</section>")
1462+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "</section>")
12641463 if templ_7745c5c3_Err != nil {
12651464 return templ_7745c5c3_Err
12661465 }
@@ -1287,125 +1486,125 @@ func RunSummaries(sums []JobSummaries, more bool) templ.Component {
12871486 }()
12881487 }
12891488 ctx = templ.InitializeContext(ctx)
1290- templ_7745c5c3_Var68 := templ.GetChildren(ctx)
1291- if templ_7745c5c3_Var68 == nil {
1292- templ_7745c5c3_Var68 = templ.NopComponent
1489+ templ_7745c5c3_Var79 := templ.GetChildren(ctx)
1490+ if templ_7745c5c3_Var79 == nil {
1491+ templ_7745c5c3_Var79 = templ.NopComponent
12931492 }
12941493 ctx = templ.ClearChildren(ctx)
12951494 for _, j := range sums {
1296- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "<section class=\"summaries\" aria-label=\"")
1495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "<section class=\"summaries\" aria-label=\"")
12971496 if templ_7745c5c3_Err != nil {
12981497 return templ_7745c5c3_Err
12991498 }
1300- var templ_7745c5c3_Var69 string
1301- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue("Summary of " + j.Job)
1499+ var templ_7745c5c3_Var80 string
1500+ templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.ResolveAttributeValue("Summary of " + j.Job)
13021501 if templ_7745c5c3_Err != nil {
1303- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 186, Col: 63}
1502+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 207, Col: 63}
13041503 }
1305- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)
1504+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var80)
13061505 if templ_7745c5c3_Err != nil {
13071506 return templ_7745c5c3_Err
13081507 }
1309- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "\"><h3>")
1508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\"><h3>")
13101509 if templ_7745c5c3_Err != nil {
13111510 return templ_7745c5c3_Err
13121511 }
13131512 if j.JobHref != "" {
1314- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "<a href=\"")
1513+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "<a href=\"")
13151514 if templ_7745c5c3_Err != nil {
13161515 return templ_7745c5c3_Err
13171516 }
1318- var templ_7745c5c3_Var70 templ.SafeURL
1319- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.JobHref))
1517+ var templ_7745c5c3_Var81 templ.SafeURL
1518+ templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.JobHref))
13201519 if templ_7745c5c3_Err != nil {
1321- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 189, Col: 39}
1520+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 210, Col: 39}
13221521 }
1323- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
1522+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81))
13241523 if templ_7745c5c3_Err != nil {
13251524 return templ_7745c5c3_Err
13261525 }
1327- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\">")
1526+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">")
13281527 if templ_7745c5c3_Err != nil {
13291528 return templ_7745c5c3_Err
13301529 }
1331- var templ_7745c5c3_Var71 string
1332- templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
1530+ var templ_7745c5c3_Var82 string
1531+ templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
13331532 if templ_7745c5c3_Err != nil {
1334- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 189, Col: 49}
1533+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 210, Col: 49}
13351534 }
1336- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
1535+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82))
13371536 if templ_7745c5c3_Err != nil {
13381537 return templ_7745c5c3_Err
13391538 }
1340- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</a> ")
1539+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a> ")
13411540 if templ_7745c5c3_Err != nil {
13421541 return templ_7745c5c3_Err
13431542 }
13441543 } else {
1345- var templ_7745c5c3_Var72 string
1346- templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
1544+ var templ_7745c5c3_Var83 string
1545+ templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
13471546 if templ_7745c5c3_Err != nil {
1348- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 191, Col: 12}
1547+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 212, Col: 12}
13491548 }
1350- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72))
1549+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83))
13511550 if templ_7745c5c3_Err != nil {
13521551 return templ_7745c5c3_Err
13531552 }
1354- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, " ")
1553+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, " ")
13551554 if templ_7745c5c3_Err != nil {
13561555 return templ_7745c5c3_Err
13571556 }
13581557 }
1359- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "<span class=\"mute\">summary</span></h3>")
1558+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "<span class=\"mute\">summary</span></h3>")
13601559 if templ_7745c5c3_Err != nil {
13611560 return templ_7745c5c3_Err
13621561 }
13631562 for _, s := range j.Steps {
1364- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<article class=\"prose summary\" aria-label=\"")
1563+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "<article class=\"prose summary\" aria-label=\"")
13651564 if templ_7745c5c3_Err != nil {
13661565 return templ_7745c5c3_Err
13671566 }
1368- var templ_7745c5c3_Var73 string
1369- templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.ResolveAttributeValue(s.Step)
1567+ var templ_7745c5c3_Var84 string
1568+ templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.ResolveAttributeValue(s.Step)
13701569 if templ_7745c5c3_Err != nil {
1371- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 196, Col: 54}
1570+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 217, Col: 54}
13721571 }
1373- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var73)
1572+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var84)
13741573 if templ_7745c5c3_Err != nil {
13751574 return templ_7745c5c3_Err
13761575 }
1377- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\" hx-ignore><h4 class=\"summary-step\">")
1576+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "\" hx-ignore><h4 class=\"summary-step\">")
13781577 if templ_7745c5c3_Err != nil {
13791578 return templ_7745c5c3_Err
13801579 }
1381- var templ_7745c5c3_Var74 string
1382- templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.JoinStringErrs(s.Step)
1580+ var templ_7745c5c3_Var85 string
1581+ templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(s.Step)
13831582 if templ_7745c5c3_Err != nil {
1384- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 197, Col: 38}
1583+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 218, Col: 38}
13851584 }
1386- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var74))
1585+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
13871586 if templ_7745c5c3_Err != nil {
13881587 return templ_7745c5c3_Err
13891588 }
1390- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "</h4>")
1589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "</h4>")
13911590 if templ_7745c5c3_Err != nil {
13921591 return templ_7745c5c3_Err
13931592 }
13941593 if s.Note != "" {
1395- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "<p class=\"dim\">")
1594+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<p class=\"dim\">")
13961595 if templ_7745c5c3_Err != nil {
13971596 return templ_7745c5c3_Err
13981597 }
1399- var templ_7745c5c3_Var75 string
1400- templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinStringErrs(s.Note)
1598+ var templ_7745c5c3_Var86 string
1599+ templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(s.Note)
14011600 if templ_7745c5c3_Err != nil {
1402- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 199, Col: 29}
1601+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 29}
14031602 }
1404- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))
1603+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
14051604 if templ_7745c5c3_Err != nil {
14061605 return templ_7745c5c3_Err
14071606 }
1408- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</p>")
1607+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</p>")
14091608 if templ_7745c5c3_Err != nil {
14101609 return templ_7745c5c3_Err
14111610 }
@@ -1415,37 +1614,37 @@ func RunSummaries(sums []JobSummaries, more bool) templ.Component {
14151614 return templ_7745c5c3_Err
14161615 }
14171616 }
1418- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "</article>")
1617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</article>")
14191618 if templ_7745c5c3_Err != nil {
14201619 return templ_7745c5c3_Err
14211620 }
14221621 }
14231622 if j.More {
1424- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"mute\">the job has more summaries than the first 20, which are shown.</p>")
1623+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "<p class=\"mute\">the job has more summaries than the first 20, which are shown.</p>")
14251624 if templ_7745c5c3_Err != nil {
14261625 return templ_7745c5c3_Err
14271626 }
14281627 }
1429- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "</section>")
1628+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</section>")
14301629 if templ_7745c5c3_Err != nil {
14311630 return templ_7745c5c3_Err
14321631 }
14331632 }
14341633 if more {
1435- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ")
1634+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ")
14361635 if templ_7745c5c3_Err != nil {
14371636 return templ_7745c5c3_Err
14381637 }
1439- var templ_7745c5c3_Var76 string
1440- templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes))
1638+ var templ_7745c5c3_Var87 string
1639+ templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes))
14411640 if templ_7745c5c3_Err != nil {
1442- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 211, Col: 115}
1641+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 232, Col: 115}
14431642 }
1444- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76))
1643+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))
14451644 if templ_7745c5c3_Err != nil {
14461645 return templ_7745c5c3_Err
14471646 }
1448- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, ".</p>")
1647+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, ".</p>")
14491648 if templ_7745c5c3_Err != nil {
14501649 return templ_7745c5c3_Err
14511650 }
@@ -1470,256 +1669,256 @@ func runRail(p RunPage) templ.Component {
14701669 }()
14711670 }
14721671 ctx = templ.InitializeContext(ctx)
1473- templ_7745c5c3_Var77 := templ.GetChildren(ctx)
1474- if templ_7745c5c3_Var77 == nil {
1475- templ_7745c5c3_Var77 = templ.NopComponent
1672+ templ_7745c5c3_Var88 := templ.GetChildren(ctx)
1673+ if templ_7745c5c3_Var88 == nil {
1674+ templ_7745c5c3_Var88 = templ.NopComponent
14761675 }
14771676 ctx = templ.ClearChildren(ctx)
1478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>")
1677+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>")
14791678 if templ_7745c5c3_Err != nil {
14801679 return templ_7745c5c3_Err
14811680 }
1482- var templ_7745c5c3_Var78 string
1483- templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(p.State)
1681+ var templ_7745c5c3_Var89 string
1682+ templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(p.State)
14841683 if templ_7745c5c3_Err != nil {
1485- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 16}
1684+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 241, Col: 16}
14861685 }
1487- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78))
1686+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))
14881687 if templ_7745c5c3_Err != nil {
14891688 return templ_7745c5c3_Err
14901689 }
1491- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</dd><dt>commit</dt><dd><a href=\"")
1690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "</dd><dt>commit</dt><dd><a href=\"")
14921691 if templ_7745c5c3_Err != nil {
14931692 return templ_7745c5c3_Err
14941693 }
1495- var templ_7745c5c3_Var79 templ.SafeURL
1496- templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref))
1694+ var templ_7745c5c3_Var90 templ.SafeURL
1695+ templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref))
14971696 if templ_7745c5c3_Err != nil {
1498- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 39}
1697+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 243, Col: 39}
14991698 }
1500- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79))
1699+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))
15011700 if templ_7745c5c3_Err != nil {
15021701 return templ_7745c5c3_Err
15031702 }
1504- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">")
1703+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "\">")
15051704 if templ_7745c5c3_Err != nil {
15061705 return templ_7745c5c3_Err
15071706 }
1508- var templ_7745c5c3_Var80 string
1509- templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short)
1707+ var templ_7745c5c3_Var91 string
1708+ templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short)
15101709 if templ_7745c5c3_Err != nil {
1511- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 51}
1710+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 243, Col: 51}
15121711 }
1513- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80))
1712+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))
15141713 if templ_7745c5c3_Err != nil {
15151714 return templ_7745c5c3_Err
15161715 }
1517- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>ref</dt><dd><a href=\"")
1716+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "</a></dd><dt>ref</dt><dd><a href=\"")
15181717 if templ_7745c5c3_Err != nil {
15191718 return templ_7745c5c3_Err
15201719 }
1521- var templ_7745c5c3_Var81 templ.SafeURL
1522- templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref))
1720+ var templ_7745c5c3_Var92 templ.SafeURL
1721+ templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref))
15231722 if templ_7745c5c3_Err != nil {
1524- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 41}
1723+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 245, Col: 41}
15251724 }
1526- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81))
1725+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var92))
15271726 if templ_7745c5c3_Err != nil {
15281727 return templ_7745c5c3_Err
15291728 }
1530- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">")
1729+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "\">")
15311730 if templ_7745c5c3_Err != nil {
15321731 return templ_7745c5c3_Err
15331732 }
1534- var templ_7745c5c3_Var82 string
1535- templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref)
1733+ var templ_7745c5c3_Var93 string
1734+ templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref)
15361735 if templ_7745c5c3_Err != nil {
1537- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 51}
1736+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 245, Col: 51}
15381737 }
1539- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82))
1738+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93))
15401739 if templ_7745c5c3_Err != nil {
15411740 return templ_7745c5c3_Err
15421741 }
1543- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a></dd><dt>actor</dt><dd>")
1742+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "</a></dd><dt>actor</dt><dd>")
15441743 if templ_7745c5c3_Err != nil {
15451744 return templ_7745c5c3_Err
15461745 }
1547- var templ_7745c5c3_Var83 string
1548- templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor)
1746+ var templ_7745c5c3_Var94 string
1747+ templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor)
15491748 if templ_7745c5c3_Err != nil {
1550- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 226, Col: 16}
1749+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 247, Col: 16}
15511750 }
1552- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83))
1751+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))
15531752 if templ_7745c5c3_Err != nil {
15541753 return templ_7745c5c3_Err
15551754 }
1556- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd><dt>attempt</dt><dd>")
1755+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "</dd><dt>attempt</dt><dd>")
15571756 if templ_7745c5c3_Err != nil {
15581757 return templ_7745c5c3_Err
15591758 }
1560- var templ_7745c5c3_Var84 string
1561- templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt)))
1759+ var templ_7745c5c3_Var95 string
1760+ templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt)))
15621761 if templ_7745c5c3_Err != nil {
1563- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 29}
1762+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 29}
15641763 }
1565- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84))
1764+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))
15661765 if templ_7745c5c3_Err != nil {
15671766 return templ_7745c5c3_Err
15681767 }
1569- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, " of ")
1768+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, " of ")
15701769 if templ_7745c5c3_Err != nil {
15711770 return templ_7745c5c3_Err
15721771 }
1573- var templ_7745c5c3_Var85 string
1574- templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest)))
1772+ var templ_7745c5c3_Var96 string
1773+ templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest)))
15751774 if templ_7745c5c3_Err != nil {
1576- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 56}
1775+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 56}
15771776 }
1578- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
1777+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
15791778 if templ_7745c5c3_Err != nil {
15801779 return templ_7745c5c3_Err
15811780 }
1582- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "</dd></dl>")
1781+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</dd></dl>")
15831782 if templ_7745c5c3_Err != nil {
15841783 return templ_7745c5c3_Err
15851784 }
15861785 if len(p.Attempts) > 0 {
1587- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<ul class=\"attempts\">")
1786+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<ul class=\"attempts\">")
15881787 if templ_7745c5c3_Err != nil {
15891788 return templ_7745c5c3_Err
15901789 }
15911790 for _, a := range p.Attempts {
1592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "<li>")
1791+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "<li>")
15931792 if templ_7745c5c3_Err != nil {
15941793 return templ_7745c5c3_Err
15951794 }
15961795 if a.Current {
1597- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<span aria-current=\"page\">")
1796+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span aria-current=\"page\">")
15981797 if templ_7745c5c3_Err != nil {
15991798 return templ_7745c5c3_Err
16001799 }
1601- var templ_7745c5c3_Var86 string
1602- templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
1800+ var templ_7745c5c3_Var97 string
1801+ templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
16031802 if templ_7745c5c3_Err != nil {
1604- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 235, Col: 42}
1803+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 256, Col: 42}
16051804 }
1606- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
1805+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97))
16071806 if templ_7745c5c3_Err != nil {
16081807 return templ_7745c5c3_Err
16091808 }
1610- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</span>")
1809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span>")
16111810 if templ_7745c5c3_Err != nil {
16121811 return templ_7745c5c3_Err
16131812 }
16141813 } else {
1615- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "<a href=\"")
1814+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "<a href=\"")
16161815 if templ_7745c5c3_Err != nil {
16171816 return templ_7745c5c3_Err
16181817 }
1619- var templ_7745c5c3_Var87 templ.SafeURL
1620- templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href))
1818+ var templ_7745c5c3_Var98 templ.SafeURL
1819+ templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href))
16211820 if templ_7745c5c3_Err != nil {
1622- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 38}
1821+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 258, Col: 38}
16231822 }
1624- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))
1823+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
16251824 if templ_7745c5c3_Err != nil {
16261825 return templ_7745c5c3_Err
16271826 }
1628- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "\">")
1827+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "\">")
16291828 if templ_7745c5c3_Err != nil {
16301829 return templ_7745c5c3_Err
16311830 }
1632- var templ_7745c5c3_Var88 string
1633- templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
1831+ var templ_7745c5c3_Var99 string
1832+ templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
16341833 if templ_7745c5c3_Err != nil {
1635- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 50}
1834+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 258, Col: 50}
16361835 }
1637- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88))
1836+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99))
16381837 if templ_7745c5c3_Err != nil {
16391838 return templ_7745c5c3_Err
16401839 }
1641- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</a>")
1840+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</a>")
16421841 if templ_7745c5c3_Err != nil {
16431842 return templ_7745c5c3_Err
16441843 }
16451844 }
1646- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</li>")
1845+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</li>")
16471846 if templ_7745c5c3_Err != nil {
16481847 return templ_7745c5c3_Err
16491848 }
16501849 }
1651- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "</ul>")
1850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "</ul>")
16521851 if templ_7745c5c3_Err != nil {
16531852 return templ_7745c5c3_Err
16541853 }
16551854 }
1656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "</section>")
1855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "</section>")
16571856 if templ_7745c5c3_Err != nil {
16581857 return templ_7745c5c3_Err
16591858 }
16601859 if p.CancelAction != "" || p.RerunAction != "" {
1661- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">")
1860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">")
16621861 if templ_7745c5c3_Err != nil {
16631862 return templ_7745c5c3_Err
16641863 }
16651864 if p.CancelAction != "" {
1666- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"")
1865+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "<form method=\"post\" action=\"")
16671866 if templ_7745c5c3_Err != nil {
16681867 return templ_7745c5c3_Err
16691868 }
1670- var templ_7745c5c3_Var89 templ.SafeURL
1671- templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction))
1869+ var templ_7745c5c3_Var100 templ.SafeURL
1870+ templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction))
16721871 if templ_7745c5c3_Err != nil {
1673- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 63}
1872+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 270, Col: 63}
16741873 }
1675- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))
1874+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))
16761875 if templ_7745c5c3_Err != nil {
16771876 return templ_7745c5c3_Err
16781877 }
1679- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>")
1878+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>")
16801879 if templ_7745c5c3_Err != nil {
16811880 return templ_7745c5c3_Err
16821881 }
16831882 }
16841883 if p.RerunAction != "" {
1685- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"")
1884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<form method=\"post\" action=\"")
16861885 if templ_7745c5c3_Err != nil {
16871886 return templ_7745c5c3_Err
16881887 }
1689- var templ_7745c5c3_Var90 templ.SafeURL
1690- templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction))
1888+ var templ_7745c5c3_Var101 templ.SafeURL
1889+ templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction))
16911890 if templ_7745c5c3_Err != nil {
1692- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 62}
1891+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 273, Col: 62}
16931892 }
1694- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))
1893+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101))
16951894 if templ_7745c5c3_Err != nil {
16961895 return templ_7745c5c3_Err
16971896 }
1698- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>")
1897+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>")
16991898 if templ_7745c5c3_Err != nil {
17001899 return templ_7745c5c3_Err
17011900 }
17021901 }
17031902 if p.CanRerunFailed {
1704- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "<form method=\"post\" action=\"")
1903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<form method=\"post\" action=\"")
17051904 if templ_7745c5c3_Err != nil {
17061905 return templ_7745c5c3_Err
17071906 }
1708- var templ_7745c5c3_Var91 templ.SafeURL
1709- templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction))
1907+ var templ_7745c5c3_Var102 templ.SafeURL
1908+ templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction))
17101909 if templ_7745c5c3_Err != nil {
1711- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 255, Col: 68}
1910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 276, Col: 68}
17121911 }
1713- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))
1912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))
17141913 if templ_7745c5c3_Err != nil {
17151914 return templ_7745c5c3_Err
17161915 }
1717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>")
1916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>")
17181917 if templ_7745c5c3_Err != nil {
17191918 return templ_7745c5c3_Err
17201919 }
17211920 }
1722- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</div></section>")
1921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</div></section>")
17231922 if templ_7745c5c3_Err != nil {
17241923 return templ_7745c5c3_Err
17251924 }
@@ -1746,25 +1945,25 @@ func JobHead(j JobRow, total int64) templ.Component {
17461945 }()
17471946 }
17481947 ctx = templ.InitializeContext(ctx)
1749- templ_7745c5c3_Var92 := templ.GetChildren(ctx)
1750- if templ_7745c5c3_Var92 == nil {
1751- templ_7745c5c3_Var92 = templ.NopComponent
1948+ templ_7745c5c3_Var103 := templ.GetChildren(ctx)
1949+ if templ_7745c5c3_Var103 == nil {
1950+ templ_7745c5c3_Var103 = templ.NopComponent
17521951 }
17531952 ctx = templ.ClearChildren(ctx)
1754- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<div id=\"job-head\" data-total=\"")
1953+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, "<div id=\"job-head\" data-total=\"")
17551954 if templ_7745c5c3_Err != nil {
17561955 return templ_7745c5c3_Err
17571956 }
1758- var templ_7745c5c3_Var93 string
1759- templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total))
1957+ var templ_7745c5c3_Var104 string
1958+ templ_7745c5c3_Var104, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total))
17601959 if templ_7745c5c3_Err != nil {
1761- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 46}
1960+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 286, Col: 46}
17621961 }
1763- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var93)
1962+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var104)
17641963 if templ_7745c5c3_Err != nil {
17651964 return templ_7745c5c3_Err
17661965 }
1767- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "\"><h2 class=\"run-h\">")
1966+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, "\"><h2 class=\"run-h\">")
17681967 if templ_7745c5c3_Err != nil {
17691968 return templ_7745c5c3_Err
17701969 }
@@ -1772,74 +1971,74 @@ func JobHead(j JobRow, total int64) templ.Component {
17721971 if templ_7745c5c3_Err != nil {
17731972 return templ_7745c5c3_Err
17741973 }
1775- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span>")
1974+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, "<span>")
17761975 if templ_7745c5c3_Err != nil {
17771976 return templ_7745c5c3_Err
17781977 }
1779- var templ_7745c5c3_Var94 string
1780- templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
1978+ var templ_7745c5c3_Var105 string
1979+ templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
17811980 if templ_7745c5c3_Err != nil {
1782- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 61}
1981+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 61}
17831982 }
1784- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))
1983+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var105))
17851984 if templ_7745c5c3_Err != nil {
17861985 return templ_7745c5c3_Err
17871986 }
1788- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span> <span class=\"dim\">")
1987+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "</span> <span class=\"dim\">")
17891988 if templ_7745c5c3_Err != nil {
17901989 return templ_7745c5c3_Err
17911990 }
1792- var templ_7745c5c3_Var95 string
1793- templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
1991+ var templ_7745c5c3_Var106 string
1992+ templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
17941993 if templ_7745c5c3_Err != nil {
1795- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 98}
1994+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 98}
17961995 }
1797- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))
1996+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var106))
17981997 if templ_7745c5c3_Err != nil {
17991998 return templ_7745c5c3_Err
18001999 }
1801- var templ_7745c5c3_Var96 string
1802- templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
2000+ var templ_7745c5c3_Var107 string
2001+ templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
18032002 if templ_7745c5c3_Err != nil {
1804- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 105}
2003+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 105}
18052004 }
1806- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
2005+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var107))
18072006 if templ_7745c5c3_Err != nil {
18082007 return templ_7745c5c3_Err
18092008 }
1810- var templ_7745c5c3_Var97 string
1811- templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
2009+ var templ_7745c5c3_Var108 string
2010+ templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
18122011 if templ_7745c5c3_Err != nil {
1813- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 119}
2012+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 119}
18142013 }
1815- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97))
2014+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108))
18162015 if templ_7745c5c3_Err != nil {
18172016 return templ_7745c5c3_Err
18182017 }
1819- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</span></h2>")
2018+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, "</span></h2>")
18202019 if templ_7745c5c3_Err != nil {
18212020 return templ_7745c5c3_Err
18222021 }
18232022 if j.Error != "" {
1824- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "<p class=\"job-err\">")
2023+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, "<p class=\"job-err\">")
18252024 if templ_7745c5c3_Err != nil {
18262025 return templ_7745c5c3_Err
18272026 }
1828- var templ_7745c5c3_Var98 string
1829- templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
2027+ var templ_7745c5c3_Var109 string
2028+ templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
18302029 if templ_7745c5c3_Err != nil {
1831- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 268, Col: 31}
2030+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 289, Col: 31}
18322031 }
1833- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
2032+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))
18342033 if templ_7745c5c3_Err != nil {
18352034 return templ_7745c5c3_Err
18362035 }
1837- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</p>")
2036+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "</p>")
18382037 if templ_7745c5c3_Err != nil {
18392038 return templ_7745c5c3_Err
18402039 }
18412040 }
1842- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</div>")
2041+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "</div>")
18432042 if templ_7745c5c3_Err != nil {
18442043 return templ_7745c5c3_Err
18452044 }
@@ -1864,17 +2063,17 @@ func JobSteps(steps []StepView) templ.Component {
18642063 }()
18652064 }
18662065 ctx = templ.InitializeContext(ctx)
1867- templ_7745c5c3_Var99 := templ.GetChildren(ctx)
1868- if templ_7745c5c3_Var99 == nil {
1869- templ_7745c5c3_Var99 = templ.NopComponent
2066+ templ_7745c5c3_Var110 := templ.GetChildren(ctx)
2067+ if templ_7745c5c3_Var110 == nil {
2068+ templ_7745c5c3_Var110 = templ.NopComponent
18702069 }
18712070 ctx = templ.ClearChildren(ctx)
1872- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<ol class=\"steps\" id=\"job-steps\">")
2071+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<ol class=\"steps\" id=\"job-steps\">")
18732072 if templ_7745c5c3_Err != nil {
18742073 return templ_7745c5c3_Err
18752074 }
18762075 for _, s := range steps {
1877- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "<li>")
2076+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "<li>")
18782077 if templ_7745c5c3_Err != nil {
18792078 return templ_7745c5c3_Err
18802079 }
@@ -1883,74 +2082,74 @@ func JobSteps(steps []StepView) templ.Component {
18832082 return templ_7745c5c3_Err
18842083 }
18852084 if s.LogEnd > s.LogStart {
1886- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<a href=\"")
2085+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<a href=\"")
18872086 if templ_7745c5c3_Err != nil {
18882087 return templ_7745c5c3_Err
18892088 }
1890- var templ_7745c5c3_Var100 templ.SafeURL
1891- templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart)))
2089+ var templ_7745c5c3_Var111 templ.SafeURL
2090+ templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart)))
18922091 if templ_7745c5c3_Err != nil {
1893- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 55}
2092+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 301, Col: 55}
18942093 }
1895- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))
2094+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111))
18962095 if templ_7745c5c3_Err != nil {
18972096 return templ_7745c5c3_Err
18982097 }
1899- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "\">")
2098+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\">")
19002099 if templ_7745c5c3_Err != nil {
19012100 return templ_7745c5c3_Err
19022101 }
1903- var templ_7745c5c3_Var101 string
1904- templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
2102+ var templ_7745c5c3_Var112 string
2103+ templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
19052104 if templ_7745c5c3_Err != nil {
1906- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 66}
2105+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 301, Col: 66}
19072106 }
1908- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101))
2107+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112))
19092108 if templ_7745c5c3_Err != nil {
19102109 return templ_7745c5c3_Err
19112110 }
1912- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</a> ")
2111+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "</a> ")
19132112 if templ_7745c5c3_Err != nil {
19142113 return templ_7745c5c3_Err
19152114 }
19162115 } else {
1917- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span>")
2116+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "<span>")
19182117 if templ_7745c5c3_Err != nil {
19192118 return templ_7745c5c3_Err
19202119 }
1921- var templ_7745c5c3_Var102 string
1922- templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
2120+ var templ_7745c5c3_Var113 string
2121+ templ_7745c5c3_Var113, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
19232122 if templ_7745c5c3_Err != nil {
1924- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 282, Col: 19}
2123+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 303, Col: 19}
19252124 }
1926- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))
2125+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var113))
19272126 if templ_7745c5c3_Err != nil {
19282127 return templ_7745c5c3_Err
19292128 }
1930- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span> ")
2129+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</span> ")
19312130 if templ_7745c5c3_Err != nil {
19322131 return templ_7745c5c3_Err
19332132 }
19342133 }
1935- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<span class=\"dim\">")
2134+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<span class=\"dim\">")
19362135 if templ_7745c5c3_Err != nil {
19372136 return templ_7745c5c3_Err
19382137 }
1939- var templ_7745c5c3_Var103 string
1940- templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
2138+ var templ_7745c5c3_Var114 string
2139+ templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
19412140 if templ_7745c5c3_Err != nil {
1942- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 284, Col: 34}
2141+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 305, Col: 34}
19432142 }
1944- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103))
2143+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var114))
19452144 if templ_7745c5c3_Err != nil {
19462145 return templ_7745c5c3_Err
19472146 }
1948- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "</span></li>")
2147+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "</span></li>")
19492148 if templ_7745c5c3_Err != nil {
19502149 return templ_7745c5c3_Err
19512150 }
19522151 }
1953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</ol>")
2152+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</ol>")
19542153 if templ_7745c5c3_Err != nil {
19552154 return templ_7745c5c3_Err
19562155 }
@@ -1974,12 +2173,12 @@ func Job(l Layout, p JobPage) templ.Component {
19742173 }()
19752174 }
19762175 ctx = templ.InitializeContext(ctx)
1977- templ_7745c5c3_Var104 := templ.GetChildren(ctx)
1978- if templ_7745c5c3_Var104 == nil {
1979- templ_7745c5c3_Var104 = templ.NopComponent
2176+ templ_7745c5c3_Var115 := templ.GetChildren(ctx)
2177+ if templ_7745c5c3_Var115 == nil {
2178+ templ_7745c5c3_Var115 = templ.NopComponent
19802179 }
19812180 ctx = templ.ClearChildren(ctx)
1982- templ_7745c5c3_Var105 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
2181+ templ_7745c5c3_Var116 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
19832182 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
19842183 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
19852184 if !templ_7745c5c3_IsBuffer {
@@ -1995,7 +2194,7 @@ func Job(l Layout, p JobPage) templ.Component {
19952194 if templ_7745c5c3_Err != nil {
19962195 return templ_7745c5c3_Err
19972196 }
1998- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " ")
2197+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, " ")
19992198 if templ_7745c5c3_Err != nil {
20002199 return templ_7745c5c3_Err
20012200 }
@@ -2003,7 +2202,7 @@ func Job(l Layout, p JobPage) templ.Component {
20032202 if templ_7745c5c3_Err != nil {
20042203 return templ_7745c5c3_Err
20052204 }
2006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, " ")
2205+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, " ")
20072206 if templ_7745c5c3_Err != nil {
20082207 return templ_7745c5c3_Err
20092208 }
@@ -2011,111 +2210,111 @@ func Job(l Layout, p JobPage) templ.Component {
20112210 if templ_7745c5c3_Err != nil {
20122211 return templ_7745c5c3_Err
20132212 }
2014- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " <div id=\"job-log\" class=\"joblog\" data-total=\"")
2213+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, " <div id=\"job-log\" class=\"joblog\" data-total=\"")
20152214 if templ_7745c5c3_Err != nil {
20162215 return templ_7745c5c3_Err
20172216 }
2018- var templ_7745c5c3_Var106 string
2019- templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total))
2217+ var templ_7745c5c3_Var117 string
2218+ templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total))
20202219 if templ_7745c5c3_Err != nil {
2021- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 63}
2220+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 63}
20222221 }
2023- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106)
2222+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117)
20242223 if templ_7745c5c3_Err != nil {
20252224 return templ_7745c5c3_Err
20262225 }
2027- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "\"")
2226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"")
20282227 if templ_7745c5c3_Err != nil {
20292228 return templ_7745c5c3_Err
20302229 }
20312230 if p.Follow {
2032- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, " data-follow")
2231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-follow")
20332232 if templ_7745c5c3_Err != nil {
20342233 return templ_7745c5c3_Err
20352234 }
20362235 }
2037- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, " data-stream=\"")
2236+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, " data-stream=\"")
20382237 if templ_7745c5c3_Err != nil {
20392238 return templ_7745c5c3_Err
20402239 }
2041- var templ_7745c5c3_Var107 string
2042- templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref)
2240+ var templ_7745c5c3_Var118 string
2241+ templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref)
20432242 if templ_7745c5c3_Err != nil {
2044- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 118}
2243+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 118}
20452244 }
2046- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107)
2245+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var118)
20472246 if templ_7745c5c3_Err != nil {
20482247 return templ_7745c5c3_Err
20492248 }
2050- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "\" data-next=\"")
2249+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "\" data-next=\"")
20512250 if templ_7745c5c3_Err != nil {
20522251 return templ_7745c5c3_Err
20532252 }
2054- var templ_7745c5c3_Var108 string
2055- templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines))))
2253+ var templ_7745c5c3_Var119 string
2254+ templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines))))
20562255 if templ_7745c5c3_Err != nil {
2057- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 169}
2256+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 169}
20582257 }
2059- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var108)
2258+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var119)
20602259 if templ_7745c5c3_Err != nil {
20612260 return templ_7745c5c3_Err
20622261 }
2063- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "\">")
2262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "\">")
20642263 if templ_7745c5c3_Err != nil {
20652264 return templ_7745c5c3_Err
20662265 }
20672266 if p.Note != "" {
2068- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"dim\">")
2267+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<p class=\"dim\">")
20692268 if templ_7745c5c3_Err != nil {
20702269 return templ_7745c5c3_Err
20712270 }
2072- var templ_7745c5c3_Var109 string
2073- templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
2271+ var templ_7745c5c3_Var120 string
2272+ templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
20742273 if templ_7745c5c3_Err != nil {
2075- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 27}
2274+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 318, Col: 27}
20762275 }
2077- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))
2276+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
20782277 if templ_7745c5c3_Err != nil {
20792278 return templ_7745c5c3_Err
20802279 }
2081- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "</p>")
2280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</p>")
20822281 if templ_7745c5c3_Err != nil {
20832282 return templ_7745c5c3_Err
20842283 }
20852284 }
20862285 if p.Prev != "" {
2087- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<p class=\"more\"><a href=\"")
2286+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "<p class=\"more\"><a href=\"")
20882287 if templ_7745c5c3_Err != nil {
20892288 return templ_7745c5c3_Err
20902289 }
2091- var templ_7745c5c3_Var110 templ.SafeURL
2092- templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev))
2290+ var templ_7745c5c3_Var121 templ.SafeURL
2291+ templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev))
20932292 if templ_7745c5c3_Err != nil {
2094- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 300, Col: 51}
2293+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 321, Col: 51}
20952294 }
2096- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110))
2295+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
20972296 if templ_7745c5c3_Err != nil {
20982297 return templ_7745c5c3_Err
20992298 }
2100- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\" rel=\"prev\">earlier lines</a></p>")
2299+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "\" rel=\"prev\">earlier lines</a></p>")
21012300 if templ_7745c5c3_Err != nil {
21022301 return templ_7745c5c3_Err
21032302 }
21042303 }
2105- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "<ol class=\"log\" start=\"")
2304+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<ol class=\"log\" start=\"")
21062305 if templ_7745c5c3_Err != nil {
21072306 return templ_7745c5c3_Err
21082307 }
2109- var templ_7745c5c3_Var111 string
2110- templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1))
2308+ var templ_7745c5c3_Var122 string
2309+ templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1))
21112310 if templ_7745c5c3_Err != nil {
2112- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 302, Col: 45}
2311+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 323, Col: 45}
21132312 }
2114- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var111)
2313+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var122)
21152314 if templ_7745c5c3_Err != nil {
21162315 return templ_7745c5c3_Err
21172316 }
2118- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "\">")
2317+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "\">")
21192318 if templ_7745c5c3_Err != nil {
21202319 return templ_7745c5c3_Err
21212320 }
@@ -2125,36 +2324,36 @@ func Job(l Layout, p JobPage) templ.Component {
21252324 return templ_7745c5c3_Err
21262325 }
21272326 }
2128- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</ol>")
2327+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "</ol>")
21292328 if templ_7745c5c3_Err != nil {
21302329 return templ_7745c5c3_Err
21312330 }
21322331 if p.Next != "" {
2133- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<p class=\"more\"><a href=\"")
2332+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "<p class=\"more\"><a href=\"")
21342333 if templ_7745c5c3_Err != nil {
21352334 return templ_7745c5c3_Err
21362335 }
2137- var templ_7745c5c3_Var112 templ.SafeURL
2138- templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next))
2336+ var templ_7745c5c3_Var123 templ.SafeURL
2337+ templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next))
21392338 if templ_7745c5c3_Err != nil {
2140- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 308, Col: 51}
2339+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 51}
21412340 }
2142- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112))
2341+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
21432342 if templ_7745c5c3_Err != nil {
21442343 return templ_7745c5c3_Err
21452344 }
2146- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "\" rel=\"next\">more lines</a></p>")
2345+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "\" rel=\"next\">more lines</a></p>")
21472346 if templ_7745c5c3_Err != nil {
21482347 return templ_7745c5c3_Err
21492348 }
21502349 }
2151- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</div>")
2350+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</div>")
21522351 if templ_7745c5c3_Err != nil {
21532352 return templ_7745c5c3_Err
21542353 }
21552354 return nil
21562355 })
2157- templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var105), templ_7745c5c3_Buffer)
2356+ templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var116), templ_7745c5c3_Buffer)
21582357 if templ_7745c5c3_Err != nil {
21592358 return templ_7745c5c3_Err
21602359 }
@@ -2180,92 +2379,92 @@ func LogLine(ln LogLineView) templ.Component {
21802379 }()
21812380 }
21822381 ctx = templ.InitializeContext(ctx)
2183- templ_7745c5c3_Var113 := templ.GetChildren(ctx)
2184- if templ_7745c5c3_Var113 == nil {
2185- templ_7745c5c3_Var113 = templ.NopComponent
2382+ templ_7745c5c3_Var124 := templ.GetChildren(ctx)
2383+ if templ_7745c5c3_Var124 == nil {
2384+ templ_7745c5c3_Var124 = templ.NopComponent
21862385 }
21872386 ctx = templ.ClearChildren(ctx)
2188- var templ_7745c5c3_Var114 = []any{logClass(ln)}
2189- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var114...)
2387+ var templ_7745c5c3_Var125 = []any{logClass(ln)}
2388+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var125...)
21902389 if templ_7745c5c3_Err != nil {
21912390 return templ_7745c5c3_Err
21922391 }
2193- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "<li id=\"")
2392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "<li id=\"")
21942393 if templ_7745c5c3_Err != nil {
21952394 return templ_7745c5c3_Err
21962395 }
2197- var templ_7745c5c3_Var115 string
2198- templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N))
2396+ var templ_7745c5c3_Var126 string
2397+ templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N))
21992398 if templ_7745c5c3_Err != nil {
2200- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 28}
2399+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 28}
22012400 }
2202- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115)
2401+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var126)
22032402 if templ_7745c5c3_Err != nil {
22042403 return templ_7745c5c3_Err
22052404 }
2206- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\" class=\"")
2405+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "\" class=\"")
22072406 if templ_7745c5c3_Err != nil {
22082407 return templ_7745c5c3_Err
22092408 }
2210- var templ_7745c5c3_Var116 string
2211- templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var114).String())
2409+ var templ_7745c5c3_Var127 string
2410+ templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var125).String())
22122411 if templ_7745c5c3_Err != nil {
22132412 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
22142413 }
2215- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116)
2414+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var127)
22162415 if templ_7745c5c3_Err != nil {
22172416 return templ_7745c5c3_Err
22182417 }
2219- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, "\" data-step=\"")
2418+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" data-step=\"")
22202419 if templ_7745c5c3_Err != nil {
22212420 return templ_7745c5c3_Err
22222421 }
2223- var templ_7745c5c3_Var117 string
2224- templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step)))
2422+ var templ_7745c5c3_Var128 string
2423+ templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step)))
22252424 if templ_7745c5c3_Err != nil {
2226- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 84}
2425+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 84}
22272426 }
2228- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117)
2427+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var128)
22292428 if templ_7745c5c3_Err != nil {
22302429 return templ_7745c5c3_Err
22312430 }
2232- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"")
2431+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\"")
22332432 if templ_7745c5c3_Err != nil {
22342433 return templ_7745c5c3_Err
22352434 }
22362435 if ln.Continued {
2237- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-cont")
2436+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, " data-cont")
22382437 if templ_7745c5c3_Err != nil {
22392438 return templ_7745c5c3_Err
22402439 }
22412440 }
2242- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "><time>")
2441+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "><time>")
22432442 if templ_7745c5c3_Err != nil {
22442443 return templ_7745c5c3_Err
22452444 }
2246- var templ_7745c5c3_Var118 string
2247- templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time)
2445+ var templ_7745c5c3_Var129 string
2446+ templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time)
22482447 if templ_7745c5c3_Err != nil {
2249- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 130}
2448+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 130}
22502449 }
2251- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118))
2450+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var129))
22522451 if templ_7745c5c3_Err != nil {
22532452 return templ_7745c5c3_Err
22542453 }
2255- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "</time><span class=\"t\">")
2454+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "</time><span class=\"t\">")
22562455 if templ_7745c5c3_Err != nil {
22572456 return templ_7745c5c3_Err
22582457 }
2259- var templ_7745c5c3_Var119 string
2260- templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text)
2458+ var templ_7745c5c3_Var130 string
2459+ templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text)
22612460 if templ_7745c5c3_Err != nil {
2262- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 164}
2461+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 164}
22632462 }
2264- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119))
2463+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130))
22652464 if templ_7745c5c3_Err != nil {
22662465 return templ_7745c5c3_Err
22672466 }
2268- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</span></li>")
2467+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></li>")
22692468 if templ_7745c5c3_Err != nil {
22702469 return templ_7745c5c3_Err
22712470 }
@@ -2289,12 +2488,12 @@ func jobRail(p JobPage) templ.Component {
22892488 }()
22902489 }
22912490 ctx = templ.InitializeContext(ctx)
2292- templ_7745c5c3_Var120 := templ.GetChildren(ctx)
2293- if templ_7745c5c3_Var120 == nil {
2294- templ_7745c5c3_Var120 = templ.NopComponent
2491+ templ_7745c5c3_Var131 := templ.GetChildren(ctx)
2492+ if templ_7745c5c3_Var131 == nil {
2493+ templ_7745c5c3_Var131 = templ.NopComponent
22952494 }
22962495 ctx = templ.ClearChildren(ctx)
2297- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>")
2496+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>")
22982497 if templ_7745c5c3_Err != nil {
22992498 return templ_7745c5c3_Err
23002499 }
@@ -2302,101 +2501,101 @@ func jobRail(p JobPage) templ.Component {
23022501 if templ_7745c5c3_Err != nil {
23032502 return templ_7745c5c3_Err
23042503 }
2305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"")
2504+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"")
23062505 if templ_7745c5c3_Err != nil {
23072506 return templ_7745c5c3_Err
23082507 }
2309- var templ_7745c5c3_Var121 templ.SafeURL
2310- templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref))
2508+ var templ_7745c5c3_Var132 templ.SafeURL
2509+ templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref))
23112510 if templ_7745c5c3_Err != nil {
2312- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 41}
2511+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 350, Col: 41}
23132512 }
2314- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
2513+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
23152514 if templ_7745c5c3_Err != nil {
23162515 return templ_7745c5c3_Err
23172516 }
2318- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "\">")
2517+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "\">")
23192518 if templ_7745c5c3_Err != nil {
23202519 return templ_7745c5c3_Err
23212520 }
2322- var templ_7745c5c3_Var122 string
2323- templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName)
2521+ var templ_7745c5c3_Var133 string
2522+ templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName)
23242523 if templ_7745c5c3_Err != nil {
2325- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 55}
2524+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 350, Col: 55}
23262525 }
2327- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))
2526+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
23282527 if templ_7745c5c3_Err != nil {
23292528 return templ_7745c5c3_Err
23302529 }
2331- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</a></dd>")
2530+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "</a></dd>")
23322531 if templ_7745c5c3_Err != nil {
23332532 return templ_7745c5c3_Err
23342533 }
23352534 if p.Runner != "" {
2336- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>runner</dt><dd>")
2535+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "<dt>runner</dt><dd>")
23372536 if templ_7745c5c3_Err != nil {
23382537 return templ_7745c5c3_Err
23392538 }
2340- var templ_7745c5c3_Var123 string
2341- templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner)
2539+ var templ_7745c5c3_Var134 string
2540+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner)
23422541 if templ_7745c5c3_Err != nil {
2343- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 332, Col: 18}
2542+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 353, Col: 18}
23442543 }
2345- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
2544+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
23462545 if templ_7745c5c3_Err != nil {
23472546 return templ_7745c5c3_Err
23482547 }
2349- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>")
2548+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</dd>")
23502549 if templ_7745c5c3_Err != nil {
23512550 return templ_7745c5c3_Err
23522551 }
23532552 }
23542553 if p.Isolation != "" {
2355- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>isolation</dt><dd>")
2554+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<dt>isolation</dt><dd>")
23562555 if templ_7745c5c3_Err != nil {
23572556 return templ_7745c5c3_Err
23582557 }
2359- var templ_7745c5c3_Var124 string
2360- templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation)
2558+ var templ_7745c5c3_Var135 string
2559+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation)
23612560 if templ_7745c5c3_Err != nil {
2362- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 21}
2561+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 357, Col: 21}
23632562 }
2364- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))
2563+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))
23652564 if templ_7745c5c3_Err != nil {
23662565 return templ_7745c5c3_Err
23672566 }
2368- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd>")
2567+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</dd>")
23692568 if templ_7745c5c3_Err != nil {
23702569 return templ_7745c5c3_Err
23712570 }
23722571 }
2373- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "<dt>lines</dt><dd>")
2572+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<dt>lines</dt><dd>")
23742573 if templ_7745c5c3_Err != nil {
23752574 return templ_7745c5c3_Err
23762575 }
2377- var templ_7745c5c3_Var125 string
2378- templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total))
2576+ var templ_7745c5c3_Var136 string
2577+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total))
23792578 if templ_7745c5c3_Err != nil {
2380- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 339, Col: 24}
2579+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 360, Col: 24}
23812580 }
2382- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
2581+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
23832582 if templ_7745c5c3_Err != nil {
23842583 return templ_7745c5c3_Err
23852584 }
2386- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</dd></dl><p><a href=\"")
2585+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</dd></dl><p><a href=\"")
23872586 if templ_7745c5c3_Err != nil {
23882587 return templ_7745c5c3_Err
23892588 }
2390- var templ_7745c5c3_Var126 templ.SafeURL
2391- templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref))
2589+ var templ_7745c5c3_Var137 templ.SafeURL
2590+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref))
23922591 if templ_7745c5c3_Err != nil {
2393- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 341, Col: 39}
2592+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 362, Col: 39}
23942593 }
2395- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
2594+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
23962595 if templ_7745c5c3_Err != nil {
23972596 return templ_7745c5c3_Err
23982597 }
2399- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\">raw log</a></p></section>")
2598+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "\">raw log</a></p></section>")
24002599 if templ_7745c5c3_Err != nil {
24012600 return templ_7745c5c3_Err
24022601 }
@@ -2422,39 +2621,39 @@ func CommitChecks(c ChecksSummary) templ.Component {
24222621 }()
24232622 }
24242623 ctx = templ.InitializeContext(ctx)
2425- templ_7745c5c3_Var127 := templ.GetChildren(ctx)
2426- if templ_7745c5c3_Var127 == nil {
2427- templ_7745c5c3_Var127 = templ.NopComponent
2624+ templ_7745c5c3_Var138 := templ.GetChildren(ctx)
2625+ if templ_7745c5c3_Var138 == nil {
2626+ templ_7745c5c3_Var138 = templ.NopComponent
24282627 }
24292628 ctx = templ.ClearChildren(ctx)
24302629 if c.Total > 0 {
2431- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "<a class=\"ck-sum\" href=\"")
2630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "<a class=\"ck-sum\" href=\"")
24322631 if templ_7745c5c3_Err != nil {
24332632 return templ_7745c5c3_Err
24342633 }
2435- var templ_7745c5c3_Var128 templ.SafeURL
2436- templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
2634+ var templ_7745c5c3_Var139 templ.SafeURL
2635+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
24372636 if templ_7745c5c3_Err != nil {
2438- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 48}
2637+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 48}
24392638 }
2440- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
2639+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))
24412640 if templ_7745c5c3_Err != nil {
24422641 return templ_7745c5c3_Err
24432642 }
2444- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" title=\"")
2643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "\" title=\"")
24452644 if templ_7745c5c3_Err != nil {
24462645 return templ_7745c5c3_Err
24472646 }
2448- var templ_7745c5c3_Var129 string
2449- templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title)
2647+ var templ_7745c5c3_Var140 string
2648+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title)
24502649 if templ_7745c5c3_Err != nil {
2451- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 66}
2650+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 66}
24522651 }
2453- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)
2652+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)
24542653 if templ_7745c5c3_Err != nil {
24552654 return templ_7745c5c3_Err
24562655 }
2457- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\">")
2656+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "\">")
24582657 if templ_7745c5c3_Err != nil {
24592658 return templ_7745c5c3_Err
24602659 }
@@ -2462,20 +2661,20 @@ func CommitChecks(c ChecksSummary) templ.Component {
24622661 if templ_7745c5c3_Err != nil {
24632662 return templ_7745c5c3_Err
24642663 }
2465- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<span class=\"mute\">")
2664+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "<span class=\"mute\">")
24662665 if templ_7745c5c3_Err != nil {
24672666 return templ_7745c5c3_Err
24682667 }
2469- var templ_7745c5c3_Var130 string
2470- templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)
2668+ var templ_7745c5c3_Var141 string
2669+ templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)
24712670 if templ_7745c5c3_Err != nil {
2472- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 351, Col: 31}
2671+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 31}
24732672 }
2474- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130))
2673+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))
24752674 if templ_7745c5c3_Err != nil {
24762675 return templ_7745c5c3_Err
24772676 }
2478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></a>")
2677+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</span></a>")
24792678 if templ_7745c5c3_Err != nil {
24802679 return templ_7745c5c3_Err
24812680 }
@@ -2501,40 +2700,40 @@ func MRChecks(c ChecksSection) templ.Component {
25012700 }()
25022701 }
25032702 ctx = templ.InitializeContext(ctx)
2504- templ_7745c5c3_Var131 := templ.GetChildren(ctx)
2505- if templ_7745c5c3_Var131 == nil {
2506- templ_7745c5c3_Var131 = templ.NopComponent
2703+ templ_7745c5c3_Var142 := templ.GetChildren(ctx)
2704+ if templ_7745c5c3_Var142 == nil {
2705+ templ_7745c5c3_Var142 = templ.NopComponent
25072706 }
25082707 ctx = templ.ClearChildren(ctx)
2509- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">")
2708+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 226, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">")
25102709 if templ_7745c5c3_Err != nil {
25112710 return templ_7745c5c3_Err
25122711 }
2513- var templ_7745c5c3_Var132 string
2514- templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows)))
2712+ var templ_7745c5c3_Var143 string
2713+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows)))
25152714 if templ_7745c5c3_Err != nil {
2516- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 359, Col: 66}
2715+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 380, Col: 66}
25172716 }
2518- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
2717+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var143))
25192718 if templ_7745c5c3_Err != nil {
25202719 return templ_7745c5c3_Err
25212720 }
2522- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></h2>")
2721+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 227, "</span></h2>")
25232722 if templ_7745c5c3_Err != nil {
25242723 return templ_7745c5c3_Err
25252724 }
25262725 if len(c.Rows) == 0 {
2527- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<p class=\"dim\">no checks</p>")
2726+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 228, "<p class=\"dim\">no checks</p>")
25282727 if templ_7745c5c3_Err != nil {
25292728 return templ_7745c5c3_Err
25302729 }
25312730 } else {
2532- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<ul class=\"checks\">")
2731+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 229, "<ul class=\"checks\">")
25332732 if templ_7745c5c3_Err != nil {
25342733 return templ_7745c5c3_Err
25352734 }
25362735 for _, r := range c.Rows {
2537- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "<li>")
2736+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 230, "<li>")
25382737 if templ_7745c5c3_Err != nil {
25392738 return templ_7745c5c3_Err
25402739 }
@@ -2543,108 +2742,108 @@ func MRChecks(c ChecksSection) templ.Component {
25432742 return templ_7745c5c3_Err
25442743 }
25452744 if r.Href != "" {
2546- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "<a href=\"")
2745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 231, "<a href=\"")
25472746 if templ_7745c5c3_Err != nil {
25482747 return templ_7745c5c3_Err
25492748 }
2550- var templ_7745c5c3_Var133 templ.SafeURL
2551- templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
2749+ var templ_7745c5c3_Var144 templ.SafeURL
2750+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
25522751 if templ_7745c5c3_Err != nil {
2553- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 38}
2752+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 389, Col: 38}
25542753 }
2555- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
2754+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var144))
25562755 if templ_7745c5c3_Err != nil {
25572756 return templ_7745c5c3_Err
25582757 }
2559- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "\">")
2758+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 232, "\">")
25602759 if templ_7745c5c3_Err != nil {
25612760 return templ_7745c5c3_Err
25622761 }
2563- var templ_7745c5c3_Var134 string
2564- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
2762+ var templ_7745c5c3_Var145 string
2763+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
25652764 if templ_7745c5c3_Err != nil {
2566- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 49}
2765+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 389, Col: 49}
25672766 }
2568- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2767+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
25692768 if templ_7745c5c3_Err != nil {
25702769 return templ_7745c5c3_Err
25712770 }
2572- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</a> ")
2771+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 233, "</a> ")
25732772 if templ_7745c5c3_Err != nil {
25742773 return templ_7745c5c3_Err
25752774 }
25762775 } else {
2577- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span>")
2776+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 234, "<span>")
25782777 if templ_7745c5c3_Err != nil {
25792778 return templ_7745c5c3_Err
25802779 }
2581- var templ_7745c5c3_Var135 string
2582- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
2780+ var templ_7745c5c3_Var146 string
2781+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
25832782 if templ_7745c5c3_Err != nil {
2584- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 21}
2783+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 391, Col: 21}
25852784 }
2586- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))
2785+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
25872786 if templ_7745c5c3_Err != nil {
25882787 return templ_7745c5c3_Err
25892788 }
2590- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ")
2789+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 235, "</span> ")
25912790 if templ_7745c5c3_Err != nil {
25922791 return templ_7745c5c3_Err
25932792 }
25942793 }
2595- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"dim\">")
2794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 236, "<span class=\"dim\">")
25962795 if templ_7745c5c3_Err != nil {
25972796 return templ_7745c5c3_Err
25982797 }
2599- var templ_7745c5c3_Var136 string
2600- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(r.State)
2798+ var templ_7745c5c3_Var147 string
2799+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(r.State)
26012800 if templ_7745c5c3_Err != nil {
2602- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 33}
2801+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 393, Col: 33}
26032802 }
2604- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
2803+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
26052804 if templ_7745c5c3_Err != nil {
26062805 return templ_7745c5c3_Err
26072806 }
2608- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</span> ")
2807+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 237, "</span> ")
26092808 if templ_7745c5c3_Err != nil {
26102809 return templ_7745c5c3_Err
26112810 }
26122811 if r.Waiting {
2613- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "<span class=\"mute\">waiting for a runner</span>")
2812+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 238, "<span class=\"mute\">waiting for a runner</span>")
26142813 if templ_7745c5c3_Err != nil {
26152814 return templ_7745c5c3_Err
26162815 }
26172816 }
2618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "</li>")
2817+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 239, "</li>")
26192818 if templ_7745c5c3_Err != nil {
26202819 return templ_7745c5c3_Err
26212820 }
26222821 }
2623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</ul>")
2822+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, "</ul>")
26242823 if templ_7745c5c3_Err != nil {
26252824 return templ_7745c5c3_Err
26262825 }
26272826 }
26282827 if c.Note != "" {
2629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "<p class=\"mute\">")
2828+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "<p class=\"mute\">")
26302829 if templ_7745c5c3_Err != nil {
26312830 return templ_7745c5c3_Err
26322831 }
2633- var templ_7745c5c3_Var137 string
2634- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note)
2832+ var templ_7745c5c3_Var148 string
2833+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note)
26352834 if templ_7745c5c3_Err != nil {
2636- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 381, Col: 27}
2835+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 402, Col: 27}
26372836 }
2638- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
2837+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
26392838 if templ_7745c5c3_Err != nil {
26402839 return templ_7745c5c3_Err
26412840 }
2642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "</p>")
2841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "</p>")
26432842 if templ_7745c5c3_Err != nil {
26442843 return templ_7745c5c3_Err
26452844 }
26462845 }
2647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</section>")
2846+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, "</section>")
26482847 if templ_7745c5c3_Err != nil {
26492848 return templ_7745c5c3_Err
26502849 }
@@ -446,7 +446,9 @@ func RunListRow(r RunRow) templ.Component {
446 })446 })
447 }447 }
448 448
449-func RunDetail(l Layout, p RunPage) templ.Component {449+// RecentActionsBlock is the "Recent actions" section of the summary rail; its
450+// id is the target of the live updates. Without a run it is hidden.
451+func RecentActionsBlock(a RecentActions) templ.Component {
450 return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {452 return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
451 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context453 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
452 if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {454 if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
@@ -467,7 +469,204 @@ func RunDetail(l Layout, p RunPage) templ.Component {
467 templ_7745c5c3_Var27 = templ.NopComponent469 templ_7745c5c3_Var27 = templ.NopComponent
468 }470 }
469 ctx = templ.ClearChildren(ctx)471 ctx = templ.ClearChildren(ctx)
470- templ_7745c5c3_Var28 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {472+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section id=\"recent-actions\" aria-labelledby=\"r-actions\"")
473+ if templ_7745c5c3_Err != nil {
474+ return templ_7745c5c3_Err
475+ }
476+ if len(a.Runs) == 0 {
477+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " hidden")
478+ if templ_7745c5c3_Err != nil {
479+ return templ_7745c5c3_Err
480+ }
481+ }
482+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "><h2 id=\"r-actions\">Recent actions <a href=\"")
483+ if templ_7745c5c3_Err != nil {
484+ return templ_7745c5c3_Err
485+ }
486+ var templ_7745c5c3_Var28 templ.SafeURL
487+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.AllHref))
488+ if templ_7745c5c3_Err != nil {
489+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 63, Col: 70}
490+ }
491+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
492+ if templ_7745c5c3_Err != nil {
493+ return templ_7745c5c3_Err
494+ }
495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "\">View all</a></h2><ul class=\"rruns\">")
496+ if templ_7745c5c3_Err != nil {
497+ return templ_7745c5c3_Err
498+ }
499+ for _, r := range a.Runs {
500+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<li>")
501+ if templ_7745c5c3_Err != nil {
502+ return templ_7745c5c3_Err
503+ }
504+ templ_7745c5c3_Err = CheckIcon(r.Kind, r.State).Render(ctx, templ_7745c5c3_Buffer)
505+ if templ_7745c5c3_Err != nil {
506+ return templ_7745c5c3_Err
507+ }
508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<a class=\"rr-name\" href=\"")
509+ if templ_7745c5c3_Err != nil {
510+ return templ_7745c5c3_Err
511+ }
512+ var templ_7745c5c3_Var29 templ.SafeURL
513+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
514+ if templ_7745c5c3_Err != nil {
515+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 52}
516+ }
517+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
518+ if templ_7745c5c3_Err != nil {
519+ return templ_7745c5c3_Err
520+ }
521+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "\" title=\"")
522+ if templ_7745c5c3_Err != nil {
523+ return templ_7745c5c3_Err
524+ }
525+ var templ_7745c5c3_Var30 string
526+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.Workflow + " " + r.Number + " · " + r.State)
527+ if templ_7745c5c3_Err != nil {
528+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 109}
529+ }
530+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30)
531+ if templ_7745c5c3_Err != nil {
532+ return templ_7745c5c3_Err
533+ }
534+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "\">")
535+ if templ_7745c5c3_Err != nil {
536+ return templ_7745c5c3_Err
537+ }
538+ var templ_7745c5c3_Var31 string
539+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Workflow)
540+ if templ_7745c5c3_Err != nil {
541+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 68, Col: 124}
542+ }
543+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
544+ if templ_7745c5c3_Err != nil {
545+ return templ_7745c5c3_Err
546+ }
547+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</a> <span class=\"mute\">")
548+ if templ_7745c5c3_Err != nil {
549+ return templ_7745c5c3_Err
550+ }
551+ var templ_7745c5c3_Var32 string
552+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Number)
553+ if templ_7745c5c3_Err != nil {
554+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 69, Col: 34}
555+ }
556+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
557+ if templ_7745c5c3_Err != nil {
558+ return templ_7745c5c3_Err
559+ }
560+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</span> <a class=\"rr-ref\" href=\"")
561+ if templ_7745c5c3_Err != nil {
562+ return templ_7745c5c3_Err
563+ }
564+ var templ_7745c5c3_Var33 templ.SafeURL
565+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.RefHref))
566+ if templ_7745c5c3_Err != nil {
567+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 70, Col: 54}
568+ }
569+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
570+ if templ_7745c5c3_Err != nil {
571+ return templ_7745c5c3_Err
572+ }
573+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\">")
574+ if templ_7745c5c3_Err != nil {
575+ return templ_7745c5c3_Err
576+ }
577+ var templ_7745c5c3_Var34 string
578+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Ref)
579+ if templ_7745c5c3_Err != nil {
580+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 70, Col: 64}
581+ }
582+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
583+ if templ_7745c5c3_Err != nil {
584+ return templ_7745c5c3_Err
585+ }
586+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a> ")
587+ if templ_7745c5c3_Err != nil {
588+ return templ_7745c5c3_Err
589+ }
590+ if r.WhenAt != "" {
591+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<time class=\"dim\" datetime=\"")
592+ if templ_7745c5c3_Err != nil {
593+ return templ_7745c5c3_Err
594+ }
595+ var templ_7745c5c3_Var35 string
596+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
597+ if templ_7745c5c3_Err != nil {
598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 43}
599+ }
600+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
601+ if templ_7745c5c3_Err != nil {
602+ return templ_7745c5c3_Err
603+ }
604+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\" title=\"")
605+ if templ_7745c5c3_Err != nil {
606+ return templ_7745c5c3_Err
607+ }
608+ var templ_7745c5c3_Var36 string
609+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
610+ if templ_7745c5c3_Err != nil {
611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 62}
612+ }
613+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)
614+ if templ_7745c5c3_Err != nil {
615+ return templ_7745c5c3_Err
616+ }
617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\">")
618+ if templ_7745c5c3_Err != nil {
619+ return templ_7745c5c3_Err
620+ }
621+ var templ_7745c5c3_Var37 string
622+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
623+ if templ_7745c5c3_Err != nil {
624+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 72, Col: 73}
625+ }
626+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
627+ if templ_7745c5c3_Err != nil {
628+ return templ_7745c5c3_Err
629+ }
630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</time>")
631+ if templ_7745c5c3_Err != nil {
632+ return templ_7745c5c3_Err
633+ }
634+ }
635+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</li>")
636+ if templ_7745c5c3_Err != nil {
637+ return templ_7745c5c3_Err
638+ }
639+ }
640+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</ul></section>")
641+ if templ_7745c5c3_Err != nil {
642+ return templ_7745c5c3_Err
643+ }
644+ return nil
645+ })
646+}
647+
648+func RunDetail(l Layout, p RunPage) templ.Component {
649+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
650+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
651+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
652+ return templ_7745c5c3_CtxErr
653+ }
654+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
655+ if !templ_7745c5c3_IsBuffer {
656+ defer func() {
657+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
658+ if templ_7745c5c3_Err == nil {
659+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
660+ }
661+ }()
662+ }
663+ ctx = templ.InitializeContext(ctx)
664+ templ_7745c5c3_Var38 := templ.GetChildren(ctx)
665+ if templ_7745c5c3_Var38 == nil {
666+ templ_7745c5c3_Var38 = templ.NopComponent
667+ }
668+ ctx = templ.ClearChildren(ctx)
669+ templ_7745c5c3_Var39 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
471 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context670 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
472 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)671 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
473 if !templ_7745c5c3_IsBuffer {672 if !templ_7745c5c3_IsBuffer {
@@ -483,7 +682,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
483 if templ_7745c5c3_Err != nil {682 if templ_7745c5c3_Err != nil {
484 return templ_7745c5c3_Err683 return templ_7745c5c3_Err
485 }684 }
486- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, " <div id=\"run-body\">")685+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, " <div id=\"run-body\">")
487 if templ_7745c5c3_Err != nil {686 if templ_7745c5c3_Err != nil {
488 return templ_7745c5c3_Err687 return templ_7745c5c3_Err
489 }688 }
@@ -491,7 +690,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
491 if templ_7745c5c3_Err != nil {690 if templ_7745c5c3_Err != nil {
492 return templ_7745c5c3_Err691 return templ_7745c5c3_Err
493 }692 }
494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</div>")693+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</div>")
495 if templ_7745c5c3_Err != nil {694 if templ_7745c5c3_Err != nil {
496 return templ_7745c5c3_Err695 return templ_7745c5c3_Err
497 }696 }
@@ -501,7 +700,7 @@ func RunDetail(l Layout, p RunPage) templ.Component {
501 }700 }
502 return nil701 return nil
503 })702 })
504- templ_7745c5c3_Err = Shell(l, runRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var28), templ_7745c5c3_Buffer)703+ templ_7745c5c3_Err = Shell(l, runRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var39), templ_7745c5c3_Buffer)
505 if templ_7745c5c3_Err != nil {704 if templ_7745c5c3_Err != nil {
506 return templ_7745c5c3_Err705 return templ_7745c5c3_Err
507 }706 }
@@ -526,12 +725,12 @@ func runBodyFragment(p RunPage) templ.Component {
526 }()725 }()
527 }726 }
528 ctx = templ.InitializeContext(ctx)727 ctx = templ.InitializeContext(ctx)
529- templ_7745c5c3_Var29 := templ.GetChildren(ctx)728+ templ_7745c5c3_Var40 := templ.GetChildren(ctx)
530- if templ_7745c5c3_Var29 == nil {729+ if templ_7745c5c3_Var40 == nil {
531- templ_7745c5c3_Var29 = templ.NopComponent730+ templ_7745c5c3_Var40 = templ.NopComponent
532 }731 }
533 ctx = templ.ClearChildren(ctx)732 ctx = templ.ClearChildren(ctx)
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div id=\"run-body\">")733+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<div id=\"run-body\">")
535 if templ_7745c5c3_Err != nil {734 if templ_7745c5c3_Err != nil {
536 return templ_7745c5c3_Err735 return templ_7745c5c3_Err
537 }736 }
@@ -539,7 +738,7 @@ func runBodyFragment(p RunPage) templ.Component {
539 if templ_7745c5c3_Err != nil {738 if templ_7745c5c3_Err != nil {
540 return templ_7745c5c3_Err739 return templ_7745c5c3_Err
541 }740 }
542- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</div>")741+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</div>")
543 if templ_7745c5c3_Err != nil {742 if templ_7745c5c3_Err != nil {
544 return templ_7745c5c3_Err743 return templ_7745c5c3_Err
545 }744 }
@@ -564,12 +763,12 @@ func RunBody(p RunPage) templ.Component {
564 }()763 }()
565 }764 }
566 ctx = templ.InitializeContext(ctx)765 ctx = templ.InitializeContext(ctx)
567- templ_7745c5c3_Var30 := templ.GetChildren(ctx)766+ templ_7745c5c3_Var41 := templ.GetChildren(ctx)
568- if templ_7745c5c3_Var30 == nil {767+ if templ_7745c5c3_Var41 == nil {
569- templ_7745c5c3_Var30 = templ.NopComponent768+ templ_7745c5c3_Var41 = templ.NopComponent
570 }769 }
571 ctx = templ.ClearChildren(ctx)770 ctx = templ.ClearChildren(ctx)
572- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<h2 class=\"run-h\">")771+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<h2 class=\"run-h\">")
573 if templ_7745c5c3_Err != nil {772 if templ_7745c5c3_Err != nil {
574 return templ_7745c5c3_Err773 return templ_7745c5c3_Err
575 }774 }
@@ -577,70 +776,70 @@ func RunBody(p RunPage) templ.Component {
577 if templ_7745c5c3_Err != nil {776 if templ_7745c5c3_Err != nil {
578 return templ_7745c5c3_Err777 return templ_7745c5c3_Err
579 }778 }
580- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<span>")779+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "<span>")
581 if templ_7745c5c3_Err != nil {780 if templ_7745c5c3_Err != nil {
582 return templ_7745c5c3_Err781 return templ_7745c5c3_Err
583 }782 }
584- var templ_7745c5c3_Var31 string783+ var templ_7745c5c3_Var42 string
585- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(p.Workflow)784+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(p.Workflow)
586 if templ_7745c5c3_Err != nil {785 if templ_7745c5c3_Err != nil {
587- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 78, Col: 64}786+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 99, Col: 64}
588 }787 }
589- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))788+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
590 if templ_7745c5c3_Err != nil {789 if templ_7745c5c3_Err != nil {
591 return templ_7745c5c3_Err790 return templ_7745c5c3_Err
592 }791 }
593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</span> <span class=\"mute\">")792+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</span> <span class=\"mute\">")
594 if templ_7745c5c3_Err != nil {793 if templ_7745c5c3_Err != nil {
595 return templ_7745c5c3_Err794 return templ_7745c5c3_Err
596 }795 }
597- var templ_7745c5c3_Var32 string796+ var templ_7745c5c3_Var43 string
598- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(p.Number)797+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(p.Number)
599 if templ_7745c5c3_Err != nil {798 if templ_7745c5c3_Err != nil {
600- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 78, Col: 103}799+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 99, Col: 103}
601 }800 }
602- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))801+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
603 if templ_7745c5c3_Err != nil {802 if templ_7745c5c3_Err != nil {
604 return templ_7745c5c3_Err803 return templ_7745c5c3_Err
605 }804 }
606- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</span></h2>")805+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</span></h2>")
607 if templ_7745c5c3_Err != nil {806 if templ_7745c5c3_Err != nil {
608 return templ_7745c5c3_Err807 return templ_7745c5c3_Err
609 }808 }
610 if p.Error != "" {809 if p.Error != "" {
611- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<pre class=\"run-err\">")810+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<pre class=\"run-err\">")
612 if templ_7745c5c3_Err != nil {811 if templ_7745c5c3_Err != nil {
613 return templ_7745c5c3_Err812 return templ_7745c5c3_Err
614 }813 }
615- var templ_7745c5c3_Var33 string814+ var templ_7745c5c3_Var44 string
616- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(p.Error)815+ templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(p.Error)
617 if templ_7745c5c3_Err != nil {816 if templ_7745c5c3_Err != nil {
618- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 80, Col: 32}817+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 101, Col: 32}
619 }818 }
620- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))819+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
621 if templ_7745c5c3_Err != nil {820 if templ_7745c5c3_Err != nil {
622 return templ_7745c5c3_Err821 return templ_7745c5c3_Err
623 }822 }
624- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</pre>")823+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</pre>")
625 if templ_7745c5c3_Err != nil {824 if templ_7745c5c3_Err != nil {
626 return templ_7745c5c3_Err825 return templ_7745c5c3_Err
627 }826 }
628 }827 }
629 if len(p.Annotations) > 0 {828 if len(p.Annotations) > 0 {
630- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<section class=\"annots\" aria-labelledby=\"run-annots\"><h3 id=\"run-annots\">Annotations <span class=\"count\">")829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<section class=\"annots\" aria-labelledby=\"run-annots\"><h3 id=\"run-annots\">Annotations <span class=\"count\">")
631 if templ_7745c5c3_Err != nil {830 if templ_7745c5c3_Err != nil {
632 return templ_7745c5c3_Err831 return templ_7745c5c3_Err
633 }832 }
634- var templ_7745c5c3_Var34 string833+ var templ_7745c5c3_Var45 string
635- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Annotations)))834+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Annotations)))
636 if templ_7745c5c3_Err != nil {835 if templ_7745c5c3_Err != nil {
637- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 84, Col: 81}836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 105, Col: 81}
638 }837 }
639- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))838+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
640 if templ_7745c5c3_Err != nil {839 if templ_7745c5c3_Err != nil {
641 return templ_7745c5c3_Err840 return templ_7745c5c3_Err
642 }841 }
643- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</span></h3>")842+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</span></h3>")
644 if templ_7745c5c3_Err != nil {843 if templ_7745c5c3_Err != nil {
645 return templ_7745c5c3_Err844 return templ_7745c5c3_Err
646 }845 }
@@ -648,43 +847,43 @@ func RunBody(p RunPage) templ.Component {
648 if templ_7745c5c3_Err != nil {847 if templ_7745c5c3_Err != nil {
649 return templ_7745c5c3_Err848 return templ_7745c5c3_Err
650 }849 }
651- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</section>")850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</section>")
652 if templ_7745c5c3_Err != nil {851 if templ_7745c5c3_Err != nil {
653 return templ_7745c5c3_Err852 return templ_7745c5c3_Err
654 }853 }
655 }854 }
656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<ul class=\"jobs\">")855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<ul class=\"jobs\">")
657 if templ_7745c5c3_Err != nil {856 if templ_7745c5c3_Err != nil {
658 return templ_7745c5c3_Err857 return templ_7745c5c3_Err
659 }858 }
660 for _, j := range p.Jobs {859 for _, j := range p.Jobs {
661- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<li id=\"")860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<li id=\"")
662 if templ_7745c5c3_Err != nil {861 if templ_7745c5c3_Err != nil {
663 return templ_7745c5c3_Err862 return templ_7745c5c3_Err
664 }863 }
665- var templ_7745c5c3_Var35 string864+ var templ_7745c5c3_Var46 string
666- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue("job-" + j.ID)865+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.ResolveAttributeValue("job-" + j.ID)
667 if templ_7745c5c3_Err != nil {866 if templ_7745c5c3_Err != nil {
668- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 90, Col: 25}867+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 111, Col: 25}
669 }868 }
670- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)869+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var46)
671 if templ_7745c5c3_Err != nil {870 if templ_7745c5c3_Err != nil {
672 return templ_7745c5c3_Err871 return templ_7745c5c3_Err
673 }872 }
674- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\"><a class=\"job-h\" href=\"")873+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\"><a class=\"job-h\" href=\"")
675 if templ_7745c5c3_Err != nil {874 if templ_7745c5c3_Err != nil {
676 return templ_7745c5c3_Err875 return templ_7745c5c3_Err
677 }876 }
678- var templ_7745c5c3_Var36 templ.SafeURL877+ var templ_7745c5c3_Var47 templ.SafeURL
679- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.Href))878+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.Href))
680 if templ_7745c5c3_Err != nil {879 if templ_7745c5c3_Err != nil {
681- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 91, Col: 49}880+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 112, Col: 49}
682 }881 }
683- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))882+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
684 if templ_7745c5c3_Err != nil {883 if templ_7745c5c3_Err != nil {
685 return templ_7745c5c3_Err884 return templ_7745c5c3_Err
686 }885 }
687- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")886+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")
688 if templ_7745c5c3_Err != nil {887 if templ_7745c5c3_Err != nil {
689 return templ_7745c5c3_Err888 return templ_7745c5c3_Err
690 }889 }
@@ -692,118 +891,118 @@ func RunBody(p RunPage) templ.Component {
692 if templ_7745c5c3_Err != nil {891 if templ_7745c5c3_Err != nil {
693 return templ_7745c5c3_Err892 return templ_7745c5c3_Err
694 }893 }
695- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<span class=\"j-name\">")894+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<span class=\"j-name\">")
696 if templ_7745c5c3_Err != nil {895 if templ_7745c5c3_Err != nil {
697 return templ_7745c5c3_Err896 return templ_7745c5c3_Err
698 }897 }
699- var templ_7745c5c3_Var37 string898+ var templ_7745c5c3_Var48 string
700- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)899+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
701 if templ_7745c5c3_Err != nil {900 if templ_7745c5c3_Err != nil {
702- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 93, Col: 34}901+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 114, Col: 34}
703 }902 }
704- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))903+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
705 if templ_7745c5c3_Err != nil {904 if templ_7745c5c3_Err != nil {
706 return templ_7745c5c3_Err905 return templ_7745c5c3_Err
707 }906 }
708- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</span> <span class=\"dim\">")907+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</span> <span class=\"dim\">")
709 if templ_7745c5c3_Err != nil {908 if templ_7745c5c3_Err != nil {
710 return templ_7745c5c3_Err909 return templ_7745c5c3_Err
711 }910 }
712- var templ_7745c5c3_Var38 string911+ var templ_7745c5c3_Var49 string
713- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)912+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
714 if templ_7745c5c3_Err != nil {913 if templ_7745c5c3_Err != nil {
715- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 32}914+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 32}
716 }915 }
717- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))916+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
718 if templ_7745c5c3_Err != nil {917 if templ_7745c5c3_Err != nil {
719 return templ_7745c5c3_Err918 return templ_7745c5c3_Err
720 }919 }
721- var templ_7745c5c3_Var39 string920+ var templ_7745c5c3_Var50 string
722- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(" ")921+ templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
723 if templ_7745c5c3_Err != nil {922 if templ_7745c5c3_Err != nil {
724- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 39}923+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 39}
725 }924 }
726- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))925+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
727 if templ_7745c5c3_Err != nil {926 if templ_7745c5c3_Err != nil {
728 return templ_7745c5c3_Err927 return templ_7745c5c3_Err
729 }928 }
730- var templ_7745c5c3_Var40 string929+ var templ_7745c5c3_Var51 string
731- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)930+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
732 if templ_7745c5c3_Err != nil {931 if templ_7745c5c3_Err != nil {
733- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 94, Col: 53}932+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 115, Col: 53}
734 }933 }
735- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))934+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
736 if templ_7745c5c3_Err != nil {935 if templ_7745c5c3_Err != nil {
737 return templ_7745c5c3_Err936 return templ_7745c5c3_Err
738 }937 }
739- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</span></a> ")938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</span></a> ")
740 if templ_7745c5c3_Err != nil {939 if templ_7745c5c3_Err != nil {
741 return templ_7745c5c3_Err940 return templ_7745c5c3_Err
742 }941 }
743 if j.Runner != "" {942 if j.Runner != "" {
744- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<span class=\"mute\">on ")943+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<span class=\"mute\">on ")
745 if templ_7745c5c3_Err != nil {944 if templ_7745c5c3_Err != nil {
746 return templ_7745c5c3_Err945 return templ_7745c5c3_Err
747 }946 }
748- var templ_7745c5c3_Var41 string947+ var templ_7745c5c3_Var52 string
749- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(runnerText(j))948+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(runnerText(j))
750 if templ_7745c5c3_Err != nil {949 if templ_7745c5c3_Err != nil {
751- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 97, Col: 42}950+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 118, Col: 42}
752 }951 }
753- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))952+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
754 if templ_7745c5c3_Err != nil {953 if templ_7745c5c3_Err != nil {
755 return templ_7745c5c3_Err954 return templ_7745c5c3_Err
756 }955 }
757- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</span> ")956+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</span> ")
758 if templ_7745c5c3_Err != nil {957 if templ_7745c5c3_Err != nil {
759 return templ_7745c5c3_Err958 return templ_7745c5c3_Err
760 }959 }
761 }960 }
762 if len(j.Needs) > 0 {961 if len(j.Needs) > 0 {
763- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<span class=\"mute\">needs ")962+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<span class=\"mute\">needs ")
764 if templ_7745c5c3_Err != nil {963 if templ_7745c5c3_Err != nil {
765 return templ_7745c5c3_Err964 return templ_7745c5c3_Err
766 }965 }
767- var templ_7745c5c3_Var42 string966+ var templ_7745c5c3_Var53 string
768- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(joinWords(j.Needs))967+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(joinWords(j.Needs))
769 if templ_7745c5c3_Err != nil {968 if templ_7745c5c3_Err != nil {
770- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 100, Col: 50}969+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 121, Col: 50}
771 }970 }
772- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))971+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
773 if templ_7745c5c3_Err != nil {972 if templ_7745c5c3_Err != nil {
774 return templ_7745c5c3_Err973 return templ_7745c5c3_Err
775 }974 }
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</span> ")975+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</span> ")
777 if templ_7745c5c3_Err != nil {976 if templ_7745c5c3_Err != nil {
778 return templ_7745c5c3_Err977 return templ_7745c5c3_Err
779 }978 }
780 }979 }
781 if j.Error != "" {980 if j.Error != "" {
782- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "<p class=\"job-err\">")981+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<p class=\"job-err\">")
783 if templ_7745c5c3_Err != nil {982 if templ_7745c5c3_Err != nil {
784 return templ_7745c5c3_Err983 return templ_7745c5c3_Err
785 }984 }
786- var templ_7745c5c3_Var43 string985+ var templ_7745c5c3_Var54 string
787- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)986+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
788 if templ_7745c5c3_Err != nil {987 if templ_7745c5c3_Err != nil {
789- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 103, Col: 33}988+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 124, Col: 33}
790 }989 }
791- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))990+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
792 if templ_7745c5c3_Err != nil {991 if templ_7745c5c3_Err != nil {
793 return templ_7745c5c3_Err992 return templ_7745c5c3_Err
794 }993 }
795- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</p>")994+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</p>")
796 if templ_7745c5c3_Err != nil {995 if templ_7745c5c3_Err != nil {
797 return templ_7745c5c3_Err996 return templ_7745c5c3_Err
798 }997 }
799 }998 }
800 if len(j.Steps) > 0 {999 if len(j.Steps) > 0 {
801- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<ol class=\"steps\">")1000+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<ol class=\"steps\">")
802 if templ_7745c5c3_Err != nil {1001 if templ_7745c5c3_Err != nil {
803 return templ_7745c5c3_Err1002 return templ_7745c5c3_Err
804 }1003 }
805 for _, s := range j.Steps {1004 for _, s := range j.Steps {
806- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<li>")1005+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<li>")
807 if templ_7745c5c3_Err != nil {1006 if templ_7745c5c3_Err != nil {
808 return templ_7745c5c3_Err1007 return templ_7745c5c3_Err
809 }1008 }
@@ -811,48 +1010,48 @@ func RunBody(p RunPage) templ.Component {
811 if templ_7745c5c3_Err != nil {1010 if templ_7745c5c3_Err != nil {
812 return templ_7745c5c3_Err1011 return templ_7745c5c3_Err
813 }1012 }
814- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<span>")1013+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<span>")
815 if templ_7745c5c3_Err != nil {1014 if templ_7745c5c3_Err != nil {
816 return templ_7745c5c3_Err1015 return templ_7745c5c3_Err
817 }1016 }
818- var templ_7745c5c3_Var44 string1017+ var templ_7745c5c3_Var55 string
819- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)1018+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
820 if templ_7745c5c3_Err != nil {1019 if templ_7745c5c3_Err != nil {
821- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 108, Col: 53}1020+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 129, Col: 53}
822 }1021 }
823- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))1022+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
824 if templ_7745c5c3_Err != nil {1023 if templ_7745c5c3_Err != nil {
825 return templ_7745c5c3_Err1024 return templ_7745c5c3_Err
826 }1025 }
827- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</span> <span class=\"dim\">")1026+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span> <span class=\"dim\">")
828 if templ_7745c5c3_Err != nil {1027 if templ_7745c5c3_Err != nil {
829 return templ_7745c5c3_Err1028 return templ_7745c5c3_Err
830 }1029 }
831- var templ_7745c5c3_Var45 string1030+ var templ_7745c5c3_Var56 string
832- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)1031+ templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
833 if templ_7745c5c3_Err != nil {1032 if templ_7745c5c3_Err != nil {
834- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 108, Col: 93}1033+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 129, Col: 93}
835 }1034 }
836- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))1035+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
837 if templ_7745c5c3_Err != nil {1036 if templ_7745c5c3_Err != nil {
838 return templ_7745c5c3_Err1037 return templ_7745c5c3_Err
839 }1038 }
840- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</span></li>")1039+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</span></li>")
841 if templ_7745c5c3_Err != nil {1040 if templ_7745c5c3_Err != nil {
842 return templ_7745c5c3_Err1041 return templ_7745c5c3_Err
843 }1042 }
844 }1043 }
845- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</ol>")1044+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</ol>")
846 if templ_7745c5c3_Err != nil {1045 if templ_7745c5c3_Err != nil {
847 return templ_7745c5c3_Err1046 return templ_7745c5c3_Err
848 }1047 }
849 }1048 }
850- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</li>")1049+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</li>")
851 if templ_7745c5c3_Err != nil {1050 if templ_7745c5c3_Err != nil {
852 return templ_7745c5c3_Err1051 return templ_7745c5c3_Err
853 }1052 }
854 }1053 }
855- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</ul>")1054+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</ul>")
856 if templ_7745c5c3_Err != nil {1055 if templ_7745c5c3_Err != nil {
857 return templ_7745c5c3_Err1056 return templ_7745c5c3_Err
858 }1057 }
@@ -880,327 +1079,327 @@ func AnnotationList(anns []AnnotationView, more bool, grouped bool) templ.Compon
880 }()1079 }()
881 }1080 }
882 ctx = templ.InitializeContext(ctx)1081 ctx = templ.InitializeContext(ctx)
883- templ_7745c5c3_Var46 := templ.GetChildren(ctx)1082+ templ_7745c5c3_Var57 := templ.GetChildren(ctx)
884- if templ_7745c5c3_Var46 == nil {1083+ if templ_7745c5c3_Var57 == nil {
885- templ_7745c5c3_Var46 = templ.NopComponent1084+ templ_7745c5c3_Var57 = templ.NopComponent
886 }1085 }
887 ctx = templ.ClearChildren(ctx)1086 ctx = templ.ClearChildren(ctx)
888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<ul class=\"annot-list\">")1087+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<ul class=\"annot-list\">")
889 if templ_7745c5c3_Err != nil {1088 if templ_7745c5c3_Err != nil {
890 return templ_7745c5c3_Err1089 return templ_7745c5c3_Err
891 }1090 }
892 for _, a := range anns {1091 for _, a := range anns {
893- var templ_7745c5c3_Var47 = []any{"annot", "annot-" + a.Kind}1092+ var templ_7745c5c3_Var58 = []any{"annot", "annot-" + a.Kind}
894- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var47...)1093+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var58...)
895 if templ_7745c5c3_Err != nil {1094 if templ_7745c5c3_Err != nil {
896 return templ_7745c5c3_Err1095 return templ_7745c5c3_Err
897 }1096 }
898- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<li class=\"")1097+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<li class=\"")
899 if templ_7745c5c3_Err != nil {1098 if templ_7745c5c3_Err != nil {
900 return templ_7745c5c3_Err1099 return templ_7745c5c3_Err
901 }1100 }
902- var templ_7745c5c3_Var48 string1101+ var templ_7745c5c3_Var59 string
903- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var47).String())1102+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var58).String())
904 if templ_7745c5c3_Err != nil {1103 if templ_7745c5c3_Err != nil {
905 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}1104 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
906 }1105 }
907- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var48)1106+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
908 if templ_7745c5c3_Err != nil {1107 if templ_7745c5c3_Err != nil {
909 return templ_7745c5c3_Err1108 return templ_7745c5c3_Err
910 }1109 }
911- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\">")1110+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "\">")
912 if templ_7745c5c3_Err != nil {1111 if templ_7745c5c3_Err != nil {
913 return templ_7745c5c3_Err1112 return templ_7745c5c3_Err
914 }1113 }
915 if grouped && a.StepHead {1114 if grouped && a.StepHead {
916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<p class=\"annot-step\">")1115+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"annot-step\">")
917 if templ_7745c5c3_Err != nil {1116 if templ_7745c5c3_Err != nil {
918 return templ_7745c5c3_Err1117 return templ_7745c5c3_Err
919 }1118 }
920 if a.StepHref != "" {1119 if a.StepHref != "" {
921- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<a href=\"")1120+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<a href=\"")
922 if templ_7745c5c3_Err != nil {1121 if templ_7745c5c3_Err != nil {
923 return templ_7745c5c3_Err1122 return templ_7745c5c3_Err
924 }1123 }
925- var templ_7745c5c3_Var49 templ.SafeURL1124+ var templ_7745c5c3_Var60 templ.SafeURL
926- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.StepHref))1125+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.StepHref))
927 if templ_7745c5c3_Err != nil {1126 if templ_7745c5c3_Err != nil {
928- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 128, Col: 42}1127+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 149, Col: 42}
929 }1128 }
930- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))1129+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
931 if templ_7745c5c3_Err != nil {1130 if templ_7745c5c3_Err != nil {
932 return templ_7745c5c3_Err1131 return templ_7745c5c3_Err
933 }1132 }
934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "\">")1133+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "\">")
935 if templ_7745c5c3_Err != nil {1134 if templ_7745c5c3_Err != nil {
936 return templ_7745c5c3_Err1135 return templ_7745c5c3_Err
937 }1136 }
938- var templ_7745c5c3_Var50 string1137+ var templ_7745c5c3_Var61 string
939- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)1138+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
940 if templ_7745c5c3_Err != nil {1139 if templ_7745c5c3_Err != nil {
941- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 128, Col: 53}1140+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 149, Col: 53}
942 }1141 }
943- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))1142+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
944 if templ_7745c5c3_Err != nil {1143 if templ_7745c5c3_Err != nil {
945 return templ_7745c5c3_Err1144 return templ_7745c5c3_Err
946 }1145 }
947- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</a>")1146+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</a>")
948 if templ_7745c5c3_Err != nil {1147 if templ_7745c5c3_Err != nil {
949 return templ_7745c5c3_Err1148 return templ_7745c5c3_Err
950 }1149 }
951 } else {1150 } else {
952- var templ_7745c5c3_Var51 string1151+ var templ_7745c5c3_Var62 string
953- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)1152+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
954 if templ_7745c5c3_Err != nil {1153 if templ_7745c5c3_Err != nil {
955- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 130, Col: 15}1154+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 151, Col: 15}
956 }1155 }
957- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))1156+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
958 if templ_7745c5c3_Err != nil {1157 if templ_7745c5c3_Err != nil {
959 return templ_7745c5c3_Err1158 return templ_7745c5c3_Err
960 }1159 }
961 }1160 }
962- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</p>")1161+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</p>")
963 if templ_7745c5c3_Err != nil {1162 if templ_7745c5c3_Err != nil {
964 return templ_7745c5c3_Err1163 return templ_7745c5c3_Err
965 }1164 }
966 }1165 }
967- var templ_7745c5c3_Var52 = []any{"an", "an-" + a.Kind}1166+ var templ_7745c5c3_Var63 = []any{"an", "an-" + a.Kind}
968- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var52...)1167+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var63...)
969 if templ_7745c5c3_Err != nil {1168 if templ_7745c5c3_Err != nil {
970 return templ_7745c5c3_Err1169 return templ_7745c5c3_Err
971 }1170 }
972- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<span class=\"")1171+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<span class=\"")
973 if templ_7745c5c3_Err != nil {1172 if templ_7745c5c3_Err != nil {
974 return templ_7745c5c3_Err1173 return templ_7745c5c3_Err
975 }1174 }
976- var templ_7745c5c3_Var53 string1175+ var templ_7745c5c3_Var64 string
977- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var52).String())1176+ templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var63).String())
978 if templ_7745c5c3_Err != nil {1177 if templ_7745c5c3_Err != nil {
979 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}1178 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
980 }1179 }
981- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var53)1180+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)
982 if templ_7745c5c3_Err != nil {1181 if templ_7745c5c3_Err != nil {
983 return templ_7745c5c3_Err1182 return templ_7745c5c3_Err
984 }1183 }
985- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "\" role=\"img\" aria-label=\"")1184+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "\" role=\"img\" aria-label=\"")
986 if templ_7745c5c3_Err != nil {1185 if templ_7745c5c3_Err != nil {
987 return templ_7745c5c3_Err1186 return templ_7745c5c3_Err
988 }1187 }
989- var templ_7745c5c3_Var54 string1188+ var templ_7745c5c3_Var65 string
990- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)1189+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
991 if templ_7745c5c3_Err != nil {1190 if templ_7745c5c3_Err != nil {
992- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 134, Col: 72}1191+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 155, Col: 72}
993 }1192 }
994- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var54)1193+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65)
995 if templ_7745c5c3_Err != nil {1194 if templ_7745c5c3_Err != nil {
996 return templ_7745c5c3_Err1195 return templ_7745c5c3_Err
997 }1196 }
998- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "\" title=\"")1197+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "\" title=\"")
999 if templ_7745c5c3_Err != nil {1198 if templ_7745c5c3_Err != nil {
1000 return templ_7745c5c3_Err1199 return templ_7745c5c3_Err
1001 }1200 }
1002- var templ_7745c5c3_Var55 string1201+ var templ_7745c5c3_Var66 string
1003- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)1202+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.ResolveAttributeValue(a.Level)
1004 if templ_7745c5c3_Err != nil {1203 if templ_7745c5c3_Err != nil {
1005- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 134, Col: 90}1204+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 155, Col: 90}
1006 }1205 }
1007- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var55)1206+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var66)
1008 if templ_7745c5c3_Err != nil {1207 if templ_7745c5c3_Err != nil {
1009 return templ_7745c5c3_Err1208 return templ_7745c5c3_Err
1010 }1209 }
1011- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "\"></span><div class=\"annot-body\"><p class=\"annot-head\"><span class=\"annot-level\">")1210+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "\"></span><div class=\"annot-body\"><p class=\"annot-head\"><span class=\"annot-level\">")
1012 if templ_7745c5c3_Err != nil {1211 if templ_7745c5c3_Err != nil {
1013 return templ_7745c5c3_Err1212 return templ_7745c5c3_Err
1014 }1213 }
1015- var templ_7745c5c3_Var56 string1214+ var templ_7745c5c3_Var67 string
1016- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(a.Level)1215+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(a.Level)
1017 if templ_7745c5c3_Err != nil {1216 if templ_7745c5c3_Err != nil {
1018- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 137, Col: 41}1217+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 158, Col: 41}
1019 }1218 }
1020- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))1219+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))
1021 if templ_7745c5c3_Err != nil {1220 if templ_7745c5c3_Err != nil {
1022 return templ_7745c5c3_Err1221 return templ_7745c5c3_Err
1023 }1222 }
1024- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</span> ")1223+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</span> ")
1025 if templ_7745c5c3_Err != nil {1224 if templ_7745c5c3_Err != nil {
1026 return templ_7745c5c3_Err1225 return templ_7745c5c3_Err
1027 }1226 }
1028 if !grouped {1227 if !grouped {
1029 if a.JobHref != "" {1228 if a.JobHref != "" {
1030- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "<a href=\"")1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<a href=\"")
1031 if templ_7745c5c3_Err != nil {1230 if templ_7745c5c3_Err != nil {
1032 return templ_7745c5c3_Err1231 return templ_7745c5c3_Err
1033 }1232 }
1034- var templ_7745c5c3_Var57 templ.SafeURL1233+ var templ_7745c5c3_Var68 templ.SafeURL
1035- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.JobHref))1234+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.JobHref))
1036 if templ_7745c5c3_Err != nil {1235 if templ_7745c5c3_Err != nil {
1037- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 140, Col: 42}1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 161, Col: 42}
1038 }1237 }
1039- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
1040 if templ_7745c5c3_Err != nil {1239 if templ_7745c5c3_Err != nil {
1041 return templ_7745c5c3_Err1240 return templ_7745c5c3_Err
1042 }1241 }
1043- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\">")1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "\">")
1044 if templ_7745c5c3_Err != nil {1243 if templ_7745c5c3_Err != nil {
1045 return templ_7745c5c3_Err1244 return templ_7745c5c3_Err
1046 }1245 }
1047- var templ_7745c5c3_Var58 string1246+ var templ_7745c5c3_Var69 string
1048- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)1247+ templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
1049 if templ_7745c5c3_Err != nil {1248 if templ_7745c5c3_Err != nil {
1050- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 140, Col: 52}1249+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 161, Col: 52}
1051 }1250 }
1052- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))1251+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69))
1053 if templ_7745c5c3_Err != nil {1252 if templ_7745c5c3_Err != nil {
1054 return templ_7745c5c3_Err1253 return templ_7745c5c3_Err
1055 }1254 }
1056- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</a>")1255+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</a>")
1057 if templ_7745c5c3_Err != nil {1256 if templ_7745c5c3_Err != nil {
1058 return templ_7745c5c3_Err1257 return templ_7745c5c3_Err
1059 }1258 }
1060 } else {1259 } else {
1061- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<span>")1260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "<span>")
1062 if templ_7745c5c3_Err != nil {1261 if templ_7745c5c3_Err != nil {
1063 return templ_7745c5c3_Err1262 return templ_7745c5c3_Err
1064 }1263 }
1065- var templ_7745c5c3_Var59 string1264+ var templ_7745c5c3_Var70 string
1066- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)1265+ templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(a.Job)
1067 if templ_7745c5c3_Err != nil {1266 if templ_7745c5c3_Err != nil {
1068- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 142, Col: 21}1267+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 163, Col: 21}
1069 }1268 }
1070- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))1269+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
1071 if templ_7745c5c3_Err != nil {1270 if templ_7745c5c3_Err != nil {
1072 return templ_7745c5c3_Err1271 return templ_7745c5c3_Err
1073 }1272 }
1074- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</span>")1273+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "</span>")
1075 if templ_7745c5c3_Err != nil {1274 if templ_7745c5c3_Err != nil {
1076 return templ_7745c5c3_Err1275 return templ_7745c5c3_Err
1077 }1276 }
1078 }1277 }
1079- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, " <span class=\"mute\">")1278+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, " <span class=\"mute\">")
1080 if templ_7745c5c3_Err != nil {1279 if templ_7745c5c3_Err != nil {
1081 return templ_7745c5c3_Err1280 return templ_7745c5c3_Err
1082 }1281 }
1083- var templ_7745c5c3_Var60 string1282+ var templ_7745c5c3_Var71 string
1084- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)1283+ templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(a.Step)
1085 if templ_7745c5c3_Err != nil {1284 if templ_7745c5c3_Err != nil {
1086- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 144, Col: 34}1285+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 165, Col: 34}
1087 }1286 }
1088- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))1287+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
1089 if templ_7745c5c3_Err != nil {1288 if templ_7745c5c3_Err != nil {
1090 return templ_7745c5c3_Err1289 return templ_7745c5c3_Err
1091 }1290 }
1092- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</span> ")1291+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</span> ")
1093 if templ_7745c5c3_Err != nil {1292 if templ_7745c5c3_Err != nil {
1094 return templ_7745c5c3_Err1293 return templ_7745c5c3_Err
1095 }1294 }
1096 }1295 }
1097 if a.Title != "" {1296 if a.Title != "" {
1098- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<strong>")1297+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "<strong>")
1099 if templ_7745c5c3_Err != nil {1298 if templ_7745c5c3_Err != nil {
1100 return templ_7745c5c3_Err1299 return templ_7745c5c3_Err
1101 }1300 }
1102- var templ_7745c5c3_Var61 string1301+ var templ_7745c5c3_Var72 string
1103- templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(a.Title)1302+ templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(a.Title)
1104 if templ_7745c5c3_Err != nil {1303 if templ_7745c5c3_Err != nil {
1105- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 147, Col: 24}1304+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 168, Col: 24}
1106 }1305 }
1107- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))1306+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72))
1108 if templ_7745c5c3_Err != nil {1307 if templ_7745c5c3_Err != nil {
1109 return templ_7745c5c3_Err1308 return templ_7745c5c3_Err
1110 }1309 }
1111- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</strong>")1310+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</strong>")
1112 if templ_7745c5c3_Err != nil {1311 if templ_7745c5c3_Err != nil {
1113 return templ_7745c5c3_Err1312 return templ_7745c5c3_Err
1114 }1313 }
1115 }1314 }
1116- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p><p class=\"annot-msg\">")1315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "</p><p class=\"annot-msg\">")
1117 if templ_7745c5c3_Err != nil {1316 if templ_7745c5c3_Err != nil {
1118 return templ_7745c5c3_Err1317 return templ_7745c5c3_Err
1119 }1318 }
1120- var templ_7745c5c3_Var62 string1319+ var templ_7745c5c3_Var73 string
1121- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(a.Message)1320+ templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.JoinStringErrs(a.Message)
1122 if templ_7745c5c3_Err != nil {1321 if templ_7745c5c3_Err != nil {
1123- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 150, Col: 37}1322+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 171, Col: 37}
1124 }1323 }
1125- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))1324+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var73))
1126 if templ_7745c5c3_Err != nil {1325 if templ_7745c5c3_Err != nil {
1127 return templ_7745c5c3_Err1326 return templ_7745c5c3_Err
1128 }1327 }
1129- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</p>")1328+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "</p>")
1130 if templ_7745c5c3_Err != nil {1329 if templ_7745c5c3_Err != nil {
1131 return templ_7745c5c3_Err1330 return templ_7745c5c3_Err
1132 }1331 }
1133 if a.Where != "" {1332 if a.Where != "" {
1134- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<p class=\"annot-where\">")1333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "<p class=\"annot-where\">")
1135 if templ_7745c5c3_Err != nil {1334 if templ_7745c5c3_Err != nil {
1136 return templ_7745c5c3_Err1335 return templ_7745c5c3_Err
1137 }1336 }
1138 if a.WhereHref != "" {1337 if a.WhereHref != "" {
1139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "<a href=\"")1338+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<a href=\"")
1140 if templ_7745c5c3_Err != nil {1339 if templ_7745c5c3_Err != nil {
1141 return templ_7745c5c3_Err1340 return templ_7745c5c3_Err
1142 }1341 }
1143- var templ_7745c5c3_Var63 templ.SafeURL1342+ var templ_7745c5c3_Var74 templ.SafeURL
1144- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.WhereHref))1343+ templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.WhereHref))
1145 if templ_7745c5c3_Err != nil {1344 if templ_7745c5c3_Err != nil {
1146- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 154, Col: 44}1345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 44}
1147 }1346 }
1148- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))1347+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var74))
1149 if templ_7745c5c3_Err != nil {1348 if templ_7745c5c3_Err != nil {
1150 return templ_7745c5c3_Err1349 return templ_7745c5c3_Err
1151 }1350 }
1152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "\">")1351+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "\">")
1153 if templ_7745c5c3_Err != nil {1352 if templ_7745c5c3_Err != nil {
1154 return templ_7745c5c3_Err1353 return templ_7745c5c3_Err
1155 }1354 }
1156- var templ_7745c5c3_Var64 string1355+ var templ_7745c5c3_Var75 string
1157- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)1356+ templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
1158 if templ_7745c5c3_Err != nil {1357 if templ_7745c5c3_Err != nil {
1159- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 154, Col: 56}1358+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 56}
1160 }1359 }
1161- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64))1360+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))
1162 if templ_7745c5c3_Err != nil {1361 if templ_7745c5c3_Err != nil {
1163 return templ_7745c5c3_Err1362 return templ_7745c5c3_Err
1164 }1363 }
1165- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "</a>")1364+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "</a>")
1166 if templ_7745c5c3_Err != nil {1365 if templ_7745c5c3_Err != nil {
1167 return templ_7745c5c3_Err1366 return templ_7745c5c3_Err
1168 }1367 }
1169 } else {1368 } else {
1170- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "<span>")1369+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "<span>")
1171 if templ_7745c5c3_Err != nil {1370 if templ_7745c5c3_Err != nil {
1172 return templ_7745c5c3_Err1371 return templ_7745c5c3_Err
1173 }1372 }
1174- var templ_7745c5c3_Var65 string1373+ var templ_7745c5c3_Var76 string
1175- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)1374+ templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(a.Where)
1176 if templ_7745c5c3_Err != nil {1375 if templ_7745c5c3_Err != nil {
1177- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 156, Col: 23}1376+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 177, Col: 23}
1178 }1377 }
1179- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))1378+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76))
1180 if templ_7745c5c3_Err != nil {1379 if templ_7745c5c3_Err != nil {
1181 return templ_7745c5c3_Err1380 return templ_7745c5c3_Err
1182 }1381 }
1183- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "</span>")1382+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "</span>")
1184 if templ_7745c5c3_Err != nil {1383 if templ_7745c5c3_Err != nil {
1185 return templ_7745c5c3_Err1384 return templ_7745c5c3_Err
1186 }1385 }
1187 }1386 }
1188- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</p>")1387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "</p>")
1189 if templ_7745c5c3_Err != nil {1388 if templ_7745c5c3_Err != nil {
1190 return templ_7745c5c3_Err1389 return templ_7745c5c3_Err
1191 }1390 }
1192 }1391 }
1193- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</div></li>")1392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</div></li>")
1194 if templ_7745c5c3_Err != nil {1393 if templ_7745c5c3_Err != nil {
1195 return templ_7745c5c3_Err1394 return templ_7745c5c3_Err
1196 }1395 }
1197 }1396 }
1198- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</ul>")1397+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "</ul>")
1199 if templ_7745c5c3_Err != nil {1398 if templ_7745c5c3_Err != nil {
1200 return templ_7745c5c3_Err1399 return templ_7745c5c3_Err
1201 }1400 }
1202 if more {1401 if more {
1203- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<p class=\"mute\">more annotations exist than are shown.</p>")1402+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"mute\">more annotations exist than are shown.</p>")
1204 if templ_7745c5c3_Err != nil {1403 if templ_7745c5c3_Err != nil {
1205 return templ_7745c5c3_Err1404 return templ_7745c5c3_Err
1206 }1405 }
@@ -1228,30 +1427,30 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component {
1228 }()1427 }()
1229 }1428 }
1230 ctx = templ.InitializeContext(ctx)1429 ctx = templ.InitializeContext(ctx)
1231- templ_7745c5c3_Var66 := templ.GetChildren(ctx)1430+ templ_7745c5c3_Var77 := templ.GetChildren(ctx)
1232- if templ_7745c5c3_Var66 == nil {1431+ if templ_7745c5c3_Var77 == nil {
1233- templ_7745c5c3_Var66 = templ.NopComponent1432+ templ_7745c5c3_Var77 = templ.NopComponent
1234 }1433 }
1235 ctx = templ.ClearChildren(ctx)1434 ctx = templ.ClearChildren(ctx)
1236- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "<section id=\"job-annotations\" class=\"annots\" aria-label=\"Annotations\">")1435+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "<section id=\"job-annotations\" class=\"annots\" aria-label=\"Annotations\">")
1237 if templ_7745c5c3_Err != nil {1436 if templ_7745c5c3_Err != nil {
1238 return templ_7745c5c3_Err1437 return templ_7745c5c3_Err
1239 }1438 }
1240 if len(anns) > 0 {1439 if len(anns) > 0 {
1241- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "<h3>Annotations <span class=\"count\">")1440+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<h3>Annotations <span class=\"count\">")
1242 if templ_7745c5c3_Err != nil {1441 if templ_7745c5c3_Err != nil {
1243 return templ_7745c5c3_Err1442 return templ_7745c5c3_Err
1244 }1443 }
1245- var templ_7745c5c3_Var67 string1444+ var templ_7745c5c3_Var78 string
1246- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(anns)))1445+ templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(anns)))
1247 if templ_7745c5c3_Err != nil {1446 if templ_7745c5c3_Err != nil {
1248- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 175, Col: 56}1447+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 196, Col: 56}
1249 }1448 }
1250- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))1449+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78))
1251 if templ_7745c5c3_Err != nil {1450 if templ_7745c5c3_Err != nil {
1252 return templ_7745c5c3_Err1451 return templ_7745c5c3_Err
1253 }1452 }
1254- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</span></h3>")1453+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</span></h3>")
1255 if templ_7745c5c3_Err != nil {1454 if templ_7745c5c3_Err != nil {
1256 return templ_7745c5c3_Err1455 return templ_7745c5c3_Err
1257 }1456 }
@@ -1260,7 +1459,7 @@ func JobAnnotations(anns []AnnotationView, more bool) templ.Component {
1260 return templ_7745c5c3_Err1459 return templ_7745c5c3_Err
1261 }1460 }
1262 }1461 }
1263- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</section>")1462+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "</section>")
1264 if templ_7745c5c3_Err != nil {1463 if templ_7745c5c3_Err != nil {
1265 return templ_7745c5c3_Err1464 return templ_7745c5c3_Err
1266 }1465 }
@@ -1287,125 +1486,125 @@ func RunSummaries(sums []JobSummaries, more bool) templ.Component {
1287 }()1486 }()
1288 }1487 }
1289 ctx = templ.InitializeContext(ctx)1488 ctx = templ.InitializeContext(ctx)
1290- templ_7745c5c3_Var68 := templ.GetChildren(ctx)1489+ templ_7745c5c3_Var79 := templ.GetChildren(ctx)
1291- if templ_7745c5c3_Var68 == nil {1490+ if templ_7745c5c3_Var79 == nil {
1292- templ_7745c5c3_Var68 = templ.NopComponent1491+ templ_7745c5c3_Var79 = templ.NopComponent
1293 }1492 }
1294 ctx = templ.ClearChildren(ctx)1493 ctx = templ.ClearChildren(ctx)
1295 for _, j := range sums {1494 for _, j := range sums {
1296- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "<section class=\"summaries\" aria-label=\"")1495+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "<section class=\"summaries\" aria-label=\"")
1297 if templ_7745c5c3_Err != nil {1496 if templ_7745c5c3_Err != nil {
1298 return templ_7745c5c3_Err1497 return templ_7745c5c3_Err
1299 }1498 }
1300- var templ_7745c5c3_Var69 string1499+ var templ_7745c5c3_Var80 string
1301- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue("Summary of " + j.Job)1500+ templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.ResolveAttributeValue("Summary of " + j.Job)
1302 if templ_7745c5c3_Err != nil {1501 if templ_7745c5c3_Err != nil {
1303- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 186, Col: 63}1502+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 207, Col: 63}
1304 }1503 }
1305- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)1504+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var80)
1306 if templ_7745c5c3_Err != nil {1505 if templ_7745c5c3_Err != nil {
1307 return templ_7745c5c3_Err1506 return templ_7745c5c3_Err
1308 }1507 }
1309- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "\"><h3>")1508+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\"><h3>")
1310 if templ_7745c5c3_Err != nil {1509 if templ_7745c5c3_Err != nil {
1311 return templ_7745c5c3_Err1510 return templ_7745c5c3_Err
1312 }1511 }
1313 if j.JobHref != "" {1512 if j.JobHref != "" {
1314- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "<a href=\"")1513+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "<a href=\"")
1315 if templ_7745c5c3_Err != nil {1514 if templ_7745c5c3_Err != nil {
1316 return templ_7745c5c3_Err1515 return templ_7745c5c3_Err
1317 }1516 }
1318- var templ_7745c5c3_Var70 templ.SafeURL1517+ var templ_7745c5c3_Var81 templ.SafeURL
1319- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.JobHref))1518+ templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(j.JobHref))
1320 if templ_7745c5c3_Err != nil {1519 if templ_7745c5c3_Err != nil {
1321- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 189, Col: 39}1520+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 210, Col: 39}
1322 }1521 }
1323- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))1522+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81))
1324 if templ_7745c5c3_Err != nil {1523 if templ_7745c5c3_Err != nil {
1325 return templ_7745c5c3_Err1524 return templ_7745c5c3_Err
1326 }1525 }
1327- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\">")1526+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">")
1328 if templ_7745c5c3_Err != nil {1527 if templ_7745c5c3_Err != nil {
1329 return templ_7745c5c3_Err1528 return templ_7745c5c3_Err
1330 }1529 }
1331- var templ_7745c5c3_Var71 string1530+ var templ_7745c5c3_Var82 string
1332- templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)1531+ templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
1333 if templ_7745c5c3_Err != nil {1532 if templ_7745c5c3_Err != nil {
1334- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 189, Col: 49}1533+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 210, Col: 49}
1335 }1534 }
1336- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))1535+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82))
1337 if templ_7745c5c3_Err != nil {1536 if templ_7745c5c3_Err != nil {
1338 return templ_7745c5c3_Err1537 return templ_7745c5c3_Err
1339 }1538 }
1340- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</a> ")1539+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a> ")
1341 if templ_7745c5c3_Err != nil {1540 if templ_7745c5c3_Err != nil {
1342 return templ_7745c5c3_Err1541 return templ_7745c5c3_Err
1343 }1542 }
1344 } else {1543 } else {
1345- var templ_7745c5c3_Var72 string1544+ var templ_7745c5c3_Var83 string
1346- templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)1545+ templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(j.Job)
1347 if templ_7745c5c3_Err != nil {1546 if templ_7745c5c3_Err != nil {
1348- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 191, Col: 12}1547+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 212, Col: 12}
1349 }1548 }
1350- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72))1549+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83))
1351 if templ_7745c5c3_Err != nil {1550 if templ_7745c5c3_Err != nil {
1352 return templ_7745c5c3_Err1551 return templ_7745c5c3_Err
1353 }1552 }
1354- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, " ")1553+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, " ")
1355 if templ_7745c5c3_Err != nil {1554 if templ_7745c5c3_Err != nil {
1356 return templ_7745c5c3_Err1555 return templ_7745c5c3_Err
1357 }1556 }
1358 }1557 }
1359- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "<span class=\"mute\">summary</span></h3>")1558+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "<span class=\"mute\">summary</span></h3>")
1360 if templ_7745c5c3_Err != nil {1559 if templ_7745c5c3_Err != nil {
1361 return templ_7745c5c3_Err1560 return templ_7745c5c3_Err
1362 }1561 }
1363 for _, s := range j.Steps {1562 for _, s := range j.Steps {
1364- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<article class=\"prose summary\" aria-label=\"")1563+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "<article class=\"prose summary\" aria-label=\"")
1365 if templ_7745c5c3_Err != nil {1564 if templ_7745c5c3_Err != nil {
1366 return templ_7745c5c3_Err1565 return templ_7745c5c3_Err
1367 }1566 }
1368- var templ_7745c5c3_Var73 string1567+ var templ_7745c5c3_Var84 string
1369- templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.ResolveAttributeValue(s.Step)1568+ templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.ResolveAttributeValue(s.Step)
1370 if templ_7745c5c3_Err != nil {1569 if templ_7745c5c3_Err != nil {
1371- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 196, Col: 54}1570+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 217, Col: 54}
1372 }1571 }
1373- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var73)1572+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var84)
1374 if templ_7745c5c3_Err != nil {1573 if templ_7745c5c3_Err != nil {
1375 return templ_7745c5c3_Err1574 return templ_7745c5c3_Err
1376 }1575 }
1377- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\" hx-ignore><h4 class=\"summary-step\">")1576+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "\" hx-ignore><h4 class=\"summary-step\">")
1378 if templ_7745c5c3_Err != nil {1577 if templ_7745c5c3_Err != nil {
1379 return templ_7745c5c3_Err1578 return templ_7745c5c3_Err
1380 }1579 }
1381- var templ_7745c5c3_Var74 string1580+ var templ_7745c5c3_Var85 string
1382- templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.JoinStringErrs(s.Step)1581+ templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(s.Step)
1383 if templ_7745c5c3_Err != nil {1582 if templ_7745c5c3_Err != nil {
1384- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 197, Col: 38}1583+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 218, Col: 38}
1385 }1584 }
1386- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var74))1585+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
1387 if templ_7745c5c3_Err != nil {1586 if templ_7745c5c3_Err != nil {
1388 return templ_7745c5c3_Err1587 return templ_7745c5c3_Err
1389 }1588 }
1390- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "</h4>")1589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "</h4>")
1391 if templ_7745c5c3_Err != nil {1590 if templ_7745c5c3_Err != nil {
1392 return templ_7745c5c3_Err1591 return templ_7745c5c3_Err
1393 }1592 }
1394 if s.Note != "" {1593 if s.Note != "" {
1395- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "<p class=\"dim\">")1594+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<p class=\"dim\">")
1396 if templ_7745c5c3_Err != nil {1595 if templ_7745c5c3_Err != nil {
1397 return templ_7745c5c3_Err1596 return templ_7745c5c3_Err
1398 }1597 }
1399- var templ_7745c5c3_Var75 string1598+ var templ_7745c5c3_Var86 string
1400- templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinStringErrs(s.Note)1599+ templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(s.Note)
1401 if templ_7745c5c3_Err != nil {1600 if templ_7745c5c3_Err != nil {
1402- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 199, Col: 29}1601+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 29}
1403 }1602 }
1404- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))1603+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
1405 if templ_7745c5c3_Err != nil {1604 if templ_7745c5c3_Err != nil {
1406 return templ_7745c5c3_Err1605 return templ_7745c5c3_Err
1407 }1606 }
1408- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</p>")1607+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</p>")
1409 if templ_7745c5c3_Err != nil {1608 if templ_7745c5c3_Err != nil {
1410 return templ_7745c5c3_Err1609 return templ_7745c5c3_Err
1411 }1610 }
@@ -1415,37 +1614,37 @@ func RunSummaries(sums []JobSummaries, more bool) templ.Component {
1415 return templ_7745c5c3_Err1614 return templ_7745c5c3_Err
1416 }1615 }
1417 }1616 }
1418- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "</article>")1617+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</article>")
1419 if templ_7745c5c3_Err != nil {1618 if templ_7745c5c3_Err != nil {
1420 return templ_7745c5c3_Err1619 return templ_7745c5c3_Err
1421 }1620 }
1422 }1621 }
1423 if j.More {1622 if j.More {
1424- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"mute\">the job has more summaries than the first 20, which are shown.</p>")1623+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "<p class=\"mute\">the job has more summaries than the first 20, which are shown.</p>")
1425 if templ_7745c5c3_Err != nil {1624 if templ_7745c5c3_Err != nil {
1426 return templ_7745c5c3_Err1625 return templ_7745c5c3_Err
1427 }1626 }
1428 }1627 }
1429- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "</section>")1628+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</section>")
1430 if templ_7745c5c3_Err != nil {1629 if templ_7745c5c3_Err != nil {
1431 return templ_7745c5c3_Err1630 return templ_7745c5c3_Err
1432 }1631 }
1433 }1632 }
1434 if more {1633 if more {
1435- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ")1634+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "<p class=\"mute\">more summaries are not shown: the summaries of the page are over ")
1436 if templ_7745c5c3_Err != nil {1635 if templ_7745c5c3_Err != nil {
1437 return templ_7745c5c3_Err1636 return templ_7745c5c3_Err
1438 }1637 }
1439- var templ_7745c5c3_Var76 string1638+ var templ_7745c5c3_Var87 string
1440- templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes))1639+ templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinStringErrs(humanSize(maxSummaryPageBytes))
1441 if templ_7745c5c3_Err != nil {1640 if templ_7745c5c3_Err != nil {
1442- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 211, Col: 115}1641+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 232, Col: 115}
1443 }1642 }
1444- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76))1643+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))
1445 if templ_7745c5c3_Err != nil {1644 if templ_7745c5c3_Err != nil {
1446 return templ_7745c5c3_Err1645 return templ_7745c5c3_Err
1447 }1646 }
1448- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, ".</p>")1647+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, ".</p>")
1449 if templ_7745c5c3_Err != nil {1648 if templ_7745c5c3_Err != nil {
1450 return templ_7745c5c3_Err1649 return templ_7745c5c3_Err
1451 }1650 }
@@ -1470,256 +1669,256 @@ func runRail(p RunPage) templ.Component {
1470 }()1669 }()
1471 }1670 }
1472 ctx = templ.InitializeContext(ctx)1671 ctx = templ.InitializeContext(ctx)
1473- templ_7745c5c3_Var77 := templ.GetChildren(ctx)1672+ templ_7745c5c3_Var88 := templ.GetChildren(ctx)
1474- if templ_7745c5c3_Var77 == nil {1673+ if templ_7745c5c3_Var88 == nil {
1475- templ_7745c5c3_Var77 = templ.NopComponent1674+ templ_7745c5c3_Var88 = templ.NopComponent
1476 }1675 }
1477 ctx = templ.ClearChildren(ctx)1676 ctx = templ.ClearChildren(ctx)
1478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>")1677+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "<section aria-labelledby=\"r-run\"><h2 id=\"r-run\">Run</h2><dl class=\"kv\"><dt>result</dt><dd>")
1479 if templ_7745c5c3_Err != nil {1678 if templ_7745c5c3_Err != nil {
1480 return templ_7745c5c3_Err1679 return templ_7745c5c3_Err
1481 }1680 }
1482- var templ_7745c5c3_Var78 string1681+ var templ_7745c5c3_Var89 string
1483- templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(p.State)1682+ templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(p.State)
1484 if templ_7745c5c3_Err != nil {1683 if templ_7745c5c3_Err != nil {
1485- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 220, Col: 16}1684+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 241, Col: 16}
1486 }1685 }
1487- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78))1686+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))
1488 if templ_7745c5c3_Err != nil {1687 if templ_7745c5c3_Err != nil {
1489 return templ_7745c5c3_Err1688 return templ_7745c5c3_Err
1490 }1689 }
1491- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "</dd><dt>commit</dt><dd><a href=\"")1690+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "</dd><dt>commit</dt><dd><a href=\"")
1492 if templ_7745c5c3_Err != nil {1691 if templ_7745c5c3_Err != nil {
1493 return templ_7745c5c3_Err1692 return templ_7745c5c3_Err
1494 }1693 }
1495- var templ_7745c5c3_Var79 templ.SafeURL1694+ var templ_7745c5c3_Var90 templ.SafeURL
1496- templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref))1695+ templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CHref))
1497 if templ_7745c5c3_Err != nil {1696 if templ_7745c5c3_Err != nil {
1498- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 39}1697+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 243, Col: 39}
1499 }1698 }
1500- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79))1699+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))
1501 if templ_7745c5c3_Err != nil {1700 if templ_7745c5c3_Err != nil {
1502 return templ_7745c5c3_Err1701 return templ_7745c5c3_Err
1503 }1702 }
1504- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "\">")1703+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "\">")
1505 if templ_7745c5c3_Err != nil {1704 if templ_7745c5c3_Err != nil {
1506 return templ_7745c5c3_Err1705 return templ_7745c5c3_Err
1507 }1706 }
1508- var templ_7745c5c3_Var80 string1707+ var templ_7745c5c3_Var91 string
1509- templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short)1708+ templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinStringErrs(p.Short)
1510 if templ_7745c5c3_Err != nil {1709 if templ_7745c5c3_Err != nil {
1511- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 222, Col: 51}1710+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 243, Col: 51}
1512 }1711 }
1513- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80))1712+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))
1514 if templ_7745c5c3_Err != nil {1713 if templ_7745c5c3_Err != nil {
1515 return templ_7745c5c3_Err1714 return templ_7745c5c3_Err
1516 }1715 }
1517- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</a></dd><dt>ref</dt><dd><a href=\"")1716+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "</a></dd><dt>ref</dt><dd><a href=\"")
1518 if templ_7745c5c3_Err != nil {1717 if templ_7745c5c3_Err != nil {
1519 return templ_7745c5c3_Err1718 return templ_7745c5c3_Err
1520 }1719 }
1521- var templ_7745c5c3_Var81 templ.SafeURL1720+ var templ_7745c5c3_Var92 templ.SafeURL
1522- templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref))1721+ templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RefHref))
1523 if templ_7745c5c3_Err != nil {1722 if templ_7745c5c3_Err != nil {
1524- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 41}1723+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 245, Col: 41}
1525 }1724 }
1526- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var81))1725+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var92))
1527 if templ_7745c5c3_Err != nil {1726 if templ_7745c5c3_Err != nil {
1528 return templ_7745c5c3_Err1727 return templ_7745c5c3_Err
1529 }1728 }
1530- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "\">")1729+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "\">")
1531 if templ_7745c5c3_Err != nil {1730 if templ_7745c5c3_Err != nil {
1532 return templ_7745c5c3_Err1731 return templ_7745c5c3_Err
1533 }1732 }
1534- var templ_7745c5c3_Var82 string1733+ var templ_7745c5c3_Var93 string
1535- templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref)1734+ templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(p.Ref)
1536 if templ_7745c5c3_Err != nil {1735 if templ_7745c5c3_Err != nil {
1537- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 224, Col: 51}1736+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 245, Col: 51}
1538 }1737 }
1539- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82))1738+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93))
1540 if templ_7745c5c3_Err != nil {1739 if templ_7745c5c3_Err != nil {
1541 return templ_7745c5c3_Err1740 return templ_7745c5c3_Err
1542 }1741 }
1543- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</a></dd><dt>actor</dt><dd>")1742+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "</a></dd><dt>actor</dt><dd>")
1544 if templ_7745c5c3_Err != nil {1743 if templ_7745c5c3_Err != nil {
1545 return templ_7745c5c3_Err1744 return templ_7745c5c3_Err
1546 }1745 }
1547- var templ_7745c5c3_Var83 string1746+ var templ_7745c5c3_Var94 string
1548- templ_7745c5c3_Var83, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor)1747+ templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(p.Actor)
1549 if templ_7745c5c3_Err != nil {1748 if templ_7745c5c3_Err != nil {
1550- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 226, Col: 16}1749+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 247, Col: 16}
1551 }1750 }
1552- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var83))1751+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))
1553 if templ_7745c5c3_Err != nil {1752 if templ_7745c5c3_Err != nil {
1554 return templ_7745c5c3_Err1753 return templ_7745c5c3_Err
1555 }1754 }
1556- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</dd><dt>attempt</dt><dd>")1755+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "</dd><dt>attempt</dt><dd>")
1557 if templ_7745c5c3_Err != nil {1756 if templ_7745c5c3_Err != nil {
1558 return templ_7745c5c3_Err1757 return templ_7745c5c3_Err
1559 }1758 }
1560- var templ_7745c5c3_Var84 string1759+ var templ_7745c5c3_Var95 string
1561- templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt)))1760+ templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Attempt)))
1562 if templ_7745c5c3_Err != nil {1761 if templ_7745c5c3_Err != nil {
1563- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 29}1762+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 29}
1564 }1763 }
1565- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84))1764+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))
1566 if templ_7745c5c3_Err != nil {1765 if templ_7745c5c3_Err != nil {
1567 return templ_7745c5c3_Err1766 return templ_7745c5c3_Err
1568 }1767 }
1569- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, " of ")1768+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, " of ")
1570 if templ_7745c5c3_Err != nil {1769 if templ_7745c5c3_Err != nil {
1571 return templ_7745c5c3_Err1770 return templ_7745c5c3_Err
1572 }1771 }
1573- var templ_7745c5c3_Var85 string1772+ var templ_7745c5c3_Var96 string
1574- templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest)))1773+ templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(int(p.Latest)))
1575 if templ_7745c5c3_Err != nil {1774 if templ_7745c5c3_Err != nil {
1576- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 228, Col: 56}1775+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 56}
1577 }1776 }
1578- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))1777+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
1579 if templ_7745c5c3_Err != nil {1778 if templ_7745c5c3_Err != nil {
1580 return templ_7745c5c3_Err1779 return templ_7745c5c3_Err
1581 }1780 }
1582- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "</dd></dl>")1781+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</dd></dl>")
1583 if templ_7745c5c3_Err != nil {1782 if templ_7745c5c3_Err != nil {
1584 return templ_7745c5c3_Err1783 return templ_7745c5c3_Err
1585 }1784 }
1586 if len(p.Attempts) > 0 {1785 if len(p.Attempts) > 0 {
1587- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<ul class=\"attempts\">")1786+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<ul class=\"attempts\">")
1588 if templ_7745c5c3_Err != nil {1787 if templ_7745c5c3_Err != nil {
1589 return templ_7745c5c3_Err1788 return templ_7745c5c3_Err
1590 }1789 }
1591 for _, a := range p.Attempts {1790 for _, a := range p.Attempts {
1592- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "<li>")1791+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "<li>")
1593 if templ_7745c5c3_Err != nil {1792 if templ_7745c5c3_Err != nil {
1594 return templ_7745c5c3_Err1793 return templ_7745c5c3_Err
1595 }1794 }
1596 if a.Current {1795 if a.Current {
1597- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<span aria-current=\"page\">")1796+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span aria-current=\"page\">")
1598 if templ_7745c5c3_Err != nil {1797 if templ_7745c5c3_Err != nil {
1599 return templ_7745c5c3_Err1798 return templ_7745c5c3_Err
1600 }1799 }
1601- var templ_7745c5c3_Var86 string1800+ var templ_7745c5c3_Var97 string
1602- templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)1801+ templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
1603 if templ_7745c5c3_Err != nil {1802 if templ_7745c5c3_Err != nil {
1604- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 235, Col: 42}1803+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 256, Col: 42}
1605 }1804 }
1606- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))1805+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97))
1607 if templ_7745c5c3_Err != nil {1806 if templ_7745c5c3_Err != nil {
1608 return templ_7745c5c3_Err1807 return templ_7745c5c3_Err
1609 }1808 }
1610- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "</span>")1809+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span>")
1611 if templ_7745c5c3_Err != nil {1810 if templ_7745c5c3_Err != nil {
1612 return templ_7745c5c3_Err1811 return templ_7745c5c3_Err
1613 }1812 }
1614 } else {1813 } else {
1615- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "<a href=\"")1814+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "<a href=\"")
1616 if templ_7745c5c3_Err != nil {1815 if templ_7745c5c3_Err != nil {
1617 return templ_7745c5c3_Err1816 return templ_7745c5c3_Err
1618 }1817 }
1619- var templ_7745c5c3_Var87 templ.SafeURL1818+ var templ_7745c5c3_Var98 templ.SafeURL
1620- templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href))1819+ templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(a.Href))
1621 if templ_7745c5c3_Err != nil {1820 if templ_7745c5c3_Err != nil {
1622- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 38}1821+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 258, Col: 38}
1623 }1822 }
1624- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))1823+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
1625 if templ_7745c5c3_Err != nil {1824 if templ_7745c5c3_Err != nil {
1626 return templ_7745c5c3_Err1825 return templ_7745c5c3_Err
1627 }1826 }
1628- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "\">")1827+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "\">")
1629 if templ_7745c5c3_Err != nil {1828 if templ_7745c5c3_Err != nil {
1630 return templ_7745c5c3_Err1829 return templ_7745c5c3_Err
1631 }1830 }
1632- var templ_7745c5c3_Var88 string1831+ var templ_7745c5c3_Var99 string
1633- templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)1832+ templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinStringErrs(a.Label)
1634 if templ_7745c5c3_Err != nil {1833 if templ_7745c5c3_Err != nil {
1635- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 237, Col: 50}1834+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 258, Col: 50}
1636 }1835 }
1637- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88))1836+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99))
1638 if templ_7745c5c3_Err != nil {1837 if templ_7745c5c3_Err != nil {
1639 return templ_7745c5c3_Err1838 return templ_7745c5c3_Err
1640 }1839 }
1641- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</a>")1840+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</a>")
1642 if templ_7745c5c3_Err != nil {1841 if templ_7745c5c3_Err != nil {
1643 return templ_7745c5c3_Err1842 return templ_7745c5c3_Err
1644 }1843 }
1645 }1844 }
1646- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</li>")1845+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</li>")
1647 if templ_7745c5c3_Err != nil {1846 if templ_7745c5c3_Err != nil {
1648 return templ_7745c5c3_Err1847 return templ_7745c5c3_Err
1649 }1848 }
1650 }1849 }
1651- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "</ul>")1850+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "</ul>")
1652 if templ_7745c5c3_Err != nil {1851 if templ_7745c5c3_Err != nil {
1653 return templ_7745c5c3_Err1852 return templ_7745c5c3_Err
1654 }1853 }
1655 }1854 }
1656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "</section>")1855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "</section>")
1657 if templ_7745c5c3_Err != nil {1856 if templ_7745c5c3_Err != nil {
1658 return templ_7745c5c3_Err1857 return templ_7745c5c3_Err
1659 }1858 }
1660 if p.CancelAction != "" || p.RerunAction != "" {1859 if p.CancelAction != "" || p.RerunAction != "" {
1661- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">")1860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<section aria-labelledby=\"r-act\" class=\"decide\"><h2 id=\"r-act\">Actions</h2><div class=\"d-btns\">")
1662 if templ_7745c5c3_Err != nil {1861 if templ_7745c5c3_Err != nil {
1663 return templ_7745c5c3_Err1862 return templ_7745c5c3_Err
1664 }1863 }
1665 if p.CancelAction != "" {1864 if p.CancelAction != "" {
1666- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "<form method=\"post\" action=\"")1865+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "<form method=\"post\" action=\"")
1667 if templ_7745c5c3_Err != nil {1866 if templ_7745c5c3_Err != nil {
1668 return templ_7745c5c3_Err1867 return templ_7745c5c3_Err
1669 }1868 }
1670- var templ_7745c5c3_Var89 templ.SafeURL1869+ var templ_7745c5c3_Var100 templ.SafeURL
1671- templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction))1870+ templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.CancelAction))
1672 if templ_7745c5c3_Err != nil {1871 if templ_7745c5c3_Err != nil {
1673- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 249, Col: 63}1872+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 270, Col: 63}
1674 }1873 }
1675- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))1874+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))
1676 if templ_7745c5c3_Err != nil {1875 if templ_7745c5c3_Err != nil {
1677 return templ_7745c5c3_Err1876 return templ_7745c5c3_Err
1678 }1877 }
1679- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>")1878+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "\"><button type=\"submit\" class=\"btn\">Cancel run</button></form>")
1680 if templ_7745c5c3_Err != nil {1879 if templ_7745c5c3_Err != nil {
1681 return templ_7745c5c3_Err1880 return templ_7745c5c3_Err
1682 }1881 }
1683 }1882 }
1684 if p.RerunAction != "" {1883 if p.RerunAction != "" {
1685- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "<form method=\"post\" action=\"")1884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<form method=\"post\" action=\"")
1686 if templ_7745c5c3_Err != nil {1885 if templ_7745c5c3_Err != nil {
1687 return templ_7745c5c3_Err1886 return templ_7745c5c3_Err
1688 }1887 }
1689- var templ_7745c5c3_Var90 templ.SafeURL1888+ var templ_7745c5c3_Var101 templ.SafeURL
1690- templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction))1889+ templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunAction))
1691 if templ_7745c5c3_Err != nil {1890 if templ_7745c5c3_Err != nil {
1692- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 252, Col: 62}1891+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 273, Col: 62}
1693 }1892 }
1694- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))1893+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101))
1695 if templ_7745c5c3_Err != nil {1894 if templ_7745c5c3_Err != nil {
1696 return templ_7745c5c3_Err1895 return templ_7745c5c3_Err
1697 }1896 }
1698- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>")1897+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "\"><button type=\"submit\" class=\"btn primary\">Re-run all jobs</button></form>")
1699 if templ_7745c5c3_Err != nil {1898 if templ_7745c5c3_Err != nil {
1700 return templ_7745c5c3_Err1899 return templ_7745c5c3_Err
1701 }1900 }
1702 }1901 }
1703 if p.CanRerunFailed {1902 if p.CanRerunFailed {
1704- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "<form method=\"post\" action=\"")1903+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<form method=\"post\" action=\"")
1705 if templ_7745c5c3_Err != nil {1904 if templ_7745c5c3_Err != nil {
1706 return templ_7745c5c3_Err1905 return templ_7745c5c3_Err
1707 }1906 }
1708- var templ_7745c5c3_Var91 templ.SafeURL1907+ var templ_7745c5c3_Var102 templ.SafeURL
1709- templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction))1908+ templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RerunFailedAction))
1710 if templ_7745c5c3_Err != nil {1909 if templ_7745c5c3_Err != nil {
1711- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 255, Col: 68}1910+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 276, Col: 68}
1712 }1911 }
1713- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))1912+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))
1714 if templ_7745c5c3_Err != nil {1913 if templ_7745c5c3_Err != nil {
1715 return templ_7745c5c3_Err1914 return templ_7745c5c3_Err
1716 }1915 }
1717- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>")1916+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "\"><button type=\"submit\" class=\"btn\">Re-run failed jobs</button></form>")
1718 if templ_7745c5c3_Err != nil {1917 if templ_7745c5c3_Err != nil {
1719 return templ_7745c5c3_Err1918 return templ_7745c5c3_Err
1720 }1919 }
1721 }1920 }
1722- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</div></section>")1921+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</div></section>")
1723 if templ_7745c5c3_Err != nil {1922 if templ_7745c5c3_Err != nil {
1724 return templ_7745c5c3_Err1923 return templ_7745c5c3_Err
1725 }1924 }
@@ -1746,25 +1945,25 @@ func JobHead(j JobRow, total int64) templ.Component {
1746 }()1945 }()
1747 }1946 }
1748 ctx = templ.InitializeContext(ctx)1947 ctx = templ.InitializeContext(ctx)
1749- templ_7745c5c3_Var92 := templ.GetChildren(ctx)1948+ templ_7745c5c3_Var103 := templ.GetChildren(ctx)
1750- if templ_7745c5c3_Var92 == nil {1949+ if templ_7745c5c3_Var103 == nil {
1751- templ_7745c5c3_Var92 = templ.NopComponent1950+ templ_7745c5c3_Var103 = templ.NopComponent
1752 }1951 }
1753 ctx = templ.ClearChildren(ctx)1952 ctx = templ.ClearChildren(ctx)
1754- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<div id=\"job-head\" data-total=\"")1953+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, "<div id=\"job-head\" data-total=\"")
1755 if templ_7745c5c3_Err != nil {1954 if templ_7745c5c3_Err != nil {
1756 return templ_7745c5c3_Err1955 return templ_7745c5c3_Err
1757 }1956 }
1758- var templ_7745c5c3_Var93 string1957+ var templ_7745c5c3_Var104 string
1759- templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total))1958+ templ_7745c5c3_Var104, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(total))
1760 if templ_7745c5c3_Err != nil {1959 if templ_7745c5c3_Err != nil {
1761- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 265, Col: 46}1960+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 286, Col: 46}
1762 }1961 }
1763- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var93)1962+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var104)
1764 if templ_7745c5c3_Err != nil {1963 if templ_7745c5c3_Err != nil {
1765 return templ_7745c5c3_Err1964 return templ_7745c5c3_Err
1766 }1965 }
1767- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "\"><h2 class=\"run-h\">")1966+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, "\"><h2 class=\"run-h\">")
1768 if templ_7745c5c3_Err != nil {1967 if templ_7745c5c3_Err != nil {
1769 return templ_7745c5c3_Err1968 return templ_7745c5c3_Err
1770 }1969 }
@@ -1772,74 +1971,74 @@ func JobHead(j JobRow, total int64) templ.Component {
1772 if templ_7745c5c3_Err != nil {1971 if templ_7745c5c3_Err != nil {
1773 return templ_7745c5c3_Err1972 return templ_7745c5c3_Err
1774 }1973 }
1775- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "<span>")1974+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, "<span>")
1776 if templ_7745c5c3_Err != nil {1975 if templ_7745c5c3_Err != nil {
1777 return templ_7745c5c3_Err1976 return templ_7745c5c3_Err
1778 }1977 }
1779- var templ_7745c5c3_Var94 string1978+ var templ_7745c5c3_Var105 string
1780- templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)1979+ templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.JoinStringErrs(j.Name)
1781 if templ_7745c5c3_Err != nil {1980 if templ_7745c5c3_Err != nil {
1782- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 61}1981+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 61}
1783 }1982 }
1784- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))1983+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var105))
1785 if templ_7745c5c3_Err != nil {1984 if templ_7745c5c3_Err != nil {
1786 return templ_7745c5c3_Err1985 return templ_7745c5c3_Err
1787 }1986 }
1788- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "</span> <span class=\"dim\">")1987+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "</span> <span class=\"dim\">")
1789 if templ_7745c5c3_Err != nil {1988 if templ_7745c5c3_Err != nil {
1790 return templ_7745c5c3_Err1989 return templ_7745c5c3_Err
1791 }1990 }
1792- var templ_7745c5c3_Var95 string1991+ var templ_7745c5c3_Var106 string
1793- templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)1992+ templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.JoinStringErrs(j.State)
1794 if templ_7745c5c3_Err != nil {1993 if templ_7745c5c3_Err != nil {
1795- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 98}1994+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 98}
1796 }1995 }
1797- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))1996+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var106))
1798 if templ_7745c5c3_Err != nil {1997 if templ_7745c5c3_Err != nil {
1799 return templ_7745c5c3_Err1998 return templ_7745c5c3_Err
1800 }1999 }
1801- var templ_7745c5c3_Var96 string2000+ var templ_7745c5c3_Var107 string
1802- templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(" ")2001+ templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1803 if templ_7745c5c3_Err != nil {2002 if templ_7745c5c3_Err != nil {
1804- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 105}2003+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 105}
1805 }2004 }
1806- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))2005+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var107))
1807 if templ_7745c5c3_Err != nil {2006 if templ_7745c5c3_Err != nil {
1808 return templ_7745c5c3_Err2007 return templ_7745c5c3_Err
1809 }2008 }
1810- var templ_7745c5c3_Var97 string2009+ var templ_7745c5c3_Var108 string
1811- templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)2010+ templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(j.Duration)
1812 if templ_7745c5c3_Err != nil {2011 if templ_7745c5c3_Err != nil {
1813- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 266, Col: 119}2012+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 287, Col: 119}
1814 }2013 }
1815- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97))2014+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108))
1816 if templ_7745c5c3_Err != nil {2015 if templ_7745c5c3_Err != nil {
1817 return templ_7745c5c3_Err2016 return templ_7745c5c3_Err
1818 }2017 }
1819- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "</span></h2>")2018+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, "</span></h2>")
1820 if templ_7745c5c3_Err != nil {2019 if templ_7745c5c3_Err != nil {
1821 return templ_7745c5c3_Err2020 return templ_7745c5c3_Err
1822 }2021 }
1823 if j.Error != "" {2022 if j.Error != "" {
1824- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "<p class=\"job-err\">")2023+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, "<p class=\"job-err\">")
1825 if templ_7745c5c3_Err != nil {2024 if templ_7745c5c3_Err != nil {
1826 return templ_7745c5c3_Err2025 return templ_7745c5c3_Err
1827 }2026 }
1828- var templ_7745c5c3_Var98 string2027+ var templ_7745c5c3_Var109 string
1829- templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)2028+ templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(j.Error)
1830 if templ_7745c5c3_Err != nil {2029 if templ_7745c5c3_Err != nil {
1831- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 268, Col: 31}2030+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 289, Col: 31}
1832 }2031 }
1833- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))2032+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))
1834 if templ_7745c5c3_Err != nil {2033 if templ_7745c5c3_Err != nil {
1835 return templ_7745c5c3_Err2034 return templ_7745c5c3_Err
1836 }2035 }
1837- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "</p>")2036+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "</p>")
1838 if templ_7745c5c3_Err != nil {2037 if templ_7745c5c3_Err != nil {
1839 return templ_7745c5c3_Err2038 return templ_7745c5c3_Err
1840 }2039 }
1841 }2040 }
1842- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "</div>")2041+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "</div>")
1843 if templ_7745c5c3_Err != nil {2042 if templ_7745c5c3_Err != nil {
1844 return templ_7745c5c3_Err2043 return templ_7745c5c3_Err
1845 }2044 }
@@ -1864,17 +2063,17 @@ func JobSteps(steps []StepView) templ.Component {
1864 }()2063 }()
1865 }2064 }
1866 ctx = templ.InitializeContext(ctx)2065 ctx = templ.InitializeContext(ctx)
1867- templ_7745c5c3_Var99 := templ.GetChildren(ctx)2066+ templ_7745c5c3_Var110 := templ.GetChildren(ctx)
1868- if templ_7745c5c3_Var99 == nil {2067+ if templ_7745c5c3_Var110 == nil {
1869- templ_7745c5c3_Var99 = templ.NopComponent2068+ templ_7745c5c3_Var110 = templ.NopComponent
1870 }2069 }
1871 ctx = templ.ClearChildren(ctx)2070 ctx = templ.ClearChildren(ctx)
1872- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "<ol class=\"steps\" id=\"job-steps\">")2071+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<ol class=\"steps\" id=\"job-steps\">")
1873 if templ_7745c5c3_Err != nil {2072 if templ_7745c5c3_Err != nil {
1874 return templ_7745c5c3_Err2073 return templ_7745c5c3_Err
1875 }2074 }
1876 for _, s := range steps {2075 for _, s := range steps {
1877- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "<li>")2076+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "<li>")
1878 if templ_7745c5c3_Err != nil {2077 if templ_7745c5c3_Err != nil {
1879 return templ_7745c5c3_Err2078 return templ_7745c5c3_Err
1880 }2079 }
@@ -1883,74 +2082,74 @@ func JobSteps(steps []StepView) templ.Component {
1883 return templ_7745c5c3_Err2082 return templ_7745c5c3_Err
1884 }2083 }
1885 if s.LogEnd > s.LogStart {2084 if s.LogEnd > s.LogStart {
1886- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "<a href=\"")2085+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<a href=\"")
1887 if templ_7745c5c3_Err != nil {2086 if templ_7745c5c3_Err != nil {
1888 return templ_7745c5c3_Err2087 return templ_7745c5c3_Err
1889 }2088 }
1890- var templ_7745c5c3_Var100 templ.SafeURL2089+ var templ_7745c5c3_Var111 templ.SafeURL
1891- templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart)))2090+ templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#L" + itoa64(s.LogStart)))
1892 if templ_7745c5c3_Err != nil {2091 if templ_7745c5c3_Err != nil {
1893- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 55}2092+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 301, Col: 55}
1894 }2093 }
1895- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))2094+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111))
1896 if templ_7745c5c3_Err != nil {2095 if templ_7745c5c3_Err != nil {
1897 return templ_7745c5c3_Err2096 return templ_7745c5c3_Err
1898 }2097 }
1899- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "\">")2098+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\">")
1900 if templ_7745c5c3_Err != nil {2099 if templ_7745c5c3_Err != nil {
1901 return templ_7745c5c3_Err2100 return templ_7745c5c3_Err
1902 }2101 }
1903- var templ_7745c5c3_Var101 string2102+ var templ_7745c5c3_Var112 string
1904- templ_7745c5c3_Var101, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)2103+ templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
1905 if templ_7745c5c3_Err != nil {2104 if templ_7745c5c3_Err != nil {
1906- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 280, Col: 66}2105+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 301, Col: 66}
1907 }2106 }
1908- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var101))2107+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112))
1909 if templ_7745c5c3_Err != nil {2108 if templ_7745c5c3_Err != nil {
1910 return templ_7745c5c3_Err2109 return templ_7745c5c3_Err
1911 }2110 }
1912- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</a> ")2111+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "</a> ")
1913 if templ_7745c5c3_Err != nil {2112 if templ_7745c5c3_Err != nil {
1914 return templ_7745c5c3_Err2113 return templ_7745c5c3_Err
1915 }2114 }
1916 } else {2115 } else {
1917- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<span>")2116+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "<span>")
1918 if templ_7745c5c3_Err != nil {2117 if templ_7745c5c3_Err != nil {
1919 return templ_7745c5c3_Err2118 return templ_7745c5c3_Err
1920 }2119 }
1921- var templ_7745c5c3_Var102 string2120+ var templ_7745c5c3_Var113 string
1922- templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)2121+ templ_7745c5c3_Var113, templ_7745c5c3_Err = templ.JoinStringErrs(s.Name)
1923 if templ_7745c5c3_Err != nil {2122 if templ_7745c5c3_Err != nil {
1924- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 282, Col: 19}2123+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 303, Col: 19}
1925 }2124 }
1926- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))2125+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var113))
1927 if templ_7745c5c3_Err != nil {2126 if templ_7745c5c3_Err != nil {
1928 return templ_7745c5c3_Err2127 return templ_7745c5c3_Err
1929 }2128 }
1930- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</span> ")2129+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</span> ")
1931 if templ_7745c5c3_Err != nil {2130 if templ_7745c5c3_Err != nil {
1932 return templ_7745c5c3_Err2131 return templ_7745c5c3_Err
1933 }2132 }
1934 }2133 }
1935- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "<span class=\"dim\">")2134+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<span class=\"dim\">")
1936 if templ_7745c5c3_Err != nil {2135 if templ_7745c5c3_Err != nil {
1937 return templ_7745c5c3_Err2136 return templ_7745c5c3_Err
1938 }2137 }
1939- var templ_7745c5c3_Var103 string2138+ var templ_7745c5c3_Var114 string
1940- templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)2139+ templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.JoinStringErrs(s.Duration)
1941 if templ_7745c5c3_Err != nil {2140 if templ_7745c5c3_Err != nil {
1942- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 284, Col: 34}2141+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 305, Col: 34}
1943 }2142 }
1944- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103))2143+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var114))
1945 if templ_7745c5c3_Err != nil {2144 if templ_7745c5c3_Err != nil {
1946 return templ_7745c5c3_Err2145 return templ_7745c5c3_Err
1947 }2146 }
1948- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "</span></li>")2147+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "</span></li>")
1949 if templ_7745c5c3_Err != nil {2148 if templ_7745c5c3_Err != nil {
1950 return templ_7745c5c3_Err2149 return templ_7745c5c3_Err
1951 }2150 }
1952 }2151 }
1953- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "</ol>")2152+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</ol>")
1954 if templ_7745c5c3_Err != nil {2153 if templ_7745c5c3_Err != nil {
1955 return templ_7745c5c3_Err2154 return templ_7745c5c3_Err
1956 }2155 }
@@ -1974,12 +2173,12 @@ func Job(l Layout, p JobPage) templ.Component {
1974 }()2173 }()
1975 }2174 }
1976 ctx = templ.InitializeContext(ctx)2175 ctx = templ.InitializeContext(ctx)
1977- templ_7745c5c3_Var104 := templ.GetChildren(ctx)2176+ templ_7745c5c3_Var115 := templ.GetChildren(ctx)
1978- if templ_7745c5c3_Var104 == nil {2177+ if templ_7745c5c3_Var115 == nil {
1979- templ_7745c5c3_Var104 = templ.NopComponent2178+ templ_7745c5c3_Var115 = templ.NopComponent
1980 }2179 }
1981 ctx = templ.ClearChildren(ctx)2180 ctx = templ.ClearChildren(ctx)
1982- templ_7745c5c3_Var105 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {2181+ templ_7745c5c3_Var116 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1983 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context2182 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1984 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)2183 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1985 if !templ_7745c5c3_IsBuffer {2184 if !templ_7745c5c3_IsBuffer {
@@ -1995,7 +2194,7 @@ func Job(l Layout, p JobPage) templ.Component {
1995 if templ_7745c5c3_Err != nil {2194 if templ_7745c5c3_Err != nil {
1996 return templ_7745c5c3_Err2195 return templ_7745c5c3_Err
1997 }2196 }
1998- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, " ")2197+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, " ")
1999 if templ_7745c5c3_Err != nil {2198 if templ_7745c5c3_Err != nil {
2000 return templ_7745c5c3_Err2199 return templ_7745c5c3_Err
2001 }2200 }
@@ -2003,7 +2202,7 @@ func Job(l Layout, p JobPage) templ.Component {
2003 if templ_7745c5c3_Err != nil {2202 if templ_7745c5c3_Err != nil {
2004 return templ_7745c5c3_Err2203 return templ_7745c5c3_Err
2005 }2204 }
2006- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, " ")2205+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, " ")
2007 if templ_7745c5c3_Err != nil {2206 if templ_7745c5c3_Err != nil {
2008 return templ_7745c5c3_Err2207 return templ_7745c5c3_Err
2009 }2208 }
@@ -2011,111 +2210,111 @@ func Job(l Layout, p JobPage) templ.Component {
2011 if templ_7745c5c3_Err != nil {2210 if templ_7745c5c3_Err != nil {
2012 return templ_7745c5c3_Err2211 return templ_7745c5c3_Err
2013 }2212 }
2014- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, " <div id=\"job-log\" class=\"joblog\" data-total=\"")2213+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, " <div id=\"job-log\" class=\"joblog\" data-total=\"")
2015 if templ_7745c5c3_Err != nil {2214 if templ_7745c5c3_Err != nil {
2016 return templ_7745c5c3_Err2215 return templ_7745c5c3_Err
2017 }2216 }
2018- var templ_7745c5c3_Var106 string2217+ var templ_7745c5c3_Var117 string
2019- templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total))2218+ templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.Total))
2020 if templ_7745c5c3_Err != nil {2219 if templ_7745c5c3_Err != nil {
2021- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 63}2220+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 63}
2022 }2221 }
2023- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106)2222+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117)
2024 if templ_7745c5c3_Err != nil {2223 if templ_7745c5c3_Err != nil {
2025 return templ_7745c5c3_Err2224 return templ_7745c5c3_Err
2026 }2225 }
2027- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "\"")2226+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"")
2028 if templ_7745c5c3_Err != nil {2227 if templ_7745c5c3_Err != nil {
2029 return templ_7745c5c3_Err2228 return templ_7745c5c3_Err
2030 }2229 }
2031 if p.Follow {2230 if p.Follow {
2032- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, " data-follow")2231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-follow")
2033 if templ_7745c5c3_Err != nil {2232 if templ_7745c5c3_Err != nil {
2034 return templ_7745c5c3_Err2233 return templ_7745c5c3_Err
2035 }2234 }
2036 }2235 }
2037- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, " data-stream=\"")2236+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, " data-stream=\"")
2038 if templ_7745c5c3_Err != nil {2237 if templ_7745c5c3_Err != nil {
2039 return templ_7745c5c3_Err2238 return templ_7745c5c3_Err
2040 }2239 }
2041- var templ_7745c5c3_Var107 string2240+ var templ_7745c5c3_Var118 string
2042- templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref)2241+ templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.StreamHref)
2043 if templ_7745c5c3_Err != nil {2242 if templ_7745c5c3_Err != nil {
2044- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 118}2243+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 118}
2045 }2244 }
2046- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107)2245+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var118)
2047 if templ_7745c5c3_Err != nil {2246 if templ_7745c5c3_Err != nil {
2048 return templ_7745c5c3_Err2247 return templ_7745c5c3_Err
2049 }2248 }
2050- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "\" data-next=\"")2249+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "\" data-next=\"")
2051 if templ_7745c5c3_Err != nil {2250 if templ_7745c5c3_Err != nil {
2052 return templ_7745c5c3_Err2251 return templ_7745c5c3_Err
2053 }2252 }
2054- var templ_7745c5c3_Var108 string2253+ var templ_7745c5c3_Var119 string
2055- templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines))))2254+ templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + int64(len(p.Lines))))
2056 if templ_7745c5c3_Err != nil {2255 if templ_7745c5c3_Err != nil {
2057- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 295, Col: 169}2256+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 316, Col: 169}
2058 }2257 }
2059- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var108)2258+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var119)
2060 if templ_7745c5c3_Err != nil {2259 if templ_7745c5c3_Err != nil {
2061 return templ_7745c5c3_Err2260 return templ_7745c5c3_Err
2062 }2261 }
2063- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "\">")2262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "\">")
2064 if templ_7745c5c3_Err != nil {2263 if templ_7745c5c3_Err != nil {
2065 return templ_7745c5c3_Err2264 return templ_7745c5c3_Err
2066 }2265 }
2067 if p.Note != "" {2266 if p.Note != "" {
2068- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<p class=\"dim\">")2267+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<p class=\"dim\">")
2069 if templ_7745c5c3_Err != nil {2268 if templ_7745c5c3_Err != nil {
2070 return templ_7745c5c3_Err2269 return templ_7745c5c3_Err
2071 }2270 }
2072- var templ_7745c5c3_Var109 string2271+ var templ_7745c5c3_Var120 string
2073- templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)2272+ templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
2074 if templ_7745c5c3_Err != nil {2273 if templ_7745c5c3_Err != nil {
2075- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 297, Col: 27}2274+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 318, Col: 27}
2076 }2275 }
2077- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))2276+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
2078 if templ_7745c5c3_Err != nil {2277 if templ_7745c5c3_Err != nil {
2079 return templ_7745c5c3_Err2278 return templ_7745c5c3_Err
2080 }2279 }
2081- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "</p>")2280+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</p>")
2082 if templ_7745c5c3_Err != nil {2281 if templ_7745c5c3_Err != nil {
2083 return templ_7745c5c3_Err2282 return templ_7745c5c3_Err
2084 }2283 }
2085 }2284 }
2086 if p.Prev != "" {2285 if p.Prev != "" {
2087- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "<p class=\"more\"><a href=\"")2286+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "<p class=\"more\"><a href=\"")
2088 if templ_7745c5c3_Err != nil {2287 if templ_7745c5c3_Err != nil {
2089 return templ_7745c5c3_Err2288 return templ_7745c5c3_Err
2090 }2289 }
2091- var templ_7745c5c3_Var110 templ.SafeURL2290+ var templ_7745c5c3_Var121 templ.SafeURL
2092- templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev))2291+ templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Prev))
2093 if templ_7745c5c3_Err != nil {2292 if templ_7745c5c3_Err != nil {
2094- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 300, Col: 51}2293+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 321, Col: 51}
2095 }2294 }
2096- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110))2295+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
2097 if templ_7745c5c3_Err != nil {2296 if templ_7745c5c3_Err != nil {
2098 return templ_7745c5c3_Err2297 return templ_7745c5c3_Err
2099 }2298 }
2100- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "\" rel=\"prev\">earlier lines</a></p>")2299+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "\" rel=\"prev\">earlier lines</a></p>")
2101 if templ_7745c5c3_Err != nil {2300 if templ_7745c5c3_Err != nil {
2102 return templ_7745c5c3_Err2301 return templ_7745c5c3_Err
2103 }2302 }
2104 }2303 }
2105- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "<ol class=\"log\" start=\"")2304+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<ol class=\"log\" start=\"")
2106 if templ_7745c5c3_Err != nil {2305 if templ_7745c5c3_Err != nil {
2107 return templ_7745c5c3_Err2306 return templ_7745c5c3_Err
2108 }2307 }
2109- var templ_7745c5c3_Var111 string2308+ var templ_7745c5c3_Var122 string
2110- templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1))2309+ templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa64(p.From + 1))
2111 if templ_7745c5c3_Err != nil {2310 if templ_7745c5c3_Err != nil {
2112- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 302, Col: 45}2311+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 323, Col: 45}
2113 }2312 }
2114- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var111)2313+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var122)
2115 if templ_7745c5c3_Err != nil {2314 if templ_7745c5c3_Err != nil {
2116 return templ_7745c5c3_Err2315 return templ_7745c5c3_Err
2117 }2316 }
2118- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "\">")2317+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "\">")
2119 if templ_7745c5c3_Err != nil {2318 if templ_7745c5c3_Err != nil {
2120 return templ_7745c5c3_Err2319 return templ_7745c5c3_Err
2121 }2320 }
@@ -2125,36 +2324,36 @@ func Job(l Layout, p JobPage) templ.Component {
2125 return templ_7745c5c3_Err2324 return templ_7745c5c3_Err
2126 }2325 }
2127 }2326 }
2128- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</ol>")2327+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "</ol>")
2129 if templ_7745c5c3_Err != nil {2328 if templ_7745c5c3_Err != nil {
2130 return templ_7745c5c3_Err2329 return templ_7745c5c3_Err
2131 }2330 }
2132 if p.Next != "" {2331 if p.Next != "" {
2133- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<p class=\"more\"><a href=\"")2332+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "<p class=\"more\"><a href=\"")
2134 if templ_7745c5c3_Err != nil {2333 if templ_7745c5c3_Err != nil {
2135 return templ_7745c5c3_Err2334 return templ_7745c5c3_Err
2136 }2335 }
2137- var templ_7745c5c3_Var112 templ.SafeURL2336+ var templ_7745c5c3_Var123 templ.SafeURL
2138- templ_7745c5c3_Var112, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next))2337+ templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Next))
2139 if templ_7745c5c3_Err != nil {2338 if templ_7745c5c3_Err != nil {
2140- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 308, Col: 51}2339+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 51}
2141 }2340 }
2142- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var112))2341+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
2143 if templ_7745c5c3_Err != nil {2342 if templ_7745c5c3_Err != nil {
2144 return templ_7745c5c3_Err2343 return templ_7745c5c3_Err
2145 }2344 }
2146- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "\" rel=\"next\">more lines</a></p>")2345+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "\" rel=\"next\">more lines</a></p>")
2147 if templ_7745c5c3_Err != nil {2346 if templ_7745c5c3_Err != nil {
2148 return templ_7745c5c3_Err2347 return templ_7745c5c3_Err
2149 }2348 }
2150 }2349 }
2151- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</div>")2350+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</div>")
2152 if templ_7745c5c3_Err != nil {2351 if templ_7745c5c3_Err != nil {
2153 return templ_7745c5c3_Err2352 return templ_7745c5c3_Err
2154 }2353 }
2155 return nil2354 return nil
2156 })2355 })
2157- templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var105), templ_7745c5c3_Buffer)2356+ templ_7745c5c3_Err = Shell(l, jobRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var116), templ_7745c5c3_Buffer)
2158 if templ_7745c5c3_Err != nil {2357 if templ_7745c5c3_Err != nil {
2159 return templ_7745c5c3_Err2358 return templ_7745c5c3_Err
2160 }2359 }
@@ -2180,92 +2379,92 @@ func LogLine(ln LogLineView) templ.Component {
2180 }()2379 }()
2181 }2380 }
2182 ctx = templ.InitializeContext(ctx)2381 ctx = templ.InitializeContext(ctx)
2183- templ_7745c5c3_Var113 := templ.GetChildren(ctx)2382+ templ_7745c5c3_Var124 := templ.GetChildren(ctx)
2184- if templ_7745c5c3_Var113 == nil {2383+ if templ_7745c5c3_Var124 == nil {
2185- templ_7745c5c3_Var113 = templ.NopComponent2384+ templ_7745c5c3_Var124 = templ.NopComponent
2186 }2385 }
2187 ctx = templ.ClearChildren(ctx)2386 ctx = templ.ClearChildren(ctx)
2188- var templ_7745c5c3_Var114 = []any{logClass(ln)}2387+ var templ_7745c5c3_Var125 = []any{logClass(ln)}
2189- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var114...)2388+ templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var125...)
2190 if templ_7745c5c3_Err != nil {2389 if templ_7745c5c3_Err != nil {
2191 return templ_7745c5c3_Err2390 return templ_7745c5c3_Err
2192 }2391 }
2193- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 184, "<li id=\"")2392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "<li id=\"")
2194 if templ_7745c5c3_Err != nil {2393 if templ_7745c5c3_Err != nil {
2195 return templ_7745c5c3_Err2394 return templ_7745c5c3_Err
2196 }2395 }
2197- var templ_7745c5c3_Var115 string2396+ var templ_7745c5c3_Var126 string
2198- templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N))2397+ templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.ResolveAttributeValue("L" + itoa64(ln.N))
2199 if templ_7745c5c3_Err != nil {2398 if templ_7745c5c3_Err != nil {
2200- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 28}2399+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 28}
2201 }2400 }
2202- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var115)2401+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var126)
2203 if templ_7745c5c3_Err != nil {2402 if templ_7745c5c3_Err != nil {
2204 return templ_7745c5c3_Err2403 return templ_7745c5c3_Err
2205 }2404 }
2206- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 185, "\" class=\"")2405+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "\" class=\"")
2207 if templ_7745c5c3_Err != nil {2406 if templ_7745c5c3_Err != nil {
2208 return templ_7745c5c3_Err2407 return templ_7745c5c3_Err
2209 }2408 }
2210- var templ_7745c5c3_Var116 string2409+ var templ_7745c5c3_Var127 string
2211- templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var114).String())2410+ templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var125).String())
2212 if templ_7745c5c3_Err != nil {2411 if templ_7745c5c3_Err != nil {
2213 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}2412 return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 1, Col: 0}
2214 }2413 }
2215- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var116)2414+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var127)
2216 if templ_7745c5c3_Err != nil {2415 if templ_7745c5c3_Err != nil {
2217 return templ_7745c5c3_Err2416 return templ_7745c5c3_Err
2218 }2417 }
2219- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 186, "\" data-step=\"")2418+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" data-step=\"")
2220 if templ_7745c5c3_Err != nil {2419 if templ_7745c5c3_Err != nil {
2221 return templ_7745c5c3_Err2420 return templ_7745c5c3_Err
2222 }2421 }
2223- var templ_7745c5c3_Var117 string2422+ var templ_7745c5c3_Var128 string
2224- templ_7745c5c3_Var117, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step)))2423+ templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(int(ln.Step)))
2225 if templ_7745c5c3_Err != nil {2424 if templ_7745c5c3_Err != nil {
2226- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 84}2425+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 84}
2227 }2426 }
2228- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var117)2427+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var128)
2229 if templ_7745c5c3_Err != nil {2428 if templ_7745c5c3_Err != nil {
2230 return templ_7745c5c3_Err2429 return templ_7745c5c3_Err
2231 }2430 }
2232- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 187, "\"")2431+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\"")
2233 if templ_7745c5c3_Err != nil {2432 if templ_7745c5c3_Err != nil {
2234 return templ_7745c5c3_Err2433 return templ_7745c5c3_Err
2235 }2434 }
2236 if ln.Continued {2435 if ln.Continued {
2237- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 188, " data-cont")2436+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, " data-cont")
2238 if templ_7745c5c3_Err != nil {2437 if templ_7745c5c3_Err != nil {
2239 return templ_7745c5c3_Err2438 return templ_7745c5c3_Err
2240 }2439 }
2241 }2440 }
2242- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 189, "><time>")2441+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "><time>")
2243 if templ_7745c5c3_Err != nil {2442 if templ_7745c5c3_Err != nil {
2244 return templ_7745c5c3_Err2443 return templ_7745c5c3_Err
2245 }2444 }
2246- var templ_7745c5c3_Var118 string2445+ var templ_7745c5c3_Var129 string
2247- templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time)2446+ templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Time)
2248 if templ_7745c5c3_Err != nil {2447 if templ_7745c5c3_Err != nil {
2249- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 130}2448+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 130}
2250 }2449 }
2251- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118))2450+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var129))
2252 if templ_7745c5c3_Err != nil {2451 if templ_7745c5c3_Err != nil {
2253 return templ_7745c5c3_Err2452 return templ_7745c5c3_Err
2254 }2453 }
2255- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 190, "</time><span class=\"t\">")2454+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "</time><span class=\"t\">")
2256 if templ_7745c5c3_Err != nil {2455 if templ_7745c5c3_Err != nil {
2257 return templ_7745c5c3_Err2456 return templ_7745c5c3_Err
2258 }2457 }
2259- var templ_7745c5c3_Var119 string2458+ var templ_7745c5c3_Var130 string
2260- templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text)2459+ templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Text)
2261 if templ_7745c5c3_Err != nil {2460 if templ_7745c5c3_Err != nil {
2262- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 317, Col: 164}2461+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 338, Col: 164}
2263 }2462 }
2264- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119))2463+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130))
2265 if templ_7745c5c3_Err != nil {2464 if templ_7745c5c3_Err != nil {
2266 return templ_7745c5c3_Err2465 return templ_7745c5c3_Err
2267 }2466 }
2268- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 191, "</span></li>")2467+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></li>")
2269 if templ_7745c5c3_Err != nil {2468 if templ_7745c5c3_Err != nil {
2270 return templ_7745c5c3_Err2469 return templ_7745c5c3_Err
2271 }2470 }
@@ -2289,12 +2488,12 @@ func jobRail(p JobPage) templ.Component {
2289 }()2488 }()
2290 }2489 }
2291 ctx = templ.InitializeContext(ctx)2490 ctx = templ.InitializeContext(ctx)
2292- templ_7745c5c3_Var120 := templ.GetChildren(ctx)2491+ templ_7745c5c3_Var131 := templ.GetChildren(ctx)
2293- if templ_7745c5c3_Var120 == nil {2492+ if templ_7745c5c3_Var131 == nil {
2294- templ_7745c5c3_Var120 = templ.NopComponent2493+ templ_7745c5c3_Var131 = templ.NopComponent
2295 }2494 }
2296 ctx = templ.ClearChildren(ctx)2495 ctx = templ.ClearChildren(ctx)
2297- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 192, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>")2496+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<section aria-labelledby=\"r-job\"><h2 id=\"r-job\">Steps</h2>")
2298 if templ_7745c5c3_Err != nil {2497 if templ_7745c5c3_Err != nil {
2299 return templ_7745c5c3_Err2498 return templ_7745c5c3_Err
2300 }2499 }
@@ -2302,101 +2501,101 @@ func jobRail(p JobPage) templ.Component {
2302 if templ_7745c5c3_Err != nil {2501 if templ_7745c5c3_Err != nil {
2303 return templ_7745c5c3_Err2502 return templ_7745c5c3_Err
2304 }2503 }
2305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 193, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"")2504+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "</section><section aria-labelledby=\"r-jobf\"><h2 id=\"r-jobf\">Job</h2><dl class=\"kv\"><dt>run</dt><dd><a href=\"")
2306 if templ_7745c5c3_Err != nil {2505 if templ_7745c5c3_Err != nil {
2307 return templ_7745c5c3_Err2506 return templ_7745c5c3_Err
2308 }2507 }
2309- var templ_7745c5c3_Var121 templ.SafeURL2508+ var templ_7745c5c3_Var132 templ.SafeURL
2310- templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref))2509+ templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RunHref))
2311 if templ_7745c5c3_Err != nil {2510 if templ_7745c5c3_Err != nil {
2312- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 41}2511+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 350, Col: 41}
2313 }2512 }
2314- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))2513+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
2315 if templ_7745c5c3_Err != nil {2514 if templ_7745c5c3_Err != nil {
2316 return templ_7745c5c3_Err2515 return templ_7745c5c3_Err
2317 }2516 }
2318- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 194, "\">")2517+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "\">")
2319 if templ_7745c5c3_Err != nil {2518 if templ_7745c5c3_Err != nil {
2320 return templ_7745c5c3_Err2519 return templ_7745c5c3_Err
2321 }2520 }
2322- var templ_7745c5c3_Var122 string2521+ var templ_7745c5c3_Var133 string
2323- templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName)2522+ templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(p.RunName)
2324 if templ_7745c5c3_Err != nil {2523 if templ_7745c5c3_Err != nil {
2325- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 329, Col: 55}2524+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 350, Col: 55}
2326 }2525 }
2327- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))2526+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
2328 if templ_7745c5c3_Err != nil {2527 if templ_7745c5c3_Err != nil {
2329 return templ_7745c5c3_Err2528 return templ_7745c5c3_Err
2330 }2529 }
2331- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 195, "</a></dd>")2530+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "</a></dd>")
2332 if templ_7745c5c3_Err != nil {2531 if templ_7745c5c3_Err != nil {
2333 return templ_7745c5c3_Err2532 return templ_7745c5c3_Err
2334 }2533 }
2335 if p.Runner != "" {2534 if p.Runner != "" {
2336- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 196, "<dt>runner</dt><dd>")2535+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "<dt>runner</dt><dd>")
2337 if templ_7745c5c3_Err != nil {2536 if templ_7745c5c3_Err != nil {
2338 return templ_7745c5c3_Err2537 return templ_7745c5c3_Err
2339 }2538 }
2340- var templ_7745c5c3_Var123 string2539+ var templ_7745c5c3_Var134 string
2341- templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner)2540+ templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(p.Runner)
2342 if templ_7745c5c3_Err != nil {2541 if templ_7745c5c3_Err != nil {
2343- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 332, Col: 18}2542+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 353, Col: 18}
2344 }2543 }
2345- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))2544+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2346 if templ_7745c5c3_Err != nil {2545 if templ_7745c5c3_Err != nil {
2347 return templ_7745c5c3_Err2546 return templ_7745c5c3_Err
2348 }2547 }
2349- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 197, "</dd>")2548+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</dd>")
2350 if templ_7745c5c3_Err != nil {2549 if templ_7745c5c3_Err != nil {
2351 return templ_7745c5c3_Err2550 return templ_7745c5c3_Err
2352 }2551 }
2353 }2552 }
2354 if p.Isolation != "" {2553 if p.Isolation != "" {
2355- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 198, "<dt>isolation</dt><dd>")2554+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<dt>isolation</dt><dd>")
2356 if templ_7745c5c3_Err != nil {2555 if templ_7745c5c3_Err != nil {
2357 return templ_7745c5c3_Err2556 return templ_7745c5c3_Err
2358 }2557 }
2359- var templ_7745c5c3_Var124 string2558+ var templ_7745c5c3_Var135 string
2360- templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation)2559+ templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(p.Isolation)
2361 if templ_7745c5c3_Err != nil {2560 if templ_7745c5c3_Err != nil {
2362- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 336, Col: 21}2561+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 357, Col: 21}
2363 }2562 }
2364- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))2563+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))
2365 if templ_7745c5c3_Err != nil {2564 if templ_7745c5c3_Err != nil {
2366 return templ_7745c5c3_Err2565 return templ_7745c5c3_Err
2367 }2566 }
2368- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 199, "</dd>")2567+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</dd>")
2369 if templ_7745c5c3_Err != nil {2568 if templ_7745c5c3_Err != nil {
2370 return templ_7745c5c3_Err2569 return templ_7745c5c3_Err
2371 }2570 }
2372 }2571 }
2373- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 200, "<dt>lines</dt><dd>")2572+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<dt>lines</dt><dd>")
2374 if templ_7745c5c3_Err != nil {2573 if templ_7745c5c3_Err != nil {
2375 return templ_7745c5c3_Err2574 return templ_7745c5c3_Err
2376 }2575 }
2377- var templ_7745c5c3_Var125 string2576+ var templ_7745c5c3_Var136 string
2378- templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total))2577+ templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(itoa64(p.Total))
2379 if templ_7745c5c3_Err != nil {2578 if templ_7745c5c3_Err != nil {
2380- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 339, Col: 24}2579+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 360, Col: 24}
2381 }2580 }
2382- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))2581+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))
2383 if templ_7745c5c3_Err != nil {2582 if templ_7745c5c3_Err != nil {
2384 return templ_7745c5c3_Err2583 return templ_7745c5c3_Err
2385 }2584 }
2386- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 201, "</dd></dl><p><a href=\"")2585+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</dd></dl><p><a href=\"")
2387 if templ_7745c5c3_Err != nil {2586 if templ_7745c5c3_Err != nil {
2388 return templ_7745c5c3_Err2587 return templ_7745c5c3_Err
2389 }2588 }
2390- var templ_7745c5c3_Var126 templ.SafeURL2589+ var templ_7745c5c3_Var137 templ.SafeURL
2391- templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref))2590+ templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.RawHref))
2392 if templ_7745c5c3_Err != nil {2591 if templ_7745c5c3_Err != nil {
2393- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 341, Col: 39}2592+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 362, Col: 39}
2394 }2593 }
2395- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))2594+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))
2396 if templ_7745c5c3_Err != nil {2595 if templ_7745c5c3_Err != nil {
2397 return templ_7745c5c3_Err2596 return templ_7745c5c3_Err
2398 }2597 }
2399- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 202, "\">raw log</a></p></section>")2598+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "\">raw log</a></p></section>")
2400 if templ_7745c5c3_Err != nil {2599 if templ_7745c5c3_Err != nil {
2401 return templ_7745c5c3_Err2600 return templ_7745c5c3_Err
2402 }2601 }
@@ -2422,39 +2621,39 @@ func CommitChecks(c ChecksSummary) templ.Component {
2422 }()2621 }()
2423 }2622 }
2424 ctx = templ.InitializeContext(ctx)2623 ctx = templ.InitializeContext(ctx)
2425- templ_7745c5c3_Var127 := templ.GetChildren(ctx)2624+ templ_7745c5c3_Var138 := templ.GetChildren(ctx)
2426- if templ_7745c5c3_Var127 == nil {2625+ if templ_7745c5c3_Var138 == nil {
2427- templ_7745c5c3_Var127 = templ.NopComponent2626+ templ_7745c5c3_Var138 = templ.NopComponent
2428 }2627 }
2429 ctx = templ.ClearChildren(ctx)2628 ctx = templ.ClearChildren(ctx)
2430 if c.Total > 0 {2629 if c.Total > 0 {
2431- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 203, "<a class=\"ck-sum\" href=\"")2630+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "<a class=\"ck-sum\" href=\"")
2432 if templ_7745c5c3_Err != nil {2631 if templ_7745c5c3_Err != nil {
2433 return templ_7745c5c3_Err2632 return templ_7745c5c3_Err
2434 }2633 }
2435- var templ_7745c5c3_Var128 templ.SafeURL2634+ var templ_7745c5c3_Var139 templ.SafeURL
2436- templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))2635+ templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
2437 if templ_7745c5c3_Err != nil {2636 if templ_7745c5c3_Err != nil {
2438- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 48}2637+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 48}
2439 }2638 }
2440- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))2639+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))
2441 if templ_7745c5c3_Err != nil {2640 if templ_7745c5c3_Err != nil {
2442 return templ_7745c5c3_Err2641 return templ_7745c5c3_Err
2443 }2642 }
2444- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 204, "\" title=\"")2643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "\" title=\"")
2445 if templ_7745c5c3_Err != nil {2644 if templ_7745c5c3_Err != nil {
2446 return templ_7745c5c3_Err2645 return templ_7745c5c3_Err
2447 }2646 }
2448- var templ_7745c5c3_Var129 string2647+ var templ_7745c5c3_Var140 string
2449- templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title)2648+ templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Title)
2450 if templ_7745c5c3_Err != nil {2649 if templ_7745c5c3_Err != nil {
2451- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 349, Col: 66}2650+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 66}
2452 }2651 }
2453- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)2652+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var140)
2454 if templ_7745c5c3_Err != nil {2653 if templ_7745c5c3_Err != nil {
2455 return templ_7745c5c3_Err2654 return templ_7745c5c3_Err
2456 }2655 }
2457- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 205, "\">")2656+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "\">")
2458 if templ_7745c5c3_Err != nil {2657 if templ_7745c5c3_Err != nil {
2459 return templ_7745c5c3_Err2658 return templ_7745c5c3_Err
2460 }2659 }
@@ -2462,20 +2661,20 @@ func CommitChecks(c ChecksSummary) templ.Component {
2462 if templ_7745c5c3_Err != nil {2661 if templ_7745c5c3_Err != nil {
2463 return templ_7745c5c3_Err2662 return templ_7745c5c3_Err
2464 }2663 }
2465- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 206, "<span class=\"mute\">")2664+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "<span class=\"mute\">")
2466 if templ_7745c5c3_Err != nil {2665 if templ_7745c5c3_Err != nil {
2467 return templ_7745c5c3_Err2666 return templ_7745c5c3_Err
2468 }2667 }
2469- var templ_7745c5c3_Var130 string2668+ var templ_7745c5c3_Var141 string
2470- templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)2669+ templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)
2471 if templ_7745c5c3_Err != nil {2670 if templ_7745c5c3_Err != nil {
2472- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 351, Col: 31}2671+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 31}
2473 }2672 }
2474- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130))2673+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))
2475 if templ_7745c5c3_Err != nil {2674 if templ_7745c5c3_Err != nil {
2476 return templ_7745c5c3_Err2675 return templ_7745c5c3_Err
2477 }2676 }
2478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 207, "</span></a>")2677+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</span></a>")
2479 if templ_7745c5c3_Err != nil {2678 if templ_7745c5c3_Err != nil {
2480 return templ_7745c5c3_Err2679 return templ_7745c5c3_Err
2481 }2680 }
@@ -2501,40 +2700,40 @@ func MRChecks(c ChecksSection) templ.Component {
2501 }()2700 }()
2502 }2701 }
2503 ctx = templ.InitializeContext(ctx)2702 ctx = templ.InitializeContext(ctx)
2504- templ_7745c5c3_Var131 := templ.GetChildren(ctx)2703+ templ_7745c5c3_Var142 := templ.GetChildren(ctx)
2505- if templ_7745c5c3_Var131 == nil {2704+ if templ_7745c5c3_Var142 == nil {
2506- templ_7745c5c3_Var131 = templ.NopComponent2705+ templ_7745c5c3_Var142 = templ.NopComponent
2507 }2706 }
2508 ctx = templ.ClearChildren(ctx)2707 ctx = templ.ClearChildren(ctx)
2509- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 208, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">")2708+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 226, "<section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">")
2510 if templ_7745c5c3_Err != nil {2709 if templ_7745c5c3_Err != nil {
2511 return templ_7745c5c3_Err2710 return templ_7745c5c3_Err
2512 }2711 }
2513- var templ_7745c5c3_Var132 string2712+ var templ_7745c5c3_Var143 string
2514- templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows)))2713+ templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(c.Rows)))
2515 if templ_7745c5c3_Err != nil {2714 if templ_7745c5c3_Err != nil {
2516- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 359, Col: 66}2715+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 380, Col: 66}
2517 }2716 }
2518- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))2717+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var143))
2519 if templ_7745c5c3_Err != nil {2718 if templ_7745c5c3_Err != nil {
2520 return templ_7745c5c3_Err2719 return templ_7745c5c3_Err
2521 }2720 }
2522- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 209, "</span></h2>")2721+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 227, "</span></h2>")
2523 if templ_7745c5c3_Err != nil {2722 if templ_7745c5c3_Err != nil {
2524 return templ_7745c5c3_Err2723 return templ_7745c5c3_Err
2525 }2724 }
2526 if len(c.Rows) == 0 {2725 if len(c.Rows) == 0 {
2527- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 210, "<p class=\"dim\">no checks</p>")2726+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 228, "<p class=\"dim\">no checks</p>")
2528 if templ_7745c5c3_Err != nil {2727 if templ_7745c5c3_Err != nil {
2529 return templ_7745c5c3_Err2728 return templ_7745c5c3_Err
2530 }2729 }
2531 } else {2730 } else {
2532- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 211, "<ul class=\"checks\">")2731+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 229, "<ul class=\"checks\">")
2533 if templ_7745c5c3_Err != nil {2732 if templ_7745c5c3_Err != nil {
2534 return templ_7745c5c3_Err2733 return templ_7745c5c3_Err
2535 }2734 }
2536 for _, r := range c.Rows {2735 for _, r := range c.Rows {
2537- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 212, "<li>")2736+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 230, "<li>")
2538 if templ_7745c5c3_Err != nil {2737 if templ_7745c5c3_Err != nil {
2539 return templ_7745c5c3_Err2738 return templ_7745c5c3_Err
2540 }2739 }
@@ -2543,108 +2742,108 @@ func MRChecks(c ChecksSection) templ.Component {
2543 return templ_7745c5c3_Err2742 return templ_7745c5c3_Err
2544 }2743 }
2545 if r.Href != "" {2744 if r.Href != "" {
2546- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 213, "<a href=\"")2745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 231, "<a href=\"")
2547 if templ_7745c5c3_Err != nil {2746 if templ_7745c5c3_Err != nil {
2548 return templ_7745c5c3_Err2747 return templ_7745c5c3_Err
2549 }2748 }
2550- var templ_7745c5c3_Var133 templ.SafeURL2749+ var templ_7745c5c3_Var144 templ.SafeURL
2551- templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))2750+ templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
2552 if templ_7745c5c3_Err != nil {2751 if templ_7745c5c3_Err != nil {
2553- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 38}2752+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 389, Col: 38}
2554 }2753 }
2555- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))2754+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var144))
2556 if templ_7745c5c3_Err != nil {2755 if templ_7745c5c3_Err != nil {
2557 return templ_7745c5c3_Err2756 return templ_7745c5c3_Err
2558 }2757 }
2559- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 214, "\">")2758+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 232, "\">")
2560 if templ_7745c5c3_Err != nil {2759 if templ_7745c5c3_Err != nil {
2561 return templ_7745c5c3_Err2760 return templ_7745c5c3_Err
2562 }2761 }
2563- var templ_7745c5c3_Var134 string2762+ var templ_7745c5c3_Var145 string
2564- templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)2763+ templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
2565 if templ_7745c5c3_Err != nil {2764 if templ_7745c5c3_Err != nil {
2566- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 368, Col: 49}2765+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 389, Col: 49}
2567 }2766 }
2568- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))2767+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
2569 if templ_7745c5c3_Err != nil {2768 if templ_7745c5c3_Err != nil {
2570 return templ_7745c5c3_Err2769 return templ_7745c5c3_Err
2571 }2770 }
2572- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 215, "</a> ")2771+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 233, "</a> ")
2573 if templ_7745c5c3_Err != nil {2772 if templ_7745c5c3_Err != nil {
2574 return templ_7745c5c3_Err2773 return templ_7745c5c3_Err
2575 }2774 }
2576 } else {2775 } else {
2577- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 216, "<span>")2776+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 234, "<span>")
2578 if templ_7745c5c3_Err != nil {2777 if templ_7745c5c3_Err != nil {
2579 return templ_7745c5c3_Err2778 return templ_7745c5c3_Err
2580 }2779 }
2581- var templ_7745c5c3_Var135 string2780+ var templ_7745c5c3_Var146 string
2582- templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)2781+ templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
2583 if templ_7745c5c3_Err != nil {2782 if templ_7745c5c3_Err != nil {
2584- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 370, Col: 21}2783+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 391, Col: 21}
2585 }2784 }
2586- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var135))2785+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
2587 if templ_7745c5c3_Err != nil {2786 if templ_7745c5c3_Err != nil {
2588 return templ_7745c5c3_Err2787 return templ_7745c5c3_Err
2589 }2788 }
2590- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 217, "</span> ")2789+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 235, "</span> ")
2591 if templ_7745c5c3_Err != nil {2790 if templ_7745c5c3_Err != nil {
2592 return templ_7745c5c3_Err2791 return templ_7745c5c3_Err
2593 }2792 }
2594 }2793 }
2595- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 218, "<span class=\"dim\">")2794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 236, "<span class=\"dim\">")
2596 if templ_7745c5c3_Err != nil {2795 if templ_7745c5c3_Err != nil {
2597 return templ_7745c5c3_Err2796 return templ_7745c5c3_Err
2598 }2797 }
2599- var templ_7745c5c3_Var136 string2798+ var templ_7745c5c3_Var147 string
2600- templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.JoinStringErrs(r.State)2799+ templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(r.State)
2601 if templ_7745c5c3_Err != nil {2800 if templ_7745c5c3_Err != nil {
2602- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 372, Col: 33}2801+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 393, Col: 33}
2603 }2802 }
2604- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var136))2803+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
2605 if templ_7745c5c3_Err != nil {2804 if templ_7745c5c3_Err != nil {
2606 return templ_7745c5c3_Err2805 return templ_7745c5c3_Err
2607 }2806 }
2608- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 219, "</span> ")2807+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 237, "</span> ")
2609 if templ_7745c5c3_Err != nil {2808 if templ_7745c5c3_Err != nil {
2610 return templ_7745c5c3_Err2809 return templ_7745c5c3_Err
2611 }2810 }
2612 if r.Waiting {2811 if r.Waiting {
2613- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 220, "<span class=\"mute\">waiting for a runner</span>")2812+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 238, "<span class=\"mute\">waiting for a runner</span>")
2614 if templ_7745c5c3_Err != nil {2813 if templ_7745c5c3_Err != nil {
2615 return templ_7745c5c3_Err2814 return templ_7745c5c3_Err
2616 }2815 }
2617 }2816 }
2618- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 221, "</li>")2817+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 239, "</li>")
2619 if templ_7745c5c3_Err != nil {2818 if templ_7745c5c3_Err != nil {
2620 return templ_7745c5c3_Err2819 return templ_7745c5c3_Err
2621 }2820 }
2622 }2821 }
2623- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 222, "</ul>")2822+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 240, "</ul>")
2624 if templ_7745c5c3_Err != nil {2823 if templ_7745c5c3_Err != nil {
2625 return templ_7745c5c3_Err2824 return templ_7745c5c3_Err
2626 }2825 }
2627 }2826 }
2628 if c.Note != "" {2827 if c.Note != "" {
2629- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 223, "<p class=\"mute\">")2828+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 241, "<p class=\"mute\">")
2630 if templ_7745c5c3_Err != nil {2829 if templ_7745c5c3_Err != nil {
2631 return templ_7745c5c3_Err2830 return templ_7745c5c3_Err
2632 }2831 }
2633- var templ_7745c5c3_Var137 string2832+ var templ_7745c5c3_Var148 string
2634- templ_7745c5c3_Var137, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note)2833+ templ_7745c5c3_Var148, templ_7745c5c3_Err = templ.JoinStringErrs(c.Note)
2635 if templ_7745c5c3_Err != nil {2834 if templ_7745c5c3_Err != nil {
2636- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 381, Col: 27}2835+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/actions.templ`, Line: 402, Col: 27}
2637 }2836 }
2638- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var137))2837+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var148))
2639 if templ_7745c5c3_Err != nil {2838 if templ_7745c5c3_Err != nil {
2640 return templ_7745c5c3_Err2839 return templ_7745c5c3_Err
2641 }2840 }
2642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 224, "</p>")2841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 242, "</p>")
2643 if templ_7745c5c3_Err != nil {2842 if templ_7745c5c3_Err != nil {
2644 return templ_7745c5c3_Err2843 return templ_7745c5c3_Err
2645 }2844 }
2646 }2845 }
2647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 225, "</section>")2846+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 243, "</section>")
2648 if templ_7745c5c3_Err != nil {2847 if templ_7745c5c3_Err != nil {
2649 return templ_7745c5c3_Err2848 return templ_7745c5c3_Err
2650 }2849 }
M internal/adapters/web/events.go +2 -1
@@ -53,7 +53,8 @@ import (
5353 // commits-head data: <div id="commits-head">N new commits — reload</div>
5454 // mr-notice data: <div id="mr-notice">…</div>, on the merge request pages:
5555 // something changed, with the link that reloads the page
56-// ci-run data: <tr id="run-<id>">…</tr> (the list of runs) or
56+// ci-run data: <tr id="run-<id>">…</tr> (the list of runs),
57+// <section id="recent-actions">…</section> (the rail of the summary) or
5758 // <div id="run-body">…</div> (one run)
5859 // ci-job data: <h2 id="job-head">…</h2> and <ol id="job-steps">…</ol>; the log
5960 // itself is never sent in this stream: the page follows it on its own
@@ -53,7 +53,8 @@ import (
53 // commits-head data: <div id="commits-head">N new commits — reload</div>53 // commits-head data: <div id="commits-head">N new commits — reload</div>
54 // mr-notice data: <div id="mr-notice">…</div>, on the merge request pages:54 // mr-notice data: <div id="mr-notice">…</div>, on the merge request pages:
55 // something changed, with the link that reloads the page55 // something changed, with the link that reloads the page
56-// ci-run data: <tr id="run-<id>">…</tr> (the list of runs) or56+// ci-run data: <tr id="run-<id>">…</tr> (the list of runs),
57+// <section id="recent-actions">…</section> (the rail of the summary) or
57 // <div id="run-body">…</div> (one run)58 // <div id="run-body">…</div> (one run)
58 // ci-job data: <h2 id="job-head">…</h2> and <ol id="job-steps">…</ol>; the log59 // ci-job data: <h2 id="job-head">…</h2> and <ol id="job-steps">…</ol>; the log
59 // itself is never sent in this stream: the page follows it on its own60 // itself is never sent in this stream: the page follows it on its own
M internal/adapters/web/fragments.go +23 -1
@@ -407,7 +407,8 @@ func (l *liveStream) notice(ctx context.Context, text, href string) ([]fragment,
407407 }
408408
409409 // runEvent updates the pages of CI that a RunUpdated changes: the row of the
410-// list of runs, or the body of the run page shown. Only a state is sent: the
410+// list of runs, the recent actions of the summary, or the body of the run page
411+// shown. Only a state is sent: the
411412 // events carry no log and no text of the workflow.
412413 func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]fragment, error) {
413414 if l.s.cfg.Runs == nil {
@@ -423,6 +424,8 @@ func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]frag
423424 f.html = strings.Replace(f.html, "<tr id=", "<tr data-new id=", 1)
424425 }
425426 return []fragment{f}, nil
427+ case "summary":
428+ return l.recentActions(ctx)
426429 case "run":
427430 if strconv.FormatInt(ev.Run.ID, 10) != l.n {
428431 return nil, nil
@@ -432,6 +435,25 @@ func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]frag
432435 return nil, nil
433436 }
434437
438+// recentActions is the "Recent actions" block of the summary rail, read again
439+// as the principal of the stream: the newest runs change with every event, and
440+// a viewer who cannot read CI any more gets the block hidden and empty.
441+func (l *liveStream) recentActions(ctx context.Context) ([]fragment, error) {
442+ name, err := domain.ParseRepoName(l.repo)
443+ if err != nil {
444+ return nil, nil
445+ }
446+ a, err := l.s.listRecentActions(ctx, name, l.s.cfg.Now())
447+ switch {
448+ case errors.Is(err, domain.ErrNotFound):
449+ a = RecentActions{AllHref: actionsBase(l.repo)}
450+ case err != nil:
451+ return nil, err
452+ }
453+ f, err := renderFragment(ctx, "ci-run", RecentActionsBlock(a))
454+ return []fragment{f}, err
455+}
456+
435457 // jobEvent updates the body of the run page and the steps of the job page.
436458 func (l *liveStream) jobEvent(ctx context.Context, ev domain.JobUpdated) ([]fragment, error) {
437459 if l.s.cfg.Runs == nil {
@@ -407,7 +407,8 @@ func (l *liveStream) notice(ctx context.Context, text, href string) ([]fragment,
407 }407 }
408 408
409 // runEvent updates the pages of CI that a RunUpdated changes: the row of the409 // runEvent updates the pages of CI that a RunUpdated changes: the row of the
410-// list of runs, or the body of the run page shown. Only a state is sent: the410+// list of runs, the recent actions of the summary, or the body of the run page
411+// shown. Only a state is sent: the
411 // events carry no log and no text of the workflow.412 // events carry no log and no text of the workflow.
412 func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]fragment, error) {413 func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]fragment, error) {
413 if l.s.cfg.Runs == nil {414 if l.s.cfg.Runs == nil {
@@ -423,6 +424,8 @@ func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]frag
423 f.html = strings.Replace(f.html, "<tr id=", "<tr data-new id=", 1)424 f.html = strings.Replace(f.html, "<tr id=", "<tr data-new id=", 1)
424 }425 }
425 return []fragment{f}, nil426 return []fragment{f}, nil
427+ case "summary":
428+ return l.recentActions(ctx)
426 case "run":429 case "run":
427 if strconv.FormatInt(ev.Run.ID, 10) != l.n {430 if strconv.FormatInt(ev.Run.ID, 10) != l.n {
428 return nil, nil431 return nil, nil
@@ -432,6 +435,25 @@ func (l *liveStream) runEvent(ctx context.Context, ev domain.RunUpdated) ([]frag
432 return nil, nil435 return nil, nil
433 }436 }
434 437
438+// recentActions is the "Recent actions" block of the summary rail, read again
439+// as the principal of the stream: the newest runs change with every event, and
440+// a viewer who cannot read CI any more gets the block hidden and empty.
441+func (l *liveStream) recentActions(ctx context.Context) ([]fragment, error) {
442+ name, err := domain.ParseRepoName(l.repo)
443+ if err != nil {
444+ return nil, nil
445+ }
446+ a, err := l.s.listRecentActions(ctx, name, l.s.cfg.Now())
447+ switch {
448+ case errors.Is(err, domain.ErrNotFound):
449+ a = RecentActions{AllHref: actionsBase(l.repo)}
450+ case err != nil:
451+ return nil, err
452+ }
453+ f, err := renderFragment(ctx, "ci-run", RecentActionsBlock(a))
454+ return []fragment{f}, err
455+}
456+
435 // jobEvent updates the body of the run page and the steps of the job page.457 // jobEvent updates the body of the run page and the steps of the job page.
436 func (l *liveStream) jobEvent(ctx context.Context, ev domain.JobUpdated) ([]fragment, error) {458 func (l *liveStream) jobEvent(ctx context.Context, ev domain.JobUpdated) ([]fragment, error) {
437 if l.s.cfg.Runs == nil {459 if l.s.cfg.Runs == nil {
M internal/adapters/web/pages.templ +3 -0
@@ -80,6 +80,9 @@ templ summaryRail(p SummaryPage) {
8080 <section aria-labelledby="r-recent"><h2 id="r-recent">Recent commits <a href={ templ.SafeURL(p.AllHref) }>View all</a></h2>@CommitRows(p.Recent)
8181 </section>
8282 }
83+ if p.Actions != nil {
84+ @RecentActionsBlock(*p.Actions)
85+ }
8386 if len(p.Outline) > 0 && p.Readme != nil {
8487 <section aria-labelledby="r-outline"><h2 id="r-outline">On this page</h2>@Outline(p.Outline)
8588 </section>
@@ -80,6 +80,9 @@ templ summaryRail(p SummaryPage) {
80 <section aria-labelledby="r-recent"><h2 id="r-recent">Recent commits <a href={ templ.SafeURL(p.AllHref) }>View all</a></h2>@CommitRows(p.Recent)80 <section aria-labelledby="r-recent"><h2 id="r-recent">Recent commits <a href={ templ.SafeURL(p.AllHref) }>View all</a></h2>@CommitRows(p.Recent)
81 </section>81 </section>
82 }82 }
83+ if p.Actions != nil {
84+ @RecentActionsBlock(*p.Actions)
85+ }
83 if len(p.Outline) > 0 && p.Readme != nil {86 if len(p.Outline) > 0 && p.Readme != nil {
84 <section aria-labelledby="r-outline"><h2 id="r-outline">On this page</h2>@Outline(p.Outline)87 <section aria-labelledby="r-outline"><h2 id="r-outline">On this page</h2>@Outline(p.Outline)
85 </section>88 </section>
M internal/adapters/web/pages_templ.go +42 -36 generated file: collapsed
M internal/adapters/web/static/css/65-ci.css +19 -1
@@ -15,9 +15,27 @@
1515 @media (prefers-reduced-motion: reduce) { .ck-running { animation: none; border-top-color: var(--teal); } }
1616
1717 .ck-sum { display: inline-flex; align-items: center; gap: var(--s1); margin-left: var(--s2); font-size: var(--fs-xs); white-space: nowrap; }
18+ /* The lists are table-layout: fixed, where a percentage is only a sliver:
19+ the check column holds the mark, its count and the padding of the cells;
20+ the refs list has the mark next to the sha. */
1821 .c-ck { width: 1%; white-space: nowrap; }
22+ .list .c-ck { width: 92px; }
23+ .rail .list.commits .c-ck { width: 76px; }
24+ .list.refs .c-sha { width: 150px; }
1925
20- .runs .c-st { width: 1%; }
26+ /* the table is fixed: the status column is the icon, its margin and the
27+ padding of the cells (a percentage would leave a sliver) */
28+ .runs .c-st { width: calc(14px + var(--s1) + 2 * var(--s3)); }
29+ /* the recent runs of the summary rail */
30+ .rruns {
31+ display: grid; padding: 0; list-style: none; font-size: var(--fs-s);
32+ & li { display: flex; align-items: center; gap: var(--s1); min-width: 0; padding: 2px 0; }
33+ & .ck { margin-right: var(--s1); }
34+ & .rr-name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink-hi); text-decoration: none; }
35+ & .rr-name:hover { text-decoration: underline; }
36+ & .rr-ref { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-left: var(--s1); font-family: var(--mono); color: var(--ink-dim); text-decoration: none; }
37+ & time { flex: none; margin-left: auto; padding-left: var(--s2); white-space: nowrap; }
38+ }
2139 .runs .c-dur, .runs .c-who { white-space: nowrap; }
2240 .runs tr[data-new] { background: var(--bg-raised); }
2341
@@ -15,9 +15,27 @@
15 @media (prefers-reduced-motion: reduce) { .ck-running { animation: none; border-top-color: var(--teal); } }15 @media (prefers-reduced-motion: reduce) { .ck-running { animation: none; border-top-color: var(--teal); } }
16 16
17 .ck-sum { display: inline-flex; align-items: center; gap: var(--s1); margin-left: var(--s2); font-size: var(--fs-xs); white-space: nowrap; }17 .ck-sum { display: inline-flex; align-items: center; gap: var(--s1); margin-left: var(--s2); font-size: var(--fs-xs); white-space: nowrap; }
18+ /* The lists are table-layout: fixed, where a percentage is only a sliver:
19+ the check column holds the mark, its count and the padding of the cells;
20+ the refs list has the mark next to the sha. */
18 .c-ck { width: 1%; white-space: nowrap; }21 .c-ck { width: 1%; white-space: nowrap; }
22+ .list .c-ck { width: 92px; }
23+ .rail .list.commits .c-ck { width: 76px; }
24+ .list.refs .c-sha { width: 150px; }
19 25
20- .runs .c-st { width: 1%; }26+ /* the table is fixed: the status column is the icon, its margin and the
27+ padding of the cells (a percentage would leave a sliver) */
28+ .runs .c-st { width: calc(14px + var(--s1) + 2 * var(--s3)); }
29+ /* the recent runs of the summary rail */
30+ .rruns {
31+ display: grid; padding: 0; list-style: none; font-size: var(--fs-s);
32+ & li { display: flex; align-items: center; gap: var(--s1); min-width: 0; padding: 2px 0; }
33+ & .ck { margin-right: var(--s1); }
34+ & .rr-name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink-hi); text-decoration: none; }
35+ & .rr-name:hover { text-decoration: underline; }
36+ & .rr-ref { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-left: var(--s1); font-family: var(--mono); color: var(--ink-dim); text-decoration: none; }
37+ & time { flex: none; margin-left: auto; padding-left: var(--s2); white-space: nowrap; }
38+ }
21 .runs .c-dur, .runs .c-who { white-space: nowrap; }39 .runs .c-dur, .runs .c-who { white-space: nowrap; }
22 .runs tr[data-new] { background: var(--bg-raised); }40 .runs tr[data-new] { background: var(--bg-raised); }
23 41
M internal/adapters/web/summary.go +37 -0
@@ -4,6 +4,7 @@ package web
44
55 import (
66 "context"
7+ "errors"
78 "fmt"
89 "html"
910 "html/template"
@@ -26,6 +27,9 @@ const maxReadmeBytes = 512 << 10
2627 // recentCommits is how many commits the rail of the summary lists.
2728 const recentCommits = 5
2829
30+// recentRuns is how many runs the rail of the summary lists.
31+const recentRuns = 5
32+
2933 // readmeNames are the README file names in order of preference (compared
3034 // lowercase): Markdown first.
3135 var readmeNames = []string{"readme.md", "readme.markdown", "readme", "readme.txt"}
@@ -63,6 +67,7 @@ func (s *Server) summary(ctx context.Context, r *http.Request) (templ.Component,
6367
6468 p.Facts = s.facts(d, now)
6569 p.Latest = s.latest(ctx, d)
70+ p.Actions = s.recentActions(ctx, d.repo.Name, now)
6671
6772 if rd, err := s.readme(ctx, d, ref); err != nil {
6873 return nil, 0, err
@@ -232,3 +237,35 @@ func humanSize(n int64) string {
232237 }
233238 return fmt.Sprintf("%.1f MiB", float64(n)/(1<<20))
234239 }
240+
241+// recentActions is the newest runs for the rail, as the caller of the request
242+// sees them (the permission of the actions page). It is nil when the server
243+// runs no CI or the caller cannot read it; a failure of the read is logged and
244+// the page goes on without, since the code does not depend on CI.
245+func (s *Server) recentActions(ctx context.Context, repo domain.RepoName, now time.Time) *RecentActions {
246+ if s.cfg.Runs == nil {
247+ return nil
248+ }
249+ a, err := s.listRecentActions(ctx, repo, now)
250+ if err != nil {
251+ if !errors.Is(err, domain.ErrNotFound) {
252+ log := zerowrap.FromCtx(ctx)
253+ log.Warn().Err(err).Str("repo", repo.String()).Msg("read the recent runs")
254+ }
255+ return nil
256+ }
257+ return &a
258+}
259+
260+// listRecentActions reads the newest runs of a repository.
261+func (s *Server) listRecentActions(ctx context.Context, repo domain.RepoName, now time.Time) (RecentActions, error) {
262+ page, err := s.cfg.Runs.ListRuns(ctx, principal(ctx), repo, ports.ListRunsParams{PageSize: recentRuns})
263+ if err != nil {
264+ return RecentActions{}, err
265+ }
266+ a := RecentActions{AllHref: actionsBase(repo.String())}
267+ for _, run := range page.Runs {
268+ a.Runs = append(a.Runs, s.runRow(repo.String(), run, now))
269+ }
270+ return a, nil
271+}
@@ -4,6 +4,7 @@ package web
4 4
5 import (5 import (
6 "context"6 "context"
7+ "errors"
7 "fmt"8 "fmt"
8 "html"9 "html"
9 "html/template"10 "html/template"
@@ -26,6 +27,9 @@ const maxReadmeBytes = 512 << 10
26 // recentCommits is how many commits the rail of the summary lists.27 // recentCommits is how many commits the rail of the summary lists.
27 const recentCommits = 528 const recentCommits = 5
28 29
30+// recentRuns is how many runs the rail of the summary lists.
31+const recentRuns = 5
32+
29 // readmeNames are the README file names in order of preference (compared33 // readmeNames are the README file names in order of preference (compared
30 // lowercase): Markdown first.34 // lowercase): Markdown first.
31 var readmeNames = []string{"readme.md", "readme.markdown", "readme", "readme.txt"}35 var readmeNames = []string{"readme.md", "readme.markdown", "readme", "readme.txt"}
@@ -63,6 +67,7 @@ func (s *Server) summary(ctx context.Context, r *http.Request) (templ.Component,
63 67
64 p.Facts = s.facts(d, now)68 p.Facts = s.facts(d, now)
65 p.Latest = s.latest(ctx, d)69 p.Latest = s.latest(ctx, d)
70+ p.Actions = s.recentActions(ctx, d.repo.Name, now)
66 71
67 if rd, err := s.readme(ctx, d, ref); err != nil {72 if rd, err := s.readme(ctx, d, ref); err != nil {
68 return nil, 0, err73 return nil, 0, err
@@ -232,3 +237,35 @@ func humanSize(n int64) string {
232 }237 }
233 return fmt.Sprintf("%.1f MiB", float64(n)/(1<<20))238 return fmt.Sprintf("%.1f MiB", float64(n)/(1<<20))
234 }239 }
240+
241+// recentActions is the newest runs for the rail, as the caller of the request
242+// sees them (the permission of the actions page). It is nil when the server
243+// runs no CI or the caller cannot read it; a failure of the read is logged and
244+// the page goes on without, since the code does not depend on CI.
245+func (s *Server) recentActions(ctx context.Context, repo domain.RepoName, now time.Time) *RecentActions {
246+ if s.cfg.Runs == nil {
247+ return nil
248+ }
249+ a, err := s.listRecentActions(ctx, repo, now)
250+ if err != nil {
251+ if !errors.Is(err, domain.ErrNotFound) {
252+ log := zerowrap.FromCtx(ctx)
253+ log.Warn().Err(err).Str("repo", repo.String()).Msg("read the recent runs")
254+ }
255+ return nil
256+ }
257+ return &a
258+}
259+
260+// listRecentActions reads the newest runs of a repository.
261+func (s *Server) listRecentActions(ctx context.Context, repo domain.RepoName, now time.Time) (RecentActions, error) {
262+ page, err := s.cfg.Runs.ListRuns(ctx, principal(ctx), repo, ports.ListRunsParams{PageSize: recentRuns})
263+ if err != nil {
264+ return RecentActions{}, err
265+ }
266+ a := RecentActions{AllHref: actionsBase(repo.String())}
267+ for _, run := range page.Runs {
268+ a.Runs = append(a.Runs, s.runRow(repo.String(), run, now))
269+ }
270+ return a, nil
271+}
A internal/adapters/web/summary_actions_test.go +127 -0
@@ -0,0 +1,127 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "bytes"
7+ "errors"
8+ "strings"
9+ "testing"
10+ "time"
11+
12+ "github.com/stretchr/testify/assert"
13+ "github.com/stretchr/testify/mock"
14+ "github.com/stretchr/testify/require"
15+
16+ "bnema.dev/ermite/internal/domain"
17+ "bnema.dev/ermite/internal/ports"
18+ "bnema.dev/ermite/internal/ports/mocks"
19+)
20+
21+func testRuns(repo domain.RepoName, n int) []domain.CIRun {
22+ var runs []domain.CIRun
23+ for i := n; i >= 1; i-- {
24+ runs = append(runs, domain.CIRun{
25+ Repo: repo, ID: int64(i), Number: int64(i), Attempt: 1, WorkflowName: "ci", Ref: "refs/heads/main",
26+ Sha: strings.Repeat("a", 40), Status: domain.CICompleted, Conclusion: domain.CISuccess,
27+ CreatedAt: time.Now().Add(-time.Duration(i) * time.Minute),
28+ })
29+ }
30+ return runs
31+}
32+
33+func servingRuns(t *testing.T, repo domain.RepoName, runs []domain.CIRun, err error) (*Server, *mocks.RunService) {
34+ t.Helper()
35+ m := mocks.NewRunService(t)
36+ m.EXPECT().ListRuns(mock.Anything, mock.Anything, repo, ports.ListRunsParams{PageSize: recentRuns}).
37+ Return(ports.RunPage{Runs: runs}, err).Maybe()
38+ return newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, repo.String())), Browse: mocks.NewBrowseService(t), Runs: m}), m
39+}
40+
41+func renderRail(t *testing.T, p SummaryPage) string {
42+ t.Helper()
43+ var b bytes.Buffer
44+ require.NoError(t, summaryRail(p).Render(t.Context(), &b))
45+ return b.String()
46+}
47+
48+func TestSummaryRailRecentActions(t *testing.T) {
49+ t.Parallel()
50+ repo := repoName(t, "proj")
51+ srv, _ := servingRuns(t, repo, testRuns(repo, 5), nil)
52+
53+ p := SummaryPage{Actions: srv.recentActions(t.Context(), repo, time.Now())}
54+ require.NotNil(t, p.Actions)
55+ out := renderRail(t, p)
56+ assert.Contains(t, out, `id="recent-actions"`)
57+ assert.Contains(t, out, "Recent actions")
58+ assert.Contains(t, out, `href="/proj/actions"`, "view all")
59+ assert.Equal(t, 5, strings.Count(out, `class="rr-name"`))
60+ assert.Contains(t, out, `href="/proj/actions/runs/5"`)
61+ assert.Contains(t, out, `aria-label="success"`, "the status icon")
62+ assert.Contains(t, out, `href="/proj/tree/main"`, "the ref")
63+ assert.Contains(t, out, "#5")
64+ assert.NotContains(t, out, `id="recent-actions" aria-labelledby="r-actions" hidden`)
65+}
66+
67+func TestSummaryRailRecentActionsHidden(t *testing.T) {
68+ t.Parallel()
69+ repo := repoName(t, "proj")
70+
71+ // The viewer cannot read CI: no block at all, not even to receive events.
72+ srv, _ := servingRuns(t, repo, nil, domain.ErrNotFound)
73+ assert.Nil(t, srv.recentActions(t.Context(), repo, time.Now()))
74+ assert.NotContains(t, renderRail(t, SummaryPage{}), "recent-actions")
75+
76+ // A failure of the read does not break the page.
77+ srv, _ = servingRuns(t, repo, nil, errors.New("boom"))
78+ assert.Nil(t, srv.recentActions(t.Context(), repo, time.Now()))
79+
80+ // No CI on this server.
81+ noCI := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: mocks.NewBrowseService(t)})
82+ assert.Nil(t, noCI.recentActions(t.Context(), repo, time.Now()))
83+
84+ // No run yet: the block is there for the first run, but hidden.
85+ srv, _ = servingRuns(t, repo, nil, nil)
86+ a := srv.recentActions(t.Context(), repo, time.Now())
87+ require.NotNil(t, a)
88+ assert.Contains(t, renderRail(t, SummaryPage{Actions: a}), `id="recent-actions" aria-labelledby="r-actions" hidden`)
89+}
90+
91+func TestRunUpdatedReplacesRecentActionsOnSummary(t *testing.T) {
92+ t.Parallel()
93+ repo := repoName(t, "proj")
94+ runs := testRuns(repo, 3)
95+ runs[0].Status, runs[0].Conclusion = domain.CIInProgress, ""
96+ srv, _ := servingRuns(t, repo, runs, nil)
97+
98+ ev := ports.WatchEvent{Event: domain.RunUpdated{Run: runs[0]}}
99+ ls := &liveStream{s: srv, repo: "proj", view: "summary"}
100+ got, err := ls.render(t.Context(), ev)
101+ require.NoError(t, err)
102+ require.Len(t, got, 1)
103+ assert.Equal(t, "ci-run", got[0].event)
104+ assert.True(t, strings.HasPrefix(got[0].html, `<section id="recent-actions"`), got[0].html)
105+ assert.Equal(t, 3, strings.Count(got[0].html, `class="rr-name"`))
106+ assert.Contains(t, got[0].html, `aria-label="running"`)
107+
108+ // The other pages do not get the block.
109+ for _, view := range []string{"refs", "commits", "mrs"} {
110+ got, err = (&liveStream{s: srv, repo: "proj", view: view}).render(t.Context(), ev)
111+ require.NoError(t, err, view)
112+ assert.Empty(t, got, view)
113+ }
114+}
115+
116+func TestRunUpdatedOnSummaryWhenCIIsNotReadable(t *testing.T) {
117+ t.Parallel()
118+ repo := repoName(t, "proj")
119+ srv, _ := servingRuns(t, repo, nil, domain.ErrNotFound)
120+
121+ ls := &liveStream{s: srv, repo: "proj", view: "summary"}
122+ got, err := ls.render(t.Context(), ports.WatchEvent{Event: domain.RunUpdated{Run: testRuns(repo, 1)[0]}})
123+ require.NoError(t, err)
124+ require.Len(t, got, 1)
125+ assert.Contains(t, got[0].html, "hidden", "the block empties and hides, no run leaks")
126+ assert.NotContains(t, got[0].html, "rr-name")
127+}
@@ -0,0 +1,127 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "bytes"
7+ "errors"
8+ "strings"
9+ "testing"
10+ "time"
11+
12+ "github.com/stretchr/testify/assert"
13+ "github.com/stretchr/testify/mock"
14+ "github.com/stretchr/testify/require"
15+
16+ "bnema.dev/ermite/internal/domain"
17+ "bnema.dev/ermite/internal/ports"
18+ "bnema.dev/ermite/internal/ports/mocks"
19+)
20+
21+func testRuns(repo domain.RepoName, n int) []domain.CIRun {
22+ var runs []domain.CIRun
23+ for i := n; i >= 1; i-- {
24+ runs = append(runs, domain.CIRun{
25+ Repo: repo, ID: int64(i), Number: int64(i), Attempt: 1, WorkflowName: "ci", Ref: "refs/heads/main",
26+ Sha: strings.Repeat("a", 40), Status: domain.CICompleted, Conclusion: domain.CISuccess,
27+ CreatedAt: time.Now().Add(-time.Duration(i) * time.Minute),
28+ })
29+ }
30+ return runs
31+}
32+
33+func servingRuns(t *testing.T, repo domain.RepoName, runs []domain.CIRun, err error) (*Server, *mocks.RunService) {
34+ t.Helper()
35+ m := mocks.NewRunService(t)
36+ m.EXPECT().ListRuns(mock.Anything, mock.Anything, repo, ports.ListRunsParams{PageSize: recentRuns}).
37+ Return(ports.RunPage{Runs: runs}, err).Maybe()
38+ return newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, repo.String())), Browse: mocks.NewBrowseService(t), Runs: m}), m
39+}
40+
41+func renderRail(t *testing.T, p SummaryPage) string {
42+ t.Helper()
43+ var b bytes.Buffer
44+ require.NoError(t, summaryRail(p).Render(t.Context(), &b))
45+ return b.String()
46+}
47+
48+func TestSummaryRailRecentActions(t *testing.T) {
49+ t.Parallel()
50+ repo := repoName(t, "proj")
51+ srv, _ := servingRuns(t, repo, testRuns(repo, 5), nil)
52+
53+ p := SummaryPage{Actions: srv.recentActions(t.Context(), repo, time.Now())}
54+ require.NotNil(t, p.Actions)
55+ out := renderRail(t, p)
56+ assert.Contains(t, out, `id="recent-actions"`)
57+ assert.Contains(t, out, "Recent actions")
58+ assert.Contains(t, out, `href="/proj/actions"`, "view all")
59+ assert.Equal(t, 5, strings.Count(out, `class="rr-name"`))
60+ assert.Contains(t, out, `href="/proj/actions/runs/5"`)
61+ assert.Contains(t, out, `aria-label="success"`, "the status icon")
62+ assert.Contains(t, out, `href="/proj/tree/main"`, "the ref")
63+ assert.Contains(t, out, "#5")
64+ assert.NotContains(t, out, `id="recent-actions" aria-labelledby="r-actions" hidden`)
65+}
66+
67+func TestSummaryRailRecentActionsHidden(t *testing.T) {
68+ t.Parallel()
69+ repo := repoName(t, "proj")
70+
71+ // The viewer cannot read CI: no block at all, not even to receive events.
72+ srv, _ := servingRuns(t, repo, nil, domain.ErrNotFound)
73+ assert.Nil(t, srv.recentActions(t.Context(), repo, time.Now()))
74+ assert.NotContains(t, renderRail(t, SummaryPage{}), "recent-actions")
75+
76+ // A failure of the read does not break the page.
77+ srv, _ = servingRuns(t, repo, nil, errors.New("boom"))
78+ assert.Nil(t, srv.recentActions(t.Context(), repo, time.Now()))
79+
80+ // No CI on this server.
81+ noCI := newTestServer(t, Config{Repos: reposServing(t, publicRepo(t, "proj")), Browse: mocks.NewBrowseService(t)})
82+ assert.Nil(t, noCI.recentActions(t.Context(), repo, time.Now()))
83+
84+ // No run yet: the block is there for the first run, but hidden.
85+ srv, _ = servingRuns(t, repo, nil, nil)
86+ a := srv.recentActions(t.Context(), repo, time.Now())
87+ require.NotNil(t, a)
88+ assert.Contains(t, renderRail(t, SummaryPage{Actions: a}), `id="recent-actions" aria-labelledby="r-actions" hidden`)
89+}
90+
91+func TestRunUpdatedReplacesRecentActionsOnSummary(t *testing.T) {
92+ t.Parallel()
93+ repo := repoName(t, "proj")
94+ runs := testRuns(repo, 3)
95+ runs[0].Status, runs[0].Conclusion = domain.CIInProgress, ""
96+ srv, _ := servingRuns(t, repo, runs, nil)
97+
98+ ev := ports.WatchEvent{Event: domain.RunUpdated{Run: runs[0]}}
99+ ls := &liveStream{s: srv, repo: "proj", view: "summary"}
100+ got, err := ls.render(t.Context(), ev)
101+ require.NoError(t, err)
102+ require.Len(t, got, 1)
103+ assert.Equal(t, "ci-run", got[0].event)
104+ assert.True(t, strings.HasPrefix(got[0].html, `<section id="recent-actions"`), got[0].html)
105+ assert.Equal(t, 3, strings.Count(got[0].html, `class="rr-name"`))
106+ assert.Contains(t, got[0].html, `aria-label="running"`)
107+
108+ // The other pages do not get the block.
109+ for _, view := range []string{"refs", "commits", "mrs"} {
110+ got, err = (&liveStream{s: srv, repo: "proj", view: view}).render(t.Context(), ev)
111+ require.NoError(t, err, view)
112+ assert.Empty(t, got, view)
113+ }
114+}
115+
116+func TestRunUpdatedOnSummaryWhenCIIsNotReadable(t *testing.T) {
117+ t.Parallel()
118+ repo := repoName(t, "proj")
119+ srv, _ := servingRuns(t, repo, nil, domain.ErrNotFound)
120+
121+ ls := &liveStream{s: srv, repo: "proj", view: "summary"}
122+ got, err := ls.render(t.Context(), ports.WatchEvent{Event: domain.RunUpdated{Run: testRuns(repo, 1)[0]}})
123+ require.NoError(t, err)
124+ require.Len(t, got, 1)
125+ assert.Contains(t, got[0].html, "hidden", "the block empties and hides, no run leaks")
126+ assert.NotContains(t, got[0].html, "rr-name")
127+}
M internal/adapters/web/view.go +11 -0
@@ -153,6 +153,17 @@ type SummaryPage struct {
153153 AllHref string
154154 // Latest is the newest tag, nil when the repository has none.
155155 Latest *LatestTag
156+ // Actions is the recent runs of the rail, nil when the viewer cannot read
157+ // CI (or the server runs none).
158+ Actions *RecentActions
159+}
160+
161+// RecentActions is the "Recent actions" block of the summary rail: the newest
162+// runs. With no run the block is in the page but hidden, so that the first
163+// run reaches it live.
164+type RecentActions struct {
165+ Runs []RunRow
166+ AllHref string
156167 }
157168
158169 // LatestTag is the newest tag of a repository, shown in the summary rail.
@@ -153,6 +153,17 @@ type SummaryPage struct {
153 AllHref string153 AllHref string
154 // Latest is the newest tag, nil when the repository has none.154 // Latest is the newest tag, nil when the repository has none.
155 Latest *LatestTag155 Latest *LatestTag
156+ // Actions is the recent runs of the rail, nil when the viewer cannot read
157+ // CI (or the server runs none).
158+ Actions *RecentActions
159+}
160+
161+// RecentActions is the "Recent actions" block of the summary rail: the newest
162+// runs. With no run the block is in the page but hidden, so that the first
163+// run reaches it live.
164+type RecentActions struct {
165+ Runs []RunRow
166+ AllHref string
156 }167 }
157 168
158 // LatestTag is the newest tag of a repository, shown in the summary rail.169 // LatestTag is the newest tag of a repository, shown in the summary rail.
M internal/app/testdata/web/summary.html +6 -0
@@ -200,6 +200,12 @@
200200 </tbody>
201201 </table>
202202 </section>
203+<section id="recent-actions" aria-labelledby="r-actions" hidden>
204+<h2 id="r-actions">Recent actions <a href="/demo/actions">View all</a>
205+</h2>
206+<ul class="rruns">
207+</ul>
208+</section>
203209 <section aria-labelledby="r-outline">
204210 <h2 id="r-outline">On this page</h2>
205211 <nav class="outline" aria-label="Outline">
@@ -200,6 +200,12 @@
200 </tbody>200 </tbody>
201 </table>201 </table>
202 </section>202 </section>
203+<section id="recent-actions" aria-labelledby="r-actions" hidden>
204+<h2 id="r-actions">Recent actions <a href="/demo/actions">View all</a>
205+</h2>
206+<ul class="rruns">
207+</ul>
208+</section>
203 <section aria-labelledby="r-outline">209 <section aria-labelledby="r-outline">
204 <h2 id="r-outline">On this page</h2>210 <h2 id="r-outline">On this page</h2>
205 <nav class="outline" aria-label="Outline">211 <nav class="outline" aria-label="Outline">

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 42

↑↓ moveenter openesc close