@profoundlogic/coderflow-server 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/base-image/entrypoint.sh +2 -1
  2. package/dist/coder-server.js +1 -1
  3. package/dist/config.js +1 -1
  4. package/dist/lib/agent-keepalive.js +1 -1
  5. package/dist/lib/agent-models.js +1 -1
  6. package/dist/lib/api-keys.js +1 -1
  7. package/dist/lib/apiKeys.js +1 -1
  8. package/dist/lib/app-server-ports.js +1 -1
  9. package/dist/lib/auto-judge.js +1 -1
  10. package/dist/lib/automation-service.js +1 -0
  11. package/dist/lib/basic-auth.js +1 -1
  12. package/dist/lib/bindings.js +1 -0
  13. package/dist/lib/build-history.js +1 -1
  14. package/dist/lib/build-output-service.js +1 -1
  15. package/dist/lib/build-scheduler.js +1 -1
  16. package/dist/lib/build-service.js +1 -1
  17. package/dist/lib/ca-certificates.js +1 -1
  18. package/dist/lib/claude-oauth-refresh.js +1 -1
  19. package/dist/lib/cli/build.js +1 -1
  20. package/dist/lib/cli/config-command.js +1 -1
  21. package/dist/lib/cli/config.js +1 -1
  22. package/dist/lib/cli/create-user.js +1 -1
  23. package/dist/lib/cli/init.js +1 -1
  24. package/dist/lib/cli/jira.js +1 -1
  25. package/dist/lib/cli/license.js +1 -1
  26. package/dist/lib/cli/server-manager.js +1 -1
  27. package/dist/lib/config-migration.js +1 -1
  28. package/dist/lib/container-credential-sync.js +1 -1
  29. package/dist/lib/container-tokens.js +1 -1
  30. package/dist/lib/data-dir.js +1 -1
  31. package/dist/lib/deployment-history.js +1 -1
  32. package/dist/lib/deployment-service.js +1 -1
  33. package/dist/lib/docker-utils.js +1 -1
  34. package/dist/lib/email.js +1 -1
  35. package/dist/lib/emailTemplates.js +1 -1
  36. package/dist/lib/entitlement.js +1 -1
  37. package/dist/lib/fetch-utils.js +1 -1
  38. package/dist/lib/git-commit-details-route.js +1 -1
  39. package/dist/lib/git-history-diff-guardrails.js +1 -1
  40. package/dist/lib/git-provider-service.js +1 -1
  41. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  42. package/dist/lib/git-provider-setup/index.js +1 -1
  43. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  44. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  45. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  46. package/dist/lib/git-providers/github-app-provider.js +1 -1
  47. package/dist/lib/git-providers/index.js +1 -1
  48. package/dist/lib/git-providers/provider-factory.js +1 -1
  49. package/dist/lib/git-providers/provider-interface.js +1 -1
  50. package/dist/lib/github-urls.js +1 -1
  51. package/dist/lib/group-objective-linking.js +1 -1
  52. package/dist/lib/jira-client.js +1 -1
  53. package/dist/lib/judge-blinding.js +1 -1
  54. package/dist/lib/logger.js +1 -1
  55. package/dist/lib/migration-to-scoped-rbac.js +1 -0
  56. package/dist/lib/model-fetcher.js +1 -1
  57. package/dist/lib/notifications.js +1 -1
  58. package/dist/lib/objective-context.js +1 -1
  59. package/dist/lib/oidc-auth.js +1 -1
  60. package/dist/lib/oidc-device-flow.js +1 -1
  61. package/dist/lib/passwordTokens.js +1 -1
  62. package/dist/lib/permission-resolver.js +1 -0
  63. package/dist/lib/pin-cascade.js +1 -1
  64. package/dist/lib/provider-accounts.js +1 -1
  65. package/dist/lib/provider-oauth.js +1 -1
  66. package/dist/lib/provider-profile.js +1 -1
  67. package/dist/lib/provider-token-refresh.js +1 -1
  68. package/dist/lib/request-url.js +1 -1
  69. package/dist/lib/rewind.js +1 -1
  70. package/dist/lib/role-definitions.js +1 -0
  71. package/dist/lib/roles.js +1 -1
  72. package/dist/lib/secrets.js +1 -1
  73. package/dist/lib/setup-repo-git-auth.js +1 -1
  74. package/dist/lib/state-capture.js +1 -1
  75. package/dist/lib/static-files.js +1 -1
  76. package/dist/lib/task-name-format.js +1 -1
  77. package/dist/lib/task-name-generator.js +1 -1
  78. package/dist/lib/task-source-metadata.js +1 -0
  79. package/dist/lib/teams.js +1 -0
  80. package/dist/lib/user-git-oauth.js +1 -1
  81. package/dist/lib/user-git-tokens.js +1 -1
  82. package/dist/lib/users.js +1 -1
  83. package/dist/middleware/requireAuth.js +1 -1
  84. package/dist/middleware/requireInit.js +1 -1
  85. package/dist/middleware/requirePermission.js +1 -1
  86. package/dist/package-lock.json +211 -21
  87. package/dist/package.json +2 -1
  88. package/dist/playwright.config.js +1 -0
  89. package/dist/routes/apiKeys.js +1 -1
  90. package/dist/routes/auth-oidc.js +1 -1
  91. package/dist/routes/auth.js +1 -1
  92. package/dist/routes/automations.js +1 -0
  93. package/dist/routes/bindings.js +1 -0
  94. package/dist/routes/build.js +1 -1
  95. package/dist/routes/containers.js +1 -1
  96. package/dist/routes/deploy-task.js +1 -1
  97. package/dist/routes/environment-management.js +1 -1
  98. package/dist/routes/environments.js +1 -1
  99. package/dist/routes/external-skills.js +1 -1
  100. package/dist/routes/git-credentials.js +1 -1
  101. package/dist/routes/git-oauth.js +1 -1
  102. package/dist/routes/git-provider-setup.js +1 -1
  103. package/dist/routes/health.js +1 -1
  104. package/dist/routes/jira.js +1 -1
  105. package/dist/routes/objective-management.js +1 -1
  106. package/dist/routes/password.js +1 -1
  107. package/dist/routes/prompt.js +1 -1
  108. package/dist/routes/provider-auth.js +1 -1
  109. package/dist/routes/qa.js +1 -1
  110. package/dist/routes/roles.js +1 -0
  111. package/dist/routes/settings.js +1 -1
  112. package/dist/routes/skill-management.js +1 -1
  113. package/dist/routes/skills.js +1 -1
  114. package/dist/routes/tasks.js +1 -1
  115. package/dist/routes/teams.js +1 -0
  116. package/dist/routes/templates.js +1 -1
  117. package/dist/routes/test-task.js +1 -1
  118. package/dist/routes/test.js +1 -1
  119. package/dist/routes/users.js +1 -1
  120. package/dist/routes/visualizations.js +1 -1
  121. package/dist/scripts/create-user.js +1 -1
  122. package/dist/scripts/migrate-config-to-data-dir.js +1 -1
  123. package/dist/scripts/migrate-to-scoped-rbac.js +2 -0
  124. package/dist/start.js +1 -1
  125. package/dist/start.js.bak +1381 -0
  126. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  127. package/dist/web-ui/public/activity-feed.js +1 -1
  128. package/dist/web-ui/public/activity-formatters.js +1 -1
  129. package/dist/web-ui/public/agent-event-parser.js +1 -1
  130. package/dist/web-ui/public/app.js +1 -1
  131. package/dist/web-ui/public/approve-dialog.js +1 -1
  132. package/dist/web-ui/public/automation-links.js +1 -0
  133. package/dist/web-ui/public/automation-schedule.js +1 -0
  134. package/dist/web-ui/public/comments-widget.js +1 -1
  135. package/dist/web-ui/public/diff-utils.js +1 -1
  136. package/dist/web-ui/public/docs/_sidebar.md +1 -0
  137. package/dist/web-ui/public/docs/admin/automations.md +75 -0
  138. package/dist/web-ui/public/docs/admin/users-and-roles.md +14 -4
  139. package/dist/web-ui/public/environments.css +247 -125
  140. package/dist/web-ui/public/environments.html +346 -2
  141. package/dist/web-ui/public/environments.js +1 -1
  142. package/dist/web-ui/public/feedback-widget.css +42 -0
  143. package/dist/web-ui/public/feedback-widget.js +1 -1
  144. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  145. package/dist/web-ui/public/git-history.html +15 -0
  146. package/dist/web-ui/public/git-history.js +1 -1
  147. package/dist/web-ui/public/git-status.js +1 -1
  148. package/dist/web-ui/public/index.html +27 -0
  149. package/dist/web-ui/public/index.js +1 -1
  150. package/dist/web-ui/public/login.js +1 -1
  151. package/dist/web-ui/public/markdown-editor.js +1 -1
  152. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  153. package/dist/web-ui/public/modal-maximize.js +1 -1
  154. package/dist/web-ui/public/notifications.js +1 -1
  155. package/dist/web-ui/public/pr-dialog.js +1 -1
  156. package/dist/web-ui/public/roles.html +247 -0
  157. package/dist/web-ui/public/roles.js +1 -0
  158. package/dist/web-ui/public/server-health.js +1 -1
  159. package/dist/web-ui/public/settings.html +62 -0
  160. package/dist/web-ui/public/settings.js +1 -1
  161. package/dist/web-ui/public/setup-password.js +1 -1
  162. package/dist/web-ui/public/skills.html +15 -0
  163. package/dist/web-ui/public/skills.js +1 -1
  164. package/dist/web-ui/public/sse-client.js +1 -1
  165. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  166. package/dist/web-ui/public/styles.css +198 -161
  167. package/dist/web-ui/public/task.html +2 -2
  168. package/dist/web-ui/public/task.js +1 -1
  169. package/dist/web-ui/public/teams.html +285 -0
  170. package/dist/web-ui/public/teams.js +1 -0
  171. package/dist/web-ui/public/terminal.js +1 -1
  172. package/dist/web-ui/public/theme.js +1 -1
  173. package/dist/web-ui/public/users.html +87 -29
  174. package/dist/web-ui/public/users.js +1 -1
  175. package/dist/web-ui/public/variant-grouping.js +1 -1
  176. package/package.json +6 -3
