@newheap/platform-ai-chat 0.16.0 → 0.17.0

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.
@@ -2997,7 +2997,9 @@ const conflicts = ['coalesce', 'queue', 'supersede', 'ignore'];
2997
2997
  * Adds or changes a trigger defined as data: an event of the application or a schedule starts a skill
2998
2998
  * of the agent, or lets the agent choose. A schedule runs for every subject in a set or, for an agent
2999
2999
  * that works on the whole application, for the whole application: once each time, or once per
3000
- * division for an agent that works per division. A new trigger starts in shadow.
3000
+ * division for an agent that works per division. A new trigger starts in shadow. An event trigger may
3001
+ * select named filters the event offers, such as one that skips the agent's own changes; every selected
3002
+ * filter must let an event through.
3001
3003
  */
3002
3004
  class NhAssistantTriggerFormComponent extends RunConfigForm {
3003
3005
  constructor() {
@@ -3023,7 +3025,7 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3023
3025
  this.examples = cronExamples;
3024
3026
  this.timeZones = timeZoneOptions().filter(zone => zone.value !== 'UTC');
3025
3027
  this.fields = [
3026
- 'triggerId', 'source', 'event', 'debounceSeconds', 'cron', 'timeZone', 'subjectSet', 'message', 'skill', 'conflict', 'reason'
3028
+ 'triggerId', 'source', 'event', 'debounceSeconds', 'filters', 'cron', 'timeZone', 'subjectSet', 'message', 'skill', 'conflict', 'reason'
3027
3029
  ];
3028
3030
  this.triggerId = signal('', ...(ngDevMode ? [{ debugName: "triggerId" }] : []));
3029
3031
  this.source = signal('event', ...(ngDevMode ? [{ debugName: "source" }] : []));
@@ -3037,10 +3039,27 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3037
3039
  this.skill = signal('', ...(ngDevMode ? [{ debugName: "skill" }] : []));
3038
3040
  this.conflict = signal('coalesce', ...(ngDevMode ? [{ debugName: "conflict" }] : []));
3039
3041
  this.debounce = signal('120', ...(ngDevMode ? [{ debugName: "debounce" }] : []));
3042
+ /** The names of the event's filters the trigger applies. */
3043
+ this.filters = signal([], ...(ngDevMode ? [{ debugName: "filters" }] : []));
3040
3044
  this.reason = signal('', ...(ngDevMode ? [{ debugName: "reason" }] : []));
3041
3045
  this.editing = computed(() => this.trigger() !== null, ...(ngDevMode ? [{ debugName: "editing" }] : []));
3042
3046
  this.events = computed(() => eventOptions(this.catalog(), this.worksOn()), ...(ngDevMode ? [{ debugName: "events" }] : []));
3043
3047
  this.subjectSets = computed(() => subjectSetOptions(this.catalog()), ...(ngDevMode ? [{ debugName: "subjectSets" }] : []));
3048
+ /** The filters the chosen event offers, in the order the application registered them. */
3049
+ this.eventFilters = computed(() => {
3050
+ const event = this.event();
3051
+ return this.catalog()?.triggerEvents.find(block => block.name === event)?.filters ?? [];
3052
+ }, ...(ngDevMode ? [{ debugName: "eventFilters" }] : []));
3053
+ /**
3054
+ * Selected filters the chosen event no longer offers, such as after a deploy removed one: the trigger
3055
+ * starts nothing until they are cleared.
3056
+ */
3057
+ this.missingFilters = computed(() => {
3058
+ const offered = this.eventFilters();
3059
+ return this.catalog() === null
3060
+ ? []
3061
+ : this.filters().filter(name => !offered.some(filter => filter.name === name));
3062
+ }, ...(ngDevMode ? [{ debugName: "missingFilters" }] : []));
3044
3063
  /** A schedule may run for the whole application only for an agent that works on it. */
3045
3064
  this.offersApplication = computed(() => worksOnCovers(this.worksOn(), systemSubjectType), ...(ngDevMode ? [{ debugName: "offersApplication" }] : []));
3046
3065
  /** What the schedule runs for: the whole application while the agent works on it, otherwise a set. */
@@ -3076,6 +3095,20 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3076
3095
  this.skill.set(trigger?.skillId ?? '');
3077
3096
  this.conflict.set(trigger?.conflict ?? 'coalesce');
3078
3097
  this.debounce.set(String(trigger?.debounceSeconds ?? 120));
3098
+ this.filters.set(trigger?.filters ?? []);
3099
+ }
3100
+ /** Another event offers other filters: those it does not offer no longer apply. */
3101
+ setEvent(event) {
3102
+ this.event.set(event);
3103
+ this.touch('event');
3104
+ const offered = this.eventFilters();
3105
+ this.filters.update(filters => filters.filter(name => offered.some(filter => filter.name === name)));
3106
+ }
3107
+ toggleFilter(name, selected) {
3108
+ this.filters.update(filters => selected
3109
+ ? [...filters.filter(filter => filter !== name), name]
3110
+ : filters.filter(filter => filter !== name));
3111
+ this.touch('filters');
3079
3112
  }
3080
3113
  /** A schedule skips a tick while a run is busy by default; an event coalesces. */
3081
3114
  setSource(source) {
@@ -3121,6 +3154,9 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3121
3154
  if (this.event() === '') {
3122
3155
  errors['event'] = { code: 'required' };
3123
3156
  }
3157
+ if (this.missingFilters().length > 0) {
3158
+ errors['filters'] = { code: 'not-found' };
3159
+ }
3124
3160
  checkWhole(errors, 'debounceSeconds', this.debounce(), ...runConfigLimits.debounce, true);
3125
3161
  }
3126
3162
  const request = {
@@ -3134,6 +3170,8 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3134
3170
  message: schedule ? blank$1(this.message()) : null,
3135
3171
  conflict: this.conflict(),
3136
3172
  debounceSeconds: schedule ? null : toNumber(this.debounce()),
3173
+ // In the order the event offers them; a schedule takes none.
3174
+ filters: schedule ? [] : this.orderedFilters(),
3137
3175
  expectedVersion: editing?.version ?? null,
3138
3176
  reason: blank$1(this.reason())
3139
3177
  };
@@ -3142,15 +3180,23 @@ class NhAssistantTriggerFormComponent extends RunConfigForm {
3142
3180
  added: editing === null
3143
3181
  }));
3144
3182
  }
3183
+ /** The selected filters in the order the event offers them, those it no longer offers last. */
3184
+ orderedFilters() {
3185
+ const selected = this.filters();
3186
+ return [
3187
+ ...this.eventFilters().map(filter => filter.name).filter(name => selected.includes(name)),
3188
+ ...selected.filter(name => !this.eventFilters().some(filter => filter.name === name))
3189
+ ];
3190
+ }
3145
3191
  mapServerErrors(errors) {
3146
3192
  return withScheduleTargetError(errors, this.source() === 'schedule' ? this.target() : 'set');
3147
3193
  }
