@knoflows/engine 0.1.0-alpha.7 → 0.1.0-alpha.9

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 (61) hide show
  1. package/README.md +1 -1
  2. package/dist/engine.js +22 -144
  3. package/dist/migrations/20260917165450_baseline/migration.sql +127 -0
  4. package/dist/migrations/20260917165450_baseline/snapshot.json +1212 -0
  5. package/package.json +11 -5
  6. package/static/assets/i18n/en.json +102 -5
  7. package/static/assets/i18n/es.json +102 -5
  8. package/static/chunk-1SlEtaMr.js +1 -0
  9. package/static/chunk-5H-9s7GP.js +7 -0
  10. package/static/chunk-B-P3MXAn.js +1 -0
  11. package/static/{chunk-DjcxfmKB.js → chunk-B76UD1mt.js} +1 -1
  12. package/static/chunk-BFYi_kYd.js +1 -0
  13. package/static/chunk-BG0Azip9.js +1 -0
  14. package/static/chunk-BWr0M-hk.js +1 -0
  15. package/static/{chunk-C9TOy_jn.js → chunk-BmSmqIC7.js} +1 -1
  16. package/static/{chunk-D7ecsHWV.js → chunk-Bpxo3nwV.js} +1 -1
  17. package/static/chunk-Bw9D3p4h.js +1 -0
  18. package/static/{chunk-E9Klh0DL.js → chunk-C-T2O6LE.js} +1 -1
  19. package/static/chunk-C1E15gBW.js +5 -0
  20. package/static/chunk-C1V4WljN.js +1 -0
  21. package/static/chunk-C3wpjxgW.js +1 -0
  22. package/static/chunk-C4yhGGeB.js +1 -0
  23. package/static/chunk-C5hSEJdm.js +1 -0
  24. package/static/chunk-CTkRZ4w1.js +1 -0
  25. package/static/chunk-CYX8w88D.js +1 -0
  26. package/static/chunk-Cq4-aSSE.js +1 -0
  27. package/static/chunk-Cwf9CcBI.js +1 -0
  28. package/static/{chunk-BiwCj5Ed.js → chunk-D32ZkSz4.js} +1 -1
  29. package/static/{chunk--huWzdqj.js → chunk-DE9IK0Os.js} +1 -1
  30. package/static/{chunk-CxrhCycA.js → chunk-DNtWpE65.js} +1 -1
  31. package/static/chunk-DdVQ8Ilm.js +66 -0
  32. package/static/chunk-W0OF0P_2.js +1 -0
  33. package/static/{chunk-GrrV0ukn.js → chunk-WzBVBHEz.js} +1 -1
  34. package/static/chunk-XvSvuf-k.js +1 -0
  35. package/static/chunk-aWIxMbtR.js +1 -0
  36. package/static/chunk-f1UVptf5.js +1 -0
  37. package/static/chunk-vj0RDTCf.js +1 -0
  38. package/static/index.html +2 -2
  39. package/static/main-BRWQ5RNE.js +249 -0
  40. package/static/chunk-164-t-LC.js +0 -1
  41. package/static/chunk-B2oijRKi.js +0 -1
  42. package/static/chunk-BMOj-ctp.js +0 -1
  43. package/static/chunk-B_0vwfJH.js +0 -1
  44. package/static/chunk-Ba2Pk3ZV.js +0 -1
  45. package/static/chunk-BgxH8sDB.js +0 -1
  46. package/static/chunk-CIADdbUP.js +0 -1
  47. package/static/chunk-CfZWJKlu.js +0 -1
  48. package/static/chunk-Cg4mENZa.js +0 -1
  49. package/static/chunk-Cv5pNW9n.js +0 -1
  50. package/static/chunk-CzSFfhcS.js +0 -7
  51. package/static/chunk-D5kutWaL.js +0 -66
  52. package/static/chunk-DZV_xppV.js +0 -1
  53. package/static/chunk-DaPHlPte.js +0 -1
  54. package/static/chunk-DeFJOu7x.js +0 -1
  55. package/static/chunk-DkKxPJBS.js +0 -1
  56. package/static/chunk-DnSW_i5C.js +0 -5
  57. package/static/chunk-Dnos4vY0.js +0 -1
  58. package/static/chunk-M0pfvgRb.js +0 -1
  59. package/static/chunk-PG4bRDhM.js +0 -1
  60. package/static/chunk-dMfVmcfD.js +0 -1
  61. package/static/main-6LDEPJ3H.js +0 -249
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knoflows/engine",
3
- "version": "0.1.0-alpha.7",
3
+ "version": "0.1.0-alpha.9",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "bin": {
@@ -8,6 +8,7 @@
8
8
  },