@@ -23,7 +23,7 @@
23
23
  })();
24
24
  </script>
25
25
  <link rel="stylesheet" href="styles.css?v=84">
26
- <link rel="stylesheet" href="environments.css?v=21">
26
+ <link rel="stylesheet" href="environments.css?v=23">
27
27
  <!-- Syntax highlighting for inline diffs -->
28
28
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
29
29
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
@@ -33,7 +33,7 @@
33
33
  <script type="module" src="markdown-editor.js?v=1"></script>
34
34
  <script src="markdown-file-editor.js?v=1"></script>
35
35
  <script type="module" src="app.js?v=66"></script>
36
- <script type="module" src="environments.js?v=47"></script>
36
+ <script type="module" src="environments.js?v=49"></script>
37
37
  <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
38
38
  </head>
39
39
  <body>
@@ -70,6 +70,21 @@
70
70
  </svg>
71
71
  <span class="option-text">Users</span>
72
72
  </button>
73
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='teams.html'">
74
+ <svg class="option-icon icon-teams" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
75
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
76
+ <circle cx="9" cy="7" r="4"></circle>
77
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
78
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
79
+ </svg>
80
+ <span class="option-text">Teams</span>
81
+ </button>
82
+ <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='roles.html'">
83
+ <svg class="option-icon icon-roles" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
84
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
85
+ </svg>
86
+ <span class="option-text">Roles</span>
87
+ </button>
73
88
  <button type="button" class="dropdown-item admin-menu-item" onclick="window.location.href='skills.html'">
