Files
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

120 lines
3.7 KiB
TypeScript

import {
DOWNDETECTOR_API_BASE,
type DowndetectorGetCompanyAttributionParams,
type DowndetectorGetCompanyAttributionResponse,
} from '@/tools/downdetector/types'
import {
downdetectorHeaders,
encodePathParam,
extractDowndetectorError,
} from '@/tools/downdetector/utils'
import type { ToolConfig } from '@/tools/types'
interface RawAttribution {
attribution?: number
attribution_calculated_at?: string
user_impact?: number
user_impact_calculated_at?: string
reason?: number
danger_duration_s?: number
incident_id?: number
incident_created_at?: string
}
export const getCompanyAttributionTool: ToolConfig<
DowndetectorGetCompanyAttributionParams,
DowndetectorGetCompanyAttributionResponse
> = {
id: 'downdetector_get_company_attribution',
name: 'Downdetector Get Company Attribution',
description:
'Get the incident attribution for a Downdetector company while it is in an outage state — whether the issue is internal (isolated) or external (a dependency), the estimated user impact, and the related incident. Requires Incident Attribution access.',
version: '1.0.0',
params: {
companyId: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'The Downdetector company id',
},
apiKey: {
type: 'string',
required: true,
visibility: 'user-only',
description: 'Downdetector API Bearer token',
},
},
request: {
url: (params) =>
`${DOWNDETECTOR_API_BASE}/companies/${encodePathParam(params.companyId, 'Company ID')}/attribution`,
method: 'GET',
headers: (params) => downdetectorHeaders(params.apiKey),
},
transformResponse: async (response: Response) => {
const data: RawAttribution = await response.json()
if (!response.ok) {
throw new Error(extractDowndetectorError(data, 'Failed to get company attribution'))
}
return {
success: true,
output: {
attribution: {
attribution: data.attribution ?? null,
attributionCalculatedAt: data.attribution_calculated_at ?? null,
userImpact: data.user_impact ?? null,
userImpactCalculatedAt: data.user_impact_calculated_at ?? null,
reason: data.reason ?? null,
dangerDurationS: data.danger_duration_s ?? null,
incidentId: data.incident_id ?? null,
incidentCreatedAt: data.incident_created_at ?? null,
},
},
}
},
outputs: {
attribution: {
type: 'object',
description: 'Incident attribution detail',
properties: {
attribution: {
type: 'number',
description: 'Attribution enum (0 N/A, 1 undetermined, 2 external, 3 internal)',
},
attributionCalculatedAt: {
type: 'string',
description: 'ISO 8601 timestamp when attribution was calculated',
},
userImpact: {
type: 'number',
description: 'User impact enum (0 low, 1 medium, 2 high, 3 very high)',
},
userImpactCalculatedAt: {
type: 'string',
description: 'ISO 8601 timestamp when user impact was calculated',
},
reason: {
type: 'number',
description: 'Reason enum explaining how the attribution value was calculated (0-7)',
},
dangerDurationS: {
type: 'number',
description: 'Duration of the current danger (outage) state in seconds',
},
incidentId: {
type: 'number',
description: 'Id of the related incident (null when attribution is N/A)',
},
incidentCreatedAt: {
type: 'string',
description: 'ISO 8601 timestamp when the related incident was created',
},
},
},
},
}