paperclip-plugin-autopilot-ops 0.0.0-stage → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -2
- package/dist/manifest.js +311 -0
- package/dist/ui/index.js +617 -0
- package/dist/worker.js +41606 -0
- package/migrations/001_autopilot_ops.sql +106 -0
- package/migrations/002_tableros.sql +30 -0
- package/package.json +56 -4
package/README.md
CHANGED
|
@@ -1,3 +1,163 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Autopilot Care · plugin `autopilot-ops` para Paperclip
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Operación autónoma gobernada para instituciones de salud. Este plugin es la capa
|
|
4
|
+
determinística que corre **dentro** de Paperclip (mismo proceso de plugins, misma
|
|
5
|
+
base, misma UI): workflows por puesto, validaciones de negocio, registro de cada
|
|
6
|
+
acción con su evidencia, políticas de autonomía con circuito de corte y el tablero
|
|
7
|
+
del director. Los agentes de Paperclip no tocan nada directo: deciden y llaman
|
|
8
|
+
herramientas de este plugin; el tool gateway de Paperclip autoriza; el plugin
|
|
9
|
+
ejecuta y registra.
|
|
10
|
+
|
|
11
|
+
Arquitectura completa: documento *Arquitectura Autopilot Care sobre Paperclip*.
|
|
12
|
+
|
|
13
|
+
## Qué hay adentro
|
|
14
|
+
|
|
15
|
+
| Capa | Dónde | Qué hace |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| Workflows | `src/workflows.ts` | Estados, tabla de transiciones, quién puede ejecutar cada una, validaciones puras. Sin IA. |
|
|
18
|
+
| Registro de negocio | `migrations/001_autopilot_ops.sql`, `src/ops.ts` | Tablas `caso`, `transicion`, `accion`, `politica`, `politica_historial` en el namespace del plugin. Todo lleva `company_id`. |
|
|
19
|
+
| Herramientas para agentes | `src/worker.ts` (`ctx.tools`) | `ops_listar_casos`, `ops_leer_caso`, `ops_abrir_caso`, `ops_transicionar`, `ops_registrar_accion`, `ops_consultar_indicador`, `ops_publicar_tablero`, `ops_listar_tableros`. Pasan por el tool gateway. |
|
|
20
|
+
| Tableros del hospital | `migrations/002_tableros.sql`, `src/tableros.ts` | Tabla `tablero`: lo que publica el Agente de tableros sobre los datos de Alephoo (clave estable, título, período, fuentes, widgets). El plugin valida la forma de los widgets; el portal los dibuja. |
|
|
21
|
+
| Gobierno | `politica` + UI | Modo por workflow e institución: `corte` · `observa` · `propone` · `ejecuta` · `autonomo` (aprobación por excepción: salta a aprobado salvo que una regla de excepción se dispare: variación > 20 %, sin valor actual, reintento tras diferencias, baja de valor). Default `propone`. |
|
|
22
|
+
| Tablero del director | `src/ui/index.tsx` | Pantalla `/<empresa>/autopilot`: horas absorbidas, pendientes de aprobación con Aprobar / Rechazar, estado por puesto, políticas y corte. |
|
|
23
|
+
| API para el portal | `apiRoutes` (auth `board`) | `GET /tablero`, `GET /serie`, `GET /casos`, `GET /casos/:id`, `POST /casos/:id/aprobar`, `POST /casos/:id/rechazar`, `POST /casos/:id/cargado`, `GET /politicas`, `GET /politicas/historial`, `POST /politicas`, `GET /tableros`, `GET /tableros/:clave`, `GET /version`. Montadas en `/api/plugins/alephoo.autopilot-ops/api/*`. |
|
|
24
|
+
|
|
25
|
+
### Workflows incluidos
|
|
26
|
+
|
|
27
|
+
**`actualizacion_arancel`** (puesto Convenios y facturación, 25 min absorbidos por caso)
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
detectado ─proponer(agente)→ pendiente_aprobacion ─aprobar(humano)→ aprobado ─aplicar(agente en ejecuta, o persona: carga manual)→ aplicado ─verificar→ verificado
|
|
31
|
+
└rechazar(humano)→ rechazado └→ con_diferencias ─proponer→ …
|
|
32
|
+
└corregir(persona)→ aplicado
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Validaciones de `proponer`: valor nuevo > 0, vigencia `AAAA-MM-DD`, fuente
|
|
36
|
+
obligatoria, variación > 50 % requiere justificación. `aplicar` exige el id de la
|
|
37
|
+
escritura registrada con `ops_registrar_accion`. `verificar` compara el valor
|
|
38
|
+
releído con el aprobado y decide el destino.
|
|
39
|
+
|
|
40
|
+
**`tarea_operativa`** (genérico, 15 min): `abierta → en_curso → pendiente_aprobacion → cerrada | rechazada`.
|
|
41
|
+
|
|
42
|
+
### Reglas que el plugin impone siempre
|
|
43
|
+
|
|
44
|
+
- `aprobar`, `rechazar`, `cancelar` y cambiar la política son **solo humanas**.
|
|
45
|
+
- `companyId` viene del host (contexto de ejecución del agente, bridge de la UI o
|
|
46
|
+
ruta API). Un agente no puede ver ni tocar casos de otra institución.
|
|
47
|
+
- Un agente solo registra **escrituras** sobre el sistema del hospital si el
|
|
48
|
+
workflow está en modo `ejecuta`.
|
|
49
|
+
- En `corte` el agente no abre ni mueve casos.
|
|
50
|
+
- Si una validación falla, el caso no cambia y el agente recibe el motivo con un
|
|
51
|
+
código estable (`validacion: fuente_presente: …`).
|
|
52
|
+
- Toda transición y acción queda en el registro; además se escribe en el
|
|
53
|
+
activity log de Paperclip.
|
|
54
|
+
- `idempotencyKey` en `ops_abrir_caso` y `ops_transicionar` hace los reintentos
|
|
55
|
+
seguros; `referencia` evita abrir dos casos sobre el mismo objeto.
|
|
56
|
+
- Quien carga no se controla a sí mismo: una carga manual la comprueba después
|
|
57
|
+
el agente releyendo el sistema (`verificar`).
|
|
58
|
+
|
|
59
|
+
### Carga manual del equipo del hospital (0.1.5)
|
|
60
|
+
|
|
61
|
+
En `propone` el agente no escribe en Alephoo: lo aprobado lo carga una persona
|
|
62
|
+
del hospital. El portal lo muestra en **Para cargar** y la persona lo marca con
|
|
63
|
+
`POST /casos/:id/cargado` (`valorCargado?`, `comentario?`, `decididoPor`,
|
|
64
|
+
`idempotencyKey?`), o la acción `marcar-cargado` desde la UI de Paperclip:
|
|
65
|
+
|
|
66
|
+
- El plugin registra una **escritura manual** (`conector: "manual"`) con su
|
|
67
|
+
evidencia (`cargado_por`, `valor_cargado`, `valor_aprobado`, `vigencia_desde`,
|
|
68
|
+
`nota`) y mueve el caso con la transición de carga de su estado: `aplicar`
|
|
69
|
+
desde `aprobado`, o `corregir` desde `con_diferencias` (una carga que no
|
|
70
|
+
coincidió se corrige y se vuelve a comprobar sin otra aprobación, porque el
|
|
71
|
+
valor aprobado no cambia; `corregir` es solo humana y descarta la lectura anterior).
|
|
72
|
+
- Antes de escribir evalúa la transición; si el caso no está para cargar,
|
|
73
|
+
responde `estado_invalido` con el motivo y no toca nada.
|
|
74
|
+
- Después el agente comprueba: lee el valor en Alephoo, registra la
|
|
75
|
+
verificación y llama `verificar` con `datos.valor_leido`. El portal se lo pide
|
|
76
|
+
con una tarea en Paperclip (`Comprobar carga: …`, asignada al agente del caso).
|
|
77
|
+
- `GET /version` devuelve `{version, capacidades: ["carga-manual"]}`: el portal
|
|
78
|
+
lo usa para saber si el plugin instalado ya registra cargas.
|
|
79
|
+
|
|
80
|
+
### Tableros publicados por agentes (0.1.4)
|
|
81
|
+
|
|
82
|
+
El Agente de tableros no mueve casos: lee Alephoo por API, calcula lo que pidió
|
|
83
|
+
la dirección y publica el resultado con `ops_publicar_tablero`:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"clave": "turnos-ausentismo",
|
|
88
|
+
"titulo": "Turnos y ausentismo por servicio",
|
|
89
|
+
"pedido": "Quiero ver cuántos turnos damos por servicio y cuántos pacientes faltan",
|
|
90
|
+
"periodo": "septiembre 2026",
|
|
91
|
+
"fuentes": ["Alephoo · api-consultas · turnos 01/09–30/09"],
|
|
92
|
+
"widgets": [
|
|
93
|
+
{ "tipo": "indicador", "etiqueta": "Turnos dados", "valor": 1842, "contexto": "22 días hábiles", "tono": "senal" },
|
|
94
|
+
{ "tipo": "barras", "titulo": "Turnos por servicio", "series": [{ "etiqueta": "Clínica", "valor": 620 }] },
|
|
95
|
+
{ "tipo": "linea", "titulo": "Turnos por día", "puntos": [{ "x": "2026-09-01", "y": 61 }] },
|
|
96
|
+
{ "tipo": "tabla", "titulo": "Más ausentes", "columnas": ["Profesional", "Ausentes"], "filas": [["Dra. Medina", 14]] },
|
|
97
|
+
{ "tipo": "texto", "titulo": "Lectura", "texto": "El ausentismo baja 1,5 puntos." }
|
|
98
|
+
],
|
|
99
|
+
"issueId": "<uuid de la tarea que lo pidió>"
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- `clave` es estable: volver a publicar con la misma clave actualiza el tablero
|
|
104
|
+
en el lugar y suma una versión (`ops_listar_tableros` muestra las existentes).
|
|
105
|
+
- Tipos de widget: `indicador`, `barras`, `linea`, `tabla`, `texto`; `ancho` 1–3
|
|
106
|
+
opcional. La validación devuelve todos los problemas juntos
|
|
107
|
+
(`tablero_invalido: widgets[2].filas[0] tiene 1 celdas y la tabla 2 columnas`).
|
|
108
|
+
- El portal del hospital los muestra en la sección **Tableros**; los pedidos de
|
|
109
|
+
la dirección llegan como tareas de Paperclip con título `Tablero: …`.
|
|
110
|
+
|
|
111
|
+
## Desarrollo
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
pnpm install
|
|
115
|
+
pnpm verify # typecheck + tests + build
|
|
116
|
+
pnpm dev # esbuild en modo watch (dist/manifest.js, dist/worker.js, dist/ui/)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Tests (`tests/`): motor de workflows, cableado de herramientas / acciones / rutas
|
|
120
|
+
con el harness del SDK, y `sql.spec.ts`, que pasa la migración y todo el SQL de
|
|
121
|
+
ejecución por una copia del validador de SQL del propio host Paperclip.
|
|
122
|
+
|
|
123
|
+
### Agregar un workflow
|
|
124
|
+
|
|
125
|
+
1. Definirlo en `src/workflows.ts` (estados, `inicial`, finales, `minutosAbsorbidos`, transiciones con `actor`, `nivelRequerido` y `validar`).
|
|
126
|
+
2. Agregarlo a `WORKFLOWS`. No hace falta tocar la base: los casos son genéricos.
|
|
127
|
+
3. Los tests de `tests/workflows.spec.ts` verifican invariantes para todos los workflows.
|
|
128
|
+
|
|
129
|
+
## Instalación en una instancia Paperclip
|
|
130
|
+
|
|
131
|
+
Paperclip instala plugins de dos formas (`POST /api/plugins/install`, solo
|
|
132
|
+
administradores de instancia):
|
|
133
|
+
|
|
134
|
+
1. **Desde npm** (la pantalla *Settings → Plugins → Install Plugin* solo acepta
|
|
135
|
+
un nombre de paquete npm): la instancia corre `npm install <paquete>` en su
|
|
136
|
+
directorio de plugins. Requiere publicar este paquete como
|
|
137
|
+
`paperclip-plugin-autopilot-ops`:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
pnpm install && pnpm verify # deja dist/ construido; la instalación corre con --ignore-scripts
|
|
141
|
+
npm login
|
|
142
|
+
npm publish
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Después, en la pantalla, escribir `paperclip-plugin-autopilot-ops` e Install.
|
|
146
|
+
2. **Desde una ruta local del servidor**: clonar este repositorio en la máquina
|
|
147
|
+
donde corre Paperclip, `pnpm install && pnpm build`, y luego
|
|
148
|
+
`paperclipai plugin install /ruta/al/plugin` (o la misma pantalla con la
|
|
149
|
+
opción de ruta local). En desarrollo, `pnpm dev` deja el worker recargando.
|
|
150
|
+
|
|
151
|
+
Después de instalar, el agente que va a usar las herramientas necesita un
|
|
152
|
+
**perfil de herramientas** que permita las de este plugin (Agent settings →
|
|
153
|
+
Tools); el gateway niega por defecto todo lo que no está permitido.
|
|
154
|
+
|
|
155
|
+
## Primer caso de uso (MVP)
|
|
156
|
+
|
|
157
|
+
Agente `Turnos`/`Convenios` detecta un cambio de arancel en el sistema de
|
|
158
|
+
gestión → `ops_abrir_caso` (`actualizacion_arancel`, referencia = convenio +
|
|
159
|
+
práctica) → `ops_registrar_accion` (lectura, evidencia) → `ops_transicionar`
|
|
160
|
+
`proponer` con `valor_nuevo`, `vigencia_desde`, `fuente` → el responsable del
|
|
161
|
+
hospital ve el caso en *Pendientes de aprobación* y aprueba → en modo `ejecuta`,
|
|
162
|
+
el agente aplica, registra la escritura y verifica → el tablero suma 25 minutos
|
|
163
|
+
absorbidos.
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// src/manifest.ts
|
|
2
|
+
var PLUGIN_ID = "alephoo.autopilot-ops";
|
|
3
|
+
var PLUGIN_VERSION = "0.1.5";
|
|
4
|
+
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
5
|
+
var PAGE_ROUTE = "autopilot";
|
|
6
|
+
var TOOL_NAMES = {
|
|
7
|
+
listarCasos: "ops_listar_casos",
|
|
8
|
+
leerCaso: "ops_leer_caso",
|
|
9
|
+
abrirCaso: "ops_abrir_caso",
|
|
10
|
+
transicionar: "ops_transicionar",
|
|
11
|
+
registrarAccion: "ops_registrar_accion",
|
|
12
|
+
consultarIndicador: "ops_consultar_indicador",
|
|
13
|
+
publicarTablero: "ops_publicar_tablero",
|
|
14
|
+
listarTableros: "ops_listar_tableros"
|
|
15
|
+
};
|
|
16
|
+
var DATA_KEYS = {
|
|
17
|
+
tablero: "tablero",
|
|
18
|
+
serie: "serie",
|
|
19
|
+
historialPoliticas: "historial-politicas",
|
|
20
|
+
casos: "casos",
|
|
21
|
+
caso: "caso",
|
|
22
|
+
politicas: "politicas",
|
|
23
|
+
workflows: "workflows"
|
|
24
|
+
};
|
|
25
|
+
var ACTION_KEYS = {
|
|
26
|
+
aprobar: "aprobar",
|
|
27
|
+
rechazar: "rechazar",
|
|
28
|
+
marcarCargado: "marcar-cargado",
|
|
29
|
+
cambiarPolitica: "cambiar-politica",
|
|
30
|
+
abrirCaso: "abrir-caso"
|
|
31
|
+
};
|
|
32
|
+
var manifest = {
|
|
33
|
+
id: PLUGIN_ID,
|
|
34
|
+
apiVersion: 1,
|
|
35
|
+
version: PLUGIN_VERSION,
|
|
36
|
+
displayName: "Autopilot Care",
|
|
37
|
+
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
38
|
+
author: "Alephoo",
|
|
39
|
+
categories: ["automation", "ui"],
|
|
40
|
+
capabilities: [
|
|
41
|
+
"database.namespace.migrate",
|
|
42
|
+
"database.namespace.read",
|
|
43
|
+
"database.namespace.write",
|
|
44
|
+
"agent.tools.register",
|
|
45
|
+
"api.routes.register",
|
|
46
|
+
"activity.log.write",
|
|
47
|
+
"companies.read",
|
|
48
|
+
"ui.sidebar.register",
|
|
49
|
+
"ui.page.register"
|
|
50
|
+
],
|
|
51
|
+
entrypoints: {
|
|
52
|
+
worker: "./dist/worker.js",
|
|
53
|
+
ui: "./dist/ui"
|
|
54
|
+
},
|
|
55
|
+
database: {
|
|
56
|
+
namespaceSlug: DB_NAMESPACE_SLUG,
|
|
57
|
+
migrationsDir: "migrations",
|
|
58
|
+
coreReadTables: ["companies", "agents", "issues"]
|
|
59
|
+
},
|
|
60
|
+
tools: [
|
|
61
|
+
{
|
|
62
|
+
name: TOOL_NAMES.listarCasos,
|
|
63
|
+
displayName: "Listar casos",
|
|
64
|
+
description: "Lista casos del registro de negocio de la instituci\xF3n. Filtros opcionales: workflow, estado, limit (m\xE1x. 100). Solo lectura.",
|
|
65
|
+
parametersSchema: {
|
|
66
|
+
type: "object",
|
|
67
|
+
properties: {
|
|
68
|
+
workflow: { type: "string" },
|
|
69
|
+
estado: { type: "string" },
|
|
70
|
+
limit: { type: "number" }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: TOOL_NAMES.leerCaso,
|
|
76
|
+
displayName: "Leer caso",
|
|
77
|
+
description: "Devuelve un caso con su historial de transiciones y acciones registradas. Solo lectura.",
|
|
78
|
+
parametersSchema: {
|
|
79
|
+
type: "object",
|
|
80
|
+
properties: { casoId: { type: "string" } },
|
|
81
|
+
required: ["casoId"]
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: TOOL_NAMES.abrirCaso,
|
|
86
|
+
displayName: "Abrir caso",
|
|
87
|
+
description: "Abre un caso nuevo en un workflow, en su estado inicial. `referencia` identifica el objeto real (convenio, cuenta, profesional) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.",
|
|
88
|
+
parametersSchema: {
|
|
89
|
+
type: "object",
|
|
90
|
+
properties: {
|
|
91
|
+
workflow: { type: "string" },
|
|
92
|
+
referencia: { type: "string" },
|
|
93
|
+
titulo: { type: "string" },
|
|
94
|
+
datos: { type: "object" },
|
|
95
|
+
idempotencyKey: { type: "string" },
|
|
96
|
+
issueId: { type: "string", description: "Tarea de Paperclip que origina el caso (opcional; UUID)." }
|
|
97
|
+
},
|
|
98
|
+
required: ["workflow", "titulo"]
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: TOOL_NAMES.transicionar,
|
|
103
|
+
displayName: "Transicionar caso",
|
|
104
|
+
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`.",
|
|
105
|
+
parametersSchema: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {
|
|
108
|
+
casoId: { type: "string" },
|
|
109
|
+
via: { type: "string" },
|
|
110
|
+
datos: { type: "object" },
|
|
111
|
+
motivo: { type: "string" },
|
|
112
|
+
idempotencyKey: { type: "string" }
|
|
113
|
+
},
|
|
114
|
+
required: ["casoId", "via"]
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: TOOL_NAMES.registrarAccion,
|
|
119
|
+
displayName: "Registrar acci\xF3n",
|
|
120
|
+
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.",
|
|
121
|
+
parametersSchema: {
|
|
122
|
+
type: "object",
|
|
123
|
+
properties: {
|
|
124
|
+
casoId: { type: "string" },
|
|
125
|
+
tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
|
|
126
|
+
conector: { type: "string", enum: ["api", "archivo", "pantalla", "manual"] },
|
|
127
|
+
objetivo: { type: "string" },
|
|
128
|
+
resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
|
|
129
|
+
evidencia: { type: "object" },
|
|
130
|
+
detalle: { type: "string" }
|
|
131
|
+
},
|
|
132
|
+
required: ["casoId", "tipo", "conector", "objetivo", "resultado"]
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: TOOL_NAMES.consultarIndicador,
|
|
137
|
+
displayName: "Consultar indicador",
|
|
138
|
+
description: "Devuelve indicadores calculados del registro de negocio (los mismos que ve el director): `resumen`, `por_estado`, `pendientes`, `horas`. Solo lectura.",
|
|
139
|
+
parametersSchema: {
|
|
140
|
+
type: "object",
|
|
141
|
+
properties: {
|
|
142
|
+
indicador: { type: "string", enum: ["resumen", "por_estado", "pendientes", "horas"] },
|
|
143
|
+
workflow: { type: "string" },
|
|
144
|
+
dias: { type: "number" }
|
|
145
|
+
},
|
|
146
|
+
required: ["indicador"]
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: TOOL_NAMES.publicarTablero,
|
|
151
|
+
displayName: "Publicar tablero",
|
|
152
|
+
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). `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 api-consultas \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
|
|
153
|
+
parametersSchema: {
|
|
154
|
+
type: "object",
|
|
155
|
+
properties: {
|
|
156
|
+
clave: { type: "string" },
|
|
157
|
+
titulo: { type: "string" },
|
|
158
|
+
descripcion: { type: "string" },
|
|
159
|
+
pedido: { type: "string", description: "Qu\xE9 pidi\xF3 la direcci\xF3n, en sus palabras." },
|
|
160
|
+
periodo: { type: "string", description: "Per\xEDodo que cubren los datos, p. ej. 'septiembre 2026'." },
|
|
161
|
+
fuentes: { type: "array", items: { type: "string" } },
|
|
162
|
+
widgets: { type: "array", items: { type: "object" } },
|
|
163
|
+
issueId: { type: "string", description: "Tarea de Paperclip que origin\xF3 el tablero (opcional; UUID)." }
|
|
164
|
+
},
|
|
165
|
+
required: ["clave", "titulo", "widgets"]
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: TOOL_NAMES.listarTableros,
|
|
170
|
+
displayName: "Listar tableros",
|
|
171
|
+
description: "Lista los tableros publicados para esta instituci\xF3n (clave, t\xEDtulo, per\xEDodo, fuentes, cu\xE1ndo se actualiz\xF3 y cu\xE1ntos widgets tiene). Usar antes de publicar para reutilizar la clave de un tablero existente en vez de crear uno nuevo. Solo lectura.",
|
|
172
|
+
parametersSchema: { type: "object", properties: {} }
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
apiRoutes: [
|
|
176
|
+
{
|
|
177
|
+
routeKey: "tablero",
|
|
178
|
+
method: "GET",
|
|
179
|
+
path: "/tablero",
|
|
180
|
+
auth: "board",
|
|
181
|
+
capability: "api.routes.register",
|
|
182
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
routeKey: "casos",
|
|
186
|
+
method: "GET",
|
|
187
|
+
path: "/casos",
|
|
188
|
+
auth: "board",
|
|
189
|
+
capability: "api.routes.register",
|
|
190
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
routeKey: "caso",
|
|
194
|
+
method: "GET",
|
|
195
|
+
path: "/casos/:casoId",
|
|
196
|
+
auth: "board",
|
|
197
|
+
capability: "api.routes.register",
|
|
198
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
routeKey: "aprobar",
|
|
202
|
+
method: "POST",
|
|
203
|
+
path: "/casos/:casoId/aprobar",
|
|
204
|
+
auth: "board",
|
|
205
|
+
capability: "api.routes.register",
|
|
206
|
+
companyResolution: { from: "body", key: "companyId" }
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
routeKey: "rechazar",
|
|
210
|
+
method: "POST",
|
|
211
|
+
path: "/casos/:casoId/rechazar",
|
|
212
|
+
auth: "board",
|
|
213
|
+
capability: "api.routes.register",
|
|
214
|
+
companyResolution: { from: "body", key: "companyId" }
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
routeKey: "marcar-cargado",
|
|
218
|
+
method: "POST",
|
|
219
|
+
path: "/casos/:casoId/cargado",
|
|
220
|
+
auth: "board",
|
|
221
|
+
capability: "api.routes.register",
|
|
222
|
+
companyResolution: { from: "body", key: "companyId" }
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
routeKey: "version",
|
|
226
|
+
method: "GET",
|
|
227
|
+
path: "/version",
|
|
228
|
+
auth: "board",
|
|
229
|
+
capability: "api.routes.register",
|
|
230
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
routeKey: "serie",
|
|
234
|
+
method: "GET",
|
|
235
|
+
path: "/serie",
|
|
236
|
+
auth: "board",
|
|
237
|
+
capability: "api.routes.register",
|
|
238
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
routeKey: "historial-politicas",
|
|
242
|
+
method: "GET",
|
|
243
|
+
path: "/politicas/historial",
|
|
244
|
+
auth: "board",
|
|
245
|
+
capability: "api.routes.register",
|
|
246
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
routeKey: "politicas",
|
|
250
|
+
method: "GET",
|
|
251
|
+
path: "/politicas",
|
|
252
|
+
auth: "board",
|
|
253
|
+
capability: "api.routes.register",
|
|
254
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
routeKey: "cambiar-politica",
|
|
258
|
+
method: "POST",
|
|
259
|
+
path: "/politicas",
|
|
260
|
+
auth: "board",
|
|
261
|
+
capability: "api.routes.register",
|
|
262
|
+
companyResolution: { from: "body", key: "companyId" }
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
routeKey: "tableros",
|
|
266
|
+
method: "GET",
|
|
267
|
+
path: "/tableros",
|
|
268
|
+
auth: "board",
|
|
269
|
+
capability: "api.routes.register",
|
|
270
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
routeKey: "tablero-publicado",
|
|
274
|
+
method: "GET",
|
|
275
|
+
path: "/tableros/:clave",
|
|
276
|
+
auth: "board",
|
|
277
|
+
capability: "api.routes.register",
|
|
278
|
+
companyResolution: { from: "query", key: "companyId" }
|
|
279
|
+
}
|
|
280
|
+
],
|
|
281
|
+
ui: {
|
|
282
|
+
slots: [
|
|
283
|
+
{
|
|
284
|
+
type: "sidebar",
|
|
285
|
+
id: "autopilot-sidebar",
|
|
286
|
+
displayName: "Autopilot Care",
|
|
287
|
+
exportName: "SidebarLink",
|
|
288
|
+
order: 30
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
type: "page",
|
|
292
|
+
id: "autopilot-page",
|
|
293
|
+
displayName: "Autopilot Care",
|
|
294
|
+
exportName: "TableroPage",
|
|
295
|
+
routePath: PAGE_ROUTE
|
|
296
|
+
}
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
var manifest_default = manifest;
|
|
301
|
+
export {
|
|
302
|
+
ACTION_KEYS,
|
|
303
|
+
DATA_KEYS,
|
|
304
|
+
DB_NAMESPACE_SLUG,
|
|
305
|
+
PAGE_ROUTE,
|
|
306
|
+
PLUGIN_ID,
|
|
307
|
+
PLUGIN_VERSION,
|
|
308
|
+
TOOL_NAMES,
|
|
309
|
+
manifest_default as default
|
|
310
|
+
};
|
|
311
|
+
//# sourceMappingURL=manifest.js.map
|