74
89
  <svg class="option-icon icon-skills" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
75
90
  <path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"></path>
@@ -226,6 +241,7 @@
226
241
  <line x1="12" y1="22.08" x2="12" y2="12"></line>
227
242
  </svg>
228
243
  Repos
244
+ <span class="content-tab-badge" id="badge-repos" hidden></span>
229
245
  </button>
230
246
  <button class="content-tab" data-tab="server" role="tab">
231
247
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
@@ -253,6 +269,7 @@
253
269
  <path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
254
270
  </svg>
255
271
  Secrets
272
+ <span class="content-tab-badge" id="badge-secrets" hidden></span>
256
273
  </button>
257
274
  <button class="content-tab" data-tab="build" role="tab">
258
275
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
@@ -269,6 +286,7 @@
269
286
  <polyline points="2 12 12 17 22 12"></polyline>
270
287
  </svg>
271
288
  Deploy
289
+ <span class="content-tab-badge" id="badge-deploy" hidden></span>
272
290
  </button>
273
291
  <button class="content-tab" data-tab="tests" role="tab">
274
292
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
@@ -276,6 +294,7 @@
276
294
  <polyline points="22 4 12 14.01 9 11.01"></polyline>
277
295
  </svg>
278
296
  Tests
297
+ <span class="content-tab-badge" id="badge-tests" hidden></span>
279
298
  </button>