9
9
  "files": [
10
10
  "dist/engine.js",
11
+ "dist/migrations",
11
12
  "static",
12
13
  "README.md",
13
14
  "LICENSE"
@@ -22,18 +23,23 @@
22
23
  "typecheck": "tsc --noEmit -p tsconfig.json",
23
24
  "build:release": "tsc -p tsconfig.json && node ../../scripts/bundle-engine.mjs",
24
25
  "prepublishOnly": "node ../../scripts/smoke-engine.mjs",
25
- "db:push": "drizzle-kit push",
26
+ "db:generate": "drizzle-kit generate",
26
27
  "set-secret": "tsx scripts/set-secret.ts",
27
28
  "test:repos": "tsx src/persistence/test/repo-test.ts",
29
+ "test:migrations": "tsx src/persistence/test/migrate.test.ts",
28
30
  "test:providers": "tsx src/providers/test/provider-test.ts",
29
31
  "test:secrets": "tsx src/secrets/secret-store.test.ts",
30
- "test:jira": "tsx src/providers/ticket/adf.test.ts && tsx src/providers/ticket/jira-ticket-provider.test.ts",
32
+ "test:jira": "tsx src/providers/ticket/adf.test.ts && tsx src/providers/ticket/jira-ticket-provider.test.ts && tsx src/providers/query-templates/jira-query-templates.test.ts",
33
+ "test:confluence": "tsx src/providers/documentation/confluence-documentation-provider.test.ts",
34
+ "test:github": "tsx src/providers/ticket/github-issues-provider.test.ts",
31
35
  "test:bitbucket": "tsx src/providers/repo/bitbucket-repo-provider.test.ts",
36
+ "test:registry": "tsx src/providers/provider-registry.service.test.ts",
32
37
  "test:claude-agent": "tsx src/providers/agent/claude-agent-provider.test.ts",
33
38
  "test:cursor-agent": "tsx src/providers/agent/cursor-agent-provider.test.ts",
39
+ "test:preview-models": "tsx src/providers/agent/preview-models.test.ts",
34
40
  "test:provider-status": "tsx src/providers/provider-status.test.ts",
35
- "test:runner": "tsx src/runner/test/resolve-view-subjects.test.ts && tsx src/runner/test/workflow-runner.agent-interaction.test.ts && tsx src/runner/test/workflow-runner.git-shell-provider.test.ts && tsx src/runner/test/workflow-runner.loop-subworkflow.test.ts && tsx src/runner/test/workflow-runner.batch-aggregate.test.ts && tsx src/runner/test/workflow-runner.agent-output-validation.test.ts",
36
- "test:api": "tsx src/api/test/api-test.ts && tsx src/api/test/boot-empty-secrets.test.ts && tsx src/api/test/providers-status.test.ts && tsx src/api/test/settings.test.ts && tsx src/api/test/query-templates.test.ts && tsx src/api/test/view-binding-shortcuts.test.ts",
41
+ "test:runner": "tsx src/runner/test/resolve-view-subjects.test.ts && tsx src/runner/test/workflow-runner.agent-interaction.test.ts && tsx src/runner/test/workflow-runner.git-shell-provider.test.ts && tsx src/runner/test/workflow-runner.loop-subworkflow.test.ts && tsx src/runner/test/workflow-runner.batch-aggregate.test.ts && tsx src/runner/test/workflow-runner.agent-output-validation.test.ts && tsx src/runner/test/workflow-runner.extended-action.test.ts && tsx src/runner/test/workflow-runner.registry-dispatch.test.ts",
42
+ "test:api": "tsx src/api/test/api-test.ts && tsx src/api/test/boot-empty-secrets.test.ts && tsx src/api/test/providers-status.test.ts && tsx src/api/test/settings.test.ts && tsx src/api/test/preview-models.test.ts && tsx src/api/test/query-templates.test.ts && tsx src/api/test/extended-actions.test.ts && tsx src/api/test/view-binding-shortcuts.test.ts",
37
43
  "test:workflows-ids": "tsx src/api/workflows/assign-missing-ids.test.ts",
38
44
  "test:listen-port": "tsx src/listen-port.test.ts",
39
45
  "test:spa-fallback": "tsx src/static/spa-fallback.test.ts"
@@ -6,8 +6,32 @@
6
6
  "nav.views": "Views",
7
7
  "nav.shortcuts": "Shortcuts",
8
8
  "nav.settings": "Settings",
9
- "shell.jobsWaiting": "Jobs waiting on you",
9
+ "shell.jobs": "Jobs",
10
10
  "shell.manage": "Manage",
11
+ "manage.tab.workflows": "Workflows",
12
+ "manage.tab.views": "Views & Shortcuts",
13
+ "manage.tab.providers": "Providers",
14
+ "manage.tab.preferences": "Preferences",
15
+ "manage.preferences.title": "Preferences",
16
+ "manage.preferences.body": "Engine preferences such as scheduler concurrency, worktree cleanup, and the default agent will live here.",
17
+ "manage.views.title": "Views & Shortcuts",
18
+ "manage.views.createView": "Create a View",
19
+ "manage.views.createShortcut": "Create a Shortcut",
20
+ "manage.views.emptyState": "No views or shortcuts yet. Create one to get started.",
21
+ "manage.views.column.name": "Name",
22
+ "manage.views.column.type": "Type",
23
+ "manage.views.column.workflow": "Bound workflow",
24
+ "manage.views.column.subjectType": "Subject type",
25
+ "manage.views.column.actions": "Actions",
26
+ "manage.views.type.view": "View",
27
+ "manage.views.type.shortcut": "Shortcut",
28
+ "manage.views.noSubjectType": "—",
29
+ "manage.views.edit": "Edit",
30
+ "manage.views.delete": "Delete",
31
+ "manage.views.deleteConfirmView": "Are you sure you want to delete this view?",
32
+ "manage.views.deleteConfirmShortcut": "Are you sure you want to delete this shortcut?",
33
+ "manage.views.deleteFailed": "Failed to delete",
34
+ "manage.views.loadFailed": "Failed to load views and shortcuts",
11
35
  "shell.group.tickets": "Tickets",
12
36
  "shell.group.pullRequests": "Pull Requests",
13
37
  "shell.group.documentation": "Documentation",
@@ -23,7 +47,7 @@
23
47
  "common.cancel": "Cancel",
24
48
  "common.loading": "Loading…",
25
49
  "common.errorGeneric": "Something went wrong",
26
- "jobs.title": "Kno — Start a Job",
50
+ "jobs.title": "Knoflows — Start a Job",
27
51
  "jobs.lede": "Pick a workflow that runs one item at a time and start a Job. Watching and resume live on the Job detail page.",
28
52
  "jobs.start.heading": "Start a Job",
29
53
  "jobs.start.workflow": "Workflow",
@@ -89,6 +113,10 @@
89
113
  "jobs.list.empty": "No jobs match these filters.",
90
114
  "jobs.list.loadFailed": "Failed to load jobs",
91
115
  "jobs.list.filterAll": "All",
116
+ "jobs.list.running": "Currently Running",
117
+ "jobs.list.history": "History",
118
+ "jobs.list.runningEmpty": "No jobs are running.",
119
+ "jobs.list.historyEmpty": "No jobs match these filters.",
92
120
  "workflow-editor.titleNew": "New workflow",
93
121
  "workflow-editor.titleEdit": "Edit workflow · {{id}}",
94
122
  "workflow-editor.backToJobs": "Back to jobs",
@@ -131,10 +159,11 @@
131
159
  "step-list.moveDown": "Down",
132
160
  "step-list.remove": "Remove",
133
161
  "step-list.addStep": "Add step",
162
+ "step-list.unnamed": "Untitled",
134
163
  "step-list.name": "Name",
135
164
  "step-list.id": "Id",
136
165
  "step-list.idHint": "Generated from the step name — edit it directly if you want a different reference.",
137
- "step-list.objective": "Objective",
166
+ "step-list.objective": "Prompt",
138
167
  "step-list.knowledgeScope": "Knowledge scope",
139
168
  "step-list.knowledgeScopeHint": "Leave all unchecked to omit (all tiers).",
140
169
  "step-list.outputFormat.label": "Output format",
@@ -181,6 +210,20 @@
181
210
  "step-list.providerAction.post_comment": "Post comment",
182
211
  "step-list.providerAction.update_status": "Update status",
183
212
  "step-list.providerAction.get_content": "Get content",
213
+ "step-list.extendedAction.mode": "Action source",
214
+ "step-list.extendedAction.portable": "Portable action",
215
+ "step-list.extendedAction.extended": "Use an extended action",
216
+ "step-list.extendedAction.provider": "Provider",
217
+ "step-list.extendedAction.action": "Extended action",
218
+ "step-list.extendedAction.none": "Select an action",
219
+ "step-list.extendedAction.empty": "This provider has no extended actions",
220
+ "step-list.extendedAction.mismatch": "Requires {{required}} — {{active}} is currently configured",
221
+ "step-list.target.toggle": "Target a different subject",
222
+ "step-list.target.subjectType": "Subject type",
223
+ "step-list.target.source": "Provider instance",
224
+ "step-list.target.sourcePlaceholder": "Select an instance",
225
+ "step-list.target.subjectId": "Subject id",
226
+ "step-list.target.subjectIdHint": "Usually an interpolated reference to an earlier step, e.g. resolve-key",
184
227
  "step-list.knowledgeTier.user": "User",
185
228
  "step-list.knowledgeTier.organization": "Organization",
186
229
  "step-list.knowledgeTier.project": "Project",
@@ -190,7 +233,50 @@
190
233
  "step-list.onMaxIterations.continue": "Continue",
191
234
  "step-list.onMaxIterations.ask_human": "Ask human",
192
235
  "settings.title": "Settings",
193
- "settings.lede": "Choose which providers Kno uses, and store API keys. Keys and ticket/repo switches take effect immediately; switching the coding agent requires a restart.",
236
+ "settings.lede": "Configure provider instances and store API keys. Adding or changing an instance requires a restart; the default agent can be changed immediately.",
237
+ "settings.addProvider": "Add provider",
238
+ "settings.editProvider": "Edit provider",
239
+ "settings.addInstance": "Add provider instance",
240
+ "settings.addInstance.submit": "Add instance",
241
+ "settings.removeInstance": "Remove",
242
+ "settings.edit": "Edit",
243
+ "settings.delete": "Delete",
244
+ "settings.deleteConfirm": "Are you sure you want to delete this provider instance?",
245
+ "settings.kind.label": "Kind",
246
+ "settings.kind.subject": "Subject provider",
247
+ "settings.kind.agent": "Agent",
248
+ "settings.type.label": "Type",
249
+ "settings.typeOption.jira": "Jira",
250
+ "settings.typeOption.bitbucket": "Bitbucket",
251
+ "settings.typeOption.github": "GitHub Issues",
252
+ "settings.typeOption.confluence": "Confluence",
253
+ "settings.typeOption.manualTicket": "Manual (Ticket)",
254
+ "settings.typeOption.manualDocumentation": "Manual (Documentation)",
255
+ "settings.typeOption.claude": "Claude",
256
+ "settings.typeOption.cursor": "Cursor",
257
+ "settings.subjectType.label": "Subject type",
258
+ "settings.instanceId": "Instance id",
259
+ "settings.instanceIdHint": "Generated from the display name — edit it directly if you want a different id.",
260
+ "settings.displayName": "Display name",
261
+ "settings.displayNameRequired": "Display name is required",
262
+ "settings.defaultAgent.label": "Default agent",
263
+ "settings.defaultAgent.toggle": "Set as default agent",
264
+ "settings.column.displayName": "Display name",
265
+ "settings.column.type": "Type",
266
+ "settings.column.expiresOn": "Expires on",
267
+ "settings.column.default": "Default",
268
+ "settings.column.actions": "Actions",
269
+ "settings.expiresOn.label": "Expires on",
270
+ "settings.expiresOn.hint": "A manual reminder only — Knoflows does not check this date with the provider.",
271
+ "settings.ticket.github": "GitHub Issues",
272
+ "settings.github.username": "GitHub username",
273
+ "step-list.agentInstance.label": "Agent",
274
+ "step-list.agentInstance.default": "Use default agent",
275
+ "views.editor.instance": "Provider instance",
276
+ "views.editor.instancePlaceholder": "Select a provider instance",
277
+ "views.editor.instanceNeeded": "This view has no provider instance. Pick one to finish setup.",
278
+ "views.editor.noEligibleInstances": "No configured providers support this workflow's subject type — add one in Manage → Providers first",
279
+ "views.editor.pickInstance": "Pick a provider instance",
194
280
  "settings.section.ticket": "Ticket tracking",
195
281
  "settings.section.repo": "Repository hosting",
196
282
  "settings.section.agent": "Coding agent",
@@ -205,6 +291,8 @@
205
291
  "settings.agent.cursor": "Cursor",
206
292
  "settings.jira.baseUrl": "Jira base URL",
207
293
  "settings.jira.email": "Jira email",
294
+ "settings.confluence.baseUrl": "Confluence base URL",
295
+ "settings.confluence.email": "Confluence email",
208
296
  "settings.bitbucket.baseUrl": "Bitbucket base URL",
209
297
  "settings.bitbucket.email": "Bitbucket email",
210
298
  "settings.bitbucket.workspace": "Bitbucket workspace",
@@ -212,10 +300,19 @@
212
300
  "settings.apiKey.configured": "Configured ✓",
213
301
  "settings.apiKey.notConfigured": "Not configured",
214
302
  "settings.apiKey.placeholder": "Enter a new key to replace the stored value",
303
+ "settings.apiKey.placeholderCreate": "API key",
304
+ "settings.apiKey.placeholderEdit": "Leave blank to keep the current key",
305
+ "settings.apiKey.required": "API key is required",
215
306
  "settings.apiKey.set": "Set key",
216
307
  "settings.apiKey.setSuccess": "API key saved",
217
308
  "settings.apiKey.setFailed": "Failed to save API key",
218
- "settings.restartRequired.message": "Some changes require restarting Kno to take effect",
309
+ "settings.apiKey.setFailedAfterSave": "Provider saved, but the API key could not be stored. Enter the key again to finish setup.",
310
+ "settings.model.label": "Default model",
311
+ "settings.model.placeholder": "Provider default",
312
+ "settings.model.fetch": "Fetch available models",
313
+ "settings.model.fetchFailed": "Could not fetch models",
314
+ "settings.model.hint": "Leave unset to use the provider's own default. Fetch after entering an API key.",
315
+ "settings.restartRequired.message": "Some changes require restarting Knoflows to take effect",
219
316
  "settings.saveSuccess": "Settings saved",
220
317
  "settings.saveFailed": "Failed to save settings",
221
318
  "settings.validation": "Validation",
@@ -6,8 +6,32 @@
6
6
  "nav.views": "Vistas",
7
7
  "nav.shortcuts": "Atajos",
8
8
  "nav.settings": "Ajustes",
9
- "shell.jobsWaiting": "Trabajos esperándote",
9
+ "shell.jobs": "Trabajos",
10
10
  "shell.manage": "Administrar",
11
+ "manage.tab.workflows": "Flujos",
12
+ "manage.tab.views": "Vistas y atajos",
13
+ "manage.tab.providers": "Proveedores",
14
+ "manage.tab.preferences": "Preferencias",
15
+ "manage.preferences.title": "Preferencias",
16
+ "manage.preferences.body": "Las preferencias del motor, como el límite de concurrencia del programador, la política de limpieza de worktrees y el agente predeterminado, vivirán aquí.",
17
+ "manage.views.title": "Vistas y atajos",
18
+ "manage.views.createView": "Crear una vista",
19
+ "manage.views.createShortcut": "Crear un atajo",
20
+ "manage.views.emptyState": "Aún no hay vistas ni atajos. Crea uno para empezar.",
21
+ "manage.views.column.name": "Nombre",
22
+ "manage.views.column.type": "Tipo",
23
+ "manage.views.column.workflow": "Flujo asociado",
24
+ "manage.views.column.subjectType": "Tipo de sujeto",
25
+ "manage.views.column.actions": "Acciones",
26
+ "manage.views.type.view": "Vista",
27
+ "manage.views.type.shortcut": "Atajo",
28
+ "manage.views.noSubjectType": "—",
29
+ "manage.views.edit": "Editar",
30
+ "manage.views.delete": "Eliminar",
31
+ "manage.views.deleteConfirmView": "¿Seguro que quieres eliminar esta vista?",
32
+ "manage.views.deleteConfirmShortcut": "¿Seguro que quieres eliminar este atajo?",
33
+ "manage.views.deleteFailed": "No se pudo eliminar",
34
+ "manage.views.loadFailed": "No se pudieron cargar las vistas y los atajos",
11
35
  "shell.group.tickets": "Tickets",
12
36
  "shell.group.pullRequests": "Pull requests",
13
37
  "shell.group.documentation": "Documentación",
@@ -23,7 +47,7 @@
23
47
  "common.cancel": "Cancelar",
24
48
  "common.loading": "Cargando…",
25
49
  "common.errorGeneric": "Algo salió mal",
26
- "jobs.title": "Kno — Iniciar un trabajo",
50
+ "jobs.title": "Knoflows — Iniciar un trabajo",
27
51
  "jobs.lede": "Elige un flujo que trabaja de uno en uno e inicia un trabajo. La observación y la reanudación viven en la página de detalle del trabajo.",
28
52
  "jobs.start.heading": "Iniciar un trabajo",
29
53
  "jobs.start.workflow": "Flujo de trabajo",
@@ -89,6 +113,10 @@
89
113
  "jobs.list.empty": "Ningún trabajo coincide con estos filtros.",
90
114
  "jobs.list.loadFailed": "No se pudieron cargar los trabajos",
91
115
  "jobs.list.filterAll": "Todos",
116
+ "jobs.list.running": "En ejecución",
117
+ "jobs.list.history": "Historial",
118
+ "jobs.list.runningEmpty": "No hay trabajos en ejecución.",
119
+ "jobs.list.historyEmpty": "Ningún trabajo coincide con estos filtros.",
92
120
  "workflow-editor.loading": "Cargando…",
93
121
  "workflow-editor.titleNew": "Nuevo flujo",
94
122
  "workflow-editor.titleEdit": "Editar flujo · {{id}}",
@@ -131,10 +159,11 @@
131
159
  "step-list.moveDown": "Bajar",
132
160
  "step-list.remove": "Eliminar",
133
161
  "step-list.addStep": "Añadir paso",
162
+ "step-list.unnamed": "Sin nombre",
134
163
  "step-list.name": "Nombre",
135
164
  "step-list.id": "Id",
136
165
  "step-list.idHint": "Se genera a partir del nombre del paso — edítalo directamente si quieres otra referencia.",
137
- "step-list.objective": "Objetivo",
166
+ "step-list.objective": "Prompt",
138
167
  "step-list.knowledgeScope": "Alcance de conocimiento",
139
168
  "step-list.knowledgeScopeHint": "Déjalos sin marcar para omitir (todos los niveles).",
140
169
  "step-list.outputFormat.label": "Formato de salida",
@@ -181,6 +210,20 @@
181
210
  "step-list.providerAction.post_comment": "post_comment",
182
211
  "step-list.providerAction.update_status": "update_status",
183
212
  "step-list.providerAction.get_content": "get_content",
213
+ "step-list.extendedAction.mode": "Origen de la acción",
214
+ "step-list.extendedAction.portable": "Acción portable",
215
+ "step-list.extendedAction.extended": "Usar una acción extendida",
216
+ "step-list.extendedAction.provider": "Proveedor",
217
+ "step-list.extendedAction.action": "Acción extendida",
218
+ "step-list.extendedAction.none": "Elige una acción",
219
+ "step-list.extendedAction.empty": "Este proveedor no tiene acciones extendidas",
220
+ "step-list.extendedAction.mismatch": "Requiere {{required}} — {{active}} está configurado ahora",
221
+ "step-list.target.toggle": "Apuntar a otro sujeto",
222
+ "step-list.target.subjectType": "Tipo de sujeto",
223
+ "step-list.target.source": "Instancia de proveedor",
224
+ "step-list.target.sourcePlaceholder": "Elige una instancia",
225
+ "step-list.target.subjectId": "Id del sujeto",
226
+ "step-list.target.subjectIdHint": "Suele ser una referencia interpolada a un paso anterior, p. ej. resolve-key",
184
227
  "step-list.knowledgeTier.user": "user",
185
228
  "step-list.knowledgeTier.organization": "organization",
186
229
  "step-list.knowledgeTier.project": "project",
@@ -190,7 +233,50 @@
190
233
  "step-list.onMaxIterations.continue": "continue",
191
234
  "step-list.onMaxIterations.ask_human": "ask_human",
192
235
  "settings.title": "Ajustes",
193
- "settings.lede": "Elige qué proveedores usa Kno y guarda las claves de API. Las claves y los cambios de ticket/repositorio aplican de inmediato; cambiar el agente de código requiere reiniciar.",
236
+ "settings.lede": "Configura instancias de proveedores y guarda claves de API. Añadir o cambiar una instancia requiere reiniciar; el agente predeterminado se puede cambiar de inmediato.",
237
+ "settings.addProvider": "Añadir proveedor",
238
+ "settings.editProvider": "Editar proveedor",
239
+ "settings.addInstance": "Añadir instancia de proveedor",
240
+ "settings.addInstance.submit": "Añadir instancia",
241
+ "settings.removeInstance": "Quitar",
242
+ "settings.edit": "Editar",
243
+ "settings.delete": "Eliminar",
244
+ "settings.deleteConfirm": "¿Seguro que quieres eliminar esta instancia de proveedor?",
245
+ "settings.kind.label": "Tipo de instancia",
246
+ "settings.kind.subject": "Proveedor de sujetos",
247
+ "settings.kind.agent": "Agente",
248
+ "settings.type.label": "Tipo",
249
+ "settings.typeOption.jira": "Jira",
250
+ "settings.typeOption.bitbucket": "Bitbucket",
251
+ "settings.typeOption.github": "GitHub Issues",
252
+ "settings.typeOption.confluence": "Confluence",
253
+ "settings.typeOption.manualTicket": "Manual (ticket)",
254
+ "settings.typeOption.manualDocumentation": "Manual (documentación)",
255
+ "settings.typeOption.claude": "Claude",
256
+ "settings.typeOption.cursor": "Cursor",
257
+ "settings.subjectType.label": "Tipo de sujeto",
258
+ "settings.instanceId": "Id de instancia",
259
+ "settings.instanceIdHint": "Se genera a partir del nombre visible — edítalo directamente si quieres otro id.",
260
+ "settings.displayName": "Nombre visible",
261
+ "settings.displayNameRequired": "El nombre visible es obligatorio",
262
+ "settings.defaultAgent.label": "Agente predeterminado",
263
+ "settings.defaultAgent.toggle": "Establecer como agente predeterminado",
264
+ "settings.column.displayName": "Nombre visible",
265
+ "settings.column.type": "Tipo",
266
+ "settings.column.expiresOn": "Caduca el",
267
+ "settings.column.default": "Predeterminado",
268
+ "settings.column.actions": "Acciones",
269
+ "settings.expiresOn.label": "Caduca el",
270
+ "settings.expiresOn.hint": "Solo un recordatorio manual — Knoflows no comprueba esta fecha con el proveedor.",
271
+ "settings.ticket.github": "GitHub Issues",
272
+ "settings.github.username": "Usuario de GitHub",
273
+ "step-list.agentInstance.label": "Agente",
274
+ "step-list.agentInstance.default": "Usar el agente predeterminado",
275
+ "views.editor.instance": "Instancia de proveedor",
276
+ "views.editor.instancePlaceholder": "Selecciona una instancia de proveedor",
277
+ "views.editor.instanceNeeded": "Esta vista no tiene instancia de proveedor. Elige una para terminar la configuración.",
278
+ "views.editor.noEligibleInstances": "Ningún proveedor configurado admite el tipo de sujeto de este flujo — añade uno en Administrar → Proveedores primero",
279
+ "views.editor.pickInstance": "Elige una instancia de proveedor",
194
280
  "settings.section.ticket": "Seguimiento de tickets",
195
281
  "settings.section.repo": "Alojamiento de repositorios",
196
282
  "settings.section.agent": "Agente de código",
@@ -205,6 +291,8 @@
205
291
  "settings.agent.cursor": "Cursor",
206
292
  "settings.jira.baseUrl": "URL base de Jira",
207
293
  "settings.jira.email": "Correo de Jira",
294
+ "settings.confluence.baseUrl": "URL base de Confluence",
295
+ "settings.confluence.email": "Correo de Confluence",
208
296
  "settings.bitbucket.baseUrl": "URL base de Bitbucket",
209
297
  "settings.bitbucket.email": "Correo de Bitbucket",
210
298
  "settings.bitbucket.workspace": "Espacio de trabajo de Bitbucket",
@@ -212,10 +300,19 @@
212
300
  "settings.apiKey.configured": "Configurada ✓",
213
301
  "settings.apiKey.notConfigured": "No configurada",
214
302
  "settings.apiKey.placeholder": "Introduce una clave nueva para reemplazar la guardada",
303
+ "settings.apiKey.placeholderCreate": "Clave de API",
304
+ "settings.apiKey.placeholderEdit": "Déjalo en blanco para conservar la clave actual",
305
+ "settings.apiKey.required": "La clave de API es obligatoria",
215
306
  "settings.apiKey.set": "Guardar clave",
216
307
  "settings.apiKey.setSuccess": "Clave de API guardada",
217
308
  "settings.apiKey.setFailed": "No se pudo guardar la clave de API",
218
- "settings.restartRequired.message": "Algunos cambios requieren reiniciar Kno para aplicarse",
309
+ "settings.apiKey.setFailedAfterSave": "El proveedor se guardó, pero no se pudo almacenar la clave de API. Introdúcela de nuevo para terminar la configuración.",
310
+ "settings.model.label": "Modelo predeterminado",
311
+ "settings.model.placeholder": "Predeterminado del proveedor",
312
+ "settings.model.fetch": "Obtener modelos disponibles",
313
+ "settings.model.fetchFailed": "No se pudieron obtener los modelos",
314
+ "settings.model.hint": "Déjalo vacío para usar el predeterminado del proveedor. Obtén la lista después de introducir una clave de API.",
315
+ "settings.restartRequired.message": "Algunos cambios requieren reiniciar Knoflows para aplicarse",
219
316
  "settings.saveSuccess": "Ajustes guardados",
220
317
  "settings.saveFailed": "No se pudieron guardar los ajustes",
221
318
  "settings.validation": "Validación",
@@ -0,0 +1 @@
1
+ import {_ as _n,C as Cn}from'./chunk-DNtWpE65.js';import {U}from'./chunk-BWr0M-hk.js';import {W,I}from'./chunk-BmSmqIC7.js';import {A as Ad,H as Hl,$ as $d,a as Al,V as Vd,b as Ai,X as Xl}from'./chunk-CYX8w88D.js';import'./chunk-C3wpjxgW.js';import'./chunk-WzBVBHEz.js';import {C,V as Ve,b as at,q as qo,u as ue,o,Q as QE,M as Mi,n as n8,J as J6,k as k3,L as Ln,c as sd,z as zc,d as t7,$ as $b,e as V5,D as D5,K as Kt$1,f as _i,v as vw,R as Rw,g as Kc,m as bD,p as gI,P as Ph,O as Ow,w as nl,B as _D,E as VD,F as LD,h as gh,N as ND,S as SD,j as oE,x as ch,y as sE,A as xD,l as lh,a5 as ah,a2 as Pw,a3 as xw,G as Pu,I as Lu}from'./main-BRWQ5RNE.js';var st=e=>({count:e}),dt=e=>["/workflows",e,"edit"],pt=(e,p)=>p.id;function ct(e,p){e&1&&(_i(0,"p",3),vw(1),Rw(2,"transloco"),Kc()),e&2&&(gI(),Ph(Ow(2,1,"common.loading")));}function mt(e,p){if(e&1&&(_i(0,"p",4),vw(1),Kc()),e&2){let t=VD();gI(),Ph(t.loadError());}}function ft(e,p){if(e&1&&(lh(0,"nz-option",7),Rw(1,"transloco")),e&2){let t=p.$implicit,o=VD(2);ch("nzValue",t)("nzLabel",Ow(1,2,o.subjectHandlingFilterKey(t)));}}function wt(e,p){if(e&1&&(_i(0,"p",8),vw(1),Kc()),e&2){let t=VD(2);gI(),Ph(t.deleteError());}}function ut(e,p){e&1&&(_i(0,"section",9)(1,"p"),vw(2),Rw(3,"transloco"),Kc(),_i(4,"a",11),vw(5),Rw(6,"transloco"),Kc()()),e&2&&(gI(2),Ph(Ow(3,2,"workflows.list.emptyState")),gI(3),nl(" ",Ow(6,4,"workflows.list.emptyCreateButton")," "));}function _t(e,p){if(e&1&&(_i(0,"span"),vw(1),Kc()),e&2){let t=VD().$implicit;ah("data-testid","description-"+t.id),gI(),Ph(t.description);}}function xt(e,p){if(e&1&&(_i(0,"span",13),vw(1),Rw(2,"transloco"),Kc()),e&2){let t=VD().$implicit;ah("data-testid","description-"+t.id),gI(),Ph(Ow(2,2,"workflows.list.noDescription"));}}function gt(e,p){if(e&1&&(_i(0,"nz-tag"),vw(1),Rw(2,"transloco"),Kc()),e&2){let t=p.$implicit,o=VD().$implicit,m=VD(3);ah("data-testid","applies-to-"+o.id),gI(),Ph(Ow(2,2,m.subjectTypeKey(t)));}}function Ct(e,p){if(e&1){let t=LD();_i(0,"tr")(1,"td")(2,"span"),vw(3),Kc()(),_i(4,"td",12),bD(5,_t,2,2,"span")(6,xt,3,4,"span",13),Kc(),_i(7,"td"),ND(8,gt,3,4,"nz-tag",null,SD),Kc(),_i(10,"td")(11,"nz-tag"),vw(12),Rw(13,"transloco"),Kc()(),_i(14,"td")(15,"span"),vw(16),Rw(17,"transloco"),Kc()(),_i(18,"td",14)(19,"a",15),vw(20),Rw(21,"transloco"),Kc(),_i(22,"button",16),Rw(23,"transloco"),Rw(24,"transloco"),Rw(25,"transloco"),gh("nzOnConfirm",function(){let m=Pu(t).$implicit,h=VD(3);return Lu(h.deleteWorkflow(m.id))}),vw(26),Rw(27,"transloco"),Kc()()();}if(e&2){let t=p.$implicit,o=VD(3);ah("data-testid","workflow-"+t.id),gI(2),ah("data-testid","name-"+t.id),gI(),Ph(t.name),gI(2),_D(t.description?.trim()?5:6),gI(3),xD(o.appliesToValues(t)),gI(3),ah("data-testid","subject-handling-"+t.id),gI(),Ph(Ow(13,16,o.subjectHandlingKey(t.subjectHandling))),gI(3),ah("data-testid","step-count-"+t.id),gI(),Ph(Pw(17,18,"workflows.list.stepCount",xw(31,st,t.steps.length))),gI(3),ch("routerLink",xw(33,dt,t.id)),ah("data-testid","edit-"+t.id),gI(),nl(" ",Ow(21,21,"workflows.list.edit")," "),gI(2),ch("nzPopconfirmTitle",Ow(23,23,"workflows.list.deleteConfirm"))("nzOkText",Ow(24,25,"workflows.list.delete"))("nzCancelText",Ow(25,27,"common.cancel")),ah("data-testid","delete-"+t.id),gI(4),nl(" ",Ow(27,29,"workflows.list.delete")," ");}}function kt(e,p){if(e&1&&(_i(0,"nz-table",10)(1,"thead")(2,"tr")(3,"th"),vw(4),Rw(5,"transloco"),Kc(),_i(6,"th"),vw(7),Rw(8,"transloco"),Kc(),_i(9,"th"),vw(10),Rw(11,"transloco"),Kc(),_i(12,"th"),vw(13),Rw(14,"transloco"),Kc(),_i(15,"th"),vw(16),Rw(17,"transloco"),Kc(),_i(18,"th"),vw(19),Rw(20,"transloco"),Kc()()(),_i(21,"tbody"),ND(22,Ct,28,35,"tr",null,pt),Kc()()),e&2){let t=VD(2);ch("nzData",t.workflows())("nzFrontPagination",false)("nzShowPagination",false),gI(4),Ph(Ow(5,9,"workflows.list.column.name")),gI(3),Ph(Ow(8,11,"workflows.list.column.description")),gI(3),Ph(Ow(11,13,"workflow-editor.appliesTo")),gI(3),Ph(Ow(14,15,"workflow-editor.subjectHandling.label")),gI(3),Ph(Ow(17,17,"workflows.list.column.steps")),gI(3),Ph(Ow(20,19,"workflows.list.column.actions")),gI(3),xD(t.workflows());}}function bt(e,p){if(e&1){let t=LD();_i(0,"div",5)(1,"span"),vw(2),Rw(3,"transloco"),Kc(),_i(4,"nz-select",6),gh("ngModelChange",function(m){Pu(t);let h=VD();return Lu(h.setSubjectHandlingFilter(m))}),ND(5,ft,2,4,"nz-option",7,SD),Kc(),oE(),Kc(),bD(7,wt,2,1,"p",8),bD(8,ut,7,6,"section",9)(9,kt,24,21,"nz-table",10);}if(e&2){let t=VD();gI(2),Ph(Ow(3,4,"workflows.list.filterBySubjectHandling")),gI(2),ch("ngModel",t.subjectHandlingFilter()),sE(),gI(),xD(t.subjectHandlingOptions),gI(2),_D(t.deleteError()?7:-1),gI(),_D(t.workflows().length===0?8:9);}}var Kt=(()=>{class e{constructor(){this.workflowsApi=C(U),this.transloco=C(Ve),this.destroyRef=C(at),this.workflows=qo([]),this.loading=qo(true),this.loadError=qo(null),this.deleteError=qo(null),this.subjectHandlingFilter=qo("all"),this.subjectHandlingOptions=["all","per-subject","collection"],this.load();}setSubjectHandlingFilter(t){this.subjectHandlingFilter.set(t),this.load();}appliesToValues(t){let o=t.appliesTo;return o==="none"?["none"]:Array.isArray(o)?o:[o]}subjectTypeKey(t){return `workflow-editor.subjectType.${t}`}subjectHandlingKey(t){return `workflow-editor.subjectHandling.${t}`}subjectHandlingFilterKey(t){return t==="all"?"workflows.list.filterAll":`workflow-editor.subjectHandling.${t}`}deleteWorkflow(t){this.deleteError.set(null),this.workflowsApi.delete(t).pipe(ue(this.destroyRef)).subscribe({next:()=>{this.workflows.update(o=>o.filter(m=>m.id!==t));},error:o=>{this.deleteError.set(this.errorMessage(o,this.transloco.translate("workflows.list.deleteFailed")));}});}load(){let t=this.subjectHandlingFilter();this.loading.set(true),this.loadError.set(null),this.workflowsApi.list(t==="all"?void 0:{subjectHandling:t}).pipe(ue(this.destroyRef)).subscribe({next:o=>{this.workflows.set(o),this.loading.set(false);},error:o=>{this.loading.set(false),this.loadError.set(this.errorMessage(o,this.transloco.translate("workflows.list.loadFailed")));}});}errorMessage(t,o$1){return t instanceof o||t instanceof Error?t.message:o$1}static{this.\u0275fac=function(o){return new(o||e)};}static{this.\u0275cmp=QE({type:e,selectors:[["app-workflow-list"]],decls:11,vars:7,consts:[["data-testid","workflows-list",1,"list-page"],[1,"header"],["nz-button","","nzType","primary","routerLink","/workflows/new","data-testid","create-workflow"],["data-testid","loading"],["data-testid","load-error",1,"error"],[1,"field"],["data-testid","subject-handling-filter",3,"ngModelChange","ngModel"],[3,"nzValue","nzLabel"],["data-testid","delete-error",1,"error"],["data-testid","empty-state",1,"empty"],["data-testid","workflow-items",3,"nzData","nzFrontPagination","nzShowPagination"],["nz-button","","nzType","primary","routerLink","/workflows/new","data-testid","empty-create"],[1,"description-cell"],[1,"muted"],[1,"actions"],["nz-button","","nzType","link",3,"routerLink"],["nz-button","","nzType","link","nzDanger","","type","button","nz-popconfirm","",3,"nzOnConfirm","nzPopconfirmTitle","nzOkText","nzCancelText"]],template:function(o,m){o&1&&(_i(0,"main",0)(1,"header",1)(2,"h1"),vw(3),Rw(4,"transloco"),Kc(),_i(5,"a",2),vw(6),Rw(7,"transloco"),Kc()(),bD(8,ct,3,3,"p",3)(9,mt,2,1,"p",4)(10,bt,10,6),Kc()),o&2&&(gI(3),Ph(Ow(4,3,"workflows.list.title")),gI(3),nl(" ",Ow(7,5,"workflows.list.createButton")," "),gI(2),_D(m.loading()?8:m.loadError()?9:10));},dependencies:[Mi,n8,J6,k3,Ln,sd,zc,t7,_n,Cn,$b,V5,D5,Ad,Hl,$d,Al,Vd,Ai,Xl,W,I,Kt$1],styles:[".list-page[_ngcontent-%COMP%]{max-width:72rem;margin:0 auto;padding:1.25rem 1.5rem 3rem;display:flex;flex-direction:column;gap:1rem}.header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:1rem;align-items:flex-start}.field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.35rem;max-width:16rem}.field[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{font-size:.85rem;color:#57534e}.muted[_ngcontent-%COMP%]{color:#a8a29e;font-style:italic}.empty[_ngcontent-%COMP%]{text-align:center;padding:2.5rem 1rem;border:1px dashed #d6d3d1;background:#fff9}.empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 1rem;color:#57534e}.error[_ngcontent-%COMP%]{color:#9f1239}.actions[_ngcontent-%COMP%]{white-space:nowrap}[_nghost-%COMP%] td.description-cell{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;text-overflow:unset;max-width:28rem;vertical-align:top}[_nghost-%COMP%] .ant-table-tbody>tr>td{white-space:normal;vertical-align:top}"]});}}return e})();export{Kt as WorkflowListComponent,Kt as WorkflowsManageComponent};
@@ -0,0 +1,7 @@
1
+ import {G as Gn,u as un}from'./chunk-B76UD1mt.js';import {f}from'./chunk-BFYi_kYd.js';import {e as et,U as U$1,G,i as it,v as vt}from'./chunk-C-T2O6LE.js';import {W,I}from'./chunk-BmSmqIC7.js';import'./chunk-CYX8w88D.js';import'./chunk-C3wpjxgW.js';import'./chunk-WzBVBHEz.js';import {C,a as ae,U,V as Ve$1,b as at,q as qo,H as Hw,u as ue,X as rd,Y as Bw,o,Q as QE,M as Mi,L as Ln,c as sd,z as zc,d as t7,Z as y7,K as Kt,f as _i,m as bD,g as Kc,p as gI,B as _D,a0 as $0,a1 as B0,v as vw,R as Rw,P as Ph,O as Ow,E as VD,F as LD,h as gh,w as nl,a2 as Pw,a3 as xw,x as ch,N as ND,A as xD,l as lh,G as Pu,I as Lu,a4 as Mh,a5 as ah,a6 as Nw,a7 as MD}from'./main-BRWQ5RNE.js';var le=t=>({index:t}),de=()=>[],fe=(t,s)=>s.definition.id,Ce=(t,s)=>s.index;function ge(t,s){if(t&1){let e=LD();_i(0,"div",1)(1,"button",2),gh("click",function(){Pu(e);let r=VD();return Lu(r.closeIteration())}),vw(2),Rw(3,"transloco"),Kc(),_i(4,"p",3),vw(5),Rw(6,"transloco"),Kc(),_i(7,"app-job-step-workspace",4),gh("selectExecution",function(r){Pu(e);let m=VD();return Lu(m.onNestedSelect(r))}),Kc()();}if(t&2){let e=s,n=VD();gI(2),nl(" ",Ow(3,9,"jobs.detail.loopBack")," "),gI(3),nl(" ",Pw(6,11,"jobs.detail.loopIteration",xw(14,le,e.index+1))," "),gI(2),ch("definitions",n.nestedLoopDefinition().steps)("executions",e.stepExecutions)("job",n.job())("selectedExecutionId",n.nestedSelectedId())("currentExecutionId",null)("waitingEvent",null)("canResume",false);}}function be(t,s){if(t&1&&(_i(0,"nz-tag"),vw(1),Rw(2,"transloco"),Kc()),t&2){let e=VD().$implicit,n=VD(2);ah("data-testid","step-status-"+e.definition.id),gI(),Ph(Ow(2,2,n.stepStatusKey(s.status)));}}function he(t,s){if(t&1){let e=LD();_i(0,"li")(1,"button",9),gh("click",function(){let r=Pu(e).$implicit,m=VD(2);return Lu(m.onStepClick(r))}),_i(2,"span",10),vw(3),Kc(),_i(4,"span",11)(5,"span",12),vw(6),Rw(7,"transloco"),Kc(),bD(8,be,3,4,"nz-tag"),Kc()()();}if(t&2){let e,n=s.$implicit,r=VD(2);gI(),Mh("selected",r.isSelected(n))("current",r.isCurrent(n))("unreached",!n.reached),ch("disabled",!n.reached),ah("data-testid","step-"+n.definition.id),gI(2),Ph(n.definition.name),gI(3),Ph(Ow(7,11,r.stepTypeKey(n.definition.type))),gI(2),_D((e=n.execution)?8:-1,e);}}function ve(t,s){t&1&&(_i(0,"p",8),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),nl(" ",Ow(2,1,"jobs.detail.noStepSelected")," "));}function Ee(t,s){t&1&&(_i(0,"p",16),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),Ph(Ow(2,1,"jobs.detail.inProgress.loop")));}function Se(t,s){if(t&1){let e=LD();_i(0,"li")(1,"button",19),gh("click",function(){let r=Pu(e).$implicit,m=VD(4);return Lu(m.openIteration(m.selectedDefinition(),r))}),vw(2),Rw(3,"transloco"),Kc()();}if(t&2){let e=s.$implicit;gI(),ah("data-testid","loop-iteration-"+e.index),gI(),nl(" ",Pw(3,2,"jobs.detail.loopIteration",xw(5,le,e.index+1))," ");}}function we(t,s){t&1&&(_i(0,"li",12),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),Ph(Ow(2,1,"jobs.detail.noIterations")));}function Te(t,s){if(t&1&&(_i(0,"p",18),vw(1),Kc()),t&2){let e=VD(4);gI(),Ph(e.selectedExecution().error);}}function Ie(t,s){if(t&1&&(_i(0,"div",13)(1,"h3"),vw(2),Kc(),bD(3,Ee,3,3,"p",16),_i(4,"ul",17),ND(5,Se,4,7,"li",null,Ce,false,we,3,3,"li",12),Kc(),bD(8,Te,2,1,"p",18),Kc()),t&2){let e=VD(3);gI(2),Ph(e.selectedDefinition()?.name),gI(),_D(e.isRunning(e.selectedExecution())?3:-1),gI(2),xD(e.selectedExecution().iterations??Nw(4,de)),gI(3),_D(e.selectedExecution().error?8:-1);}}function ke(t,s){t&1&&(_i(0,"p",16),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),nl(" ",Ow(2,1,"jobs.detail.inProgress.sub_workflow")," "));}function Me(t,s){if(t&1&&(_i(0,"p",18),vw(1),Kc()),t&2){let e=VD(4);gI(),Ph(e.selectedExecution().error);}}function ye(t,s){if(t&1&&(_i(0,"div",14)(1,"h3"),vw(2),Kc(),bD(3,ke,3,3,"p",16),lh(4,"app-job-status-table",20),bD(5,Me,2,1,"p",18),Kc()),t&2){let e=VD(3);gI(2),Ph(e.selectedDefinition()?.name),gI(),_D(e.isRunning(e.selectedExecution())?3:-1),gI(),ch("jobIds",e.selectedExecution().childJobIds??Nw(4,de)),gI(),_D(e.selectedExecution().error?5:-1);}}function je(t,s){if(t&1&&(_i(0,"li"),vw(1),Kc()),t&2){let e=s.$implicit;gI(),Ph(e);}}function De(t,s){t&1&&(_i(0,"li",12),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),Ph(Ow(2,1,"jobs.resume.noQuestions")));}function Je(t,s){if(t&1&&(_i(0,"p",25),vw(1),Kc()),t&2){let e=VD(5);gI(),Ph(e.resumeParseError());}}function Pe(t,s){if(t&1){let e=LD();_i(0,"section",21)(1,"h4"),vw(2),Rw(3,"transloco"),Kc(),_i(4,"ul",23),ND(5,je,2,1,"li",null,MD,false,De,3,3,"li",12),Kc(),_i(8,"label"),vw(9),Rw(10,"transloco"),_i(11,"textarea",24),gh("input",function(r){Pu(e);let m=VD(4);return Lu(m.onResumeTextInput(r))}),Kc()(),bD(12,Je,2,1,"p",25),_i(13,"button",26),gh("click",function(){Pu(e);let r=VD(4);return Lu(r.resumeSubmit.emit())}),vw(14),Rw(15,"transloco"),Kc()();}if(t&2){let e=VD(4);gI(2),Ph(Ow(3,7,"jobs.resume.heading")),gI(3),xD(e.waitingPrompts()),gI(4),nl(" ",Ow(10,9,"jobs.resume.jsonLabel")," "),gI(2),ch("value",e.resumeText()),gI(),_D(e.resumeParseError()?12:-1),gI(),ch("disabled",e.resuming()),gI(),nl(" ",Ow(15,11,e.resuming()?"jobs.resume.submitting":"jobs.resume.button")," ");}}function Ne(t,s){if(t&1&&(_i(0,"pre",22),vw(1),Kc()),t&2){let e=VD(4);gI(),Ph(e.formatOutput(e.selectedExecution()));}}function Oe(t,s){if(t&1&&(_i(0,"div",15)(1,"h3"),vw(2),Kc(),bD(3,Pe,16,13,"section",21)(4,Ne,2,1,"pre",22),Kc()),t&2){let e=VD(3);gI(2),Ph(e.selectedDefinition()?.name),gI(),_D(e.showResume()?3:4);}}function We(t,s){if(t&1&&(_i(0,"p",16),vw(1),Rw(2,"transloco"),Kc()),t&2){let e=VD(4);gI(),nl(" ",Ow(2,1,"jobs.detail.inProgress."+e.selectedExecution().type)," ");}}function ze(t,s){if(t&1&&(_i(0,"p",27),vw(1),Kc()),t&2){let e=VD(4);gI(),Ph(e.selectedExecution().error);}}function Re(t,s){if(t&1&&(_i(0,"pre",22),vw(1),Kc()),t&2){let e=VD(4);gI(),Ph(e.formatOutput(e.selectedExecution()));}}function Be(t,s){if(t&1&&(_i(0,"div")(1,"h3"),vw(2),Kc(),bD(3,We,3,3,"p",16)(4,ze,2,1,"p",27)(5,Re,2,1,"pre",22),Kc()),t&2){let e=VD(3);ah("data-testid",e.selectedExecution().type+"-view"),gI(2),Ph(e.selectedDefinition()?.name),gI(),_D(e.isRunning(e.selectedExecution())?3:e.selectedExecution().error?4:5);}}function Ve(t,s){if(t&1&&bD(0,Ie,9,5,"div",13)(1,ye,6,5,"div",14)(2,Oe,5,2,"div",15)(3,Be,6,3,"div"),t&2){let e,n=VD(2);_D((e=n.selectedExecution().type)==="loop"?0:e==="sub_workflow"?1:e==="interaction"?2:3);}}function Fe(t,s){if(t&1&&(_i(0,"aside",5)(1,"h3"),vw(2),Rw(3,"transloco"),Kc(),_i(4,"ul",6),ND(5,he,9,13,"li",null,fe),Kc()(),_i(7,"section",7),bD(8,ve,3,3,"p",8)(9,Ve,4,1),Kc()),t&2){let e=VD();gI(2),Ph(Ow(3,2,"jobs.detail.stepsHeading")),gI(3),xD(e.rows()),gI(3),_D(e.selectedExecution()?9:8);}}var ce=(()=>{class t{constructor(){this.definitions=$0.required(),this.executions=$0.required(),this.job=$0.required(),this.selectedExecutionId=$0(null),this.currentExecutionId=$0(null),this.waitingEvent=$0(null),this.resumeText=$0(`{
2
+
3
+ }`),this.resumeParseError=$0(null),this.resuming=$0(false),this.canResume=$0(false),this.selectExecution=B0(),this.resumeTextChange=B0(),this.resumeSubmit=B0(),this.nestedIteration=qo(null),this.nestedLoopDefinition=qo(null),this.nestedSelectedId=qo(null),this.rows=Hw(()=>it(this.definitions(),this.executions())),this.selectedExecution=Hw(()=>{let e=this.selectedExecutionId();return e?this.executions().find(n=>n.id===e)??null:null}),this.selectedDefinition=Hw(()=>{let e=this.selectedExecution();return e?this.definitions().find(n=>n.id===e.stepDefinitionId)??null:null}),this.waitingPrompts=Hw(()=>{let e=this.waitingEvent();return e?e.questions.length>0?e.questions:e.data!=null?[JSON.stringify(e.data,null,2)]:[]:[]}),this.showResume=Hw(()=>{if(!this.canResume())return false;let e=this.selectedExecution(),n=this.currentExecutionId();return e!=null&&e.id===n&&e.type==="interaction"&&this.job().status==="waiting_for_human"});}stepStatusKey(e){return `jobs.stepStatus.${e}`}stepTypeKey(e){return `step-list.stepType.${e}`}onStepClick(e){!e.reached||!e.execution||(this.nestedIteration.set(null),this.nestedLoopDefinition.set(null),this.selectExecution.emit(e.execution.id));}openIteration(e,n){this.nestedLoopDefinition.set(e),this.nestedIteration.set(n);let r=n.stepExecutions[0];this.nestedSelectedId.set(r?.id??null);}closeIteration(){this.nestedIteration.set(null),this.nestedLoopDefinition.set(null),this.nestedSelectedId.set(null);}onNestedSelect(e){this.nestedSelectedId.set(e);}onResumeTextInput(e){this.resumeTextChange.emit(e.target.value);}formatOutput(e){return e.error?e.error:e.output===void 0?"":typeof e.output=="string"?e.output:JSON.stringify(e.output,null,2)}isRunning(e){return e?.status==="running"}isSelected(e){return e.execution!=null&&e.execution.id===this.selectedExecutionId()}isCurrent(e){return e.execution!=null&&e.execution.id===this.currentExecutionId()}static{this.\u0275fac=function(n){return new(n||t)};}static{this.\u0275cmp=QE({type:t,selectors:[["app-job-step-workspace"]],inputs:{definitions:[1,"definitions"],executions:[1,"executions"],job:[1,"job"],selectedExecutionId:[1,"selectedExecutionId"],currentExecutionId:[1,"currentExecutionId"],waitingEvent:[1,"waitingEvent"],resumeText:[1,"resumeText"],resumeParseError:[1,"resumeParseError"],resuming:[1,"resuming"],canResume:[1,"canResume"]},outputs:{selectExecution:"selectExecution",resumeTextChange:"resumeTextChange",resumeSubmit:"resumeSubmit"},decls:3,vars:1,consts:[["data-testid","job-step-workspace",1,"workspace"],["data-testid","loop-drill-in",1,"nested"],["nz-button","","nzType","link","type","button","data-testid","loop-back",3,"click"],[1,"nested-label"],[3,"selectExecution","definitions","executions","job","selectedExecutionId","currentExecutionId","waitingEvent","canResume"],["data-testid","step-side-panel",1,"side-panel"],[1,"step-list"],["data-testid","step-main-area",1,"main-area"],["data-testid","no-step-selected",1,"muted"],["type","button",1,"step-button",3,"click","disabled"],[1,"step-name"],[1,"step-meta"],[1,"muted"],["data-testid","loop-view"],["data-testid","sub-workflow-view"],["data-testid","interaction-view"],["data-testid","step-in-progress"],["data-testid","loop-iterations",1,"iteration-list"],[1,"error"],["nz-button","","nzType","link","type","button",3,"click"],[3,"jobIds"],["data-testid","resume-form",1,"resume"],["data-testid","step-output"],["data-testid","waiting-questions"],["data-testid","resume-json","rows","8",3,"input","value"],["data-testid","resume-parse-error",1,"error"],["nz-button","","nzType","primary","type","button","data-testid","resume-button",3,"click","disabled"],["data-testid","step-error",1,"error"]],template:function(n,r){if(n&1&&(_i(0,"div",0),bD(1,ge,8,16,"div",1)(2,Fe,10,4),Kc()),n&2){let m;gI(),_D((m=r.nestedIteration())?1:2,m);}},dependencies:[t,Mi,sd,zc,t7,y7,W,I,vt,Kt],styles:[".workspace[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(14rem,18rem) 1fr;gap:1rem;align-items:start;min-height:20rem}.nested[_ngcontent-%COMP%]{grid-column:1 / -1}.nested-label[_ngcontent-%COMP%]{margin:0 0 .75rem;color:#57534e}.side-panel[_ngcontent-%COMP%]{border:1px solid #d6d3d1;background:#ffffffbf;padding:.75rem}.side-panel[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 .5rem;font-size:1rem}.step-list[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.step-button[_ngcontent-%COMP%]{width:100%;text-align:left;font:inherit;padding:.45rem .55rem;border:1px solid transparent;background:transparent;cursor:pointer;display:flex;flex-direction:column;gap:.2rem}.step-button[_ngcontent-%COMP%]:hover:not(:disabled){background:#f5f5f4}.step-button.selected[_ngcontent-%COMP%]{border-color:#a8a29e;background:#fafaf9}.step-button.current[_ngcontent-%COMP%]{box-shadow:inset 3px 0 #0c0a09}.step-button[_ngcontent-%COMP%]:disabled, .step-button.unreached[_ngcontent-%COMP%]{opacity:.55;cursor:not-allowed}.step-name[_ngcontent-%COMP%]{font-weight:600}.step-meta[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center;font-size:.8rem}.main-area[_ngcontent-%COMP%]{border:1px solid #d6d3d1;background:#ffffffd9;padding:1rem;min-height:16rem}.main-area[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin-top:0}.muted[_ngcontent-%COMP%]{color:#78716c}.error[_ngcontent-%COMP%]{color:#9f1239}pre[_ngcontent-%COMP%]{overflow:auto;padding:.75rem;background:#f5f5f4;border:1px solid #d6d3d1;font-size:.85rem}.iteration-list[_ngcontent-%COMP%]{padding-left:1.1rem}.resume[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.35rem;margin:.75rem 0}.resume[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{font:inherit;font-family:ui-monospace,Consolas,monospace;padding:.4rem .5rem;border:1px solid #a8a29e}@media(max-width:48rem){.workspace[_ngcontent-%COMP%]{grid-template-columns:1fr}}"]});}}return t})();function Le(t,s){t&1&&(_i(0,"p",1),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),Ph(Ow(2,1,"common.loading")));}function $e(t,s){if(t&1&&(_i(0,"p",2),vw(1),Kc()),t&2){let e=VD();gI(),Ph(e.loadError());}}function Ae(t,s){if(t&1){let e=LD();_i(0,"button",15),gh("click",function(){Pu(e);let r=VD(2);return Lu(r.jumpToCurrent())}),vw(1),Rw(2,"transloco"),Kc();}t&2&&(gI(),nl(" ",Ow(2,1,"jobs.detail.jumpToCurrent")," "));}function qe(t,s){if(t&1&&(_i(0,"p",11),vw(1),Kc()),t&2){let e=VD(2);gI(),Ph(e.actionError());}}function Ke(t,s){t&1&&(lh(0,"nz-alert",12),Rw(1,"transloco")),t&2&&ch("nzMessage",Ow(1,1,"jobs.detail.queued"));}function Qe(t,s){if(t&1){let e=LD();_i(0,"app-job-step-workspace",16),gh("selectExecution",function(r){Pu(e);let m=VD(2);return Lu(m.onSelectExecution(r))})("resumeTextChange",function(r){Pu(e);let m=VD(2);return Lu(m.setResumeText(r))})("resumeSubmit",function(){Pu(e);let r=VD(2);return Lu(r.submitResume())}),Kc();}if(t&2){let e=VD(),n=VD();ch("definitions",s.steps)("executions",e.stepHistory)("job",e)("selectedExecutionId",n.viewedExecutionId())("currentExecutionId",n.currentStep()?.id??null)("waitingEvent",n.waitingEvent())("resumeText",n.resumeText())("resumeParseError",n.resumeParseError())("resuming",n.resuming())("canResume",true);}}function He(t,s){t&1&&(_i(0,"p",14),vw(1),Rw(2,"transloco"),Kc()),t&2&&(gI(),nl(" ",Ow(2,1,"jobs.detail.workflowMissing")," "));}function Ue(t,s){if(t&1&&(_i(0,"header",3)(1,"div")(2,"a",4),vw(3),Rw(4,"transloco"),Kc(),_i(5,"h1",5),vw(6),Kc(),_i(7,"p",6)(8,"span",7),vw(9),Kc(),vw(10," \xB7 "),_i(11,"nz-tag",8),vw(12),Rw(13,"transloco"),Kc(),vw(14," \xB7 "),_i(15,"span",9),vw(16),Kc()()(),bD(17,Ae,3,3,"button",10),Kc(),bD(18,qe,2,1,"p",11),bD(19,Ke,2,3,"nz-alert",12)(20,Qe,1,10,"app-job-step-workspace",13)(21,He,3,3,"p",14)),t&2){let e,n=s,r=VD();gI(3),Ph(Ow(4,8,"jobs.detail.backToStart")),gI(3),Ph(n.id),gI(3),Ph(n.workflowId),gI(3),Ph(Ow(13,10,r.statusKey(n.status))),gI(4),Ph(r.subjectText()),gI(),_D(r.showJumpToCurrent()?17:-1),gI(),_D(r.actionError()?18:-1),gI(),_D(r.showQueued()?19:(e=r.workflow())?20:21,e);}}var ht=(()=>{class t{constructor(){this.route=C(ae),this.jobsApi=C(U),this.eventsService=C(f),this.transloco=C(Ve$1),this.destroyRef=C(at),this.job=qo(null),this.workflow=qo(null),this.loading=qo(true),this.loadError=qo(null),this.actionError=qo(null),this.eventStream=qo(null),this.eventsSnapshot=qo([]),this.autoFollow=qo(true),this.viewedExecutionId=qo(null),this.resumeText=qo(`{
4
+
5
+ }`),this.resumeParseError=qo(null),this.resuming=qo(false),this.currentStep=Hw(()=>{let e=this.job();return e?et(e):null}),this.showQueued=Hw(()=>{let e=this.job();return e!=null&&et(e)==null}),this.showJumpToCurrent=Hw(()=>{let e=this.currentStep();return e?this.viewedExecutionId()!==e.id:false}),this.eventLog=Hw(()=>this.eventStream()?.events()??this.eventsSnapshot()),this.waitingEvent=Hw(()=>{let e=this.eventLog();for(let n=e.length-1;n>=0;n-=1){let r=e[n];if(r?.type==="waiting_for_human")return r}return null}),this.destroyRef.onDestroy(()=>this.closeStream()),this.route.paramMap.pipe(ue(this.destroyRef)).subscribe(e=>{let n=e.get("id");if(!n){this.loading.set(false),this.loadError.set(this.transloco.translate("jobs.detail.loadFailed"));return}this.load(n);}),rd(()=>{let e=this.eventStream();if(!e)return;let n=e.latest();n&&Bw(()=>{(n.type==="step_started"||n.type==="step_completed"||n.type==="step_failed"||n.type==="waiting_for_human"||n.type==="waiting_for_children"||n.type==="human_answered"||n.type==="job_completed"||n.type==="job_failed")&&this.refreshJob(n.jobId),(n.type==="job_completed"||n.type==="job_failed")&&this.closeStream();});}),rd(()=>{let e=this.currentStep();this.autoFollow()&&Bw(()=>{this.viewedExecutionId.set(e?.id??null);});});}statusKey(e){return `jobs.status.${e}`}subjectText(){return U$1(this.job()?.subjectContext)??"\u2014"}onSelectExecution(e){this.autoFollow.set(false),this.viewedExecutionId.set(e);}jumpToCurrent(){this.autoFollow.set(true),this.viewedExecutionId.set(this.currentStep()?.id??null);}setResumeText(e){this.resumeText.set(e),this.resumeParseError.set(null);}submitResume(){let e=this.job();if(!e)return;let n;try{n=JSON.parse(this.resumeText());}catch(r){this.resumeParseError.set(r instanceof Error?r.message:this.transloco.translate("jobs.resume.invalidJson"));return}this.resumeParseError.set(null),this.actionError.set(null),this.resuming.set(true),this.jobsApi.resume(e.id,n).subscribe({next:r=>{this.resuming.set(false),this.applyJob(r),G(r.status)&&this.closeStream();},error:r=>{this.resuming.set(false),this.actionError.set(this.errorMessage(r,this.transloco.translate("jobs.errors.resumeFailed")));}});}load(e){this.loading.set(true),this.loadError.set(null),this.actionError.set(null),this.autoFollow.set(true),this.viewedExecutionId.set(null),this.resumeText.set(`{
6
+
7
+ }`),this.resumeParseError.set(null),this.closeStream(),this.eventsSnapshot.set([]),this.jobsApi.get(e).pipe(ue(this.destroyRef)).subscribe({next:n=>{this.applyJob(n),this.loading.set(false),G(n.status)||this.eventStream.set(this.eventsService.connect({jobId:n.id}));},error:n=>{this.loading.set(false),this.loadError.set(this.errorMessage(n,this.transloco.translate("jobs.detail.loadFailed")));}});}applyJob(e){this.job.set(e),this.workflow.set(e.workflowSnapshot??null),this.autoFollow()&&this.viewedExecutionId.set(et(e)?.id??null);}refreshJob(e){this.jobsApi.get(e).subscribe({next:n=>this.applyJob(n),error:n=>{this.actionError.set(this.errorMessage(n,this.transloco.translate("jobs.errors.refreshFailed")));}});}closeStream(){let e=this.eventStream();e&&(this.eventsSnapshot.set(e.events()),e.close(),this.eventStream.set(null));}errorMessage(e,n){return e instanceof o||e instanceof Error?e.message:n}static{this.\u0275fac=function(n){return new(n||t)};}static{this.\u0275cmp=QE({type:t,selectors:[["app-job-detail"]],decls:4,vars:1,consts:[["data-testid","job-detail",1,"detail-page"],["data-testid","loading"],["data-testid","load-error",1,"error"],[1,"header"],["routerLink","/jobs"],["data-testid","job-id"],[1,"meta"],["data-testid","job-workflow"],["data-testid","job-status"],["data-testid","job-subject"],["nz-button","","type","button","data-testid","jump-to-current"],["data-testid","action-error",1,"error"],["data-testid","queued-message","nzType","info",3,"nzMessage"],[3,"definitions","executions","job","selectedExecutionId","currentExecutionId","waitingEvent","resumeText","resumeParseError","resuming","canResume"],["data-testid","missing-workflow",1,"muted"],["nz-button","","type","button","data-testid","jump-to-current",3,"click"],[3,"selectExecution","resumeTextChange","resumeSubmit","definitions","executions","job","selectedExecutionId","currentExecutionId","waitingEvent","resumeText","resumeParseError","resuming","canResume"]],template:function(n,r){if(n&1&&(_i(0,"main",0),bD(1,Le,3,3,"p",1)(2,$e,2,1,"p",2)(3,Ue,22,12),Kc()),n&2){let m;gI(),_D(r.loading()?1:r.loadError()?2:(m=r.job())?3:-1,m);}},dependencies:[Mi,Ln,Gn,un,sd,zc,t7,y7,W,I,ce,Kt],styles:[".detail-page[_ngcontent-%COMP%]{max-width:72rem;margin:0 auto;padding:1.25rem 1.5rem 3rem;display:flex;flex-direction:column;gap:1rem}.header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:1rem;align-items:flex-start}.header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:.25rem 0 0;font-size:1.35rem;word-break:break-all}.meta[_ngcontent-%COMP%]{margin:.35rem 0 0;color:#57534e;display:flex;flex-wrap:wrap;gap:.35rem;align-items:center}.error[_ngcontent-%COMP%]{color:#9f1239}.muted[_ngcontent-%COMP%]{color:#78716c}"]});}}return t})();export{ht as JobDetailComponent};