Files
keysat/startos/actions/listWebhooks.ts
T
2026-04-22 17:46:43 -05:00

57 lines
1.7 KiB
TypeScript

// Action: list currently registered outbound webhook endpoints.
//
// Shows each endpoint's id, URL, event list, and active flag. Secrets are
// masked — rotate by deleting and recreating an endpoint.
import { sdk } from '../sdk'
import { adminCall, LICENSING_URL } from '../utils'
export const listWebhooks = sdk.Action.withoutInput(
'listWebhooks',
async ({ effects }) => ({
name: 'List webhook endpoints',
description: 'Show all currently-registered outbound webhook subscribers.',
warning: null,
allowedStatuses: 'only-running',
group: 'Webhooks',
visibility: 'enabled',
}),
async ({ effects }) => {
const store = await sdk.store.getOwn(effects, sdk.StorePath).const()
const resp = await adminCall(
LICENSING_URL,
store.admin_api_key,
'/v1/admin/webhook-endpoints',
{ method: 'GET' },
)
if (!resp.ok) {
throw new Error(`List webhooks failed: HTTP ${resp.status}${await resp.text()}`)
}
const body = (await resp.json()) as {
endpoints: Array<{
id: string
url: string
event_types: string[]
active: number | boolean
description: string
}>
}
if (body.endpoints.length === 0) {
return {
message:
'No webhook endpoints registered. Use "Register webhook endpoint" ' +
'to add one.',
}
}
const lines = body.endpoints.map((ep) => {
const activeStr = ep.active === true || ep.active === 1 ? 'active' : 'disabled'
return `${ep.id} [${activeStr}] ${ep.url} events=${ep.event_types.join(',')}` +
(ep.description ? ` ("${ep.description}")` : '')
})
return {
message:
`${body.endpoints.length} endpoint(s):\n\n` + lines.join('\n'),
}
},
)