280
299
  <button class="content-tab" data-tab="templates" role="tab">
281
300
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
@@ -283,6 +302,22 @@
283
302
  <rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect>
284
303
  </svg>
285
304
  Templates
305
+ <span class="content-tab-badge" id="badge-templates" hidden></span>
306
+ </button>
307
+ <button class="content-tab" data-tab="automations" role="tab">
308
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
309
+ <path d="M12 8v4l3 3"></path>
310
+ <circle cx="12" cy="12" r="9"></circle>
311
+ </svg>
312
+ Automations
313
+ <span class="content-tab-badge" id="badge-automations" hidden></span>
314
+ </button>
315
+ <button class="content-tab" data-tab="access" role="tab">
316
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 4px; vertical-align: text-bottom;">
317
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
318
+ </svg>
319
+ Access
320
+ <span class="content-tab-badge" id="badge-access" hidden></span>
286
321
  </button>
287
322
  </nav>
288
323
  <button class="content-nav-scroll-btn content-nav-scroll-right" id="content-nav-scroll-right" aria-label="Scroll tabs right">
@@ -856,9 +891,318 @@
856
891
  </div>
857
892
  </div>
858
893
 
894
+ <!-- Automations Tab -->
895
+ <div id="tab-automations" class="tab-panel" role="tabpanel" hidden>
896
+ <div class="content-card">
897
+ <div class="card-header automations-header">
898
+ <h3>Automations</h3>
899
+ <div class="card-header-actions">
900
+ <span id="automations-count" class="text-muted">0 items</span>
901
+ <button class="btn-secondary btn-small" id="add-automation-btn">+ Add Automation</button>
902
+ </div>
903
+ </div>
904
+ <div class="card-body">
905
+ <div id="automations-loading" class="loading" hidden>Loading automations…</div>
906
+ <div id="automations-error" class="text-danger" hidden></div>
907
+
908
+ <div id="automations-list-view">
909
+ <div id="automations-empty" class="automations-empty" hidden>
910
+ <p>No automations configured for this environment.</p>
911
+ <p class="text-muted">Create one to run tasks on a recurring schedule.</p>
912
+ <button class="btn-secondary btn-small" id="automations-empty-create-btn">+ Create Automation</button>
913
+ </div>
914
+
915
+ <div id="automations-table-wrapper" class="users-table-container" hidden>
916
+ <table class="users-table" id="automations-table">
917
+ <thead>
918
+ <tr>
919
+ <th>Name</th>
920
+ <th>Schedule</th>
921
+ <th>Enabled</th>
922
+ <th>Actions</th>
923
+ </tr>
924
+ </thead>
925
+ <tbody id="automations-table-body"></tbody>
926
+ </table>
927
+ </div>
928
+ </div>
929
+
930
+ <div id="automation-history-view" class="automation-history-view" hidden>
931
+ <div class="automation-history-header">
932
+ <button class="btn-ghost btn-small" id="automation-history-back-btn">← Back to list</button>
933
+ <button class="btn-secondary btn-small" id="automation-history-run-btn">▶ Run Now</button>
934
+ </div>
935
+ <h4 id="automation-history-title"></h4>
936
+ <p id="automation-history-subtitle" class="text-muted"></p>
937
+ <div class="users-table-container">
938
+ <table class="users-table">
939
+ <thead>
940
+ <tr>
941
+ <th>Date</th>
942
+ <th>Trigger</th>
943
+ <th>Status</th>
944
+ <th>Task</th>
945
+ </tr>
946
+ </thead>
947
+ <tbody id="automation-history-body"></tbody>
948
+ </table>
949
+ </div>
950
+ <div class="automation-history-footer">
951
+ <a id="automation-history-tasks-link" href="index.html" class="link-muted">View all tasks from this automation →</a>
952
+ </div>
953
+ </div>
954
+ </div>
955
+ </div>
956
+ </div>
957
+
958
+ <!-- Access Tab -->
959
+ <div id="tab-access" class="tab-panel" role="tabpanel" hidden>
960
+ <div class="content-card">
961
+ <div class="card-header" style="display: flex; align-items: center; justify-content: space-between;">
962
+ <h3>Environment Access</h3>
963
+ <button class="btn-secondary btn-small" id="access-add-binding-btn" hidden>+ Add Binding</button>
964
+ </div>
965
+ <div class="card-body">
966
+ <div id="access-loading" class="loading" hidden>Loading bindings…</div>
967
+ <div id="access-empty" hidden style="padding: 1rem 0; color: var(--color-text-secondary); font-size: 0.9rem;">
968
+ No access bindings for this environment.
969
+ </div>
970
+ <div id="access-bindings-container">
971
+ <table class="users-table" id="access-bindings-table">
972
+ <thead>
973
+ <tr>
974
+ <th>Subject</th>
975
+ <th>Type</th>
976
+ <th>Role</th>
977
+ <th>Granted By</th>
978
+ <th>Date</th>
979
+ <th>Actions</th>
980
+ </tr>
981
+ </thead>
982
+ <tbody id="access-bindings-body"></tbody>
983
+ </table>
984
+ </div>
985
+ <!-- Add Binding inline form -->
986
+ <div id="access-add-form" hidden style="margin-top: 1rem; padding: 1rem; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface-elevated);">
987
+ <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.75rem; margin-bottom: 0.75rem;">
988
+ <div>
989
+ <label style="font-size: 0.8rem; display: block; margin-bottom: 0.25rem;">Type</label>
990
+ <select id="access-subject-type" class="form-input" style="font-size: 0.875rem;">
991
+ <option value="team">Team</option>
992
+ <option value="user">User</option>
993
+ </select>
994
+ </div>
995
+ <div>
996
+ <label style="font-size: 0.8rem; display: block; margin-bottom: 0.25rem;">Team / User</label>
997
+ <select id="access-subject-id" class="form-input" style="font-size: 0.875rem;"></select>
998
+ </div>
999
+ <div>
1000
+ <label style="font-size: 0.8rem; display: block; margin-bottom: 0.25rem;">Role</label>
1001
+ <select id="access-role-id" class="form-input" style="font-size: 0.875rem;"></select>
1002
+ </div>
1003
+ </div>
1004
+ <div style="display: flex; gap: 0.5rem;">
1005
+ <button type="button" class="btn-primary btn-small" id="access-save-binding-btn">Add Binding</button>
1006
+ <button type="button" class="btn-ghost btn-small" id="access-cancel-binding-btn">Cancel</button>
1007
+ </div>
1008
+ </div>
1009
+ </div>
1010
+ </div>
1011
+ </div>
1012
+
859
1013
  </div>
