@mastra/factory 0.18.0-alpha.7 → 0.18.0-alpha.9

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.
Files changed (66) hide show
  1. package/dist/boards/review.d.ts +2 -0
  2. package/dist/boards/review.d.ts.map +1 -1
  3. package/dist/boards/review.js +16 -6
  4. package/dist/boards/review.js.map +1 -1
  5. package/dist/boards/work-transition-policy.d.ts.map +1 -1
  6. package/dist/boards/work-transition-policy.js +10 -0
  7. package/dist/boards/work-transition-policy.js.map +1 -1
  8. package/dist/integrations/github/default-rules.d.ts +17 -1
  9. package/dist/integrations/github/default-rules.d.ts.map +1 -1
  10. package/dist/integrations/github/default-rules.js +28 -6
  11. package/dist/integrations/github/default-rules.js.map +1 -1
  12. package/dist/integrations/github/reconcile-worker.d.ts.map +1 -1
  13. package/dist/integrations/github/reconcile-worker.js.map +1 -1
  14. package/dist/integrations/github/rules.d.ts.map +1 -1
  15. package/dist/integrations/github/rules.js +32 -5
  16. package/dist/integrations/github/rules.js.map +1 -1
  17. package/dist/integrations/github/sandbox.d.ts.map +1 -1
  18. package/dist/integrations/github/sandbox.js.map +1 -1
  19. package/dist/integrations/gitlab/api.d.ts.map +1 -1
  20. package/dist/integrations/gitlab/api.js.map +1 -1
  21. package/dist/integrations/gitlab/default-rules.d.ts.map +1 -1
  22. package/dist/integrations/gitlab/default-rules.js +1 -0
  23. package/dist/integrations/gitlab/default-rules.js.map +1 -1
  24. package/dist/integrations/gitlab/reconciler.d.ts.map +1 -1
  25. package/dist/integrations/gitlab/reconciler.js.map +1 -1
  26. package/dist/integrations/gitlab/reconciliation-config.d.ts.map +1 -1
  27. package/dist/integrations/gitlab/reconciliation-config.js.map +1 -1
  28. package/dist/integrations/gitlab/rules.d.ts.map +1 -1
  29. package/dist/integrations/gitlab/rules.js +66 -0
  30. package/dist/integrations/gitlab/rules.js.map +1 -1
  31. package/dist/integrations/gitlab/version-control.d.ts.map +1 -1
  32. package/dist/integrations/gitlab/version-control.js.map +1 -1
  33. package/dist/integrations/incidentio/api.d.ts.map +1 -1
  34. package/dist/integrations/incidentio/api.js.map +1 -1
  35. package/dist/integrations/incidentio/intake.d.ts.map +1 -1
  36. package/dist/integrations/incidentio/intake.js.map +1 -1
  37. package/dist/integrations/issue-reconcile-worker.d.ts.map +1 -1
  38. package/dist/integrations/issue-reconcile-worker.js.map +1 -1
  39. package/dist/integrations/platform/linear/event-worker.js.map +1 -1
  40. package/dist/integrations/slack/emoji-shortcodes.generated.js.map +1 -1
  41. package/dist/integrations/slack/feed-publisher.d.ts.map +1 -1
  42. package/dist/integrations/slack/feed-publisher.js.map +1 -1
  43. package/dist/integrations/slack/slack.d.ts.map +1 -1
  44. package/dist/integrations/slack/slack.js +16 -3
  45. package/dist/integrations/slack/slack.js.map +1 -1
  46. package/dist/rules/dispatcher.d.ts.map +1 -1
  47. package/dist/rules/dispatcher.js +6 -0
  48. package/dist/rules/dispatcher.js.map +1 -1
  49. package/dist/rules/tools.d.ts +1 -0
  50. package/dist/rules/tools.d.ts.map +1 -1
  51. package/dist/rules/tools.js +107 -32
  52. package/dist/rules/tools.js.map +1 -1
  53. package/dist/session/factory-session.d.ts +6 -0
  54. package/dist/session/factory-session.d.ts.map +1 -1
  55. package/dist/session/factory-session.js +3 -2
  56. package/dist/session/factory-session.js.map +1 -1
  57. package/dist/storage/domains/integrations/base.d.ts.map +1 -1
  58. package/dist/storage/domains/integrations/base.js.map +1 -1
  59. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  60. package/dist/storage/domains/work-items/base.js +5 -0
  61. package/dist/storage/domains/work-items/base.js.map +1 -1
  62. package/factory-skills/factory-gitlab-rereview/SKILL.md +3 -3
  63. package/factory-skills/factory-gitlab-review/SKILL.md +5 -5
  64. package/factory-skills/factory-rereview/SKILL.md +17 -13
  65. package/factory-skills/factory-review/SKILL.md +17 -13
  66. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/integrations/incidentio/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/integrations/incidentio/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","names":["#baseUrl","#accessToken","#fetch","#request","#page"],"sources":["../../../src/integrations/incidentio/api.ts"],"sourcesContent":["export interface IncidentioUser {\n id: string;\n name: string;\n email?: string;\n role?: string;\n slack_user_id?: string;\n}\n\nexport interface IncidentioActor {\n alert?: { id: string; title: string };\n api_key?: { id: string; name: string };\n user?: IncidentioUser;\n workflow?: { id: string; name: string };\n}\n\nexport interface IncidentioIncident {\n id: string;\n reference: string;\n name: string;\n summary?: string;\n permalink?: string;\n visibility: string;\n mode: string;\n creator: IncidentioActor;\n incident_status: { id: string; name: string; category: string };\n incident_type?: { id: string; name: string };\n severity?: { id: string; name: string; rank: number };\n slack_channel_url?: string;\n postmortem_document_url?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioFollowUp {\n id: string;\n incident_id: string;\n title: string;\n description?: string;\n status: 'outstanding' | 'completed' | 'deleted' | 'not_doing';\n creator: IncidentioActor;\n assignee?: IncidentioUser | null;\n assignee_team?: { id: string; name: string } | null;\n labels: string[];\n priority?: { id: string; name: string; rank: number } | null;\n category?: { id: string; name: string } | null;\n external_issue_reference?: { issue_name: string; issue_permalink: string; provider: string } | null;\n completed_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioAction {\n id: string;\n incident_id: string;\n description: string;\n status: 'outstanding' | 'completed' | 'deleted' | 'not_doing';\n creator: IncidentioActor;\n assignee?: IncidentioUser;\n completed_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioIncidentUpdate {\n id: string;\n incident_id: string;\n updater: IncidentioActor;\n new_incident_status: { id: string; name: string; category: string };\n message?: string;\n merged_into_incident_id?: string;\n new_severity?: { id: string; name: string; rank: number };\n created_at: string;\n}\n\nexport interface IncidentioAlertAttributeValue {\n catalog_entry?: { id: string; name: string; catalog_type_id?: string };\n label?: string;\n literal?: string;\n}\n\nexport interface IncidentioAlertAttributeEntry {\n attribute: {\n id: string;\n name: string;\n type: string;\n array: boolean;\n required: boolean;\n emoji?: string;\n };\n value?: IncidentioAlertAttributeValue;\n array_value?: IncidentioAlertAttributeValue[];\n}\n\nexport interface IncidentioAlert {\n id: string;\n alert_source_id: string;\n deduplication_key: string;\n status: 'firing' | 'resolved';\n title: string;\n attributes: IncidentioAlertAttributeEntry[];\n alert_group_ids?: string[];\n description?: string;\n resolved_at?: string;\n source_url?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioEscalation {\n id: string;\n status:\n | 'pending'\n | 'triggered'\n | 'acked'\n | 'resolved'\n | 'expired'\n | 'cancelled'\n | 'snoozed'\n | 'delayed'\n | 'pending_repeat';\n title: string;\n description: string;\n priority: { name: string };\n creator: IncidentioActor;\n escalation_path_id?: string;\n events: Array<{\n id: string;\n event:\n | 'entered_grace_period'\n | 'triggered'\n | 'notified_users'\n | 'notified_channels'\n | 'acked'\n | 'cancelled'\n | 'resolved'\n | 'expired';\n occurred_at: string;\n urgency?: 'high' | 'low';\n users?: IncidentioUser[];\n channels?: Array<{\n microsoft_teams_channel_id?: string;\n microsoft_teams_team_id?: string;\n slack_channel_id?: string;\n slack_team_id?: string;\n }>;\n }>;\n related_incidents: Array<{\n id: string;\n external_id: number;\n name: string;\n reference: string;\n visibility: 'public' | 'private';\n status_category: string;\n summary?: string;\n }>;\n related_alerts: Array<{\n id: string;\n alert_source_id: string;\n deduplication_key: string;\n status: 'firing' | 'resolved';\n title: string;\n alert_group_ids?: string[];\n description?: string;\n resolved_at?: string;\n source_url?: string;\n created_at: string;\n updated_at: string;\n }>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogEntry {\n id: string;\n catalog_type_id: string;\n name: string;\n aliases: string[];\n rank: number;\n attribute_values: Record<\n string,\n {\n value?: { label: string; literal?: string };\n array_value?: Array<{ label: string; literal?: string }>;\n }\n >;\n external_id?: string;\n archived_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogType {\n id: string;\n name: string;\n description: string;\n type_name: string;\n ranked: boolean;\n is_editable: boolean;\n use_name_as_identifier: boolean;\n categories: string[];\n annotations: Record<string, string>;\n color: string;\n icon: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogResource {\n type: string;\n engine_resource_type: string;\n label: string;\n description: string;\n value_docstring: string;\n category: string;\n}\n\nexport interface IncidentioTeam {\n id: string;\n name: string;\n catalog_entry: { id: string; name: string; external_id?: string };\n members: IncidentioUser[];\n}\n\nexport interface IncidentioSchedule {\n id: string;\n name: string;\n timezone: string;\n team_ids: string[];\n permalink: string;\n annotations: Record<string, string>;\n config?: {\n rotations: Array<{\n id: string;\n name: string;\n users: IncidentioUser[];\n handover_start_at: string;\n scheduling_mode?: 'fair' | 'sequential';\n }>;\n };\n current_shifts?: IncidentioScheduleEntry[];\n next_shifts?: IncidentioScheduleEntry[];\n holidays_public_config?: { country_codes: string[] };\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioScheduleEntry {\n start_at: string;\n end_at: string;\n entry_id?: string;\n fingerprint?: string;\n layer_id?: string;\n rotation_id?: string;\n user?: IncidentioUser;\n}\n\nexport interface IncidentioPolicyFinding {\n id: string;\n policy_id: string;\n policy_type: 'debrief' | 'follow_up' | 'on_call_readiness' | 'post_mortem' | 'schedule' | 'vacation_conflict';\n state: 'pending' | 'active' | 'resolved' | 'cancelled' | 'dismissed';\n responsible_users: IncidentioUser[];\n days?: number;\n due_at?: string;\n debrief?: { incident_id: string };\n dismissal?: { dismissed_at: string; dismissed_by: IncidentioActor; reason: string };\n follow_up?: { incident_id: string; follow_up_id: string };\n on_call_readiness?: {\n user_id: string;\n high_urgency: IncidentioReadinessRule[];\n low_urgency: IncidentioReadinessRule[];\n };\n post_mortem?: { incident_id: string };\n schedule?: {\n schedule_id: string;\n start_at: string;\n end_at: string;\n cause?: 'nobody_scheduled' | 'no_on_call_seat' | 'user_deactivated';\n has_unscheduled_time?: boolean;\n rotation_id?: string;\n };\n vacation_conflict?: {\n user_id: string;\n schedule_id: string;\n start_at: string;\n end_at: string;\n holiday_name?: string;\n rotation_id?: string;\n };\n last_checked_at: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioReadinessRule {\n method_types: string[];\n met: boolean;\n max_delay_seconds?: number;\n}\n\nexport interface IncidentioPage<T> {\n items: T[];\n nextCursor: string | null;\n total?: number;\n}\n\nexport interface IncidentioCatalogEntryPage extends IncidentioPage<IncidentioCatalogEntry> {\n catalogType: IncidentioCatalogType;\n}\n\nexport interface IncidentioCatalogEntryResult {\n entry: IncidentioCatalogEntry;\n catalogType: IncidentioCatalogType;\n}\n\nexport interface IncidentioListOptions {\n cursor?: string;\n pageSize?: number;\n}\n\nexport interface IncidentioListActionsOptions extends IncidentioListOptions {\n incidentId?: string;\n incidentMode?: string;\n}\n\nexport interface IncidentioListIncidentUpdatesOptions extends IncidentioListOptions {\n incidentId?: string;\n}\n\nexport interface IncidentioListPolicyFindingsOptions extends IncidentioListOptions {\n policyId?: string;\n}\n\nexport class IncidentioApiError extends Error {\n readonly status: number | null;\n\n constructor(message: string, status: number | null) {\n super(message);\n this.name = 'IncidentioApiError';\n this.status = status;\n }\n}\n\nexport interface IncidentioApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\ninterface IncidentioPaginationMeta {\n after?: string | null;\n total_record_count?: number;\n}\n\nexport class IncidentioApiClient {\n readonly #baseUrl: string;\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n\n constructor(config: IncidentioApiClientConfig) {\n const baseUrl = config.baseUrl.trim();\n const accessToken = config.accessToken.trim();\n if (!baseUrl || !accessToken) {\n throw new Error('IncidentioApiClient requires a base URL and access token.');\n }\n this.#baseUrl = baseUrl.replace(/\\/+$/, '');\n this.#accessToken = accessToken;\n this.#fetch = config.fetchImpl ?? globalThis.fetch;\n }\n\n async listIncidents(cursor?: string): Promise<IncidentioPage<IncidentioIncident>> {\n const result = await this.#request<{\n incidents: IncidentioIncident[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/incidents', {\n query: { page_size: 100, after: cursor, sort_by: 'created_at_newest_first' },\n });\n return this.#page(result.incidents, result.pagination_meta);\n }\n\n async getIncident(id: string): Promise<IncidentioIncident> {\n const result = await this.#request<{ incident: IncidentioIncident }>(\n 'GET',\n `/v2/incidents/${encodeURIComponent(id)}`,\n );\n return result.incident;\n }\n\n async listFollowUps(cursor?: string): Promise<IncidentioPage<IncidentioFollowUp>> {\n const result = await this.#request<{\n follow_ups: IncidentioFollowUp[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/follow_ups', { query: { page_size: 100, after: cursor } });\n return this.#page(result.follow_ups, result.pagination_meta);\n }\n\n async getFollowUp(id: string): Promise<IncidentioFollowUp> {\n const result = await this.#request<{ follow_up: IncidentioFollowUp }>(\n 'GET',\n `/v3/follow_ups/${encodeURIComponent(id)}`,\n );\n return result.follow_up;\n }\n\n async updateFollowUp(followUp: IncidentioFollowUp, status: IncidentioFollowUp['status']): Promise<IncidentioFollowUp> {\n const result = await this.#request<{ follow_up: IncidentioFollowUp }>(\n 'PUT',\n `/v3/follow_ups/${encodeURIComponent(followUp.id)}`,\n { body: { title: followUp.title, status } },\n );\n return result.follow_up;\n }\n\n async listActions(options: IncidentioListActionsOptions = {}): Promise<IncidentioPage<IncidentioAction>> {\n const result = await this.#request<{\n actions: IncidentioAction[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/actions', {\n query: {\n page_size: options.pageSize ?? 100,\n after: options.cursor,\n incident_id: options.incidentId,\n incident_mode: options.incidentMode,\n },\n });\n return this.#page(result.actions, result.pagination_meta);\n }\n\n async getAction(id: string): Promise<IncidentioAction> {\n const result = await this.#request<{ action: IncidentioAction }>('GET', `/v3/actions/${encodeURIComponent(id)}`);\n return result.action;\n }\n\n async listIncidentUpdates(\n options: IncidentioListIncidentUpdatesOptions = {},\n ): Promise<IncidentioPage<IncidentioIncidentUpdate>> {\n const result = await this.#request<{\n incident_updates: IncidentioIncidentUpdate[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/incident_updates', {\n query: { page_size: options.pageSize ?? 100, after: options.cursor, incident_id: options.incidentId },\n });\n return this.#page(result.incident_updates, result.pagination_meta);\n }\n\n async listAlerts(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioAlert>> {\n const result = await this.#request<{ alerts: IncidentioAlert[]; pagination_meta: IncidentioPaginationMeta }>(\n 'GET',\n '/v2/alerts',\n { query: { page_size: options.pageSize ?? 50, after: options.cursor } },\n );\n return this.#page(result.alerts, result.pagination_meta);\n }\n\n async getAlert(id: string): Promise<IncidentioAlert> {\n const result = await this.#request<{ alert: IncidentioAlert }>('GET', `/v2/alerts/${encodeURIComponent(id)}`);\n return result.alert;\n }\n\n async listEscalations(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioEscalation>> {\n const result = await this.#request<{\n escalations: IncidentioEscalation[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v2/escalations', {\n query: { page_size: options.pageSize ?? 50, after: options.cursor },\n });\n return this.#page(result.escalations, result.pagination_meta);\n }\n\n async getEscalation(id: string): Promise<IncidentioEscalation> {\n const result = await this.#request<{ escalation: IncidentioEscalation }>(\n 'GET',\n `/v2/escalations/${encodeURIComponent(id)}`,\n );\n return result.escalation;\n }\n\n async listCatalogEntries(\n catalogTypeId: string,\n options: IncidentioListOptions & { identifier?: string } = {},\n ): Promise<IncidentioCatalogEntryPage> {\n const result = await this.#request<{\n catalog_entries: IncidentioCatalogEntry[];\n catalog_type: IncidentioCatalogType;\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/catalog_entries', {\n query: {\n catalog_type_id: catalogTypeId,\n page_size: options.pageSize ?? 100,\n after: options.cursor,\n identifier: options.identifier,\n },\n });\n return { ...this.#page(result.catalog_entries, result.pagination_meta), catalogType: result.catalog_type };\n }\n\n async getCatalogEntry(id: string, options: { expand?: boolean } = {}): Promise<IncidentioCatalogEntryResult> {\n const result = await this.#request<{\n catalog_entry: IncidentioCatalogEntry;\n catalog_type: IncidentioCatalogType;\n }>('GET', `/v3/catalog_entries/${encodeURIComponent(id)}`, { query: { expand: options.expand } });\n return { entry: result.catalog_entry, catalogType: result.catalog_type };\n }\n\n async listCatalogTypes(): Promise<IncidentioCatalogType[]> {\n const result = await this.#request<{ catalog_types: IncidentioCatalogType[] }>('GET', '/v3/catalog_types');\n return result.catalog_types;\n }\n\n async getCatalogType(id: string): Promise<IncidentioCatalogType> {\n const result = await this.#request<{ catalog_type: IncidentioCatalogType }>(\n 'GET',\n `/v3/catalog_types/${encodeURIComponent(id)}`,\n );\n return result.catalog_type;\n }\n\n async listCatalogResources(): Promise<IncidentioCatalogResource[]> {\n const result = await this.#request<{ resources: IncidentioCatalogResource[] }>('GET', '/v3/catalog_resources');\n return result.resources;\n }\n\n async listTeams(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioTeam>> {\n const result = await this.#request<{ teams: IncidentioTeam[]; pagination_meta: IncidentioPaginationMeta }>(\n 'GET',\n '/v3/teams',\n { query: { page_size: options.pageSize ?? 100, after: options.cursor } },\n );\n return this.#page(result.teams, result.pagination_meta);\n }\n\n async getTeam(id: string): Promise<IncidentioTeam> {\n const result = await this.#request<{ team: IncidentioTeam }>('GET', `/v3/teams/${encodeURIComponent(id)}`);\n return result.team;\n }\n\n async listSchedules(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioSchedule>> {\n const result = await this.#request<{\n schedules: IncidentioSchedule[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/schedules', {\n query: { page_size: options.pageSize ?? 25, after: options.cursor },\n });\n return this.#page(result.schedules, result.pagination_meta);\n }\n\n async getSchedule(id: string): Promise<IncidentioSchedule> {\n const result = await this.#request<{ schedule: IncidentioSchedule }>(\n 'GET',\n `/v2/schedules/${encodeURIComponent(id)}`,\n );\n return result.schedule;\n }\n\n async listPolicyFindings(\n options: IncidentioListPolicyFindingsOptions = {},\n ): Promise<IncidentioPage<IncidentioPolicyFinding>> {\n const result = await this.#request<{\n policy_findings: IncidentioPolicyFinding[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v2/policy_findings', {\n query: { page_size: options.pageSize ?? 100, after: options.cursor, policy_id: options.policyId },\n });\n return this.#page(result.policy_findings, result.pagination_meta);\n }\n\n async getPolicyFinding(id: string): Promise<IncidentioPolicyFinding> {\n const result = await this.#request<{ policy_finding: IncidentioPolicyFinding }>(\n 'GET',\n `/v2/policy_findings/${encodeURIComponent(id)}`,\n );\n return result.policy_finding;\n }\n\n #page<T>(items: T[], paginationMeta?: IncidentioPaginationMeta): IncidentioPage<T> {\n return {\n items,\n nextCursor: paginationMeta?.after ?? null,\n ...(paginationMeta?.total_record_count === undefined ? {} : { total: paginationMeta.total_record_count }),\n };\n }\n\n async #request<T>(\n method: 'GET' | 'PUT',\n path: string,\n options: { query?: Record<string, string | number | boolean | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) query.set(key, String(value));\n }\n\n let response: Response;\n try {\n response = await this.#fetch(`${this.#baseUrl}${path}${query.size > 0 ? `?${query.toString()}` : ''}`, {\n method,\n signal: AbortSignal.timeout(15_000),\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${this.#accessToken}`,\n ...(options.body === undefined ? {} : { 'content-type': 'application/json' }),\n },\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(this.#accessToken)) {\n const redacted = new Error(error.message.replaceAll(this.#accessToken, '[REDACTED]'));\n redacted.name = error.name;\n throw redacted;\n }\n throw error;\n }\n\n if (!response.ok) {\n let detail = `incident.io API request failed (${response.status})`;\n try {\n const body = (await response.clone().json()) as { message?: string; error?: string; detail?: string };\n detail = body.message ?? body.error ?? body.detail ?? detail;\n } catch {\n // Use the status-based message.\n }\n throw new IncidentioApiError(detail.replaceAll(this.#accessToken, '[REDACTED]'), response.status);\n }\n return (await response.json()) as T;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"api.js","names":["#baseUrl","#accessToken","#fetch","#request","#page"],"sources":["../../../src/integrations/incidentio/api.ts"],"sourcesContent":["export interface IncidentioUser {\n id: string;\n name: string;\n email?: string;\n role?: string;\n slack_user_id?: string;\n}\n\nexport interface IncidentioActor {\n alert?: { id: string; title: string };\n api_key?: { id: string; name: string };\n user?: IncidentioUser;\n workflow?: { id: string; name: string };\n}\n\nexport interface IncidentioIncident {\n id: string;\n reference: string;\n name: string;\n summary?: string;\n permalink?: string;\n visibility: string;\n mode: string;\n creator: IncidentioActor;\n incident_status: { id: string; name: string; category: string };\n incident_type?: { id: string; name: string };\n severity?: { id: string; name: string; rank: number };\n slack_channel_url?: string;\n postmortem_document_url?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioFollowUp {\n id: string;\n incident_id: string;\n title: string;\n description?: string;\n status: 'outstanding' | 'completed' | 'deleted' | 'not_doing';\n creator: IncidentioActor;\n assignee?: IncidentioUser | null;\n assignee_team?: { id: string; name: string } | null;\n labels: string[];\n priority?: { id: string; name: string; rank: number } | null;\n category?: { id: string; name: string } | null;\n external_issue_reference?: { issue_name: string; issue_permalink: string; provider: string } | null;\n completed_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioAction {\n id: string;\n incident_id: string;\n description: string;\n status: 'outstanding' | 'completed' | 'deleted' | 'not_doing';\n creator: IncidentioActor;\n assignee?: IncidentioUser;\n completed_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioIncidentUpdate {\n id: string;\n incident_id: string;\n updater: IncidentioActor;\n new_incident_status: { id: string; name: string; category: string };\n message?: string;\n merged_into_incident_id?: string;\n new_severity?: { id: string; name: string; rank: number };\n created_at: string;\n}\n\nexport interface IncidentioAlertAttributeValue {\n catalog_entry?: { id: string; name: string; catalog_type_id?: string };\n label?: string;\n literal?: string;\n}\n\nexport interface IncidentioAlertAttributeEntry {\n attribute: {\n id: string;\n name: string;\n type: string;\n array: boolean;\n required: boolean;\n emoji?: string;\n };\n value?: IncidentioAlertAttributeValue;\n array_value?: IncidentioAlertAttributeValue[];\n}\n\nexport interface IncidentioAlert {\n id: string;\n alert_source_id: string;\n deduplication_key: string;\n status: 'firing' | 'resolved';\n title: string;\n attributes: IncidentioAlertAttributeEntry[];\n alert_group_ids?: string[];\n description?: string;\n resolved_at?: string;\n source_url?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioEscalation {\n id: string;\n status:\n 'pending' | 'triggered' | 'acked' | 'resolved' | 'expired' | 'cancelled' | 'snoozed' | 'delayed' | 'pending_repeat';\n title: string;\n description: string;\n priority: { name: string };\n creator: IncidentioActor;\n escalation_path_id?: string;\n events: Array<{\n id: string;\n event:\n | 'entered_grace_period'\n | 'triggered'\n | 'notified_users'\n | 'notified_channels'\n | 'acked'\n | 'cancelled'\n | 'resolved'\n | 'expired';\n occurred_at: string;\n urgency?: 'high' | 'low';\n users?: IncidentioUser[];\n channels?: Array<{\n microsoft_teams_channel_id?: string;\n microsoft_teams_team_id?: string;\n slack_channel_id?: string;\n slack_team_id?: string;\n }>;\n }>;\n related_incidents: Array<{\n id: string;\n external_id: number;\n name: string;\n reference: string;\n visibility: 'public' | 'private';\n status_category: string;\n summary?: string;\n }>;\n related_alerts: Array<{\n id: string;\n alert_source_id: string;\n deduplication_key: string;\n status: 'firing' | 'resolved';\n title: string;\n alert_group_ids?: string[];\n description?: string;\n resolved_at?: string;\n source_url?: string;\n created_at: string;\n updated_at: string;\n }>;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogEntry {\n id: string;\n catalog_type_id: string;\n name: string;\n aliases: string[];\n rank: number;\n attribute_values: Record<\n string,\n {\n value?: { label: string; literal?: string };\n array_value?: Array<{ label: string; literal?: string }>;\n }\n >;\n external_id?: string;\n archived_at?: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogType {\n id: string;\n name: string;\n description: string;\n type_name: string;\n ranked: boolean;\n is_editable: boolean;\n use_name_as_identifier: boolean;\n categories: string[];\n annotations: Record<string, string>;\n color: string;\n icon: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioCatalogResource {\n type: string;\n engine_resource_type: string;\n label: string;\n description: string;\n value_docstring: string;\n category: string;\n}\n\nexport interface IncidentioTeam {\n id: string;\n name: string;\n catalog_entry: { id: string; name: string; external_id?: string };\n members: IncidentioUser[];\n}\n\nexport interface IncidentioSchedule {\n id: string;\n name: string;\n timezone: string;\n team_ids: string[];\n permalink: string;\n annotations: Record<string, string>;\n config?: {\n rotations: Array<{\n id: string;\n name: string;\n users: IncidentioUser[];\n handover_start_at: string;\n scheduling_mode?: 'fair' | 'sequential';\n }>;\n };\n current_shifts?: IncidentioScheduleEntry[];\n next_shifts?: IncidentioScheduleEntry[];\n holidays_public_config?: { country_codes: string[] };\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioScheduleEntry {\n start_at: string;\n end_at: string;\n entry_id?: string;\n fingerprint?: string;\n layer_id?: string;\n rotation_id?: string;\n user?: IncidentioUser;\n}\n\nexport interface IncidentioPolicyFinding {\n id: string;\n policy_id: string;\n policy_type: 'debrief' | 'follow_up' | 'on_call_readiness' | 'post_mortem' | 'schedule' | 'vacation_conflict';\n state: 'pending' | 'active' | 'resolved' | 'cancelled' | 'dismissed';\n responsible_users: IncidentioUser[];\n days?: number;\n due_at?: string;\n debrief?: { incident_id: string };\n dismissal?: { dismissed_at: string; dismissed_by: IncidentioActor; reason: string };\n follow_up?: { incident_id: string; follow_up_id: string };\n on_call_readiness?: {\n user_id: string;\n high_urgency: IncidentioReadinessRule[];\n low_urgency: IncidentioReadinessRule[];\n };\n post_mortem?: { incident_id: string };\n schedule?: {\n schedule_id: string;\n start_at: string;\n end_at: string;\n cause?: 'nobody_scheduled' | 'no_on_call_seat' | 'user_deactivated';\n has_unscheduled_time?: boolean;\n rotation_id?: string;\n };\n vacation_conflict?: {\n user_id: string;\n schedule_id: string;\n start_at: string;\n end_at: string;\n holiday_name?: string;\n rotation_id?: string;\n };\n last_checked_at: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface IncidentioReadinessRule {\n method_types: string[];\n met: boolean;\n max_delay_seconds?: number;\n}\n\nexport interface IncidentioPage<T> {\n items: T[];\n nextCursor: string | null;\n total?: number;\n}\n\nexport interface IncidentioCatalogEntryPage extends IncidentioPage<IncidentioCatalogEntry> {\n catalogType: IncidentioCatalogType;\n}\n\nexport interface IncidentioCatalogEntryResult {\n entry: IncidentioCatalogEntry;\n catalogType: IncidentioCatalogType;\n}\n\nexport interface IncidentioListOptions {\n cursor?: string;\n pageSize?: number;\n}\n\nexport interface IncidentioListActionsOptions extends IncidentioListOptions {\n incidentId?: string;\n incidentMode?: string;\n}\n\nexport interface IncidentioListIncidentUpdatesOptions extends IncidentioListOptions {\n incidentId?: string;\n}\n\nexport interface IncidentioListPolicyFindingsOptions extends IncidentioListOptions {\n policyId?: string;\n}\n\nexport class IncidentioApiError extends Error {\n readonly status: number | null;\n\n constructor(message: string, status: number | null) {\n super(message);\n this.name = 'IncidentioApiError';\n this.status = status;\n }\n}\n\nexport interface IncidentioApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\ninterface IncidentioPaginationMeta {\n after?: string | null;\n total_record_count?: number;\n}\n\nexport class IncidentioApiClient {\n readonly #baseUrl: string;\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n\n constructor(config: IncidentioApiClientConfig) {\n const baseUrl = config.baseUrl.trim();\n const accessToken = config.accessToken.trim();\n if (!baseUrl || !accessToken) {\n throw new Error('IncidentioApiClient requires a base URL and access token.');\n }\n this.#baseUrl = baseUrl.replace(/\\/+$/, '');\n this.#accessToken = accessToken;\n this.#fetch = config.fetchImpl ?? globalThis.fetch;\n }\n\n async listIncidents(cursor?: string): Promise<IncidentioPage<IncidentioIncident>> {\n const result = await this.#request<{\n incidents: IncidentioIncident[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/incidents', {\n query: { page_size: 100, after: cursor, sort_by: 'created_at_newest_first' },\n });\n return this.#page(result.incidents, result.pagination_meta);\n }\n\n async getIncident(id: string): Promise<IncidentioIncident> {\n const result = await this.#request<{ incident: IncidentioIncident }>(\n 'GET',\n `/v2/incidents/${encodeURIComponent(id)}`,\n );\n return result.incident;\n }\n\n async listFollowUps(cursor?: string): Promise<IncidentioPage<IncidentioFollowUp>> {\n const result = await this.#request<{\n follow_ups: IncidentioFollowUp[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/follow_ups', { query: { page_size: 100, after: cursor } });\n return this.#page(result.follow_ups, result.pagination_meta);\n }\n\n async getFollowUp(id: string): Promise<IncidentioFollowUp> {\n const result = await this.#request<{ follow_up: IncidentioFollowUp }>(\n 'GET',\n `/v3/follow_ups/${encodeURIComponent(id)}`,\n );\n return result.follow_up;\n }\n\n async updateFollowUp(\n followUp: IncidentioFollowUp,\n status: IncidentioFollowUp['status'],\n ): Promise<IncidentioFollowUp> {\n const result = await this.#request<{ follow_up: IncidentioFollowUp }>(\n 'PUT',\n `/v3/follow_ups/${encodeURIComponent(followUp.id)}`,\n { body: { title: followUp.title, status } },\n );\n return result.follow_up;\n }\n\n async listActions(options: IncidentioListActionsOptions = {}): Promise<IncidentioPage<IncidentioAction>> {\n const result = await this.#request<{\n actions: IncidentioAction[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/actions', {\n query: {\n page_size: options.pageSize ?? 100,\n after: options.cursor,\n incident_id: options.incidentId,\n incident_mode: options.incidentMode,\n },\n });\n return this.#page(result.actions, result.pagination_meta);\n }\n\n async getAction(id: string): Promise<IncidentioAction> {\n const result = await this.#request<{ action: IncidentioAction }>('GET', `/v3/actions/${encodeURIComponent(id)}`);\n return result.action;\n }\n\n async listIncidentUpdates(\n options: IncidentioListIncidentUpdatesOptions = {},\n ): Promise<IncidentioPage<IncidentioIncidentUpdate>> {\n const result = await this.#request<{\n incident_updates: IncidentioIncidentUpdate[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/incident_updates', {\n query: { page_size: options.pageSize ?? 100, after: options.cursor, incident_id: options.incidentId },\n });\n return this.#page(result.incident_updates, result.pagination_meta);\n }\n\n async listAlerts(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioAlert>> {\n const result = await this.#request<{ alerts: IncidentioAlert[]; pagination_meta: IncidentioPaginationMeta }>(\n 'GET',\n '/v2/alerts',\n { query: { page_size: options.pageSize ?? 50, after: options.cursor } },\n );\n return this.#page(result.alerts, result.pagination_meta);\n }\n\n async getAlert(id: string): Promise<IncidentioAlert> {\n const result = await this.#request<{ alert: IncidentioAlert }>('GET', `/v2/alerts/${encodeURIComponent(id)}`);\n return result.alert;\n }\n\n async listEscalations(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioEscalation>> {\n const result = await this.#request<{\n escalations: IncidentioEscalation[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v2/escalations', {\n query: { page_size: options.pageSize ?? 50, after: options.cursor },\n });\n return this.#page(result.escalations, result.pagination_meta);\n }\n\n async getEscalation(id: string): Promise<IncidentioEscalation> {\n const result = await this.#request<{ escalation: IncidentioEscalation }>(\n 'GET',\n `/v2/escalations/${encodeURIComponent(id)}`,\n );\n return result.escalation;\n }\n\n async listCatalogEntries(\n catalogTypeId: string,\n options: IncidentioListOptions & { identifier?: string } = {},\n ): Promise<IncidentioCatalogEntryPage> {\n const result = await this.#request<{\n catalog_entries: IncidentioCatalogEntry[];\n catalog_type: IncidentioCatalogType;\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v3/catalog_entries', {\n query: {\n catalog_type_id: catalogTypeId,\n page_size: options.pageSize ?? 100,\n after: options.cursor,\n identifier: options.identifier,\n },\n });\n return { ...this.#page(result.catalog_entries, result.pagination_meta), catalogType: result.catalog_type };\n }\n\n async getCatalogEntry(id: string, options: { expand?: boolean } = {}): Promise<IncidentioCatalogEntryResult> {\n const result = await this.#request<{\n catalog_entry: IncidentioCatalogEntry;\n catalog_type: IncidentioCatalogType;\n }>('GET', `/v3/catalog_entries/${encodeURIComponent(id)}`, { query: { expand: options.expand } });\n return { entry: result.catalog_entry, catalogType: result.catalog_type };\n }\n\n async listCatalogTypes(): Promise<IncidentioCatalogType[]> {\n const result = await this.#request<{ catalog_types: IncidentioCatalogType[] }>('GET', '/v3/catalog_types');\n return result.catalog_types;\n }\n\n async getCatalogType(id: string): Promise<IncidentioCatalogType> {\n const result = await this.#request<{ catalog_type: IncidentioCatalogType }>(\n 'GET',\n `/v3/catalog_types/${encodeURIComponent(id)}`,\n );\n return result.catalog_type;\n }\n\n async listCatalogResources(): Promise<IncidentioCatalogResource[]> {\n const result = await this.#request<{ resources: IncidentioCatalogResource[] }>('GET', '/v3/catalog_resources');\n return result.resources;\n }\n\n async listTeams(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioTeam>> {\n const result = await this.#request<{ teams: IncidentioTeam[]; pagination_meta: IncidentioPaginationMeta }>(\n 'GET',\n '/v3/teams',\n { query: { page_size: options.pageSize ?? 100, after: options.cursor } },\n );\n return this.#page(result.teams, result.pagination_meta);\n }\n\n async getTeam(id: string): Promise<IncidentioTeam> {\n const result = await this.#request<{ team: IncidentioTeam }>('GET', `/v3/teams/${encodeURIComponent(id)}`);\n return result.team;\n }\n\n async listSchedules(options: IncidentioListOptions = {}): Promise<IncidentioPage<IncidentioSchedule>> {\n const result = await this.#request<{\n schedules: IncidentioSchedule[];\n pagination_meta?: IncidentioPaginationMeta;\n }>('GET', '/v2/schedules', {\n query: { page_size: options.pageSize ?? 25, after: options.cursor },\n });\n return this.#page(result.schedules, result.pagination_meta);\n }\n\n async getSchedule(id: string): Promise<IncidentioSchedule> {\n const result = await this.#request<{ schedule: IncidentioSchedule }>(\n 'GET',\n `/v2/schedules/${encodeURIComponent(id)}`,\n );\n return result.schedule;\n }\n\n async listPolicyFindings(\n options: IncidentioListPolicyFindingsOptions = {},\n ): Promise<IncidentioPage<IncidentioPolicyFinding>> {\n const result = await this.#request<{\n policy_findings: IncidentioPolicyFinding[];\n pagination_meta: IncidentioPaginationMeta;\n }>('GET', '/v2/policy_findings', {\n query: { page_size: options.pageSize ?? 100, after: options.cursor, policy_id: options.policyId },\n });\n return this.#page(result.policy_findings, result.pagination_meta);\n }\n\n async getPolicyFinding(id: string): Promise<IncidentioPolicyFinding> {\n const result = await this.#request<{ policy_finding: IncidentioPolicyFinding }>(\n 'GET',\n `/v2/policy_findings/${encodeURIComponent(id)}`,\n );\n return result.policy_finding;\n }\n\n #page<T>(items: T[], paginationMeta?: IncidentioPaginationMeta): IncidentioPage<T> {\n return {\n items,\n nextCursor: paginationMeta?.after ?? null,\n ...(paginationMeta?.total_record_count === undefined ? {} : { total: paginationMeta.total_record_count }),\n };\n }\n\n async #request<T>(\n method: 'GET' | 'PUT',\n path: string,\n options: { query?: Record<string, string | number | boolean | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) query.set(key, String(value));\n }\n\n let response: Response;\n try {\n response = await this.#fetch(`${this.#baseUrl}${path}${query.size > 0 ? `?${query.toString()}` : ''}`, {\n method,\n signal: AbortSignal.timeout(15_000),\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${this.#accessToken}`,\n ...(options.body === undefined ? {} : { 'content-type': 'application/json' }),\n },\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(this.#accessToken)) {\n const redacted = new Error(error.message.replaceAll(this.#accessToken, '[REDACTED]'));\n redacted.name = error.name;\n throw redacted;\n }\n throw error;\n }\n\n if (!response.ok) {\n let detail = `incident.io API request failed (${response.status})`;\n try {\n const body = (await response.clone().json()) as { message?: string; error?: string; detail?: string };\n detail = body.message ?? body.error ?? body.detail ?? detail;\n } catch {\n // Use the status-based message.\n }\n throw new IncidentioApiError(detail.replaceAll(this.#accessToken, '[REDACTED]'), response.status);\n }\n return (await response.json()) as T;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../../src/integrations/incidentio/intake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAEV,MAAM,EASP,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EAKpB,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,8BAA8B,yBAAyB,CAAC;AACrE,eAAO,MAAM,+BAA+B,0BAA0B,CAAC;AAavE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,mBAAmB,CAAC;IACzB,UAAU,EAAE,qBAAqB,CAAC;CACnC,GAAG,MAAM,CAqIT"}