3148
3194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: NhAssistantTriggerFormComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3149
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: NhAssistantTriggerFormComponent, isStandalone: true, selector: "nh-assistant-trigger-form", inputs: { agentId: { classPropertyName: "agentId", publicName: "agentId", isSignal: true, isRequired: true, transformFunction: null }, catalog: { classPropertyName: "catalog", publicName: "catalog", isSignal: true, isRequired: false, transformFunction: null }, worksOn: { classPropertyName: "worksOn", publicName: "worksOn", isSignal: true, isRequired: false, transformFunction: null }, skills: { classPropertyName: "skills", publicName: "skills", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, takenIds: { classPropertyName: "takenIds", publicName: "takenIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, usesInheritance: true, ngImport: i0, template: "<form class=\"stack card\" data-form=\"trigger\" novalidate (submit)=\"$event.preventDefault(); save()\">\n <h5>\n @if (trigger(); as current) {\n {{ 'nh-assistant.admin.run-config.triggers.edit-title' | translate: { trigger: current.triggerId } }}\n } @else {\n {{ 'nh-assistant.admin.run-config.triggers.new-title' | translate }}\n }\n </h5>\n\n @if (!editing()) {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-id'\">{{ 'nh-assistant.admin.run-config.triggers.id' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"64\" [id]=\"id + '-trigger-id'\" [value]=\"triggerId()\"\n [attr.aria-invalid]=\"fieldError('triggerId') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-id-hint', 'triggerId', id + '-trigger-id-error')\"\n (input)=\"triggerId.set(value($event)); touch('triggerId')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-id-hint'\">{{ 'nh-assistant.admin.run-config.triggers.id-hint' | translate }}</p>\n @if (errorKey('triggerId'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-id-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('triggerId')?.params }}</p>\n }\n </div>\n }\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.when.title' | translate }}</legend>\n <div class=\"choices\" role=\"radiogroup\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.when.title' | translate\">\n <label class=\"choice\" [class.selected]=\"source() === 'event'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"event\" [checked]=\"source() === 'event'\" (change)=\"setSource('event')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-event' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.source-event-hint' | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"source() === 'schedule'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"schedule\" [checked]=\"source() === 'schedule'\" (change)=\"setSource('schedule')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-schedule' | translate }}</strong>\n <span class=\"muted\">{{ (offersApplication() ? 'nh-assistant.admin.run-config.triggers.source-schedule-application-hint' : 'nh-assistant.admin.run-config.triggers.source-schedule-hint') | translate }}</span>\n </span>\n </label>\n </div>\n\n @if (source() === 'event') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-event'\">{{ 'nh-assistant.admin.run-config.triggers.event' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-event'\"\n [options]=\"events()\"\n [value]=\"event()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('event') !== null\"\n [describedBy]=\"describedBy(null, 'event', id + '-trigger-event-error')\"\n (valueChange)=\"event.set($event); touch('event')\" />\n @if (errorKey('event'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-event-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('event')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-debounce'\">{{ 'nh-assistant.admin.run-config.triggers.debounce' | translate }}</label>\n <input type=\"number\" min=\"0\" max=\"3600\" inputmode=\"numeric\" [id]=\"id + '-trigger-debounce'\" [value]=\"debounce()\"\n [attr.aria-invalid]=\"fieldError('debounceSeconds') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-debounce-hint', 'debounceSeconds', id + '-trigger-debounce-error')\"\n (input)=\"debounce.set(value($event)); touch('debounceSeconds')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-debounce-hint'\">{{ 'nh-assistant.admin.run-config.triggers.debounce-hint' | translate }}</p>\n @if (errorKey('debounceSeconds'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-debounce-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('debounceSeconds')?.params }}</p>\n }\n </div>\n } @else {\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-cron'\">{{ 'nh-assistant.admin.run-config.triggers.cron' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"128\" [id]=\"id + '-trigger-cron'\" [value]=\"cron()\"\n [attr.aria-invalid]=\"fieldError('cron') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-cron-hint', 'cron', id + '-trigger-cron-error')\"\n (input)=\"cron.set(value($event)); touch('cron')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-cron-hint'\">{{ 'nh-assistant.admin.run-config.triggers.cron-hint' | translate }}</p>\n <ul class=\"examples\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.examples' | translate\">\n @for (example of examples; track example.cron) {\n <li><button type=\"button\" (click)=\"useExample(example.cron)\">{{ 'nh-assistant.admin.run-config.triggers.example.' + example.key | translate }}</button></li>\n }\n </ul>\n @if (errorKey('cron'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-cron-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('cron')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-zone'\">{{ 'nh-assistant.admin.run-config.triggers.time-zone' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-zone'\"\n [options]=\"timeZones\"\n [value]=\"timeZone()\"\n [noneLabel]=\"'UTC'\"\n [invalid]=\"fieldError('timeZone') !== null\"\n [describedBy]=\"describedBy(null, 'timeZone', id + '-trigger-zone-error')\"\n (valueChange)=\"timeZone.set($event); touch('timeZone')\" />\n @if (errorKey('timeZone'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-zone-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('timeZone')?.params }}</p>\n }\n </div>\n </div>\n @if (offersApplication()) {\n <!-- An agent that works on the whole application chooses what the schedule runs for. -->\n <div class=\"field\" data-schedule-target>\n <span class=\"label\" [id]=\"id + '-trigger-target-label'\">{{ 'nh-assistant.admin.run-config.triggers.target.title' | translate }}</span>\n <div\n class=\"choices\"\n role=\"radiogroup\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"id + '-trigger-target-label'\"\n [attr.aria-invalid]=\"target() === 'application' && fieldError('subjectSet') ? true : null\"\n [attr.aria-describedby]=\"target() === 'application' ? describedBy(null, 'subjectSet', id + '-trigger-target-error') : null\">\n <label class=\"choice\" [class.selected]=\"target() === 'application'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"application\" [checked]=\"target() === 'application'\" (change)=\"setTarget('application')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.application' | translate }}</strong>\n <span class=\"muted\" data-target-hint>{{ (perDivision() ? 'nh-assistant.admin.run-config.triggers.target.application-per-division-hint' : 'nh-assistant.admin.run-config.triggers.target.application-hint') | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"target() === 'set'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"set\" [checked]=\"target() === 'set'\" (change)=\"setTarget('set')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.set' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.target.set-hint' | translate }}</span>\n </span>\n </label>\n </div>\n @if (target() === 'application' && errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-target-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate }}</p>\n }\n </div>\n }\n @if (target() === 'set') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-set'\">{{ 'nh-assistant.admin.run-config.triggers.subject-set' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-set'\"\n [options]=\"subjectSets()\"\n [value]=\"subjectSet()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('subjectSet') !== null\"\n [describedBy]=\"describedBy(id + '-trigger-set-hint', 'subjectSet', id + '-trigger-set-error')\"\n (valueChange)=\"subjectSet.set($event); touch('subjectSet')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-set-hint'\">\n {{ (applicationDropped() ? 'nh-assistant.admin.run-config.triggers.target.dropped' : 'nh-assistant.admin.run-config.triggers.subject-set-hint') | translate }}\n </p>\n @if (errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-set-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('subjectSet')?.params }}</p>\n }\n </div>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-message'\">{{ 'nh-assistant.admin.run-config.triggers.message' | translate }}</label>\n <textarea rows=\"2\" [id]=\"id + '-trigger-message'\" [value]=\"message()\"\n [attr.aria-invalid]=\"fieldError('message') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-message-hint', 'message', id + '-trigger-message-error')\"\n (input)=\"message.set(value($event)); touch('message')\"></textarea>\n <p class=\"hint\" [id]=\"id + '-trigger-message-hint'\">{{ 'nh-assistant.admin.run-config.triggers.message-hint' | translate }}</p>\n @if (errorKey('message'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-message-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('message')?.params }}</p>\n }\n </div>\n }\n </fieldset>\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.then.title' | translate }}</legend>\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-skill'\">{{ 'nh-assistant.admin.run-config.triggers.skill' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-skill'\"\n [options]=\"skills()\"\n [value]=\"skill()\"\n [noneLabel]=\"'nh-assistant.admin.run-config.triggers.agent-routes' | translate\"\n [invalid]=\"fieldError('skill') !== null\"\n [describedBy]=\"describedBy(null, 'skill', id + '-trigger-skill-error')\"\n (valueChange)=\"skill.set($event); touch('skill')\" />\n @if (errorKey('skill'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-skill-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('skill')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-conflict'\">{{ 'nh-assistant.admin.run-config.triggers.conflict' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-conflict'\"\n [options]=\"conflictOptions()\"\n [value]=\"conflict()\"\n [invalid]=\"fieldError('conflict') !== null\"\n [describedBy]=\"describedBy(null, 'conflict', id + '-trigger-conflict-error')\"\n (valueChange)=\"conflict.set($any($event)); touch('conflict')\" />\n @if (errorKey('conflict'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-conflict-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('conflict')?.params }}</p>\n }\n </div>\n </div>\n </fieldset>\n\n @if (!editing()) {\n <p class=\"hint\">{{ 'nh-assistant.admin.run-config.triggers.starts-in-shadow' | translate }}</p>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-reason'\">{{ 'nh-assistant.admin.agents.state.note-label' | translate }}</label>\n <input type=\"text\" autocomplete=\"off\" [id]=\"id + '-trigger-reason'\" [maxLength]=\"maxReason\" [value]=\"reason()\" [attr.aria-describedby]=\"id + '-trigger-reason-hint'\" (input)=\"reason.set(value($event))\" />\n <p class=\"hint\" [id]=\"id + '-trigger-reason-hint'\">{{ 'nh-assistant.admin.run-config.note-hint' | translate }}</p>\n </div>\n\n @if (hasErrors()) {\n <div class=\"form-error\" role=\"alert\" data-form-error>\n <nh-assistant-icon name=\"warning\" />\n <div>\n @if (serverError(); as failure) {\n @if (failure.code === 'assistant-validation') {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n } @else {\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n }\n } @else {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n }\n @if (otherFieldErrors().length > 0) {\n <ul>\n @for (field of otherFieldErrors(); track field) {\n <li><span class=\"mono\">{{ field }}</span></li>\n }\n </ul>\n }\n </div>\n </div>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"cancelled.emit()\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"busy()\">{{ (busy() ? 'nh-assistant.admin.saving' : 'nh-assistant.admin.save') | translate }}</button>\n </div>\n</form>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: _NhAssistantIconComponent, selector: "nh-assistant-icon", inputs: ["name"] }, { kind: "component", type: _NhAssistantPickerComponent, selector: "nh-assistant-picker", inputs: ["inputId", "options", "value", "selectedLabel", "noneLabel", "placeholder", "search", "minQueryLength", "invalid", "describedBy", "disabled"], outputs: ["valueChange", "optionChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: _NhAssistantTranslatePipe, name: "nhAssistantTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: NhAssistantTriggerFormComponent, isStandalone: true, selector: "nh-assistant-trigger-form", inputs: { agentId: { classPropertyName: "agentId", publicName: "agentId", isSignal: true, isRequired: true, transformFunction: null }, catalog: { classPropertyName: "catalog", publicName: "catalog", isSignal: true, isRequired: false, transformFunction: null }, worksOn: { classPropertyName: "worksOn", publicName: "worksOn", isSignal: true, isRequired: false, transformFunction: null }, skills: { classPropertyName: "skills", publicName: "skills", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, takenIds: { classPropertyName: "takenIds", publicName: "takenIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, usesInheritance: true, ngImport: i0, template: "<form class=\"stack card\" data-form=\"trigger\" novalidate (submit)=\"$event.preventDefault(); save()\">\n <h5>\n @if (trigger(); as current) {\n {{ 'nh-assistant.admin.run-config.triggers.edit-title' | translate: { trigger: current.triggerId } }}\n } @else {\n {{ 'nh-assistant.admin.run-config.triggers.new-title' | translate }}\n }\n </h5>\n\n @if (!editing()) {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-id'\">{{ 'nh-assistant.admin.run-config.triggers.id' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"64\" [id]=\"id + '-trigger-id'\" [value]=\"triggerId()\"\n [attr.aria-invalid]=\"fieldError('triggerId') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-id-hint', 'triggerId', id + '-trigger-id-error')\"\n (input)=\"triggerId.set(value($event)); touch('triggerId')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-id-hint'\">{{ 'nh-assistant.admin.run-config.triggers.id-hint' | translate }}</p>\n @if (errorKey('triggerId'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-id-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('triggerId')?.params }}</p>\n }\n </div>\n }\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.when.title' | translate }}</legend>\n <div class=\"choices\" role=\"radiogroup\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.when.title' | translate\">\n <label class=\"choice\" [class.selected]=\"source() === 'event'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"event\" [checked]=\"source() === 'event'\" (change)=\"setSource('event')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-event' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.source-event-hint' | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"source() === 'schedule'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"schedule\" [checked]=\"source() === 'schedule'\" (change)=\"setSource('schedule')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-schedule' | translate }}</strong>\n <span class=\"muted\">{{ (offersApplication() ? 'nh-assistant.admin.run-config.triggers.source-schedule-application-hint' : 'nh-assistant.admin.run-config.triggers.source-schedule-hint') | translate }}</span>\n </span>\n </label>\n </div>\n\n @if (source() === 'event') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-event'\">{{ 'nh-assistant.admin.run-config.triggers.event' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-event'\"\n [options]=\"events()\"\n [value]=\"event()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('event') !== null\"\n [describedBy]=\"describedBy(null, 'event', id + '-trigger-event-error')\"\n (valueChange)=\"setEvent($event)\" />\n @if (errorKey('event'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-event-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('event')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-debounce'\">{{ 'nh-assistant.admin.run-config.triggers.debounce' | translate }}</label>\n <input type=\"number\" min=\"0\" max=\"3600\" inputmode=\"numeric\" [id]=\"id + '-trigger-debounce'\" [value]=\"debounce()\"\n [attr.aria-invalid]=\"fieldError('debounceSeconds') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-debounce-hint', 'debounceSeconds', id + '-trigger-debounce-error')\"\n (input)=\"debounce.set(value($event)); touch('debounceSeconds')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-debounce-hint'\">{{ 'nh-assistant.admin.run-config.triggers.debounce-hint' | translate }}</p>\n @if (errorKey('debounceSeconds'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-debounce-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('debounceSeconds')?.params }}</p>\n }\n </div>\n @if (event() !== '') {\n <!-- The filters of the chosen event; each one selected must let an event through. -->\n <fieldset class=\"field\" data-trigger-filters [attr.aria-describedby]=\"describedBy(id + '-trigger-filters-hint', 'filters', id + '-trigger-filters-error')\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.filters.title' | translate }}</legend>\n <p class=\"hint\" [id]=\"id + '-trigger-filters-hint'\">{{ 'nh-assistant.admin.run-config.triggers.filters.hint' | translate }}</p>\n <!-- In their own block: a label right under the field would take the field's label style. -->\n <div class=\"checks\">\n @for (filter of eventFilters(); track filter.name) {\n <label class=\"check described\" [attr.data-filter]=\"filter.name\">\n <input type=\"checkbox\" [checked]=\"filters().includes(filter.name)\" [attr.aria-invalid]=\"fieldError('filters') ? true : null\" (change)=\"toggleFilter(filter.name, checked($event))\" />\n <span>\n <span class=\"mono\">{{ filter.name }}</span>\n <span class=\"muted\">{{ filter.description }}</span>\n </span>\n </label>\n }\n @for (name of missingFilters(); track name) {\n <!-- Stored, but the event no longer offers it: the trigger starts nothing until it is cleared. -->\n <label class=\"check described\" [attr.data-missing-filter]=\"name\">\n <input type=\"checkbox\" [checked]=\"true\" aria-invalid=\"true\" (change)=\"toggleFilter(name, checked($event))\" />\n <span>\n <span class=\"mono\">{{ name }}</span>\n <span class=\"error-text\">{{ 'nh-assistant.admin.run-config.triggers.filters.missing' | translate }}</span>\n </span>\n </label>\n }\n </div>\n @if (eventFilters().length === 0 && missingFilters().length === 0) {\n <p class=\"muted\" data-filters-empty>{{ 'nh-assistant.admin.run-config.triggers.filters.empty' | translate }}</p>\n }\n @if (errorKey('filters'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-filters-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('filters')?.params }}</p>\n }\n </fieldset>\n }\n } @else {\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-cron'\">{{ 'nh-assistant.admin.run-config.triggers.cron' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"128\" [id]=\"id + '-trigger-cron'\" [value]=\"cron()\"\n [attr.aria-invalid]=\"fieldError('cron') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-cron-hint', 'cron', id + '-trigger-cron-error')\"\n (input)=\"cron.set(value($event)); touch('cron')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-cron-hint'\">{{ 'nh-assistant.admin.run-config.triggers.cron-hint' | translate }}</p>\n <ul class=\"examples\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.examples' | translate\">\n @for (example of examples; track example.cron) {\n <li><button type=\"button\" (click)=\"useExample(example.cron)\">{{ 'nh-assistant.admin.run-config.triggers.example.' + example.key | translate }}</button></li>\n }\n </ul>\n @if (errorKey('cron'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-cron-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('cron')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-zone'\">{{ 'nh-assistant.admin.run-config.triggers.time-zone' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-zone'\"\n [options]=\"timeZones\"\n [value]=\"timeZone()\"\n [noneLabel]=\"'UTC'\"\n [invalid]=\"fieldError('timeZone') !== null\"\n [describedBy]=\"describedBy(null, 'timeZone', id + '-trigger-zone-error')\"\n (valueChange)=\"timeZone.set($event); touch('timeZone')\" />\n @if (errorKey('timeZone'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-zone-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('timeZone')?.params }}</p>\n }\n </div>\n </div>\n @if (offersApplication()) {\n <!-- An agent that works on the whole application chooses what the schedule runs for. -->\n <div class=\"field\" data-schedule-target>\n <span class=\"label\" [id]=\"id + '-trigger-target-label'\">{{ 'nh-assistant.admin.run-config.triggers.target.title' | translate }}</span>\n <div\n class=\"choices\"\n role=\"radiogroup\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"id + '-trigger-target-label'\"\n [attr.aria-invalid]=\"target() === 'application' && fieldError('subjectSet') ? true : null\"\n [attr.aria-describedby]=\"target() === 'application' ? describedBy(null, 'subjectSet', id + '-trigger-target-error') : null\">\n <label class=\"choice\" [class.selected]=\"target() === 'application'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"application\" [checked]=\"target() === 'application'\" (change)=\"setTarget('application')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.application' | translate }}</strong>\n <span class=\"muted\" data-target-hint>{{ (perDivision() ? 'nh-assistant.admin.run-config.triggers.target.application-per-division-hint' : 'nh-assistant.admin.run-config.triggers.target.application-hint') | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"target() === 'set'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"set\" [checked]=\"target() === 'set'\" (change)=\"setTarget('set')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.set' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.target.set-hint' | translate }}</span>\n </span>\n </label>\n </div>\n @if (target() === 'application' && errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-target-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate }}</p>\n }\n </div>\n }\n @if (target() === 'set') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-set'\">{{ 'nh-assistant.admin.run-config.triggers.subject-set' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-set'\"\n [options]=\"subjectSets()\"\n [value]=\"subjectSet()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('subjectSet') !== null\"\n [describedBy]=\"describedBy(id + '-trigger-set-hint', 'subjectSet', id + '-trigger-set-error')\"\n (valueChange)=\"subjectSet.set($event); touch('subjectSet')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-set-hint'\">\n {{ (applicationDropped() ? 'nh-assistant.admin.run-config.triggers.target.dropped' : 'nh-assistant.admin.run-config.triggers.subject-set-hint') | translate }}\n </p>\n @if (errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-set-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('subjectSet')?.params }}</p>\n }\n </div>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-message'\">{{ 'nh-assistant.admin.run-config.triggers.message' | translate }}</label>\n <textarea rows=\"2\" [id]=\"id + '-trigger-message'\" [value]=\"message()\"\n [attr.aria-invalid]=\"fieldError('message') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-message-hint', 'message', id + '-trigger-message-error')\"\n (input)=\"message.set(value($event)); touch('message')\"></textarea>\n <p class=\"hint\" [id]=\"id + '-trigger-message-hint'\">{{ 'nh-assistant.admin.run-config.triggers.message-hint' | translate }}</p>\n @if (errorKey('message'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-message-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('message')?.params }}</p>\n }\n </div>\n }\n </fieldset>\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.then.title' | translate }}</legend>\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-skill'\">{{ 'nh-assistant.admin.run-config.triggers.skill' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-skill'\"\n [options]=\"skills()\"\n [value]=\"skill()\"\n [noneLabel]=\"'nh-assistant.admin.run-config.triggers.agent-routes' | translate\"\n [invalid]=\"fieldError('skill') !== null\"\n [describedBy]=\"describedBy(null, 'skill', id + '-trigger-skill-error')\"\n (valueChange)=\"skill.set($event); touch('skill')\" />\n @if (errorKey('skill'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-skill-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('skill')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-conflict'\">{{ 'nh-assistant.admin.run-config.triggers.conflict' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-conflict'\"\n [options]=\"conflictOptions()\"\n [value]=\"conflict()\"\n [invalid]=\"fieldError('conflict') !== null\"\n [describedBy]=\"describedBy(null, 'conflict', id + '-trigger-conflict-error')\"\n (valueChange)=\"conflict.set($any($event)); touch('conflict')\" />\n @if (errorKey('conflict'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-conflict-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('conflict')?.params }}</p>\n }\n </div>\n </div>\n </fieldset>\n\n @if (!editing()) {\n <p class=\"hint\">{{ 'nh-assistant.admin.run-config.triggers.starts-in-shadow' | translate }}</p>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-reason'\">{{ 'nh-assistant.admin.agents.state.note-label' | translate }}</label>\n <input type=\"text\" autocomplete=\"off\" [id]=\"id + '-trigger-reason'\" [maxLength]=\"maxReason\" [value]=\"reason()\" [attr.aria-describedby]=\"id + '-trigger-reason-hint'\" (input)=\"reason.set(value($event))\" />\n <p class=\"hint\" [id]=\"id + '-trigger-reason-hint'\">{{ 'nh-assistant.admin.run-config.note-hint' | translate }}</p>\n </div>\n\n @if (hasErrors()) {\n <div class=\"form-error\" role=\"alert\" data-form-error>\n <nh-assistant-icon name=\"warning\" />\n <div>\n @if (serverError(); as failure) {\n @if (failure.code === 'assistant-validation') {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n } @else {\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n }\n } @else {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n }\n @if (otherFieldErrors().length > 0) {\n <ul>\n @for (field of otherFieldErrors(); track field) {\n <li><span class=\"mono\">{{ field }}</span></li>\n }\n </ul>\n }\n </div>\n </div>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"cancelled.emit()\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"busy()\">{{ (busy() ? 'nh-assistant.admin.saving' : 'nh-assistant.admin.save') | translate }}</button>\n </div>\n</form>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: _NhAssistantIconComponent, selector: "nh-assistant-icon", inputs: ["name"] }, { kind: "component", type: _NhAssistantPickerComponent, selector: "nh-assistant-picker", inputs: ["inputId", "options", "value", "selectedLabel", "noneLabel", "placeholder", "search", "minQueryLength", "invalid", "describedBy", "disabled"], outputs: ["valueChange", "optionChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: _NhAssistantTranslatePipe, name: "nhAssistantTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3150
3196
  }
3151
3197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: NhAssistantTriggerFormComponent, decorators: [{
3152
3198
  type: Component,
3153
- args: [{ selector: 'nh-assistant-trigger-form', standalone: true, imports: [TranslatePipe, _NhAssistantTranslatePipe, _NhAssistantIconComponent, _NhAssistantPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form class=\"stack card\" data-form=\"trigger\" novalidate (submit)=\"$event.preventDefault(); save()\">\n <h5>\n @if (trigger(); as current) {\n {{ 'nh-assistant.admin.run-config.triggers.edit-title' | translate: { trigger: current.triggerId } }}\n } @else {\n {{ 'nh-assistant.admin.run-config.triggers.new-title' | translate }}\n }\n </h5>\n\n @if (!editing()) {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-id'\">{{ 'nh-assistant.admin.run-config.triggers.id' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"64\" [id]=\"id + '-trigger-id'\" [value]=\"triggerId()\"\n [attr.aria-invalid]=\"fieldError('triggerId') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-id-hint', 'triggerId', id + '-trigger-id-error')\"\n (input)=\"triggerId.set(value($event)); touch('triggerId')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-id-hint'\">{{ 'nh-assistant.admin.run-config.triggers.id-hint' | translate }}</p>\n @if (errorKey('triggerId'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-id-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('triggerId')?.params }}</p>\n }\n </div>\n }\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.when.title' | translate }}</legend>\n <div class=\"choices\" role=\"radiogroup\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.when.title' | translate\">\n <label class=\"choice\" [class.selected]=\"source() === 'event'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"event\" [checked]=\"source() === 'event'\" (change)=\"setSource('event')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-event' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.source-event-hint' | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"source() === 'schedule'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"schedule\" [checked]=\"source() === 'schedule'\" (change)=\"setSource('schedule')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-schedule' | translate }}</strong>\n <span class=\"muted\">{{ (offersApplication() ? 'nh-assistant.admin.run-config.triggers.source-schedule-application-hint' : 'nh-assistant.admin.run-config.triggers.source-schedule-hint') | translate }}</span>\n </span>\n </label>\n </div>\n\n @if (source() === 'event') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-event'\">{{ 'nh-assistant.admin.run-config.triggers.event' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-event'\"\n [options]=\"events()\"\n [value]=\"event()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('event') !== null\"\n [describedBy]=\"describedBy(null, 'event', id + '-trigger-event-error')\"\n (valueChange)=\"event.set($event); touch('event')\" />\n @if (errorKey('event'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-event-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('event')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-debounce'\">{{ 'nh-assistant.admin.run-config.triggers.debounce' | translate }}</label>\n <input type=\"number\" min=\"0\" max=\"3600\" inputmode=\"numeric\" [id]=\"id + '-trigger-debounce'\" [value]=\"debounce()\"\n [attr.aria-invalid]=\"fieldError('debounceSeconds') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-debounce-hint', 'debounceSeconds', id + '-trigger-debounce-error')\"\n (input)=\"debounce.set(value($event)); touch('debounceSeconds')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-debounce-hint'\">{{ 'nh-assistant.admin.run-config.triggers.debounce-hint' | translate }}</p>\n @if (errorKey('debounceSeconds'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-debounce-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('debounceSeconds')?.params }}</p>\n }\n </div>\n } @else {\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-cron'\">{{ 'nh-assistant.admin.run-config.triggers.cron' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"128\" [id]=\"id + '-trigger-cron'\" [value]=\"cron()\"\n [attr.aria-invalid]=\"fieldError('cron') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-cron-hint', 'cron', id + '-trigger-cron-error')\"\n (input)=\"cron.set(value($event)); touch('cron')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-cron-hint'\">{{ 'nh-assistant.admin.run-config.triggers.cron-hint' | translate }}</p>\n <ul class=\"examples\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.examples' | translate\">\n @for (example of examples; track example.cron) {\n <li><button type=\"button\" (click)=\"useExample(example.cron)\">{{ 'nh-assistant.admin.run-config.triggers.example.' + example.key | translate }}</button></li>\n }\n </ul>\n @if (errorKey('cron'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-cron-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('cron')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-zone'\">{{ 'nh-assistant.admin.run-config.triggers.time-zone' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-zone'\"\n [options]=\"timeZones\"\n [value]=\"timeZone()\"\n [noneLabel]=\"'UTC'\"\n [invalid]=\"fieldError('timeZone') !== null\"\n [describedBy]=\"describedBy(null, 'timeZone', id + '-trigger-zone-error')\"\n (valueChange)=\"timeZone.set($event); touch('timeZone')\" />\n @if (errorKey('timeZone'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-zone-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('timeZone')?.params }}</p>\n }\n </div>\n </div>\n @if (offersApplication()) {\n <!-- An agent that works on the whole application chooses what the schedule runs for. -->\n <div class=\"field\" data-schedule-target>\n <span class=\"label\" [id]=\"id + '-trigger-target-label'\">{{ 'nh-assistant.admin.run-config.triggers.target.title' | translate }}</span>\n <div\n class=\"choices\"\n role=\"radiogroup\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"id + '-trigger-target-label'\"\n [attr.aria-invalid]=\"target() === 'application' && fieldError('subjectSet') ? true : null\"\n [attr.aria-describedby]=\"target() === 'application' ? describedBy(null, 'subjectSet', id + '-trigger-target-error') : null\">\n <label class=\"choice\" [class.selected]=\"target() === 'application'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"application\" [checked]=\"target() === 'application'\" (change)=\"setTarget('application')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.application' | translate }}</strong>\n <span class=\"muted\" data-target-hint>{{ (perDivision() ? 'nh-assistant.admin.run-config.triggers.target.application-per-division-hint' : 'nh-assistant.admin.run-config.triggers.target.application-hint') | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"target() === 'set'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"set\" [checked]=\"target() === 'set'\" (change)=\"setTarget('set')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.set' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.target.set-hint' | translate }}</span>\n </span>\n </label>\n </div>\n @if (target() === 'application' && errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-target-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate }}</p>\n }\n </div>\n }\n @if (target() === 'set') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-set'\">{{ 'nh-assistant.admin.run-config.triggers.subject-set' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-set'\"\n [options]=\"subjectSets()\"\n [value]=\"subjectSet()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('subjectSet') !== null\"\n [describedBy]=\"describedBy(id + '-trigger-set-hint', 'subjectSet', id + '-trigger-set-error')\"\n (valueChange)=\"subjectSet.set($event); touch('subjectSet')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-set-hint'\">\n {{ (applicationDropped() ? 'nh-assistant.admin.run-config.triggers.target.dropped' : 'nh-assistant.admin.run-config.triggers.subject-set-hint') | translate }}\n </p>\n @if (errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-set-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('subjectSet')?.params }}</p>\n }\n </div>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-message'\">{{ 'nh-assistant.admin.run-config.triggers.message' | translate }}</label>\n <textarea rows=\"2\" [id]=\"id + '-trigger-message'\" [value]=\"message()\"\n [attr.aria-invalid]=\"fieldError('message') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-message-hint', 'message', id + '-trigger-message-error')\"\n (input)=\"message.set(value($event)); touch('message')\"></textarea>\n <p class=\"hint\" [id]=\"id + '-trigger-message-hint'\">{{ 'nh-assistant.admin.run-config.triggers.message-hint' | translate }}</p>\n @if (errorKey('message'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-message-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('message')?.params }}</p>\n }\n </div>\n }\n </fieldset>\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.then.title' | translate }}</legend>\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-skill'\">{{ 'nh-assistant.admin.run-config.triggers.skill' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-skill'\"\n [options]=\"skills()\"\n [value]=\"skill()\"\n [noneLabel]=\"'nh-assistant.admin.run-config.triggers.agent-routes' | translate\"\n [invalid]=\"fieldError('skill') !== null\"\n [describedBy]=\"describedBy(null, 'skill', id + '-trigger-skill-error')\"\n (valueChange)=\"skill.set($event); touch('skill')\" />\n @if (errorKey('skill'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-skill-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('skill')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-conflict'\">{{ 'nh-assistant.admin.run-config.triggers.conflict' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-conflict'\"\n [options]=\"conflictOptions()\"\n [value]=\"conflict()\"\n [invalid]=\"fieldError('conflict') !== null\"\n [describedBy]=\"describedBy(null, 'conflict', id + '-trigger-conflict-error')\"\n (valueChange)=\"conflict.set($any($event)); touch('conflict')\" />\n @if (errorKey('conflict'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-conflict-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('conflict')?.params }}</p>\n }\n </div>\n </div>\n </fieldset>\n\n @if (!editing()) {\n <p class=\"hint\">{{ 'nh-assistant.admin.run-config.triggers.starts-in-shadow' | translate }}</p>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-reason'\">{{ 'nh-assistant.admin.agents.state.note-label' | translate }}</label>\n <input type=\"text\" autocomplete=\"off\" [id]=\"id + '-trigger-reason'\" [maxLength]=\"maxReason\" [value]=\"reason()\" [attr.aria-describedby]=\"id + '-trigger-reason-hint'\" (input)=\"reason.set(value($event))\" />\n <p class=\"hint\" [id]=\"id + '-trigger-reason-hint'\">{{ 'nh-assistant.admin.run-config.note-hint' | translate }}</p>\n </div>\n\n @if (hasErrors()) {\n <div class=\"form-error\" role=\"alert\" data-form-error>\n <nh-assistant-icon name=\"warning\" />\n <div>\n @if (serverError(); as failure) {\n @if (failure.code === 'assistant-validation') {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n } @else {\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n }\n } @else {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n }\n @if (otherFieldErrors().length > 0) {\n <ul>\n @for (field of otherFieldErrors(); track field) {\n <li><span class=\"mono\">{{ field }}</span></li>\n }\n </ul>\n }\n </div>\n </div>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"cancelled.emit()\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"busy()\">{{ (busy() ? 'nh-assistant.admin.saving' : 'nh-assistant.admin.save') | translate }}</button>\n </div>\n</form>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"] }]
3199
+ args: [{ selector: 'nh-assistant-trigger-form', standalone: true, imports: [TranslatePipe, _NhAssistantTranslatePipe, _NhAssistantIconComponent, _NhAssistantPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form class=\"stack card\" data-form=\"trigger\" novalidate (submit)=\"$event.preventDefault(); save()\">\n <h5>\n @if (trigger(); as current) {\n {{ 'nh-assistant.admin.run-config.triggers.edit-title' | translate: { trigger: current.triggerId } }}\n } @else {\n {{ 'nh-assistant.admin.run-config.triggers.new-title' | translate }}\n }\n </h5>\n\n @if (!editing()) {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-id'\">{{ 'nh-assistant.admin.run-config.triggers.id' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"64\" [id]=\"id + '-trigger-id'\" [value]=\"triggerId()\"\n [attr.aria-invalid]=\"fieldError('triggerId') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-id-hint', 'triggerId', id + '-trigger-id-error')\"\n (input)=\"triggerId.set(value($event)); touch('triggerId')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-id-hint'\">{{ 'nh-assistant.admin.run-config.triggers.id-hint' | translate }}</p>\n @if (errorKey('triggerId'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-id-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('triggerId')?.params }}</p>\n }\n </div>\n }\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.when.title' | translate }}</legend>\n <div class=\"choices\" role=\"radiogroup\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.when.title' | translate\">\n <label class=\"choice\" [class.selected]=\"source() === 'event'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"event\" [checked]=\"source() === 'event'\" (change)=\"setSource('event')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-event' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.source-event-hint' | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"source() === 'schedule'\">\n <input type=\"radio\" [name]=\"id + '-source'\" value=\"schedule\" [checked]=\"source() === 'schedule'\" (change)=\"setSource('schedule')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.source-schedule' | translate }}</strong>\n <span class=\"muted\">{{ (offersApplication() ? 'nh-assistant.admin.run-config.triggers.source-schedule-application-hint' : 'nh-assistant.admin.run-config.triggers.source-schedule-hint') | translate }}</span>\n </span>\n </label>\n </div>\n\n @if (source() === 'event') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-event'\">{{ 'nh-assistant.admin.run-config.triggers.event' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-event'\"\n [options]=\"events()\"\n [value]=\"event()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('event') !== null\"\n [describedBy]=\"describedBy(null, 'event', id + '-trigger-event-error')\"\n (valueChange)=\"setEvent($event)\" />\n @if (errorKey('event'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-event-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('event')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-debounce'\">{{ 'nh-assistant.admin.run-config.triggers.debounce' | translate }}</label>\n <input type=\"number\" min=\"0\" max=\"3600\" inputmode=\"numeric\" [id]=\"id + '-trigger-debounce'\" [value]=\"debounce()\"\n [attr.aria-invalid]=\"fieldError('debounceSeconds') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-debounce-hint', 'debounceSeconds', id + '-trigger-debounce-error')\"\n (input)=\"debounce.set(value($event)); touch('debounceSeconds')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-debounce-hint'\">{{ 'nh-assistant.admin.run-config.triggers.debounce-hint' | translate }}</p>\n @if (errorKey('debounceSeconds'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-debounce-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('debounceSeconds')?.params }}</p>\n }\n </div>\n @if (event() !== '') {\n <!-- The filters of the chosen event; each one selected must let an event through. -->\n <fieldset class=\"field\" data-trigger-filters [attr.aria-describedby]=\"describedBy(id + '-trigger-filters-hint', 'filters', id + '-trigger-filters-error')\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.filters.title' | translate }}</legend>\n <p class=\"hint\" [id]=\"id + '-trigger-filters-hint'\">{{ 'nh-assistant.admin.run-config.triggers.filters.hint' | translate }}</p>\n <!-- In their own block: a label right under the field would take the field's label style. -->\n <div class=\"checks\">\n @for (filter of eventFilters(); track filter.name) {\n <label class=\"check described\" [attr.data-filter]=\"filter.name\">\n <input type=\"checkbox\" [checked]=\"filters().includes(filter.name)\" [attr.aria-invalid]=\"fieldError('filters') ? true : null\" (change)=\"toggleFilter(filter.name, checked($event))\" />\n <span>\n <span class=\"mono\">{{ filter.name }}</span>\n <span class=\"muted\">{{ filter.description }}</span>\n </span>\n </label>\n }\n @for (name of missingFilters(); track name) {\n <!-- Stored, but the event no longer offers it: the trigger starts nothing until it is cleared. -->\n <label class=\"check described\" [attr.data-missing-filter]=\"name\">\n <input type=\"checkbox\" [checked]=\"true\" aria-invalid=\"true\" (change)=\"toggleFilter(name, checked($event))\" />\n <span>\n <span class=\"mono\">{{ name }}</span>\n <span class=\"error-text\">{{ 'nh-assistant.admin.run-config.triggers.filters.missing' | translate }}</span>\n </span>\n </label>\n }\n </div>\n @if (eventFilters().length === 0 && missingFilters().length === 0) {\n <p class=\"muted\" data-filters-empty>{{ 'nh-assistant.admin.run-config.triggers.filters.empty' | translate }}</p>\n }\n @if (errorKey('filters'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-filters-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('filters')?.params }}</p>\n }\n </fieldset>\n }\n } @else {\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-cron'\">{{ 'nh-assistant.admin.run-config.triggers.cron' | translate }}</label>\n <input type=\"text\" class=\"mono\" autocomplete=\"off\" maxlength=\"128\" [id]=\"id + '-trigger-cron'\" [value]=\"cron()\"\n [attr.aria-invalid]=\"fieldError('cron') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-cron-hint', 'cron', id + '-trigger-cron-error')\"\n (input)=\"cron.set(value($event)); touch('cron')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-cron-hint'\">{{ 'nh-assistant.admin.run-config.triggers.cron-hint' | translate }}</p>\n <ul class=\"examples\" [attr.aria-label]=\"'nh-assistant.admin.run-config.triggers.examples' | translate\">\n @for (example of examples; track example.cron) {\n <li><button type=\"button\" (click)=\"useExample(example.cron)\">{{ 'nh-assistant.admin.run-config.triggers.example.' + example.key | translate }}</button></li>\n }\n </ul>\n @if (errorKey('cron'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-cron-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('cron')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-zone'\">{{ 'nh-assistant.admin.run-config.triggers.time-zone' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-zone'\"\n [options]=\"timeZones\"\n [value]=\"timeZone()\"\n [noneLabel]=\"'UTC'\"\n [invalid]=\"fieldError('timeZone') !== null\"\n [describedBy]=\"describedBy(null, 'timeZone', id + '-trigger-zone-error')\"\n (valueChange)=\"timeZone.set($event); touch('timeZone')\" />\n @if (errorKey('timeZone'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-zone-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('timeZone')?.params }}</p>\n }\n </div>\n </div>\n @if (offersApplication()) {\n <!-- An agent that works on the whole application chooses what the schedule runs for. -->\n <div class=\"field\" data-schedule-target>\n <span class=\"label\" [id]=\"id + '-trigger-target-label'\">{{ 'nh-assistant.admin.run-config.triggers.target.title' | translate }}</span>\n <div\n class=\"choices\"\n role=\"radiogroup\"\n tabindex=\"-1\"\n [attr.aria-labelledby]=\"id + '-trigger-target-label'\"\n [attr.aria-invalid]=\"target() === 'application' && fieldError('subjectSet') ? true : null\"\n [attr.aria-describedby]=\"target() === 'application' ? describedBy(null, 'subjectSet', id + '-trigger-target-error') : null\">\n <label class=\"choice\" [class.selected]=\"target() === 'application'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"application\" [checked]=\"target() === 'application'\" (change)=\"setTarget('application')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.application' | translate }}</strong>\n <span class=\"muted\" data-target-hint>{{ (perDivision() ? 'nh-assistant.admin.run-config.triggers.target.application-per-division-hint' : 'nh-assistant.admin.run-config.triggers.target.application-hint') | translate }}</span>\n </span>\n </label>\n <label class=\"choice\" [class.selected]=\"target() === 'set'\">\n <input type=\"radio\" [name]=\"id + '-target'\" value=\"set\" [checked]=\"target() === 'set'\" (change)=\"setTarget('set')\" />\n <span>\n <strong>{{ 'nh-assistant.admin.run-config.triggers.target.set' | translate }}</strong>\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.target.set-hint' | translate }}</span>\n </span>\n </label>\n </div>\n @if (target() === 'application' && errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-target-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate }}</p>\n }\n </div>\n }\n @if (target() === 'set') {\n <div class=\"field\">\n <label [for]=\"id + '-trigger-set'\">{{ 'nh-assistant.admin.run-config.triggers.subject-set' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-set'\"\n [options]=\"subjectSets()\"\n [value]=\"subjectSet()\"\n [placeholder]=\"'nh-assistant.admin.run-config.choose' | translate\"\n [invalid]=\"fieldError('subjectSet') !== null\"\n [describedBy]=\"describedBy(id + '-trigger-set-hint', 'subjectSet', id + '-trigger-set-error')\"\n (valueChange)=\"subjectSet.set($event); touch('subjectSet')\" />\n <p class=\"hint\" [id]=\"id + '-trigger-set-hint'\">\n {{ (applicationDropped() ? 'nh-assistant.admin.run-config.triggers.target.dropped' : 'nh-assistant.admin.run-config.triggers.subject-set-hint') | translate }}\n </p>\n @if (errorKey('subjectSet'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-set-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('subjectSet')?.params }}</p>\n }\n </div>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-message'\">{{ 'nh-assistant.admin.run-config.triggers.message' | translate }}</label>\n <textarea rows=\"2\" [id]=\"id + '-trigger-message'\" [value]=\"message()\"\n [attr.aria-invalid]=\"fieldError('message') ? true : null\"\n [attr.aria-describedby]=\"describedBy(id + '-trigger-message-hint', 'message', id + '-trigger-message-error')\"\n (input)=\"message.set(value($event)); touch('message')\"></textarea>\n <p class=\"hint\" [id]=\"id + '-trigger-message-hint'\">{{ 'nh-assistant.admin.run-config.triggers.message-hint' | translate }}</p>\n @if (errorKey('message'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-message-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('message')?.params }}</p>\n }\n </div>\n }\n </fieldset>\n\n <fieldset class=\"group\">\n <legend>{{ 'nh-assistant.admin.run-config.triggers.then.title' | translate }}</legend>\n <div class=\"grid\">\n <div class=\"field\">\n <label [for]=\"id + '-trigger-skill'\">{{ 'nh-assistant.admin.run-config.triggers.skill' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-skill'\"\n [options]=\"skills()\"\n [value]=\"skill()\"\n [noneLabel]=\"'nh-assistant.admin.run-config.triggers.agent-routes' | translate\"\n [invalid]=\"fieldError('skill') !== null\"\n [describedBy]=\"describedBy(null, 'skill', id + '-trigger-skill-error')\"\n (valueChange)=\"skill.set($event); touch('skill')\" />\n @if (errorKey('skill'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-skill-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('skill')?.params }}</p>\n }\n </div>\n <div class=\"field\">\n <label [for]=\"id + '-trigger-conflict'\">{{ 'nh-assistant.admin.run-config.triggers.conflict' | translate }}</label>\n <nh-assistant-picker\n [inputId]=\"id + '-trigger-conflict'\"\n [options]=\"conflictOptions()\"\n [value]=\"conflict()\"\n [invalid]=\"fieldError('conflict') !== null\"\n [describedBy]=\"describedBy(null, 'conflict', id + '-trigger-conflict-error')\"\n (valueChange)=\"conflict.set($any($event)); touch('conflict')\" />\n @if (errorKey('conflict'); as key) {\n <p class=\"field-error\" [id]=\"id + '-trigger-conflict-error'\"><nh-assistant-icon name=\"warning\" />{{ key | translate: fieldError('conflict')?.params }}</p>\n }\n </div>\n </div>\n </fieldset>\n\n @if (!editing()) {\n <p class=\"hint\">{{ 'nh-assistant.admin.run-config.triggers.starts-in-shadow' | translate }}</p>\n }\n <div class=\"field\">\n <label [for]=\"id + '-trigger-reason'\">{{ 'nh-assistant.admin.agents.state.note-label' | translate }}</label>\n <input type=\"text\" autocomplete=\"off\" [id]=\"id + '-trigger-reason'\" [maxLength]=\"maxReason\" [value]=\"reason()\" [attr.aria-describedby]=\"id + '-trigger-reason-hint'\" (input)=\"reason.set(value($event))\" />\n <p class=\"hint\" [id]=\"id + '-trigger-reason-hint'\">{{ 'nh-assistant.admin.run-config.note-hint' | translate }}</p>\n </div>\n\n @if (hasErrors()) {\n <div class=\"form-error\" role=\"alert\" data-form-error>\n <nh-assistant-icon name=\"warning\" />\n <div>\n @if (serverError(); as failure) {\n @if (failure.code === 'assistant-validation') {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n } @else {\n {{ errorKeys() | nhAssistantTranslate: failure.code }}\n }\n } @else {\n {{ 'nh-assistant.admin.run-config.check-fields' | translate }}\n }\n @if (otherFieldErrors().length > 0) {\n <ul>\n @for (field of otherFieldErrors(); track field) {\n <li><span class=\"mono\">{{ field }}</span></li>\n }\n </ul>\n }\n </div>\n </div>\n }\n <div class=\"actions\">\n <button class=\"secondary\" type=\"button\" (click)=\"cancelled.emit()\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n <button class=\"primary\" type=\"submit\" [disabled]=\"busy()\">{{ (busy() ? 'nh-assistant.admin.saving' : 'nh-assistant.admin.save') | translate }}</button>\n </div>\n</form>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"] }]
3154
3200
  }], propDecorators: { agentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "agentId", required: true }] }], catalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "catalog", required: false }] }], worksOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "worksOn", required: false }] }], skills: [{ type: i0.Input, args: [{ isSignal: true, alias: "skills", required: false }] }], trigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "trigger", required: false }] }], takenIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "takenIds", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }] } });
