paperclip-plugin-autopilot-ops 0.1.16 → 0.1.18

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.
package/dist/manifest.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/manifest.ts
2
2
  var PLUGIN_ID = "alephoo.autopilot-ops";
3
- var PLUGIN_VERSION = "0.1.16";
3
+ var PLUGIN_VERSION = "0.1.18";
4
4
  var DB_NAMESPACE_SLUG = "autopilot_ops";
5
5
  var PAGE_ROUTE = "autopilot";
6
6
  var TOOL_NAMES = {
@@ -76,7 +76,7 @@ var manifest = {
76
76
  {
77
77
  name: TOOL_NAMES.listarReglas,
78
78
  displayName: "Listar reglas",
79
- description: "Lista las reglas que el hospital arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa el hospital desde el portal.",
79
+ description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
80
80
  parametersSchema: {
81
81
  type: "object",
82
82
  properties: {
@@ -88,7 +88,7 @@ var manifest = {
88
88
  {
89
89
  name: TOOL_NAMES.informarPruebaRegla,
90
90
  displayName: "Informar prueba de regla",
91
- description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, el hospital no puede activar la regla.",
91
+ description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
92
92
  parametersSchema: {
93
93
  type: "object",
94
94
  properties: {
@@ -113,7 +113,7 @@ var manifest = {
113
113
  {
114
114
  name: TOOL_NAMES.abrirCaso,
115
115
  displayName: "Abrir caso",
116
- description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
116
+ description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal de la instituci\xF3n), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
117
117
  parametersSchema: {
118
118
  type: "object",
119
119
  properties: {
@@ -130,7 +130,7 @@ var manifest = {
130
130
  {
131
131
  name: TOOL_NAMES.transicionar,
132
132
  displayName: "Transicionar caso",
133
- description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura de Alephoo, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
133
+ description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona de la instituci\xF3n carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
134
134
  parametersSchema: {
135
135
  type: "object",
136
136
  properties: {
@@ -146,13 +146,13 @@ var manifest = {
146
146
  {
147
147
  name: TOOL_NAMES.registrarAccion,
148
148
  displayName: "Registrar acci\xF3n",
149
- description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el sistema del hospital debe quedar registrada ac\xE1.",
149
+ description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
150
150
  parametersSchema: {
151
151
  type: "object",
152
152
  properties: {
153
153
  casoId: { type: "string" },
154
154
  tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
155
- conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del hospital), archivo, pantalla o manual." },
155
+ conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
156
156
  objetivo: { type: "string" },
157
157
  resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
158
158
  evidencia: { type: "object" },
@@ -178,7 +178,7 @@ var manifest = {
178
178
  {
179
179
  name: TOOL_NAMES.publicarTablero,
180
180
  displayName: "Publicar tablero",
181
- description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n del hospital, armado sobre datos reales de Alephoo (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
181
+ description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
182
182
  parametersSchema: {
183
183
  type: "object",
184
184
  properties: {
package/dist/ui/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  // src/manifest.ts
10
10
  var PLUGIN_ID = "alephoo.autopilot-ops";
11
- var PLUGIN_VERSION = "0.1.16";
11
+ var PLUGIN_VERSION = "0.1.18";
12
12
  var DB_NAMESPACE_SLUG = "autopilot_ops";
13
13
  var PAGE_ROUTE = "autopilot";
14
14
  var TOOL_NAMES = {
@@ -84,7 +84,7 @@ var manifest = {
84
84
  {
85
85
  name: TOOL_NAMES.listarReglas,
86
86
  displayName: "Listar reglas",
87
- description: "Lista las reglas que el hospital arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa el hospital desde el portal.",
87
+ description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
88
88
  parametersSchema: {
89
89
  type: "object",
90
90
  properties: {
@@ -96,7 +96,7 @@ var manifest = {
96
96
  {
97
97
  name: TOOL_NAMES.informarPruebaRegla,
98
98
  displayName: "Informar prueba de regla",
99
- description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, el hospital no puede activar la regla.",
99
+ description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
100
100
  parametersSchema: {
101
101
  type: "object",
102
102
  properties: {
@@ -121,7 +121,7 @@ var manifest = {
121
121
  {
122
122
  name: TOOL_NAMES.abrirCaso,
123
123
  displayName: "Abrir caso",
124
- description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
124
+ description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal de la instituci\xF3n), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
125
125
  parametersSchema: {
126
126
  type: "object",
127
127
  properties: {
@@ -138,7 +138,7 @@ var manifest = {
138
138
  {
139
139
  name: TOOL_NAMES.transicionar,
140
140
  displayName: "Transicionar caso",
141
- description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura de Alephoo, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
141
+ description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona de la instituci\xF3n carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
142
142
  parametersSchema: {
143
143
  type: "object",
144
144
  properties: {
@@ -154,13 +154,13 @@ var manifest = {
154
154
  {
155
155
  name: TOOL_NAMES.registrarAccion,
156
156
  displayName: "Registrar acci\xF3n",
157
- description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el sistema del hospital debe quedar registrada ac\xE1.",
157
+ description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
158
158
  parametersSchema: {
159
159
  type: "object",
160
160
  properties: {
161
161
  casoId: { type: "string" },
162
162
  tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
163
- conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del hospital), archivo, pantalla o manual." },
163
+ conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
164
164
  objetivo: { type: "string" },
165
165
  resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
166
166
  evidencia: { type: "object" },
@@ -186,7 +186,7 @@ var manifest = {
186
186
  {
187
187
  name: TOOL_NAMES.publicarTablero,
188
188
  displayName: "Publicar tablero",
189
- description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n del hospital, armado sobre datos reales de Alephoo (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
189
+ description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
190
190
  parametersSchema: {
191
191
  type: "object",
192
192
  properties: {
@@ -413,7 +413,7 @@ var MODOS = [
413
413
  { valor: "corte", etiqueta: "Corte", ayuda: "Los agentes no pueden abrir ni mover casos." },
414
414
  { valor: "observa", etiqueta: "Observa", ayuda: "Los agentes leen, registran y verifican; no proponen." },
415
415
  { valor: "propone", etiqueta: "Propone", ayuda: "Los agentes proponen; un humano aprueba y aplica." },
416
- { valor: "ejecuta", etiqueta: "Ejecuta", ayuda: "Los agentes aplican lo aprobado en el sistema del hospital." },
416
+ { valor: "ejecuta", etiqueta: "Ejecuta", ayuda: "Los agentes aplican lo aprobado en el HIS." },
417
417
  { valor: "autonomo", etiqueta: "Aut\xF3nomo", ayuda: "Aprobaci\xF3n autom\xE1tica salvo excepciones (variaci\xF3n alta, sin valor actual, reintento, baja de valor)." }
418
418
  ];
419
419
  var fuente = 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif';
package/dist/worker.js CHANGED
@@ -39932,7 +39932,7 @@ function startWorkerRpcHost(options) {
39932
39932
 
39933
39933
  // src/manifest.ts
39934
39934
  var PLUGIN_ID = "alephoo.autopilot-ops";
39935
- var PLUGIN_VERSION = "0.1.16";
39935
+ var PLUGIN_VERSION = "0.1.18";
39936
39936
  var DB_NAMESPACE_SLUG = "autopilot_ops";
39937
39937
  var PAGE_ROUTE = "autopilot";
39938
39938
  var TOOL_NAMES = {
@@ -40008,7 +40008,7 @@ var manifest = {
40008
40008
  {
40009
40009
  name: TOOL_NAMES.listarReglas,
40010
40010
  displayName: "Listar reglas",
40011
- description: "Lista las reglas que el hospital arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa el hospital desde el portal.",
40011
+ description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
40012
40012
  parametersSchema: {
40013
40013
  type: "object",
40014
40014
  properties: {
@@ -40020,7 +40020,7 @@ var manifest = {
40020
40020
  {
40021
40021
  name: TOOL_NAMES.informarPruebaRegla,
40022
40022
  displayName: "Informar prueba de regla",
40023
- description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, el hospital no puede activar la regla.",
40023
+ description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
40024
40024
  parametersSchema: {
40025
40025
  type: "object",
40026
40026
  properties: {
@@ -40045,7 +40045,7 @@ var manifest = {
40045
40045
  {
40046
40046
  name: TOOL_NAMES.abrirCaso,
40047
40047
  displayName: "Abrir caso",
40048
- description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
40048
+ description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal de la instituci\xF3n), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
40049
40049
  parametersSchema: {
40050
40050
  type: "object",
40051
40051
  properties: {
@@ -40062,7 +40062,7 @@ var manifest = {
40062
40062
  {
40063
40063
  name: TOOL_NAMES.transicionar,
40064
40064
  displayName: "Transicionar caso",
40065
- description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura de Alephoo, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
40065
+ description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona de la instituci\xF3n carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
40066
40066
  parametersSchema: {
40067
40067
  type: "object",
40068
40068
  properties: {
@@ -40078,13 +40078,13 @@ var manifest = {
40078
40078
  {
40079
40079
  name: TOOL_NAMES.registrarAccion,
40080
40080
  displayName: "Registrar acci\xF3n",
40081
- description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el sistema del hospital debe quedar registrada ac\xE1.",
40081
+ description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
40082
40082
  parametersSchema: {
40083
40083
  type: "object",
40084
40084
  properties: {
40085
40085
  casoId: { type: "string" },
40086
40086
  tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
40087
- conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del hospital), archivo, pantalla o manual." },
40087
+ conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
40088
40088
  objetivo: { type: "string" },
40089
40089
  resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
40090
40090
  evidencia: { type: "object" },
@@ -40110,7 +40110,7 @@ var manifest = {
40110
40110
  {
40111
40111
  name: TOOL_NAMES.publicarTablero,
40112
40112
  displayName: "Publicar tablero",
40113
- description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n del hospital, armado sobre datos reales de Alephoo (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
40113
+ description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
40114
40114
  parametersSchema: {
40115
40115
  type: "object",
40116
40116
  properties: {
@@ -40418,7 +40418,7 @@ var actualizacionArancel = {
40418
40418
  de: ["pendiente_aprobacion"],
40419
40419
  a: "aprobado",
40420
40420
  actor: ["humano"],
40421
- descripcion: "Aprobaci\xF3n del responsable del hospital."
40421
+ descripcion: "Aprobaci\xF3n del responsable de la instituci\xF3n."
40422
40422
  },
40423
40423
  {
40424
40424
  via: "rechazar",
@@ -40682,7 +40682,7 @@ var recuperoTurno = {
40682
40682
  de: ["pendiente_aprobacion"],
40683
40683
  a: "aprobado",
40684
40684
  actor: ["humano"],
40685
- descripcion: "Aprobaci\xF3n del responsable del hospital."
40685
+ descripcion: "Aprobaci\xF3n del responsable de la instituci\xF3n."
40686
40686
  },
40687
40687
  {
40688
40688
  via: "rechazar",
@@ -40857,7 +40857,7 @@ var cuentaCompleta = {
40857
40857
  clave: "cuenta_completa",
40858
40858
  nombre: "Cuenta completa antes de facturar",
40859
40859
  puesto: "Admisi\xF3n y cuenta",
40860
- descripcion: "Lee en el sistema del hospital cada prestaci\xF3n pendiente de facturar y marca lo que le falta para facturarse sin d\xE9bito (autorizaci\xF3n, validaci\xF3n, afiliado, orden, valor, epicrisis). El equipo lo completa y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
40860
+ descripcion: "Lee en el HIS cada prestaci\xF3n pendiente de facturar y marca lo que le falta para facturarse sin d\xE9bito (autorizaci\xF3n, validaci\xF3n, afiliado, orden, valor, epicrisis). El equipo lo completa y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
40861
40861
  inicial: "detectado",
40862
40862
  estados: ["detectado", "para_completar", "completado", "con_faltantes", "completa", "facturado_incompleto", "no_corresponde", "descartado"],
40863
40863
  finalesOk: ["completa"],
@@ -40875,7 +40875,7 @@ var cuentaCompleta = {
40875
40875
  const l = { ...caso.datos, ...datos };
40876
40876
  const estado = estadoBono(datos.bono_estado);
40877
40877
  return [
40878
- refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el sistema del hospital"),
40878
+ refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el HIS"),
40879
40879
  estado && BONO_POR_FACTURAR.includes(estado) ? ok("bono_sin_facturar", estado) : falla("bono_sin_facturar", `el bono tiene que estar sin facturar (${BONO_POR_FACTURAR.join(", ")}); est\xE1: ${texto(datos.bono_estado) ?? "sin informar"}`),
40880
40880
  validarFaltantes("faltantes", datos.faltantes, true),
40881
40881
  texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "observar requiere lectura_id: la lectura de la base registrada con ops_registrar_accion"),
@@ -40889,7 +40889,7 @@ var cuentaCompleta = {
40889
40889
  a: "completado",
40890
40890
  actor: ["humano"],
40891
40891
  cargaManual: true,
40892
- descripcion: "Una persona del hospital complet\xF3 en el sistema lo que faltaba. El puesto lo comprueba volviendo a leer.",
40892
+ descripcion: "Una persona de la instituci\xF3n complet\xF3 en el HIS lo que faltaba. El puesto lo comprueba volviendo a leer.",
40893
40893
  validar: (_caso, datos) => [
40894
40894
  texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "completar requiere accion_id de la carga registrada")
40895
40895
  ]
@@ -40951,7 +40951,7 @@ var facturacionPendiente = {
40951
40951
  clave: "facturacion_pendiente",
40952
40952
  nombre: "Prestaciones sin facturar",
40953
40953
  puesto: "Admisi\xF3n y cuenta",
40954
- descripcion: "Lee en el sistema del hospital las prestaciones (bonos) que todav\xEDa no se facturaron, calcula cu\xE1ndo vence el plazo de presentaci\xF3n al financiador y avisa al equipo, primero lo que vence antes. El equipo las presenta y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
40954
+ descripcion: "Lee en el HIS las prestaciones (bonos) que todav\xEDa no se facturaron, calcula cu\xE1ndo vence el plazo de presentaci\xF3n al financiador y avisa al equipo, primero lo que vence antes. El equipo las presenta y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
40955
40955
  inicial: "detectado",
40956
40956
  estados: ["detectado", "por_presentar", "en_prefactura", "presentado", "facturada", "no_corresponde", "descartado"],
40957
40957
  finalesOk: ["facturada"],
@@ -40970,7 +40970,7 @@ var facturacionPendiente = {
40970
40970
  const estado = estadoBono(datos.bono_estado);
40971
40971
  const fecha = fechaISO(l.fecha_prestacion) ? String(l.fecha_prestacion) : null;
40972
40972
  return [
40973
- refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el sistema del hospital"),
40973
+ refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el HIS"),
40974
40974
  estado && BONO_POR_FACTURAR.includes(estado) ? ok("bono_sin_facturar", estado) : falla("bono_sin_facturar", `el bono tiene que estar sin facturar (${BONO_POR_FACTURAR.join(", ")}); est\xE1: ${texto(datos.bono_estado) ?? "sin informar"}`),
40975
40975
  fecha && (!contexto.hoy || fecha <= contexto.hoy) ? ok("fecha_prestacion_valida", fecha) : falla("fecha_prestacion_valida", "fecha_prestacion (AAAA-MM-DD) es obligatoria y no puede ser futura"),
40976
40976
  texto(l.obra_social) ? ok("obra_social_presente") : falla("obra_social_presente", "obra_social es obligatoria: con ella se busca el plazo de presentaci\xF3n"),
@@ -40985,7 +40985,7 @@ var facturacionPendiente = {
40985
40985
  a: "presentado",
40986
40986
  actor: ["humano"],
40987
40987
  cargaManual: true,
40988
- descripcion: "Una persona del hospital present\xF3 la prestaci\xF3n (la prefactur\xF3 y factur\xF3). El puesto lo comprueba volviendo a leer.",
40988
+ descripcion: "Una persona de la instituci\xF3n present\xF3 la prestaci\xF3n (la prefactur\xF3 y factur\xF3). El puesto lo comprueba volviendo a leer.",
40989
40989
  validar: (_caso, datos) => [
40990
40990
  texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "presentar requiere accion_id de la carga registrada")
40991
40991
  ]
@@ -41060,7 +41060,7 @@ var credencialProfesional = {
41060
41060
  clave: "credencial_profesional",
41061
41061
  nombre: "Credenciales del profesional",
41062
41062
  puesto: "Personal y profesionales",
41063
- descripcion: "Lee en el sistema del hospital la matr\xEDcula de cada profesional con agenda y la verifica contra el registro nacional de profesionales de la salud (REFEPS). Si no figura, est\xE1 a nombre de otra persona, est\xE1 inhabilitada o falta cargarla, avisa al equipo con d\xF3nde se corrige. El puesto no escribe en el sistema.",
41063
+ descripcion: "Lee en el HIS la matr\xEDcula de cada profesional con agenda y la verifica contra el registro nacional de profesionales de la salud (REFEPS). Si no figura, est\xE1 a nombre de otra persona, est\xE1 inhabilitada o falta cargarla, avisa al equipo con d\xF3nde se corrige. El puesto no escribe en el sistema.",
41064
41064
  inicial: "detectado",
41065
41065
  estados: ["detectado", "vigente", "observada", "corregida", "no_corresponde", "descartado"],
41066
41066
  finalesOk: ["vigente"],
@@ -41082,7 +41082,7 @@ var credencialProfesional = {
41082
41082
  const r = leerResultadoRegistro(datos.resultado);
41083
41083
  const tipo = texto(datos.tipo_matricula);
41084
41084
  return [
41085
- refExterna(l.profesional_id) ? ok("profesional_presente") : falla("profesional_presente", "verificar requiere profesional_id: el id del profesional en el sistema del hospital"),
41085
+ refExterna(l.profesional_id) ? ok("profesional_presente") : falla("profesional_presente", "verificar requiere profesional_id: el id del profesional en el HIS"),
41086
41086
  r ? ok("resultado_valido", r.sin_matricula ? "sin matr\xEDcula cargada" : r.encontrada ? `encontrada \xB7 ${r.situacion}` : "no encontrada") : falla("resultado_valido", "resultado tiene que ser el objeto que devuelve verificar-matriculas.mjs: {sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}"),
41087
41087
  r && !r.sin_matricula && !(refExterna(datos.matricula) && tipo && TIPOS_MATRICULA.includes(tipo)) ? falla("matricula_consultada", `con matr\xEDcula cargada hacen falta matricula y tipo_matricula (${TIPOS_MATRICULA.join(" o ")})`) : ok("matricula_consultada"),
41088
41088
  texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "verificar requiere lectura_id: la consulta al registro registrada con ops_registrar_accion"),
@@ -41096,7 +41096,7 @@ var credencialProfesional = {
41096
41096
  a: "corregida",
41097
41097
  actor: ["humano"],
41098
41098
  cargaManual: true,
41099
- descripcion: "Una persona del hospital corrigi\xF3 la ficha del profesional en el sistema. El puesto vuelve a verificar.",
41099
+ descripcion: "Una persona de la instituci\xF3n corrigi\xF3 la ficha del profesional en el HIS. El puesto vuelve a verificar.",
41100
41100
  validar: (_caso, datos) => [
41101
41101
  texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "corregir requiere accion_id de la carga registrada")
41102
41102
  ]
@@ -41176,7 +41176,7 @@ var demandaPendiente = {
41176
41176
  a: "contactado",
41177
41177
  actor: ["agente", "humano"],
41178
41178
  nivelRequerido: "ejecuta",
41179
- descripcion: "Contactar al paciente por el canal de la regla (el agente por el CRM de Alephoo; una persona del equipo, por donde lo hizo). Exige la escritura registrada (accion_id).",
41179
+ descripcion: "Contactar al paciente por el canal de la regla: el agente por el CRM del HIS, o una persona del equipo por donde lo haya hecho. Exige que el contacto haya quedado registrado.",
41180
41180
  validar: (_caso, datos, contexto) => {
41181
41181
  const out = [];
41182
41182
  const regla = contexto.regla ?? null;
@@ -41220,10 +41220,10 @@ var demandaPendiente = {
41220
41220
  a: (_caso, datos) => TURNO_ATENDIDO.includes(String(datos.turno_estado ?? "").toUpperCase()) ? "realizado" : "turno_agendado",
41221
41221
  actor: ["agente", "humano"],
41222
41222
  nivelRequerido: "observa",
41223
- descripcion: "Releer Alephoo y encontrar el turno de esa orden, solicitud o control: con el turno, el caso se cierra como movido.",
41223
+ descripcion: "Releer el HIS y encontrar el turno de esa orden, solicitud o control: con el turno, el caso se cierra como movido.",
41224
41224
  validar: (_caso, datos) => [
41225
- texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "comprobar requiere lectura_id: la relectura de Alephoo registrada antes"),
41226
- refExterna(datos.turno_id) ? ok("turno_presente") : falla("turno_presente", "comprobar requiere turno_id: el turno encontrado en Alephoo; sin turno no hay nada que comprobar")
41225
+ texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "comprobar requiere lectura_id: la relectura del HIS registrada antes"),
41226
+ refExterna(datos.turno_id) ? ok("turno_presente") : falla("turno_presente", "comprobar requiere turno_id: el turno encontrado en el HIS; sin turno no hay nada que comprobar")
41227
41227
  ]
41228
41228
  },
41229
41229
  {
@@ -41260,7 +41260,7 @@ var demandaPendiente = {
41260
41260
  de: ["detectado", "contactado", "aceptado"],
41261
41261
  a: "no_corresponde",
41262
41262
  actor: ["humano"],
41263
- descripcion: "Una persona del hospital decide que este caso no corresponde a la regla.",
41263
+ descripcion: "Una persona de la instituci\xF3n decide que este caso no corresponde a la regla.",
41264
41264
  validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "no_corresponde requiere motivo")]
41265
41265
  }
41266
41266
  ]
@@ -41445,6 +41445,90 @@ function poblacion(problemas, p) {
41445
41445
  }
41446
41446
  return out;
41447
41447
  }
41448
+ var TODOS = ["orden_sin_turno", "solicitud_pendiente", "control_periodico"];
41449
+ var CAMPOS_CONDICION = {
41450
+ edad: { nombre: "Edad (a\xF1os)", tipo: "numero", operadores: ["mayor_que", "menor_que", "entre"], en: TODOS },
41451
+ sexo: { nombre: "Sexo", tipo: "opcion", operadores: ["es"], opciones: ["F", "M"], en: TODOS },
41452
+ obra_social: { nombre: "Obra social", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno", "control_periodico"] },
41453
+ estudio: { nombre: "Estudio", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno"] },
41454
+ especialidad: { nombre: "Especialidad", tipo: "texto", operadores: ["contiene", "no_contiene"], en: TODOS },
41455
+ profesional: { nombre: "Profesional", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno", "control_periodico"] },
41456
+ prioridad: { nombre: "Prioridad de la solicitud", tipo: "texto", operadores: ["contiene"], en: ["solicitud_pendiente"] },
41457
+ diagnostico: { nombre: "Diagn\xF3stico (CIE-10)", tipo: "codigo", operadores: ["empieza_con"], en: ["orden_sin_turno", "control_periodico"] },
41458
+ dias: { nombre: "D\xEDas pendiente", tipo: "numero", operadores: ["mayor_que", "menor_que", "entre"], en: TODOS }
41459
+ };
41460
+ var MAX_CONDICIONES = 10;
41461
+ function condiciones(problemas, tipo, p) {
41462
+ if (p.condiciones === void 0 || p.condiciones === null) return [];
41463
+ if (!Array.isArray(p.condiciones)) {
41464
+ problemas.push("condiciones: debe ser una lista");
41465
+ return [];
41466
+ }
41467
+ if (p.condiciones.length > MAX_CONDICIONES) problemas.push(`condiciones: como m\xE1ximo ${MAX_CONDICIONES}`);
41468
+ const out = [];
41469
+ p.condiciones.slice(0, MAX_CONDICIONES).forEach((cruda, i) => {
41470
+ const c = jsonb(cruda);
41471
+ const ref = `condiciones[${i + 1}]`;
41472
+ const campo = str(c.campo)?.toLowerCase() ?? "";
41473
+ const def2 = CAMPOS_CONDICION[campo];
41474
+ if (!def2) {
41475
+ problemas.push(`${ref}: campo desconocido \xAB${campo || "(vac\xEDo)"}\xBB; posibles: ${Object.keys(CAMPOS_CONDICION).join(", ")}`);
41476
+ return;
41477
+ }
41478
+ if (tipo && !def2.en.includes(tipo)) {
41479
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB no existe para el tipo ${tipo}`);
41480
+ return;
41481
+ }
41482
+ const operador = str(c.operador)?.toLowerCase() ?? "";
41483
+ if (!def2.operadores.includes(operador)) {
41484
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB admite ${def2.operadores.join(", ")}`);
41485
+ return;
41486
+ }
41487
+ if (def2.tipo === "numero") {
41488
+ const v2 = entero(c.valor);
41489
+ if (v2 === null || v2 < 0 || v2 > 3650) {
41490
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB necesita un n\xFAmero entero entre 0 y 3650`);
41491
+ return;
41492
+ }
41493
+ if (operador === "entre") {
41494
+ const v22 = entero(c.valor2);
41495
+ if (v22 === null || v22 <= v2 || v22 > 3650) {
41496
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB entre necesita un segundo valor mayor que ${v2}`);
41497
+ return;
41498
+ }
41499
+ out.push({ campo, operador: "entre", valor: v2, valor2: v22 });
41500
+ return;
41501
+ }
41502
+ out.push({ campo, operador, valor: v2 });
41503
+ return;
41504
+ }
41505
+ if (def2.tipo === "opcion") {
41506
+ const v2 = str(c.valor)?.toUpperCase() ?? "";
41507
+ if (!(def2.opciones ?? []).includes(v2)) {
41508
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB debe ser ${(def2.opciones ?? []).join(" o ")}`);
41509
+ return;
41510
+ }
41511
+ out.push({ campo, operador: "es", valor: v2 });
41512
+ return;
41513
+ }
41514
+ if (def2.tipo === "codigo") {
41515
+ const v2 = str(c.valor)?.toUpperCase() ?? "";
41516
+ if (!/^[A-Z][0-9]{1,2}(\.[0-9A-Z]{1,2})?$/.test(v2)) {
41517
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB espera un c\xF3digo CIE-10 o su prefijo (p. ej. E11)`);
41518
+ return;
41519
+ }
41520
+ out.push({ campo, operador: "empieza_con", valor: v2 });
41521
+ return;
41522
+ }
41523
+ const v = str(c.valor);
41524
+ if (!v || v.length > 80) {
41525
+ problemas.push(`${ref}: \xAB${def2.nombre}\xBB necesita un texto de hasta 80 caracteres`);
41526
+ return;
41527
+ }
41528
+ out.push({ campo, operador, valor: v });
41529
+ });
41530
+ return out;
41531
+ }
41448
41532
  function diasHasta(problemas, parametros, p) {
41449
41533
  if (p.dias_hasta === void 0 || p.dias_hasta === null || p.dias_hasta === "") return;
41450
41534
  const hasta = numeroEn(problemas, "dias_hasta", p.dias_hasta);
@@ -41461,6 +41545,8 @@ function validarRegla(input2) {
41461
41545
  if (!tipo) problemas.push(`tipo: debe ser ${TIPOS_REGLA_DEMANDA.join(", ")}`);
41462
41546
  const p = jsonb(input2.parametros);
41463
41547
  const parametros = poblacion(problemas, p);
41548
+ const conds = condiciones(problemas, tipo, p);
41549
+ if (conds.length > 0) parametros.condiciones = conds;
41464
41550
  if (tipo === "orden_sin_turno") {
41465
41551
  const estudio = textoCorto(problemas, "estudio", p.estudio, 80, false);
41466
41552
  if (estudio) parametros.estudio = estudio;
@@ -41588,7 +41674,7 @@ function cambio(version2, actor, texto3) {
41588
41674
  return { version: version2, fecha: (/* @__PURE__ */ new Date()).toISOString(), actorTipo: actor.tipo, actorId: actor.id, cambio: texto3 };
41589
41675
  }
41590
41676
  function soloPersonas(actor, que) {
41591
- if (actor.tipo !== "humano") throw new OpsError("actor_no_permitido", `${que} lo hace una persona del hospital desde el portal; el agente solo lee las reglas e informa la prueba`);
41677
+ if (actor.tipo !== "humano") throw new OpsError("actor_no_permitido", `${que} lo hace una persona de la instituci\xF3n desde el portal; el agente solo lee las reglas e informa la prueba`);
41592
41678
  }
41593
41679
  async function crearRegla(ctx, input2) {
41594
41680
  soloPersonas(input2.actor, "crear una regla");
@@ -42201,11 +42287,11 @@ async function registrarAccion(ctx, input2) {
42201
42287
  const objetivo = str2(input2.objetivo);
42202
42288
  if (!objetivo) throw new OpsError("objetivo_requerido", "objetivo es obligatorio (qu\xE9 pantalla, endpoint o archivo se toc\xF3)");
42203
42289
  if (WORKFLOWS_SOLO_LECTURA.has(caso.workflow) && input2.tipo === "escritura" && input2.actor.tipo === "agente") {
42204
- throw new OpsError("politica", `en ${caso.workflow} el puesto solo lee: no registra escrituras sobre el sistema del hospital; eso lo hace el equipo`);
42290
+ throw new OpsError("politica", `en ${caso.workflow} el puesto solo lee: no registra escrituras sobre el HIS; eso lo hace el equipo`);
42205
42291
  }
42206
42292
  if (input2.tipo === "escritura" && input2.actor.tipo === "agente") {
42207
42293
  const modo = await obtenerModo(ctx, input2.companyId, caso.workflow);
42208
- if (!modoHabilita(modo, "ejecuta")) throw new OpsError("politica", `la pol\xEDtica vigente de ${caso.workflow} es "${modo}": un agente no puede registrar escrituras sobre el sistema del hospital`);
42294
+ if (!modoHabilita(modo, "ejecuta")) throw new OpsError("politica", `la pol\xEDtica vigente de ${caso.workflow} es "${modo}": un agente no puede registrar escrituras sobre el HIS`);
42209
42295
  }
42210
42296
  const id = randomUUID2();
42211
42297
  const evidencia = { ...input2.evidencia ?? {} };
@@ -42250,7 +42336,7 @@ function motivoSinCarga(caso) {
42250
42336
  }
42251
42337
  async function registrarCargaManual(ctx, input2) {
42252
42338
  if (input2.actor.tipo !== "humano") {
42253
- throw new OpsError("actor_no_permitido", "la carga manual la declara una persona del hospital; un agente carga con ops_registrar_accion y la transici\xF3n aplicar");
42339
+ throw new OpsError("actor_no_permitido", "la carga manual la declara una persona de la instituci\xF3n; un agente carga con ops_registrar_accion y la transici\xF3n aplicar");
42254
42340
  }
42255
42341
  const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
42256
42342
  if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
@@ -42282,7 +42368,7 @@ async function registrarCargaManual(ctx, input2) {
42282
42368
  casoId: caso.id,
42283
42369
  tipo: "escritura",
42284
42370
  conector: "manual",
42285
- objetivo: `Alephoo \xB7 ${caso.titulo}${caso.referencia ? ` (ref ${caso.referencia})` : ""}`,
42371
+ objetivo: `HIS \xB7 ${caso.titulo}${caso.referencia ? ` (ref ${caso.referencia})` : ""}`,
42286
42372
  resultado: "ok",
42287
42373
  evidencia: {
42288
42374
  ...persona ? { cargado_por: persona } : {},
@@ -42322,7 +42408,7 @@ async function registrarCargaManual(ctx, input2) {
42322
42408
  }
42323
42409
  }
42324
42410
  async function registrarRespuestaPaciente(ctx, input2) {
42325
- if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "la respuesta del paciente la registra una persona del hospital; un agente usa ops_transicionar");
42411
+ if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "la respuesta del paciente la registra una persona de la instituci\xF3n; un agente usa ops_transicionar");
42326
42412
  const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
42327
42413
  if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
42328
42414
  if (caso.workflow !== "recupero_turno") throw new OpsError("estado_invalido", "solo las citas ofrecidas al paciente llevan respuesta");
@@ -42332,7 +42418,7 @@ async function registrarRespuestaPaciente(ctx, input2) {
42332
42418
  return transicionar(ctx, { companyId: input2.companyId, casoId: caso.id, via: input2.acepto ? "aceptar" : "no_acepta", datos, motivo: comentario, idempotencyKey: input2.idempotencyKey, actor: input2.actor });
42333
42419
  }
42334
42420
  async function registrarContacto(ctx, input2) {
42335
- if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "el contacto manual lo declara una persona del hospital; un agente registra la escritura y usa ops_transicionar con contactar");
42421
+ if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "el contacto manual lo declara una persona de la instituci\xF3n; un agente registra la escritura y usa ops_transicionar con contactar");
42336
42422
  const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
42337
42423
  if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
42338
42424
  if (caso.workflow !== "demanda_pendiente") throw new OpsError("estado_invalido", "solo los casos de demanda pendiente llevan contacto");
@@ -43126,7 +43212,7 @@ async function manejarApi(ctx, input2) {
43126
43212
  case "respuesta-paciente":
43127
43213
  return respuesta(200, await registrarRespuestaPaciente(ctx, { companyId, casoId: input2.params.casoId ?? "", acepto: body.acepto === true, comentario: str3(body.comentario), persona: decididoPor, idempotencyKey: str3(body.idempotencyKey), actor }));
43128
43214
  case "no-corresponde": {
43129
- if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "no_corresponde lo decide una persona del hospital" });
43215
+ if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "no_corresponde lo decide una persona de la instituci\xF3n" });
43130
43216
  if (!str3(body.motivo)) return respuesta(422, { error: "validacion", motivo: "motivo_presente: no_corresponde requiere motivo" });
43131
43217
  return respuesta(200, await transicionar(ctx, { companyId, casoId: input2.params.casoId ?? "", via: "no_corresponde", motivo: motivoConPersona(str3(body.motivo)), datos: conPersona(obj(body.datos)), idempotencyKey: str3(body.idempotencyKey), actor }));
43132
43218
  }
@@ -43149,20 +43235,20 @@ async function manejarApi(ctx, input2) {
43149
43235
  case "reglas":
43150
43236
  return respuesta(200, { reglas: await listarReglas(ctx, companyId, { workflow: qs("workflow") ?? "demanda_pendiente", estado: qs("estado") }) });
43151
43237
  case "crear-regla": {
43152
- if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las crea una persona del hospital" });
43238
+ if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las crea una persona de la instituci\xF3n" });
43153
43239
  const workflow = str3(body.workflow) ?? "demanda_pendiente";
43154
43240
  return respuesta(200, { regla: await crearRegla(ctx, { companyId, workflow, nombre: body.nombre, tipo: body.tipo, parametros: body.parametros, contacto: body.contacto, cierre: body.cierre, actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
43155
43241
  }
43156
43242
  case "editar-regla": {
43157
- if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las edita una persona del hospital" });
43243
+ if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las edita una persona de la instituci\xF3n" });
43158
43244
  return respuesta(200, { regla: await editarRegla(ctx, { companyId, id: input2.params.reglaId ?? "", nombre: body.nombre, tipo: body.tipo, parametros: body.parametros, contacto: body.contacto, cierre: body.cierre, motivo: str3(body.motivo), actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
43159
43245
  }
43160
43246
  case "estado-regla": {
43161
- if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "activar o pausar una regla lo hace una persona del hospital" });
43247
+ if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "activar o pausar una regla lo hace una persona de la instituci\xF3n" });
43162
43248
  return respuesta(200, { regla: await cambiarEstadoRegla(ctx, { companyId, id: input2.params.reglaId ?? "", estado: body.estado, motivo: str3(body.motivo), actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
43163
43249
  }
43164
43250
  case "probar-regla": {
43165
- if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "la prueba la pide una persona del hospital; el agente la informa con ops_informar_prueba_regla" });
43251
+ if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "la prueba la pide una persona de la instituci\xF3n; el agente la informa con ops_informar_prueba_regla" });
43166
43252
  return respuesta(200, { regla: await pedirPruebaRegla(ctx, { companyId, id: input2.params.reglaId ?? "", actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
43167
43253
  }
43168
43254
  case "contacto":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperclip-plugin-autopilot-ops",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "type": "module",
5
5
  "description": "Autopilot Care · operación autónoma gobernada para instituciones de salud: workflows determinísticos, validaciones, registro de negocio, políticas (observa/propone/ejecuta/corte) y tablero del director, como plugin de Paperclip.",
6
6
  "files": [