1
+ {"version":3,"file":"intake.d.ts","sourceRoot":"","sources":["../../../src/integrations/incidentio/intake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAEV,MAAM,EASP,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EAKpB,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,8BAA8B,yBAAyB,CAAC;AACrE,eAAO,MAAM,+BAA+B,0BAA0B,CAAC;AAavE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,mBAAmB,CAAC;IACzB,UAAU,EAAE,qBAAqB,CAAC;CACnC,GAAG,MAAM,CAoIT"}
@@ -1 +1 @@
1
- {"version":3,"file":"intake.js","names":[],"sources":["../../../src/integrations/incidentio/intake.ts"],"sourcesContent":["import type { IntegrationConnection } from '../../capabilities/connection.js';\nimport type {\n GetIntakeIssueInput,\n Intake,\n IntakeIssue,\n IntakeIssueDetail,\n IntakeItemPage,\n ListIntakeIssuesInput,\n ListIntakeItemsInput,\n ResolveIntakeDispatchInput,\n ResolvedIntakeDispatch,\n UpdateIntakeIssueInput,\n} from '../../capabilities/intake.js';\nimport {\n IncidentioApiClient,\n IncidentioApiError,\n type IncidentioActor,\n type IncidentioFollowUp,\n type IncidentioIncident,\n} from './api.js';\n\nexport const INCIDENTIO_INCIDENTS_SOURCE_ID = 'incidentio:incidents';\nexport const INCIDENTIO_FOLLOW_UPS_SOURCE_ID = 'incidentio:follow-ups';\n\nconst INCIDENT_PREFIX = 'incidentio:incident:';\nconst FOLLOW_UP_PREFIX = 'incidentio:follow-up:';\nconst SOURCE_IDS = [INCIDENTIO_INCIDENTS_SOURCE_ID, INCIDENTIO_FOLLOW_UPS_SOURCE_ID] as const;\n\ntype IncidentioItemReference = { type: 'incident' | 'follow-up'; id: string };\ntype IncidentioPageCursor = { sourceIndex: number; provider?: string };\ninterface ListedIncidentioIssue {\n issue: IntakeIssue;\n metadata: Record<string, unknown>;\n}\n\nexport function createIncidentioIntake(config: {\n api: IncidentioApiClient;\n connection: IntegrationConnection;\n}): Intake {\n const assertConnection = (connection: IntegrationConnection): void => {\n if (\n connection.type !== config.connection.type ||\n connection.type !== 'oauth' ||\n config.connection.type !== 'oauth' ||\n connection.accessToken !== config.connection.accessToken\n ) {\n throw new Error('incident.io Intake received a connection it did not create.');\n }\n };\n\n const listIssueEntries = async ({ sourceIds, labels, cursor }: ListIntakeIssuesInput) => {\n const selectedSources = SOURCE_IDS.filter(sourceId => sourceIds.includes(sourceId));\n const decodedCursor = decodePageCursor(cursor);\n if (decodedCursor.sourceIndex >= selectedSources.length) {\n return { entries: [] as ListedIncidentioIssue[], nextCursor: null };\n }\n\n const sourceId = selectedSources[decodedCursor.sourceIndex]!;\n let entries: ListedIncidentioIssue[];\n let providerCursor: string | null;\n if (sourceId === INCIDENTIO_INCIDENTS_SOURCE_ID) {\n const page = await config.api.listIncidents(decodedCursor.provider);\n entries = page.items.map(incident => {\n const issue = incidentToIntakeIssue(incident);\n return { issue, metadata: incidentIntakeMetadata(incident, issue) };\n });\n providerCursor = page.nextCursor;\n } else {\n const page = await config.api.listFollowUps(decodedCursor.provider);\n entries = page.items.map(followUp => {\n const issue = followUpToIntakeIssue(followUp);\n return { issue, metadata: followUpIntakeMetadata(followUp, issue) };\n });\n providerCursor = page.nextCursor;\n }\n entries = entries.filter(({ issue }) => isActive(issue.stateType) && matchesLabels(issue.labels, labels));\n const nextCursor = providerCursor\n ? encodePageCursor({ sourceIndex: decodedCursor.sourceIndex, provider: providerCursor })\n : decodedCursor.sourceIndex + 1 < selectedSources.length\n ? encodePageCursor({ sourceIndex: decodedCursor.sourceIndex + 1 })\n : null;\n return { entries, nextCursor };\n };\n\n const listIssues = async (input: ListIntakeIssuesInput) => {\n const page = await listIssueEntries(input);\n return { issues: page.entries.map(({ issue }) => issue), nextCursor: page.nextCursor };\n };\n\n const getIssue = async ({ connection, issueId }: GetIntakeIssueInput): Promise<IntakeIssueDetail | null> => {\n assertConnection(connection);\n const reference = decodeItemReference(issueId);\n if (!reference) return null;\n try {\n if (reference.type === 'incident') {\n const incident = await config.api.getIncident(reference.id);\n return { ...incidentToIntakeIssue(incident), description: incident.summary ?? null, comments: [] };\n }\n const followUp = await config.api.getFollowUp(reference.id);\n return { ...followUpToIntakeIssue(followUp), description: followUp.description ?? null, comments: [] };\n } catch (error) {\n if (error instanceof IncidentioApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n return {\n resolveIntakeDispatch: (input: ResolveIntakeDispatchInput): Promise<ResolvedIntakeDispatch | null> => {\n if (input.externalSource.type !== 'issue') return Promise.resolve(null);\n const reference = decodeItemReference(input.externalSource.externalId);\n if (!reference) return Promise.resolve(null);\n return Promise.resolve({\n connection: config.connection,\n sourceId:\n reference.type === 'incident' ? INCIDENTIO_INCIDENTS_SOURCE_ID : INCIDENTIO_FOLLOW_UPS_SOURCE_ID,\n issueId: input.externalSource.externalId,\n });\n },\n listSources: async () => [\n { id: INCIDENTIO_INCIDENTS_SOURCE_ID, name: 'Incidents', type: 'incident' },\n { id: INCIDENTIO_FOLLOW_UPS_SOURCE_ID, name: 'Incident follow-ups', type: 'follow-up' },\n ],\n listItems: async (input: ListIntakeItemsInput): Promise<IntakeItemPage> => {\n const page = await listIssueEntries({\n connection: config.connection,\n sourceIds: input.sourceIds,\n ...(input.cursor ? { cursor: input.cursor } : {}),\n });\n return {\n items: page.entries.map(({ issue, metadata }) => ({\n source: { type: 'issue', externalId: issue.id, url: issue.url },\n sourceId: issue.id.startsWith(INCIDENT_PREFIX)\n ? INCIDENTIO_INCIDENTS_SOURCE_ID\n : INCIDENTIO_FOLLOW_UPS_SOURCE_ID,\n title: `${issue.identifier}: ${issue.title}`,\n status: issue.state ?? undefined,\n labels: issue.labels,\n assignee: issue.assignee,\n createdAt: issue.createdAt,\n updatedAt: issue.updatedAt,\n metadata,\n })),\n nextCursor: page.nextCursor,\n };\n },\n listIssues: async input => {\n assertConnection(input.connection);\n return listIssues(input);\n },\n getIssue,\n createComment: async input => {\n assertConnection(input.connection);\n return null;\n },\n updateIssue: async (input: UpdateIntakeIssueInput): Promise<IntakeIssue | null> => {\n assertConnection(input.connection);\n const reference = decodeItemReference(input.issueId);\n if (!reference || reference.type !== 'follow-up') return null;\n let followUp: IncidentioFollowUp;\n try {\n followUp = await config.api.getFollowUp(reference.id);\n } catch (error) {\n if (error instanceof IncidentioApiError && error.status === 404) return null;\n throw error;\n }\n const status = followUpStatusForTarget(input);\n if (!status) return null;\n if (followUp.status === status) return followUpToIntakeIssue(followUp);\n return followUpToIntakeIssue(await config.api.updateFollowUp(followUp, status));\n },\n };\n}\n\nfunction incidentToIntakeIssue(incident: IncidentioIncident): IntakeIssue {\n const labels = [incident.severity?.name, incident.incident_type?.name, incident.mode].filter(\n (label): label is string => Boolean(label),\n );\n return {\n id: `${INCIDENT_PREFIX}${incident.id}`,\n identifier: incident.reference,\n title: incident.name,\n url:\n incident.permalink ??\n incident.slack_channel_url ??\n incident.postmortem_document_url ??\n `https://app.incident.io/incidents/${encodeURIComponent(incident.id)}`,\n author: actorName(incident.creator),\n state: incident.incident_status.name,\n stateType: incidentStateType(incident.incident_status.category),\n priority: incident.severity?.name ?? null,\n assignee: null,\n source: 'Incident',\n labels,\n commentCount: 0,\n createdAt: incident.created_at,\n updatedAt: incident.updated_at,\n };\n}\n\nfunction followUpToIntakeIssue(followUp: IncidentioFollowUp): IntakeIssue {\n const assignees = [followUp.assignee?.name, followUp.assignee_team?.name].filter(\n (assignee): assignee is string => Boolean(assignee),\n );\n return {\n id: `${FOLLOW_UP_PREFIX}${followUp.id}`,\n identifier: followUp.external_issue_reference?.issue_name ?? followUp.id,\n title: followUp.title,\n url:\n followUp.external_issue_reference?.issue_permalink ??\n `https://app.incident.io/incidents/${encodeURIComponent(followUp.incident_id)}`,\n author: actorName(followUp.creator),\n state: followUp.status,\n stateType: followUpStateType(followUp.status),\n priority: followUp.priority?.name ?? null,\n assignee: assignees[0] ?? null,\n assignees,\n source: 'Follow-up',\n labels: followUp.labels,\n commentCount: 0,\n createdAt: followUp.created_at,\n updatedAt: followUp.updated_at,\n };\n}\n\nfunction intakeMetadata(issue: IntakeIssue): Record<string, unknown> {\n return {\n identifier: issue.identifier,\n autoStartCandidate: issue.stateType === 'unstarted' || issue.stateType === 'started',\n incidentioState: issue.state,\n incidentioStateType: issue.stateType,\n incidentioPriority: issue.priority,\n incidentioAssignee: issue.assignee,\n stateType: issue.stateType,\n priority: issue.priority,\n source: issue.source,\n assignee: issue.assignee,\n assignees: issue.assignees ?? [],\n creator: issue.author,\n author: issue.author,\n labels: issue.labels,\n updatedAt: issue.updatedAt,\n };\n}\n\nfunction incidentIntakeMetadata(incident: IncidentioIncident, issue: IntakeIssue): Record<string, unknown> {\n return {\n ...intakeMetadata(issue),\n incidentioItemType: 'incident',\n incidentioIncidentId: incident.id,\n ...(incident.summary ? { incidentioDescription: incident.summary } : {}),\n };\n}\n\nfunction followUpIntakeMetadata(followUp: IncidentioFollowUp, issue: IntakeIssue): Record<string, unknown> {\n return {\n ...intakeMetadata(issue),\n incidentioItemType: 'follow-up',\n incidentioIncidentId: followUp.incident_id,\n ...(followUp.description ? { incidentioDescription: followUp.description } : {}),\n };\n}\n\nfunction actorName(actor: IncidentioActor): string | null {\n return actor.user?.name ?? actor.api_key?.name ?? actor.workflow?.name ?? actor.alert?.title ?? null;\n}\n\nfunction incidentStateType(category: string): string | null {\n switch (category) {\n case 'triage':\n return 'unstarted';\n case 'declined':\n case 'canceled':\n return 'canceled';\n case 'merged':\n case 'closed':\n return 'completed';\n case 'live':\n case 'learning':\n case 'paused':\n return 'started';\n default:\n return null;\n }\n}\n\nfunction followUpStateType(status: IncidentioFollowUp['status']): string | null {\n switch (status) {\n case 'outstanding':\n return 'unstarted';\n case 'completed':\n return 'completed';\n case 'deleted':\n case 'not_doing':\n return 'canceled';\n default:\n return null;\n }\n}\n\nfunction followUpStatusForTarget(input: UpdateIntakeIssueInput): IncidentioFollowUp['status'] | null {\n if (input.state.kind === 'byType') {\n switch (input.state.stateType) {\n case 'unstarted':\n case 'started':\n return 'outstanding';\n case 'completed':\n return 'completed';\n case 'canceled':\n return 'not_doing';\n }\n }\n const status = input.state.name.toLowerCase().replaceAll('-', '_').replaceAll(' ', '_');\n return status === 'outstanding' || status === 'completed' || status === 'not_doing' ? status : null;\n}\n\nfunction isActive(stateType: string | null): boolean {\n return stateType !== 'completed' && stateType !== 'canceled';\n}\n\nfunction matchesLabels(issueLabels: string[], requestedLabels: string[] | undefined): boolean {\n if (!requestedLabels?.length) return true;\n const labels = new Set(issueLabels.map(label => label.toLowerCase()));\n return requestedLabels.every(label => labels.has(label.toLowerCase()));\n}\n\nfunction decodeItemReference(value: string): IncidentioItemReference | null {\n if (value.startsWith(INCIDENT_PREFIX)) return { type: 'incident', id: value.slice(INCIDENT_PREFIX.length) };\n if (value.startsWith(FOLLOW_UP_PREFIX)) return { type: 'follow-up', id: value.slice(FOLLOW_UP_PREFIX.length) };\n return null;\n}\n\nfunction encodePageCursor(cursor: IncidentioPageCursor): string {\n return Buffer.from(JSON.stringify(cursor)).toString('base64url');\n}\n\nfunction decodePageCursor(cursor: string | undefined): IncidentioPageCursor {\n if (!cursor) return { sourceIndex: 0 };\n try {\n const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8')) as Partial<IncidentioPageCursor>;\n if (!Number.isSafeInteger(parsed.sourceIndex) || (parsed.sourceIndex ?? -1) < 0) return { sourceIndex: 0 };\n return {\n sourceIndex: parsed.sourceIndex!,\n ...(typeof parsed.provider === 'string' && parsed.provider ? { provider: parsed.provider } : {}),\n };\n } catch {\n return { sourceIndex: 0 };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"intake.js","names":[],"sources":["../../../src/integrations/incidentio/intake.ts"],"sourcesContent":["import type { IntegrationConnection } from '../../capabilities/connection.js';\nimport type {\n GetIntakeIssueInput,\n Intake,\n IntakeIssue,\n IntakeIssueDetail,\n IntakeItemPage,\n ListIntakeIssuesInput,\n ListIntakeItemsInput,\n ResolveIntakeDispatchInput,\n ResolvedIntakeDispatch,\n UpdateIntakeIssueInput,\n} from '../../capabilities/intake.js';\nimport {\n IncidentioApiClient,\n IncidentioApiError,\n type IncidentioActor,\n type IncidentioFollowUp,\n type IncidentioIncident,\n} from './api.js';\n\nexport const INCIDENTIO_INCIDENTS_SOURCE_ID = 'incidentio:incidents';\nexport const INCIDENTIO_FOLLOW_UPS_SOURCE_ID = 'incidentio:follow-ups';\n\nconst INCIDENT_PREFIX = 'incidentio:incident:';\nconst FOLLOW_UP_PREFIX = 'incidentio:follow-up:';\nconst SOURCE_IDS = [INCIDENTIO_INCIDENTS_SOURCE_ID, INCIDENTIO_FOLLOW_UPS_SOURCE_ID] as const;\n\ntype IncidentioItemReference = { type: 'incident' | 'follow-up'; id: string };\ntype IncidentioPageCursor = { sourceIndex: number; provider?: string };\ninterface ListedIncidentioIssue {\n issue: IntakeIssue;\n metadata: Record<string, unknown>;\n}\n\nexport function createIncidentioIntake(config: {\n api: IncidentioApiClient;\n connection: IntegrationConnection;\n}): Intake {\n const assertConnection = (connection: IntegrationConnection): void => {\n if (\n connection.type !== config.connection.type ||\n connection.type !== 'oauth' ||\n config.connection.type !== 'oauth' ||\n connection.accessToken !== config.connection.accessToken\n ) {\n throw new Error('incident.io Intake received a connection it did not create.');\n }\n };\n\n const listIssueEntries = async ({ sourceIds, labels, cursor }: ListIntakeIssuesInput) => {\n const selectedSources = SOURCE_IDS.filter(sourceId => sourceIds.includes(sourceId));\n const decodedCursor = decodePageCursor(cursor);\n if (decodedCursor.sourceIndex >= selectedSources.length) {\n return { entries: [] as ListedIncidentioIssue[], nextCursor: null };\n }\n\n const sourceId = selectedSources[decodedCursor.sourceIndex]!;\n let entries: ListedIncidentioIssue[];\n let providerCursor: string | null;\n if (sourceId === INCIDENTIO_INCIDENTS_SOURCE_ID) {\n const page = await config.api.listIncidents(decodedCursor.provider);\n entries = page.items.map(incident => {\n const issue = incidentToIntakeIssue(incident);\n return { issue, metadata: incidentIntakeMetadata(incident, issue) };\n });\n providerCursor = page.nextCursor;\n } else {\n const page = await config.api.listFollowUps(decodedCursor.provider);\n entries = page.items.map(followUp => {\n const issue = followUpToIntakeIssue(followUp);\n return { issue, metadata: followUpIntakeMetadata(followUp, issue) };\n });\n providerCursor = page.nextCursor;\n }\n entries = entries.filter(({ issue }) => isActive(issue.stateType) && matchesLabels(issue.labels, labels));\n const nextCursor = providerCursor\n ? encodePageCursor({ sourceIndex: decodedCursor.sourceIndex, provider: providerCursor })\n : decodedCursor.sourceIndex + 1 < selectedSources.length\n ? encodePageCursor({ sourceIndex: decodedCursor.sourceIndex + 1 })\n : null;\n return { entries, nextCursor };\n };\n\n const listIssues = async (input: ListIntakeIssuesInput) => {\n const page = await listIssueEntries(input);\n return { issues: page.entries.map(({ issue }) => issue), nextCursor: page.nextCursor };\n };\n\n const getIssue = async ({ connection, issueId }: GetIntakeIssueInput): Promise<IntakeIssueDetail | null> => {\n assertConnection(connection);\n const reference = decodeItemReference(issueId);\n if (!reference) return null;\n try {\n if (reference.type === 'incident') {\n const incident = await config.api.getIncident(reference.id);\n return { ...incidentToIntakeIssue(incident), description: incident.summary ?? null, comments: [] };\n }\n const followUp = await config.api.getFollowUp(reference.id);\n return { ...followUpToIntakeIssue(followUp), description: followUp.description ?? null, comments: [] };\n } catch (error) {\n if (error instanceof IncidentioApiError && error.status === 404) return null;\n throw error;\n }\n };\n\n return {\n resolveIntakeDispatch: (input: ResolveIntakeDispatchInput): Promise<ResolvedIntakeDispatch | null> => {\n if (input.externalSource.type !== 'issue') return Promise.resolve(null);\n const reference = decodeItemReference(input.externalSource.externalId);\n if (!reference) return Promise.resolve(null);\n return Promise.resolve({\n connection: config.connection,\n sourceId: reference.type === 'incident' ? INCIDENTIO_INCIDENTS_SOURCE_ID : INCIDENTIO_FOLLOW_UPS_SOURCE_ID,\n issueId: input.externalSource.externalId,\n });\n },\n listSources: async () => [\n { id: INCIDENTIO_INCIDENTS_SOURCE_ID, name: 'Incidents', type: 'incident' },\n { id: INCIDENTIO_FOLLOW_UPS_SOURCE_ID, name: 'Incident follow-ups', type: 'follow-up' },\n ],\n listItems: async (input: ListIntakeItemsInput): Promise<IntakeItemPage> => {\n const page = await listIssueEntries({\n connection: config.connection,\n sourceIds: input.sourceIds,\n ...(input.cursor ? { cursor: input.cursor } : {}),\n });\n return {\n items: page.entries.map(({ issue, metadata }) => ({\n source: { type: 'issue', externalId: issue.id, url: issue.url },\n sourceId: issue.id.startsWith(INCIDENT_PREFIX)\n ? INCIDENTIO_INCIDENTS_SOURCE_ID\n : INCIDENTIO_FOLLOW_UPS_SOURCE_ID,\n title: `${issue.identifier}: ${issue.title}`,\n status: issue.state ?? undefined,\n labels: issue.labels,\n assignee: issue.assignee,\n createdAt: issue.createdAt,\n updatedAt: issue.updatedAt,\n metadata,\n })),\n nextCursor: page.nextCursor,\n };\n },\n listIssues: async input => {\n assertConnection(input.connection);\n return listIssues(input);\n },\n getIssue,\n createComment: async input => {\n assertConnection(input.connection);\n return null;\n },\n updateIssue: async (input: UpdateIntakeIssueInput): Promise<IntakeIssue | null> => {\n assertConnection(input.connection);\n const reference = decodeItemReference(input.issueId);\n if (!reference || reference.type !== 'follow-up') return null;\n let followUp: IncidentioFollowUp;\n try {\n followUp = await config.api.getFollowUp(reference.id);\n } catch (error) {\n if (error instanceof IncidentioApiError && error.status === 404) return null;\n throw error;\n }\n const status = followUpStatusForTarget(input);\n if (!status) return null;\n if (followUp.status === status) return followUpToIntakeIssue(followUp);\n return followUpToIntakeIssue(await config.api.updateFollowUp(followUp, status));\n },\n };\n}\n\nfunction incidentToIntakeIssue(incident: IncidentioIncident): IntakeIssue {\n const labels = [incident.severity?.name, incident.incident_type?.name, incident.mode].filter(\n (label): label is string => Boolean(label),\n );\n return {\n id: `${INCIDENT_PREFIX}${incident.id}`,\n identifier: incident.reference,\n title: incident.name,\n url:\n incident.permalink ??\n incident.slack_channel_url ??\n incident.postmortem_document_url ??\n `https://app.incident.io/incidents/${encodeURIComponent(incident.id)}`,\n author: actorName(incident.creator),\n state: incident.incident_status.name,\n stateType: incidentStateType(incident.incident_status.category),\n priority: incident.severity?.name ?? null,\n assignee: null,\n source: 'Incident',\n labels,\n commentCount: 0,\n createdAt: incident.created_at,\n updatedAt: incident.updated_at,\n };\n}\n\nfunction followUpToIntakeIssue(followUp: IncidentioFollowUp): IntakeIssue {\n const assignees = [followUp.assignee?.name, followUp.assignee_team?.name].filter((assignee): assignee is string =>\n Boolean(assignee),\n );\n return {\n id: `${FOLLOW_UP_PREFIX}${followUp.id}`,\n identifier: followUp.external_issue_reference?.issue_name ?? followUp.id,\n title: followUp.title,\n url:\n followUp.external_issue_reference?.issue_permalink ??\n `https://app.incident.io/incidents/${encodeURIComponent(followUp.incident_id)}`,\n author: actorName(followUp.creator),\n state: followUp.status,\n stateType: followUpStateType(followUp.status),\n priority: followUp.priority?.name ?? null,\n assignee: assignees[0] ?? null,\n assignees,\n source: 'Follow-up',\n labels: followUp.labels,\n commentCount: 0,\n createdAt: followUp.created_at,\n updatedAt: followUp.updated_at,\n };\n}\n\nfunction intakeMetadata(issue: IntakeIssue): Record<string, unknown> {\n return {\n identifier: issue.identifier,\n autoStartCandidate: issue.stateType === 'unstarted' || issue.stateType === 'started',\n incidentioState: issue.state,\n incidentioStateType: issue.stateType,\n incidentioPriority: issue.priority,\n incidentioAssignee: issue.assignee,\n stateType: issue.stateType,\n priority: issue.priority,\n source: issue.source,\n assignee: issue.assignee,\n assignees: issue.assignees ?? [],\n creator: issue.author,\n author: issue.author,\n labels: issue.labels,\n updatedAt: issue.updatedAt,\n };\n}\n\nfunction incidentIntakeMetadata(incident: IncidentioIncident, issue: IntakeIssue): Record<string, unknown> {\n return {\n ...intakeMetadata(issue),\n incidentioItemType: 'incident',\n incidentioIncidentId: incident.id,\n ...(incident.summary ? { incidentioDescription: incident.summary } : {}),\n };\n}\n\nfunction followUpIntakeMetadata(followUp: IncidentioFollowUp, issue: IntakeIssue): Record<string, unknown> {\n return {\n ...intakeMetadata(issue),\n incidentioItemType: 'follow-up',\n incidentioIncidentId: followUp.incident_id,\n ...(followUp.description ? { incidentioDescription: followUp.description } : {}),\n };\n}\n\nfunction actorName(actor: IncidentioActor): string | null {\n return actor.user?.name ?? actor.api_key?.name ?? actor.workflow?.name ?? actor.alert?.title ?? null;\n}\n\nfunction incidentStateType(category: string): string | null {\n switch (category) {\n case 'triage':\n return 'unstarted';\n case 'declined':\n case 'canceled':\n return 'canceled';\n case 'merged':\n case 'closed':\n return 'completed';\n case 'live':\n case 'learning':\n case 'paused':\n return 'started';\n default:\n return null;\n }\n}\n\nfunction followUpStateType(status: IncidentioFollowUp['status']): string | null {\n switch (status) {\n case 'outstanding':\n return 'unstarted';\n case 'completed':\n return 'completed';\n case 'deleted':\n case 'not_doing':\n return 'canceled';\n default:\n return null;\n }\n}\n\nfunction followUpStatusForTarget(input: UpdateIntakeIssueInput): IncidentioFollowUp['status'] | null {\n if (input.state.kind === 'byType') {\n switch (input.state.stateType) {\n case 'unstarted':\n case 'started':\n return 'outstanding';\n case 'completed':\n return 'completed';\n case 'canceled':\n return 'not_doing';\n }\n }\n const status = input.state.name.toLowerCase().replaceAll('-', '_').replaceAll(' ', '_');\n return status === 'outstanding' || status === 'completed' || status === 'not_doing' ? status : null;\n}\n\nfunction isActive(stateType: string | null): boolean {\n return stateType !== 'completed' && stateType !== 'canceled';\n}\n\nfunction matchesLabels(issueLabels: string[], requestedLabels: string[] | undefined): boolean {\n if (!requestedLabels?.length) return true;\n const labels = new Set(issueLabels.map(label => label.toLowerCase()));\n return requestedLabels.every(label => labels.has(label.toLowerCase()));\n}\n\nfunction decodeItemReference(value: string): IncidentioItemReference | null {\n if (value.startsWith(INCIDENT_PREFIX)) return { type: 'incident', id: value.slice(INCIDENT_PREFIX.length) };\n if (value.startsWith(FOLLOW_UP_PREFIX)) return { type: 'follow-up', id: value.slice(FOLLOW_UP_PREFIX.length) };\n return null;\n}\n\nfunction encodePageCursor(cursor: IncidentioPageCursor): string {\n return Buffer.from(JSON.stringify(cursor)).toString('base64url');\n}\n\nfunction decodePageCursor(cursor: string | undefined): IncidentioPageCursor {\n if (!cursor) return { sourceIndex: 0 };\n try {\n const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8')) as Partial<IncidentioPageCursor>;\n if (!Number.isSafeInteger(parsed.sourceIndex) || (parsed.sourceIndex ?? -1) < 0) return { sourceIndex: 0 };\n return {\n sourceIndex: parsed.sourceIndex!,\n ...(typeof parsed.provider === 'string' && parsed.provider ? { provider: parsed.provider } : {}),\n };\n } catch {\n return { sourceIndex: 0 };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"issue-reconcile-worker.d.ts","sourceRoot":"","sources":["../../src/integrations/issue-reconcile-worker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,eAAO,MAAM,mCAAmC,QAAa,CAAC;AAG9D,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,eAAe,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAqB,SAAQ,YAAY;;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAcV,MAAM,EAAE,0BAA0B;IAaxC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,IAAI,SAAS,IAAI,OAAO,CAEvB;CA2DF"}
1
+ {"version":3,"file":"issue-reconcile-worker.d.ts","sourceRoot":"","sources":["../../src/integrations/issue-reconcile-worker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,eAAO,MAAM,mCAAmC,QAAa,CAAC;AAG9D,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,eAAe,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,oBAAqB,SAAQ,YAAY;;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAcV,MAAM,EAAE,0BAA0B;IAaxC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,IAAI,SAAS,IAAI,OAAO,CAEvB;CAyDF"}
@@ -1 +1 @@
1
- {"version":3,"file":"issue-reconcile-worker.js","names":["#integrationId","#reconcile","#intervalMs","#leaseTtlMs","#leaseKey","#leaseOwner","#leaseProvider","#running","#schedule","#timer","#inFlight","#tick"],"sources":["../../src/integrations/issue-reconcile-worker.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { isLeaseProvider, NoopLeaseProvider } from '@mastra/core/events';\nimport type { LeaseProvider, PubSub } from '@mastra/core/events';\nimport { MastraWorker } from '@mastra/core/worker';\nimport type { WorkerDeps } from '@mastra/core/worker';\n\nimport type { IssueReconciler } from './issue-reconciler.js';\n\nexport const DEFAULT_ISSUE_RECONCILE_INTERVAL_MS = 5 * 60_000;\nconst MIN_LEASE_TTL_MS = 30_000;\n\nexport interface IssueReconcileWorkerConfig {\n integrationId: string;\n reconcile: IssueReconciler;\n intervalMs?: number;\n}\n\nexport class IssueReconcileWorker extends MastraWorker {\n readonly name: string;\n\n readonly #integrationId: string;\n readonly #reconcile: IssueReconciler;\n readonly #intervalMs: number;\n readonly #leaseTtlMs: number;\n readonly #leaseKey: string;\n readonly #leaseOwner = randomUUID();\n\n #running = false;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #inFlight: Promise<void> | undefined;\n #leaseProvider: LeaseProvider = NoopLeaseProvider;\n\n constructor(config: IssueReconcileWorkerConfig) {\n super();\n this.#integrationId = config.integrationId;\n this.name = `${config.integrationId}-issue-reconcile`;\n this.#leaseKey = `${config.integrationId}:issue-reconcile`;\n this.#reconcile = config.reconcile;\n this.#intervalMs = config.intervalMs ?? DEFAULT_ISSUE_RECONCILE_INTERVAL_MS;\n if (!Number.isFinite(this.#intervalMs) || this.#intervalMs <= 0) {\n throw new Error(`${config.integrationId} issue reconcile interval must be a positive number.`);\n }\n this.#leaseTtlMs = Math.max(MIN_LEASE_TTL_MS, this.#intervalMs * 3);\n }\n\n async init(deps: WorkerDeps): Promise<void> {\n await super.init(deps);\n this.#leaseProvider = getLeaseProvider(deps.pubsub);\n }\n\n async start(): Promise<void> {\n if (this.#running) return;\n if (!this.deps) throw new Error('IssueReconcileWorker: call init() before start()');\n this.#running = true;\n this.deps.logger.info(`${this.#integrationId} issue reconcile worker started`, { intervalMs: this.#intervalMs });\n this.#schedule(0);\n }\n\n async stop(): Promise<void> {\n if (!this.#running) return;\n this.#running = false;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n await this.#inFlight;\n }\n\n get isRunning(): boolean {\n return this.#running;\n }\n\n #schedule(delayMs: number): void {\n if (!this.#running) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n const run = this.#tick().finally(() => {\n this.#inFlight = undefined;\n this.#schedule(this.#intervalMs);\n });\n this.#inFlight = run;\n }, delayMs);\n this.#timer.unref?.();\n }\n\n async #tick(): Promise<void> {\n const lease = await this.#leaseProvider\n .acquireLease(this.#leaseKey, this.#leaseOwner, this.#leaseTtlMs)\n .catch(() => ({ acquired: false }));\n if (!lease.acquired) return;\n\n // A sweep that traverses many projects/orgs can outrun the lease TTL;\n // renew periodically so a replica can't grab the expired lease and start\n // an overlapping sweep partway through this one.\n const renewalTimer = setInterval(\n () => {\n void this.#leaseProvider\n .renewLease(this.#leaseKey, this.#leaseOwner, this.#leaseTtlMs)\n .catch(error => {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile lease renewal failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n },\n Math.max(1_000, Math.floor(this.#leaseTtlMs / 3)),\n );\n renewalTimer.unref?.();\n\n try {\n const startedAt = Date.now();\n const { errors, ...counts } = await this.#reconcile();\n const context = { ...counts, durationMs: Date.now() - startedAt };\n if (counts.failed > 0) {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile sweep completed with failures`, {\n ...context,\n errors,\n });\n } else {\n this.deps?.logger.debug(`${this.#integrationId} issue reconcile sweep completed`, context);\n }\n } catch (error) {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile sweep failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n clearInterval(renewalTimer);\n await this.#leaseProvider.releaseLease(this.#leaseKey, this.#leaseOwner).catch(() => undefined);\n }\n }\n}\n\nfunction getLeaseProvider(pubsub: PubSub): LeaseProvider {\n const getProvider = (pubsub as PubSub & { getLeaseProvider?: () => LeaseProvider | undefined }).getLeaseProvider;\n if (typeof getProvider === 'function') return getProvider.call(pubsub) ?? NoopLeaseProvider;\n return isLeaseProvider(pubsub)\n ? pubsub\n : ((pubsub as PubSub & { lease?: LeaseProvider }).lease ?? NoopLeaseProvider);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"issue-reconcile-worker.js","names":["#integrationId","#reconcile","#intervalMs","#leaseTtlMs","#leaseKey","#leaseOwner","#leaseProvider","#running","#schedule","#timer","#inFlight","#tick"],"sources":["../../src/integrations/issue-reconcile-worker.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { isLeaseProvider, NoopLeaseProvider } from '@mastra/core/events';\nimport type { LeaseProvider, PubSub } from '@mastra/core/events';\nimport { MastraWorker } from '@mastra/core/worker';\nimport type { WorkerDeps } from '@mastra/core/worker';\n\nimport type { IssueReconciler } from './issue-reconciler.js';\n\nexport const DEFAULT_ISSUE_RECONCILE_INTERVAL_MS = 5 * 60_000;\nconst MIN_LEASE_TTL_MS = 30_000;\n\nexport interface IssueReconcileWorkerConfig {\n integrationId: string;\n reconcile: IssueReconciler;\n intervalMs?: number;\n}\n\nexport class IssueReconcileWorker extends MastraWorker {\n readonly name: string;\n\n readonly #integrationId: string;\n readonly #reconcile: IssueReconciler;\n readonly #intervalMs: number;\n readonly #leaseTtlMs: number;\n readonly #leaseKey: string;\n readonly #leaseOwner = randomUUID();\n\n #running = false;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #inFlight: Promise<void> | undefined;\n #leaseProvider: LeaseProvider = NoopLeaseProvider;\n\n constructor(config: IssueReconcileWorkerConfig) {\n super();\n this.#integrationId = config.integrationId;\n this.name = `${config.integrationId}-issue-reconcile`;\n this.#leaseKey = `${config.integrationId}:issue-reconcile`;\n this.#reconcile = config.reconcile;\n this.#intervalMs = config.intervalMs ?? DEFAULT_ISSUE_RECONCILE_INTERVAL_MS;\n if (!Number.isFinite(this.#intervalMs) || this.#intervalMs <= 0) {\n throw new Error(`${config.integrationId} issue reconcile interval must be a positive number.`);\n }\n this.#leaseTtlMs = Math.max(MIN_LEASE_TTL_MS, this.#intervalMs * 3);\n }\n\n async init(deps: WorkerDeps): Promise<void> {\n await super.init(deps);\n this.#leaseProvider = getLeaseProvider(deps.pubsub);\n }\n\n async start(): Promise<void> {\n if (this.#running) return;\n if (!this.deps) throw new Error('IssueReconcileWorker: call init() before start()');\n this.#running = true;\n this.deps.logger.info(`${this.#integrationId} issue reconcile worker started`, { intervalMs: this.#intervalMs });\n this.#schedule(0);\n }\n\n async stop(): Promise<void> {\n if (!this.#running) return;\n this.#running = false;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n await this.#inFlight;\n }\n\n get isRunning(): boolean {\n return this.#running;\n }\n\n #schedule(delayMs: number): void {\n if (!this.#running) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n const run = this.#tick().finally(() => {\n this.#inFlight = undefined;\n this.#schedule(this.#intervalMs);\n });\n this.#inFlight = run;\n }, delayMs);\n this.#timer.unref?.();\n }\n\n async #tick(): Promise<void> {\n const lease = await this.#leaseProvider\n .acquireLease(this.#leaseKey, this.#leaseOwner, this.#leaseTtlMs)\n .catch(() => ({ acquired: false }));\n if (!lease.acquired) return;\n\n // A sweep that traverses many projects/orgs can outrun the lease TTL;\n // renew periodically so a replica can't grab the expired lease and start\n // an overlapping sweep partway through this one.\n const renewalTimer = setInterval(\n () => {\n void this.#leaseProvider.renewLease(this.#leaseKey, this.#leaseOwner, this.#leaseTtlMs).catch(error => {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile lease renewal failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n },\n Math.max(1_000, Math.floor(this.#leaseTtlMs / 3)),\n );\n renewalTimer.unref?.();\n\n try {\n const startedAt = Date.now();\n const { errors, ...counts } = await this.#reconcile();\n const context = { ...counts, durationMs: Date.now() - startedAt };\n if (counts.failed > 0) {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile sweep completed with failures`, {\n ...context,\n errors,\n });\n } else {\n this.deps?.logger.debug(`${this.#integrationId} issue reconcile sweep completed`, context);\n }\n } catch (error) {\n this.deps?.logger.warn(`${this.#integrationId} issue reconcile sweep failed`, {\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n clearInterval(renewalTimer);\n await this.#leaseProvider.releaseLease(this.#leaseKey, this.#leaseOwner).catch(() => undefined);\n }\n }\n}\n\nfunction getLeaseProvider(pubsub: PubSub): LeaseProvider {\n const getProvider = (pubsub as PubSub & { getLeaseProvider?: () => LeaseProvider | undefined }).getLeaseProvider;\n if (typeof getProvider === 'function') return getProvider.call(pubsub) ?? NoopLeaseProvider;\n return isLeaseProvider(pubsub) ? pubsub : ((pubsub as PubSub & { lease?: LeaseProvider }).lease ?? NoopLeaseProvider);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-worker.js","names":["#client","#linear","#storage","#projects","#workItems","#ingestFactoryIssue","#reconcileFactoryState","#pollEventsEnabled","#intervalMs","#reconcileIntervalMs","#now","#leaseOwner","#leaseTtlMs","#leaseProvider","#running","#startedAt","#settings","#schedule","#timer","#stopLeaseRenewal","#inFlight","#hasLease","#tick","#ensureLease","#poll","#startLeaseRenewal","#leaseRenewalTimer","#pollWorkspace","#maybeReconcile","#lastReconcileAt","#saveSettings","#dispatchEvent"],"sources":["../../../../src/integrations/platform/linear/event-worker.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { isLeaseProvider, NoopLeaseProvider } from '@mastra/core/events';\nimport type { LeaseProvider, PubSub } from '@mastra/core/events';\nimport { MastraWorker } from '@mastra/core/worker';\nimport type { WorkerDeps } from '@mastra/core/worker';\n\nimport type { IntegrationStorageHandle } from '../../../storage/domains/integrations/base.js';\nimport type { FactoryProjectsStorage } from '../../../storage/domains/projects/base.js';\nimport type { WorkItemsStorage } from '../../../storage/domains/work-items/base.js';\nimport type { IssueReconciler } from '../../issue-reconciler.js';\nimport type { LinearIssueIngress, LinearRulesIngress } from '../../linear/rules.js';\nimport { PlatformApiClient, PlatformApiError } from '../api-client.js';\n\nconst API_PREFIX = '/v1/server/linear';\nconst DEFAULT_POLL_INTERVAL_MS = 20_000;\nconst DEFAULT_RECONCILE_INTERVAL_MS = 5 * 60_000;\nconst EVENT_PAGE_SIZE = 500;\nconst MIN_LEASE_TTL_MS = 30_000;\nconst CURSOR_ORG_ID = '__platform_linear_event_worker__';\nconst CURSOR_USER_ID = 'worker';\nconst LEASE_KEY = 'platform-linear-events:linear';\n\ntype EventCursor = { afterEventId: string } | { afterTimestamp: number };\ntype PlatformLinearEventWorkerSettings = {\n version: 1;\n workspaces: Record<string, EventCursor>;\n};\n\nexport type PlatformLinearEventStorage = IntegrationStorageHandle<\n Record<string, unknown>,\n PlatformLinearEventWorkerSettings,\n Record<string, unknown>\n>;\n\n/**\n * Minimal envelope shape mirrored from `@platform/linear`. Kept opaque\n * (`data: unknown`) — every consumer demuxes by `type`.\n */\nexport interface LinearWebhookEnvelope {\n type: string;\n action: string | null;\n createdAt: string | null;\n webhookTimestamp: number | null;\n linearOrganizationId: string | null;\n oauthClientId: string | null;\n url: string | null;\n data: unknown;\n}\n\nexport interface LinearEventLogEntry {\n id: string;\n timestamp: number;\n envelope: LinearWebhookEnvelope;\n}\n\nexport interface PlatformLinearWorkspace {\n linearWorkspaceId: string;\n linearWorkspaceName?: string;\n}\n\n/**\n * Everything the worker needs to drive ingest + reconciliation without\n * pulling in the full `PlatformLinearIntegration` type (circular).\n */\nexport interface PlatformLinearEventDispatchIntegration {\n listWorkspaces(): Promise<PlatformLinearWorkspace[]>;\n}\n\nexport interface PlatformLinearEventWorkerConfig {\n client: PlatformApiClient;\n linear: PlatformLinearEventDispatchIntegration;\n storage: PlatformLinearEventStorage;\n projects: Pick<FactoryProjectsStorage, 'listAll'>;\n /**\n * Used to scope event dispatch to `(orgId, factoryProjectId)` pairs that\n * already have a work item linked to the incoming Linear issue. Without\n * this scoping, a workspace-scoped event would fan out to every project in\n * every org and materialize a triage card in each — a cross-tenant leak.\n * First-observation of a Linear issue happens through the user-authenticated\n * `/web/linear/issues?factoryProjectId=...` intake path instead.\n */\n workItems: Pick<WorkItemsStorage, 'list'>;\n /** Called with a single-issue rules ingress derived from an `Issue` webhook. */\n ingestFactoryIssue?: (input: LinearRulesIngress) => Promise<unknown>;\n reconcileFactoryState?: IssueReconciler;\n /** When false the worker skips event tailing and only runs the reconcile sweep. */\n pollEventsEnabled?: boolean;\n intervalMs?: number;\n reconcileIntervalMs?: number;\n now?: () => number;\n}\n\n/**\n * Tails the Platform Linear event stream (Redis-backed, per workspace) and\n * runs the same folded issue-reconcile sweep pattern as\n * `PlatformGithubEventWorker`. Issue events are translated into a normal\n * `LinearRulesIngress` so downstream rule dispatch is identical to the\n * polling path.\n *\n * Cursor state is persisted per workspace via the integration's generic\n * settings surface, keyed by a well-known worker identity. Cold start uses\n * `afterTimestamp: now - 1` to avoid replaying the 14-day stream backlog.\n *\n * ## Delivery semantics\n *\n * **At-most-once** per event. The cursor advances to the last event ID in a\n * page after all dispatch attempts on that page complete, regardless of\n * whether individual ingest calls threw. Ingest failures are logged, the\n * offending event is not retried, and drift is caught by the folded\n * `LinearIssueReconciler` sweep on its own cadence (default 5 minutes). This\n * matches `PlatformGithubEventWorker` and avoids poison-pill events blocking\n * the whole stream. Any consumer that needs exactly-once must idempotently\n * handle the same issue arriving via both the event path and the reconcile\n * path.\n */\nexport class PlatformLinearEventWorker extends MastraWorker {\n readonly name = 'platform-linear-events';\n\n readonly #client: PlatformApiClient;\n readonly #linear: PlatformLinearEventDispatchIntegration;\n readonly #storage: PlatformLinearEventStorage;\n readonly #projects: Pick<FactoryProjectsStorage, 'listAll'>;\n readonly #workItems: Pick<WorkItemsStorage, 'list'>;\n readonly #ingestFactoryIssue: ((input: LinearRulesIngress) => Promise<unknown>) | undefined;\n readonly #reconcileFactoryState: IssueReconciler | undefined;\n readonly #pollEventsEnabled: boolean;\n readonly #intervalMs: number;\n readonly #reconcileIntervalMs: number;\n readonly #now: () => number;\n readonly #leaseOwner = randomUUID();\n\n #running = false;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #leaseRenewalTimer: ReturnType<typeof setInterval> | undefined;\n #inFlight: Promise<void> | undefined;\n #leaseProvider: LeaseProvider = NoopLeaseProvider;\n #leaseTtlMs: number;\n #hasLease = false;\n #startedAt = 0;\n #lastReconcileAt = 0;\n #settings: PlatformLinearEventWorkerSettings = { version: 1, workspaces: {} };\n\n constructor(config: PlatformLinearEventWorkerConfig) {\n super();\n this.#client = config.client;\n this.#linear = config.linear;\n this.#storage = config.storage;\n this.#projects = config.projects;\n this.#workItems = config.workItems;\n this.#ingestFactoryIssue = config.ingestFactoryIssue;\n this.#reconcileFactoryState = config.reconcileFactoryState;\n this.#pollEventsEnabled = config.pollEventsEnabled ?? true;\n this.#intervalMs = config.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n this.#reconcileIntervalMs = config.reconcileIntervalMs ?? DEFAULT_RECONCILE_INTERVAL_MS;\n if (!Number.isFinite(this.#intervalMs) || this.#intervalMs <= 0) {\n throw new Error('Platform Linear event polling interval must be a positive number.');\n }\n if (!Number.isFinite(this.#reconcileIntervalMs) || this.#reconcileIntervalMs <= 0) {\n throw new Error('Platform Linear reconcile interval must be a positive number.');\n }\n this.#leaseTtlMs = Math.max(MIN_LEASE_TTL_MS, this.#intervalMs * 3);\n this.#now = config.now ?? Date.now;\n }\n\n async init(deps: WorkerDeps): Promise<void> {\n await super.init(deps);\n this.#leaseProvider = getLeaseProvider(deps.pubsub);\n }\n\n async start(): Promise<void> {\n if (this.#running) return;\n if (!this.deps) throw new Error('PlatformLinearEventWorker: call init() before start()');\n\n this.#startedAt = this.#now() - 1;\n this.#settings = normalizeSettings(await this.#storage.settings.get(CURSOR_ORG_ID, CURSOR_USER_ID));\n this.#running = true;\n this.deps.logger.info('Platform Linear event polling started', {\n intervalMs: this.#intervalMs,\n leaseTtlMs: this.#leaseTtlMs,\n });\n this.#schedule(0);\n }\n\n async stop(): Promise<void> {\n if (!this.#running) return;\n this.#running = false;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#stopLeaseRenewal();\n await this.#inFlight;\n if (this.#hasLease) {\n await this.#leaseProvider.releaseLease(LEASE_KEY, this.#leaseOwner).catch(() => undefined);\n this.#hasLease = false;\n }\n }\n\n get isRunning(): boolean {\n return this.#running;\n }\n\n #schedule(delayMs: number): void {\n if (!this.#running) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n const run = this.#tick();\n this.#inFlight = run;\n void run.finally(() => {\n if (this.#inFlight === run) this.#inFlight = undefined;\n });\n }, delayMs);\n this.#timer.unref?.();\n }\n\n async #tick(): Promise<void> {\n let nextDelay = this.#intervalMs;\n try {\n if (!(await this.#ensureLease())) return;\n nextDelay = await this.#poll();\n } catch (error) {\n nextDelay = retryDelay(error, this.#intervalMs);\n this.deps?.logger.error('Platform Linear event polling cycle failed', {\n error: error instanceof Error ? error.message : String(error),\n retryInMs: nextDelay,\n });\n } finally {\n this.#schedule(nextDelay);\n }\n }\n\n async #ensureLease(): Promise<boolean> {\n if (this.#hasLease) return true;\n const result = await this.#leaseProvider.acquireLease(LEASE_KEY, this.#leaseOwner, this.#leaseTtlMs);\n this.#hasLease = result.acquired;\n if (this.#hasLease) this.#startLeaseRenewal();\n return this.#hasLease;\n }\n\n #startLeaseRenewal(): void {\n if (this.#leaseRenewalTimer) return;\n this.#leaseRenewalTimer = setInterval(\n () => {\n void this.#leaseProvider\n .renewLease(LEASE_KEY, this.#leaseOwner, this.#leaseTtlMs)\n .then(renewed => {\n if (!renewed) {\n this.#hasLease = false;\n this.#stopLeaseRenewal();\n }\n })\n .catch(error => {\n this.#hasLease = false;\n this.#stopLeaseRenewal();\n this.deps?.logger.warn('Platform Linear event polling lease renewal failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n },\n Math.floor(this.#leaseTtlMs / 3),\n );\n this.#leaseRenewalTimer.unref?.();\n }\n\n #stopLeaseRenewal(): void {\n if (this.#leaseRenewalTimer) clearInterval(this.#leaseRenewalTimer);\n this.#leaseRenewalTimer = undefined;\n }\n\n async #poll(): Promise<number> {\n // Reconcile-only mode has no event tail to keep fresh, so tick on the\n // slower reconcile cadence instead of the polling interval.\n let retryInMs = this.#pollEventsEnabled ? this.#intervalMs : this.#reconcileIntervalMs;\n\n if (this.#pollEventsEnabled) {\n // Only list workspaces when actually tailing events: reconciliation\n // does not need the workspace list, and folding this call into\n // reconcile-only mode would let one workspace-listing outage take\n // down the reconcile sweep as well.\n let workspaces: PlatformLinearWorkspace[] = [];\n try {\n workspaces = await this.#linear.listWorkspaces();\n } catch (error) {\n const delay = retryDelay(error, this.#intervalMs);\n retryInMs = Math.max(retryInMs, delay);\n this.deps?.logger.error('Platform Linear workspace listing failed', {\n error: error instanceof Error ? error.message : String(error),\n retryInMs: delay,\n });\n }\n\n for (const workspace of workspaces) {\n if (!this.#running || !this.#hasLease) break;\n try {\n await this.#pollWorkspace(workspace.linearWorkspaceId);\n } catch (error) {\n const delay = retryDelay(error, this.#intervalMs);\n retryInMs = Math.max(retryInMs, delay);\n this.deps?.logger.error('Platform Linear workspace event polling failed', {\n linearWorkspaceId: workspace.linearWorkspaceId,\n error: error instanceof Error ? error.message : String(error),\n retryInMs: delay,\n });\n if (error instanceof PlatformApiError && error.status === 429) break;\n }\n }\n }\n\n await this.#maybeReconcile();\n\n return retryInMs;\n }\n\n async #maybeReconcile(): Promise<void> {\n if (!this.#reconcileFactoryState || !this.#running || !this.#hasLease) return;\n const now = this.#now();\n if (now - this.#lastReconcileAt < this.#reconcileIntervalMs) return;\n // Advance the clock before sweeping so a persistently failing sweep stays\n // on cadence instead of retrying every poll tick.\n this.#lastReconcileAt = now;\n const startedAt = Date.now();\n try {\n const { errors, ...counts } = await this.#reconcileFactoryState();\n const context = { ...counts, durationMs: Date.now() - startedAt };\n if (counts.failed > 0) {\n this.deps?.logger.warn('Platform Linear issue reconcile sweep completed with failures', {\n ...context,\n errors,\n });\n } else if (counts.updated > 0) {\n this.deps?.logger.info('Platform Linear issue reconcile patched stale metadata', context);\n } else {\n this.deps?.logger.debug('Platform Linear issue reconcile sweep completed', context);\n }\n } catch (error) {\n this.deps?.logger.error('Platform Linear issue reconcile failed', {\n durationMs: Date.now() - startedAt,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n async #pollWorkspace(linearWorkspaceId: string): Promise<void> {\n if (!this.#settings.workspaces[linearWorkspaceId]) {\n this.#settings.workspaces[linearWorkspaceId] = { afterTimestamp: this.#startedAt };\n await this.#saveSettings();\n }\n\n while (this.#running && this.#hasLease) {\n const cursor: EventCursor = this.#settings.workspaces[linearWorkspaceId]!;\n const query = new URLSearchParams({ limit: String(EVENT_PAGE_SIZE), type: 'Issue' });\n if ('afterEventId' in cursor) query.set('afterEventId', cursor.afterEventId);\n else query.set('after', String(cursor.afterTimestamp));\n\n const pollStartedAt = performance.now();\n const page = await this.#client.request<{ events: LinearEventLogEntry[] }>(\n 'GET',\n `${API_PREFIX}/workspaces/${encodeURIComponent(linearWorkspaceId)}/events?${query}`,\n );\n this.deps?.logger.debug('Platform Linear workspace event poll completed', {\n linearWorkspaceId,\n eventCount: page.events.length,\n latencyMs: Math.round(performance.now() - pollStartedAt),\n });\n if (page.events.length === 0) return;\n\n const lastId = page.events[page.events.length - 1]!.id;\n\n // Resolve the project set once per page instead of once per event.\n // The event stream can return up to EVENT_PAGE_SIZE (500) events; the\n // project list rarely changes within the second or two it takes to\n // dispatch a single page, and #dispatchEvent still consults storage\n // per-project to check for a linked work item.\n const projects = await this.#projects.listAll();\n\n for (const event of page.events) {\n if (!this.#running || !this.#hasLease) return;\n await this.#dispatchEvent(linearWorkspaceId, event, projects);\n }\n\n if ('afterEventId' in cursor && cursor.afterEventId === lastId) return;\n this.#settings.workspaces[linearWorkspaceId] = { afterEventId: lastId };\n await this.#saveSettings();\n\n // Short pages mean we've caught up; wait for the next tick.\n if (page.events.length < EVENT_PAGE_SIZE) return;\n }\n }\n\n async #dispatchEvent(\n linearWorkspaceId: string,\n event: LinearEventLogEntry,\n projects: readonly { id: string; orgId: string }[],\n ): Promise<void> {\n if (event.envelope.type !== 'Issue') return;\n if (!this.#ingestFactoryIssue) return;\n const issue = parseIssueEnvelope(event.envelope);\n if (!issue) {\n this.deps?.logger.warn('Platform Linear event log returned an unusable Issue payload', {\n linearWorkspaceId,\n eventId: event.id,\n });\n return;\n }\n\n // The event stream is workspace-scoped and Platform Linear has no\n // workspace→org mapping we can trust. To avoid cross-tenant fan-out (an\n // Issue from org A materializing a triage card in org B via the default\n // `linearIssueObserved` rule), only dispatch to `(orgId, factoryProjectId)`\n // pairs that already have a persisted work item for this Linear issue.\n // First-observation of a Linear issue happens through the\n // user-authenticated `/web/linear/issues?factoryProjectId=...` intake path.\n const sourceKey = `linear:${issue.identifier}`;\n let dispatched = 0;\n for (const project of projects) {\n let items;\n try {\n items = await this.#workItems.list({ orgId: project.orgId, factoryProjectId: project.id });\n } catch (error) {\n this.deps?.logger.error('Platform Linear work-item lookup failed', {\n linearWorkspaceId,\n eventId: event.id,\n projectId: project.id,\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n const linked = items.some(\n item =>\n item.externalSource?.integrationId === 'linear' &&\n item.externalSource.type === 'issue' &&\n item.externalSource.externalId === sourceKey,\n );\n if (!linked) continue;\n try {\n await this.#ingestFactoryIssue({\n orgId: project.orgId,\n userId: 'platform-linear-event-worker',\n factoryProjectId: project.id,\n issues: [issue],\n });\n dispatched += 1;\n } catch (error) {\n this.deps?.logger.error('Platform Linear issue ingest failed', {\n linearWorkspaceId,\n eventId: event.id,\n projectId: project.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n if (dispatched === 0) {\n this.deps?.logger.debug('Platform Linear Issue event had no linked work items to update', {\n linearWorkspaceId,\n eventId: event.id,\n sourceKey,\n });\n }\n }\n\n async #saveSettings(): Promise<void> {\n await this.#storage.settings.save(CURSOR_ORG_ID, CURSOR_USER_ID, this.#settings);\n }\n}\n\nfunction getLeaseProvider(pubsub: PubSub): LeaseProvider {\n const getProvider = (pubsub as PubSub & { getLeaseProvider?: () => LeaseProvider | undefined }).getLeaseProvider;\n if (typeof getProvider === 'function') return getProvider.call(pubsub) ?? NoopLeaseProvider;\n return isLeaseProvider(pubsub) ? pubsub : NoopLeaseProvider;\n}\n\nfunction normalizeSettings(value: PlatformLinearEventWorkerSettings | null): PlatformLinearEventWorkerSettings {\n if (!value || value.version !== 1 || !value.workspaces || typeof value.workspaces !== 'object') {\n return { version: 1, workspaces: {} };\n }\n return { version: 1, workspaces: { ...value.workspaces } };\n}\n\nfunction retryDelay(error: unknown, fallbackMs: number): number {\n if (error instanceof PlatformApiError && error.status === 429 && error.retryAfterSeconds !== null) {\n return Math.max(fallbackMs, error.retryAfterSeconds * 1_000);\n }\n return fallbackMs;\n}\n\n/**\n * Translate an Issue webhook envelope into the rules-ingress shape.\n * Returns undefined when the payload lacks the identifiers we need to\n * match a work item.\n */\nfunction parseIssueEnvelope(envelope: LinearWebhookEnvelope): LinearIssueIngress | undefined {\n const data = envelope.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return undefined;\n const raw = data as Record<string, unknown>;\n const id = typeof raw.id === 'string' ? raw.id : undefined;\n const identifier = typeof raw.identifier === 'string' ? raw.identifier : undefined;\n const title = typeof raw.title === 'string' ? raw.title : undefined;\n const url = typeof raw.url === 'string' ? raw.url : envelope.url ?? undefined;\n if (!id || !identifier || !title || !url) return undefined;\n\n const state = optionalObject(raw.state);\n const team = optionalObject(raw.team);\n const assignee = optionalObject(raw.assignee);\n const creator = optionalObject(raw.user) ?? optionalObject(raw.creator);\n const labels = Array.isArray(raw.labels)\n ? raw.labels.flatMap(label => {\n const obj = optionalObject(label);\n return obj && typeof obj.name === 'string' ? [obj.name] : [];\n })\n : [];\n\n const createdAt = typeof raw.createdAt === 'string' ? raw.createdAt : envelope.createdAt ?? '';\n const updatedAt = typeof raw.updatedAt === 'string' ? raw.updatedAt : createdAt;\n\n return {\n id,\n identifier,\n title,\n url,\n state: (state && typeof state.name === 'string' ? state.name : null) ?? '',\n stateType: (state && typeof state.type === 'string' ? state.type : null) ?? '',\n priorityLabel: typeof raw.priorityLabel === 'string' ? raw.priorityLabel : '',\n assignee: assignee && typeof assignee.name === 'string' ? assignee.name : null,\n creator: creator && typeof creator.name === 'string' ? creator.name : null,\n team: team && typeof team.name === 'string' ? team.name : null,\n labels,\n createdAt,\n updatedAt,\n };\n}\n\nfunction optionalObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"event-worker.js","names":["#client","#linear","#storage","#projects","#workItems","#ingestFactoryIssue","#reconcileFactoryState","#pollEventsEnabled","#intervalMs","#reconcileIntervalMs","#now","#leaseOwner","#leaseTtlMs","#leaseProvider","#running","#startedAt","#settings","#schedule","#timer","#stopLeaseRenewal","#inFlight","#hasLease","#tick","#ensureLease","#poll","#startLeaseRenewal","#leaseRenewalTimer","#pollWorkspace","#maybeReconcile","#lastReconcileAt","#saveSettings","#dispatchEvent"],"sources":["../../../../src/integrations/platform/linear/event-worker.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { isLeaseProvider, NoopLeaseProvider } from '@mastra/core/events';\nimport type { LeaseProvider, PubSub } from '@mastra/core/events';\nimport { MastraWorker } from '@mastra/core/worker';\nimport type { WorkerDeps } from '@mastra/core/worker';\n\nimport type { IntegrationStorageHandle } from '../../../storage/domains/integrations/base.js';\nimport type { FactoryProjectsStorage } from '../../../storage/domains/projects/base.js';\nimport type { WorkItemsStorage } from '../../../storage/domains/work-items/base.js';\nimport type { IssueReconciler } from '../../issue-reconciler.js';\nimport type { LinearIssueIngress, LinearRulesIngress } from '../../linear/rules.js';\nimport { PlatformApiClient, PlatformApiError } from '../api-client.js';\n\nconst API_PREFIX = '/v1/server/linear';\nconst DEFAULT_POLL_INTERVAL_MS = 20_000;\nconst DEFAULT_RECONCILE_INTERVAL_MS = 5 * 60_000;\nconst EVENT_PAGE_SIZE = 500;\nconst MIN_LEASE_TTL_MS = 30_000;\nconst CURSOR_ORG_ID = '__platform_linear_event_worker__';\nconst CURSOR_USER_ID = 'worker';\nconst LEASE_KEY = 'platform-linear-events:linear';\n\ntype EventCursor = { afterEventId: string } | { afterTimestamp: number };\ntype PlatformLinearEventWorkerSettings = {\n version: 1;\n workspaces: Record<string, EventCursor>;\n};\n\nexport type PlatformLinearEventStorage = IntegrationStorageHandle<\n Record<string, unknown>,\n PlatformLinearEventWorkerSettings,\n Record<string, unknown>\n>;\n\n/**\n * Minimal envelope shape mirrored from `@platform/linear`. Kept opaque\n * (`data: unknown`) — every consumer demuxes by `type`.\n */\nexport interface LinearWebhookEnvelope {\n type: string;\n action: string | null;\n createdAt: string | null;\n webhookTimestamp: number | null;\n linearOrganizationId: string | null;\n oauthClientId: string | null;\n url: string | null;\n data: unknown;\n}\n\nexport interface LinearEventLogEntry {\n id: string;\n timestamp: number;\n envelope: LinearWebhookEnvelope;\n}\n\nexport interface PlatformLinearWorkspace {\n linearWorkspaceId: string;\n linearWorkspaceName?: string;\n}\n\n/**\n * Everything the worker needs to drive ingest + reconciliation without\n * pulling in the full `PlatformLinearIntegration` type (circular).\n */\nexport interface PlatformLinearEventDispatchIntegration {\n listWorkspaces(): Promise<PlatformLinearWorkspace[]>;\n}\n\nexport interface PlatformLinearEventWorkerConfig {\n client: PlatformApiClient;\n linear: PlatformLinearEventDispatchIntegration;\n storage: PlatformLinearEventStorage;\n projects: Pick<FactoryProjectsStorage, 'listAll'>;\n /**\n * Used to scope event dispatch to `(orgId, factoryProjectId)` pairs that\n * already have a work item linked to the incoming Linear issue. Without\n * this scoping, a workspace-scoped event would fan out to every project in\n * every org and materialize a triage card in each — a cross-tenant leak.\n * First-observation of a Linear issue happens through the user-authenticated\n * `/web/linear/issues?factoryProjectId=...` intake path instead.\n */\n workItems: Pick<WorkItemsStorage, 'list'>;\n /** Called with a single-issue rules ingress derived from an `Issue` webhook. */\n ingestFactoryIssue?: (input: LinearRulesIngress) => Promise<unknown>;\n reconcileFactoryState?: IssueReconciler;\n /** When false the worker skips event tailing and only runs the reconcile sweep. */\n pollEventsEnabled?: boolean;\n intervalMs?: number;\n reconcileIntervalMs?: number;\n now?: () => number;\n}\n\n/**\n * Tails the Platform Linear event stream (Redis-backed, per workspace) and\n * runs the same folded issue-reconcile sweep pattern as\n * `PlatformGithubEventWorker`. Issue events are translated into a normal\n * `LinearRulesIngress` so downstream rule dispatch is identical to the\n * polling path.\n *\n * Cursor state is persisted per workspace via the integration's generic\n * settings surface, keyed by a well-known worker identity. Cold start uses\n * `afterTimestamp: now - 1` to avoid replaying the 14-day stream backlog.\n *\n * ## Delivery semantics\n *\n * **At-most-once** per event. The cursor advances to the last event ID in a\n * page after all dispatch attempts on that page complete, regardless of\n * whether individual ingest calls threw. Ingest failures are logged, the\n * offending event is not retried, and drift is caught by the folded\n * `LinearIssueReconciler` sweep on its own cadence (default 5 minutes). This\n * matches `PlatformGithubEventWorker` and avoids poison-pill events blocking\n * the whole stream. Any consumer that needs exactly-once must idempotently\n * handle the same issue arriving via both the event path and the reconcile\n * path.\n */\nexport class PlatformLinearEventWorker extends MastraWorker {\n readonly name = 'platform-linear-events';\n\n readonly #client: PlatformApiClient;\n readonly #linear: PlatformLinearEventDispatchIntegration;\n readonly #storage: PlatformLinearEventStorage;\n readonly #projects: Pick<FactoryProjectsStorage, 'listAll'>;\n readonly #workItems: Pick<WorkItemsStorage, 'list'>;\n readonly #ingestFactoryIssue: ((input: LinearRulesIngress) => Promise<unknown>) | undefined;\n readonly #reconcileFactoryState: IssueReconciler | undefined;\n readonly #pollEventsEnabled: boolean;\n readonly #intervalMs: number;\n readonly #reconcileIntervalMs: number;\n readonly #now: () => number;\n readonly #leaseOwner = randomUUID();\n\n #running = false;\n #timer: ReturnType<typeof setTimeout> | undefined;\n #leaseRenewalTimer: ReturnType<typeof setInterval> | undefined;\n #inFlight: Promise<void> | undefined;\n #leaseProvider: LeaseProvider = NoopLeaseProvider;\n #leaseTtlMs: number;\n #hasLease = false;\n #startedAt = 0;\n #lastReconcileAt = 0;\n #settings: PlatformLinearEventWorkerSettings = { version: 1, workspaces: {} };\n\n constructor(config: PlatformLinearEventWorkerConfig) {\n super();\n this.#client = config.client;\n this.#linear = config.linear;\n this.#storage = config.storage;\n this.#projects = config.projects;\n this.#workItems = config.workItems;\n this.#ingestFactoryIssue = config.ingestFactoryIssue;\n this.#reconcileFactoryState = config.reconcileFactoryState;\n this.#pollEventsEnabled = config.pollEventsEnabled ?? true;\n this.#intervalMs = config.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n this.#reconcileIntervalMs = config.reconcileIntervalMs ?? DEFAULT_RECONCILE_INTERVAL_MS;\n if (!Number.isFinite(this.#intervalMs) || this.#intervalMs <= 0) {\n throw new Error('Platform Linear event polling interval must be a positive number.');\n }\n if (!Number.isFinite(this.#reconcileIntervalMs) || this.#reconcileIntervalMs <= 0) {\n throw new Error('Platform Linear reconcile interval must be a positive number.');\n }\n this.#leaseTtlMs = Math.max(MIN_LEASE_TTL_MS, this.#intervalMs * 3);\n this.#now = config.now ?? Date.now;\n }\n\n async init(deps: WorkerDeps): Promise<void> {\n await super.init(deps);\n this.#leaseProvider = getLeaseProvider(deps.pubsub);\n }\n\n async start(): Promise<void> {\n if (this.#running) return;\n if (!this.deps) throw new Error('PlatformLinearEventWorker: call init() before start()');\n\n this.#startedAt = this.#now() - 1;\n this.#settings = normalizeSettings(await this.#storage.settings.get(CURSOR_ORG_ID, CURSOR_USER_ID));\n this.#running = true;\n this.deps.logger.info('Platform Linear event polling started', {\n intervalMs: this.#intervalMs,\n leaseTtlMs: this.#leaseTtlMs,\n });\n this.#schedule(0);\n }\n\n async stop(): Promise<void> {\n if (!this.#running) return;\n this.#running = false;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#stopLeaseRenewal();\n await this.#inFlight;\n if (this.#hasLease) {\n await this.#leaseProvider.releaseLease(LEASE_KEY, this.#leaseOwner).catch(() => undefined);\n this.#hasLease = false;\n }\n }\n\n get isRunning(): boolean {\n return this.#running;\n }\n\n #schedule(delayMs: number): void {\n if (!this.#running) return;\n this.#timer = setTimeout(() => {\n this.#timer = undefined;\n const run = this.#tick();\n this.#inFlight = run;\n void run.finally(() => {\n if (this.#inFlight === run) this.#inFlight = undefined;\n });\n }, delayMs);\n this.#timer.unref?.();\n }\n\n async #tick(): Promise<void> {\n let nextDelay = this.#intervalMs;\n try {\n if (!(await this.#ensureLease())) return;\n nextDelay = await this.#poll();\n } catch (error) {\n nextDelay = retryDelay(error, this.#intervalMs);\n this.deps?.logger.error('Platform Linear event polling cycle failed', {\n error: error instanceof Error ? error.message : String(error),\n retryInMs: nextDelay,\n });\n } finally {\n this.#schedule(nextDelay);\n }\n }\n\n async #ensureLease(): Promise<boolean> {\n if (this.#hasLease) return true;\n const result = await this.#leaseProvider.acquireLease(LEASE_KEY, this.#leaseOwner, this.#leaseTtlMs);\n this.#hasLease = result.acquired;\n if (this.#hasLease) this.#startLeaseRenewal();\n return this.#hasLease;\n }\n\n #startLeaseRenewal(): void {\n if (this.#leaseRenewalTimer) return;\n this.#leaseRenewalTimer = setInterval(\n () => {\n void this.#leaseProvider\n .renewLease(LEASE_KEY, this.#leaseOwner, this.#leaseTtlMs)\n .then(renewed => {\n if (!renewed) {\n this.#hasLease = false;\n this.#stopLeaseRenewal();\n }\n })\n .catch(error => {\n this.#hasLease = false;\n this.#stopLeaseRenewal();\n this.deps?.logger.warn('Platform Linear event polling lease renewal failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n },\n Math.floor(this.#leaseTtlMs / 3),\n );\n this.#leaseRenewalTimer.unref?.();\n }\n\n #stopLeaseRenewal(): void {\n if (this.#leaseRenewalTimer) clearInterval(this.#leaseRenewalTimer);\n this.#leaseRenewalTimer = undefined;\n }\n\n async #poll(): Promise<number> {\n // Reconcile-only mode has no event tail to keep fresh, so tick on the\n // slower reconcile cadence instead of the polling interval.\n let retryInMs = this.#pollEventsEnabled ? this.#intervalMs : this.#reconcileIntervalMs;\n\n if (this.#pollEventsEnabled) {\n // Only list workspaces when actually tailing events: reconciliation\n // does not need the workspace list, and folding this call into\n // reconcile-only mode would let one workspace-listing outage take\n // down the reconcile sweep as well.\n let workspaces: PlatformLinearWorkspace[] = [];\n try {\n workspaces = await this.#linear.listWorkspaces();\n } catch (error) {\n const delay = retryDelay(error, this.#intervalMs);\n retryInMs = Math.max(retryInMs, delay);\n this.deps?.logger.error('Platform Linear workspace listing failed', {\n error: error instanceof Error ? error.message : String(error),\n retryInMs: delay,\n });\n }\n\n for (const workspace of workspaces) {\n if (!this.#running || !this.#hasLease) break;\n try {\n await this.#pollWorkspace(workspace.linearWorkspaceId);\n } catch (error) {\n const delay = retryDelay(error, this.#intervalMs);\n retryInMs = Math.max(retryInMs, delay);\n this.deps?.logger.error('Platform Linear workspace event polling failed', {\n linearWorkspaceId: workspace.linearWorkspaceId,\n error: error instanceof Error ? error.message : String(error),\n retryInMs: delay,\n });\n if (error instanceof PlatformApiError && error.status === 429) break;\n }\n }\n }\n\n await this.#maybeReconcile();\n\n return retryInMs;\n }\n\n async #maybeReconcile(): Promise<void> {\n if (!this.#reconcileFactoryState || !this.#running || !this.#hasLease) return;\n const now = this.#now();\n if (now - this.#lastReconcileAt < this.#reconcileIntervalMs) return;\n // Advance the clock before sweeping so a persistently failing sweep stays\n // on cadence instead of retrying every poll tick.\n this.#lastReconcileAt = now;\n const startedAt = Date.now();\n try {\n const { errors, ...counts } = await this.#reconcileFactoryState();\n const context = { ...counts, durationMs: Date.now() - startedAt };\n if (counts.failed > 0) {\n this.deps?.logger.warn('Platform Linear issue reconcile sweep completed with failures', {\n ...context,\n errors,\n });\n } else if (counts.updated > 0) {\n this.deps?.logger.info('Platform Linear issue reconcile patched stale metadata', context);\n } else {\n this.deps?.logger.debug('Platform Linear issue reconcile sweep completed', context);\n }\n } catch (error) {\n this.deps?.logger.error('Platform Linear issue reconcile failed', {\n durationMs: Date.now() - startedAt,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n async #pollWorkspace(linearWorkspaceId: string): Promise<void> {\n if (!this.#settings.workspaces[linearWorkspaceId]) {\n this.#settings.workspaces[linearWorkspaceId] = { afterTimestamp: this.#startedAt };\n await this.#saveSettings();\n }\n\n while (this.#running && this.#hasLease) {\n const cursor: EventCursor = this.#settings.workspaces[linearWorkspaceId]!;\n const query = new URLSearchParams({ limit: String(EVENT_PAGE_SIZE), type: 'Issue' });\n if ('afterEventId' in cursor) query.set('afterEventId', cursor.afterEventId);\n else query.set('after', String(cursor.afterTimestamp));\n\n const pollStartedAt = performance.now();\n const page = await this.#client.request<{ events: LinearEventLogEntry[] }>(\n 'GET',\n `${API_PREFIX}/workspaces/${encodeURIComponent(linearWorkspaceId)}/events?${query}`,\n );\n this.deps?.logger.debug('Platform Linear workspace event poll completed', {\n linearWorkspaceId,\n eventCount: page.events.length,\n latencyMs: Math.round(performance.now() - pollStartedAt),\n });\n if (page.events.length === 0) return;\n\n const lastId = page.events[page.events.length - 1]!.id;\n\n // Resolve the project set once per page instead of once per event.\n // The event stream can return up to EVENT_PAGE_SIZE (500) events; the\n // project list rarely changes within the second or two it takes to\n // dispatch a single page, and #dispatchEvent still consults storage\n // per-project to check for a linked work item.\n const projects = await this.#projects.listAll();\n\n for (const event of page.events) {\n if (!this.#running || !this.#hasLease) return;\n await this.#dispatchEvent(linearWorkspaceId, event, projects);\n }\n\n if ('afterEventId' in cursor && cursor.afterEventId === lastId) return;\n this.#settings.workspaces[linearWorkspaceId] = { afterEventId: lastId };\n await this.#saveSettings();\n\n // Short pages mean we've caught up; wait for the next tick.\n if (page.events.length < EVENT_PAGE_SIZE) return;\n }\n }\n\n async #dispatchEvent(\n linearWorkspaceId: string,\n event: LinearEventLogEntry,\n projects: readonly { id: string; orgId: string }[],\n ): Promise<void> {\n if (event.envelope.type !== 'Issue') return;\n if (!this.#ingestFactoryIssue) return;\n const issue = parseIssueEnvelope(event.envelope);\n if (!issue) {\n this.deps?.logger.warn('Platform Linear event log returned an unusable Issue payload', {\n linearWorkspaceId,\n eventId: event.id,\n });\n return;\n }\n\n // The event stream is workspace-scoped and Platform Linear has no\n // workspace→org mapping we can trust. To avoid cross-tenant fan-out (an\n // Issue from org A materializing a triage card in org B via the default\n // `linearIssueObserved` rule), only dispatch to `(orgId, factoryProjectId)`\n // pairs that already have a persisted work item for this Linear issue.\n // First-observation of a Linear issue happens through the\n // user-authenticated `/web/linear/issues?factoryProjectId=...` intake path.\n const sourceKey = `linear:${issue.identifier}`;\n let dispatched = 0;\n for (const project of projects) {\n let items;\n try {\n items = await this.#workItems.list({ orgId: project.orgId, factoryProjectId: project.id });\n } catch (error) {\n this.deps?.logger.error('Platform Linear work-item lookup failed', {\n linearWorkspaceId,\n eventId: event.id,\n projectId: project.id,\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n const linked = items.some(\n item =>\n item.externalSource?.integrationId === 'linear' &&\n item.externalSource.type === 'issue' &&\n item.externalSource.externalId === sourceKey,\n );\n if (!linked) continue;\n try {\n await this.#ingestFactoryIssue({\n orgId: project.orgId,\n userId: 'platform-linear-event-worker',\n factoryProjectId: project.id,\n issues: [issue],\n });\n dispatched += 1;\n } catch (error) {\n this.deps?.logger.error('Platform Linear issue ingest failed', {\n linearWorkspaceId,\n eventId: event.id,\n projectId: project.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n if (dispatched === 0) {\n this.deps?.logger.debug('Platform Linear Issue event had no linked work items to update', {\n linearWorkspaceId,\n eventId: event.id,\n sourceKey,\n });\n }\n }\n\n async #saveSettings(): Promise<void> {\n await this.#storage.settings.save(CURSOR_ORG_ID, CURSOR_USER_ID, this.#settings);\n }\n}\n\nfunction getLeaseProvider(pubsub: PubSub): LeaseProvider {\n const getProvider = (pubsub as PubSub & { getLeaseProvider?: () => LeaseProvider | undefined }).getLeaseProvider;\n if (typeof getProvider === 'function') return getProvider.call(pubsub) ?? NoopLeaseProvider;\n return isLeaseProvider(pubsub) ? pubsub : NoopLeaseProvider;\n}\n\nfunction normalizeSettings(value: PlatformLinearEventWorkerSettings | null): PlatformLinearEventWorkerSettings {\n if (!value || value.version !== 1 || !value.workspaces || typeof value.workspaces !== 'object') {\n return { version: 1, workspaces: {} };\n }\n return { version: 1, workspaces: { ...value.workspaces } };\n}\n\nfunction retryDelay(error: unknown, fallbackMs: number): number {\n if (error instanceof PlatformApiError && error.status === 429 && error.retryAfterSeconds !== null) {\n return Math.max(fallbackMs, error.retryAfterSeconds * 1_000);\n }\n return fallbackMs;\n}\n\n/**\n * Translate an Issue webhook envelope into the rules-ingress shape.\n * Returns undefined when the payload lacks the identifiers we need to\n * match a work item.\n */\nfunction parseIssueEnvelope(envelope: LinearWebhookEnvelope): LinearIssueIngress | undefined {\n const data = envelope.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return undefined;\n const raw = data as Record<string, unknown>;\n const id = typeof raw.id === 'string' ? raw.id : undefined;\n const identifier = typeof raw.identifier === 'string' ? raw.identifier : undefined;\n const title = typeof raw.title === 'string' ? raw.title : undefined;\n const url = typeof raw.url === 'string' ? raw.url : (envelope.url ?? undefined);\n if (!id || !identifier || !title || !url) return undefined;\n\n const state = optionalObject(raw.state);\n const team = optionalObject(raw.team);\n const assignee = optionalObject(raw.assignee);\n const creator = optionalObject(raw.user) ?? optionalObject(raw.creator);\n const labels = Array.isArray(raw.labels)\n ? raw.labels.flatMap(label => {\n const obj = optionalObject(label);\n return obj && typeof obj.name === 'string' ? [obj.name] : [];\n })\n : [];\n\n const createdAt = typeof raw.createdAt === 'string' ? raw.createdAt : (envelope.createdAt ?? '');\n const updatedAt = typeof raw.updatedAt === 'string' ? raw.updatedAt : createdAt;\n\n return {\n id,\n identifier,\n title,\n url,\n state: (state && typeof state.name === 'string' ? state.name : null) ?? '',\n stateType: (state && typeof state.type === 'string' ? state.type : null) ?? '',\n priorityLabel: typeof raw.priorityLabel === 'string' ? raw.priorityLabel : '',\n assignee: assignee && typeof assignee.name === 'string' ? assignee.name : null,\n creator: creator && typeof creator.name === 'string' ? creator.name : null,\n team: team && typeof team.name === 'string' ? team.name : null,\n labels,\n createdAt,\n updatedAt,\n };\n}\n\nfunction optionalObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n"],"mappings":"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"}