3155
3201
 
3156
3202
  let nextId$5 = 0;
@@ -3555,7 +3601,7 @@ class NhAssistantAgentRunConfigurationComponent {
3555
3601
  });
3556
3602
  }
3557
3603
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: NhAssistantAgentRunConfigurationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3558
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: NhAssistantAgentRunConfigurationComponent, isStandalone: true, selector: "nh-assistant-agent-run-configuration", inputs: { agent: { classPropertyName: "agent", publicName: "agent", isSignal: true, isRequired: true, transformFunction: null }, startSetup: { classPropertyName: "startSetup", publicName: "startSetup", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: false, transformFunction: null }, servers: { classPropertyName: "servers", publicName: "servers", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", editAgent: "editAgent", changeAccount: "changeAccount", openRuns: "openRuns", openMcpServers: "openMcpServers" }, ngImport: i0, template: "<section class=\"section\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || busy()\">\n <header class=\"section-header\">\n <div>\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.admin.run-config.title' | translate: { name: agentName() } }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.description' | translate }}</p>\n </div>\n </header>\n\n @if (saved(); as key) {\n <p class=\"message success\" role=\"status\" tabindex=\"-1\" data-saved>{{ key | translate }}</p>\n <!-- The save succeeded; a warning says what may still keep the skill from working. -->\n @for (warning of savedWarnings(); track warning) {\n <p class=\"message warning\" role=\"status\" [attr.data-saved-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n }\n\n @if (loading() && !configuration()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.admin.retry' | translate }}</button>\n </div>\n } @else if (configuration(); as config) {\n <nh-assistant-account-names-error [names]=\"accountNames\" />\n @if (problems().length > 0) {\n <!-- Each problem shows at the step of the flow it concerns, with the form that fixes it. -->\n <p class=\"message warning\" role=\"status\" data-problems>\n <nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.admin.run-config.flow.problems' | translate }}\n </p>\n }\n\n <!-- The agent at a glance; the forms below change what each step shows. -->\n <nh-assistant-agent-flow\n [agent]=\"agent()\"\n [configuration]=\"config\"\n [catalog]=\"catalog()\"\n [tools]=\"tools()\"\n [servers]=\"servers()\"\n [accountName]=\"accountName()\"\n [busy]=\"busy()\"\n (entry)=\"onFlowEntry($event)\" />\n\n @if (config.source === 'admin') {\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-settings-title'\" data-run-settings>\n <header class=\"section-header\">\n <h4 [id]=\"id + '-settings-title'\">{{ 'nh-assistant.admin.run-config.settings.title' | translate }}</h4>\n </header>\n @if (form() === 'setup') {\n <nh-assistant-agent-work-setup\n [agentId]=\"config.agentId\"\n [agentName]=\"agentName()\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [takenSkillIds]=\"skillIds()\"\n [takenTriggerIds]=\"triggerIds()\"\n (completed)=\"onSetupCompleted($event.live)\"\n (cancelled)=\"cancel()\" />\n } @else if (form() === 'settings') {\n <nh-assistant-run-settings-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [settings]=\"config.runSettings\"\n (saved)=\"onSettingsSaved()\"\n (cancelled)=\"cancel()\" />\n } @else if (config.runSettings; as settings) {\n <dl class=\"review\" data-settings-summary>\n <dt>{{ 'nh-assistant.admin.run-config.settings.who.short' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.run-config.settings.accountability.' + settings.accountability | translate }}\n @if (settings.serviceAccountActorId; as accountId) {\n <span class=\"block\" data-account-name>\n <nh-assistant-account-label [actorId]=\"accountId\" [name]=\"accountName()\" />\n </span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.run-config.way-of-working' | translate }}</dt>\n <dd>{{ settings.ruleHandler ?? ('nh-assistant.admin.run-config.model' | translate) }}</dd>\n <dt>{{ 'nh-assistant.admin.run-config.approval-policy' | translate }}</dt>\n <dd>\n {{ settings.approvalPolicy ?? ('nh-assistant.admin.run-config.settings.approval.default' | translate) }}\n @if (settingsPolicy(); as sentence) {\n <span class=\"muted block\">{{ sentence }}</span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.agents.version-label' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.agents.version' | translate: { version: settings.version } }}\n @if (!settings.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </dd>\n </dl>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.rights' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.run-config.settings.edit' | translate }}\n </button>\n @if (isConfirming('remove-settings', config.agentId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSettings()\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-settings', config.agentId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.run-config.settings.remove' | translate }}\n </button>\n }\n </div>\n @if (failed('settings')) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n } @else {\n <div class=\"state\" data-setup-offer>\n <p>{{ 'nh-assistant.admin.run-config.settings.empty' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"primary\" type=\"button\" data-open-form=\"setup\" [disabled]=\"busy()\" (click)=\"openSetup()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.setup.start' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n {{ 'nh-assistant.admin.run-config.settings.add' | translate }}\n </button>\n </div>\n </div>\n }\n </section>\n }\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-skills-title'\" data-skills>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-skills-title'\">{{ 'nh-assistant.admin.agents.skills.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"skill\" [disabled]=\"busy() || !canAddRunData() || form() === 'skill'\" (click)=\"addSkill()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.skills.add' | translate }}\n </button>\n </header>\n @if (!canAddRunData()) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.needs-settings' | translate }}</p>\n }\n\n @if (form() === 'skill') {\n <nh-assistant-skill-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [skill]=\"editingSkill()\"\n [takenIds]=\"skillIds()\"\n (saved)=\"onSkillSaved($event)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeSkills.length === 0 && config.dataSkills.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.skills.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (skill of config.codeSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-code-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n </div>\n <p class=\"muted\">{{ skillDescriptionKeys(config.agentId, skill.skillId) | nhAssistantTranslate: skill.description }}</p>\n </li>\n }\n @for (skill of config.dataSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-data-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: skill.version } }}</span>\n @if (!skill.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n @if (skill.candidate) {\n <span class=\"badge warning\" data-candidate-badge>{{ 'nh-assistant.admin.run-config.candidate.badge' | translate: { version: skill.candidate.version } }}</span>\n }\n </div>\n <p class=\"muted\">{{ skill.description }}</p>\n @for (warning of skill.warnings ?? []; track warning) {\n <p class=\"message warning\" [attr.data-skill-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n <div class=\"meta\">\n <span>{{ skill.ruleHandler ? ('nh-assistant.admin.run-config.rule-handler-value' | translate: { name: skill.ruleHandler }) : ('nh-assistant.admin.run-config.model' | translate) }}</span>\n @if (skill.profile) {\n <span>{{ 'nh-assistant.admin.run-config.profile-value' | translate: { name: skill.profile } }}</span>\n }\n <span>{{ (skill.tools.length === 1 ? 'nh-assistant.admin.agents.tool-count-one' : 'nh-assistant.admin.agents.tool-count') | translate: { count: skill.tools.length } }}</span>\n <span [attr.title]=\"accountTitle(skill.changedBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(skill.changedBy), date: (skill.changedAt | date: 'medium') } }}</span>\n </div>\n @if (skill.candidate; as candidate) {\n <div class=\"subsection\" data-candidate>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.explain' | translate: { version: candidate.version, description: candidate.description } }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"comparison()?.skillId === skill.skillId\" (click)=\"toggleComparison(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.candidate.compare' | translate }}\n </button>\n @if (isConfirming('promote', skill.skillId)) {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy()\" (click)=\"promote(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-promote' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else if (isConfirming('discard', skill.skillId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"discard(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-discard' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('promote', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.promote' | translate }}</button>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('discard', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.discard' | translate }}</button>\n }\n </div>\n @if (comparison(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.result; as result) {\n <div class=\"table-scroll\">\n <table class=\"summary-table\" data-comparison>\n <caption class=\"visually-hidden\">{{ 'nh-assistant.admin.run-config.candidate.comparison' | translate: { skill: (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) } }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ 'nh-assistant.admin.evaluation.columns.measure' | translate }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.live-column' | translate: { version: result.live.version } }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.candidate-column' | translate: { version: result.candidate.version } }}</th>\n </tr>\n </thead>\n <tbody>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.runs' | translate }}</th><td>{{ result.live.runs | number }}</td><td>{{ result.candidate.runs | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.completed' | translate }}</th><td>{{ result.live.completed | number }}</td><td>{{ result.candidate.completed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.failed' | translate }}</th><td>{{ result.live.failed | number }}</td><td>{{ result.candidate.failed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.proposals' | translate }}</th><td>{{ result.live.proposals | number }}</td><td>{{ result.candidate.proposals | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.tokens' | translate }}</th><td>{{ result.live.tokens | number }}</td><td>{{ result.candidate.tokens | number }}</td></tr>\n </tbody>\n </table>\n </div>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.paired' | translate: { count: result.pairedEvents, date: (result.from | date: 'medium') } }}</p>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </div>\n }\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editSkill(skill)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"versions()?.skillId === skill.skillId\" (click)=\"toggleVersions(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.skills.versions' | translate }}\n </button>\n @if (isConfirming('remove-skill', skill.skillId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSkill(skill)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-skill', skill.skillId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('skill:' + skill.skillId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n @if (versions(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.items; as items) {\n <ul class=\"history\" data-versions>\n @for (version of items; track version.version) {\n <li>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: version.version } }}</span>\n <span class=\"badge\" [class.success]=\"version.status === 'live'\" [class.warning]=\"version.status === 'candidate'\">{{ 'nh-assistant.admin.run-config.status.' + version.status | translate }}</span>\n <span>{{ version.description }}</span>\n <span class=\"muted\" [attr.title]=\"accountTitle(version.createdBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(version.createdBy), date: (version.createdAt | date: 'medium') } }}</span>\n @if (version.reason) {\n <span class=\"muted\">{{ 'nh-assistant.admin.agents.state.reason' | translate: { reason: version.reason } }}</span>\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </li>\n }\n </ul>\n }\n </section>\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-triggers-title'\" data-triggers>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-triggers-title'\">{{ 'nh-assistant.admin.run-config.triggers.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"trigger\" [disabled]=\"busy() || !canAddRunData() || form() === 'trigger'\" (click)=\"addTrigger()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.triggers.add' | translate }}\n </button>\n </header>\n\n @if (form() === 'trigger') {\n <nh-assistant-trigger-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [skills]=\"skillOptions()\"\n [trigger]=\"editingTrigger()\"\n [takenIds]=\"triggerIds()\"\n (saved)=\"onTriggerSaved($event.added)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeTriggers.length === 0 && config.dataTriggers.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.triggers.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (trigger of config.codeTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-code-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n </div>\n @if (trigger.skillId) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.skill-value' | translate: { skill: skillName(trigger.skillId) } }}</p>\n }\n </li>\n }\n @for (trigger of config.dataTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-data-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n @if (trigger.shadow) {\n <span class=\"badge warning\" data-shadow-badge>{{ 'nh-assistant.admin.agents.shadow.badge' | translate }}</span>\n } @else {\n <span class=\"badge success\">{{ 'nh-assistant.admin.run-config.triggers.live-badge' | translate }}</span>\n }\n @if (!trigger.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </div>\n <div class=\"meta\">\n @if (trigger.source === 'event') {\n <span class=\"mono\">{{ trigger.event }}</span>\n } @else {\n <span class=\"mono\">{{ trigger.cron }} {{ trigger.timeZone ?? 'UTC' }}</span>\n @if (trigger.subjectSet) {\n <span class=\"mono\">{{ trigger.subjectSet }}</span>\n } @else {\n <!-- A schedule without a subject set runs for the whole application, per division for a per-division agent. -->\n <span data-trigger-target>{{ (agent().perDivision ? 'nh-assistant.admin.run-config.triggers.target.every-division' : 'nh-assistant.admin.run-config.triggers.target.application') | translate }}</span>\n }\n }\n <span>{{ (trigger.skillId ? 'nh-assistant.admin.run-config.triggers.skill-value' : 'nh-assistant.admin.run-config.triggers.agent-routes') | translate: { skill: skillName(trigger.skillId) } }}</span>\n <span>{{ 'nh-assistant.admin.run-config.triggers.conflicts.' + trigger.conflict | translate }}</span>\n <span>{{ 'nh-assistant.admin.agents.version' | translate: { version: trigger.version } }}</span>\n </div>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editTrigger(trigger)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.data-trigger-shadow]=\"trigger.shadow ? 'live' : 'shadow'\" [disabled]=\"busy()\" (click)=\"setTriggerShadow(trigger, !trigger.shadow)\">\n {{ (trigger.shadow ? 'nh-assistant.admin.agents.shadow.action.live' : 'nh-assistant.admin.agents.shadow.action.shadow') | translate }}\n </button>\n @if (isConfirming('remove-trigger', trigger.triggerId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeTrigger(trigger)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-trigger', trigger.triggerId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('trigger:' + trigger.triggerId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n</section>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", ".header-actions{display:flex;flex-wrap:wrap;gap:8px}.export-hint{margin-top:4px;font-size:12px}.filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));align-items:start;gap:12px}.subsection h4,.list-header h4{margin:0}.list-header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px}.table-container{container-type:inline-size;min-width:0}.summary-table{width:100%;border-collapse:collapse;font-size:13px}.summary-table th,.summary-table td{border-bottom:1px solid var(--nha-border);padding:8px 10px;text-align:left;vertical-align:top}.summary-table thead th{color:var(--nha-text-muted);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.summary-table tbody th{font-weight:600}.summary-table .number{text-align:right;font-variant-numeric:tabular-nums}.summary-table .mono{overflow-wrap:anywhere}@container (max-width: 820px){.summary-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.summary-table,.summary-table tbody,.summary-table tr{display:block}.summary-table tr{margin-bottom:8px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 12px;background:var(--nha-background)}.summary-table tbody th,.summary-table td{display:grid;grid-template-columns:minmax(110px,40%) minmax(0,1fr);gap:8px;border:0;padding:4px 0;text-align:left}.summary-table tbody th:before,.summary-table td:before{content:attr(data-label);color:var(--nha-text-muted);font-size:12px;font-weight:700}}.badges{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.badge .count{font-variant-numeric:tabular-nums;opacity:.85}.feedback-text{margin:0;border-left:3px solid var(--nha-border);padding:2px 0 2px 10px;font-size:13px;white-space:pre-wrap;overflow-wrap:anywhere}.proposal{margin:0;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}.proposal-label{margin-right:4px;color:var(--nha-text);font-weight:700}.pager{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: _NhAssistantIconComponent, selector: "nh-assistant-icon", inputs: ["name"] }, { kind: "component", type: NhAssistantAgentFlowComponent, selector: "nh-assistant-agent-flow", inputs: ["agent", "configuration", "catalog", "tools", "servers", "accountName", "busy"], outputs: ["entry"] }, { kind: "component", type: NhAssistantAgentWorkSetupComponent, selector: "nh-assistant-agent-work-setup", inputs: ["agentId", "agentName", "catalog", "worksOn", "toolSelectors", "toolCatalog", "takenSkillIds", "takenTriggerIds"], outputs: ["completed", "cancelled"] }, { kind: "component", type: NhAssistantRunSettingsFormComponent, selector: "nh-assistant-run-settings-form", inputs: ["agentId", "catalog", "settings"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantSkillFormComponent, selector: "nh-assistant-skill-form", inputs: ["agentId", "catalog", "toolSelectors", "toolCatalog", "skill", "takenIds"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantTriggerFormComponent, selector: "nh-assistant-trigger-form", inputs: ["agentId", "catalog", "worksOn", "skills", "trigger", "takenIds"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantAccountNamesErrorComponent, selector: "nh-assistant-account-names-error", inputs: ["names"] }, { kind: "component", type: NhAssistantAccountLabelComponent, selector: "nh-assistant-account-label", inputs: ["actorId", "name"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: _NhAssistantTranslatePipe, name: "nhAssistantTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3604
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.34", type: NhAssistantAgentRunConfigurationComponent, isStandalone: true, selector: "nh-assistant-agent-run-configuration", inputs: { agent: { classPropertyName: "agent", publicName: "agent", isSignal: true, isRequired: true, transformFunction: null }, startSetup: { classPropertyName: "startSetup", publicName: "startSetup", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: false, transformFunction: null }, servers: { classPropertyName: "servers", publicName: "servers", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", editAgent: "editAgent", changeAccount: "changeAccount", openRuns: "openRuns", openMcpServers: "openMcpServers" }, ngImport: i0, template: "<section class=\"section\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || busy()\">\n <header class=\"section-header\">\n <div>\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.admin.run-config.title' | translate: { name: agentName() } }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.description' | translate }}</p>\n </div>\n </header>\n\n @if (saved(); as key) {\n <p class=\"message success\" role=\"status\" tabindex=\"-1\" data-saved>{{ key | translate }}</p>\n <!-- The save succeeded; a warning says what may still keep the skill from working. -->\n @for (warning of savedWarnings(); track warning) {\n <p class=\"message warning\" role=\"status\" [attr.data-saved-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n }\n\n @if (loading() && !configuration()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.admin.retry' | translate }}</button>\n </div>\n } @else if (configuration(); as config) {\n <nh-assistant-account-names-error [names]=\"accountNames\" />\n @if (problems().length > 0) {\n <!-- Each problem shows at the step of the flow it concerns, with the form that fixes it. -->\n <p class=\"message warning\" role=\"status\" data-problems>\n <nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.admin.run-config.flow.problems' | translate }}\n </p>\n }\n\n <!-- The agent at a glance; the forms below change what each step shows. -->\n <nh-assistant-agent-flow\n [agent]=\"agent()\"\n [configuration]=\"config\"\n [catalog]=\"catalog()\"\n [tools]=\"tools()\"\n [servers]=\"servers()\"\n [accountName]=\"accountName()\"\n [busy]=\"busy()\"\n (entry)=\"onFlowEntry($event)\" />\n\n @if (config.source === 'admin') {\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-settings-title'\" data-run-settings>\n <header class=\"section-header\">\n <h4 [id]=\"id + '-settings-title'\">{{ 'nh-assistant.admin.run-config.settings.title' | translate }}</h4>\n </header>\n @if (form() === 'setup') {\n <nh-assistant-agent-work-setup\n [agentId]=\"config.agentId\"\n [agentName]=\"agentName()\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [takenSkillIds]=\"skillIds()\"\n [takenTriggerIds]=\"triggerIds()\"\n (completed)=\"onSetupCompleted($event.live)\"\n (cancelled)=\"cancel()\" />\n } @else if (form() === 'settings') {\n <nh-assistant-run-settings-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [settings]=\"config.runSettings\"\n (saved)=\"onSettingsSaved()\"\n (cancelled)=\"cancel()\" />\n } @else if (config.runSettings; as settings) {\n <dl class=\"review\" data-settings-summary>\n <dt>{{ 'nh-assistant.admin.run-config.settings.who.short' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.run-config.settings.accountability.' + settings.accountability | translate }}\n @if (settings.serviceAccountActorId; as accountId) {\n <span class=\"block\" data-account-name>\n <nh-assistant-account-label [actorId]=\"accountId\" [name]=\"accountName()\" />\n </span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.run-config.way-of-working' | translate }}</dt>\n <dd>{{ settings.ruleHandler ?? ('nh-assistant.admin.run-config.model' | translate) }}</dd>\n <dt>{{ 'nh-assistant.admin.run-config.approval-policy' | translate }}</dt>\n <dd>\n {{ settings.approvalPolicy ?? ('nh-assistant.admin.run-config.settings.approval.default' | translate) }}\n @if (settingsPolicy(); as sentence) {\n <span class=\"muted block\">{{ sentence }}</span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.agents.version-label' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.agents.version' | translate: { version: settings.version } }}\n @if (!settings.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </dd>\n </dl>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.rights' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.run-config.settings.edit' | translate }}\n </button>\n @if (isConfirming('remove-settings', config.agentId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSettings()\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-settings', config.agentId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.run-config.settings.remove' | translate }}\n </button>\n }\n </div>\n @if (failed('settings')) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n } @else {\n <div class=\"state\" data-setup-offer>\n <p>{{ 'nh-assistant.admin.run-config.settings.empty' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"primary\" type=\"button\" data-open-form=\"setup\" [disabled]=\"busy()\" (click)=\"openSetup()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.setup.start' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n {{ 'nh-assistant.admin.run-config.settings.add' | translate }}\n </button>\n </div>\n </div>\n }\n </section>\n }\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-skills-title'\" data-skills>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-skills-title'\">{{ 'nh-assistant.admin.agents.skills.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"skill\" [disabled]=\"busy() || !canAddRunData() || form() === 'skill'\" (click)=\"addSkill()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.skills.add' | translate }}\n </button>\n </header>\n @if (!canAddRunData()) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.needs-settings' | translate }}</p>\n }\n\n @if (form() === 'skill') {\n <nh-assistant-skill-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [skill]=\"editingSkill()\"\n [takenIds]=\"skillIds()\"\n (saved)=\"onSkillSaved($event)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeSkills.length === 0 && config.dataSkills.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.skills.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (skill of config.codeSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-code-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n </div>\n <p class=\"muted\">{{ skillDescriptionKeys(config.agentId, skill.skillId) | nhAssistantTranslate: skill.description }}</p>\n </li>\n }\n @for (skill of config.dataSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-data-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: skill.version } }}</span>\n @if (!skill.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n @if (skill.candidate) {\n <span class=\"badge warning\" data-candidate-badge>{{ 'nh-assistant.admin.run-config.candidate.badge' | translate: { version: skill.candidate.version } }}</span>\n }\n </div>\n <p class=\"muted\">{{ skill.description }}</p>\n @for (warning of skill.warnings ?? []; track warning) {\n <p class=\"message warning\" [attr.data-skill-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n <div class=\"meta\">\n <span>{{ skill.ruleHandler ? ('nh-assistant.admin.run-config.rule-handler-value' | translate: { name: skill.ruleHandler }) : ('nh-assistant.admin.run-config.model' | translate) }}</span>\n @if (skill.profile) {\n <span>{{ 'nh-assistant.admin.run-config.profile-value' | translate: { name: skill.profile } }}</span>\n }\n <span>{{ (skill.tools.length === 1 ? 'nh-assistant.admin.agents.tool-count-one' : 'nh-assistant.admin.agents.tool-count') | translate: { count: skill.tools.length } }}</span>\n <span [attr.title]=\"accountTitle(skill.changedBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(skill.changedBy), date: (skill.changedAt | date: 'medium') } }}</span>\n </div>\n @if (skill.candidate; as candidate) {\n <div class=\"subsection\" data-candidate>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.explain' | translate: { version: candidate.version, description: candidate.description } }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"comparison()?.skillId === skill.skillId\" (click)=\"toggleComparison(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.candidate.compare' | translate }}\n </button>\n @if (isConfirming('promote', skill.skillId)) {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy()\" (click)=\"promote(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-promote' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else if (isConfirming('discard', skill.skillId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"discard(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-discard' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('promote', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.promote' | translate }}</button>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('discard', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.discard' | translate }}</button>\n }\n </div>\n @if (comparison(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.result; as result) {\n <div class=\"table-scroll\">\n <table class=\"summary-table\" data-comparison>\n <caption class=\"visually-hidden\">{{ 'nh-assistant.admin.run-config.candidate.comparison' | translate: { skill: (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) } }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ 'nh-assistant.admin.evaluation.columns.measure' | translate }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.live-column' | translate: { version: result.live.version } }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.candidate-column' | translate: { version: result.candidate.version } }}</th>\n </tr>\n </thead>\n <tbody>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.runs' | translate }}</th><td>{{ result.live.runs | number }}</td><td>{{ result.candidate.runs | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.completed' | translate }}</th><td>{{ result.live.completed | number }}</td><td>{{ result.candidate.completed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.failed' | translate }}</th><td>{{ result.live.failed | number }}</td><td>{{ result.candidate.failed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.proposals' | translate }}</th><td>{{ result.live.proposals | number }}</td><td>{{ result.candidate.proposals | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.tokens' | translate }}</th><td>{{ result.live.tokens | number }}</td><td>{{ result.candidate.tokens | number }}</td></tr>\n </tbody>\n </table>\n </div>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.paired' | translate: { count: result.pairedEvents, date: (result.from | date: 'medium') } }}</p>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </div>\n }\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editSkill(skill)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"versions()?.skillId === skill.skillId\" (click)=\"toggleVersions(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.skills.versions' | translate }}\n </button>\n @if (isConfirming('remove-skill', skill.skillId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSkill(skill)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-skill', skill.skillId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('skill:' + skill.skillId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n @if (versions(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.items; as items) {\n <ul class=\"history\" data-versions>\n @for (version of items; track version.version) {\n <li>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: version.version } }}</span>\n <span class=\"badge\" [class.success]=\"version.status === 'live'\" [class.warning]=\"version.status === 'candidate'\">{{ 'nh-assistant.admin.run-config.status.' + version.status | translate }}</span>\n <span>{{ version.description }}</span>\n <span class=\"muted\" [attr.title]=\"accountTitle(version.createdBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(version.createdBy), date: (version.createdAt | date: 'medium') } }}</span>\n @if (version.reason) {\n <span class=\"muted\">{{ 'nh-assistant.admin.agents.state.reason' | translate: { reason: version.reason } }}</span>\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </li>\n }\n </ul>\n }\n </section>\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-triggers-title'\" data-triggers>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-triggers-title'\">{{ 'nh-assistant.admin.run-config.triggers.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"trigger\" [disabled]=\"busy() || !canAddRunData() || form() === 'trigger'\" (click)=\"addTrigger()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.triggers.add' | translate }}\n </button>\n </header>\n\n @if (form() === 'trigger') {\n <nh-assistant-trigger-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [skills]=\"skillOptions()\"\n [trigger]=\"editingTrigger()\"\n [takenIds]=\"triggerIds()\"\n (saved)=\"onTriggerSaved($event.added)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeTriggers.length === 0 && config.dataTriggers.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.triggers.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (trigger of config.codeTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-code-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n </div>\n @if (trigger.skillId) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.skill-value' | translate: { skill: skillName(trigger.skillId) } }}</p>\n }\n </li>\n }\n @for (trigger of config.dataTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-data-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n @if (trigger.shadow) {\n <span class=\"badge warning\" data-shadow-badge>{{ 'nh-assistant.admin.agents.shadow.badge' | translate }}</span>\n } @else {\n <span class=\"badge success\">{{ 'nh-assistant.admin.run-config.triggers.live-badge' | translate }}</span>\n }\n @if (!trigger.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </div>\n <div class=\"meta\">\n @if (trigger.source === 'event') {\n <span class=\"mono\">{{ trigger.event }}</span>\n @if (trigger.filters?.length) {\n <span data-trigger-filters>{{ 'nh-assistant.admin.run-config.triggers.filters.applied' | translate: { filters: trigger.filters!.join(', ') } }}</span>\n }\n } @else {\n <span class=\"mono\">{{ trigger.cron }} {{ trigger.timeZone ?? 'UTC' }}</span>\n @if (trigger.subjectSet) {\n <span class=\"mono\">{{ trigger.subjectSet }}</span>\n } @else {\n <!-- A schedule without a subject set runs for the whole application, per division for a per-division agent. -->\n <span data-trigger-target>{{ (agent().perDivision ? 'nh-assistant.admin.run-config.triggers.target.every-division' : 'nh-assistant.admin.run-config.triggers.target.application') | translate }}</span>\n }\n }\n <span>{{ (trigger.skillId ? 'nh-assistant.admin.run-config.triggers.skill-value' : 'nh-assistant.admin.run-config.triggers.agent-routes') | translate: { skill: skillName(trigger.skillId) } }}</span>\n <span>{{ 'nh-assistant.admin.run-config.triggers.conflicts.' + trigger.conflict | translate }}</span>\n <span>{{ 'nh-assistant.admin.agents.version' | translate: { version: trigger.version } }}</span>\n </div>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editTrigger(trigger)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.data-trigger-shadow]=\"trigger.shadow ? 'live' : 'shadow'\" [disabled]=\"busy()\" (click)=\"setTriggerShadow(trigger, !trigger.shadow)\">\n {{ (trigger.shadow ? 'nh-assistant.admin.agents.shadow.action.live' : 'nh-assistant.admin.agents.shadow.action.shadow') | translate }}\n </button>\n @if (isConfirming('remove-trigger', trigger.triggerId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeTrigger(trigger)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-trigger', trigger.triggerId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('trigger:' + trigger.triggerId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n</section>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", ".header-actions{display:flex;flex-wrap:wrap;gap:8px}.export-hint{margin-top:4px;font-size:12px}.filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));align-items:start;gap:12px}.subsection h4,.list-header h4{margin:0}.list-header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px}.table-container{container-type:inline-size;min-width:0}.summary-table{width:100%;border-collapse:collapse;font-size:13px}.summary-table th,.summary-table td{border-bottom:1px solid var(--nha-border);padding:8px 10px;text-align:left;vertical-align:top}.summary-table thead th{color:var(--nha-text-muted);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.summary-table tbody th{font-weight:600}.summary-table .number{text-align:right;font-variant-numeric:tabular-nums}.summary-table .mono{overflow-wrap:anywhere}@container (max-width: 820px){.summary-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.summary-table,.summary-table tbody,.summary-table tr{display:block}.summary-table tr{margin-bottom:8px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 12px;background:var(--nha-background)}.summary-table tbody th,.summary-table td{display:grid;grid-template-columns:minmax(110px,40%) minmax(0,1fr);gap:8px;border:0;padding:4px 0;text-align:left}.summary-table tbody th:before,.summary-table td:before{content:attr(data-label);color:var(--nha-text-muted);font-size:12px;font-weight:700}}.badges{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.badge .count{font-variant-numeric:tabular-nums;opacity:.85}.feedback-text{margin:0;border-left:3px solid var(--nha-border);padding:2px 0 2px 10px;font-size:13px;white-space:pre-wrap;overflow-wrap:anywhere}.proposal{margin:0;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}.proposal-label{margin-right:4px;color:var(--nha-text);font-weight:700}.pager{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: _NhAssistantIconComponent, selector: "nh-assistant-icon", inputs: ["name"] }, { kind: "component", type: NhAssistantAgentFlowComponent, selector: "nh-assistant-agent-flow", inputs: ["agent", "configuration", "catalog", "tools", "servers", "accountName", "busy"], outputs: ["entry"] }, { kind: "component", type: NhAssistantAgentWorkSetupComponent, selector: "nh-assistant-agent-work-setup", inputs: ["agentId", "agentName", "catalog", "worksOn", "toolSelectors", "toolCatalog", "takenSkillIds", "takenTriggerIds"], outputs: ["completed", "cancelled"] }, { kind: "component", type: NhAssistantRunSettingsFormComponent, selector: "nh-assistant-run-settings-form", inputs: ["agentId", "catalog", "settings"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantSkillFormComponent, selector: "nh-assistant-skill-form", inputs: ["agentId", "catalog", "toolSelectors", "toolCatalog", "skill", "takenIds"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantTriggerFormComponent, selector: "nh-assistant-trigger-form", inputs: ["agentId", "catalog", "worksOn", "skills", "trigger", "takenIds"], outputs: ["saved", "cancelled"] }, { kind: "component", type: NhAssistantAccountNamesErrorComponent, selector: "nh-assistant-account-names-error", inputs: ["names"] }, { kind: "component", type: NhAssistantAccountLabelComponent, selector: "nh-assistant-account-label", inputs: ["actorId", "name"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: _NhAssistantTranslatePipe, name: "nhAssistantTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3559
3605
  }
3560
3606
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.34", ngImport: i0, type: NhAssistantAgentRunConfigurationComponent, decorators: [{
3561
3607
  type: Component,
@@ -3572,7 +3618,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.34", ngImpo
3572
3618
  NhAssistantTriggerFormComponent,
3573
3619
  NhAssistantAccountNamesErrorComponent,
3574
3620
  NhAssistantAccountLabelComponent
3575
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"section\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || busy()\">\n <header class=\"section-header\">\n <div>\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.admin.run-config.title' | translate: { name: agentName() } }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.description' | translate }}</p>\n </div>\n </header>\n\n @if (saved(); as key) {\n <p class=\"message success\" role=\"status\" tabindex=\"-1\" data-saved>{{ key | translate }}</p>\n <!-- The save succeeded; a warning says what may still keep the skill from working. -->\n @for (warning of savedWarnings(); track warning) {\n <p class=\"message warning\" role=\"status\" [attr.data-saved-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n }\n\n @if (loading() && !configuration()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.admin.retry' | translate }}</button>\n </div>\n } @else if (configuration(); as config) {\n <nh-assistant-account-names-error [names]=\"accountNames\" />\n @if (problems().length > 0) {\n <!-- Each problem shows at the step of the flow it concerns, with the form that fixes it. -->\n <p class=\"message warning\" role=\"status\" data-problems>\n <nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.admin.run-config.flow.problems' | translate }}\n </p>\n }\n\n <!-- The agent at a glance; the forms below change what each step shows. -->\n <nh-assistant-agent-flow\n [agent]=\"agent()\"\n [configuration]=\"config\"\n [catalog]=\"catalog()\"\n [tools]=\"tools()\"\n [servers]=\"servers()\"\n [accountName]=\"accountName()\"\n [busy]=\"busy()\"\n (entry)=\"onFlowEntry($event)\" />\n\n @if (config.source === 'admin') {\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-settings-title'\" data-run-settings>\n <header class=\"section-header\">\n <h4 [id]=\"id + '-settings-title'\">{{ 'nh-assistant.admin.run-config.settings.title' | translate }}</h4>\n </header>\n @if (form() === 'setup') {\n <nh-assistant-agent-work-setup\n [agentId]=\"config.agentId\"\n [agentName]=\"agentName()\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [takenSkillIds]=\"skillIds()\"\n [takenTriggerIds]=\"triggerIds()\"\n (completed)=\"onSetupCompleted($event.live)\"\n (cancelled)=\"cancel()\" />\n } @else if (form() === 'settings') {\n <nh-assistant-run-settings-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [settings]=\"config.runSettings\"\n (saved)=\"onSettingsSaved()\"\n (cancelled)=\"cancel()\" />\n } @else if (config.runSettings; as settings) {\n <dl class=\"review\" data-settings-summary>\n <dt>{{ 'nh-assistant.admin.run-config.settings.who.short' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.run-config.settings.accountability.' + settings.accountability | translate }}\n @if (settings.serviceAccountActorId; as accountId) {\n <span class=\"block\" data-account-name>\n <nh-assistant-account-label [actorId]=\"accountId\" [name]=\"accountName()\" />\n </span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.run-config.way-of-working' | translate }}</dt>\n <dd>{{ settings.ruleHandler ?? ('nh-assistant.admin.run-config.model' | translate) }}</dd>\n <dt>{{ 'nh-assistant.admin.run-config.approval-policy' | translate }}</dt>\n <dd>\n {{ settings.approvalPolicy ?? ('nh-assistant.admin.run-config.settings.approval.default' | translate) }}\n @if (settingsPolicy(); as sentence) {\n <span class=\"muted block\">{{ sentence }}</span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.agents.version-label' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.agents.version' | translate: { version: settings.version } }}\n @if (!settings.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </dd>\n </dl>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.rights' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.run-config.settings.edit' | translate }}\n </button>\n @if (isConfirming('remove-settings', config.agentId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSettings()\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-settings', config.agentId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.run-config.settings.remove' | translate }}\n </button>\n }\n </div>\n @if (failed('settings')) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n } @else {\n <div class=\"state\" data-setup-offer>\n <p>{{ 'nh-assistant.admin.run-config.settings.empty' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"primary\" type=\"button\" data-open-form=\"setup\" [disabled]=\"busy()\" (click)=\"openSetup()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.setup.start' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n {{ 'nh-assistant.admin.run-config.settings.add' | translate }}\n </button>\n </div>\n </div>\n }\n </section>\n }\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-skills-title'\" data-skills>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-skills-title'\">{{ 'nh-assistant.admin.agents.skills.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"skill\" [disabled]=\"busy() || !canAddRunData() || form() === 'skill'\" (click)=\"addSkill()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.skills.add' | translate }}\n </button>\n </header>\n @if (!canAddRunData()) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.needs-settings' | translate }}</p>\n }\n\n @if (form() === 'skill') {\n <nh-assistant-skill-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [skill]=\"editingSkill()\"\n [takenIds]=\"skillIds()\"\n (saved)=\"onSkillSaved($event)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeSkills.length === 0 && config.dataSkills.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.skills.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (skill of config.codeSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-code-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n </div>\n <p class=\"muted\">{{ skillDescriptionKeys(config.agentId, skill.skillId) | nhAssistantTranslate: skill.description }}</p>\n </li>\n }\n @for (skill of config.dataSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-data-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: skill.version } }}</span>\n @if (!skill.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n @if (skill.candidate) {\n <span class=\"badge warning\" data-candidate-badge>{{ 'nh-assistant.admin.run-config.candidate.badge' | translate: { version: skill.candidate.version } }}</span>\n }\n </div>\n <p class=\"muted\">{{ skill.description }}</p>\n @for (warning of skill.warnings ?? []; track warning) {\n <p class=\"message warning\" [attr.data-skill-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n <div class=\"meta\">\n <span>{{ skill.ruleHandler ? ('nh-assistant.admin.run-config.rule-handler-value' | translate: { name: skill.ruleHandler }) : ('nh-assistant.admin.run-config.model' | translate) }}</span>\n @if (skill.profile) {\n <span>{{ 'nh-assistant.admin.run-config.profile-value' | translate: { name: skill.profile } }}</span>\n }\n <span>{{ (skill.tools.length === 1 ? 'nh-assistant.admin.agents.tool-count-one' : 'nh-assistant.admin.agents.tool-count') | translate: { count: skill.tools.length } }}</span>\n <span [attr.title]=\"accountTitle(skill.changedBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(skill.changedBy), date: (skill.changedAt | date: 'medium') } }}</span>\n </div>\n @if (skill.candidate; as candidate) {\n <div class=\"subsection\" data-candidate>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.explain' | translate: { version: candidate.version, description: candidate.description } }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"comparison()?.skillId === skill.skillId\" (click)=\"toggleComparison(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.candidate.compare' | translate }}\n </button>\n @if (isConfirming('promote', skill.skillId)) {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy()\" (click)=\"promote(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-promote' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else if (isConfirming('discard', skill.skillId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"discard(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-discard' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('promote', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.promote' | translate }}</button>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('discard', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.discard' | translate }}</button>\n }\n </div>\n @if (comparison(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.result; as result) {\n <div class=\"table-scroll\">\n <table class=\"summary-table\" data-comparison>\n <caption class=\"visually-hidden\">{{ 'nh-assistant.admin.run-config.candidate.comparison' | translate: { skill: (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) } }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ 'nh-assistant.admin.evaluation.columns.measure' | translate }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.live-column' | translate: { version: result.live.version } }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.candidate-column' | translate: { version: result.candidate.version } }}</th>\n </tr>\n </thead>\n <tbody>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.runs' | translate }}</th><td>{{ result.live.runs | number }}</td><td>{{ result.candidate.runs | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.completed' | translate }}</th><td>{{ result.live.completed | number }}</td><td>{{ result.candidate.completed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.failed' | translate }}</th><td>{{ result.live.failed | number }}</td><td>{{ result.candidate.failed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.proposals' | translate }}</th><td>{{ result.live.proposals | number }}</td><td>{{ result.candidate.proposals | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.tokens' | translate }}</th><td>{{ result.live.tokens | number }}</td><td>{{ result.candidate.tokens | number }}</td></tr>\n </tbody>\n </table>\n </div>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.paired' | translate: { count: result.pairedEvents, date: (result.from | date: 'medium') } }}</p>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </div>\n }\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editSkill(skill)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"versions()?.skillId === skill.skillId\" (click)=\"toggleVersions(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.skills.versions' | translate }}\n </button>\n @if (isConfirming('remove-skill', skill.skillId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSkill(skill)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-skill', skill.skillId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('skill:' + skill.skillId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n @if (versions(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.items; as items) {\n <ul class=\"history\" data-versions>\n @for (version of items; track version.version) {\n <li>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: version.version } }}</span>\n <span class=\"badge\" [class.success]=\"version.status === 'live'\" [class.warning]=\"version.status === 'candidate'\">{{ 'nh-assistant.admin.run-config.status.' + version.status | translate }}</span>\n <span>{{ version.description }}</span>\n <span class=\"muted\" [attr.title]=\"accountTitle(version.createdBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(version.createdBy), date: (version.createdAt | date: 'medium') } }}</span>\n @if (version.reason) {\n <span class=\"muted\">{{ 'nh-assistant.admin.agents.state.reason' | translate: { reason: version.reason } }}</span>\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </li>\n }\n </ul>\n }\n </section>\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-triggers-title'\" data-triggers>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-triggers-title'\">{{ 'nh-assistant.admin.run-config.triggers.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"trigger\" [disabled]=\"busy() || !canAddRunData() || form() === 'trigger'\" (click)=\"addTrigger()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.triggers.add' | translate }}\n </button>\n </header>\n\n @if (form() === 'trigger') {\n <nh-assistant-trigger-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [skills]=\"skillOptions()\"\n [trigger]=\"editingTrigger()\"\n [takenIds]=\"triggerIds()\"\n (saved)=\"onTriggerSaved($event.added)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeTriggers.length === 0 && config.dataTriggers.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.triggers.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (trigger of config.codeTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-code-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n </div>\n @if (trigger.skillId) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.skill-value' | translate: { skill: skillName(trigger.skillId) } }}</p>\n }\n </li>\n }\n @for (trigger of config.dataTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-data-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n @if (trigger.shadow) {\n <span class=\"badge warning\" data-shadow-badge>{{ 'nh-assistant.admin.agents.shadow.badge' | translate }}</span>\n } @else {\n <span class=\"badge success\">{{ 'nh-assistant.admin.run-config.triggers.live-badge' | translate }}</span>\n }\n @if (!trigger.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </div>\n <div class=\"meta\">\n @if (trigger.source === 'event') {\n <span class=\"mono\">{{ trigger.event }}</span>\n } @else {\n <span class=\"mono\">{{ trigger.cron }} {{ trigger.timeZone ?? 'UTC' }}</span>\n @if (trigger.subjectSet) {\n <span class=\"mono\">{{ trigger.subjectSet }}</span>\n } @else {\n <!-- A schedule without a subject set runs for the whole application, per division for a per-division agent. -->\n <span data-trigger-target>{{ (agent().perDivision ? 'nh-assistant.admin.run-config.triggers.target.every-division' : 'nh-assistant.admin.run-config.triggers.target.application') | translate }}</span>\n }\n }\n <span>{{ (trigger.skillId ? 'nh-assistant.admin.run-config.triggers.skill-value' : 'nh-assistant.admin.run-config.triggers.agent-routes') | translate: { skill: skillName(trigger.skillId) } }}</span>\n <span>{{ 'nh-assistant.admin.run-config.triggers.conflicts.' + trigger.conflict | translate }}</span>\n <span>{{ 'nh-assistant.admin.agents.version' | translate: { version: trigger.version } }}</span>\n </div>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editTrigger(trigger)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.data-trigger-shadow]=\"trigger.shadow ? 'live' : 'shadow'\" [disabled]=\"busy()\" (click)=\"setTriggerShadow(trigger, !trigger.shadow)\">\n {{ (trigger.shadow ? 'nh-assistant.admin.agents.shadow.action.live' : 'nh-assistant.admin.agents.shadow.action.shadow') | translate }}\n </button>\n @if (isConfirming('remove-trigger', trigger.triggerId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeTrigger(trigger)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-trigger', trigger.triggerId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('trigger:' + trigger.triggerId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n</section>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", ".header-actions{display:flex;flex-wrap:wrap;gap:8px}.export-hint{margin-top:4px;font-size:12px}.filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));align-items:start;gap:12px}.subsection h4,.list-header h4{margin:0}.list-header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px}.table-container{container-type:inline-size;min-width:0}.summary-table{width:100%;border-collapse:collapse;font-size:13px}.summary-table th,.summary-table td{border-bottom:1px solid var(--nha-border);padding:8px 10px;text-align:left;vertical-align:top}.summary-table thead th{color:var(--nha-text-muted);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.summary-table tbody th{font-weight:600}.summary-table .number{text-align:right;font-variant-numeric:tabular-nums}.summary-table .mono{overflow-wrap:anywhere}@container (max-width: 820px){.summary-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.summary-table,.summary-table tbody,.summary-table tr{display:block}.summary-table tr{margin-bottom:8px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 12px;background:var(--nha-background)}.summary-table tbody th,.summary-table td{display:grid;grid-template-columns:minmax(110px,40%) minmax(0,1fr);gap:8px;border:0;padding:4px 0;text-align:left}.summary-table tbody th:before,.summary-table td:before{content:attr(data-label);color:var(--nha-text-muted);font-size:12px;font-weight:700}}.badges{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.badge .count{font-variant-numeric:tabular-nums;opacity:.85}.feedback-text{margin:0;border-left:3px solid var(--nha-border);padding:2px 0 2px 10px;font-size:13px;white-space:pre-wrap;overflow-wrap:anywhere}.proposal{margin:0;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}.proposal-label{margin-right:4px;color:var(--nha-text);font-weight:700}.pager{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"] }]
3621
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"section\" [attr.aria-labelledby]=\"id + '-title'\" [attr.aria-busy]=\"loading() || busy()\">\n <header class=\"section-header\">\n <div>\n <h3 [id]=\"id + '-title'\">{{ 'nh-assistant.admin.run-config.title' | translate: { name: agentName() } }}</h3>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.description' | translate }}</p>\n </div>\n </header>\n\n @if (saved(); as key) {\n <p class=\"message success\" role=\"status\" tabindex=\"-1\" data-saved>{{ key | translate }}</p>\n <!-- The save succeeded; a warning says what may still keep the skill from working. -->\n @for (warning of savedWarnings(); track warning) {\n <p class=\"message warning\" role=\"status\" [attr.data-saved-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n }\n\n @if (loading() && !configuration()) {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n } @else if (loadFailed()) {\n <div class=\"state\" role=\"alert\">\n <p>{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n <button class=\"secondary\" type=\"button\" (click)=\"load()\">{{ 'nh-assistant.admin.retry' | translate }}</button>\n </div>\n } @else if (configuration(); as config) {\n <nh-assistant-account-names-error [names]=\"accountNames\" />\n @if (problems().length > 0) {\n <!-- Each problem shows at the step of the flow it concerns, with the form that fixes it. -->\n <p class=\"message warning\" role=\"status\" data-problems>\n <nh-assistant-icon name=\"warning\" />{{ 'nh-assistant.admin.run-config.flow.problems' | translate }}\n </p>\n }\n\n <!-- The agent at a glance; the forms below change what each step shows. -->\n <nh-assistant-agent-flow\n [agent]=\"agent()\"\n [configuration]=\"config\"\n [catalog]=\"catalog()\"\n [tools]=\"tools()\"\n [servers]=\"servers()\"\n [accountName]=\"accountName()\"\n [busy]=\"busy()\"\n (entry)=\"onFlowEntry($event)\" />\n\n @if (config.source === 'admin') {\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-settings-title'\" data-run-settings>\n <header class=\"section-header\">\n <h4 [id]=\"id + '-settings-title'\">{{ 'nh-assistant.admin.run-config.settings.title' | translate }}</h4>\n </header>\n @if (form() === 'setup') {\n <nh-assistant-agent-work-setup\n [agentId]=\"config.agentId\"\n [agentName]=\"agentName()\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [takenSkillIds]=\"skillIds()\"\n [takenTriggerIds]=\"triggerIds()\"\n (completed)=\"onSetupCompleted($event.live)\"\n (cancelled)=\"cancel()\" />\n } @else if (form() === 'settings') {\n <nh-assistant-run-settings-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [settings]=\"config.runSettings\"\n (saved)=\"onSettingsSaved()\"\n (cancelled)=\"cancel()\" />\n } @else if (config.runSettings; as settings) {\n <dl class=\"review\" data-settings-summary>\n <dt>{{ 'nh-assistant.admin.run-config.settings.who.short' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.run-config.settings.accountability.' + settings.accountability | translate }}\n @if (settings.serviceAccountActorId; as accountId) {\n <span class=\"block\" data-account-name>\n <nh-assistant-account-label [actorId]=\"accountId\" [name]=\"accountName()\" />\n </span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.run-config.way-of-working' | translate }}</dt>\n <dd>{{ settings.ruleHandler ?? ('nh-assistant.admin.run-config.model' | translate) }}</dd>\n <dt>{{ 'nh-assistant.admin.run-config.approval-policy' | translate }}</dt>\n <dd>\n {{ settings.approvalPolicy ?? ('nh-assistant.admin.run-config.settings.approval.default' | translate) }}\n @if (settingsPolicy(); as sentence) {\n <span class=\"muted block\">{{ sentence }}</span>\n }\n </dd>\n <dt>{{ 'nh-assistant.admin.agents.version-label' | translate }}</dt>\n <dd>\n {{ 'nh-assistant.admin.agents.version' | translate: { version: settings.version } }}\n @if (!settings.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </dd>\n </dl>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.rights' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.run-config.settings.edit' | translate }}\n </button>\n @if (isConfirming('remove-settings', config.agentId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.settings.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSettings()\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-settings', config.agentId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.run-config.settings.remove' | translate }}\n </button>\n }\n </div>\n @if (failed('settings')) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n } @else {\n <div class=\"state\" data-setup-offer>\n <p>{{ 'nh-assistant.admin.run-config.settings.empty' | translate }}</p>\n <div class=\"card-actions\">\n <button class=\"primary\" type=\"button\" data-open-form=\"setup\" [disabled]=\"busy()\" (click)=\"openSetup()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.setup.start' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" data-open-form=\"settings\" [disabled]=\"busy()\" (click)=\"editSettings()\">\n {{ 'nh-assistant.admin.run-config.settings.add' | translate }}\n </button>\n </div>\n </div>\n }\n </section>\n }\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-skills-title'\" data-skills>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-skills-title'\">{{ 'nh-assistant.admin.agents.skills.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"skill\" [disabled]=\"busy() || !canAddRunData() || form() === 'skill'\" (click)=\"addSkill()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.skills.add' | translate }}\n </button>\n </header>\n @if (!canAddRunData()) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.needs-settings' | translate }}</p>\n }\n\n @if (form() === 'skill') {\n <nh-assistant-skill-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [toolSelectors]=\"config.toolSelectors\"\n [toolCatalog]=\"tools()\"\n [skill]=\"editingSkill()\"\n [takenIds]=\"skillIds()\"\n (saved)=\"onSkillSaved($event)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeSkills.length === 0 && config.dataSkills.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.skills.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (skill of config.codeSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-code-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n </div>\n <p class=\"muted\">{{ skillDescriptionKeys(config.agentId, skill.skillId) | nhAssistantTranslate: skill.description }}</p>\n </li>\n }\n @for (skill of config.dataSkills; track skill.skillId) {\n <li class=\"skill\" [attr.data-data-skill]=\"skill.skillId\">\n <div class=\"card-header\">\n <strong>{{ (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) }}</strong>\n <span class=\"mono muted\">{{ skill.skillId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: skill.version } }}</span>\n @if (!skill.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n @if (skill.candidate) {\n <span class=\"badge warning\" data-candidate-badge>{{ 'nh-assistant.admin.run-config.candidate.badge' | translate: { version: skill.candidate.version } }}</span>\n }\n </div>\n <p class=\"muted\">{{ skill.description }}</p>\n @for (warning of skill.warnings ?? []; track warning) {\n <p class=\"message warning\" [attr.data-skill-warning]=\"warning\">\n <nh-assistant-icon name=\"warning\" />{{ warningKeys('skill', warning) | nhAssistantTranslate: warning }}\n </p>\n }\n <div class=\"meta\">\n <span>{{ skill.ruleHandler ? ('nh-assistant.admin.run-config.rule-handler-value' | translate: { name: skill.ruleHandler }) : ('nh-assistant.admin.run-config.model' | translate) }}</span>\n @if (skill.profile) {\n <span>{{ 'nh-assistant.admin.run-config.profile-value' | translate: { name: skill.profile } }}</span>\n }\n <span>{{ (skill.tools.length === 1 ? 'nh-assistant.admin.agents.tool-count-one' : 'nh-assistant.admin.agents.tool-count') | translate: { count: skill.tools.length } }}</span>\n <span [attr.title]=\"accountTitle(skill.changedBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(skill.changedBy), date: (skill.changedAt | date: 'medium') } }}</span>\n </div>\n @if (skill.candidate; as candidate) {\n <div class=\"subsection\" data-candidate>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.explain' | translate: { version: candidate.version, description: candidate.description } }}</p>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"comparison()?.skillId === skill.skillId\" (click)=\"toggleComparison(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.candidate.compare' | translate }}\n </button>\n @if (isConfirming('promote', skill.skillId)) {\n <button class=\"primary\" type=\"button\" [disabled]=\"busy()\" (click)=\"promote(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-promote' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else if (isConfirming('discard', skill.skillId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"discard(skill)\">{{ 'nh-assistant.admin.run-config.candidate.confirm-discard' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('promote', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.promote' | translate }}</button>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('discard', skill.skillId)\">{{ 'nh-assistant.admin.run-config.candidate.discard' | translate }}</button>\n }\n </div>\n @if (comparison(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.result; as result) {\n <div class=\"table-scroll\">\n <table class=\"summary-table\" data-comparison>\n <caption class=\"visually-hidden\">{{ 'nh-assistant.admin.run-config.candidate.comparison' | translate: { skill: (skillNameKeys(config.agentId, skill.skillId) | nhAssistantTranslate: readableId(skill.skillId)) } }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ 'nh-assistant.admin.evaluation.columns.measure' | translate }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.live-column' | translate: { version: result.live.version } }}</th>\n <th scope=\"col\">{{ 'nh-assistant.admin.run-config.candidate.candidate-column' | translate: { version: result.candidate.version } }}</th>\n </tr>\n </thead>\n <tbody>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.runs' | translate }}</th><td>{{ result.live.runs | number }}</td><td>{{ result.candidate.runs | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.completed' | translate }}</th><td>{{ result.live.completed | number }}</td><td>{{ result.candidate.completed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.failed' | translate }}</th><td>{{ result.live.failed | number }}</td><td>{{ result.candidate.failed | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.proposals' | translate }}</th><td>{{ result.live.proposals | number }}</td><td>{{ result.candidate.proposals | number }}</td></tr>\n <tr><th scope=\"row\">{{ 'nh-assistant.admin.run-config.candidate.tokens' | translate }}</th><td>{{ result.live.tokens | number }}</td><td>{{ result.candidate.tokens | number }}</td></tr>\n </tbody>\n </table>\n </div>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.candidate.paired' | translate: { count: result.pairedEvents, date: (result.from | date: 'medium') } }}</p>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </div>\n }\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editSkill(skill)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.aria-expanded]=\"versions()?.skillId === skill.skillId\" (click)=\"toggleVersions(skill)\">\n <nh-assistant-icon name=\"list\" />{{ 'nh-assistant.admin.run-config.skills.versions' | translate }}\n </button>\n @if (isConfirming('remove-skill', skill.skillId)) {\n <span class=\"muted\">{{ 'nh-assistant.admin.run-config.skills.remove-explain' | translate }}</span>\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeSkill(skill)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-skill', skill.skillId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('skill:' + skill.skillId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n @if (versions(); as shown) {\n @if (shown.skillId === skill.skillId) {\n @if (shown.failed) {\n <p class=\"message error\" role=\"alert\">{{ 'nh-assistant.admin.load-failed' | translate }}</p>\n } @else if (shown.items; as items) {\n <ul class=\"history\" data-versions>\n @for (version of items; track version.version) {\n <li>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.version' | translate: { version: version.version } }}</span>\n <span class=\"badge\" [class.success]=\"version.status === 'live'\" [class.warning]=\"version.status === 'candidate'\">{{ 'nh-assistant.admin.run-config.status.' + version.status | translate }}</span>\n <span>{{ version.description }}</span>\n <span class=\"muted\" [attr.title]=\"accountTitle(version.createdBy)\">{{ 'nh-assistant.admin.run-config.changed' | translate: { user: nameOf(version.createdBy), date: (version.createdAt | date: 'medium') } }}</span>\n @if (version.reason) {\n <span class=\"muted\">{{ 'nh-assistant.admin.agents.state.reason' | translate: { reason: version.reason } }}</span>\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"state\" role=\"status\">{{ 'nh-assistant.admin.loading' | translate }}</p>\n }\n }\n }\n </li>\n }\n </ul>\n }\n </section>\n\n <section class=\"subsection\" [attr.aria-labelledby]=\"id + '-triggers-title'\" data-triggers>\n <header class=\"section-header\">\n <div>\n <h4 [id]=\"id + '-triggers-title'\">{{ 'nh-assistant.admin.run-config.triggers.title' | translate }}</h4>\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.description' | translate }}</p>\n </div>\n <button class=\"secondary\" type=\"button\" data-open-form=\"trigger\" [disabled]=\"busy() || !canAddRunData() || form() === 'trigger'\" (click)=\"addTrigger()\">\n <nh-assistant-icon name=\"plus\" />{{ 'nh-assistant.admin.run-config.triggers.add' | translate }}\n </button>\n </header>\n\n @if (form() === 'trigger') {\n <nh-assistant-trigger-form\n [agentId]=\"config.agentId\"\n [catalog]=\"catalog()\"\n [worksOn]=\"agent()\"\n [skills]=\"skillOptions()\"\n [trigger]=\"editingTrigger()\"\n [takenIds]=\"triggerIds()\"\n (saved)=\"onTriggerSaved($event.added)\"\n (cancelled)=\"cancel()\" />\n }\n\n @if (config.codeTriggers.length === 0 && config.dataTriggers.length === 0) {\n <p class=\"state\">{{ 'nh-assistant.admin.run-config.triggers.empty' | translate }}</p>\n } @else {\n <ul class=\"skills\">\n @for (trigger of config.codeTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-code-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.agents.source-code' | translate }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n </div>\n @if (trigger.skillId) {\n <p class=\"muted\">{{ 'nh-assistant.admin.run-config.triggers.skill-value' | translate: { skill: skillName(trigger.skillId) } }}</p>\n }\n </li>\n }\n @for (trigger of config.dataTriggers; track trigger.triggerId) {\n <li class=\"skill\" [attr.data-data-trigger]=\"trigger.triggerId\">\n <div class=\"card-header\">\n <span class=\"mono\">{{ trigger.triggerId }}</span>\n <span class=\"badge\">{{ 'nh-assistant.admin.run-config.triggers.sources.' + trigger.source | translate }}</span>\n @if (trigger.shadow) {\n <span class=\"badge warning\" data-shadow-badge>{{ 'nh-assistant.admin.agents.shadow.badge' | translate }}</span>\n } @else {\n <span class=\"badge success\">{{ 'nh-assistant.admin.run-config.triggers.live-badge' | translate }}</span>\n }\n @if (!trigger.inEffect) {\n <span class=\"badge danger\">{{ 'nh-assistant.admin.run-config.out-of-effect' | translate }}</span>\n }\n </div>\n <div class=\"meta\">\n @if (trigger.source === 'event') {\n <span class=\"mono\">{{ trigger.event }}</span>\n @if (trigger.filters?.length) {\n <span data-trigger-filters>{{ 'nh-assistant.admin.run-config.triggers.filters.applied' | translate: { filters: trigger.filters!.join(', ') } }}</span>\n }\n } @else {\n <span class=\"mono\">{{ trigger.cron }} {{ trigger.timeZone ?? 'UTC' }}</span>\n @if (trigger.subjectSet) {\n <span class=\"mono\">{{ trigger.subjectSet }}</span>\n } @else {\n <!-- A schedule without a subject set runs for the whole application, per division for a per-division agent. -->\n <span data-trigger-target>{{ (agent().perDivision ? 'nh-assistant.admin.run-config.triggers.target.every-division' : 'nh-assistant.admin.run-config.triggers.target.application') | translate }}</span>\n }\n }\n <span>{{ (trigger.skillId ? 'nh-assistant.admin.run-config.triggers.skill-value' : 'nh-assistant.admin.run-config.triggers.agent-routes') | translate: { skill: skillName(trigger.skillId) } }}</span>\n <span>{{ 'nh-assistant.admin.run-config.triggers.conflicts.' + trigger.conflict | translate }}</span>\n <span>{{ 'nh-assistant.admin.agents.version' | translate: { version: trigger.version } }}</span>\n </div>\n <div class=\"card-actions\">\n <button class=\"secondary\" type=\"button\" [disabled]=\"busy()\" (click)=\"editTrigger(trigger)\">\n <nh-assistant-icon name=\"edit\" />{{ 'nh-assistant.admin.edit' | translate }}\n </button>\n <button class=\"secondary\" type=\"button\" [attr.data-trigger-shadow]=\"trigger.shadow ? 'live' : 'shadow'\" [disabled]=\"busy()\" (click)=\"setTriggerShadow(trigger, !trigger.shadow)\">\n {{ (trigger.shadow ? 'nh-assistant.admin.agents.shadow.action.live' : 'nh-assistant.admin.agents.shadow.action.shadow') | translate }}\n </button>\n @if (isConfirming('remove-trigger', trigger.triggerId)) {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"removeTrigger(trigger)\">{{ 'nh-assistant.admin.confirm-delete' | translate }}</button>\n <button class=\"secondary\" type=\"button\" (click)=\"confirming.set(null)\">{{ 'nh-assistant.admin.cancel' | translate }}</button>\n } @else {\n <button class=\"danger\" type=\"button\" [disabled]=\"busy()\" (click)=\"confirm('remove-trigger', trigger.triggerId)\">\n <nh-assistant-icon name=\"trash\" />{{ 'nh-assistant.admin.delete' | translate }}\n </button>\n }\n </div>\n @if (failed('trigger:' + trigger.triggerId)) {\n <p class=\"form-error\" role=\"alert\"><nh-assistant-icon name=\"warning\" />{{ errorKeys() | nhAssistantTranslate: error()!.code }}</p>\n }\n </li>\n }\n </ul>\n }\n </section>\n }\n</section>\n", styles: [":host{--nha-font: var(--nh-assistant-font, inherit);--nha-background: var(--nh-assistant-background, #ffffff);--nha-surface: var(--nh-assistant-surface, #f5f7fb);--nha-surface-strong: var(--nh-assistant-surface-strong, #eceff6);--nha-text: var(--nh-assistant-text, #080c1d);--nha-text-muted: var(--nh-assistant-text-muted, #5b6482);--nha-border: var(--nh-assistant-border, #dce0ec);--nha-accent: var(--nh-assistant-accent, #022962);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #c84f00);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #247d4e);--nha-success-soft: var(--nh-assistant-success-soft, #e6f5ec);--nha-warning: var(--nh-assistant-warning, #8a5a00);--nha-warning-soft: var(--nh-assistant-warning-soft, #fff3d9);--nha-danger: var(--nh-assistant-danger, #b92e52);--nha-danger-soft: var(--nh-assistant-danger-soft, #ffe9ef);--nha-focus: var(--nh-assistant-focus, #ff6700);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(2 41 98 / .16));--nha-radius: var(--nh-assistant-radius, 16px);--nha-radius-control: var(--nh-assistant-radius-control, 12px);--nha-mono: var(--nh-assistant-font-mono, ui-monospace, \"Cascadia Code\", Consolas, monospace)}@media(prefers-color-scheme:dark){:host{--nha-background: var(--nh-assistant-background, #0b0e22);--nha-surface: var(--nh-assistant-surface, #11152d);--nha-surface-strong: var(--nh-assistant-surface-strong, #181d3b);--nha-text: var(--nh-assistant-text, #ffffff);--nha-text-muted: var(--nh-assistant-text-muted, #b8bed8);--nha-border: var(--nh-assistant-border, #2b3155);--nha-accent: var(--nh-assistant-accent, #0f4087);--nha-accent-contrast: var(--nh-assistant-accent-contrast, #ffffff);--nha-highlight: var(--nh-assistant-highlight, #ff6700);--nha-user-bubble: var(--nh-assistant-user-bubble, #022962);--nha-user-text: var(--nh-assistant-user-text, #ffffff);--nha-success: var(--nh-assistant-success, #67c58f);--nha-success-soft: var(--nh-assistant-success-soft, #102d24);--nha-warning: var(--nh-assistant-warning, #ffbf5b);--nha-warning-soft: var(--nh-assistant-warning-soft, #342818);--nha-danger: var(--nh-assistant-danger, #ff6d8a);--nha-danger-soft: var(--nh-assistant-danger-soft, #351b2a);--nha-shadow: var(--nh-assistant-shadow, 0 16px 36px rgb(0 0 0 / .32))}}:host{display:block;min-width:0;color:var(--nha-text);font-family:var(--nha-font);font-size:14px}:host fieldset{min-width:0;margin:0;border:0;padding:0}:host legend,:host .label,:host .field>label{display:block;margin-bottom:6px;padding:0;color:var(--nha-text);font-size:12px;font-weight:700}:host input[type=text],:host input[type=url],:host input[type=password],:host input[type=search],:host input[type=email],:host input[type=number],:host input[type=date],:host input[type=time],:host input[type=datetime-local],:host select,:host textarea{box-sizing:border-box;width:100%;min-width:0;min-height:38px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:8px 10px;color:var(--nha-text);background:var(--nha-background);font:inherit;font-size:13px}:host input[type=text]:focus-visible,:host input[type=url]:focus-visible,:host input[type=password]:focus-visible,:host input[type=search]:focus-visible,:host input[type=email]:focus-visible,:host input[type=number]:focus-visible,:host input[type=date]:focus-visible,:host input[type=time]:focus-visible,:host input[type=datetime-local]:focus-visible,:host select:focus-visible,:host textarea:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host input[type=text]:disabled,:host input[type=url]:disabled,:host input[type=password]:disabled,:host input[type=search]:disabled,:host input[type=email]:disabled,:host input[type=number]:disabled,:host input[type=date]:disabled,:host input[type=time]:disabled,:host input[type=datetime-local]:disabled,:host select:disabled,:host textarea:disabled{cursor:not-allowed;opacity:.6}:host input[type=text][aria-invalid=true],:host input[type=url][aria-invalid=true],:host input[type=password][aria-invalid=true],:host input[type=search][aria-invalid=true],:host input[type=email][aria-invalid=true],:host input[type=number][aria-invalid=true],:host input[type=date][aria-invalid=true],:host input[type=time][aria-invalid=true],:host input[type=datetime-local][aria-invalid=true],:host select[aria-invalid=true],:host textarea[aria-invalid=true]{border-color:var(--nha-danger)}:host textarea{line-height:1.45;resize:vertical}:host input[type=number]{font-variant-numeric:tabular-nums}:host .mono{font-family:var(--nha-mono);font-size:12px}:host .field{display:flex;flex-direction:column;min-width:0}:host .hint{display:flex;justify-content:space-between;gap:8px;margin:4px 2px 0;color:var(--nha-text-muted);font-size:11px}:host .counter{flex:none;font-variant-numeric:tabular-nums}:host .error-text{color:var(--nha-danger)}:host .field-error{display:flex;align-items:flex-start;gap:6px;margin:4px 2px 0;color:var(--nha-danger);font-size:12px;font-weight:600;overflow-wrap:anywhere}:host .field-error nh-assistant-icon{flex:none;margin-top:1px}:host .form-error{box-sizing:border-box;display:flex;align-items:flex-start;gap:8px;margin:0;border:1px solid var(--nha-danger);border-radius:var(--nha-radius-control);padding:8px 12px;color:var(--nha-text);background:var(--nha-danger-soft);font-size:13px;overflow-wrap:anywhere}:host .form-error ul{margin:4px 0 0;padding-left:18px}:host .message{box-sizing:border-box;display:flex;align-items:center;gap:8px;margin:0;border:1px solid transparent;border-radius:var(--nha-radius-control);padding:8px 12px;font-size:13px;overflow-wrap:anywhere}:host .message.error{border-color:var(--nha-danger);color:var(--nha-text);background:var(--nha-danger-soft)}:host .message.warning{border-color:var(--nha-warning);color:var(--nha-text);background:var(--nha-warning-soft)}:host .message.success{border-color:var(--nha-success);color:var(--nha-text);background:var(--nha-success-soft)}:host .message.info{border-color:var(--nha-border);color:var(--nha-text);background:var(--nha-surface)}:host .message nh-assistant-icon{flex:none}:host button.link{min-height:0;border:0;padding:0;color:var(--nha-accent, currentColor);background:none;font:inherit;text-decoration:underline;cursor:pointer}:host button.link:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host button.link:disabled{cursor:not-allowed;opacity:.55}:host .primary,:host .secondary,:host .danger{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;gap:6px;min-height:36px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 14px;font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}:host .primary:focus-visible,:host .secondary:focus-visible,:host .danger:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .primary:disabled,:host .secondary:disabled,:host .danger:disabled{cursor:not-allowed;opacity:.55}:host .primary{border-color:var(--nha-accent);color:var(--nha-accent-contrast);background:var(--nha-accent)}:host .primary:hover:not(:disabled){filter:brightness(1.12)}:host .secondary{color:var(--nha-text);background:transparent}:host .secondary:hover:not(:disabled){background:var(--nha-surface-strong)}:host .danger{border-color:var(--nha-danger);color:var(--nha-danger);background:transparent}:host .danger:hover:not(:disabled){background:var(--nha-danger-soft)}:host .icon-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer}:host .icon-button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}:host .icon-button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}:host .icon-button:disabled{cursor:not-allowed;opacity:.5}:host .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}:host .badge{display:inline-flex;align-items:center;gap:4px;border-radius:999px;padding:2px 8px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:11px;font-weight:700;white-space:nowrap}:host .badge.success{color:var(--nha-success);background:var(--nha-success-soft)}:host .badge.warning{color:var(--nha-warning);background:var(--nha-warning-soft)}:host .badge.danger{color:var(--nha-danger);background:var(--nha-danger-soft)}:host .visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.section{display:flex;flex-direction:column;gap:16px;min-width:0}.section-header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.section-header>div{min-width:0;max-width:72ch}h3{margin:0 0 4px;font-size:17px;font-weight:750}h4{margin:0 0 8px;font-size:14px;font-weight:700}.muted{margin:0;color:var(--nha-text-muted);font-size:13px}.state{display:flex;flex-direction:column;align-items:flex-start;gap:10px;margin:0;border:1px dashed var(--nha-border);border-radius:var(--nha-radius);padding:20px;color:var(--nha-text-muted);font-size:13px}.state p{margin:0}.stack{display:flex;flex-direction:column;gap:14px;min-width:0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:14px}.meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}textarea.large{min-height:260px}.catalog-error{flex-wrap:wrap}.grow{flex:1;min-width:0}.subsection{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--nha-border);padding-top:14px}.history{display:grid;gap:6px;margin:0;padding:0;list-style:none}.history li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:12px}.cards{display:grid;gap:10px;margin:0;padding:0;list-style:none}.card{display:flex;flex-direction:column;gap:8px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius);padding:14px;background:var(--nha-background)}.card.inactive{opacity:.8}.card-header{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.card-header strong{font-size:14px;overflow-wrap:anywhere}.card-actions{display:flex;flex-wrap:wrap;gap:8px}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.check.described>span{display:grid;gap:2px;min-width:0;overflow-wrap:anywhere}.checks{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:6px 12px;min-width:0;overflow-wrap:anywhere}.chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--nha-border);border-radius:999px;padding:2px 2px 2px 10px;background:var(--nha-surface);font-family:var(--nha-mono);font-size:12px}.chip button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:var(--nha-radius-control);color:var(--nha-text-muted);background:transparent;cursor:pointer;width:26px;height:26px;border-radius:999px}.chip button:focus-visible{outline:3px solid color-mix(in srgb,var(--nha-focus) 80%,transparent);outline-offset:2px}.chip button:hover:not(:disabled){color:var(--nha-text);background:var(--nha-surface-strong)}.chip button:disabled{cursor:not-allowed;opacity:.5}.inline{display:flex;flex-wrap:wrap;gap:8px}.inline>input{flex:1 1 180px}.catalog{display:grid;gap:4px;max-height:260px;margin:8px 0 0;overflow-y:auto;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px;list-style:none}.catalog li label{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;border-radius:8px;padding:6px;cursor:pointer}.catalog li label:hover{background:var(--nha-surface)}.catalog .tool-id{font-family:var(--nha-mono);font-size:12px;overflow-wrap:anywhere}.skills{display:grid;gap:8px;margin:0;padding:0;list-style:none}.skill{display:grid;gap:6px;border-left:3px solid var(--nha-border);padding:4px 0 4px 12px}.uses{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:8px}.use{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.use input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.use>span{display:grid;gap:2px;min-width:0}.use strong{font-size:13px}.use.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.use:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.discovery{display:grid;gap:8px;padding:10px 12px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control)}.discovery dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}.discovery dt{color:var(--nha-text-muted)}.discovery dd{margin:0;overflow-wrap:anywhere}\n", ".header-actions{display:flex;flex-wrap:wrap;gap:8px}.export-hint{margin-top:4px;font-size:12px}.filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));align-items:start;gap:12px}.subsection h4,.list-header h4{margin:0}.list-header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 12px}.table-container{container-type:inline-size;min-width:0}.summary-table{width:100%;border-collapse:collapse;font-size:13px}.summary-table th,.summary-table td{border-bottom:1px solid var(--nha-border);padding:8px 10px;text-align:left;vertical-align:top}.summary-table thead th{color:var(--nha-text-muted);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.summary-table tbody th{font-weight:600}.summary-table .number{text-align:right;font-variant-numeric:tabular-nums}.summary-table .mono{overflow-wrap:anywhere}@container (max-width: 820px){.summary-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.summary-table,.summary-table tbody,.summary-table tr{display:block}.summary-table tr{margin-bottom:8px;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:6px 12px;background:var(--nha-background)}.summary-table tbody th,.summary-table td{display:grid;grid-template-columns:minmax(110px,40%) minmax(0,1fr);gap:8px;border:0;padding:4px 0;text-align:left}.summary-table tbody th:before,.summary-table td:before{content:attr(data-label);color:var(--nha-text-muted);font-size:12px;font-weight:700}}.badges{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.badge .count{font-variant-numeric:tabular-nums;opacity:.85}.feedback-text{margin:0;border-left:3px solid var(--nha-border);padding:2px 0 2px 10px;font-size:13px;white-space:pre-wrap;overflow-wrap:anywhere}.proposal{margin:0;color:var(--nha-text-muted);font-size:12px;overflow-wrap:anywhere}.proposal-label{margin-right:4px;color:var(--nha-text);font-weight:700}.pager{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n", "h5{margin:0;font-size:15px;font-weight:750}.group{display:flex;flex-direction:column;gap:10px;min-width:0;border-top:1px solid var(--nha-border);padding-top:14px}.group>legend{float:left;width:100%;margin-bottom:2px;font-size:14px;font-weight:750}.choices{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:8px}.choice{display:flex;align-items:flex-start;gap:10px;min-width:0;border:1px solid var(--nha-border);border-radius:var(--nha-radius-control);padding:10px 12px;cursor:pointer;overflow-wrap:anywhere}.choice input{flex:none;width:16px;height:16px;margin:2px 0 0;accent-color:var(--nha-highlight)}.choice>span{display:grid;gap:2px;min-width:0}.choice strong{font-size:13px}.choice.selected{border-color:var(--nha-highlight);background:var(--nha-surface)}.choice:focus-within{outline:2px solid var(--nha-highlight);outline-offset:2px}.block{display:block;margin-top:2px}.advanced{border-top:1px solid var(--nha-border);padding-top:12px}.advanced>summary{width:fit-content;border-radius:6px;font-size:14px;font-weight:750;cursor:pointer}.advanced>summary:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.advanced>.stack{margin-top:12px}.examples{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}.examples button{border:1px solid var(--nha-border);border-radius:999px;padding:3px 10px;color:var(--nha-text);background:transparent;font:inherit;font-size:12px;cursor:pointer}.examples button:hover{background:var(--nha-surface-strong)}.examples button:focus-visible{outline:2px solid var(--nha-highlight);outline-offset:2px}.steps{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}.steps li{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:4px 10px;color:var(--nha-text-muted);background:var(--nha-surface-strong);font-size:12px;font-weight:700}.steps li[aria-current=step]{color:var(--nha-accent-contrast);background:var(--nha-accent)}.steps li.done{color:var(--nha-success);background:var(--nha-success-soft)}.review{display:grid;grid-template-columns:minmax(0,max-content) minmax(0,1fr);gap:6px 16px;margin:0;font-size:13px}.review dt{color:var(--nha-text-muted)}.review dd{margin:0;overflow-wrap:anywhere}.tool-choice{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}@media(max-width:520px){.review{grid-template-columns:minmax(0,1fr)}.review dd{margin-bottom:6px}}.table-scroll{max-width:100%;overflow-x:auto}\n"] }]
3576
3622
  }], ctorParameters: () => [], propDecorators: { agent: [{ type: i0.Input, args: [{ isSignal: true, alias: "agent", required: true }] }], startSetup: [{ type: i0.Input, args: [{ isSignal: true, alias: "startSetup", required: false }] }], tools: [{ type: i0.Input, args: [{ isSignal: true, alias: "tools", required: false }] }], servers: [{ type: i0.Input, args: [{ isSignal: true, alias: "servers", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], editAgent: [{ type: i0.Output, args: ["editAgent"] }], changeAccount: [{ type: i0.Output, args: ["changeAccount"] }], openRuns: [{ type: i0.Output, args: ["openRuns"] }], openMcpServers: [{ type: i0.Output, args: ["openMcpServers"] }] } });
3577
3623
  function blank(value) {
3578
3624
  const trimmed = value.trim();