860
1014
  </section>
861
1015
 
1016
+ <!-- Automation Modal -->
1017
+ <div id="automation-modal" class="modal" hidden>
1018
+ <div class="modal-overlay"></div>
1019
+ <div class="modal-content modal-medium automation-modal-content">
1020
+ <div class="modal-header">
1021
+ <h2 id="automation-modal-title">Create Automation</h2>
1022
+ <button type="button" class="modal-close" id="automation-modal-close" aria-label="Close">&times;</button>
1023
+ </div>
1024
+ <div class="modal-body">
1025
+ <div id="automation-form-error" class="modal-error" hidden></div>
1026
+
1027
+ <div class="automation-form-section">
1028
+ <h4>General</h4>
1029
+ <div class="form-row">
1030
+ <label for="automation-name">Name</label>
1031
+ <input type="text" id="automation-name" class="form-input" placeholder="Nightly Security Audit" required>
1032
+ </div>
1033
+
1034
+ <div class="form-row">
1035
+ <label for="automation-description">Description</label>
1036
+ <input type="text" id="automation-description" class="form-input" placeholder="Optional description">
1037
+ </div>
1038
+ </div>
1039
+
1040
+ <div class="automation-form-section">
1041
+ <h4>Schedule</h4>
1042
+
1043
+ <div class="form-row">
1044
+ <label for="automation-frequency">Frequency</label>
1045
+ <select id="automation-frequency" class="form-input">
1046
+ <option value="daily">Daily</option>
1047
+ <option value="weekly">Weekly</option>
1048
+ <option value="monthly">Monthly</option>
1049
+ <option value="recurring">Recurring</option>
1050
+ <option value="custom">Custom</option>
1051
+ </select>
1052
+ </div>
1053
+
1054
+ <div id="automation-daily-fields" class="automation-schedule-fields">
1055
+ <div class="form-row">
1056
+ <label for="automation-daily-time">Time</label>
1057
+ <div class="automation-time-row">
1058
+ <input type="time" id="automation-daily-time" class="form-input automation-time-input" step="60">
1059
+ </div>
1060
+ </div>
1061
+ </div>
1062
+
1063
+ <div id="automation-weekly-fields" class="automation-schedule-fields" hidden>
1064
+ <div class="form-row">
1065
+ <label for="automation-weekly-day">Day of Week</label>
1066
+ <select id="automation-weekly-day" class="form-input"></select>
1067
+ </div>
1068
+ <div class="form-row">
1069
+ <label for="automation-weekly-time">Time</label>
1070
+ <div class="automation-time-row">
1071
+ <input type="time" id="automation-weekly-time" class="form-input automation-time-input" step="60">
1072
+ </div>
1073
+ </div>
1074
+ </div>
1075
+
1076
+ <div id="automation-monthly-fields" class="automation-schedule-fields" hidden>
1077
+ <div class="form-row">
1078
+ <label for="automation-monthly-day">Day of Month</label>
1079
+ <select id="automation-monthly-day" class="form-input"></select>
1080
+ <p class="automation-help-text text-muted small">
1081
+ Days 29-31 are excluded so monthly schedules stay valid in every month.
1082
+ </p>
1083
+ </div>
1084
+ <div class="form-row">
1085
+ <label for="automation-monthly-time">Time</label>
1086
+ <div class="automation-time-row">
1087
+ <input type="time" id="automation-monthly-time" class="form-input automation-time-input" step="60">
1088
+ </div>
1089
+ </div>
1090
+ </div>
1091
+
1092
+ <div id="automation-recurring-fields" class="automation-schedule-fields" hidden>
1093
+ <div class="form-row">
1094
+ <label for="automation-recurring-interval">Every</label>
1095
+ <select id="automation-recurring-interval" class="form-input">
1096
+ <option value="*/15 * * * *">15 minutes</option>
1097
+ <option value="*/30 * * * *">30 minutes</option>
1098
+ <option value="0 * * * *">1 hour</option>
1099
+ <option value="0 */2 * * *">2 hours</option>
1100
+ <option value="0 */4 * * *">4 hours</option>
1101
+ <option value="0 */6 * * *">6 hours</option>
1102
+ <option value="0 */8 * * *">8 hours</option>
1103
+ <option value="0 */12 * * *">12 hours</option>
1104
+ </select>
1105
+ </div>
1106
+ <div class="form-row">
1107
+ <label>Between (optional)</label>
1108
+ <div class="automation-time-row">
1109
+ <select id="automation-recurring-start-hour" class="form-input"></select>
1110
+ <span>to</span>
1111
+ <select id="automation-recurring-end-hour" class="form-input"></select>
1112
+ </div>
1113
+ </div>
1114
+ <div class="form-row">
1115
+ <label>Days (optional)</label>
1116
+ <div id="automation-recurring-days" class="automation-days-grid"></div>
1117
+ </div>
1118
+ </div>
1119
+
1120
+ <div id="automation-custom-fields" class="automation-schedule-fields" hidden>
1121
+ <div class="form-row">
1122
+ <label for="automation-custom-cron">Cron Expression</label>
1123
+ <input type="text" id="automation-custom-cron" class="form-input code-font" placeholder="0 2 * * *">
1124
+ </div>
1125
+ </div>
1126
+
1127
+ <p id="automation-schedule-summary" class="automation-schedule-summary text-muted"></p>
1128
+ </div>
1129
+
1130
+ <div class="automation-form-section">
1131
+ <h4>Agent</h4>
1132
+ <div class="form-row">
1133
+ <label for="automation-agent-name">Agent</label>
1134
+ <select id="automation-agent-name" class="form-input"></select>
1135
+ </div>
1136
+ <div class="form-row" id="automation-effort-row">
1137
+ <label for="automation-effort-level">Effort Level</label>
1138
+ <select id="automation-effort-level" class="form-input">
1139
+ <option value="">Server default</option>
1140
+ <option value="low">Low</option>
1141
+ <option value="medium">Medium</option>
1142
+ <option value="high">High</option>
1143
+ </select>
1144
+ </div>
1145
+ <div class="form-row" id="automation-reasoning-row" hidden>
1146
+ <label for="automation-reasoning-level">Reasoning Level</label>
1147
+ <select id="automation-reasoning-level" class="form-input">
1148
+ <option value="">Server default</option>
1149
+ <option value="low">Low</option>
1150
+ <option value="medium">Medium</option>
1151
+ <option value="high">High</option>
1152
+ </select>
1153
+ </div>
1154
+ </div>
1155
+
1156
+ <div class="automation-form-section">
1157
+ <h4>Task Configuration</h4>
1158
+
1159
+ <div class="form-row">
1160
+ <label for="automation-task-name">Task Name Template</label>
1161
+ <input type="text" id="automation-task-name" class="form-input" placeholder="Nightly Audit - {{date}}">
1162
+ </div>
1163
+
1164
+ <div class="form-row">
1165
+ <label>Task Source</label>
1166
+ <div class="radio-group">
1167
+ <label class="radio-option">
1168
+ <input type="radio" name="automation-task-mode" value="instructions" checked>
1169
+ <span>Custom instructions</span>
1170
+ </label>
1171
+ <label class="radio-option">
1172
+ <input type="radio" name="automation-task-mode" value="template">
1173
+ <span>Use task template</span>
1174
+ </label>
1175
+ </div>
1176
+ </div>
1177
+
1178
+ <div id="automation-template-row" hidden>
1179
+ <div class="form-row">
1180
+ <label for="automation-template-name">Task Template</label>
1181
+ <select id="automation-template-name" class="form-input"></select>
1182
+ </div>
1183
+ <div id="automation-template-params" class="automation-template-params"></div>
1184
+ </div>
1185
+
1186
+ <div id="automation-instructions-row" class="form-row">
1187
+ <label id="automation-instructions-label" for="automation-instructions">Instructions</label>
1188
+ <textarea id="automation-instructions" class="form-textarea" rows="5" placeholder="What should the agent do?"></textarea>
1189
+ </div>
1190
+
1191
+ <div class="form-row">
1192
+ <label class="checkbox-label">
1193
+ <input type="checkbox" id="automation-enabled" checked>
1194
+ <span>Enabled</span>
1195
+ </label>
1196
+ </div>
1197
+ </div>
1198
+ </div>
1199
+ <div class="modal-actions">
1200
+ <button type="button" class="btn-secondary" id="automation-cancel-btn">Cancel</button>
1201
+ <button type="button" class="btn-primary" id="automation-save-btn">Save</button>
1202
+ </div>
1203
+ </div>
1204
+ </div>
1205
+
862
1206
  <!-- Commit Modal -->
863
1207
  <div id="commit-modal" class="modal" hidden>
864
1208
  <div class="modal-overlay"></div>