@happyvertical/smrt-projects 0.43.8 → 0.43.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +71 -3
- package/dist/services/service-evidence-service.d.ts.map +1 -1
- package/dist/services/subscription-commercial-resolver.d.ts +2 -3
- package/dist/services/subscription-commercial-resolver.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +47 -5
- package/package.json +17 -17
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/models/DevelopmentRequestHistory.ts","../src/collections/DevelopmentRequestHistories.ts","../src/models/DevelopmentRequest.ts","../src/collections/DevelopmentRequests.ts","../src/collections/Issues.ts","../src/models/ProjectIntegrationAudit.ts","../src/collections/ProjectIntegrationAudits.ts","../src/models/ProjectIntegration.ts","../src/collections/ProjectIntegrations.ts","../src/models/Project.ts","../src/collections/Projects.ts","../src/collections/PullRequests.ts","../src/models/Repository.ts","../src/collections/Repositories.ts","../src/models/delivery-control-plane.ts","../src/services/delivery-service.ts","../src/services/project-board-service.ts","../src/managed-client.ts","../src/migrations/moneyMinorUnits.ts","../src/models/Comment.ts","../src/models/Label.ts","../src/models/service-evidence.ts","../src/services/assistance-request-service.ts","../src/services/development-request-service.ts","../src/services/service-evidence-service.ts","../src/services/subscription-commercial-resolver.ts"],"sourcesContent":["/**\n * Self-registers this package's build-time manifest before any @smrt() decorator\n * in the package fires. Fixes issue #1132: in consumer runtimes (tsx, SvelteKit\n * SSR, plain `vite dev`) the decorator's synchronous manifest lookup previously\n * missed because no step populated the global manifest cache — classes got\n * registered with zero fields and `save()` / `toJSON()` silently dropped every\n * declared property.\n *\n * Import this module as the first statement in `src/index.ts` so its top-level\n * side effect runs ahead of any class module's @smrt() decorator.\n *\n * Silent no-op in dev/test, where the vitest plugin already populates manifests\n * via a different path. Only needs to succeed in the published dist output.\n *\n * @see https://github.com/happyvertical/smrt/issues/1132\n */\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\n// During library builds, smrtPlugin replaces this entire module with generated\n// code that embeds the scanned manifest inline (#1506/#1507) — published dists\n// never resolve this URL, so downstream bundlers cannot break registration by\n// relocating the compiled module away from dist/manifest.json. The runtime\n// lookup below is the fallback for source-mode runs without that transform.\nObjectRegistry.registerPackageManifest(\n new URL('./manifest.json', import.meta.url),\n);\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { DevelopmentRequestStatus } from '../types';\n\nexport interface DevelopmentRequestHistoryOptions extends SmrtObjectOptions {\n tenantId?: string;\n requestId?: string;\n fromStatus?: string;\n toStatus?: DevelopmentRequestStatus;\n actorType?: 'integration' | 'participant' | 'system';\n actorId?: string;\n note?: string | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_request_histories',\n api: false,\n mcp: false,\n cli: false,\n})\nexport class DevelopmentRequestHistory extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n @foreignKey('DevelopmentRequest', { required: true })\n requestId: string = '';\n\n fromStatus: string = '';\n\n toStatus: DevelopmentRequestStatus = 'submitted';\n\n actorType: 'integration' | 'participant' | 'system' = 'system';\n\n actorId: string = '';\n\n note: string | null = null;\n\n constructor(options: DevelopmentRequestHistoryOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.fromStatus !== undefined) this.fromStatus = options.fromStatus;\n if (options.toStatus !== undefined) this.toStatus = options.toStatus;\n if (options.actorType !== undefined) this.actorType = options.actorType;\n if (options.actorId !== undefined) this.actorId = options.actorId;\n if (options.note !== undefined) this.note = options.note;\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestHistory } from '../models/DevelopmentRequestHistory';\n\nexport class DevelopmentRequestHistoryCollection extends SmrtCollection<DevelopmentRequestHistory> {\n static readonly _itemClass = DevelopmentRequestHistory;\n\n async listForRequest(\n tenantId: string,\n requestId: string,\n ): Promise<DevelopmentRequestHistory[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, requestId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n}\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n DevelopmentRequestEvidence,\n DevelopmentRequestOrigin,\n DevelopmentRequestStatus,\n DevelopmentRequestType,\n DevelopmentRequestVisibility,\n} from '../types';\n\nexport interface DevelopmentRequestOptions extends SmrtObjectOptions {\n tenantId?: string;\n projectId?: string;\n integrationId?: string;\n requesterId?: string;\n participantId?: string;\n type?: DevelopmentRequestType;\n description?: string;\n evidence?: DevelopmentRequestEvidence[] | string;\n visibility?: DevelopmentRequestVisibility;\n origin?: DevelopmentRequestOrigin;\n discussion?: string;\n status?: DevelopmentRequestStatus;\n}\n\nfunction parseEvidence(raw: unknown): DevelopmentRequestEvidence[] {\n if (!raw) return [];\n if (Array.isArray(raw)) return normalizeEvidence(raw);\n if (typeof raw !== 'string') return [];\n\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? normalizeEvidence(parsed) : [];\n } catch {\n return [];\n }\n}\n\nfunction normalizeEvidence(raw: unknown[]): DevelopmentRequestEvidence[] {\n return raw\n .filter(\n (entry): entry is Record<string, unknown> =>\n !!entry && typeof entry === 'object' && !Array.isArray(entry),\n )\n .map((entry) => ({\n url: typeof entry.url === 'string' ? entry.url.trim() : '',\n ...(typeof entry.label === 'string' && entry.label.trim().length > 0\n ? { label: entry.label.trim() }\n : {}),\n }))\n .filter((entry) => entry.url.length > 0);\n}\n\nfunction stringifyEvidence(items: DevelopmentRequestEvidence[]): string {\n return JSON.stringify(\n items.map((item) => ({\n url: item.url.trim(),\n ...(item.label?.trim() ? { label: item.label.trim() } : {}),\n })),\n );\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_requests',\n // Managed requests must flow through ManagedProjectClient so capability,\n // integration, project, and requester scoping cannot be bypassed.\n api: false,\n mcp: false,\n cli: false,\n})\nexport class DevelopmentRequest extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n projectId: string = '';\n\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n\n requesterId: string = '';\n\n participantId: string = '';\n\n type: DevelopmentRequestType = 'feature';\n\n description: string = '';\n\n evidence: string = '[]';\n\n visibility: DevelopmentRequestVisibility = 'requester';\n\n origin: DevelopmentRequestOrigin = 'managed-app';\n\n discussion: string = '';\n\n status: DevelopmentRequestStatus = 'submitted';\n\n constructor(options: DevelopmentRequestOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.integrationId !== undefined)\n this.integrationId = options.integrationId;\n if (options.requesterId !== undefined)\n this.requesterId = options.requesterId;\n if (options.participantId !== undefined)\n this.participantId = options.participantId;\n if (options.type !== undefined) this.type = options.type;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.evidence !== undefined) this.setEvidence(options.evidence);\n if (options.visibility !== undefined) this.visibility = options.visibility;\n if (options.origin !== undefined) this.origin = options.origin;\n if (options.discussion !== undefined) this.discussion = options.discussion;\n if (options.status !== undefined) this.status = options.status;\n }\n\n public override async initialize(): Promise<this> {\n await super.initialize();\n if ((this as unknown as { evidence?: unknown }).evidence == null) {\n this.evidence = '[]';\n } else if (typeof this.evidence !== 'string') {\n this.setEvidence(\n this.evidence as unknown as DevelopmentRequestEvidence[],\n );\n }\n return this;\n }\n\n getEvidence(): DevelopmentRequestEvidence[] {\n return parseEvidence(this.evidence);\n }\n\n setEvidence(value: DevelopmentRequestEvidence[] | string): void {\n this.evidence =\n typeof value === 'string' ? value : stringifyEvidence(value);\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequest } from '../models/DevelopmentRequest';\nimport type {\n DevelopmentRequestStatus,\n DevelopmentRequestTransitionInput,\n ManagedDevelopmentRequestCreateInput,\n} from '../types';\nimport { DevelopmentRequestHistoryCollection } from './DevelopmentRequestHistories';\n\nexport class DevelopmentRequestCollection extends SmrtCollection<DevelopmentRequest> {\n static readonly _itemClass = DevelopmentRequest;\n\n async createManaged(\n input: {\n tenantId: string;\n projectId: string;\n integrationId: string;\n } & ManagedDevelopmentRequestCreateInput,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId: input.tenantId }, () =>\n this.create({\n tenantId: input.tenantId,\n projectId: input.projectId,\n integrationId: input.integrationId,\n requesterId: input.requesterId,\n participantId: input.participantId ?? '',\n type: input.type,\n description: input.description,\n evidence: JSON.stringify(input.evidence ?? []),\n visibility: input.visibility ?? 'requester',\n origin: input.origin ?? 'managed-app',\n discussion: input.discussion ?? '',\n status: 'submitted',\n }),\n );\n await withTenant({ tenantId: input.tenantId }, () => request.save());\n await this.recordHistory(request, {\n status: 'submitted',\n actorType: 'integration',\n actorId: input.integrationId,\n note: input.discussion ?? '',\n });\n return request;\n }\n\n async listByIntegrationRequester(input: {\n tenantId: string;\n integrationId: string;\n requesterId: string;\n }): Promise<DevelopmentRequest[]> {\n return withTenant({ tenantId: input.tenantId }, () =>\n this.list({\n where: {\n tenantId: input.tenantId,\n integrationId: input.integrationId,\n requesterId: input.requesterId,\n },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n async transitionStatus(\n tenantId: string,\n requestId: string,\n transition: DevelopmentRequestTransitionInput,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: requestId, tenantId } }),\n );\n if (!request) {\n throw new Error(`DevelopmentRequest ${requestId} not found`);\n }\n const fromStatus = request.status;\n request.status = transition.status;\n await withTenant({ tenantId: request.tenantId }, () => request.save());\n await this.recordHistory(request, transition, fromStatus);\n return request;\n }\n\n async listForProject(\n tenantId: string,\n projectId: string,\n status?: DevelopmentRequestStatus,\n ): Promise<DevelopmentRequest[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: status\n ? { tenantId, projectId, status }\n : { tenantId, projectId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n private async recordHistory(\n request: DevelopmentRequest,\n transition: DevelopmentRequestTransitionInput,\n fromStatus = '',\n ): Promise<void> {\n const histories = await DevelopmentRequestHistoryCollection.create(\n this.options,\n );\n const entry = await withTenant({ tenantId: request.tenantId }, () =>\n histories.create({\n tenantId: request.tenantId,\n requestId: request.id as string,\n fromStatus,\n toStatus: transition.status,\n actorType: transition.actorType,\n actorId: transition.actorId ?? '',\n note: transition.note ?? '',\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => entry.save());\n }\n}\n","/**\n * IssueCollection - Collection manager for Issue objects\n *\n * Provides querying and discovery operations for Issue entities.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Issue } from '../models/Issue';\nimport type { Repository } from '../models/Repository';\nimport type { SearchFilters } from '../types';\n\nexport class IssueCollection extends SmrtCollection<Issue> {\n static readonly _itemClass = Issue;\n\n /**\n * Discover issues from a repository and sync to database\n *\n * This method:\n * 1. Fetches issues from the provider via SDK\n * 2. Creates/updates SMRT Issue records in the database\n * 3. Returns the synced Issue objects\n *\n * @param options - Discovery options\n * @returns Array of Issue objects\n */\n async discover(options: {\n repository: Repository;\n filters?: SearchFilters;\n }): Promise<Issue[]> {\n const { repository, filters } = options;\n const repositoryId = repository.id ?? undefined;\n\n if (!repositoryId) {\n throw new Error('Repository must be saved before discovering issues');\n }\n\n const repoClient = await repository.getClient();\n\n // Fetch issues from provider\n const remoteIssues = await repoClient.searchIssues('', filters);\n\n const issues: Issue[] = [];\n\n for (const remote of remoteIssues) {\n // Find existing issue by repository + number\n let issue = await this.findOne({\n where: {\n repositoryId,\n number: remote.number,\n },\n });\n\n if (!issue) {\n // Create new issue\n issue = await this.create({\n repositoryId,\n number: remote.number,\n nodeId: remote.id,\n title: remote.title,\n body: remote.body,\n state: remote.state,\n author: remote.author.login,\n labels: remote.labels.map((l) => l.name),\n assignees: remote.assignees.map((a) => a.login),\n commentsCount: remote.commentsCount,\n lastSyncedAt: new Date(),\n });\n } else {\n // Update existing issue\n issue.nodeId = remote.id;\n issue.title = remote.title;\n issue.body = remote.body;\n issue.state = remote.state;\n issue.author = remote.author.login;\n issue.labels = remote.labels.map((l) => l.name);\n issue.assignees = remote.assignees.map((a) => a.login);\n issue.commentsCount = remote.commentsCount;\n issue.lastSyncedAt = new Date();\n }\n\n await issue.save();\n issues.push(issue);\n }\n\n return issues;\n }\n\n /**\n * Find issues by repository\n *\n * @param repositoryId - Repository ID\n * @returns Array of issues\n */\n async findByRepository(repositoryId: string): Promise<Issue[]> {\n return await this.list({\n where: { repositoryId },\n });\n }\n\n /**\n * Find open issues\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of open issues\n */\n async findOpen(repositoryId?: string): Promise<Issue[]> {\n const where: Record<string, unknown> = { state: 'open' };\n if (repositoryId) {\n where.repositoryId = repositoryId;\n }\n return await this.list({ where });\n }\n\n /**\n * Find issues by label\n *\n * @param label - Label name\n * @param repositoryId - Optional repository filter\n * @returns Array of issues with the label\n */\n async findByLabel(label: string, repositoryId?: string): Promise<Issue[]> {\n const issues = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n // Filter by label (JSON array search)\n return issues.filter((issue) => issue.labels.includes(label));\n }\n\n /**\n * Find issues by assignee\n *\n * @param assignee - Assignee login\n * @param repositoryId - Optional repository filter\n * @returns Array of issues assigned to the user\n */\n async findByAssignee(\n assignee: string,\n repositoryId?: string,\n ): Promise<Issue[]> {\n const issues = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n // Filter by assignee (JSON array search)\n return issues.filter((issue) => issue.assignees.includes(assignee));\n }\n\n /**\n * Find issues needing review (AI-powered)\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of issues that need review\n */\n async findNeedingReview(repositoryId?: string): Promise<Issue[]> {\n const openIssues = await this.findOpen(repositoryId);\n const needingReview: Issue[] = [];\n\n for (const issue of openIssues) {\n if (await issue.needsReview()) {\n needingReview.push(issue);\n }\n }\n\n return needingReview;\n }\n\n /**\n * Find issue by number in a repository\n *\n * @param repositoryId - Repository ID\n * @param number - Issue number\n * @returns Issue or null\n */\n async findByNumber(\n repositoryId: string,\n number: number,\n ): Promise<Issue | null> {\n const results = await this.list({\n where: { repositoryId, number },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Get issues with unincorporated feedback\n *\n * Issues that have comments but haven't had feedback incorporated\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of issues\n */\n async findWithUnincorporatedFeedback(\n repositoryId?: string,\n ): Promise<Issue[]> {\n const issues = await this.findOpen(repositoryId);\n\n return issues.filter(\n (issue) => issue.commentsCount > 0 && issue.synthesisCount === 0,\n );\n }\n\n /**\n * Batch sync issues from repository\n *\n * @param repository - Repository to sync from\n * @param options - Sync options\n * @returns Array of synced issues\n */\n async batchSync(\n repository: Repository,\n options: { force?: boolean } = {},\n ): Promise<Issue[]> {\n const issues = await this.findByRepository(repository.id as string);\n const synced: Issue[] = [];\n\n for (const issue of issues) {\n await issue.sync(options);\n synced.push(issue);\n }\n\n return synced;\n }\n\n /**\n * Find issues by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of issues for the tenant\n */\n async findByTenant(tenantId: string): Promise<Issue[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global issues (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global issues\n */\n async findGlobal(): Promise<Issue[]> {\n return queryGlobal<Issue>(this);\n }\n\n /**\n * Find issues for a tenant plus all global issues.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global issues\n */\n async findWithGlobals(tenantId: string): Promise<Issue[]> {\n return queryWithGlobals<Issue>(this, tenantId, 'Issue.findWithGlobals');\n }\n}\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { ProjectIntegrationAuditAction } from '../types';\n\nexport interface ProjectIntegrationAuditOptions extends SmrtObjectOptions {\n tenantId?: string;\n integrationId?: string;\n action?: ProjectIntegrationAuditAction;\n note?: string | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_integration_audits',\n api: false,\n mcp: false,\n cli: false,\n})\nexport class ProjectIntegrationAudit extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n\n action: ProjectIntegrationAuditAction = 'created';\n\n note: string | null = null;\n\n constructor(options: ProjectIntegrationAuditOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.integrationId !== undefined)\n this.integrationId = options.integrationId;\n if (options.action !== undefined) this.action = options.action;\n if (options.note !== undefined) this.note = options.note;\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegrationAudit } from '../models/ProjectIntegrationAudit';\n\nexport class ProjectIntegrationAuditCollection extends SmrtCollection<ProjectIntegrationAudit> {\n static readonly _itemClass = ProjectIntegrationAudit;\n\n async listForIntegration(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegrationAudit[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, integrationId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n}\n","import {\n field,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ProjectIntegrationCapability,\n ProjectIntegrationStatus,\n} from '../types';\n\nexport interface ProjectIntegrationOptions extends SmrtObjectOptions {\n tenantId?: string;\n projectId?: string;\n name?: string;\n credentialHash?: string;\n capabilities?: ProjectIntegrationCapability[];\n status?: ProjectIntegrationStatus;\n revokedAt?: Date | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_integrations',\n conflictColumns: ['tenant_id', 'project_id', 'name'],\n api: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n})\nexport class ProjectIntegration extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n projectId: string = '';\n\n name: string = '';\n\n @field({ sensitive: true })\n credentialHash: string = '';\n\n capabilities: ProjectIntegrationCapability[] = [];\n\n status: ProjectIntegrationStatus = 'active';\n\n revokedAt: Date | null = null;\n\n constructor(options: ProjectIntegrationOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.name !== undefined) this.name = options.name;\n if (options.credentialHash !== undefined)\n this.credentialHash = options.credentialHash;\n if (options.capabilities !== undefined)\n this.capabilities = [...options.capabilities];\n if (options.status !== undefined) this.status = options.status;\n if (options.revokedAt !== undefined) this.revokedAt = options.revokedAt;\n }\n\n hasCapability(capability: ProjectIntegrationCapability): boolean {\n return this.capabilities.includes(capability);\n }\n\n isActive(): boolean {\n return this.status === 'active' && this.revokedAt === null;\n }\n}\n","import { createHash, randomBytes } from 'node:crypto';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegration } from '../models/ProjectIntegration';\nimport type { ProjectIntegrationCapability } from '../types';\nimport { ProjectIntegrationAuditCollection } from './ProjectIntegrationAudits';\n\nexport class ProjectIntegrationCollection extends SmrtCollection<ProjectIntegration> {\n static readonly _itemClass = ProjectIntegration;\n\n async provision(input: {\n tenantId: string;\n projectId: string;\n name: string;\n capabilities: ProjectIntegrationCapability[];\n }): Promise<{ integration: ProjectIntegration; credential: string }> {\n const credential = issueProjectIntegrationCredential(input.tenantId);\n const integration = await withTenant({ tenantId: input.tenantId }, () =>\n this.create({\n tenantId: input.tenantId,\n projectId: input.projectId,\n name: input.name,\n capabilities: [...input.capabilities],\n credentialHash: hashProjectIntegrationCredential(credential),\n status: 'active',\n revokedAt: null,\n }),\n );\n await withTenant({ tenantId: input.tenantId }, () => integration.save());\n await this.recordAudit(integration, 'created');\n return { integration, credential };\n }\n\n async rotate(\n tenantId: string,\n integrationId: string,\n ): Promise<{ integration: ProjectIntegration; credential: string }> {\n const integration = await this.requireActive(tenantId, integrationId);\n const credential = issueProjectIntegrationCredential(integration.tenantId);\n integration.credentialHash = hashProjectIntegrationCredential(credential);\n await withTenant({ tenantId: integration.tenantId }, () =>\n integration.save(),\n );\n await this.recordAudit(integration, 'rotated');\n return { integration, credential };\n }\n\n async revoke(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await this.requireExisting(tenantId, integrationId);\n integration.status = 'revoked';\n integration.revokedAt = new Date();\n integration.credentialHash = '';\n await withTenant({ tenantId: integration.tenantId }, () =>\n integration.save(),\n );\n await this.recordAudit(integration, 'revoked');\n return integration;\n }\n\n async authenticate(credential: string): Promise<ProjectIntegration | null> {\n const tenantId = parseCredentialTenant(credential);\n if (!tenantId) return null;\n const credentialHash = hashProjectIntegrationCredential(credential);\n const integrations = await withTenant({ tenantId }, () =>\n this.list({ where: { tenantId, status: 'active' } }),\n );\n const integration = integrations.find(\n (candidate) => candidate.credentialHash === credentialHash,\n );\n return integration?.isActive() ? integration : null;\n }\n\n async listForProject(\n tenantId: string,\n projectId: string,\n ): Promise<ProjectIntegration[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, projectId },\n orderBy: 'name ASC',\n }),\n );\n }\n\n async findActive(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration | null> {\n const integration = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: integrationId, tenantId } }),\n );\n return integration?.isActive() ? integration : null;\n }\n\n private async requireExisting(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: integrationId, tenantId } }),\n );\n if (!integration) {\n throw new Error(`ProjectIntegration ${integrationId} not found`);\n }\n return integration;\n }\n\n private async requireActive(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await this.requireExisting(tenantId, integrationId);\n if (!integration.isActive()) {\n throw new Error(`ProjectIntegration ${integrationId} is not active`);\n }\n return integration;\n }\n\n private async recordAudit(\n integration: ProjectIntegration,\n action: 'created' | 'rotated' | 'revoked',\n ): Promise<void> {\n const audits = await ProjectIntegrationAuditCollection.create(this.options);\n const entry = await withTenant({ tenantId: integration.tenantId }, () =>\n audits.create({\n tenantId: integration.tenantId,\n integrationId: integration.id as string,\n action,\n }),\n );\n await withTenant({ tenantId: integration.tenantId }, () => entry.save());\n }\n}\n\nexport function hashProjectIntegrationCredential(credential: string): string {\n return createHash('sha256').update(credential).digest('hex');\n}\n\nfunction issueProjectIntegrationCredential(tenantId: string): string {\n const tenant = Buffer.from(tenantId, 'utf8').toString('base64url');\n return `smrt_pi_${tenant}_${randomBytes(24).toString('hex')}`;\n}\n\nfunction parseCredentialTenant(credential: string): string | null {\n const match = /^smrt_pi_([A-Za-z0-9_-]+)_[a-f0-9]{48}$/.exec(credential);\n if (!match) return null;\n try {\n const tenantId = Buffer.from(match[1], 'base64url').toString('utf8');\n return tenantId.length > 0 ? tenantId : null;\n } catch {\n return null;\n }\n}\n","/**\n * Project model - SMRT wrapper for project board operations\n *\n * Provides persistent project tracking with provider-agnostic operations.\n * Uses @happyvertical/projects SDK for actual API calls.\n */\n\nimport { getProject } from '@happyvertical/projects';\nimport { getModuleConfig } from '@happyvertical/smrt-config';\nimport {\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { SYNC_THROTTLE_MS } from '../constants';\nimport type {\n IProject,\n ItemFilters,\n ProjectField,\n ProjectItem,\n ProjectProviderType,\n ProjectStatus,\n SDKProject,\n SyncOptions,\n} from '../types';\nimport type { Issue } from './Issue';\nimport type { PullRequest } from './PullRequest';\n\nexport interface ProjectOptions extends SmrtObjectOptions {\n projectId?: string;\n projectNumber?: number;\n title?: string;\n description?: string;\n owner?: string;\n url?: string;\n providerType?: ProjectProviderType;\n tokenConfigKey?: string;\n statuses?: ProjectStatus[];\n fields?: ProjectField[];\n statusFieldId?: string;\n statusOptions?: Record<string, string>;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get', 'create', 'update'] },\n mcp: { include: ['list', 'get', 'sync', 'addItem', 'updateItemStatus'] },\n // sync/addItem/updateItemStatus/listItems are operator commands invoked\n // in-process via the CLI; they intentionally aren't exposed over HTTP today.\n cli: {\n include: [\n 'list',\n 'get',\n 'sync',\n 'addItem',\n 'updateItemStatus',\n 'listItems',\n ],\n skipApiCheck: true,\n },\n})\nexport class Project extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Provider-specific project ID (e.g., GitHub GraphQL node ID)\n */\n projectId: string = '';\n\n /**\n * Human-readable project number\n */\n projectNumber: number = 0;\n\n /**\n * Project title\n */\n title: string = '';\n\n /**\n * Project description\n */\n description: string = '';\n\n /**\n * Project owner (organization or user)\n */\n owner: string = '';\n\n /**\n * Project URL\n */\n url: string = '';\n\n /**\n * Project provider type\n */\n providerType: ProjectProviderType = 'github';\n\n /**\n * Environment variable name or config key for token resolution\n */\n tokenConfigKey: string = 'GITHUB_TOKEN';\n\n /**\n * Available statuses (columns) in the project\n */\n statuses: ProjectStatus[] = [];\n\n /**\n * Custom fields defined in the project\n */\n fields: ProjectField[] = [];\n\n /**\n * Status field ID for GitHub Projects V2\n */\n statusFieldId: string = '';\n\n /**\n * Maps status name to option ID (for GitHub Projects V2)\n */\n statusOptions: Record<string, string> = {};\n\n /**\n * Last sync timestamp\n */\n lastSyncedAt: Date | null = null;\n\n /**\n * Transient: Cached project client (not persisted)\n */\n private _client?: IProject;\n\n constructor(options: ProjectOptions = {}) {\n super(options);\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.projectNumber !== undefined)\n this.projectNumber = options.projectNumber;\n if (options.title !== undefined) this.title = options.title;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.owner !== undefined) this.owner = options.owner;\n if (options.url !== undefined) this.url = options.url;\n if (options.providerType !== undefined)\n this.providerType = options.providerType;\n if (options.tokenConfigKey !== undefined)\n this.tokenConfigKey = options.tokenConfigKey;\n if (options.statuses !== undefined) this.statuses = options.statuses;\n if (options.fields !== undefined) this.fields = options.fields;\n if (options.statusFieldId !== undefined)\n this.statusFieldId = options.statusFieldId;\n if (options.statusOptions !== undefined)\n this.statusOptions = options.statusOptions;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Get the project client, resolving token from config\n *\n * @returns Project client for API operations\n * @throws Error if token cannot be resolved\n */\n async getClient(): Promise<IProject> {\n if (this._client) {\n return this._client;\n }\n\n // Resolve token from environment or config\n const token =\n process.env[this.tokenConfigKey] ||\n (getModuleConfig<Record<string, string>>('smrt-projects', {})[\n this.tokenConfigKey\n ] as string);\n\n if (!token) {\n throw new Error(\n `Token not found for key '${this.tokenConfigKey}'. ` +\n `Set the ${this.tokenConfigKey} environment variable or configure it in smrt.config.`,\n );\n }\n\n this._client = await getProject({\n type: this.providerType,\n projectId: this.projectId,\n token,\n statusFieldId: this.statusFieldId || undefined,\n statusOptions:\n Object.keys(this.statusOptions).length > 0\n ? this.statusOptions\n : undefined,\n });\n\n return this._client;\n }\n\n /**\n * Clear the cached client\n */\n clearClient(): void {\n this._client = undefined;\n }\n\n /**\n * Sync project metadata from the provider\n *\n * @param options - Sync options\n * @returns This project with updated fields\n */\n async sync(options: SyncOptions = {}): Promise<this> {\n // Check if we recently synced (within 5 minutes)\n if (\n !options.force &&\n this.lastSyncedAt &&\n Date.now() - this.lastSyncedAt.getTime() < SYNC_THROTTLE_MS\n ) {\n return this;\n }\n\n const client = await this.getClient();\n const projectData: SDKProject = await client.getProject();\n\n // Update fields from remote\n this.title = projectData.title;\n this.description = projectData.description || '';\n this.owner = projectData.owner;\n this.url = projectData.url;\n this.statuses = projectData.statuses;\n this.fields = projectData.fields;\n this.lastSyncedAt = new Date();\n\n await this.save();\n return this;\n }\n\n /**\n * Add an issue or PR to this project\n *\n * @param item - Issue or PullRequest to add\n * @returns Created ProjectItem\n */\n async addItem(item: Issue | PullRequest): Promise<ProjectItem> {\n if (!item.nodeId) {\n throw new Error('Item must have a nodeId (sync the item first)');\n }\n\n const client = await this.getClient();\n return await client.addItem(item.nodeId);\n }\n\n /**\n * Remove an item from this project\n *\n * @param itemId - Project item ID to remove\n */\n async removeItem(itemId: string): Promise<void> {\n const client = await this.getClient();\n await client.removeItem(itemId);\n }\n\n /**\n * Get a specific item from the project\n *\n * @param itemId - Project item ID\n * @returns ProjectItem or null\n */\n async getItem(itemId: string): Promise<ProjectItem | null> {\n const client = await this.getClient();\n return await client.getItem(itemId);\n }\n\n /**\n * List items in this project\n *\n * @param filters - Optional filters\n * @returns Array of ProjectItems\n */\n async listItems(filters?: ItemFilters): Promise<ProjectItem[]> {\n const client = await this.getClient();\n return await client.listItems(filters);\n }\n\n /**\n * Update an item's status (column)\n *\n * @param itemId - Project item ID\n * @param status - New status name\n */\n async updateItemStatus(itemId: string, status: string): Promise<void> {\n const client = await this.getClient();\n await client.updateItemStatus(itemId, status);\n }\n\n /**\n * Update an item's custom field\n *\n * @param itemId - Project item ID\n * @param fieldId - Field ID\n * @param value - New value\n */\n async updateItemField(\n itemId: string,\n fieldId: string,\n value: unknown,\n ): Promise<void> {\n const client = await this.getClient();\n await client.updateItemField(itemId, fieldId, value);\n }\n\n /**\n * Get available statuses\n *\n * @returns Array of status definitions\n */\n async getStatuses(): Promise<ProjectStatus[]> {\n if (this.statuses.length > 0) {\n return this.statuses;\n }\n\n const client = await this.getClient();\n this.statuses = await client.listStatuses();\n await this.save();\n return this.statuses;\n }\n\n /**\n * Get available fields\n *\n * @returns Array of field definitions\n */\n async getFields(): Promise<ProjectField[]> {\n if (this.fields.length > 0) {\n return this.fields;\n }\n\n const client = await this.getClient();\n this.fields = await client.listFields();\n await this.save();\n return this.fields;\n }\n\n /**\n * Get items in a specific status/column\n *\n * @param status - Status name\n * @returns Array of ProjectItems in that status\n */\n async getItemsByStatus(status: string): Promise<ProjectItem[]> {\n return await this.listItems({ status });\n }\n\n /**\n * Move an item to a new status\n *\n * @param item - Issue or PullRequest\n * @param status - Target status name\n */\n async moveItem(item: Issue | PullRequest, status: string): Promise<void> {\n // First, find the item in the project\n const items = await this.listItems();\n const projectItem = items.find((i) => i.contentId === item.nodeId);\n\n if (!projectItem) {\n throw new Error('Item not found in project');\n }\n\n await this.updateItemStatus(projectItem.id, status);\n }\n\n /**\n * AI-powered: Analyze project health and suggest improvements\n *\n * @returns Analysis of project status\n */\n async analyzeHealth(): Promise<string> {\n const items = await this.listItems();\n const statuses = await this.getStatuses();\n\n // Count items by status\n const statusCounts: Record<string, number> = {};\n for (const status of statuses) {\n statusCounts[status.name] = items.filter(\n (i) => i.status === status.name,\n ).length;\n }\n\n return await this.do(\n `Analyze the health of this project board and suggest improvements.\n\n Project: ${this.title}\n Description: ${this.description}\n\n Item distribution by status:\n ${Object.entries(statusCounts)\n .map(([status, count]) => `- ${status}: ${count} items`)\n .join('\\n')}\n\n Total items: ${items.length}\n\n Provide:\n 1. Overall health assessment\n 2. Potential bottlenecks\n 3. Suggestions for improvement`,\n // Title/description/status counts hand-rolled above; skip do()'s\n // object-data injection so the board context is not duplicated.\n { includeData: false },\n );\n }\n\n /**\n * Get project by title\n *\n * @param title - Project title\n * @param options - Additional options\n * @returns Project or null\n */\n static async getByTitle(\n title: string,\n options: SmrtObjectOptions = {},\n ): Promise<Project | null> {\n const { ProjectCollection } = await import('../collections/Projects');\n const collection = await ProjectCollection.create(options);\n return await collection.findByTitle(title);\n }\n}\n","/**\n * ProjectCollection - Collection manager for Project objects\n *\n * Provides querying and discovery operations for Project entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Project } from '../models/Project';\nimport type { ProjectProviderType } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class ProjectCollection extends SmrtCollection<Project> {\n static readonly _itemClass = Project;\n\n /**\n * Find project by title\n *\n * @param title - Project title\n * @returns Project or null\n */\n async findByTitle(title: string): Promise<Project | null> {\n const results = await this.list({\n where: { title },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find projects by owner\n *\n * @param owner - Project owner (organization or user)\n * @returns Array of projects\n */\n async findByOwner(owner: string): Promise<Project[]> {\n return await this.list({\n where: { owner },\n });\n }\n\n /**\n * Find projects by provider type\n *\n * @param providerType - Provider type\n * @returns Array of projects\n */\n async findByProvider(providerType: ProjectProviderType): Promise<Project[]> {\n return await this.list({\n where: { providerType },\n });\n }\n\n /**\n * Get or create a project by ID\n *\n * @param projectId - Provider-specific project ID\n * @param options - Additional options for creation\n * @returns Project (existing or newly created)\n */\n async getOrCreate(\n projectId: string,\n options: {\n title?: string;\n owner?: string;\n providerType?: ProjectProviderType;\n tokenConfigKey?: string;\n statusFieldId?: string;\n statusOptions?: Record<string, string>;\n } = {},\n ): Promise<Project> {\n let project = await this.findOne({\n where: { projectId },\n });\n\n if (!project) {\n project = await this.create({\n projectId,\n title: options.title || '',\n owner: options.owner || '',\n providerType: options.providerType || 'github',\n tokenConfigKey: options.tokenConfigKey || 'GITHUB_TOKEN',\n statusFieldId: options.statusFieldId || '',\n statusOptions: options.statusOptions || {},\n });\n await project.save();\n\n // Sync to get full project data\n await project.sync({ force: true });\n }\n\n return project;\n }\n\n /**\n * Sync all projects\n *\n * @param options - Sync options\n * @returns Array of synced projects\n */\n async syncAll(options: { force?: boolean } = {}): Promise<Project[]> {\n const projects = await this.list({});\n const synced: Project[] = [];\n\n for (const project of projects) {\n await project.sync(options);\n synced.push(project);\n }\n\n return synced;\n }\n\n /**\n * Find projects with items in a specific status\n *\n * @param status - Status name\n * @returns Array of projects\n */\n async findWithItemsInStatus(status: string): Promise<Project[]> {\n const projects = await this.list({});\n const matching: Project[] = [];\n\n for (const project of projects) {\n try {\n const items = await project.getItemsByStatus(status);\n if (items.length > 0) {\n matching.push(project);\n }\n } catch (error) {\n // Log error and skip projects we can't access\n logger.warn(`Error accessing items for project ${project.projectId}`, {\n error: error instanceof Error ? error.message : error,\n });\n }\n }\n\n return matching;\n }\n\n /**\n * Get project statistics\n *\n * @param projectId - Project ID\n * @returns Statistics object\n */\n async getStatistics(projectId: string): Promise<{\n totalItems: number;\n itemsByStatus: Record<string, number>;\n itemsByType: Record<string, number>;\n }> {\n const project = await this.findOne({ where: { projectId } });\n if (!project) {\n throw new Error(`Project ${projectId} not found`);\n }\n\n const items = await project.listItems();\n const statuses = await project.getStatuses();\n\n const itemsByStatus: Record<string, number> = {};\n for (const status of statuses) {\n itemsByStatus[status.name] = 0;\n }\n\n const itemsByType: Record<string, number> = {\n Issue: 0,\n PullRequest: 0,\n DraftIssue: 0,\n };\n\n for (const item of items) {\n if (item.status && itemsByStatus[item.status] !== undefined) {\n itemsByStatus[item.status]++;\n }\n if (itemsByType[item.type] !== undefined) {\n itemsByType[item.type]++;\n }\n }\n\n return {\n totalItems: items.length,\n itemsByStatus,\n itemsByType,\n };\n }\n\n /**\n * Find projects by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of projects for the tenant\n */\n async findByTenant(tenantId: string): Promise<Project[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global projects (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global projects\n */\n async findGlobal(): Promise<Project[]> {\n return queryGlobal<Project>(this);\n }\n\n /**\n * Find projects for a tenant plus all global projects.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global projects\n */\n async findWithGlobals(tenantId: string): Promise<Project[]> {\n return queryWithGlobals<Project>(this, tenantId, 'Project.findWithGlobals');\n }\n}\n","/**\n * PullRequestCollection - Collection manager for PullRequest objects\n *\n * Provides querying and discovery operations for PullRequest entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { PullRequest } from '../models/PullRequest';\nimport type { Repository } from '../models/Repository';\nimport type { SDKPullRequest, SearchFilters } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class PullRequestCollection extends SmrtCollection<PullRequest> {\n static readonly _itemClass = PullRequest;\n\n /**\n * Discover pull requests from a repository and sync to database\n *\n * @param options - Discovery options\n * @returns Array of PullRequest objects\n */\n async discover(options: {\n repository: Repository;\n filters?: SearchFilters;\n }): Promise<PullRequest[]> {\n const { repository, filters } = options;\n const repositoryId = repository.id ?? undefined;\n\n if (!repositoryId) {\n throw new Error(\n 'Repository must be saved before discovering pull requests',\n );\n }\n\n const repoClient = await repository.getClient();\n\n // Note: searchIssues with type filter would get PRs in GitHub\n // For now, we'll search for all and filter\n const remoteItems = await repoClient.searchIssues('is:pr', filters);\n\n const pullRequests: PullRequest[] = [];\n\n for (const remote of remoteItems) {\n // Get full PR data\n let prData: SDKPullRequest;\n try {\n prData = await repoClient.getPullRequest(remote.number);\n } catch (error) {\n // Log error and skip PR - could be rate limiting, auth, or access issues\n logger.warn(\n `Failed to fetch PR #${remote.number} from ${repository.owner}/${repository.name}`,\n { error: error instanceof Error ? error.message : error },\n );\n continue;\n }\n\n // Find existing PR by repository + number\n let pr = await this.findOne({\n where: {\n repositoryId,\n number: remote.number,\n },\n });\n\n if (!pr) {\n // Create new PR\n pr = await this.create({\n repositoryId,\n number: prData.number,\n nodeId: prData.id,\n title: prData.title,\n body: prData.body,\n state: prData.state,\n author: prData.author.login,\n labels: prData.labels.map((l) => l.name),\n assignees: prData.assignees.map((a) => a.login),\n commentsCount: prData.commentsCount,\n headRef: prData.headRef,\n baseRef: prData.baseRef,\n merged: prData.merged,\n mergedAt: prData.mergedAt || null,\n mergeable: prData.mergeable,\n draft: prData.draft,\n lastSyncedAt: new Date(),\n });\n } else {\n // Update existing PR\n pr.nodeId = prData.id;\n pr.title = prData.title;\n pr.body = prData.body;\n pr.state = prData.state;\n pr.author = prData.author.login;\n pr.labels = prData.labels.map((l) => l.name);\n pr.assignees = prData.assignees.map((a) => a.login);\n pr.commentsCount = prData.commentsCount;\n pr.headRef = prData.headRef;\n pr.baseRef = prData.baseRef;\n pr.merged = prData.merged;\n pr.mergedAt = prData.mergedAt || null;\n pr.mergeable = prData.mergeable;\n pr.draft = prData.draft;\n pr.lastSyncedAt = new Date();\n }\n\n await pr.save();\n pullRequests.push(pr);\n }\n\n return pullRequests;\n }\n\n /**\n * Find PRs by repository\n *\n * @param repositoryId - Repository ID\n * @returns Array of PRs\n */\n async findByRepository(repositoryId: string): Promise<PullRequest[]> {\n return await this.list({\n where: { repositoryId },\n });\n }\n\n /**\n * Find open PRs\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of open PRs\n */\n async findOpen(repositoryId?: string): Promise<PullRequest[]> {\n const where: Record<string, unknown> = { state: 'open' };\n if (repositoryId) {\n where.repositoryId = repositoryId;\n }\n return await this.list({ where });\n }\n\n /**\n * Find draft PRs\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of draft PRs\n */\n async findDrafts(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n return openPRs.filter((pr) => pr.draft);\n }\n\n /**\n * Find PRs ready to merge\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of mergeable PRs\n */\n async findReadyToMerge(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n return openPRs.filter((pr) => !pr.draft && pr.mergeable);\n }\n\n /**\n * Find PRs by branch\n *\n * @param branch - Branch name (head or base)\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs\n */\n async findByBranch(\n branch: string,\n repositoryId?: string,\n ): Promise<PullRequest[]> {\n const prs = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n return prs.filter((pr) => pr.headRef === branch || pr.baseRef === branch);\n }\n\n /**\n * Find PR by number in a repository\n *\n * @param repositoryId - Repository ID\n * @param number - PR number\n * @returns PullRequest or null\n */\n async findByNumber(\n repositoryId: string,\n number: number,\n ): Promise<PullRequest | null> {\n const results = await this.list({\n where: { repositoryId, number },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find PRs ready to merge (AI-powered)\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs that are ready\n */\n async findAIReadyToMerge(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n const ready: PullRequest[] = [];\n\n for (const pr of openPRs) {\n if (await pr.isReadyToMerge()) {\n ready.push(pr);\n }\n }\n\n return ready;\n }\n\n /**\n * Get PRs by change size\n *\n * @param size - Size classification\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs\n */\n async findBySize(\n size: 'xs' | 's' | 'm' | 'l' | 'xl',\n repositoryId?: string,\n ): Promise<PullRequest[]> {\n const prs = await this.findOpen(repositoryId);\n return prs.filter((pr) => pr.getChangeSize() === size);\n }\n\n /**\n * Batch sync PRs from repository\n *\n * @param repository - Repository to sync from\n * @param options - Sync options\n * @returns Array of synced PRs\n */\n async batchSync(\n repository: Repository,\n options: { force?: boolean } = {},\n ): Promise<PullRequest[]> {\n const prs = await this.findByRepository(repository.id as string);\n const synced: PullRequest[] = [];\n\n for (const pr of prs) {\n await pr.sync(options);\n synced.push(pr);\n }\n\n return synced;\n }\n\n /**\n * Find pull requests by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of pull requests for the tenant\n */\n async findByTenant(tenantId: string): Promise<PullRequest[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global pull requests (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global pull requests\n */\n async findGlobal(): Promise<PullRequest[]> {\n return queryGlobal<PullRequest>(this);\n }\n\n /**\n * Find pull requests for a tenant plus all global pull requests.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global pull requests\n */\n async findWithGlobals(tenantId: string): Promise<PullRequest[]> {\n return queryWithGlobals<PullRequest>(\n this,\n tenantId,\n 'PullRequest.findWithGlobals',\n );\n }\n}\n","/**\n * Repository model - SMRT wrapper for repository operations\n *\n * Provides persistent repository tracking with provider-agnostic operations.\n * Uses @happyvertical/repos SDK for actual API calls.\n */\n\nimport { getRepository } from '@happyvertical/repos';\nimport { getModuleConfig } from '@happyvertical/smrt-config';\nimport {\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { SYNC_THROTTLE_MS } from '../constants';\nimport type {\n CreateIssueInput,\n CreatePRInput,\n IRepository,\n RepositoryProviderType,\n SDKRepository,\n SearchFilters,\n SyncOptions,\n} from '../types';\nimport type { Issue } from './Issue';\nimport type { PullRequest } from './PullRequest';\n\nexport interface RepositoryOptions extends SmrtObjectOptions {\n owner?: string;\n name?: string;\n fullName?: string;\n description?: string;\n defaultBranch?: string;\n isPrivate?: boolean;\n providerType?: RepositoryProviderType;\n baseUrl?: string;\n tokenConfigKey?: string;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get', 'create', 'update'] },\n mcp: { include: ['list', 'get', 'sync'] },\n // sync is an operator command invoked in-process via the CLI;\n // it intentionally isn't exposed over HTTP today.\n cli: { include: ['list', 'get', 'sync', 'create'], skipApiCheck: true },\n})\nexport class Repository extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Repository owner (organization or user)\n */\n owner: string = '';\n\n /**\n * Repository name\n */\n name: string = '';\n\n /**\n * Full name in owner/repo format\n */\n fullName: string = '';\n\n /**\n * Repository description\n */\n description: string = '';\n\n /**\n * Default branch name\n */\n defaultBranch: string = 'main';\n\n /**\n * Whether repository is private\n */\n isPrivate: boolean = false;\n\n /**\n * Repository provider type\n */\n providerType: RepositoryProviderType = 'github';\n\n /**\n * Base URL for self-hosted instances (GitHub Enterprise, GitLab self-hosted, etc.)\n */\n baseUrl: string = '';\n\n /**\n * Environment variable name or config key for token resolution\n * The token is NOT stored - only the key name is persisted\n */\n tokenConfigKey: string = 'GITHUB_TOKEN';\n\n /**\n * Last sync timestamp\n */\n lastSyncedAt: Date | null = null;\n\n /**\n * Transient: Cached repository client (not persisted)\n */\n private _client?: IRepository;\n\n constructor(options: RepositoryOptions = {}) {\n super(options);\n if (options.owner !== undefined) this.owner = options.owner;\n if (options.name !== undefined) this.name = options.name;\n if (options.fullName !== undefined) this.fullName = options.fullName;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.defaultBranch !== undefined)\n this.defaultBranch = options.defaultBranch;\n if (options.isPrivate !== undefined) this.isPrivate = options.isPrivate;\n if (options.providerType !== undefined)\n this.providerType = options.providerType;\n if (options.baseUrl !== undefined) this.baseUrl = options.baseUrl;\n if (options.tokenConfigKey !== undefined)\n this.tokenConfigKey = options.tokenConfigKey;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Get the repository client, resolving token from config\n *\n * Token resolution order:\n * 1. Environment variable matching tokenConfigKey\n * 2. Module config value matching tokenConfigKey\n *\n * @returns Repository client for API operations\n * @throws Error if token cannot be resolved\n */\n async getClient(): Promise<IRepository> {\n if (this._client) {\n return this._client;\n }\n\n // Resolve token from environment or config\n const token =\n process.env[this.tokenConfigKey] ||\n (getModuleConfig<Record<string, string>>('smrt-projects', {})[\n this.tokenConfigKey\n ] as string);\n\n if (!token) {\n throw new Error(\n `Token not found for key '${this.tokenConfigKey}'. ` +\n `Set the ${this.tokenConfigKey} environment variable or configure it in smrt.config.`,\n );\n }\n\n this._client = await getRepository({\n type: this.providerType,\n owner: this.owner,\n repo: this.name,\n token,\n baseUrl: this.baseUrl || undefined,\n });\n\n return this._client;\n }\n\n /**\n * Clear the cached client (useful after token refresh)\n */\n clearClient(): void {\n this._client = undefined;\n }\n\n /**\n * Sync repository metadata from the provider\n *\n * @param options - Sync options\n * @returns This repository with updated fields\n */\n async sync(options: SyncOptions = {}): Promise<this> {\n // Check if we recently synced (within 5 minutes)\n if (\n !options.force &&\n this.lastSyncedAt &&\n Date.now() - this.lastSyncedAt.getTime() < SYNC_THROTTLE_MS\n ) {\n return this;\n }\n\n const client = await this.getClient();\n const repoData: SDKRepository = await client.getRepository();\n\n // Update fields from remote\n this.owner = repoData.owner;\n this.name = repoData.name;\n this.fullName = `${repoData.owner}/${repoData.name}`;\n this.description = repoData.description;\n this.defaultBranch = repoData.defaultBranch;\n this.isPrivate = repoData.isPrivate;\n this.lastSyncedAt = new Date();\n\n await this.save();\n return this;\n }\n\n /**\n * Get issues from this repository\n *\n * @param filters - Optional search filters\n * @returns Array of Issue objects (SMRT models)\n */\n async getIssues(filters?: SearchFilters): Promise<Issue[]> {\n const { IssueCollection } = await import('../collections/Issues');\n const collection = await IssueCollection.create(this.options);\n return await collection.discover({ repository: this, filters });\n }\n\n /**\n * Get pull requests from this repository\n *\n * @param filters - Optional search filters\n * @returns Array of PullRequest objects (SMRT models)\n */\n async getPullRequests(filters?: SearchFilters): Promise<PullRequest[]> {\n const { PullRequestCollection } = await import(\n '../collections/PullRequests'\n );\n const collection = await PullRequestCollection.create(this.options);\n return await collection.discover({ repository: this, filters });\n }\n\n /**\n * Create a new issue in this repository\n *\n * @param data - Issue creation data\n * @returns Created Issue (SMRT model)\n */\n async createIssue(data: CreateIssueInput): Promise<Issue> {\n const repositoryId = this.id ?? undefined;\n if (!repositoryId) {\n throw new Error('Repository must be saved before creating issues');\n }\n\n const client = await this.getClient();\n const created = await client.createIssue(data);\n\n // Create SMRT Issue from remote data\n const { Issue } = await import('./Issue');\n const issue = new Issue({\n ...this.options,\n repositoryId,\n number: created.number,\n nodeId: created.id,\n title: created.title,\n body: created.body,\n state: created.state,\n author: created.author.login,\n labels: created.labels.map((l) => l.name),\n assignees: created.assignees.map((a) => a.login),\n commentsCount: created.commentsCount,\n lastSyncedAt: new Date(),\n });\n\n // Directly-constructed models must be initialized before save() can access\n // the database connection (SmrtCollection.create() does this internally).\n await issue.initialize();\n await issue.save();\n return issue;\n }\n\n /**\n * Create a new pull request in this repository\n *\n * @param data - PR creation data\n * @returns Created PullRequest (SMRT model)\n */\n async createPullRequest(data: CreatePRInput): Promise<PullRequest> {\n const repositoryId = this.id ?? undefined;\n if (!repositoryId) {\n throw new Error('Repository must be saved before creating pull requests');\n }\n\n const client = await this.getClient();\n const created = await client.createPullRequest(data);\n\n // Create SMRT PullRequest from remote data\n const { PullRequest } = await import('./PullRequest');\n const pr = new PullRequest({\n ...this.options,\n repositoryId,\n number: created.number,\n nodeId: created.id,\n title: created.title,\n body: created.body,\n state: created.state,\n author: created.author.login,\n labels: created.labels.map((l) => l.name),\n assignees: created.assignees.map((a) => a.login),\n commentsCount: created.commentsCount,\n headRef: created.headRef,\n baseRef: created.baseRef,\n merged: created.merged,\n draft: created.draft,\n lastSyncedAt: new Date(),\n });\n\n // Directly-constructed models must be initialized before save() can access\n // the database connection (SmrtCollection.create() does this internally).\n await pr.initialize();\n await pr.save();\n return pr;\n }\n\n /**\n * Check if this repository has any open issues matching criteria\n *\n * @param criteria - Natural language description of what to check\n * @returns True if matching issues exist\n */\n async hasOpenIssuesMatching(criteria: string): Promise<boolean> {\n const issues = await this.getIssues({ state: 'open' });\n if (issues.length === 0) return false;\n\n return await this.is(\n `This repository has open issues matching: ${criteria}. ` +\n `Current open issues: ${issues.map((i) => `#${i.number}: ${i.title}`).join(', ')}`,\n );\n }\n\n /**\n * Generate a summary of repository activity\n *\n * @returns AI-generated summary\n */\n async summarizeActivity(): Promise<string> {\n const issues = await this.getIssues({ state: 'open', limit: 10 });\n const prs = await this.getPullRequests({ state: 'open', limit: 10 });\n\n return await this.do(\n `Summarize the current activity in this repository. ` +\n `Open issues: ${issues.map((i) => `#${i.number}: ${i.title}`).join(', ')}. ` +\n `Open PRs: ${prs.map((p) => `#${p.number}: ${p.title}`).join(', ')}.`,\n );\n }\n\n /**\n * Get repository by owner and name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @param options - Additional options\n * @returns Repository or null if not found\n */\n static async getByFullName(\n owner: string,\n name: string,\n options: SmrtObjectOptions = {},\n ): Promise<Repository | null> {\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(options);\n return await collection.findByFullName(owner, name);\n }\n}\n","/**\n * RepositoryCollection - Collection manager for Repository objects\n *\n * Provides querying and discovery operations for Repository entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Repository } from '../models/Repository';\nimport type { RepositoryProviderType } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class RepositoryCollection extends SmrtCollection<Repository> {\n static readonly _itemClass = Repository;\n\n /**\n * Find a repository by owner and name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @returns Repository or null\n */\n async findByFullName(\n owner: string,\n name: string,\n ): Promise<Repository | null> {\n const results = await this.list({\n where: { owner, name },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find repositories by owner\n *\n * @param owner - Repository owner\n * @returns Array of repositories\n */\n async findByOwner(owner: string): Promise<Repository[]> {\n return await this.list({\n where: { owner },\n });\n }\n\n /**\n * Find repositories by provider type\n *\n * @param providerType - Provider type\n * @returns Array of repositories\n */\n async findByProvider(\n providerType: RepositoryProviderType,\n ): Promise<Repository[]> {\n return await this.list({\n where: { providerType },\n });\n }\n\n /**\n * Get or create a repository by owner/name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @param options - Additional options for creation\n * @returns Repository (existing or newly created)\n */\n async getOrCreate(\n owner: string,\n name: string,\n options: {\n providerType?: RepositoryProviderType;\n tokenConfigKey?: string;\n baseUrl?: string;\n } = {},\n ): Promise<Repository> {\n let repo = await this.findByFullName(owner, name);\n\n if (!repo) {\n repo = await this.create({\n owner,\n name,\n fullName: `${owner}/${name}`,\n providerType: options.providerType || 'github',\n tokenConfigKey: options.tokenConfigKey || 'GITHUB_TOKEN',\n baseUrl: options.baseUrl || '',\n });\n await repo.save();\n }\n\n return repo;\n }\n\n /**\n * Sync all repositories\n *\n * @param options - Sync options\n * @returns Array of synced repositories\n */\n async syncAll(options: { force?: boolean } = {}): Promise<Repository[]> {\n const repos = await this.list({});\n const synced: Repository[] = [];\n\n for (const repo of repos) {\n await repo.sync(options);\n synced.push(repo);\n }\n\n return synced;\n }\n\n /**\n * Find repositories with open issues\n *\n * @returns Array of repositories with at least one open issue\n */\n async findWithOpenIssues(): Promise<Repository[]> {\n const repos = await this.list({});\n const withIssues: Repository[] = [];\n\n for (const repo of repos) {\n try {\n const issues = await repo.getIssues({ state: 'open', limit: 1 });\n if (issues.length > 0) {\n withIssues.push(repo);\n }\n } catch (error) {\n // Log error and skip repos we can't access\n logger.warn(\n `Error accessing issues for repository ${repo.owner}/${repo.name}`,\n { error: error instanceof Error ? error.message : error },\n );\n }\n }\n\n return withIssues;\n }\n\n /**\n * Find repositories by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of repositories for the tenant\n */\n async findByTenant(tenantId: string): Promise<Repository[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global repositories (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global repositories\n */\n async findGlobal(): Promise<Repository[]> {\n return queryGlobal<Repository>(this);\n }\n\n /**\n * Find repositories for a tenant plus all global repositories.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global repositories\n */\n async findWithGlobals(tenantId: string): Promise<Repository[]> {\n return queryWithGlobals<Repository>(\n this,\n tenantId,\n 'Repository.findWithGlobals',\n );\n }\n}\n","import {\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { AssistanceClassification, DeliveryEventType } from '../types.js';\n\nexport function parseProjectJson<T>(value: string, fallback: T): T {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nconst INTERNAL_SURFACES = {\n api: false,\n cli: false,\n mcp: false,\n} as const;\n\n/** Provider-neutral connection from a Development Request to canonical work. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_request_work_links',\n conflictColumns: ['request_id', 'work_item_type', 'work_item_id'],\n ...INTERNAL_SURFACES,\n})\nexport class DevelopmentRequestWorkLink extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) workItemType: string = '';\n @field({ type: 'text' }) workItemId: string = '';\n @field({ type: 'text' }) canonicalStatus: string = '';\n @field({ type: 'text' }) providerRef: string = '';\n @field({ type: 'text' }) metadata: string = '{}';\n lastProjectedAt: Date | null = null;\n}\n\n/** Ordered, idempotent delivery update emitted by the control plane. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_delivery_events',\n conflictColumns: ['integration_id', 'idempotency_key'],\n ...INTERNAL_SURFACES,\n})\nexport class ProjectDeliveryEvent extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) idempotencyKey: string = '';\n sequence: number = 0;\n @field({ type: 'text' }) type: DeliveryEventType = 'work_linked';\n @field({ type: 'text' }) payload: string = '{}';\n occurredAt: Date = new Date();\n deliveredAt: Date | null = null;\n deliveryAttempts: number = 0;\n @field({ type: 'text' }) lastDeliveryError: string = '';\n}\n\n/** Client decision state for one preview produced during delivery. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'preview_approvals',\n conflictColumns: ['request_id', 'preview_id'],\n ...INTERNAL_SURFACES,\n})\nexport class PreviewApproval extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) previewId: string = '';\n @field({ type: 'text' }) previewUrl: string = '';\n @field({ type: 'text' }) status:\n | 'pending'\n | 'approved'\n | 'rejected'\n | 'stale' = 'pending';\n @field({ type: 'text' }) decidedByRef: string = '';\n @field({ type: 'text' }) reason: string = '';\n createdAt: Date = new Date();\n decidedAt: Date | null = null;\n staleAt: Date | null = null;\n}\n\n/** Lossless conversational intake before support/development classification. */\n@TenantScoped({ mode: 'required' })\n@smrt({ tableName: 'assistance_requests', ...INTERNAL_SURFACES })\nexport class AssistanceRequest extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n @field({ type: 'text' }) requesterId: string = '';\n @field({ type: 'text' }) subject: string = '';\n @field({ type: 'text' }) applicationContext: string = '{}';\n @field({ type: 'text' }) conversation: string = '[]';\n @field({ type: 'text' }) evidence: string = '[]';\n @field({ type: 'text' }) classification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) supportCaseId: string = '';\n @field({ type: 'text' }) developmentRequestId: string = '';\n deliveryHandoffLinkedAt: Date | null = null;\n createdAt: Date = new Date();\n}\n\n/** Append-only explanation of Assistance Request routing decisions. */\n@TenantScoped({ mode: 'required' })\n@smrt({ tableName: 'assistance_request_events', ...INTERNAL_SURFACES })\nexport class AssistanceRequestEvent extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('AssistanceRequest', { required: true })\n assistanceRequestId: string = '';\n @field({ type: 'text' }) priorClassification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) resultingClassification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) actorRef: string = '';\n @field({ type: 'text' }) reason: string = '';\n @field({ type: 'text' }) resultingLinks: string = '{}';\n occurredAt: Date = new Date();\n}\n\nexport class DevelopmentRequestWorkLinkCollection extends SmrtCollection<DevelopmentRequestWorkLink> {\n static readonly _itemClass = DevelopmentRequestWorkLink;\n}\nexport class ProjectDeliveryEventCollection extends SmrtCollection<ProjectDeliveryEvent> {\n static readonly _itemClass = ProjectDeliveryEvent;\n}\nexport class PreviewApprovalCollection extends SmrtCollection<PreviewApproval> {\n static readonly _itemClass = PreviewApproval;\n}\nexport class AssistanceRequestCollection extends SmrtCollection<AssistanceRequest> {\n static readonly _itemClass = AssistanceRequest;\n}\nexport class AssistanceRequestEventCollection extends SmrtCollection<AssistanceRequestEvent> {\n static readonly _itemClass = AssistanceRequestEvent;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport type { DevelopmentRequest } from '../models/DevelopmentRequest.js';\nimport {\n type PreviewApproval,\n PreviewApprovalCollection,\n type ProjectDeliveryEvent,\n ProjectDeliveryEventCollection,\n parseProjectJson,\n} from '../models/delivery-control-plane.js';\nimport type { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type { DeliveryEventType } from '../types.js';\nimport type { DevelopmentWorkAdapter } from './development-request-service.js';\n\nexport interface DeliveryEventSender {\n send(event: ProjectDeliveryEvent): Promise<void>;\n}\n\nexport interface ApprovalPolicy {\n canApprove(input: {\n integration: ProjectIntegration;\n requestId: string;\n previewId: string;\n }): Promise<boolean>;\n}\n\nexport class ProjectDeliveryService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly requests: DevelopmentRequestCollection,\n private readonly events: ProjectDeliveryEventCollection,\n private readonly approvals: PreviewApprovalCollection,\n private readonly workAdapter?: DevelopmentWorkAdapter,\n private readonly approvalPolicy?: ApprovalPolicy,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n dependencies: {\n workAdapter?: DevelopmentWorkAdapter;\n approvalPolicy?: ApprovalPolicy;\n } = {},\n ): Promise<ProjectDeliveryService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const sharedOptions = { ...options, db: integrations.db };\n const [requests, events, approvals] = await Promise.all([\n DevelopmentRequestCollection.create(sharedOptions),\n ProjectDeliveryEventCollection.create(sharedOptions),\n PreviewApprovalCollection.create(sharedOptions),\n ]);\n return new ProjectDeliveryService(\n integrations,\n requests,\n events,\n approvals,\n dependencies.workAdapter,\n dependencies.approvalPolicy,\n );\n }\n\n async record(input: {\n integration: ProjectIntegration;\n requestId: string;\n idempotencyKey: string;\n sequence: number;\n type: DeliveryEventType;\n payload: Record<string, unknown>;\n occurredAt?: Date;\n }): Promise<ProjectDeliveryEvent> {\n const integration = await requireActiveIntegrationCapability(\n this.integrations,\n input.integration,\n 'delivery:write',\n );\n if (!input.idempotencyKey.trim())\n throw new Error('Delivery event idempotencyKey is required.');\n const existing = (\n await withTenant({ tenantId: integration.tenantId }, () =>\n this.events.list({\n where: {\n integrationId: integration.id,\n idempotencyKey: input.idempotencyKey,\n },\n limit: 1,\n }),\n )\n )[0];\n if (existing) {\n await this.applySideEffects(integration, existing);\n return existing;\n }\n const request = await this.requestForIntegration(\n integration,\n input.requestId,\n );\n const event = await withTenant({ tenantId: integration.tenantId }, () =>\n this.events.create({\n tenantId: integration.tenantId,\n integrationId: requiredId(integration.id, 'Project Integration'),\n requestId: input.requestId,\n idempotencyKey: input.idempotencyKey,\n sequence: input.sequence,\n type: input.type,\n payload: JSON.stringify(input.payload),\n occurredAt: input.occurredAt ?? new Date(),\n }),\n );\n await withTenant({ tenantId: integration.tenantId }, () => event.save());\n await this.applySideEffects(integration, event, request);\n return event;\n }\n\n private async applySideEffects(\n integration: ProjectIntegration,\n event: ProjectDeliveryEvent,\n loadedRequest?: DevelopmentRequest,\n ): Promise<void> {\n const request =\n loadedRequest ??\n (await this.requestForIntegration(integration, event.requestId));\n const payload = parseProjectJson<Record<string, unknown>>(\n event.payload,\n {},\n );\n if (event.type === 'preview') await this.upsertPreview(request, payload);\n if (\n (event.type === 'completed' ||\n event.type === 'deployment' ||\n event.type === 'rejected') &&\n !(await this.isLatestTerminalEvent(event))\n )\n return;\n if (\n (event.type === 'completed' || event.type === 'deployment') &&\n request.status !== 'completed'\n )\n await this.requests.transitionStatus(request.tenantId, event.requestId, {\n status: 'completed',\n actorType: 'integration',\n actorId: integration.id ?? '',\n note: event.type,\n });\n if (event.type === 'rejected' && request.status !== 'declined')\n await this.requests.transitionStatus(request.tenantId, event.requestId, {\n status: 'declined',\n actorType: 'integration',\n actorId: integration.id ?? '',\n note: String(payload.reason ?? 'Delivery rejected'),\n });\n }\n\n async listForIntegration(\n integration: ProjectIntegration,\n requestId: string,\n ): Promise<ProjectDeliveryEvent[]> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'delivery:read',\n );\n await this.requestForIntegration(active, requestId);\n return withTenant({ tenantId: active.tenantId }, () =>\n this.events.list({\n where: { integrationId: active.id, requestId },\n orderBy: 'sequence ASC',\n }),\n );\n }\n\n async deliverPending(\n sender: DeliveryEventSender,\n tenantId: string,\n integrationId?: string,\n ): Promise<void> {\n const pending = await withTenant({ tenantId }, () =>\n this.events.list({\n where: integrationId\n ? { integrationId, deliveredAt: null }\n : { deliveredAt: null },\n orderBy: 'sequence ASC',\n }),\n );\n for (const event of pending) {\n const active = await this.integrations.findActive(\n tenantId,\n event.integrationId,\n );\n if (!active) continue;\n event.deliveryAttempts += 1;\n try {\n await sender.send(event);\n event.deliveredAt = new Date();\n event.lastDeliveryError = '';\n } catch (error) {\n event.lastDeliveryError =\n error instanceof Error ? error.message : String(error);\n }\n await withTenant({ tenantId }, () => event.save());\n }\n }\n\n async replay(\n sender: DeliveryEventSender,\n integration: ProjectIntegration,\n afterSequence = -1,\n ): Promise<void> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'delivery:read',\n );\n const events = (\n await withTenant({ tenantId: active.tenantId }, () =>\n this.events.list({\n where: { integrationId: active.id },\n orderBy: 'sequence ASC',\n }),\n )\n ).filter((event) => event.sequence > afterSequence);\n for (const event of events) await sender.send(event);\n }\n\n async decidePreview(\n integration: ProjectIntegration,\n preview: PreviewApproval,\n input: { approved: boolean; actorRef: string; reason: string },\n ): Promise<PreviewApproval> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'previews:approve',\n );\n if (preview.tenantId !== active.tenantId)\n throw new Error('Preview is outside this Project Integration tenant.');\n if (preview.status === 'stale')\n throw new Error('Stale previews cannot be approved.');\n if (preview.status !== 'pending') return preview;\n const request = await this.requestForIntegration(active, preview.requestId);\n if (\n this.approvalPolicy &&\n !(await this.approvalPolicy.canApprove({\n integration: active,\n requestId: preview.requestId,\n previewId: preview.previewId,\n }))\n )\n throw new Error('Preview approval denied by policy.');\n if (!this.workAdapter?.requestApproval)\n throw new Error('Control-plane approval adapter is not configured.');\n await this.workAdapter.requestApproval({\n request,\n previewId: preview.previewId,\n idempotencyKey: `preview-approval:${requiredId(preview.id, 'Preview Approval')}`,\n approved: input.approved,\n reason: input.reason,\n });\n preview.status = input.approved ? 'approved' : 'rejected';\n preview.decidedByRef = input.actorRef;\n preview.reason = input.reason;\n preview.decidedAt = new Date();\n await withTenant({ tenantId: active.tenantId }, () => preview.save());\n return preview;\n }\n\n async markPreviewStale(preview: PreviewApproval): Promise<PreviewApproval> {\n if (preview.status === 'pending') {\n preview.status = 'stale';\n preview.staleAt = new Date();\n await withTenant({ tenantId: preview.tenantId }, () => preview.save());\n }\n return preview;\n }\n\n private async requestForIntegration(\n integration: ProjectIntegration,\n requestId: string,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId: integration.tenantId }, () =>\n this.requests.get({ id: requestId }),\n );\n if (\n !request ||\n request.integrationId !== integration.id ||\n request.projectId !== integration.projectId\n )\n throw new Error(\n 'Development Request is outside this Project Integration.',\n );\n return request;\n }\n\n private async isLatestTerminalEvent(\n event: ProjectDeliveryEvent,\n ): Promise<boolean> {\n const latest = (\n await withTenant({ tenantId: event.tenantId }, () =>\n this.events.list({\n where: {\n integrationId: event.integrationId,\n requestId: event.requestId,\n type: ['completed', 'deployment', 'rejected'],\n },\n orderBy: 'sequence DESC',\n limit: 1,\n }),\n )\n )[0];\n return !latest || latest.sequence <= event.sequence;\n }\n\n private async upsertPreview(\n request: DevelopmentRequest,\n payload: Record<string, unknown>,\n ): Promise<void> {\n const previewId = String(payload.previewId ?? '');\n if (!previewId) return;\n const existing = (\n await withTenant({ tenantId: request.tenantId }, () =>\n this.approvals.list({\n where: { requestId: request.id, previewId },\n limit: 1,\n }),\n )\n )[0];\n if (existing) return;\n const approval = await withTenant({ tenantId: request.tenantId }, () =>\n this.approvals.create({\n tenantId: request.tenantId,\n requestId: requiredId(request.id, 'Development Request'),\n previewId,\n previewUrl: String(payload.previewUrl ?? ''),\n status: 'pending',\n createdAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => approval.save());\n }\n}\n\nexport function requireIntegrationCapability(\n integration: ProjectIntegration,\n capability: string,\n): void {\n if (!integration.isActive())\n throw new Error('Project Integration is revoked.');\n if (!integration.hasCapability(capability))\n throw new Error(`Project Integration lacks capability '${capability}'.`);\n}\n\nexport async function requireActiveIntegrationCapability(\n integrations: ProjectIntegrationCollection,\n integration: Pick<ProjectIntegration, 'id' | 'tenantId'>,\n capability: string,\n): Promise<ProjectIntegration> {\n const integrationId = requiredId(integration.id, 'Project Integration');\n const active = await integrations.findActive(\n integration.tenantId,\n integrationId,\n );\n if (!active) throw new Error('Project Integration is revoked.');\n requireIntegrationCapability(active, capability);\n return active;\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport { ProjectCollection } from '../collections/Projects.js';\nimport { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type { ProjectBoardMoveIntent } from '../project-board-types.js';\nimport { requireActiveIntegrationCapability } from './delivery-service.js';\n\nexport type { ProjectBoardMoveIntent } from '../project-board-types.js';\n\n/** Pure data returned after a provider-backed project board move. */\nexport interface ProjectBoardMoveResult {\n projectId: string;\n itemId: string;\n previousStatus: string | null;\n status: string;\n}\n\n/**\n * Capability-checked server boundary for project-board mutations.\n *\n * This service intentionally exposes neither provider credentials nor the\n * provider client. It reloads the supplied server-derived integration before\n * every mutation, verifies its project binding and capability, validates the\n * requested item and status against the authoritative Project, then delegates\n * persistence to Project.updateItemStatus().\n */\nexport class ProjectBoardService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly projects: ProjectCollection,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n ): Promise<ProjectBoardService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const projects = await ProjectCollection.create({\n ...options,\n db: integrations.db,\n });\n return new ProjectBoardService(integrations, projects);\n }\n\n async moveItem(\n integration: ProjectIntegration,\n input: ProjectBoardMoveIntent,\n ): Promise<ProjectBoardMoveResult> {\n const projectId = requiredInput(input.projectId, 'Project ID');\n const itemId = requiredInput(input.itemId, 'Project item ID');\n const status = requiredInput(input.status, 'Project status');\n const authorized = await this.requireAuthorizedIntegration(\n integration,\n projectId,\n );\n const project = await this.findProject(authorized.tenantId, projectId);\n if (!project) throw new Error('Project not found for this integration.');\n\n const statuses = await project.getStatuses();\n if (!statuses.some((candidate) => candidate.name === status)) {\n throw new Error(`Project status '${status}' is not available.`);\n }\n\n const item = (await project.listItems()).find(\n (candidate) => candidate.id === itemId,\n );\n if (!item) throw new Error('Project item not found.');\n\n // Reads can take long enough for a capability to be revoked. Revalidate\n // against canonical integration state immediately before the write.\n await this.requireAuthorizedIntegration(integration, projectId);\n await project.updateItemStatus(itemId, status);\n return {\n projectId,\n itemId,\n previousStatus: item.status ?? null,\n status,\n };\n }\n\n private async requireAuthorizedIntegration(\n integration: ProjectIntegration,\n projectId: string,\n ): Promise<ProjectIntegration> {\n if (!(integration instanceof ProjectIntegration)) {\n throw new Error(\n 'Project board moves require an authenticated Project Integration.',\n );\n }\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'projects:write',\n );\n if (active.projectId !== projectId) {\n throw new Error('Project is outside this Project Integration.');\n }\n return active;\n }\n\n private async findProject(tenantId: string, projectId: string) {\n const tenantProject = (\n await withTenant({ tenantId }, () =>\n this.projects.list({ where: { projectId, tenantId }, limit: 1 }),\n )\n )[0];\n if (tenantProject) return tenantProject;\n return (await this.projects.findGlobal()).find(\n (candidate) => candidate.projectId === projectId,\n );\n }\n}\n\nfunction requiredInput(value: string, label: string): string {\n if (!value?.trim()) throw new Error(`${label} is required.`);\n return value;\n}\n","import type { DatabaseInterface } from '@happyvertical/sql';\nimport { DevelopmentRequestCollection } from './collections/DevelopmentRequests';\nimport { ProjectIntegrationCollection } from './collections/ProjectIntegrations';\nimport type { ProjectIntegration } from './models/ProjectIntegration';\nimport {\n type ProjectBoardMoveIntent,\n ProjectBoardService,\n} from './services/project-board-service';\nimport type { ManagedDevelopmentRequestCreateInput } from './types';\n\nexport class ManagedProjectClient {\n readonly #db: DatabaseInterface;\n readonly #integration: ProjectIntegration;\n readonly #requesterId: string;\n\n private constructor(\n integration: ProjectIntegration,\n options: { db: DatabaseInterface; requesterId: string },\n ) {\n this.#integration = integration;\n this.#db = options.db;\n this.#requesterId = options.requesterId;\n }\n\n static async authenticate(\n credential: string,\n options: { db: DatabaseInterface; requesterId: string },\n ): Promise<ManagedProjectClient> {\n if (!options.requesterId.trim()) {\n throw new Error('Managed project client requires a stable requesterId');\n }\n const integrations = await ProjectIntegrationCollection.create({\n db: options.db,\n });\n const integration = await integrations.authenticate(credential);\n if (!integration) {\n throw new Error('Invalid or revoked project integration credential');\n }\n return new ManagedProjectClient(integration, options);\n }\n\n async createRequest(\n input: Omit<ManagedDevelopmentRequestCreateInput, 'requesterId'>,\n ) {\n const integration = await this.#requireCapability('requests:create');\n if (!input.description.trim()) {\n throw new Error('Managed request creation requires a description');\n }\n\n const requests = await DevelopmentRequestCollection.create({\n db: this.#db,\n });\n return requests.createManaged({\n ...input,\n tenantId: integration.tenantId,\n projectId: integration.projectId,\n integrationId: integration.id as string,\n requesterId: this.#requesterId,\n });\n }\n\n async listRequests() {\n const integration = await this.#requireCapability('requests:read-own');\n const requests = await DevelopmentRequestCollection.create({\n db: this.#db,\n });\n return requests.listByIntegrationRequester({\n tenantId: integration.tenantId,\n integrationId: integration.id as string,\n requesterId: this.#requesterId,\n });\n }\n\n /**\n * Move a project-board item through this authenticated integration.\n *\n * The browser submits only the move intent. This client keeps the credential\n * authentication boundary server-side and ProjectBoardService reloads active\n * capability state again immediately before the provider mutation.\n */\n async moveProjectBoardItem(input: ProjectBoardMoveIntent) {\n const integration = await this.#requireCapability('projects:write');\n const service = await ProjectBoardService.create({ db: this.#db });\n return service.moveItem(integration, input);\n }\n\n async #requireCapability(capability: string): Promise<ProjectIntegration> {\n const tenantId = this.#integration.tenantId;\n const integrationId = this.#integration.id;\n if (!tenantId || !integrationId) {\n throw new Error('Invalid or revoked project integration credential');\n }\n const integrations = await ProjectIntegrationCollection.create({\n db: this.#db,\n });\n const integration = await integrations.findActive(tenantId, integrationId);\n if (!integration) {\n throw new Error('Invalid or revoked project integration credential');\n }\n if (!integration.hasCapability(capability)) {\n throw new Error(\n `Managed project integration lacks required capability '${capability}'`,\n );\n }\n return integration;\n }\n}\n","/**\n * Projects money columns: floating-point major units → integer minor units.\n *\n * Ships as an explicit, opt-in migration rather than a schema-differ upgrade\n * because REAL→INTEGER is not information-preserving: an automatic\n * `ALTER … TYPE integer` would truncate `19.99` to `19`. The values have to be\n * rescaled by the currency's minor-unit factor during the type change (#2401).\n *\n * ```ts\n * console.log((await preflightProjectsMoneyMinorUnits(db)).summary);\n * await migrateProjectsMoneyToMinorUnits(db);\n * ```\n *\n * The two snapshot tables convert together: the delivery margin is\n * `charge - compensation`, so a half-converted pair produces a nonsense number\n * rather than an error.\n *\n * Both tables are immutable-on-save, and the immutability check compares a\n * stringified field snapshot. Rescaling changes those strings, which is\n * harmless — the snapshot is recomputed from the row on load — but it does mean\n * a row must not be mid-flight while the migration runs.\n *\n * On SQLite the values are rescaled but the declared type cannot change in\n * place; those columns come back in `declaredTypeChangePending` and need the\n * table-rebuild path (#2370).\n */\n\nimport {\n type DatabaseInterface,\n type MinorUnitsPreflightResult,\n type MinorUnitsRescaleResult,\n type MoneyColumnTarget,\n preflightMinorUnitsRescale,\n rescaleMoneyColumnsToMinorUnits,\n} from '@happyvertical/smrt-core/migrations';\n\n/** Marker recorded in `_smrt_backfills` once the rescale has run. */\nexport const PROJECTS_MONEY_MINOR_UNITS_BACKFILL =\n '@happyvertical/smrt-projects:money-minor-units:v1';\n\n/** Every projects money column that held major units before #2401. */\nexport const PROJECTS_MONEY_COLUMNS: MoneyColumnTarget[] = [\n { table: 'service_charge_snapshots', columns: ['amount'] },\n { table: 'service_compensation_snapshots', columns: ['amount'] },\n];\n\n/**\n * Report what {@link migrateProjectsMoneyToMinorUnits} would do, without\n * writing anything.\n */\nexport function preflightProjectsMoneyMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string } = {},\n): Promise<MinorUnitsPreflightResult> {\n return preflightMinorUnitsRescale(db, PROJECTS_MONEY_COLUMNS, options);\n}\n\n/**\n * Convert every projects money column from floating-point major units to\n * integer minor units. Idempotent via a `_smrt_backfills` marker.\n *\n * @throws `MinorUnitsPreflightError` when a row would be rounded or would\n * overflow `int4` and `force` was not set.\n */\nexport function migrateProjectsMoneyToMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string; force?: boolean } = {},\n): Promise<MinorUnitsRescaleResult> {\n return rescaleMoneyColumnsToMinorUnits(db, PROJECTS_MONEY_COLUMNS, {\n ...options,\n backfillName: PROJECTS_MONEY_MINOR_UNITS_BACKFILL,\n packageName: '@happyvertical/smrt-projects',\n });\n}\n","/**\n * Comment model - SMRT wrapper for issue/PR comments\n *\n * Represents a comment on an issue or pull request.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\n\nconst logger = createLogger({ level: 'info' });\n\nexport interface CommentOptions extends SmrtObjectOptions {\n issueId?: string;\n commentId?: string;\n body?: string;\n author?: string;\n createdAt?: Date;\n updatedAt?: Date;\n url?: string;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n})\nexport class Comment extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Issue this comment belongs to\n */\n @foreignKey('Issue')\n issueId?: string;\n\n /**\n * Provider-specific comment ID\n */\n commentId: string = '';\n\n /**\n * Comment body text\n */\n body: string = '';\n\n /**\n * Comment author's login\n */\n author: string = '';\n\n /**\n * When the comment was created\n */\n createdAt: Date | null = null;\n\n /**\n * When the comment was last updated\n */\n updatedAt: Date | null = null;\n\n /**\n * Comment URL\n */\n url: string = '';\n\n constructor(options: CommentOptions = {}) {\n super(options);\n if (options.issueId !== undefined) this.issueId = options.issueId;\n if (options.commentId !== undefined) this.commentId = options.commentId;\n if (options.body !== undefined) this.body = options.body;\n if (options.author !== undefined) this.author = options.author;\n if (options.createdAt !== undefined) this.createdAt = options.createdAt;\n if (options.updatedAt !== undefined) this.updatedAt = options.updatedAt;\n if (options.url !== undefined) this.url = options.url;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * AI-powered: Check if this comment contains a question\n */\n async isQuestion(): Promise<boolean> {\n return await this.is(\n 'This comment contains a question or request for clarification',\n );\n }\n\n /**\n * AI-powered: Check if this comment contains approval\n */\n async isApproval(): Promise<boolean> {\n return await this.is(\n 'This comment expresses approval, agreement, or a positive response (LGTM, +1, approved, etc.)',\n );\n }\n\n /**\n * AI-powered: Check if this comment requests changes\n */\n async requestsChanges(): Promise<boolean> {\n return await this.is(\n 'This comment requests changes, modifications, or improvements to the issue/PR',\n );\n }\n\n /**\n * AI-powered: Extract action items from this comment\n *\n * @returns Array of action items\n */\n async extractActionItems(): Promise<string[]> {\n const result = await this.do(\n `Extract any action items, tasks, or requests from this comment.\n Return a JSON array of strings, each representing one action item.\n If no action items, return an empty array [].\n Only return the JSON array, nothing else.\n\n Comment: ${this.body}`,\n // Body is hand-rolled above; skip do()'s object-data injection (no dup).\n { includeData: false },\n );\n\n try {\n return JSON.parse(result);\n } catch (error) {\n logger.warn('Failed to parse action items JSON', {\n error: error instanceof Error ? error.message : error,\n response: result,\n });\n return [];\n }\n }\n\n /**\n * AI-powered: Summarize this comment\n *\n * @returns Brief summary\n */\n async summarize(): Promise<string> {\n return await this.do(\n `Summarize this comment in one sentence.\n Comment by ${this.author}: ${this.body}`,\n // Author + body hand-rolled above; skip do()'s object-data injection.\n { includeData: false },\n );\n }\n\n /**\n * Get the sentiment of this comment\n *\n * @returns Sentiment classification\n */\n async getSentiment(): Promise<'positive' | 'negative' | 'neutral'> {\n const result = await this.do(\n `Classify the sentiment of this comment as exactly one of: positive, negative, neutral\n Only return one word.\n Comment: ${this.body}`,\n // Body is hand-rolled above; skip do()'s object-data injection (no dup).\n { includeData: false },\n );\n\n const normalized = result.toLowerCase().trim();\n if (normalized.includes('positive')) return 'positive';\n if (normalized.includes('negative')) return 'negative';\n return 'neutral';\n }\n}\n","/**\n * Label model - SMRT wrapper for repository labels\n *\n * Represents a label that can be applied to issues and PRs.\n */\n\nimport {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\n\nexport interface LabelOptions extends SmrtObjectOptions {\n repositoryId?: string;\n name?: string;\n color?: string;\n description?: string;\n}\n\n@smrt({\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n mcp: { include: ['list', 'get', 'create'] },\n cli: { include: ['list', 'get', 'create', 'update', 'delete'] },\n})\nexport class Label extends SmrtObject {\n /**\n * Repository this label belongs to\n */\n @foreignKey('Repository')\n repositoryId?: string;\n\n /**\n * Label name\n */\n name: string = '';\n\n /**\n * Label color (hex without #)\n */\n color: string = '';\n\n /**\n * Label description\n */\n description: string = '';\n\n constructor(options: LabelOptions = {}) {\n super(options);\n if (options.repositoryId !== undefined)\n this.repositoryId = options.repositoryId;\n if (options.name !== undefined) this.name = options.name;\n if (options.color !== undefined) this.color = options.color;\n if (options.description !== undefined)\n this.description = options.description;\n }\n\n /**\n * Check if this is a type label (bug, feature, etc.)\n */\n isTypeLabel(): boolean {\n const typePatterns = [\n /^type:/i,\n /^kind:/i,\n /^bug$/i,\n /^feature$/i,\n /^enhancement$/i,\n /^docs$/i,\n /^chore$/i,\n ];\n return typePatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Check if this is a priority label\n */\n isPriorityLabel(): boolean {\n const priorityPatterns = [\n /^p[0-4]$/i,\n /^priority:/i,\n /^critical$/i,\n /^high$/i,\n /^medium$/i,\n /^low$/i,\n ];\n return priorityPatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Check if this is a status label\n */\n isStatusLabel(): boolean {\n const statusPatterns = [\n /^status:/i,\n /^wip$/i,\n /^in.?progress$/i,\n /^blocked$/i,\n /^needs.?review$/i,\n /^ready$/i,\n ];\n return statusPatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Get the label category\n *\n * @returns Category name\n */\n getCategory(): 'type' | 'priority' | 'status' | 'area' | 'other' {\n if (this.isTypeLabel()) return 'type';\n if (this.isPriorityLabel()) return 'priority';\n if (this.isStatusLabel()) return 'status';\n if (this.name.includes(':')) return 'area';\n return 'other';\n }\n\n /**\n * Parse priority level from label name\n *\n * @returns Priority level 0-4 or null\n */\n getPriorityLevel(): number | null {\n const match = this.name.match(/p([0-4])/i);\n if (match) {\n return parseInt(match[1], 10);\n }\n if (/critical/i.test(this.name)) return 0;\n if (/high/i.test(this.name)) return 1;\n if (/medium/i.test(this.name)) return 2;\n if (/low/i.test(this.name)) return 3;\n return null;\n }\n\n /**\n * Get label with # prefix for hex color\n */\n getHexColor(): string {\n return this.color.startsWith('#') ? this.color : `#${this.color}`;\n }\n\n /**\n * Create a label in the repository\n */\n async createInRepository(): Promise<void> {\n if (!this.repositoryId) {\n throw new Error('Label must have a repositoryId');\n }\n\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(this.options);\n const repo = await collection.get({ id: this.repositoryId });\n\n if (!repo) {\n throw new Error(`Repository ${this.repositoryId} not found`);\n }\n\n const client = await repo.getClient();\n await client.createLabel({\n name: this.name,\n color: this.color,\n description: this.description,\n });\n\n await this.save();\n }\n\n /**\n * Update this label in the repository\n */\n async updateInRepository(): Promise<void> {\n if (!this.repositoryId) {\n throw new Error('Label must have a repositoryId');\n }\n\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(this.options);\n const repo = await collection.get({ id: this.repositoryId });\n\n if (!repo) {\n throw new Error(`Repository ${this.repositoryId} not found`);\n }\n\n const client = await repo.getClient();\n await client.updateLabel(this.name, {\n name: this.name,\n color: this.color,\n description: this.description,\n });\n\n await this.save();\n }\n}\n","import {\n crossPackageRef,\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ServiceEvidence,\n ServiceParticipantKind,\n ServiceTimeEntrySource,\n ServiceTimeEntryStatus,\n} from '../types.js';\nimport { parseProjectJson } from './delivery-control-plane.js';\n\nconst FROZEN_FIELDS = [\n 'tenantId',\n 'caseId',\n 'workRefType',\n 'workRefId',\n 'specialistId',\n 'participantKind',\n 'participantProfileId',\n 'agentRef',\n 'source',\n 'description',\n 'startedAt',\n 'endedAt',\n 'durationSeconds',\n 'evidence',\n 'correctionOfId',\n] as const;\n\nconst STATUS_TRANSITIONS: Record<\n ServiceTimeEntryStatus,\n ServiceTimeEntryStatus[]\n> = {\n draft: ['submitted', 'rejected'],\n submitted: ['approved', 'rejected', 'draft'],\n approved: ['corrected'],\n rejected: ['draft', 'submitted'],\n corrected: [],\n};\n\nfunction frozenView(source: Record<string, unknown>): string {\n const result: Record<string, unknown> = {};\n for (const key of FROZEN_FIELDS) {\n let value = source[key] ?? null;\n if ((key === 'startedAt' || key === 'endedAt') && value) {\n const date = value instanceof Date ? value : new Date(String(value));\n value = Number.isNaN(date.getTime()) ? String(value) : date.toISOString();\n }\n if (key === 'durationSeconds') value = Number(value ?? 0);\n result[key] = value === '' ? null : value;\n }\n return JSON.stringify(result);\n}\n\nconst loadedStatus = new WeakMap<ServiceTimeEntry, ServiceTimeEntryStatus>();\nconst chargeSnapshot = new WeakMap<ServiceChargeSnapshot, string>();\nconst compensationSnapshot = new WeakMap<ServiceCompensationSnapshot, string>();\n\nasync function immutableCommercialSnapshot(\n object: SmrtObject,\n fields: string[],\n): Promise<string | null> {\n if (!object.id) return null;\n try {\n const row = await object.db.get(object.tableName, { id: object.id });\n if (!row) return null;\n return JSON.stringify(\n Object.fromEntries(\n fields.map((key) => [\n key,\n row[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)] ?? null,\n ]),\n ),\n );\n } catch {\n return null;\n }\n}\n\nfunction commercialSnapshot(\n object: Record<string, unknown>,\n fields: string[],\n): string {\n return JSON.stringify(\n Object.fromEntries(fields.map((key) => [key, object[key] ?? null])),\n );\n}\n\nconst CHARGE_FIELDS = [\n 'timeEntryId',\n 'amount',\n 'currency',\n 'pricingVersion',\n 'strategy',\n 'rateSnapshot',\n 'sourceChargeRef',\n];\nconst COMPENSATION_FIELDS = [\n 'timeEntryId',\n 'amount',\n 'currency',\n 'termsVersion',\n 'rateSnapshot',\n];\n\n/**\n * Canonical Professional Service evidence shared by planning, development,\n * and support. Commercial snapshots are deliberately separate models.\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_time_entries',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceTimeEntry extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @crossPackageRef('@happyvertical/smrt-support:SupportCase', {\n nullable: true,\n })\n caseId: string | null = null;\n @field({ type: 'text', nullable: true }) workRefType: string | null = null;\n @field({ type: 'text', nullable: true }) workRefId: string | null = null;\n @crossPackageRef('@happyvertical/smrt-support:SupportSpecialist', {\n nullable: true,\n })\n specialistId: string | null = null;\n @field({ type: 'text' }) participantKind: ServiceParticipantKind = 'human';\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n participantProfileId: string | null = null;\n @field({ type: 'text' }) agentRef: string = '';\n @field({ type: 'text' }) source: ServiceTimeEntrySource = 'manual';\n @field({ type: 'text' }) description: string = '';\n startedAt: Date | null = null;\n endedAt: Date | null = null;\n durationSeconds: number = 0;\n @field({ type: 'text' }) evidence: string = '[]';\n @field({ type: 'text' }) status: ServiceTimeEntryStatus = 'draft';\n submittedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n submittedByProfileId: string | null = null;\n approvedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n approvedByProfileId: string | null = null;\n @field({ type: 'text' }) approvalPath: string = '';\n rejectedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n rejectedByProfileId: string | null = null;\n @field({ type: 'text' }) rejectionReason: string = '';\n @foreignKey('ServiceTimeEntry') correctionOfId: string | null = null;\n @field({ type: 'text' }) metadata: string = '{}';\n\n getEvidence(): ServiceEvidence[] {\n return parseProjectJson(this.evidence, []);\n }\n setEvidence(value: ServiceEvidence[]): void {\n this.evidence = JSON.stringify(value ?? []);\n }\n getMetadata(): Record<string, unknown> {\n return parseProjectJson(this.metadata, {});\n }\n setMetadata(value: Record<string, unknown>): void {\n this.metadata = JSON.stringify(value ?? {});\n }\n durationHours(): number {\n return this.durationSeconds / 3600;\n }\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved()) loadedStatus.set(this, this.status);\n return this;\n }\n\n override async save(): Promise<this> {\n const prior = await this.readPrior();\n if (\n prior &&\n prior.status !== this.status &&\n !STATUS_TRANSITIONS[prior.status].includes(this.status)\n ) {\n throw new Error(\n `ServiceTimeEntry ${this.id}: illegal status transition '${prior.status}' → '${this.status}'.`,\n );\n }\n if (\n prior &&\n (prior.status === 'approved' || prior.status === 'corrected')\n ) {\n const current = frozenView(this as unknown as Record<string, unknown>);\n if (current !== prior.frozen) {\n throw new Error(\n 'Approved ServiceTimeEntry evidence is immutable; create a correction instead.',\n );\n }\n }\n const result = (await super.save()) as this;\n loadedStatus.set(this, this.status);\n return result;\n }\n\n private async readPrior(): Promise<{\n status: ServiceTimeEntryStatus;\n frozen: string;\n } | null> {\n if (!this.id) return null;\n try {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (!row?.status) return null;\n const values: Record<string, unknown> = {};\n for (const key of FROZEN_FIELDS) {\n values[key] = row[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)];\n }\n return {\n status: row.status as ServiceTimeEntryStatus,\n frozen: frozenView(values),\n };\n } catch {\n const status = loadedStatus.get(this);\n return status\n ? {\n status,\n frozen: frozenView(this as unknown as Record<string, unknown>),\n }\n : null;\n }\n }\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_charge_snapshots',\n conflictColumns: ['time_entry_id'],\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceChargeSnapshot extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @foreignKey('ServiceTimeEntry', { required: true }) timeEntryId: string = '';\n /**\n * Client charge in **integer minor units** of {@link currency} — `$19.99` is\n * `1999`. The `= 0` initializer is load-bearing: SMRT maps an integer literal\n * to INTEGER and a decimal literal to DECIMAL (#2401).\n *\n * Copied verbatim from the upstream `ClientCharge.amount`, so the two carry\n * the same unit by construction; a split would land cents in a major-units\n * column with no error anywhere.\n */\n amount: number = 0;\n @field({ type: 'text' }) currency: string = 'USD';\n @field({ type: 'text' }) pricingVersion: string = '';\n @field({ type: 'text' }) strategy: string = '';\n @field({ type: 'text' }) rateSnapshot: string = '{}';\n @field({ type: 'text' }) sourceChargeRef: string = '';\n createdAt: Date = new Date();\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved())\n chargeSnapshot.set(\n this,\n commercialSnapshot(\n this as unknown as Record<string, unknown>,\n CHARGE_FIELDS,\n ),\n );\n return this;\n }\n\n override async save(): Promise<this> {\n const current = commercialSnapshot(\n this as unknown as Record<string, unknown>,\n CHARGE_FIELDS,\n );\n const prior =\n (await immutableCommercialSnapshot(this, CHARGE_FIELDS)) ??\n chargeSnapshot.get(this) ??\n null;\n if (prior && prior !== current)\n throw new Error(\n 'ServiceChargeSnapshot is immutable; append an upstream adjustment instead.',\n );\n const result = (await super.save()) as this;\n chargeSnapshot.set(this, current);\n return result;\n }\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_compensation_snapshots',\n conflictColumns: ['time_entry_id'],\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceCompensationSnapshot extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @foreignKey('ServiceTimeEntry', { required: true }) timeEntryId: string = '';\n /**\n * Provider earning in **integer minor units** of {@link currency} (#2401).\n *\n * Converts with {@link ServiceChargeSnapshot.amount}: the delivery margin is\n * `charge - compensation`, so a mixed pair would make that subtraction\n * meaningless.\n */\n amount: number = 0;\n @field({ type: 'text' }) currency: string = 'USD';\n @field({ type: 'text' }) termsVersion: string = '';\n @field({ type: 'text' }) rateSnapshot: string = '{}';\n createdAt: Date = new Date();\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved())\n compensationSnapshot.set(\n this,\n commercialSnapshot(\n this as unknown as Record<string, unknown>,\n COMPENSATION_FIELDS,\n ),\n );\n return this;\n }\n\n override async save(): Promise<this> {\n const current = commercialSnapshot(\n this as unknown as Record<string, unknown>,\n COMPENSATION_FIELDS,\n );\n const prior =\n (await immutableCommercialSnapshot(this, COMPENSATION_FIELDS)) ??\n compensationSnapshot.get(this) ??\n null;\n if (prior && prior !== current)\n throw new Error(\n 'ServiceCompensationSnapshot is immutable; create explicit settlement evidence instead.',\n );\n const result = (await super.save()) as this;\n compensationSnapshot.set(this, current);\n return result;\n }\n}\n\nexport class ServiceTimeEntryCollection extends SmrtCollection<ServiceTimeEntry> {\n static readonly _itemClass = ServiceTimeEntry;\n async forWork(\n workRefType: string,\n workRefId: string,\n ): Promise<ServiceTimeEntry[]> {\n return this.list({\n where: { workRefType, workRefId },\n orderBy: 'created_at ASC',\n });\n }\n async forCase(caseId: string): Promise<ServiceTimeEntry[]> {\n return this.list({ where: { caseId }, orderBy: 'created_at ASC' });\n }\n async forSpecialist(specialistId: string): Promise<ServiceTimeEntry[]> {\n return this.list({ where: { specialistId }, orderBy: 'created_at ASC' });\n }\n async pendingApproval(): Promise<ServiceTimeEntry[]> {\n return this.list({\n where: { status: 'submitted' },\n orderBy: 'submitted_at ASC',\n });\n }\n}\nexport class ServiceChargeSnapshotCollection extends SmrtCollection<ServiceChargeSnapshot> {\n static readonly _itemClass = ServiceChargeSnapshot;\n}\nexport class ServiceCompensationSnapshotCollection extends SmrtCollection<ServiceCompensationSnapshot> {\n static readonly _itemClass = ServiceCompensationSnapshot;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport {\n type AssistanceRequest,\n AssistanceRequestCollection,\n AssistanceRequestEventCollection,\n} from '../models/delivery-control-plane.js';\nimport type { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type {\n AssistanceClassification,\n DevelopmentRequestEvidence,\n ManagedAssistanceRequestInput,\n} from '../types.js';\nimport { requireActiveIntegrationCapability } from './delivery-service.js';\n\nexport interface AssistanceSupportPort {\n openOrJoin(input: {\n assistanceRequestId: string;\n tenantId: string;\n projectId: string;\n requesterId: string;\n subject: string;\n conversation: Record<string, unknown>[];\n evidence: DevelopmentRequestEvidence[];\n applicationContext: Record<string, unknown>;\n }): Promise<{ caseId: string }>;\n /** Implementations must treat this handoff as idempotent. */\n linkDelivery?(input: {\n tenantId: string;\n caseId: string;\n developmentRequestId: string;\n }): Promise<void>;\n}\n\nexport class AssistanceRequestService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly development: DevelopmentRequestCollection,\n private readonly requests: AssistanceRequestCollection,\n private readonly events: AssistanceRequestEventCollection,\n private readonly support?: AssistanceSupportPort,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n dependencies: { support?: AssistanceSupportPort } = {},\n ): Promise<AssistanceRequestService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const sharedOptions = { ...options, db: integrations.db };\n const [development, requests, events] = await Promise.all([\n DevelopmentRequestCollection.create(sharedOptions),\n AssistanceRequestCollection.create(sharedOptions),\n AssistanceRequestEventCollection.create(sharedOptions),\n ]);\n return new AssistanceRequestService(\n integrations,\n development,\n requests,\n events,\n dependencies.support,\n );\n }\n\n async createRequest(\n integration: ProjectIntegration,\n input: ManagedAssistanceRequestInput,\n ): Promise<AssistanceRequest> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'assistance:create',\n );\n if (!input.requesterId.trim())\n throw new Error('Assistance Request requires a stable requesterId.');\n if (!input.subject.trim())\n throw new Error('Assistance Request subject is required.');\n const request = await withTenant({ tenantId: active.tenantId }, () =>\n this.requests.create({\n tenantId: active.tenantId,\n integrationId: requiredId(active.id, 'Project Integration'),\n requesterId: input.requesterId,\n subject: input.subject.trim(),\n applicationContext: JSON.stringify(input.applicationContext ?? {}),\n conversation: JSON.stringify(input.conversation ?? []),\n evidence: JSON.stringify(input.evidence ?? []),\n classification: 'unclassified',\n createdAt: new Date(),\n }),\n );\n await withTenant({ tenantId: active.tenantId }, () => request.save());\n return request;\n }\n\n async classify(\n integration: ProjectIntegration,\n request: AssistanceRequest,\n input: {\n classification: Exclude<AssistanceClassification, 'unclassified'>;\n actorRef: string;\n reason: string;\n developmentType?: string;\n },\n ): Promise<AssistanceRequest> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'assistance:create',\n );\n if (\n request.integrationId !== active.id ||\n request.tenantId !== active.tenantId\n )\n throw new Error(\n 'Assistance Request is outside this Project Integration.',\n );\n if (!input.reason.trim())\n throw new Error('Classification reason is required.');\n const prior = request.classification;\n\n if (\n (input.classification === 'support' || input.classification === 'both') &&\n !request.supportCaseId\n ) {\n if (!this.support)\n throw new Error('Support routing port is not configured.');\n const result = await this.support.openOrJoin({\n assistanceRequestId: requiredId(request.id, 'Assistance Request'),\n tenantId: request.tenantId,\n projectId: active.projectId,\n requesterId: request.requesterId,\n subject: request.subject,\n conversation: parseArray(request.conversation),\n evidence: parseEvidence(request.evidence),\n applicationContext: parseObject(request.applicationContext),\n });\n request.supportCaseId = result.caseId;\n }\n\n if (\n (input.classification === 'development' ||\n input.classification === 'both') &&\n !request.developmentRequestId\n ) {\n const integrationId = requiredId(active.id, 'Project Integration');\n const origin = `assistance:${requiredId(request.id, 'Assistance Request')}`;\n const existing = (\n await withTenant({ tenantId: active.tenantId }, () =>\n this.development.list({\n where: {\n tenantId: active.tenantId,\n projectId: active.projectId,\n integrationId,\n origin,\n },\n orderBy: 'createdAt ASC',\n limit: 1,\n }),\n )\n )[0];\n const developmentRequest =\n existing ??\n (await this.development.createManaged({\n tenantId: active.tenantId,\n projectId: active.projectId,\n integrationId,\n requesterId: request.requesterId,\n type: input.developmentType ?? 'task',\n description:\n conversationText(request.conversation) || request.subject,\n evidence: parseEvidence(request.evidence),\n origin,\n discussion: input.reason,\n visibility: 'requester',\n }));\n request.developmentRequestId = developmentRequest.id ?? '';\n }\n\n if (\n input.classification === 'both' &&\n request.supportCaseId &&\n request.developmentRequestId &&\n !request.deliveryHandoffLinkedAt &&\n this.support?.linkDelivery\n ) {\n await this.support.linkDelivery({\n tenantId: request.tenantId,\n caseId: request.supportCaseId,\n developmentRequestId: request.developmentRequestId,\n });\n request.deliveryHandoffLinkedAt = new Date();\n }\n\n request.classification = input.classification;\n await withTenant({ tenantId: request.tenantId }, () => request.save());\n const event = await withTenant({ tenantId: request.tenantId }, () =>\n this.events.create({\n tenantId: request.tenantId,\n assistanceRequestId: requiredId(request.id, 'Assistance Request'),\n priorClassification: prior,\n resultingClassification: input.classification,\n actorRef: input.actorRef,\n reason: input.reason,\n resultingLinks: JSON.stringify({\n supportCaseId: request.supportCaseId || null,\n developmentRequestId: request.developmentRequestId || null,\n }),\n occurredAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => event.save());\n return request;\n }\n}\n\nfunction parseArray(value: string): Record<string, unknown>[] {\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed)\n ? parsed.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === 'object' && !Array.isArray(item),\n )\n : [];\n } catch {\n return [];\n }\n}\n\nfunction parseObject(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction parseEvidence(value: string): DevelopmentRequestEvidence[] {\n return parseArray(value)\n .map((item) => ({\n url: typeof item.url === 'string' ? item.url : '',\n ...(typeof item.label === 'string' ? { label: item.label } : {}),\n }))\n .filter((item) => item.url.length > 0);\n}\n\nfunction conversationText(value: string): string {\n return parseArray(value)\n .map((message) => String(message.body ?? message.text ?? ''))\n .filter(Boolean)\n .join('\\n\\n');\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport type { DevelopmentRequest } from '../models/DevelopmentRequest.js';\nimport {\n type DevelopmentRequestWorkLink,\n DevelopmentRequestWorkLinkCollection,\n} from '../models/delivery-control-plane.js';\nimport type { DevelopmentTriageDecision } from '../types.js';\n\nexport interface DevelopmentWorkItem {\n type: string;\n id: string;\n canonicalStatus: string;\n providerRef?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface DevelopmentWorkAdapter {\n createWorkItem(input: {\n request: DevelopmentRequest;\n idempotencyKey: string;\n }): Promise<DevelopmentWorkItem>;\n getWorkItem(link: DevelopmentRequestWorkLink): Promise<DevelopmentWorkItem>;\n requestApproval?(input: {\n request: DevelopmentRequest;\n previewId: string;\n /** Stable across retries; adapters must deduplicate this operation. */\n idempotencyKey: string;\n approved: boolean;\n reason: string;\n }): Promise<void>;\n}\n\nexport interface DevelopmentViewer {\n tenantId: string;\n projectId: string;\n requesterId?: string;\n roles?: Array<'workspace' | 'project_team' | 'internal'>;\n}\n\nexport class DevelopmentRequestService {\n constructor(\n private readonly requests: DevelopmentRequestCollection,\n private readonly links: DevelopmentRequestWorkLinkCollection,\n readonly workAdapter?: DevelopmentWorkAdapter,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n workAdapter?: DevelopmentWorkAdapter,\n ): Promise<DevelopmentRequestService> {\n return new DevelopmentRequestService(\n await DevelopmentRequestCollection.create(options),\n await DevelopmentRequestWorkLinkCollection.create(options),\n workAdapter,\n );\n }\n\n /** Visibility is evaluated after tenant and project scoping. */\n async visibleFor(viewer: DevelopmentViewer): Promise<DevelopmentRequest[]> {\n const all = await this.requests.listForProject(\n viewer.tenantId,\n viewer.projectId,\n );\n const roles = new Set(viewer.roles ?? []);\n return all.filter((request) => {\n if (roles.has('internal')) return true;\n if (request.requesterId === viewer.requesterId) return true;\n if (\n request.visibility === 'internal' ||\n request.visibility === 'requester'\n )\n return false;\n if (request.visibility === 'public') return true;\n if (roles.has('project_team'))\n return (\n request.visibility === 'workspace' ||\n request.visibility === 'project_team'\n );\n return roles.has('workspace') && request.visibility === 'workspace';\n });\n }\n\n async linksFor(\n request: DevelopmentRequest,\n ): Promise<DevelopmentRequestWorkLink[]> {\n return withTenant({ tenantId: request.tenantId }, () =>\n this.links.list({\n where: { requestId: request.id },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n async triage(\n request: DevelopmentRequest,\n input: {\n decision: DevelopmentTriageDecision;\n reason: string;\n actorRef: string;\n mergeIntoRequestId?: string;\n split?: Array<{ description: string; type?: string }>;\n },\n ): Promise<{\n request: DevelopmentRequest;\n links: DevelopmentRequestWorkLink[];\n splitRequests: DevelopmentRequest[];\n }> {\n if (!input.reason.trim()) throw new Error('Triage reason is required.');\n requiredId(request.id, 'Development Request');\n const createdLinks: DevelopmentRequestWorkLink[] = [];\n const splitRequests: DevelopmentRequest[] = [];\n\n if (input.decision === 'accept') {\n const existing = await this.linksFor(request);\n if (existing.length > 0) createdLinks.push(...existing);\n else {\n if (!this.workAdapter)\n throw new Error(\n 'DevelopmentWorkAdapter is required to accept requests.',\n );\n const work = await this.workAdapter.createWorkItem({\n request,\n idempotencyKey: `development-request:${request.id}`,\n });\n createdLinks.push(await this.linkWork(request, work));\n }\n if (request.status !== 'planned')\n await this.transition(request, 'planned', input.actorRef, input.reason);\n }\n\n if (input.decision === 'decline' && request.status !== 'declined')\n await this.transition(request, 'declined', input.actorRef, input.reason);\n\n if (input.decision === 'merge') {\n if (!input.mergeIntoRequestId)\n throw new Error('mergeIntoRequestId is required.');\n if (input.mergeIntoRequestId === request.id)\n throw new Error('A Development Request cannot be merged into itself.');\n const target = await withTenant({ tenantId: request.tenantId }, () =>\n this.requests.get({ id: input.mergeIntoRequestId }),\n );\n if (!target || target.projectId !== request.projectId)\n throw new Error(\n 'Merge target must be a Development Request in the same project and tenant.',\n );\n createdLinks.push(\n await this.linkWork(request, {\n type: '@happyvertical/smrt-projects:DevelopmentRequest',\n id: input.mergeIntoRequestId,\n canonicalStatus: 'merged',\n metadata: { reason: input.reason },\n }),\n );\n if (request.status !== 'triaged')\n await this.transition(request, 'triaged', input.actorRef, input.reason);\n }\n\n if (input.decision === 'split') {\n if (!input.split?.length)\n throw new Error('At least one split request is required.');\n const parts = input.split.map((part) => {\n const description = part.description.trim();\n if (!description)\n throw new Error('Split request description is required.');\n return { description, type: part.type ?? request.type };\n });\n const origin = `split:${request.id}`;\n const unmatchedExisting = await withTenant(\n { tenantId: request.tenantId },\n () =>\n this.requests.list({\n where: {\n tenantId: request.tenantId,\n projectId: request.projectId,\n integrationId: request.integrationId,\n origin,\n },\n orderBy: 'createdAt ASC',\n }),\n );\n for (const { description, type } of parts) {\n const existingIndex = unmatchedExisting.findIndex(\n (candidate) =>\n candidate.description.trim() === description &&\n candidate.type === type &&\n candidate.requesterId === request.requesterId &&\n candidate.participantId === request.participantId &&\n candidate.visibility === request.visibility,\n );\n if (existingIndex >= 0) {\n splitRequests.push(unmatchedExisting.splice(existingIndex, 1)[0]);\n } else {\n splitRequests.push(\n await this.requests.createManaged({\n tenantId: request.tenantId,\n projectId: request.projectId,\n integrationId: request.integrationId,\n requesterId: request.requesterId,\n participantId: request.participantId || undefined,\n type,\n description,\n evidence: request.getEvidence(),\n visibility: request.visibility,\n origin,\n discussion: input.reason,\n }),\n );\n }\n }\n if (request.status !== 'triaged')\n await this.transition(request, 'triaged', input.actorRef, input.reason);\n }\n\n return { request, links: createdLinks, splitRequests };\n }\n\n async syncWorkStatus(\n link: DevelopmentRequestWorkLink,\n ): Promise<DevelopmentRequest> {\n if (!this.workAdapter)\n throw new Error(\n 'DevelopmentWorkAdapter is required to project board status.',\n );\n const work = await this.workAdapter.getWorkItem(link);\n link.canonicalStatus = work.canonicalStatus;\n link.metadata = JSON.stringify(work.metadata ?? {});\n link.lastProjectedAt = new Date();\n await withTenant({ tenantId: link.tenantId }, () => link.save());\n const request = await withTenant({ tenantId: link.tenantId }, () =>\n this.requests.get({ id: link.requestId }),\n );\n if (!request)\n throw new Error(`Development Request ${link.requestId} not found.`);\n const requestLinks = await this.linksFor(request);\n const completed = requestLinks.every((item) =>\n ['done', 'closed', 'completed', 'deployed'].includes(\n item.canonicalStatus.toLowerCase(),\n ),\n );\n const nextStatus = completed ? 'completed' : 'in_progress';\n if (request.status !== nextStatus)\n await this.transition(\n request,\n nextStatus,\n 'system',\n `Canonical work status: ${work.canonicalStatus}`,\n );\n return request;\n }\n\n private async transition(\n request: DevelopmentRequest,\n status: 'triaged' | 'planned' | 'in_progress' | 'completed' | 'declined',\n actorRef: string,\n reason: string,\n ): Promise<void> {\n const updated = await this.requests.transitionStatus(\n request.tenantId,\n requiredId(request.id, 'Development Request'),\n { status, actorType: 'system', actorId: actorRef, note: reason },\n );\n request.status = updated.status;\n }\n\n private async linkWork(\n request: DevelopmentRequest,\n work: DevelopmentWorkItem,\n ): Promise<DevelopmentRequestWorkLink> {\n const existing = (\n await withTenant({ tenantId: request.tenantId }, () =>\n this.links.list({\n where: {\n requestId: request.id,\n workItemType: work.type,\n workItemId: work.id,\n },\n limit: 1,\n }),\n )\n )[0];\n if (existing) return existing;\n const link = await withTenant({ tenantId: request.tenantId }, () =>\n this.links.create({\n tenantId: request.tenantId,\n requestId: requiredId(request.id, 'Development Request'),\n workItemType: work.type,\n workItemId: work.id,\n canonicalStatus: work.canonicalStatus,\n providerRef: work.providerRef ?? '',\n metadata: JSON.stringify(work.metadata ?? {}),\n lastProjectedAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => link.save());\n return link;\n }\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport {\n ServiceChargeSnapshotCollection,\n ServiceCompensationSnapshotCollection,\n type ServiceTimeEntry,\n ServiceTimeEntryCollection,\n} from '../models/service-evidence.js';\nimport type {\n ServiceEvidence,\n ServiceParticipantKind,\n ServiceTimeEntrySource,\n} from '../types.js';\n\nexport interface RecordServiceTimeInput {\n tenantId?: string | null;\n caseId?: string | null;\n workRefType?: string | null;\n workRefId?: string | null;\n specialistId?: string | null;\n participantKind: ServiceParticipantKind;\n participantProfileId?: string | null;\n agentRef?: string;\n source: ServiceTimeEntrySource;\n description: string;\n startedAt?: Date | null;\n endedAt?: Date | null;\n durationSeconds?: number;\n evidence?: ServiceEvidence[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CommercialSnapshot {\n /**\n * Integer minor units of `currency` — `$19.99` is `1999` (#2401).\n *\n * Written straight into `ServiceChargeSnapshot.amount` /\n * `ServiceCompensationSnapshot.amount`, which are INTEGER columns, so a\n * resolver that returns major units corrupts the snapshot silently on SQLite\n * and fails with `22P02` on PostgreSQL.\n */\n amount: number;\n currency?: string;\n version: string;\n strategy?: string;\n terms: Record<string, unknown>;\n sourceRef?: string;\n}\n\nexport interface ServiceCommercialResolver {\n priceClient(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n compensateProvider(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n}\n\nexport class ServiceEvidenceService {\n constructor(\n private readonly entries: ServiceTimeEntryCollection,\n private readonly charges: ServiceChargeSnapshotCollection,\n private readonly compensation: ServiceCompensationSnapshotCollection,\n private readonly commercial?: ServiceCommercialResolver,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n commercial?: ServiceCommercialResolver,\n ): Promise<ServiceEvidenceService> {\n const [entries, charges, compensation] = await Promise.all([\n ServiceTimeEntryCollection.create(options),\n ServiceChargeSnapshotCollection.create(options),\n ServiceCompensationSnapshotCollection.create(options),\n ]);\n return new ServiceEvidenceService(\n entries,\n charges,\n compensation,\n commercial,\n );\n }\n\n async record(input: RecordServiceTimeInput): Promise<ServiceTimeEntry> {\n if (!input.caseId && !(input.workRefType && input.workRefId))\n throw new Error('Service time requires a case or work reference.');\n if (Boolean(input.workRefType) !== Boolean(input.workRefId))\n throw new Error('workRefType and workRefId must be provided together.');\n if (input.participantKind === 'human' && !input.participantProfileId)\n throw new Error('Human service time requires participantProfileId.');\n if (input.participantKind === 'agent' && !input.agentRef)\n throw new Error('Agent service time requires agentRef.');\n if (input.source === 'timer' && (!input.startedAt || !input.endedAt))\n throw new Error('Timer service time requires startedAt and endedAt.');\n if (input.startedAt && input.endedAt && input.startedAt >= input.endedAt)\n throw new Error('Service time startedAt must be before endedAt.');\n const duration =\n input.durationSeconds ??\n (input.startedAt && input.endedAt\n ? Math.round(\n (input.endedAt.getTime() - input.startedAt.getTime()) / 1000,\n )\n : 0);\n if (!Number.isInteger(duration) || duration <= 0)\n throw new Error(\n 'Service time durationSeconds must be a positive integer.',\n );\n const entry = await this.entries.create({\n ...input,\n durationSeconds: duration,\n evidence: JSON.stringify(input.evidence ?? []),\n metadata: JSON.stringify(input.metadata ?? {}),\n status: 'draft',\n submittedAt: null,\n submittedByProfileId: null,\n approvedAt: null,\n approvedByProfileId: null,\n approvalPath: '',\n rejectedAt: null,\n rejectedByProfileId: null,\n rejectionReason: '',\n correctionOfId: null,\n });\n await entry.save();\n return entry;\n }\n\n async submit(\n entry: ServiceTimeEntry,\n profileId?: string,\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'draft' && entry.status !== 'rejected')\n throw new Error('Only draft or rejected service time may be submitted.');\n entry.status = 'submitted';\n entry.submittedAt = new Date();\n entry.submittedByProfileId = profileId ?? null;\n return entry.save();\n }\n\n async approve(\n entry: ServiceTimeEntry,\n options: { actorProfileId?: string; approvalPath: string },\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'submitted' && entry.status !== 'approved')\n throw new Error(\n 'Only submitted service time or an incomplete approval may be approved.',\n );\n if (!this.commercial)\n throw new Error(\n 'A ServiceCommercialResolver is required to approve service time.',\n );\n const timeEntryId = entry.id;\n if (!timeEntryId)\n throw new Error('ServiceTimeEntry must be saved before approval.');\n const existingCharge = (\n await this.charges.list({ where: { timeEntryId }, limit: 1 })\n )[0];\n const existingCompensation = (\n await this.compensation.list({ where: { timeEntryId }, limit: 1 })\n )[0];\n if (entry.status === 'approved' && existingCharge && existingCompensation)\n return entry;\n\n // Commit approval before either commercial resolver runs. The subscription\n // resolver creates an approved ClientCharge as part of priceClient(), so a\n // failed approval must never leave billable spend behind.\n if (entry.status === 'submitted') {\n entry.status = 'approved';\n entry.approvedAt = new Date();\n entry.approvedByProfileId = options.actorProfileId ?? null;\n entry.approvalPath = options.approvalPath;\n await entry.save();\n }\n const provider = existingCompensation\n ? null\n : await this.commercial.compensateProvider(entry);\n if (provider) {\n const snapshotId = await deterministicSnapshotId(\n 'service-compensation-snapshot',\n timeEntryId,\n );\n try {\n await this.compensation.create({\n id: snapshotId,\n tenantId: entry.tenantId,\n timeEntryId,\n amount: provider.amount,\n currency: provider.currency ?? 'USD',\n termsVersion: provider.version,\n rateSnapshot: JSON.stringify(provider.terms),\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent =\n (await this.compensation.get(snapshotId)) ??\n (\n await this.compensation.list({\n where: { timeEntryId },\n limit: 1,\n })\n )[0];\n if (!concurrent) throw error;\n }\n }\n const client = existingCharge\n ? null\n : await this.commercial.priceClient(entry);\n if (client) {\n const snapshotId = await deterministicSnapshotId(\n 'service-charge-snapshot',\n timeEntryId,\n );\n try {\n await this.charges.create({\n id: snapshotId,\n tenantId: entry.tenantId,\n timeEntryId,\n amount: client.amount,\n currency: client.currency ?? 'USD',\n pricingVersion: client.version,\n strategy: client.strategy ?? '',\n rateSnapshot: JSON.stringify(client.terms),\n sourceChargeRef: client.sourceRef ?? '',\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent =\n (await this.charges.get(snapshotId)) ??\n (\n await this.charges.list({\n where: { timeEntryId },\n limit: 1,\n })\n )[0];\n if (!concurrent) throw error;\n }\n }\n return entry;\n }\n\n async correct(\n entry: ServiceTimeEntry,\n input: RecordServiceTimeInput,\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'approved')\n throw new Error('Only approved service time may be corrected.');\n if (input.tenantId !== undefined && input.tenantId !== entry.tenantId) {\n throw new Error(\n 'Service time corrections must remain in the original tenant.',\n );\n }\n const correction = await this.record({\n ...input,\n tenantId: entry.tenantId,\n });\n correction.correctionOfId = entry.id ?? null;\n await correction.save();\n entry.status = 'corrected';\n await entry.save();\n return correction;\n }\n}\n\nasync function deterministicSnapshotId(\n kind: string,\n timeEntryId: string,\n): Promise<string> {\n const bytes = new TextEncoder().encode(JSON.stringify([kind, timeEntryId]));\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));\n const uuid = digest.slice(0, 16);\n uuid[6] = (uuid[6] & 0x0f) | 0x50;\n uuid[8] = (uuid[8] & 0x3f) | 0x80;\n const hex = Array.from(uuid, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { CommercialUsageService } from '@happyvertical/smrt-subscriptions';\nimport type { ServiceTimeEntry } from '../models/service-evidence.js';\nimport type {\n CommercialSnapshot,\n ServiceCommercialResolver,\n} from './service-evidence-service.js';\n\nexport interface ProviderCompensationResolver {\n compensate(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n}\n\n/** Bridges shared Professional Service evidence to #1925's effective pricing. */\nexport class SubscriptionServiceCommercialResolver\n implements ServiceCommercialResolver\n{\n constructor(\n private readonly usage: CommercialUsageService,\n private readonly provider: ProviderCompensationResolver,\n ) {}\n\n static async create(\n options: SmrtClassOptions,\n provider: ProviderCompensationResolver,\n ): Promise<SubscriptionServiceCommercialResolver> {\n return new SubscriptionServiceCommercialResolver(\n await CommercialUsageService.create(options),\n provider,\n );\n }\n\n async priceClient(entry: ServiceTimeEntry): Promise<CommercialSnapshot> {\n if (!entry.id || !entry.tenantId)\n throw new Error(\n 'Saved tenant-scoped ServiceTimeEntry is required for client pricing.',\n );\n const at = entry.endedAt ?? entry.startedAt ?? new Date();\n const metadata = entry.getMetadata();\n const usageEvent = await this.usage.record({\n tenantId: entry.tenantId,\n metricKey: 'duration.seconds',\n quantity: entry.durationSeconds,\n windowStart: at,\n windowEnd: at,\n source: 'service-time-entry',\n sourceId: entry.id,\n projectId:\n typeof metadata.projectId === 'string' ? metadata.projectId : undefined,\n workRefType:\n entry.workRefType ??\n (entry.caseId ? '@happyvertical/smrt-support:SupportCase' : undefined),\n workRefId: entry.workRefId ?? entry.caseId ?? undefined,\n provider: entry.participantKind,\n dimensions: {\n serviceKey: 'professional-services',\n source: entry.source,\n specialistId: entry.specialistId,\n agentRef: entry.agentRef || undefined,\n },\n });\n if (!usageEvent.id)\n throw new Error('Professional Service usage event was not persisted.');\n const charge = await this.usage.price({\n usageEventId: usageEvent.id,\n approved: true,\n at,\n });\n const snapshot = charge.getPricingSnapshot();\n return {\n amount: charge.amount,\n currency: charge.currency,\n version: String(snapshot.ruleKey ?? charge.pricingRuleId),\n strategy: String(snapshot.strategy ?? ''),\n terms: snapshot,\n sourceRef: `@happyvertical/smrt-subscriptions:ClientCharge:${charge.id}`,\n };\n }\n\n compensateProvider(entry: ServiceTimeEntry): Promise<CommercialSnapshot> {\n return this.provider.compensate(entry);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/models/DevelopmentRequestHistory.ts","../src/collections/DevelopmentRequestHistories.ts","../src/models/DevelopmentRequest.ts","../src/collections/DevelopmentRequests.ts","../src/collections/Issues.ts","../src/models/ProjectIntegrationAudit.ts","../src/collections/ProjectIntegrationAudits.ts","../src/models/ProjectIntegration.ts","../src/collections/ProjectIntegrations.ts","../src/models/Project.ts","../src/collections/Projects.ts","../src/collections/PullRequests.ts","../src/models/Repository.ts","../src/collections/Repositories.ts","../src/models/delivery-control-plane.ts","../src/services/delivery-service.ts","../src/services/project-board-service.ts","../src/managed-client.ts","../src/migrations/moneyMinorUnits.ts","../src/models/Comment.ts","../src/models/Label.ts","../src/models/service-evidence.ts","../src/services/assistance-request-service.ts","../src/services/development-request-service.ts","../src/services/service-evidence-service.ts","../src/services/subscription-commercial-resolver.ts"],"sourcesContent":["/**\n * Self-registers this package's build-time manifest before any @smrt() decorator\n * in the package fires. Fixes issue #1132: in consumer runtimes (tsx, SvelteKit\n * SSR, plain `vite dev`) the decorator's synchronous manifest lookup previously\n * missed because no step populated the global manifest cache — classes got\n * registered with zero fields and `save()` / `toJSON()` silently dropped every\n * declared property.\n *\n * Import this module as the first statement in `src/index.ts` so its top-level\n * side effect runs ahead of any class module's @smrt() decorator.\n *\n * Silent no-op in dev/test, where the vitest plugin already populates manifests\n * via a different path. Only needs to succeed in the published dist output.\n *\n * @see https://github.com/happyvertical/smrt/issues/1132\n */\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\n// During library builds, smrtPlugin replaces this entire module with generated\n// code that embeds the scanned manifest inline (#1506/#1507) — published dists\n// never resolve this URL, so downstream bundlers cannot break registration by\n// relocating the compiled module away from dist/manifest.json. The runtime\n// lookup below is the fallback for source-mode runs without that transform.\nObjectRegistry.registerPackageManifest(\n new URL('./manifest.json', import.meta.url),\n);\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { DevelopmentRequestStatus } from '../types';\n\nexport interface DevelopmentRequestHistoryOptions extends SmrtObjectOptions {\n tenantId?: string;\n requestId?: string;\n fromStatus?: string;\n toStatus?: DevelopmentRequestStatus;\n actorType?: 'integration' | 'participant' | 'system';\n actorId?: string;\n note?: string | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_request_histories',\n api: false,\n mcp: false,\n cli: false,\n})\nexport class DevelopmentRequestHistory extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n @foreignKey('DevelopmentRequest', { required: true })\n requestId: string = '';\n\n fromStatus: string = '';\n\n toStatus: DevelopmentRequestStatus = 'submitted';\n\n actorType: 'integration' | 'participant' | 'system' = 'system';\n\n actorId: string = '';\n\n note: string | null = null;\n\n constructor(options: DevelopmentRequestHistoryOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.fromStatus !== undefined) this.fromStatus = options.fromStatus;\n if (options.toStatus !== undefined) this.toStatus = options.toStatus;\n if (options.actorType !== undefined) this.actorType = options.actorType;\n if (options.actorId !== undefined) this.actorId = options.actorId;\n if (options.note !== undefined) this.note = options.note;\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestHistory } from '../models/DevelopmentRequestHistory';\n\nexport class DevelopmentRequestHistoryCollection extends SmrtCollection<DevelopmentRequestHistory> {\n static readonly _itemClass = DevelopmentRequestHistory;\n\n async listForRequest(\n tenantId: string,\n requestId: string,\n ): Promise<DevelopmentRequestHistory[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, requestId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n}\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n DevelopmentRequestEvidence,\n DevelopmentRequestOrigin,\n DevelopmentRequestStatus,\n DevelopmentRequestType,\n DevelopmentRequestVisibility,\n} from '../types';\n\nexport interface DevelopmentRequestOptions extends SmrtObjectOptions {\n tenantId?: string;\n projectId?: string;\n integrationId?: string;\n requesterId?: string;\n participantId?: string;\n type?: DevelopmentRequestType;\n description?: string;\n evidence?: DevelopmentRequestEvidence[] | string;\n visibility?: DevelopmentRequestVisibility;\n origin?: DevelopmentRequestOrigin;\n discussion?: string;\n status?: DevelopmentRequestStatus;\n}\n\nfunction parseEvidence(raw: unknown): DevelopmentRequestEvidence[] {\n if (!raw) return [];\n if (Array.isArray(raw)) return normalizeEvidence(raw);\n if (typeof raw !== 'string') return [];\n\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? normalizeEvidence(parsed) : [];\n } catch {\n return [];\n }\n}\n\nfunction normalizeEvidence(raw: unknown[]): DevelopmentRequestEvidence[] {\n return raw\n .filter(\n (entry): entry is Record<string, unknown> =>\n !!entry && typeof entry === 'object' && !Array.isArray(entry),\n )\n .map((entry) => ({\n url: typeof entry.url === 'string' ? entry.url.trim() : '',\n ...(typeof entry.label === 'string' && entry.label.trim().length > 0\n ? { label: entry.label.trim() }\n : {}),\n }))\n .filter((entry) => entry.url.length > 0);\n}\n\nfunction stringifyEvidence(items: DevelopmentRequestEvidence[]): string {\n return JSON.stringify(\n items.map((item) => ({\n url: item.url.trim(),\n ...(item.label?.trim() ? { label: item.label.trim() } : {}),\n })),\n );\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_requests',\n // Managed requests must flow through ManagedProjectClient so capability,\n // integration, project, and requester scoping cannot be bypassed.\n api: false,\n mcp: false,\n cli: false,\n})\nexport class DevelopmentRequest extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n projectId: string = '';\n\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n\n requesterId: string = '';\n\n participantId: string = '';\n\n type: DevelopmentRequestType = 'feature';\n\n description: string = '';\n\n evidence: string = '[]';\n\n visibility: DevelopmentRequestVisibility = 'requester';\n\n origin: DevelopmentRequestOrigin = 'managed-app';\n\n discussion: string = '';\n\n status: DevelopmentRequestStatus = 'submitted';\n\n constructor(options: DevelopmentRequestOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.integrationId !== undefined)\n this.integrationId = options.integrationId;\n if (options.requesterId !== undefined)\n this.requesterId = options.requesterId;\n if (options.participantId !== undefined)\n this.participantId = options.participantId;\n if (options.type !== undefined) this.type = options.type;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.evidence !== undefined) this.setEvidence(options.evidence);\n if (options.visibility !== undefined) this.visibility = options.visibility;\n if (options.origin !== undefined) this.origin = options.origin;\n if (options.discussion !== undefined) this.discussion = options.discussion;\n if (options.status !== undefined) this.status = options.status;\n }\n\n public override async initialize(): Promise<this> {\n await super.initialize();\n if ((this as unknown as { evidence?: unknown }).evidence == null) {\n this.evidence = '[]';\n } else if (typeof this.evidence !== 'string') {\n this.setEvidence(\n this.evidence as unknown as DevelopmentRequestEvidence[],\n );\n }\n return this;\n }\n\n getEvidence(): DevelopmentRequestEvidence[] {\n return parseEvidence(this.evidence);\n }\n\n setEvidence(value: DevelopmentRequestEvidence[] | string): void {\n this.evidence =\n typeof value === 'string' ? value : stringifyEvidence(value);\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequest } from '../models/DevelopmentRequest';\nimport type {\n DevelopmentRequestStatus,\n DevelopmentRequestTransitionInput,\n ManagedDevelopmentRequestCreateInput,\n} from '../types';\nimport { DevelopmentRequestHistoryCollection } from './DevelopmentRequestHistories';\n\nexport class DevelopmentRequestCollection extends SmrtCollection<DevelopmentRequest> {\n static readonly _itemClass = DevelopmentRequest;\n\n async createManaged(\n input: {\n tenantId: string;\n projectId: string;\n integrationId: string;\n } & ManagedDevelopmentRequestCreateInput,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId: input.tenantId }, () =>\n this.create({\n tenantId: input.tenantId,\n projectId: input.projectId,\n integrationId: input.integrationId,\n requesterId: input.requesterId,\n participantId: input.participantId ?? '',\n type: input.type,\n description: input.description,\n evidence: JSON.stringify(input.evidence ?? []),\n visibility: input.visibility ?? 'requester',\n origin: input.origin ?? 'managed-app',\n discussion: input.discussion ?? '',\n status: 'submitted',\n }),\n );\n await withTenant({ tenantId: input.tenantId }, () => request.save());\n await this.recordHistory(request, {\n status: 'submitted',\n actorType: 'integration',\n actorId: input.integrationId,\n note: input.discussion ?? '',\n });\n return request;\n }\n\n async listByIntegrationRequester(input: {\n tenantId: string;\n integrationId: string;\n requesterId: string;\n }): Promise<DevelopmentRequest[]> {\n return withTenant({ tenantId: input.tenantId }, () =>\n this.list({\n where: {\n tenantId: input.tenantId,\n integrationId: input.integrationId,\n requesterId: input.requesterId,\n },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n async transitionStatus(\n tenantId: string,\n requestId: string,\n transition: DevelopmentRequestTransitionInput,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: requestId, tenantId } }),\n );\n if (!request) {\n throw new Error(`DevelopmentRequest ${requestId} not found`);\n }\n const fromStatus = request.status;\n request.status = transition.status;\n await withTenant({ tenantId: request.tenantId }, () => request.save());\n await this.recordHistory(request, transition, fromStatus);\n return request;\n }\n\n async listForProject(\n tenantId: string,\n projectId: string,\n status?: DevelopmentRequestStatus,\n ): Promise<DevelopmentRequest[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: status\n ? { tenantId, projectId, status }\n : { tenantId, projectId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n private async recordHistory(\n request: DevelopmentRequest,\n transition: DevelopmentRequestTransitionInput,\n fromStatus = '',\n ): Promise<void> {\n const histories = await DevelopmentRequestHistoryCollection.create(\n this.options,\n );\n const entry = await withTenant({ tenantId: request.tenantId }, () =>\n histories.create({\n tenantId: request.tenantId,\n requestId: request.id as string,\n fromStatus,\n toStatus: transition.status,\n actorType: transition.actorType,\n actorId: transition.actorId ?? '',\n note: transition.note ?? '',\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => entry.save());\n }\n}\n","/**\n * IssueCollection - Collection manager for Issue objects\n *\n * Provides querying and discovery operations for Issue entities.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Issue } from '../models/Issue';\nimport type { Repository } from '../models/Repository';\nimport type { SearchFilters } from '../types';\n\nexport class IssueCollection extends SmrtCollection<Issue> {\n static readonly _itemClass = Issue;\n\n /**\n * Discover issues from a repository and sync to database\n *\n * This method:\n * 1. Fetches issues from the provider via SDK\n * 2. Creates/updates SMRT Issue records in the database\n * 3. Returns the synced Issue objects\n *\n * @param options - Discovery options\n * @returns Array of Issue objects\n */\n async discover(options: {\n repository: Repository;\n filters?: SearchFilters;\n }): Promise<Issue[]> {\n const { repository, filters } = options;\n const repositoryId = repository.id ?? undefined;\n\n if (!repositoryId) {\n throw new Error('Repository must be saved before discovering issues');\n }\n\n const repoClient = await repository.getClient();\n\n // Fetch issues from provider\n const remoteIssues = await repoClient.searchIssues('', filters);\n\n const issues: Issue[] = [];\n\n for (const remote of remoteIssues) {\n // Find existing issue by repository + number\n let issue = await this.findOne({\n where: {\n repositoryId,\n number: remote.number,\n },\n });\n\n if (!issue) {\n // Create new issue\n issue = await this.create({\n repositoryId,\n number: remote.number,\n nodeId: remote.id,\n title: remote.title,\n body: remote.body,\n state: remote.state,\n author: remote.author.login,\n labels: remote.labels.map((l) => l.name),\n assignees: remote.assignees.map((a) => a.login),\n commentsCount: remote.commentsCount,\n lastSyncedAt: new Date(),\n });\n } else {\n // Update existing issue\n issue.nodeId = remote.id;\n issue.title = remote.title;\n issue.body = remote.body;\n issue.state = remote.state;\n issue.author = remote.author.login;\n issue.labels = remote.labels.map((l) => l.name);\n issue.assignees = remote.assignees.map((a) => a.login);\n issue.commentsCount = remote.commentsCount;\n issue.lastSyncedAt = new Date();\n }\n\n await issue.save();\n issues.push(issue);\n }\n\n return issues;\n }\n\n /**\n * Find issues by repository\n *\n * @param repositoryId - Repository ID\n * @returns Array of issues\n */\n async findByRepository(repositoryId: string): Promise<Issue[]> {\n return await this.list({\n where: { repositoryId },\n });\n }\n\n /**\n * Find open issues\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of open issues\n */\n async findOpen(repositoryId?: string): Promise<Issue[]> {\n const where: Record<string, unknown> = { state: 'open' };\n if (repositoryId) {\n where.repositoryId = repositoryId;\n }\n return await this.list({ where });\n }\n\n /**\n * Find issues by label\n *\n * @param label - Label name\n * @param repositoryId - Optional repository filter\n * @returns Array of issues with the label\n */\n async findByLabel(label: string, repositoryId?: string): Promise<Issue[]> {\n const issues = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n // Filter by label (JSON array search)\n return issues.filter((issue) => issue.labels.includes(label));\n }\n\n /**\n * Find issues by assignee\n *\n * @param assignee - Assignee login\n * @param repositoryId - Optional repository filter\n * @returns Array of issues assigned to the user\n */\n async findByAssignee(\n assignee: string,\n repositoryId?: string,\n ): Promise<Issue[]> {\n const issues = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n // Filter by assignee (JSON array search)\n return issues.filter((issue) => issue.assignees.includes(assignee));\n }\n\n /**\n * Find issues needing review (AI-powered)\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of issues that need review\n */\n async findNeedingReview(repositoryId?: string): Promise<Issue[]> {\n const openIssues = await this.findOpen(repositoryId);\n const needingReview: Issue[] = [];\n\n for (const issue of openIssues) {\n if (await issue.needsReview()) {\n needingReview.push(issue);\n }\n }\n\n return needingReview;\n }\n\n /**\n * Find issue by number in a repository\n *\n * @param repositoryId - Repository ID\n * @param number - Issue number\n * @returns Issue or null\n */\n async findByNumber(\n repositoryId: string,\n number: number,\n ): Promise<Issue | null> {\n const results = await this.list({\n where: { repositoryId, number },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Get issues with unincorporated feedback\n *\n * Issues that have comments but haven't had feedback incorporated\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of issues\n */\n async findWithUnincorporatedFeedback(\n repositoryId?: string,\n ): Promise<Issue[]> {\n const issues = await this.findOpen(repositoryId);\n\n return issues.filter(\n (issue) => issue.commentsCount > 0 && issue.synthesisCount === 0,\n );\n }\n\n /**\n * Batch sync issues from repository\n *\n * @param repository - Repository to sync from\n * @param options - Sync options\n * @returns Array of synced issues\n */\n async batchSync(\n repository: Repository,\n options: { force?: boolean } = {},\n ): Promise<Issue[]> {\n const issues = await this.findByRepository(repository.id as string);\n const synced: Issue[] = [];\n\n for (const issue of issues) {\n await issue.sync(options);\n synced.push(issue);\n }\n\n return synced;\n }\n\n /**\n * Find issues by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of issues for the tenant\n */\n async findByTenant(tenantId: string): Promise<Issue[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global issues (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global issues\n */\n async findGlobal(): Promise<Issue[]> {\n return queryGlobal<Issue>(this);\n }\n\n /**\n * Find issues for a tenant plus all global issues.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global issues\n */\n async findWithGlobals(tenantId: string): Promise<Issue[]> {\n return queryWithGlobals<Issue>(this, tenantId, 'Issue.findWithGlobals');\n }\n}\n","import {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { ProjectIntegrationAuditAction } from '../types';\n\nexport interface ProjectIntegrationAuditOptions extends SmrtObjectOptions {\n tenantId?: string;\n integrationId?: string;\n action?: ProjectIntegrationAuditAction;\n note?: string | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_integration_audits',\n api: false,\n mcp: false,\n cli: false,\n})\nexport class ProjectIntegrationAudit extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n\n action: ProjectIntegrationAuditAction = 'created';\n\n note: string | null = null;\n\n constructor(options: ProjectIntegrationAuditOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.integrationId !== undefined)\n this.integrationId = options.integrationId;\n if (options.action !== undefined) this.action = options.action;\n if (options.note !== undefined) this.note = options.note;\n }\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegrationAudit } from '../models/ProjectIntegrationAudit';\n\nexport class ProjectIntegrationAuditCollection extends SmrtCollection<ProjectIntegrationAudit> {\n static readonly _itemClass = ProjectIntegrationAudit;\n\n async listForIntegration(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegrationAudit[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, integrationId },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n}\n","import {\n field,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ProjectIntegrationCapability,\n ProjectIntegrationStatus,\n} from '../types';\n\nexport interface ProjectIntegrationOptions extends SmrtObjectOptions {\n tenantId?: string;\n projectId?: string;\n name?: string;\n credentialHash?: string;\n capabilities?: ProjectIntegrationCapability[];\n status?: ProjectIntegrationStatus;\n revokedAt?: Date | null;\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_integrations',\n conflictColumns: ['tenant_id', 'project_id', 'name'],\n api: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n})\nexport class ProjectIntegration extends SmrtObject {\n @tenantId()\n tenantId: string = '';\n\n projectId: string = '';\n\n name: string = '';\n\n @field({ sensitive: true })\n credentialHash: string = '';\n\n capabilities: ProjectIntegrationCapability[] = [];\n\n status: ProjectIntegrationStatus = 'active';\n\n revokedAt: Date | null = null;\n\n constructor(options: ProjectIntegrationOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.name !== undefined) this.name = options.name;\n if (options.credentialHash !== undefined)\n this.credentialHash = options.credentialHash;\n if (options.capabilities !== undefined)\n this.capabilities = [...options.capabilities];\n if (options.status !== undefined) this.status = options.status;\n if (options.revokedAt !== undefined) this.revokedAt = options.revokedAt;\n }\n\n hasCapability(capability: ProjectIntegrationCapability): boolean {\n return this.capabilities.includes(capability);\n }\n\n isActive(): boolean {\n return this.status === 'active' && this.revokedAt === null;\n }\n}\n","import { createHash, randomBytes } from 'node:crypto';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegration } from '../models/ProjectIntegration';\nimport type { ProjectIntegrationCapability } from '../types';\nimport { ProjectIntegrationAuditCollection } from './ProjectIntegrationAudits';\n\nexport class ProjectIntegrationCollection extends SmrtCollection<ProjectIntegration> {\n static readonly _itemClass = ProjectIntegration;\n\n async provision(input: {\n tenantId: string;\n projectId: string;\n name: string;\n capabilities: ProjectIntegrationCapability[];\n }): Promise<{ integration: ProjectIntegration; credential: string }> {\n const credential = issueProjectIntegrationCredential(input.tenantId);\n const integration = await withTenant({ tenantId: input.tenantId }, () =>\n this.create({\n tenantId: input.tenantId,\n projectId: input.projectId,\n name: input.name,\n capabilities: [...input.capabilities],\n credentialHash: hashProjectIntegrationCredential(credential),\n status: 'active',\n revokedAt: null,\n }),\n );\n await withTenant({ tenantId: input.tenantId }, () => integration.save());\n await this.recordAudit(integration, 'created');\n return { integration, credential };\n }\n\n async rotate(\n tenantId: string,\n integrationId: string,\n ): Promise<{ integration: ProjectIntegration; credential: string }> {\n const integration = await this.requireActive(tenantId, integrationId);\n const credential = issueProjectIntegrationCredential(integration.tenantId);\n integration.credentialHash = hashProjectIntegrationCredential(credential);\n await withTenant({ tenantId: integration.tenantId }, () =>\n integration.save(),\n );\n await this.recordAudit(integration, 'rotated');\n return { integration, credential };\n }\n\n async revoke(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await this.requireExisting(tenantId, integrationId);\n integration.status = 'revoked';\n integration.revokedAt = new Date();\n integration.credentialHash = '';\n await withTenant({ tenantId: integration.tenantId }, () =>\n integration.save(),\n );\n await this.recordAudit(integration, 'revoked');\n return integration;\n }\n\n async authenticate(credential: string): Promise<ProjectIntegration | null> {\n const tenantId = parseCredentialTenant(credential);\n if (!tenantId) return null;\n const credentialHash = hashProjectIntegrationCredential(credential);\n const integrations = await withTenant({ tenantId }, () =>\n this.list({ where: { tenantId, status: 'active' } }),\n );\n const integration = integrations.find(\n (candidate) => candidate.credentialHash === credentialHash,\n );\n return integration?.isActive() ? integration : null;\n }\n\n async listForProject(\n tenantId: string,\n projectId: string,\n ): Promise<ProjectIntegration[]> {\n return withTenant({ tenantId }, () =>\n this.list({\n where: { tenantId, projectId },\n orderBy: 'name ASC',\n }),\n );\n }\n\n async findActive(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration | null> {\n const integration = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: integrationId, tenantId } }),\n );\n return integration?.isActive() ? integration : null;\n }\n\n private async requireExisting(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await withTenant({ tenantId }, () =>\n this.findOne({ where: { id: integrationId, tenantId } }),\n );\n if (!integration) {\n throw new Error(`ProjectIntegration ${integrationId} not found`);\n }\n return integration;\n }\n\n private async requireActive(\n tenantId: string,\n integrationId: string,\n ): Promise<ProjectIntegration> {\n const integration = await this.requireExisting(tenantId, integrationId);\n if (!integration.isActive()) {\n throw new Error(`ProjectIntegration ${integrationId} is not active`);\n }\n return integration;\n }\n\n private async recordAudit(\n integration: ProjectIntegration,\n action: 'created' | 'rotated' | 'revoked',\n ): Promise<void> {\n const audits = await ProjectIntegrationAuditCollection.create(this.options);\n const entry = await withTenant({ tenantId: integration.tenantId }, () =>\n audits.create({\n tenantId: integration.tenantId,\n integrationId: integration.id as string,\n action,\n }),\n );\n await withTenant({ tenantId: integration.tenantId }, () => entry.save());\n }\n}\n\nexport function hashProjectIntegrationCredential(credential: string): string {\n return createHash('sha256').update(credential).digest('hex');\n}\n\nfunction issueProjectIntegrationCredential(tenantId: string): string {\n const tenant = Buffer.from(tenantId, 'utf8').toString('base64url');\n return `smrt_pi_${tenant}_${randomBytes(24).toString('hex')}`;\n}\n\nfunction parseCredentialTenant(credential: string): string | null {\n const match = /^smrt_pi_([A-Za-z0-9_-]+)_[a-f0-9]{48}$/.exec(credential);\n if (!match) return null;\n try {\n const tenantId = Buffer.from(match[1], 'base64url').toString('utf8');\n return tenantId.length > 0 ? tenantId : null;\n } catch {\n return null;\n }\n}\n","/**\n * Project model - SMRT wrapper for project board operations\n *\n * Provides persistent project tracking with provider-agnostic operations.\n * Uses @happyvertical/projects SDK for actual API calls.\n */\n\nimport { getProject } from '@happyvertical/projects';\nimport { getModuleConfig } from '@happyvertical/smrt-config';\nimport {\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { SYNC_THROTTLE_MS } from '../constants';\nimport type {\n IProject,\n ItemFilters,\n ProjectField,\n ProjectItem,\n ProjectProviderType,\n ProjectStatus,\n SDKProject,\n SyncOptions,\n} from '../types';\nimport type { Issue } from './Issue';\nimport type { PullRequest } from './PullRequest';\n\nexport interface ProjectOptions extends SmrtObjectOptions {\n projectId?: string;\n projectNumber?: number;\n title?: string;\n description?: string;\n owner?: string;\n url?: string;\n providerType?: ProjectProviderType;\n tokenConfigKey?: string;\n statuses?: ProjectStatus[];\n fields?: ProjectField[];\n statusFieldId?: string;\n statusOptions?: Record<string, string>;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get', 'create', 'update'] },\n mcp: { include: ['list', 'get', 'sync', 'addItem', 'updateItemStatus'] },\n // sync/addItem/updateItemStatus/listItems are operator commands invoked\n // in-process via the CLI; they intentionally aren't exposed over HTTP today.\n cli: {\n include: [\n 'list',\n 'get',\n 'sync',\n 'addItem',\n 'updateItemStatus',\n 'listItems',\n ],\n skipApiCheck: true,\n },\n})\nexport class Project extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Provider-specific project ID (e.g., GitHub GraphQL node ID)\n */\n projectId: string = '';\n\n /**\n * Human-readable project number\n */\n projectNumber: number = 0;\n\n /**\n * Project title\n */\n title: string = '';\n\n /**\n * Project description\n */\n description: string = '';\n\n /**\n * Project owner (organization or user)\n */\n owner: string = '';\n\n /**\n * Project URL\n */\n url: string = '';\n\n /**\n * Project provider type\n */\n providerType: ProjectProviderType = 'github';\n\n /**\n * Environment variable name or config key for token resolution\n */\n tokenConfigKey: string = 'GITHUB_TOKEN';\n\n /**\n * Available statuses (columns) in the project\n */\n statuses: ProjectStatus[] = [];\n\n /**\n * Custom fields defined in the project\n */\n fields: ProjectField[] = [];\n\n /**\n * Status field ID for GitHub Projects V2\n */\n statusFieldId: string = '';\n\n /**\n * Maps status name to option ID (for GitHub Projects V2)\n */\n statusOptions: Record<string, string> = {};\n\n /**\n * Last sync timestamp\n */\n lastSyncedAt: Date | null = null;\n\n /**\n * Transient: Cached project client (not persisted)\n */\n private _client?: IProject;\n\n constructor(options: ProjectOptions = {}) {\n super(options);\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.projectNumber !== undefined)\n this.projectNumber = options.projectNumber;\n if (options.title !== undefined) this.title = options.title;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.owner !== undefined) this.owner = options.owner;\n if (options.url !== undefined) this.url = options.url;\n if (options.providerType !== undefined)\n this.providerType = options.providerType;\n if (options.tokenConfigKey !== undefined)\n this.tokenConfigKey = options.tokenConfigKey;\n if (options.statuses !== undefined) this.statuses = options.statuses;\n if (options.fields !== undefined) this.fields = options.fields;\n if (options.statusFieldId !== undefined)\n this.statusFieldId = options.statusFieldId;\n if (options.statusOptions !== undefined)\n this.statusOptions = options.statusOptions;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Get the project client, resolving token from config\n *\n * @returns Project client for API operations\n * @throws Error if token cannot be resolved\n */\n async getClient(): Promise<IProject> {\n if (this._client) {\n return this._client;\n }\n\n // Resolve token from environment or config\n const token =\n process.env[this.tokenConfigKey] ||\n (getModuleConfig<Record<string, string>>('smrt-projects', {})[\n this.tokenConfigKey\n ] as string);\n\n if (!token) {\n throw new Error(\n `Token not found for key '${this.tokenConfigKey}'. ` +\n `Set the ${this.tokenConfigKey} environment variable or configure it in smrt.config.`,\n );\n }\n\n this._client = await getProject({\n type: this.providerType,\n projectId: this.projectId,\n token,\n statusFieldId: this.statusFieldId || undefined,\n statusOptions:\n Object.keys(this.statusOptions).length > 0\n ? this.statusOptions\n : undefined,\n });\n\n return this._client;\n }\n\n /**\n * Clear the cached client\n */\n clearClient(): void {\n this._client = undefined;\n }\n\n /**\n * Sync project metadata from the provider\n *\n * @param options - Sync options\n * @returns This project with updated fields\n */\n async sync(options: SyncOptions = {}): Promise<this> {\n // Check if we recently synced (within 5 minutes)\n if (\n !options.force &&\n this.lastSyncedAt &&\n Date.now() - this.lastSyncedAt.getTime() < SYNC_THROTTLE_MS\n ) {\n return this;\n }\n\n const client = await this.getClient();\n const projectData: SDKProject = await client.getProject();\n\n // Update fields from remote\n this.title = projectData.title;\n this.description = projectData.description || '';\n this.owner = projectData.owner;\n this.url = projectData.url;\n this.statuses = projectData.statuses;\n this.fields = projectData.fields;\n this.lastSyncedAt = new Date();\n\n await this.save();\n return this;\n }\n\n /**\n * Add an issue or PR to this project\n *\n * @param item - Issue or PullRequest to add\n * @returns Created ProjectItem\n */\n async addItem(item: Issue | PullRequest): Promise<ProjectItem> {\n if (!item.nodeId) {\n throw new Error('Item must have a nodeId (sync the item first)');\n }\n\n const client = await this.getClient();\n return await client.addItem(item.nodeId);\n }\n\n /**\n * Remove an item from this project\n *\n * @param itemId - Project item ID to remove\n */\n async removeItem(itemId: string): Promise<void> {\n const client = await this.getClient();\n await client.removeItem(itemId);\n }\n\n /**\n * Get a specific item from the project\n *\n * @param itemId - Project item ID\n * @returns ProjectItem or null\n */\n async getItem(itemId: string): Promise<ProjectItem | null> {\n const client = await this.getClient();\n return await client.getItem(itemId);\n }\n\n /**\n * List items in this project\n *\n * @param filters - Optional filters\n * @returns Array of ProjectItems\n */\n async listItems(filters?: ItemFilters): Promise<ProjectItem[]> {\n const client = await this.getClient();\n return await client.listItems(filters);\n }\n\n /**\n * Update an item's status (column)\n *\n * @param itemId - Project item ID\n * @param status - New status name\n */\n async updateItemStatus(itemId: string, status: string): Promise<void> {\n const client = await this.getClient();\n await client.updateItemStatus(itemId, status);\n }\n\n /**\n * Update an item's custom field\n *\n * @param itemId - Project item ID\n * @param fieldId - Field ID\n * @param value - New value\n */\n async updateItemField(\n itemId: string,\n fieldId: string,\n value: unknown,\n ): Promise<void> {\n const client = await this.getClient();\n await client.updateItemField(itemId, fieldId, value);\n }\n\n /**\n * Get available statuses\n *\n * @returns Array of status definitions\n */\n async getStatuses(): Promise<ProjectStatus[]> {\n if (this.statuses.length > 0) {\n return this.statuses;\n }\n\n const client = await this.getClient();\n this.statuses = await client.listStatuses();\n await this.save();\n return this.statuses;\n }\n\n /**\n * Get available fields\n *\n * @returns Array of field definitions\n */\n async getFields(): Promise<ProjectField[]> {\n if (this.fields.length > 0) {\n return this.fields;\n }\n\n const client = await this.getClient();\n this.fields = await client.listFields();\n await this.save();\n return this.fields;\n }\n\n /**\n * Get items in a specific status/column\n *\n * @param status - Status name\n * @returns Array of ProjectItems in that status\n */\n async getItemsByStatus(status: string): Promise<ProjectItem[]> {\n return await this.listItems({ status });\n }\n\n /**\n * Move an item to a new status\n *\n * @param item - Issue or PullRequest\n * @param status - Target status name\n */\n async moveItem(item: Issue | PullRequest, status: string): Promise<void> {\n // First, find the item in the project\n const items = await this.listItems();\n const projectItem = items.find((i) => i.contentId === item.nodeId);\n\n if (!projectItem) {\n throw new Error('Item not found in project');\n }\n\n await this.updateItemStatus(projectItem.id, status);\n }\n\n /**\n * AI-powered: Analyze project health and suggest improvements\n *\n * @returns Analysis of project status\n */\n async analyzeHealth(): Promise<string> {\n const items = await this.listItems();\n const statuses = await this.getStatuses();\n\n // Count items by status\n const statusCounts: Record<string, number> = {};\n for (const status of statuses) {\n statusCounts[status.name] = items.filter(\n (i) => i.status === status.name,\n ).length;\n }\n\n return await this.do(\n `Analyze the health of this project board and suggest improvements.\n\n Project: ${this.title}\n Description: ${this.description}\n\n Item distribution by status:\n ${Object.entries(statusCounts)\n .map(([status, count]) => `- ${status}: ${count} items`)\n .join('\\n')}\n\n Total items: ${items.length}\n\n Provide:\n 1. Overall health assessment\n 2. Potential bottlenecks\n 3. Suggestions for improvement`,\n // Title/description/status counts hand-rolled above; skip do()'s\n // object-data injection so the board context is not duplicated.\n { includeData: false },\n );\n }\n\n /**\n * Get project by title\n *\n * @param title - Project title\n * @param options - Additional options\n * @returns Project or null\n */\n static async getByTitle(\n title: string,\n options: SmrtObjectOptions = {},\n ): Promise<Project | null> {\n const { ProjectCollection } = await import('../collections/Projects');\n const collection = await ProjectCollection.create(options);\n return await collection.findByTitle(title);\n }\n}\n","/**\n * ProjectCollection - Collection manager for Project objects\n *\n * Provides querying and discovery operations for Project entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Project } from '../models/Project';\nimport type { ProjectProviderType } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class ProjectCollection extends SmrtCollection<Project> {\n static readonly _itemClass = Project;\n\n /**\n * Find project by title\n *\n * @param title - Project title\n * @returns Project or null\n */\n async findByTitle(title: string): Promise<Project | null> {\n const results = await this.list({\n where: { title },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find projects by owner\n *\n * @param owner - Project owner (organization or user)\n * @returns Array of projects\n */\n async findByOwner(owner: string): Promise<Project[]> {\n return await this.list({\n where: { owner },\n });\n }\n\n /**\n * Find projects by provider type\n *\n * @param providerType - Provider type\n * @returns Array of projects\n */\n async findByProvider(providerType: ProjectProviderType): Promise<Project[]> {\n return await this.list({\n where: { providerType },\n });\n }\n\n /**\n * Get or create a project by ID\n *\n * @param projectId - Provider-specific project ID\n * @param options - Additional options for creation\n * @returns Project (existing or newly created)\n */\n async getOrCreate(\n projectId: string,\n options: {\n title?: string;\n owner?: string;\n providerType?: ProjectProviderType;\n tokenConfigKey?: string;\n statusFieldId?: string;\n statusOptions?: Record<string, string>;\n } = {},\n ): Promise<Project> {\n let project = await this.findOne({\n where: { projectId },\n });\n\n if (!project) {\n project = await this.create({\n projectId,\n title: options.title || '',\n owner: options.owner || '',\n providerType: options.providerType || 'github',\n tokenConfigKey: options.tokenConfigKey || 'GITHUB_TOKEN',\n statusFieldId: options.statusFieldId || '',\n statusOptions: options.statusOptions || {},\n });\n await project.save();\n\n // Sync to get full project data\n await project.sync({ force: true });\n }\n\n return project;\n }\n\n /**\n * Sync all projects\n *\n * @param options - Sync options\n * @returns Array of synced projects\n */\n async syncAll(options: { force?: boolean } = {}): Promise<Project[]> {\n const projects = await this.list({});\n const synced: Project[] = [];\n\n for (const project of projects) {\n await project.sync(options);\n synced.push(project);\n }\n\n return synced;\n }\n\n /**\n * Find projects with items in a specific status\n *\n * @param status - Status name\n * @returns Array of projects\n */\n async findWithItemsInStatus(status: string): Promise<Project[]> {\n const projects = await this.list({});\n const matching: Project[] = [];\n\n for (const project of projects) {\n try {\n const items = await project.getItemsByStatus(status);\n if (items.length > 0) {\n matching.push(project);\n }\n } catch (error) {\n // Log error and skip projects we can't access\n logger.warn(`Error accessing items for project ${project.projectId}`, {\n error: error instanceof Error ? error.message : error,\n });\n }\n }\n\n return matching;\n }\n\n /**\n * Get project statistics\n *\n * @param projectId - Project ID\n * @returns Statistics object\n */\n async getStatistics(projectId: string): Promise<{\n totalItems: number;\n itemsByStatus: Record<string, number>;\n itemsByType: Record<string, number>;\n }> {\n const project = await this.findOne({ where: { projectId } });\n if (!project) {\n throw new Error(`Project ${projectId} not found`);\n }\n\n const items = await project.listItems();\n const statuses = await project.getStatuses();\n\n const itemsByStatus: Record<string, number> = {};\n for (const status of statuses) {\n itemsByStatus[status.name] = 0;\n }\n\n const itemsByType: Record<string, number> = {\n Issue: 0,\n PullRequest: 0,\n DraftIssue: 0,\n };\n\n for (const item of items) {\n if (item.status && itemsByStatus[item.status] !== undefined) {\n itemsByStatus[item.status]++;\n }\n if (itemsByType[item.type] !== undefined) {\n itemsByType[item.type]++;\n }\n }\n\n return {\n totalItems: items.length,\n itemsByStatus,\n itemsByType,\n };\n }\n\n /**\n * Find projects by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of projects for the tenant\n */\n async findByTenant(tenantId: string): Promise<Project[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global projects (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global projects\n */\n async findGlobal(): Promise<Project[]> {\n return queryGlobal<Project>(this);\n }\n\n /**\n * Find projects for a tenant plus all global projects.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global projects\n */\n async findWithGlobals(tenantId: string): Promise<Project[]> {\n return queryWithGlobals<Project>(this, tenantId, 'Project.findWithGlobals');\n }\n}\n","/**\n * PullRequestCollection - Collection manager for PullRequest objects\n *\n * Provides querying and discovery operations for PullRequest entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { PullRequest } from '../models/PullRequest';\nimport type { Repository } from '../models/Repository';\nimport type { SDKPullRequest, SearchFilters } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class PullRequestCollection extends SmrtCollection<PullRequest> {\n static readonly _itemClass = PullRequest;\n\n /**\n * Discover pull requests from a repository and sync to database\n *\n * @param options - Discovery options\n * @returns Array of PullRequest objects\n */\n async discover(options: {\n repository: Repository;\n filters?: SearchFilters;\n }): Promise<PullRequest[]> {\n const { repository, filters } = options;\n const repositoryId = repository.id ?? undefined;\n\n if (!repositoryId) {\n throw new Error(\n 'Repository must be saved before discovering pull requests',\n );\n }\n\n const repoClient = await repository.getClient();\n\n // Note: searchIssues with type filter would get PRs in GitHub\n // For now, we'll search for all and filter\n const remoteItems = await repoClient.searchIssues('is:pr', filters);\n\n const pullRequests: PullRequest[] = [];\n\n for (const remote of remoteItems) {\n // Get full PR data\n let prData: SDKPullRequest;\n try {\n prData = await repoClient.getPullRequest(remote.number);\n } catch (error) {\n // Log error and skip PR - could be rate limiting, auth, or access issues\n logger.warn(\n `Failed to fetch PR #${remote.number} from ${repository.owner}/${repository.name}`,\n { error: error instanceof Error ? error.message : error },\n );\n continue;\n }\n\n // Find existing PR by repository + number\n let pr = await this.findOne({\n where: {\n repositoryId,\n number: remote.number,\n },\n });\n\n if (!pr) {\n // Create new PR\n pr = await this.create({\n repositoryId,\n number: prData.number,\n nodeId: prData.id,\n title: prData.title,\n body: prData.body,\n state: prData.state,\n author: prData.author.login,\n labels: prData.labels.map((l) => l.name),\n assignees: prData.assignees.map((a) => a.login),\n commentsCount: prData.commentsCount,\n headRef: prData.headRef,\n baseRef: prData.baseRef,\n merged: prData.merged,\n mergedAt: prData.mergedAt || null,\n mergeable: prData.mergeable,\n draft: prData.draft,\n lastSyncedAt: new Date(),\n });\n } else {\n // Update existing PR\n pr.nodeId = prData.id;\n pr.title = prData.title;\n pr.body = prData.body;\n pr.state = prData.state;\n pr.author = prData.author.login;\n pr.labels = prData.labels.map((l) => l.name);\n pr.assignees = prData.assignees.map((a) => a.login);\n pr.commentsCount = prData.commentsCount;\n pr.headRef = prData.headRef;\n pr.baseRef = prData.baseRef;\n pr.merged = prData.merged;\n pr.mergedAt = prData.mergedAt || null;\n pr.mergeable = prData.mergeable;\n pr.draft = prData.draft;\n pr.lastSyncedAt = new Date();\n }\n\n await pr.save();\n pullRequests.push(pr);\n }\n\n return pullRequests;\n }\n\n /**\n * Find PRs by repository\n *\n * @param repositoryId - Repository ID\n * @returns Array of PRs\n */\n async findByRepository(repositoryId: string): Promise<PullRequest[]> {\n return await this.list({\n where: { repositoryId },\n });\n }\n\n /**\n * Find open PRs\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of open PRs\n */\n async findOpen(repositoryId?: string): Promise<PullRequest[]> {\n const where: Record<string, unknown> = { state: 'open' };\n if (repositoryId) {\n where.repositoryId = repositoryId;\n }\n return await this.list({ where });\n }\n\n /**\n * Find draft PRs\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of draft PRs\n */\n async findDrafts(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n return openPRs.filter((pr) => pr.draft);\n }\n\n /**\n * Find PRs ready to merge\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of mergeable PRs\n */\n async findReadyToMerge(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n return openPRs.filter((pr) => !pr.draft && pr.mergeable);\n }\n\n /**\n * Find PRs by branch\n *\n * @param branch - Branch name (head or base)\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs\n */\n async findByBranch(\n branch: string,\n repositoryId?: string,\n ): Promise<PullRequest[]> {\n const prs = await this.list({\n where: repositoryId ? { repositoryId } : {},\n });\n\n return prs.filter((pr) => pr.headRef === branch || pr.baseRef === branch);\n }\n\n /**\n * Find PR by number in a repository\n *\n * @param repositoryId - Repository ID\n * @param number - PR number\n * @returns PullRequest or null\n */\n async findByNumber(\n repositoryId: string,\n number: number,\n ): Promise<PullRequest | null> {\n const results = await this.list({\n where: { repositoryId, number },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find PRs ready to merge (AI-powered)\n *\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs that are ready\n */\n async findAIReadyToMerge(repositoryId?: string): Promise<PullRequest[]> {\n const openPRs = await this.findOpen(repositoryId);\n const ready: PullRequest[] = [];\n\n for (const pr of openPRs) {\n if (await pr.isReadyToMerge()) {\n ready.push(pr);\n }\n }\n\n return ready;\n }\n\n /**\n * Get PRs by change size\n *\n * @param size - Size classification\n * @param repositoryId - Optional repository filter\n * @returns Array of PRs\n */\n async findBySize(\n size: 'xs' | 's' | 'm' | 'l' | 'xl',\n repositoryId?: string,\n ): Promise<PullRequest[]> {\n const prs = await this.findOpen(repositoryId);\n return prs.filter((pr) => pr.getChangeSize() === size);\n }\n\n /**\n * Batch sync PRs from repository\n *\n * @param repository - Repository to sync from\n * @param options - Sync options\n * @returns Array of synced PRs\n */\n async batchSync(\n repository: Repository,\n options: { force?: boolean } = {},\n ): Promise<PullRequest[]> {\n const prs = await this.findByRepository(repository.id as string);\n const synced: PullRequest[] = [];\n\n for (const pr of prs) {\n await pr.sync(options);\n synced.push(pr);\n }\n\n return synced;\n }\n\n /**\n * Find pull requests by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of pull requests for the tenant\n */\n async findByTenant(tenantId: string): Promise<PullRequest[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global pull requests (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global pull requests\n */\n async findGlobal(): Promise<PullRequest[]> {\n return queryGlobal<PullRequest>(this);\n }\n\n /**\n * Find pull requests for a tenant plus all global pull requests.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global pull requests\n */\n async findWithGlobals(tenantId: string): Promise<PullRequest[]> {\n return queryWithGlobals<PullRequest>(\n this,\n tenantId,\n 'PullRequest.findWithGlobals',\n );\n }\n}\n","/**\n * Repository model - SMRT wrapper for repository operations\n *\n * Provides persistent repository tracking with provider-agnostic operations.\n * Uses @happyvertical/repos SDK for actual API calls.\n */\n\nimport { getRepository } from '@happyvertical/repos';\nimport { getModuleConfig } from '@happyvertical/smrt-config';\nimport {\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport { SYNC_THROTTLE_MS } from '../constants';\nimport type {\n CreateIssueInput,\n CreatePRInput,\n IRepository,\n RepositoryProviderType,\n SDKRepository,\n SearchFilters,\n SyncOptions,\n} from '../types';\nimport type { Issue } from './Issue';\nimport type { PullRequest } from './PullRequest';\n\nexport interface RepositoryOptions extends SmrtObjectOptions {\n owner?: string;\n name?: string;\n fullName?: string;\n description?: string;\n defaultBranch?: string;\n isPrivate?: boolean;\n providerType?: RepositoryProviderType;\n baseUrl?: string;\n tokenConfigKey?: string;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get', 'create', 'update'] },\n mcp: { include: ['list', 'get', 'sync'] },\n // sync is an operator command invoked in-process via the CLI;\n // it intentionally isn't exposed over HTTP today.\n cli: { include: ['list', 'get', 'sync', 'create'], skipApiCheck: true },\n})\nexport class Repository extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Repository owner (organization or user)\n */\n owner: string = '';\n\n /**\n * Repository name\n */\n name: string = '';\n\n /**\n * Full name in owner/repo format\n */\n fullName: string = '';\n\n /**\n * Repository description\n */\n description: string = '';\n\n /**\n * Default branch name\n */\n defaultBranch: string = 'main';\n\n /**\n * Whether repository is private\n */\n isPrivate: boolean = false;\n\n /**\n * Repository provider type\n */\n providerType: RepositoryProviderType = 'github';\n\n /**\n * Base URL for self-hosted instances (GitHub Enterprise, GitLab self-hosted, etc.)\n */\n baseUrl: string = '';\n\n /**\n * Environment variable name or config key for token resolution\n * The token is NOT stored - only the key name is persisted\n */\n tokenConfigKey: string = 'GITHUB_TOKEN';\n\n /**\n * Last sync timestamp\n */\n lastSyncedAt: Date | null = null;\n\n /**\n * Transient: Cached repository client (not persisted)\n */\n private _client?: IRepository;\n\n constructor(options: RepositoryOptions = {}) {\n super(options);\n if (options.owner !== undefined) this.owner = options.owner;\n if (options.name !== undefined) this.name = options.name;\n if (options.fullName !== undefined) this.fullName = options.fullName;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.defaultBranch !== undefined)\n this.defaultBranch = options.defaultBranch;\n if (options.isPrivate !== undefined) this.isPrivate = options.isPrivate;\n if (options.providerType !== undefined)\n this.providerType = options.providerType;\n if (options.baseUrl !== undefined) this.baseUrl = options.baseUrl;\n if (options.tokenConfigKey !== undefined)\n this.tokenConfigKey = options.tokenConfigKey;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * Get the repository client, resolving token from config\n *\n * Token resolution order:\n * 1. Environment variable matching tokenConfigKey\n * 2. Module config value matching tokenConfigKey\n *\n * @returns Repository client for API operations\n * @throws Error if token cannot be resolved\n */\n async getClient(): Promise<IRepository> {\n if (this._client) {\n return this._client;\n }\n\n // Resolve token from environment or config\n const token =\n process.env[this.tokenConfigKey] ||\n (getModuleConfig<Record<string, string>>('smrt-projects', {})[\n this.tokenConfigKey\n ] as string);\n\n if (!token) {\n throw new Error(\n `Token not found for key '${this.tokenConfigKey}'. ` +\n `Set the ${this.tokenConfigKey} environment variable or configure it in smrt.config.`,\n );\n }\n\n this._client = await getRepository({\n type: this.providerType,\n owner: this.owner,\n repo: this.name,\n token,\n baseUrl: this.baseUrl || undefined,\n });\n\n return this._client;\n }\n\n /**\n * Clear the cached client (useful after token refresh)\n */\n clearClient(): void {\n this._client = undefined;\n }\n\n /**\n * Sync repository metadata from the provider\n *\n * @param options - Sync options\n * @returns This repository with updated fields\n */\n async sync(options: SyncOptions = {}): Promise<this> {\n // Check if we recently synced (within 5 minutes)\n if (\n !options.force &&\n this.lastSyncedAt &&\n Date.now() - this.lastSyncedAt.getTime() < SYNC_THROTTLE_MS\n ) {\n return this;\n }\n\n const client = await this.getClient();\n const repoData: SDKRepository = await client.getRepository();\n\n // Update fields from remote\n this.owner = repoData.owner;\n this.name = repoData.name;\n this.fullName = `${repoData.owner}/${repoData.name}`;\n this.description = repoData.description;\n this.defaultBranch = repoData.defaultBranch;\n this.isPrivate = repoData.isPrivate;\n this.lastSyncedAt = new Date();\n\n await this.save();\n return this;\n }\n\n /**\n * Get issues from this repository\n *\n * @param filters - Optional search filters\n * @returns Array of Issue objects (SMRT models)\n */\n async getIssues(filters?: SearchFilters): Promise<Issue[]> {\n const { IssueCollection } = await import('../collections/Issues');\n const collection = await IssueCollection.create(this.options);\n return await collection.discover({ repository: this, filters });\n }\n\n /**\n * Get pull requests from this repository\n *\n * @param filters - Optional search filters\n * @returns Array of PullRequest objects (SMRT models)\n */\n async getPullRequests(filters?: SearchFilters): Promise<PullRequest[]> {\n const { PullRequestCollection } = await import(\n '../collections/PullRequests'\n );\n const collection = await PullRequestCollection.create(this.options);\n return await collection.discover({ repository: this, filters });\n }\n\n /**\n * Create a new issue in this repository\n *\n * @param data - Issue creation data\n * @returns Created Issue (SMRT model)\n */\n async createIssue(data: CreateIssueInput): Promise<Issue> {\n const repositoryId = this.id ?? undefined;\n if (!repositoryId) {\n throw new Error('Repository must be saved before creating issues');\n }\n\n const client = await this.getClient();\n const created = await client.createIssue(data);\n\n // Create SMRT Issue from remote data\n const { Issue } = await import('./Issue');\n const issue = new Issue({\n ...this.options,\n repositoryId,\n number: created.number,\n nodeId: created.id,\n title: created.title,\n body: created.body,\n state: created.state,\n author: created.author.login,\n labels: created.labels.map((l) => l.name),\n assignees: created.assignees.map((a) => a.login),\n commentsCount: created.commentsCount,\n lastSyncedAt: new Date(),\n });\n\n // Directly-constructed models must be initialized before save() can access\n // the database connection (SmrtCollection.create() does this internally).\n await issue.initialize();\n await issue.save();\n return issue;\n }\n\n /**\n * Create a new pull request in this repository\n *\n * @param data - PR creation data\n * @returns Created PullRequest (SMRT model)\n */\n async createPullRequest(data: CreatePRInput): Promise<PullRequest> {\n const repositoryId = this.id ?? undefined;\n if (!repositoryId) {\n throw new Error('Repository must be saved before creating pull requests');\n }\n\n const client = await this.getClient();\n const created = await client.createPullRequest(data);\n\n // Create SMRT PullRequest from remote data\n const { PullRequest } = await import('./PullRequest');\n const pr = new PullRequest({\n ...this.options,\n repositoryId,\n number: created.number,\n nodeId: created.id,\n title: created.title,\n body: created.body,\n state: created.state,\n author: created.author.login,\n labels: created.labels.map((l) => l.name),\n assignees: created.assignees.map((a) => a.login),\n commentsCount: created.commentsCount,\n headRef: created.headRef,\n baseRef: created.baseRef,\n merged: created.merged,\n draft: created.draft,\n lastSyncedAt: new Date(),\n });\n\n // Directly-constructed models must be initialized before save() can access\n // the database connection (SmrtCollection.create() does this internally).\n await pr.initialize();\n await pr.save();\n return pr;\n }\n\n /**\n * Check if this repository has any open issues matching criteria\n *\n * @param criteria - Natural language description of what to check\n * @returns True if matching issues exist\n */\n async hasOpenIssuesMatching(criteria: string): Promise<boolean> {\n const issues = await this.getIssues({ state: 'open' });\n if (issues.length === 0) return false;\n\n return await this.is(\n `This repository has open issues matching: ${criteria}. ` +\n `Current open issues: ${issues.map((i) => `#${i.number}: ${i.title}`).join(', ')}`,\n );\n }\n\n /**\n * Generate a summary of repository activity\n *\n * @returns AI-generated summary\n */\n async summarizeActivity(): Promise<string> {\n const issues = await this.getIssues({ state: 'open', limit: 10 });\n const prs = await this.getPullRequests({ state: 'open', limit: 10 });\n\n return await this.do(\n `Summarize the current activity in this repository. ` +\n `Open issues: ${issues.map((i) => `#${i.number}: ${i.title}`).join(', ')}. ` +\n `Open PRs: ${prs.map((p) => `#${p.number}: ${p.title}`).join(', ')}.`,\n );\n }\n\n /**\n * Get repository by owner and name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @param options - Additional options\n * @returns Repository or null if not found\n */\n static async getByFullName(\n owner: string,\n name: string,\n options: SmrtObjectOptions = {},\n ): Promise<Repository | null> {\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(options);\n return await collection.findByFullName(owner, name);\n }\n}\n","/**\n * RepositoryCollection - Collection manager for Repository objects\n *\n * Provides querying and discovery operations for Repository entities.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { queryGlobal, queryWithGlobals } from '@happyvertical/smrt-tenancy';\nimport { Repository } from '../models/Repository';\nimport type { RepositoryProviderType } from '../types';\n\nconst logger = createLogger({ level: 'info' });\n\nexport class RepositoryCollection extends SmrtCollection<Repository> {\n static readonly _itemClass = Repository;\n\n /**\n * Find a repository by owner and name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @returns Repository or null\n */\n async findByFullName(\n owner: string,\n name: string,\n ): Promise<Repository | null> {\n const results = await this.list({\n where: { owner, name },\n limit: 1,\n });\n return results[0] || null;\n }\n\n /**\n * Find repositories by owner\n *\n * @param owner - Repository owner\n * @returns Array of repositories\n */\n async findByOwner(owner: string): Promise<Repository[]> {\n return await this.list({\n where: { owner },\n });\n }\n\n /**\n * Find repositories by provider type\n *\n * @param providerType - Provider type\n * @returns Array of repositories\n */\n async findByProvider(\n providerType: RepositoryProviderType,\n ): Promise<Repository[]> {\n return await this.list({\n where: { providerType },\n });\n }\n\n /**\n * Get or create a repository by owner/name\n *\n * @param owner - Repository owner\n * @param name - Repository name\n * @param options - Additional options for creation\n * @returns Repository (existing or newly created)\n */\n async getOrCreate(\n owner: string,\n name: string,\n options: {\n providerType?: RepositoryProviderType;\n tokenConfigKey?: string;\n baseUrl?: string;\n } = {},\n ): Promise<Repository> {\n let repo = await this.findByFullName(owner, name);\n\n if (!repo) {\n repo = await this.create({\n owner,\n name,\n fullName: `${owner}/${name}`,\n providerType: options.providerType || 'github',\n tokenConfigKey: options.tokenConfigKey || 'GITHUB_TOKEN',\n baseUrl: options.baseUrl || '',\n });\n await repo.save();\n }\n\n return repo;\n }\n\n /**\n * Sync all repositories\n *\n * @param options - Sync options\n * @returns Array of synced repositories\n */\n async syncAll(options: { force?: boolean } = {}): Promise<Repository[]> {\n const repos = await this.list({});\n const synced: Repository[] = [];\n\n for (const repo of repos) {\n await repo.sync(options);\n synced.push(repo);\n }\n\n return synced;\n }\n\n /**\n * Find repositories with open issues\n *\n * @returns Array of repositories with at least one open issue\n */\n async findWithOpenIssues(): Promise<Repository[]> {\n const repos = await this.list({});\n const withIssues: Repository[] = [];\n\n for (const repo of repos) {\n try {\n const issues = await repo.getIssues({ state: 'open', limit: 1 });\n if (issues.length > 0) {\n withIssues.push(repo);\n }\n } catch (error) {\n // Log error and skip repos we can't access\n logger.warn(\n `Error accessing issues for repository ${repo.owner}/${repo.name}`,\n { error: error instanceof Error ? error.message : error },\n );\n }\n }\n\n return withIssues;\n }\n\n /**\n * Find repositories by tenant ID\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of repositories for the tenant\n */\n async findByTenant(tenantId: string): Promise<Repository[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find all global repositories (no tenant association).\n *\n * Routes through the shared tenant-global helper so it does not throw under\n * an active tenant context (an explicit `tenant_id IS NULL` filter would be\n * flagged as an isolation violation). (#1600)\n *\n * @returns Array of global repositories\n */\n async findGlobal(): Promise<Repository[]> {\n return queryGlobal<Repository>(this);\n }\n\n /**\n * Find repositories for a tenant plus all global repositories.\n *\n * Fails closed if an active tenant context requests a different tenant's\n * rows; the admin/system path keeps the cross-tenant capability. (#1600)\n *\n * @param tenantId - Tenant ID to filter by\n * @returns Array of tenant and global repositories\n */\n async findWithGlobals(tenantId: string): Promise<Repository[]> {\n return queryWithGlobals<Repository>(\n this,\n tenantId,\n 'Repository.findWithGlobals',\n );\n }\n}\n","import {\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { AssistanceClassification, DeliveryEventType } from '../types.js';\n\nexport function parseProjectJson<T>(value: string, fallback: T): T {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nconst INTERNAL_SURFACES = {\n api: false,\n cli: false,\n mcp: false,\n} as const;\n\n/** Provider-neutral connection from a Development Request to canonical work. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'development_request_work_links',\n conflictColumns: ['request_id', 'work_item_type', 'work_item_id'],\n ...INTERNAL_SURFACES,\n})\nexport class DevelopmentRequestWorkLink extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) workItemType: string = '';\n @field({ type: 'text' }) workItemId: string = '';\n @field({ type: 'text' }) canonicalStatus: string = '';\n @field({ type: 'text' }) providerRef: string = '';\n @field({ type: 'text' }) metadata: string = '{}';\n lastProjectedAt: Date | null = null;\n}\n\n/** Ordered, idempotent delivery update emitted by the control plane. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'project_delivery_events',\n conflictColumns: ['integration_id', 'idempotency_key'],\n ...INTERNAL_SURFACES,\n})\nexport class ProjectDeliveryEvent extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) idempotencyKey: string = '';\n sequence: number = 0;\n @field({ type: 'text' }) type: DeliveryEventType = 'work_linked';\n @field({ type: 'text' }) payload: string = '{}';\n occurredAt: Date = new Date();\n deliveredAt: Date | null = null;\n deliveryAttempts: number = 0;\n @field({ type: 'text' }) lastDeliveryError: string = '';\n}\n\n/** Client decision state for one preview produced during delivery. */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'preview_approvals',\n conflictColumns: ['request_id', 'preview_id'],\n ...INTERNAL_SURFACES,\n})\nexport class PreviewApproval extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('DevelopmentRequest', { required: true }) requestId: string = '';\n @field({ type: 'text' }) previewId: string = '';\n @field({ type: 'text' }) previewUrl: string = '';\n @field({ type: 'text' }) status:\n | 'pending'\n | 'approved'\n | 'rejected'\n | 'stale' = 'pending';\n @field({ type: 'text' }) decidedByRef: string = '';\n @field({ type: 'text' }) reason: string = '';\n createdAt: Date = new Date();\n decidedAt: Date | null = null;\n staleAt: Date | null = null;\n}\n\n/** Lossless conversational intake before support/development classification. */\n@TenantScoped({ mode: 'required' })\n@smrt({ tableName: 'assistance_requests', ...INTERNAL_SURFACES })\nexport class AssistanceRequest extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('ProjectIntegration', { required: true })\n integrationId: string = '';\n @field({ type: 'text' }) requesterId: string = '';\n @field({ type: 'text' }) subject: string = '';\n @field({ type: 'text' }) applicationContext: string = '{}';\n @field({ type: 'text' }) conversation: string = '[]';\n @field({ type: 'text' }) evidence: string = '[]';\n @field({ type: 'text' }) classification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) supportCaseId: string = '';\n @field({ type: 'text' }) developmentRequestId: string = '';\n deliveryHandoffLinkedAt: Date | null = null;\n createdAt: Date = new Date();\n}\n\n/** Append-only explanation of Assistance Request routing decisions. */\n@TenantScoped({ mode: 'required' })\n@smrt({ tableName: 'assistance_request_events', ...INTERNAL_SURFACES })\nexport class AssistanceRequestEvent extends SmrtObject {\n @tenantId() tenantId: string = '';\n @foreignKey('AssistanceRequest', { required: true })\n assistanceRequestId: string = '';\n @field({ type: 'text' }) priorClassification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) resultingClassification: AssistanceClassification =\n 'unclassified';\n @field({ type: 'text' }) actorRef: string = '';\n @field({ type: 'text' }) reason: string = '';\n @field({ type: 'text' }) resultingLinks: string = '{}';\n occurredAt: Date = new Date();\n}\n\nexport class DevelopmentRequestWorkLinkCollection extends SmrtCollection<DevelopmentRequestWorkLink> {\n static readonly _itemClass = DevelopmentRequestWorkLink;\n}\nexport class ProjectDeliveryEventCollection extends SmrtCollection<ProjectDeliveryEvent> {\n static readonly _itemClass = ProjectDeliveryEvent;\n}\nexport class PreviewApprovalCollection extends SmrtCollection<PreviewApproval> {\n static readonly _itemClass = PreviewApproval;\n}\nexport class AssistanceRequestCollection extends SmrtCollection<AssistanceRequest> {\n static readonly _itemClass = AssistanceRequest;\n}\nexport class AssistanceRequestEventCollection extends SmrtCollection<AssistanceRequestEvent> {\n static readonly _itemClass = AssistanceRequestEvent;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport type { DevelopmentRequest } from '../models/DevelopmentRequest.js';\nimport {\n type PreviewApproval,\n PreviewApprovalCollection,\n type ProjectDeliveryEvent,\n ProjectDeliveryEventCollection,\n parseProjectJson,\n} from '../models/delivery-control-plane.js';\nimport type { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type { DeliveryEventType } from '../types.js';\nimport type { DevelopmentWorkAdapter } from './development-request-service.js';\n\nexport interface DeliveryEventSender {\n send(event: ProjectDeliveryEvent): Promise<void>;\n}\n\nexport interface ApprovalPolicy {\n canApprove(input: {\n integration: ProjectIntegration;\n requestId: string;\n previewId: string;\n }): Promise<boolean>;\n}\n\nexport class ProjectDeliveryService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly requests: DevelopmentRequestCollection,\n private readonly events: ProjectDeliveryEventCollection,\n private readonly approvals: PreviewApprovalCollection,\n private readonly workAdapter?: DevelopmentWorkAdapter,\n private readonly approvalPolicy?: ApprovalPolicy,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n dependencies: {\n workAdapter?: DevelopmentWorkAdapter;\n approvalPolicy?: ApprovalPolicy;\n } = {},\n ): Promise<ProjectDeliveryService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const sharedOptions = { ...options, db: integrations.db };\n const [requests, events, approvals] = await Promise.all([\n DevelopmentRequestCollection.create(sharedOptions),\n ProjectDeliveryEventCollection.create(sharedOptions),\n PreviewApprovalCollection.create(sharedOptions),\n ]);\n return new ProjectDeliveryService(\n integrations,\n requests,\n events,\n approvals,\n dependencies.workAdapter,\n dependencies.approvalPolicy,\n );\n }\n\n async record(input: {\n integration: ProjectIntegration;\n requestId: string;\n idempotencyKey: string;\n sequence: number;\n type: DeliveryEventType;\n payload: Record<string, unknown>;\n occurredAt?: Date;\n }): Promise<ProjectDeliveryEvent> {\n const integration = await requireActiveIntegrationCapability(\n this.integrations,\n input.integration,\n 'delivery:write',\n );\n if (!input.idempotencyKey.trim())\n throw new Error('Delivery event idempotencyKey is required.');\n const existing = (\n await withTenant({ tenantId: integration.tenantId }, () =>\n this.events.list({\n where: {\n integrationId: integration.id,\n idempotencyKey: input.idempotencyKey,\n },\n limit: 1,\n }),\n )\n )[0];\n if (existing) {\n await this.applySideEffects(integration, existing);\n return existing;\n }\n const request = await this.requestForIntegration(\n integration,\n input.requestId,\n );\n const event = await withTenant({ tenantId: integration.tenantId }, () =>\n this.events.create({\n tenantId: integration.tenantId,\n integrationId: requiredId(integration.id, 'Project Integration'),\n requestId: input.requestId,\n idempotencyKey: input.idempotencyKey,\n sequence: input.sequence,\n type: input.type,\n payload: JSON.stringify(input.payload),\n occurredAt: input.occurredAt ?? new Date(),\n }),\n );\n await withTenant({ tenantId: integration.tenantId }, () => event.save());\n await this.applySideEffects(integration, event, request);\n return event;\n }\n\n private async applySideEffects(\n integration: ProjectIntegration,\n event: ProjectDeliveryEvent,\n loadedRequest?: DevelopmentRequest,\n ): Promise<void> {\n const request =\n loadedRequest ??\n (await this.requestForIntegration(integration, event.requestId));\n const payload = parseProjectJson<Record<string, unknown>>(\n event.payload,\n {},\n );\n if (event.type === 'preview') await this.upsertPreview(request, payload);\n if (\n (event.type === 'completed' ||\n event.type === 'deployment' ||\n event.type === 'rejected') &&\n !(await this.isLatestTerminalEvent(event))\n )\n return;\n if (\n (event.type === 'completed' || event.type === 'deployment') &&\n request.status !== 'completed'\n )\n await this.requests.transitionStatus(request.tenantId, event.requestId, {\n status: 'completed',\n actorType: 'integration',\n actorId: integration.id ?? '',\n note: event.type,\n });\n if (event.type === 'rejected' && request.status !== 'declined')\n await this.requests.transitionStatus(request.tenantId, event.requestId, {\n status: 'declined',\n actorType: 'integration',\n actorId: integration.id ?? '',\n note: String(payload.reason ?? 'Delivery rejected'),\n });\n }\n\n async listForIntegration(\n integration: ProjectIntegration,\n requestId: string,\n ): Promise<ProjectDeliveryEvent[]> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'delivery:read',\n );\n await this.requestForIntegration(active, requestId);\n return withTenant({ tenantId: active.tenantId }, () =>\n this.events.list({\n where: { integrationId: active.id, requestId },\n orderBy: 'sequence ASC',\n }),\n );\n }\n\n async deliverPending(\n sender: DeliveryEventSender,\n tenantId: string,\n integrationId?: string,\n ): Promise<void> {\n const pending = await withTenant({ tenantId }, () =>\n this.events.list({\n where: integrationId\n ? { integrationId, deliveredAt: null }\n : { deliveredAt: null },\n orderBy: 'sequence ASC',\n }),\n );\n for (const event of pending) {\n const active = await this.integrations.findActive(\n tenantId,\n event.integrationId,\n );\n if (!active) continue;\n event.deliveryAttempts += 1;\n try {\n await sender.send(event);\n event.deliveredAt = new Date();\n event.lastDeliveryError = '';\n } catch (error) {\n event.lastDeliveryError =\n error instanceof Error ? error.message : String(error);\n }\n await withTenant({ tenantId }, () => event.save());\n }\n }\n\n async replay(\n sender: DeliveryEventSender,\n integration: ProjectIntegration,\n afterSequence = -1,\n ): Promise<void> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'delivery:read',\n );\n const events = (\n await withTenant({ tenantId: active.tenantId }, () =>\n this.events.list({\n where: { integrationId: active.id },\n orderBy: 'sequence ASC',\n }),\n )\n ).filter((event) => event.sequence > afterSequence);\n for (const event of events) await sender.send(event);\n }\n\n async decidePreview(\n integration: ProjectIntegration,\n preview: PreviewApproval,\n input: { approved: boolean; actorRef: string; reason: string },\n ): Promise<PreviewApproval> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'previews:approve',\n );\n if (preview.tenantId !== active.tenantId)\n throw new Error('Preview is outside this Project Integration tenant.');\n if (preview.status === 'stale')\n throw new Error('Stale previews cannot be approved.');\n if (preview.status !== 'pending') return preview;\n const request = await this.requestForIntegration(active, preview.requestId);\n if (\n this.approvalPolicy &&\n !(await this.approvalPolicy.canApprove({\n integration: active,\n requestId: preview.requestId,\n previewId: preview.previewId,\n }))\n )\n throw new Error('Preview approval denied by policy.');\n if (!this.workAdapter?.requestApproval)\n throw new Error('Control-plane approval adapter is not configured.');\n await this.workAdapter.requestApproval({\n request,\n previewId: preview.previewId,\n idempotencyKey: `preview-approval:${requiredId(preview.id, 'Preview Approval')}`,\n approved: input.approved,\n reason: input.reason,\n });\n preview.status = input.approved ? 'approved' : 'rejected';\n preview.decidedByRef = input.actorRef;\n preview.reason = input.reason;\n preview.decidedAt = new Date();\n await withTenant({ tenantId: active.tenantId }, () => preview.save());\n return preview;\n }\n\n async markPreviewStale(preview: PreviewApproval): Promise<PreviewApproval> {\n if (preview.status === 'pending') {\n preview.status = 'stale';\n preview.staleAt = new Date();\n await withTenant({ tenantId: preview.tenantId }, () => preview.save());\n }\n return preview;\n }\n\n private async requestForIntegration(\n integration: ProjectIntegration,\n requestId: string,\n ): Promise<DevelopmentRequest> {\n const request = await withTenant({ tenantId: integration.tenantId }, () =>\n this.requests.get({ id: requestId }),\n );\n if (\n !request ||\n request.integrationId !== integration.id ||\n request.projectId !== integration.projectId\n )\n throw new Error(\n 'Development Request is outside this Project Integration.',\n );\n return request;\n }\n\n private async isLatestTerminalEvent(\n event: ProjectDeliveryEvent,\n ): Promise<boolean> {\n const latest = (\n await withTenant({ tenantId: event.tenantId }, () =>\n this.events.list({\n where: {\n integrationId: event.integrationId,\n requestId: event.requestId,\n type: ['completed', 'deployment', 'rejected'],\n },\n orderBy: 'sequence DESC',\n limit: 1,\n }),\n )\n )[0];\n return !latest || latest.sequence <= event.sequence;\n }\n\n private async upsertPreview(\n request: DevelopmentRequest,\n payload: Record<string, unknown>,\n ): Promise<void> {\n const previewId = String(payload.previewId ?? '');\n if (!previewId) return;\n const existing = (\n await withTenant({ tenantId: request.tenantId }, () =>\n this.approvals.list({\n where: { requestId: request.id, previewId },\n limit: 1,\n }),\n )\n )[0];\n if (existing) return;\n const approval = await withTenant({ tenantId: request.tenantId }, () =>\n this.approvals.create({\n tenantId: request.tenantId,\n requestId: requiredId(request.id, 'Development Request'),\n previewId,\n previewUrl: String(payload.previewUrl ?? ''),\n status: 'pending',\n createdAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => approval.save());\n }\n}\n\nexport function requireIntegrationCapability(\n integration: ProjectIntegration,\n capability: string,\n): void {\n if (!integration.isActive())\n throw new Error('Project Integration is revoked.');\n if (!integration.hasCapability(capability))\n throw new Error(`Project Integration lacks capability '${capability}'.`);\n}\n\nexport async function requireActiveIntegrationCapability(\n integrations: ProjectIntegrationCollection,\n integration: Pick<ProjectIntegration, 'id' | 'tenantId'>,\n capability: string,\n): Promise<ProjectIntegration> {\n const integrationId = requiredId(integration.id, 'Project Integration');\n const active = await integrations.findActive(\n integration.tenantId,\n integrationId,\n );\n if (!active) throw new Error('Project Integration is revoked.');\n requireIntegrationCapability(active, capability);\n return active;\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport { ProjectCollection } from '../collections/Projects.js';\nimport { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type { ProjectBoardMoveIntent } from '../project-board-types.js';\nimport { requireActiveIntegrationCapability } from './delivery-service.js';\n\nexport type { ProjectBoardMoveIntent } from '../project-board-types.js';\n\n/** Pure data returned after a provider-backed project board move. */\nexport interface ProjectBoardMoveResult {\n projectId: string;\n itemId: string;\n previousStatus: string | null;\n status: string;\n}\n\n/**\n * Capability-checked server boundary for project-board mutations.\n *\n * This service intentionally exposes neither provider credentials nor the\n * provider client. It reloads the supplied server-derived integration before\n * every mutation, verifies its project binding and capability, validates the\n * requested item and status against the authoritative Project, then delegates\n * persistence to Project.updateItemStatus().\n */\nexport class ProjectBoardService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly projects: ProjectCollection,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n ): Promise<ProjectBoardService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const projects = await ProjectCollection.create({\n ...options,\n db: integrations.db,\n });\n return new ProjectBoardService(integrations, projects);\n }\n\n async moveItem(\n integration: ProjectIntegration,\n input: ProjectBoardMoveIntent,\n ): Promise<ProjectBoardMoveResult> {\n const projectId = requiredInput(input.projectId, 'Project ID');\n const itemId = requiredInput(input.itemId, 'Project item ID');\n const status = requiredInput(input.status, 'Project status');\n const authorized = await this.requireAuthorizedIntegration(\n integration,\n projectId,\n );\n const project = await this.findProject(authorized.tenantId, projectId);\n if (!project) throw new Error('Project not found for this integration.');\n\n const statuses = await project.getStatuses();\n if (!statuses.some((candidate) => candidate.name === status)) {\n throw new Error(`Project status '${status}' is not available.`);\n }\n\n const item = (await project.listItems()).find(\n (candidate) => candidate.id === itemId,\n );\n if (!item) throw new Error('Project item not found.');\n\n // Reads can take long enough for a capability to be revoked. Revalidate\n // against canonical integration state immediately before the write.\n await this.requireAuthorizedIntegration(integration, projectId);\n await project.updateItemStatus(itemId, status);\n return {\n projectId,\n itemId,\n previousStatus: item.status ?? null,\n status,\n };\n }\n\n private async requireAuthorizedIntegration(\n integration: ProjectIntegration,\n projectId: string,\n ): Promise<ProjectIntegration> {\n if (!(integration instanceof ProjectIntegration)) {\n throw new Error(\n 'Project board moves require an authenticated Project Integration.',\n );\n }\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'projects:write',\n );\n if (active.projectId !== projectId) {\n throw new Error('Project is outside this Project Integration.');\n }\n return active;\n }\n\n private async findProject(tenantId: string, projectId: string) {\n const tenantProject = (\n await withTenant({ tenantId }, () =>\n this.projects.list({ where: { projectId, tenantId }, limit: 1 }),\n )\n )[0];\n if (tenantProject) return tenantProject;\n return (await this.projects.findGlobal()).find(\n (candidate) => candidate.projectId === projectId,\n );\n }\n}\n\nfunction requiredInput(value: string, label: string): string {\n if (!value?.trim()) throw new Error(`${label} is required.`);\n return value;\n}\n","import type { DatabaseInterface } from '@happyvertical/sql';\nimport { DevelopmentRequestCollection } from './collections/DevelopmentRequests';\nimport { ProjectIntegrationCollection } from './collections/ProjectIntegrations';\nimport type { ProjectIntegration } from './models/ProjectIntegration';\nimport {\n type ProjectBoardMoveIntent,\n ProjectBoardService,\n} from './services/project-board-service';\nimport type { ManagedDevelopmentRequestCreateInput } from './types';\n\nexport class ManagedProjectClient {\n readonly #db: DatabaseInterface;\n readonly #integration: ProjectIntegration;\n readonly #requesterId: string;\n\n private constructor(\n integration: ProjectIntegration,\n options: { db: DatabaseInterface; requesterId: string },\n ) {\n this.#integration = integration;\n this.#db = options.db;\n this.#requesterId = options.requesterId;\n }\n\n static async authenticate(\n credential: string,\n options: { db: DatabaseInterface; requesterId: string },\n ): Promise<ManagedProjectClient> {\n if (!options.requesterId.trim()) {\n throw new Error('Managed project client requires a stable requesterId');\n }\n const integrations = await ProjectIntegrationCollection.create({\n db: options.db,\n });\n const integration = await integrations.authenticate(credential);\n if (!integration) {\n throw new Error('Invalid or revoked project integration credential');\n }\n return new ManagedProjectClient(integration, options);\n }\n\n async createRequest(\n input: Omit<ManagedDevelopmentRequestCreateInput, 'requesterId'>,\n ) {\n const integration = await this.#requireCapability('requests:create');\n if (!input.description.trim()) {\n throw new Error('Managed request creation requires a description');\n }\n\n const requests = await DevelopmentRequestCollection.create({\n db: this.#db,\n });\n return requests.createManaged({\n ...input,\n tenantId: integration.tenantId,\n projectId: integration.projectId,\n integrationId: integration.id as string,\n requesterId: this.#requesterId,\n });\n }\n\n async listRequests() {\n const integration = await this.#requireCapability('requests:read-own');\n const requests = await DevelopmentRequestCollection.create({\n db: this.#db,\n });\n return requests.listByIntegrationRequester({\n tenantId: integration.tenantId,\n integrationId: integration.id as string,\n requesterId: this.#requesterId,\n });\n }\n\n /**\n * Move a project-board item through this authenticated integration.\n *\n * The browser submits only the move intent. This client keeps the credential\n * authentication boundary server-side and ProjectBoardService reloads active\n * capability state again immediately before the provider mutation.\n */\n async moveProjectBoardItem(input: ProjectBoardMoveIntent) {\n const integration = await this.#requireCapability('projects:write');\n const service = await ProjectBoardService.create({ db: this.#db });\n return service.moveItem(integration, input);\n }\n\n async #requireCapability(capability: string): Promise<ProjectIntegration> {\n const tenantId = this.#integration.tenantId;\n const integrationId = this.#integration.id;\n if (!tenantId || !integrationId) {\n throw new Error('Invalid or revoked project integration credential');\n }\n const integrations = await ProjectIntegrationCollection.create({\n db: this.#db,\n });\n const integration = await integrations.findActive(tenantId, integrationId);\n if (!integration) {\n throw new Error('Invalid or revoked project integration credential');\n }\n if (!integration.hasCapability(capability)) {\n throw new Error(\n `Managed project integration lacks required capability '${capability}'`,\n );\n }\n return integration;\n }\n}\n","/**\n * Projects money columns: floating-point major units → integer minor units.\n *\n * Ships as an explicit, opt-in migration rather than a schema-differ upgrade\n * because REAL→INTEGER is not information-preserving: an automatic\n * `ALTER … TYPE integer` would truncate `19.99` to `19`. The values have to be\n * rescaled by the currency's minor-unit factor during the type change (#2401).\n *\n * ```ts\n * console.log((await preflightProjectsMoneyMinorUnits(db)).summary);\n * await migrateProjectsMoneyToMinorUnits(db);\n * ```\n *\n * The two snapshot tables convert together: the delivery margin is\n * `charge - compensation`, so a half-converted pair produces a nonsense number\n * rather than an error.\n *\n * Both tables are immutable-on-save, and the immutability check compares a\n * stringified field snapshot. Rescaling changes those strings, which is\n * harmless — the snapshot is recomputed from the row on load — but it does mean\n * a row must not be mid-flight while the migration runs.\n *\n * On SQLite the values are rescaled but the declared type cannot change in\n * place; those columns come back in `declaredTypeChangePending` and need the\n * table-rebuild path (#2370).\n */\n\nimport {\n type DatabaseInterface,\n type MinorUnitsPreflightResult,\n type MinorUnitsRescaleResult,\n type MoneyColumnTarget,\n preflightMinorUnitsRescale,\n rescaleMoneyColumnsToMinorUnits,\n} from '@happyvertical/smrt-core/migrations';\n\n/** Marker recorded in `_smrt_backfills` once the rescale has run. */\nexport const PROJECTS_MONEY_MINOR_UNITS_BACKFILL =\n '@happyvertical/smrt-projects:money-minor-units:v1';\n\n/** Every projects money column that held major units before #2401. */\nexport const PROJECTS_MONEY_COLUMNS: MoneyColumnTarget[] = [\n { table: 'service_charge_snapshots', columns: ['amount'] },\n { table: 'service_compensation_snapshots', columns: ['amount'] },\n];\n\n/**\n * Report what {@link migrateProjectsMoneyToMinorUnits} would do, without\n * writing anything.\n */\nexport function preflightProjectsMoneyMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string } = {},\n): Promise<MinorUnitsPreflightResult> {\n return preflightMinorUnitsRescale(db, PROJECTS_MONEY_COLUMNS, options);\n}\n\n/**\n * Convert every projects money column from floating-point major units to\n * integer minor units. Idempotent via a `_smrt_backfills` marker.\n *\n * @throws `MinorUnitsPreflightError` when a row would be rounded or would\n * overflow `int4` and `force` was not set.\n */\nexport function migrateProjectsMoneyToMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string; force?: boolean } = {},\n): Promise<MinorUnitsRescaleResult> {\n return rescaleMoneyColumnsToMinorUnits(db, PROJECTS_MONEY_COLUMNS, {\n ...options,\n backfillName: PROJECTS_MONEY_MINOR_UNITS_BACKFILL,\n packageName: '@happyvertical/smrt-projects',\n });\n}\n","/**\n * Comment model - SMRT wrapper for issue/PR comments\n *\n * Represents a comment on an issue or pull request.\n */\n\nimport { createLogger } from '@happyvertical/logger';\nimport {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\n\nconst logger = createLogger({ level: 'info' });\n\nexport interface CommentOptions extends SmrtObjectOptions {\n issueId?: string;\n commentId?: string;\n body?: string;\n author?: string;\n createdAt?: Date;\n updatedAt?: Date;\n url?: string;\n tenantId?: string | null;\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n api: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n})\nexport class Comment extends SmrtObject {\n /**\n * Tenant ID for multi-tenant isolation\n */\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n /**\n * Issue this comment belongs to\n */\n @foreignKey('Issue')\n issueId?: string;\n\n /**\n * Provider-specific comment ID\n */\n commentId: string = '';\n\n /**\n * Comment body text\n */\n body: string = '';\n\n /**\n * Comment author's login\n */\n author: string = '';\n\n /**\n * When the comment was created\n */\n createdAt: Date | null = null;\n\n /**\n * When the comment was last updated\n */\n updatedAt: Date | null = null;\n\n /**\n * Comment URL\n */\n url: string = '';\n\n constructor(options: CommentOptions = {}) {\n super(options);\n if (options.issueId !== undefined) this.issueId = options.issueId;\n if (options.commentId !== undefined) this.commentId = options.commentId;\n if (options.body !== undefined) this.body = options.body;\n if (options.author !== undefined) this.author = options.author;\n if (options.createdAt !== undefined) this.createdAt = options.createdAt;\n if (options.updatedAt !== undefined) this.updatedAt = options.updatedAt;\n if (options.url !== undefined) this.url = options.url;\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n }\n\n /**\n * AI-powered: Check if this comment contains a question\n */\n async isQuestion(): Promise<boolean> {\n return await this.is(\n 'This comment contains a question or request for clarification',\n );\n }\n\n /**\n * AI-powered: Check if this comment contains approval\n */\n async isApproval(): Promise<boolean> {\n return await this.is(\n 'This comment expresses approval, agreement, or a positive response (LGTM, +1, approved, etc.)',\n );\n }\n\n /**\n * AI-powered: Check if this comment requests changes\n */\n async requestsChanges(): Promise<boolean> {\n return await this.is(\n 'This comment requests changes, modifications, or improvements to the issue/PR',\n );\n }\n\n /**\n * AI-powered: Extract action items from this comment\n *\n * @returns Array of action items\n */\n async extractActionItems(): Promise<string[]> {\n const result = await this.do(\n `Extract any action items, tasks, or requests from this comment.\n Return a JSON array of strings, each representing one action item.\n If no action items, return an empty array [].\n Only return the JSON array, nothing else.\n\n Comment: ${this.body}`,\n // Body is hand-rolled above; skip do()'s object-data injection (no dup).\n { includeData: false },\n );\n\n try {\n return JSON.parse(result);\n } catch (error) {\n logger.warn('Failed to parse action items JSON', {\n error: error instanceof Error ? error.message : error,\n response: result,\n });\n return [];\n }\n }\n\n /**\n * AI-powered: Summarize this comment\n *\n * @returns Brief summary\n */\n async summarize(): Promise<string> {\n return await this.do(\n `Summarize this comment in one sentence.\n Comment by ${this.author}: ${this.body}`,\n // Author + body hand-rolled above; skip do()'s object-data injection.\n { includeData: false },\n );\n }\n\n /**\n * Get the sentiment of this comment\n *\n * @returns Sentiment classification\n */\n async getSentiment(): Promise<'positive' | 'negative' | 'neutral'> {\n const result = await this.do(\n `Classify the sentiment of this comment as exactly one of: positive, negative, neutral\n Only return one word.\n Comment: ${this.body}`,\n // Body is hand-rolled above; skip do()'s object-data injection (no dup).\n { includeData: false },\n );\n\n const normalized = result.toLowerCase().trim();\n if (normalized.includes('positive')) return 'positive';\n if (normalized.includes('negative')) return 'negative';\n return 'neutral';\n }\n}\n","/**\n * Label model - SMRT wrapper for repository labels\n *\n * Represents a label that can be applied to issues and PRs.\n */\n\nimport {\n foreignKey,\n SmrtObject,\n type SmrtObjectOptions,\n smrt,\n} from '@happyvertical/smrt-core';\n\nexport interface LabelOptions extends SmrtObjectOptions {\n repositoryId?: string;\n name?: string;\n color?: string;\n description?: string;\n}\n\n@smrt({\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n mcp: { include: ['list', 'get', 'create'] },\n cli: { include: ['list', 'get', 'create', 'update', 'delete'] },\n})\nexport class Label extends SmrtObject {\n /**\n * Repository this label belongs to\n */\n @foreignKey('Repository')\n repositoryId?: string;\n\n /**\n * Label name\n */\n name: string = '';\n\n /**\n * Label color (hex without #)\n */\n color: string = '';\n\n /**\n * Label description\n */\n description: string = '';\n\n constructor(options: LabelOptions = {}) {\n super(options);\n if (options.repositoryId !== undefined)\n this.repositoryId = options.repositoryId;\n if (options.name !== undefined) this.name = options.name;\n if (options.color !== undefined) this.color = options.color;\n if (options.description !== undefined)\n this.description = options.description;\n }\n\n /**\n * Check if this is a type label (bug, feature, etc.)\n */\n isTypeLabel(): boolean {\n const typePatterns = [\n /^type:/i,\n /^kind:/i,\n /^bug$/i,\n /^feature$/i,\n /^enhancement$/i,\n /^docs$/i,\n /^chore$/i,\n ];\n return typePatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Check if this is a priority label\n */\n isPriorityLabel(): boolean {\n const priorityPatterns = [\n /^p[0-4]$/i,\n /^priority:/i,\n /^critical$/i,\n /^high$/i,\n /^medium$/i,\n /^low$/i,\n ];\n return priorityPatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Check if this is a status label\n */\n isStatusLabel(): boolean {\n const statusPatterns = [\n /^status:/i,\n /^wip$/i,\n /^in.?progress$/i,\n /^blocked$/i,\n /^needs.?review$/i,\n /^ready$/i,\n ];\n return statusPatterns.some((p) => p.test(this.name));\n }\n\n /**\n * Get the label category\n *\n * @returns Category name\n */\n getCategory(): 'type' | 'priority' | 'status' | 'area' | 'other' {\n if (this.isTypeLabel()) return 'type';\n if (this.isPriorityLabel()) return 'priority';\n if (this.isStatusLabel()) return 'status';\n if (this.name.includes(':')) return 'area';\n return 'other';\n }\n\n /**\n * Parse priority level from label name\n *\n * @returns Priority level 0-4 or null\n */\n getPriorityLevel(): number | null {\n const match = this.name.match(/p([0-4])/i);\n if (match) {\n return parseInt(match[1], 10);\n }\n if (/critical/i.test(this.name)) return 0;\n if (/high/i.test(this.name)) return 1;\n if (/medium/i.test(this.name)) return 2;\n if (/low/i.test(this.name)) return 3;\n return null;\n }\n\n /**\n * Get label with # prefix for hex color\n */\n getHexColor(): string {\n return this.color.startsWith('#') ? this.color : `#${this.color}`;\n }\n\n /**\n * Create a label in the repository\n */\n async createInRepository(): Promise<void> {\n if (!this.repositoryId) {\n throw new Error('Label must have a repositoryId');\n }\n\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(this.options);\n const repo = await collection.get({ id: this.repositoryId });\n\n if (!repo) {\n throw new Error(`Repository ${this.repositoryId} not found`);\n }\n\n const client = await repo.getClient();\n await client.createLabel({\n name: this.name,\n color: this.color,\n description: this.description,\n });\n\n await this.save();\n }\n\n /**\n * Update this label in the repository\n */\n async updateInRepository(): Promise<void> {\n if (!this.repositoryId) {\n throw new Error('Label must have a repositoryId');\n }\n\n const { RepositoryCollection } = await import(\n '../collections/Repositories'\n );\n const collection = await RepositoryCollection.create(this.options);\n const repo = await collection.get({ id: this.repositoryId });\n\n if (!repo) {\n throw new Error(`Repository ${this.repositoryId} not found`);\n }\n\n const client = await repo.getClient();\n await client.updateLabel(this.name, {\n name: this.name,\n color: this.color,\n description: this.description,\n });\n\n await this.save();\n }\n}\n","import {\n crossPackageRef,\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ServiceEvidence,\n ServiceParticipantKind,\n ServiceTimeEntrySource,\n ServiceTimeEntryStatus,\n} from '../types.js';\nimport { parseProjectJson } from './delivery-control-plane.js';\n\nconst FROZEN_FIELDS = [\n 'tenantId',\n 'caseId',\n 'workRefType',\n 'workRefId',\n 'specialistId',\n 'participantKind',\n 'participantProfileId',\n 'agentRef',\n 'source',\n 'description',\n 'startedAt',\n 'endedAt',\n 'durationSeconds',\n 'evidence',\n 'correctionOfId',\n] as const;\n\nconst STATUS_TRANSITIONS: Record<\n ServiceTimeEntryStatus,\n ServiceTimeEntryStatus[]\n> = {\n draft: ['submitted', 'rejected'],\n submitted: ['approved', 'rejected', 'draft'],\n approved: ['corrected'],\n rejected: ['draft', 'submitted'],\n corrected: [],\n};\n\nfunction frozenView(source: Record<string, unknown>): string {\n const result: Record<string, unknown> = {};\n for (const key of FROZEN_FIELDS) {\n let value = source[key] ?? null;\n if ((key === 'startedAt' || key === 'endedAt') && value) {\n const date = value instanceof Date ? value : new Date(String(value));\n value = Number.isNaN(date.getTime()) ? String(value) : date.toISOString();\n }\n if (key === 'durationSeconds') value = Number(value ?? 0);\n result[key] = value === '' ? null : value;\n }\n return JSON.stringify(result);\n}\n\nconst loadedStatus = new WeakMap<ServiceTimeEntry, ServiceTimeEntryStatus>();\nconst chargeSnapshot = new WeakMap<ServiceChargeSnapshot, string>();\nconst compensationSnapshot = new WeakMap<ServiceCompensationSnapshot, string>();\n\nasync function immutableCommercialSnapshot(\n object: SmrtObject,\n fields: string[],\n): Promise<string | null> {\n if (!object.id) return null;\n try {\n const row = await object.db.get(object.tableName, { id: object.id });\n if (!row) return null;\n return JSON.stringify(\n Object.fromEntries(\n fields.map((key) => [\n key,\n row[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)] ?? null,\n ]),\n ),\n );\n } catch {\n return null;\n }\n}\n\nfunction commercialSnapshot(\n object: Record<string, unknown>,\n fields: string[],\n): string {\n return JSON.stringify(\n Object.fromEntries(fields.map((key) => [key, object[key] ?? null])),\n );\n}\n\nconst CHARGE_FIELDS = [\n 'timeEntryId',\n 'amount',\n 'currency',\n 'pricingVersion',\n 'strategy',\n 'rateSnapshot',\n 'sourceChargeRef',\n];\nconst COMPENSATION_FIELDS = [\n 'timeEntryId',\n 'amount',\n 'currency',\n 'termsVersion',\n 'rateSnapshot',\n];\n\n/**\n * Canonical Professional Service evidence shared by planning, development,\n * and support. Commercial snapshots are deliberately separate models.\n */\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_time_entries',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceTimeEntry extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @crossPackageRef('@happyvertical/smrt-support:SupportCase', {\n nullable: true,\n })\n caseId: string | null = null;\n @field({ type: 'text', nullable: true }) workRefType: string | null = null;\n @field({ type: 'text', nullable: true }) workRefId: string | null = null;\n @crossPackageRef('@happyvertical/smrt-support:SupportSpecialist', {\n nullable: true,\n })\n specialistId: string | null = null;\n @field({ type: 'text' }) participantKind: ServiceParticipantKind = 'human';\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n participantProfileId: string | null = null;\n @field({ type: 'text' }) agentRef: string = '';\n @field({ type: 'text' }) source: ServiceTimeEntrySource = 'manual';\n @field({ type: 'text' }) description: string = '';\n startedAt: Date | null = null;\n endedAt: Date | null = null;\n durationSeconds: number = 0;\n @field({ type: 'text' }) evidence: string = '[]';\n @field({ type: 'text' }) status: ServiceTimeEntryStatus = 'draft';\n submittedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n submittedByProfileId: string | null = null;\n approvedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n approvedByProfileId: string | null = null;\n @field({ type: 'text' }) approvalPath: string = '';\n rejectedAt: Date | null = null;\n @crossPackageRef('@happyvertical/smrt-profiles:Profile', { nullable: true })\n rejectedByProfileId: string | null = null;\n @field({ type: 'text' }) rejectionReason: string = '';\n @foreignKey('ServiceTimeEntry') correctionOfId: string | null = null;\n @field({ type: 'text' }) metadata: string = '{}';\n\n getEvidence(): ServiceEvidence[] {\n return parseProjectJson(this.evidence, []);\n }\n setEvidence(value: ServiceEvidence[]): void {\n this.evidence = JSON.stringify(value ?? []);\n }\n getMetadata(): Record<string, unknown> {\n return parseProjectJson(this.metadata, {});\n }\n setMetadata(value: Record<string, unknown>): void {\n this.metadata = JSON.stringify(value ?? {});\n }\n durationHours(): number {\n return this.durationSeconds / 3600;\n }\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved()) loadedStatus.set(this, this.status);\n return this;\n }\n\n override async save(): Promise<this> {\n const prior = await this.readPrior();\n if (\n prior &&\n prior.status !== this.status &&\n !STATUS_TRANSITIONS[prior.status].includes(this.status)\n ) {\n throw new Error(\n `ServiceTimeEntry ${this.id}: illegal status transition '${prior.status}' → '${this.status}'.`,\n );\n }\n if (\n prior &&\n (prior.status === 'approved' || prior.status === 'corrected')\n ) {\n const current = frozenView(this as unknown as Record<string, unknown>);\n if (current !== prior.frozen) {\n throw new Error(\n 'Approved ServiceTimeEntry evidence is immutable; create a correction instead.',\n );\n }\n }\n const result = (await super.save()) as this;\n loadedStatus.set(this, this.status);\n return result;\n }\n\n private async readPrior(): Promise<{\n status: ServiceTimeEntryStatus;\n frozen: string;\n } | null> {\n if (!this.id) return null;\n try {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (!row?.status) return null;\n const values: Record<string, unknown> = {};\n for (const key of FROZEN_FIELDS) {\n values[key] = row[key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)];\n }\n return {\n status: row.status as ServiceTimeEntryStatus,\n frozen: frozenView(values),\n };\n } catch {\n const status = loadedStatus.get(this);\n return status\n ? {\n status,\n frozen: frozenView(this as unknown as Record<string, unknown>),\n }\n : null;\n }\n }\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_charge_snapshots',\n conflictColumns: ['time_entry_id'],\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceChargeSnapshot extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @foreignKey('ServiceTimeEntry', { required: true }) timeEntryId: string = '';\n /**\n * Client charge in **integer minor units** of {@link currency} — `$19.99` is\n * `1999`. The `= 0` initializer is load-bearing: SMRT maps an integer literal\n * to INTEGER and a decimal literal to DECIMAL (#2401).\n *\n * Copied verbatim from the upstream `ClientCharge.amount`, so the two carry\n * the same unit by construction; a split would land cents in a major-units\n * column with no error anywhere.\n */\n amount: number = 0;\n @field({ type: 'text' }) currency: string = 'USD';\n @field({ type: 'text' }) pricingVersion: string = '';\n @field({ type: 'text' }) strategy: string = '';\n @field({ type: 'text' }) rateSnapshot: string = '{}';\n @field({ type: 'text' }) sourceChargeRef: string = '';\n createdAt: Date = new Date();\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved())\n chargeSnapshot.set(\n this,\n commercialSnapshot(\n this as unknown as Record<string, unknown>,\n CHARGE_FIELDS,\n ),\n );\n return this;\n }\n\n override async save(): Promise<this> {\n const current = commercialSnapshot(\n this as unknown as Record<string, unknown>,\n CHARGE_FIELDS,\n );\n const prior =\n (await immutableCommercialSnapshot(this, CHARGE_FIELDS)) ??\n chargeSnapshot.get(this) ??\n null;\n if (prior && prior !== current)\n throw new Error(\n 'ServiceChargeSnapshot is immutable; append an upstream adjustment instead.',\n );\n const result = (await super.save()) as this;\n chargeSnapshot.set(this, current);\n return result;\n }\n}\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: 'service_compensation_snapshots',\n conflictColumns: ['time_entry_id'],\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class ServiceCompensationSnapshot extends SmrtObject {\n @tenantId({ nullable: true }) tenantId: string | null = null;\n @foreignKey('ServiceTimeEntry', { required: true }) timeEntryId: string = '';\n /**\n * Provider earning in **integer minor units** of {@link currency} (#2401).\n *\n * Converts with {@link ServiceChargeSnapshot.amount}: the delivery margin is\n * `charge - compensation`, so a mixed pair would make that subtraction\n * meaningless.\n */\n amount: number = 0;\n @field({ type: 'text' }) currency: string = 'USD';\n @field({ type: 'text' }) termsVersion: string = '';\n @field({ type: 'text' }) rateSnapshot: string = '{}';\n createdAt: Date = new Date();\n\n override async initialize(): Promise<this> {\n await super.initialize();\n if (await this.isSaved())\n compensationSnapshot.set(\n this,\n commercialSnapshot(\n this as unknown as Record<string, unknown>,\n COMPENSATION_FIELDS,\n ),\n );\n return this;\n }\n\n override async save(): Promise<this> {\n const current = commercialSnapshot(\n this as unknown as Record<string, unknown>,\n COMPENSATION_FIELDS,\n );\n const prior =\n (await immutableCommercialSnapshot(this, COMPENSATION_FIELDS)) ??\n compensationSnapshot.get(this) ??\n null;\n if (prior && prior !== current)\n throw new Error(\n 'ServiceCompensationSnapshot is immutable; create explicit settlement evidence instead.',\n );\n const result = (await super.save()) as this;\n compensationSnapshot.set(this, current);\n return result;\n }\n}\n\nexport class ServiceTimeEntryCollection extends SmrtCollection<ServiceTimeEntry> {\n static readonly _itemClass = ServiceTimeEntry;\n async forWork(\n workRefType: string,\n workRefId: string,\n ): Promise<ServiceTimeEntry[]> {\n return this.list({\n where: { workRefType, workRefId },\n orderBy: 'created_at ASC',\n });\n }\n async forCase(caseId: string): Promise<ServiceTimeEntry[]> {\n return this.list({ where: { caseId }, orderBy: 'created_at ASC' });\n }\n async forSpecialist(specialistId: string): Promise<ServiceTimeEntry[]> {\n return this.list({ where: { specialistId }, orderBy: 'created_at ASC' });\n }\n async pendingApproval(): Promise<ServiceTimeEntry[]> {\n return this.list({\n where: { status: 'submitted' },\n orderBy: 'submitted_at ASC',\n });\n }\n}\nexport class ServiceChargeSnapshotCollection extends SmrtCollection<ServiceChargeSnapshot> {\n static readonly _itemClass = ServiceChargeSnapshot;\n}\nexport class ServiceCompensationSnapshotCollection extends SmrtCollection<ServiceCompensationSnapshot> {\n static readonly _itemClass = ServiceCompensationSnapshot;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport { ProjectIntegrationCollection } from '../collections/ProjectIntegrations.js';\nimport {\n type AssistanceRequest,\n AssistanceRequestCollection,\n AssistanceRequestEventCollection,\n} from '../models/delivery-control-plane.js';\nimport type { ProjectIntegration } from '../models/ProjectIntegration.js';\nimport type {\n AssistanceClassification,\n DevelopmentRequestEvidence,\n ManagedAssistanceRequestInput,\n} from '../types.js';\nimport { requireActiveIntegrationCapability } from './delivery-service.js';\n\nexport interface AssistanceSupportPort {\n openOrJoin(input: {\n assistanceRequestId: string;\n tenantId: string;\n projectId: string;\n requesterId: string;\n subject: string;\n conversation: Record<string, unknown>[];\n evidence: DevelopmentRequestEvidence[];\n applicationContext: Record<string, unknown>;\n }): Promise<{ caseId: string }>;\n /** Implementations must treat this handoff as idempotent. */\n linkDelivery?(input: {\n tenantId: string;\n caseId: string;\n developmentRequestId: string;\n }): Promise<void>;\n}\n\nexport class AssistanceRequestService {\n constructor(\n private readonly integrations: ProjectIntegrationCollection,\n private readonly development: DevelopmentRequestCollection,\n private readonly requests: AssistanceRequestCollection,\n private readonly events: AssistanceRequestEventCollection,\n private readonly support?: AssistanceSupportPort,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n dependencies: { support?: AssistanceSupportPort } = {},\n ): Promise<AssistanceRequestService> {\n const integrations = await ProjectIntegrationCollection.create(options);\n const sharedOptions = { ...options, db: integrations.db };\n const [development, requests, events] = await Promise.all([\n DevelopmentRequestCollection.create(sharedOptions),\n AssistanceRequestCollection.create(sharedOptions),\n AssistanceRequestEventCollection.create(sharedOptions),\n ]);\n return new AssistanceRequestService(\n integrations,\n development,\n requests,\n events,\n dependencies.support,\n );\n }\n\n async createRequest(\n integration: ProjectIntegration,\n input: ManagedAssistanceRequestInput,\n ): Promise<AssistanceRequest> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'assistance:create',\n );\n if (!input.requesterId.trim())\n throw new Error('Assistance Request requires a stable requesterId.');\n if (!input.subject.trim())\n throw new Error('Assistance Request subject is required.');\n const request = await withTenant({ tenantId: active.tenantId }, () =>\n this.requests.create({\n tenantId: active.tenantId,\n integrationId: requiredId(active.id, 'Project Integration'),\n requesterId: input.requesterId,\n subject: input.subject.trim(),\n applicationContext: JSON.stringify(input.applicationContext ?? {}),\n conversation: JSON.stringify(input.conversation ?? []),\n evidence: JSON.stringify(input.evidence ?? []),\n classification: 'unclassified',\n createdAt: new Date(),\n }),\n );\n await withTenant({ tenantId: active.tenantId }, () => request.save());\n return request;\n }\n\n async classify(\n integration: ProjectIntegration,\n request: AssistanceRequest,\n input: {\n classification: Exclude<AssistanceClassification, 'unclassified'>;\n actorRef: string;\n reason: string;\n developmentType?: string;\n },\n ): Promise<AssistanceRequest> {\n const active = await requireActiveIntegrationCapability(\n this.integrations,\n integration,\n 'assistance:create',\n );\n if (\n request.integrationId !== active.id ||\n request.tenantId !== active.tenantId\n )\n throw new Error(\n 'Assistance Request is outside this Project Integration.',\n );\n if (!input.reason.trim())\n throw new Error('Classification reason is required.');\n const prior = request.classification;\n\n if (\n (input.classification === 'support' || input.classification === 'both') &&\n !request.supportCaseId\n ) {\n if (!this.support)\n throw new Error('Support routing port is not configured.');\n const result = await this.support.openOrJoin({\n assistanceRequestId: requiredId(request.id, 'Assistance Request'),\n tenantId: request.tenantId,\n projectId: active.projectId,\n requesterId: request.requesterId,\n subject: request.subject,\n conversation: parseArray(request.conversation),\n evidence: parseEvidence(request.evidence),\n applicationContext: parseObject(request.applicationContext),\n });\n request.supportCaseId = result.caseId;\n }\n\n if (\n (input.classification === 'development' ||\n input.classification === 'both') &&\n !request.developmentRequestId\n ) {\n const integrationId = requiredId(active.id, 'Project Integration');\n const origin = `assistance:${requiredId(request.id, 'Assistance Request')}`;\n const existing = (\n await withTenant({ tenantId: active.tenantId }, () =>\n this.development.list({\n where: {\n tenantId: active.tenantId,\n projectId: active.projectId,\n integrationId,\n origin,\n },\n orderBy: 'createdAt ASC',\n limit: 1,\n }),\n )\n )[0];\n const developmentRequest =\n existing ??\n (await this.development.createManaged({\n tenantId: active.tenantId,\n projectId: active.projectId,\n integrationId,\n requesterId: request.requesterId,\n type: input.developmentType ?? 'task',\n description:\n conversationText(request.conversation) || request.subject,\n evidence: parseEvidence(request.evidence),\n origin,\n discussion: input.reason,\n visibility: 'requester',\n }));\n request.developmentRequestId = developmentRequest.id ?? '';\n }\n\n if (\n input.classification === 'both' &&\n request.supportCaseId &&\n request.developmentRequestId &&\n !request.deliveryHandoffLinkedAt &&\n this.support?.linkDelivery\n ) {\n await this.support.linkDelivery({\n tenantId: request.tenantId,\n caseId: request.supportCaseId,\n developmentRequestId: request.developmentRequestId,\n });\n request.deliveryHandoffLinkedAt = new Date();\n }\n\n request.classification = input.classification;\n await withTenant({ tenantId: request.tenantId }, () => request.save());\n const event = await withTenant({ tenantId: request.tenantId }, () =>\n this.events.create({\n tenantId: request.tenantId,\n assistanceRequestId: requiredId(request.id, 'Assistance Request'),\n priorClassification: prior,\n resultingClassification: input.classification,\n actorRef: input.actorRef,\n reason: input.reason,\n resultingLinks: JSON.stringify({\n supportCaseId: request.supportCaseId || null,\n developmentRequestId: request.developmentRequestId || null,\n }),\n occurredAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => event.save());\n return request;\n }\n}\n\nfunction parseArray(value: string): Record<string, unknown>[] {\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed)\n ? parsed.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === 'object' && !Array.isArray(item),\n )\n : [];\n } catch {\n return [];\n }\n}\n\nfunction parseObject(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction parseEvidence(value: string): DevelopmentRequestEvidence[] {\n return parseArray(value)\n .map((item) => ({\n url: typeof item.url === 'string' ? item.url : '',\n ...(typeof item.label === 'string' ? { label: item.label } : {}),\n }))\n .filter((item) => item.url.length > 0);\n}\n\nfunction conversationText(value: string): string {\n return parseArray(value)\n .map((message) => String(message.body ?? message.text ?? ''))\n .filter(Boolean)\n .join('\\n\\n');\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport { DevelopmentRequestCollection } from '../collections/DevelopmentRequests.js';\nimport type { DevelopmentRequest } from '../models/DevelopmentRequest.js';\nimport {\n type DevelopmentRequestWorkLink,\n DevelopmentRequestWorkLinkCollection,\n} from '../models/delivery-control-plane.js';\nimport type { DevelopmentTriageDecision } from '../types.js';\n\nexport interface DevelopmentWorkItem {\n type: string;\n id: string;\n canonicalStatus: string;\n providerRef?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface DevelopmentWorkAdapter {\n createWorkItem(input: {\n request: DevelopmentRequest;\n idempotencyKey: string;\n }): Promise<DevelopmentWorkItem>;\n getWorkItem(link: DevelopmentRequestWorkLink): Promise<DevelopmentWorkItem>;\n requestApproval?(input: {\n request: DevelopmentRequest;\n previewId: string;\n /** Stable across retries; adapters must deduplicate this operation. */\n idempotencyKey: string;\n approved: boolean;\n reason: string;\n }): Promise<void>;\n}\n\nexport interface DevelopmentViewer {\n tenantId: string;\n projectId: string;\n requesterId?: string;\n roles?: Array<'workspace' | 'project_team' | 'internal'>;\n}\n\nexport class DevelopmentRequestService {\n constructor(\n private readonly requests: DevelopmentRequestCollection,\n private readonly links: DevelopmentRequestWorkLinkCollection,\n readonly workAdapter?: DevelopmentWorkAdapter,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n workAdapter?: DevelopmentWorkAdapter,\n ): Promise<DevelopmentRequestService> {\n return new DevelopmentRequestService(\n await DevelopmentRequestCollection.create(options),\n await DevelopmentRequestWorkLinkCollection.create(options),\n workAdapter,\n );\n }\n\n /** Visibility is evaluated after tenant and project scoping. */\n async visibleFor(viewer: DevelopmentViewer): Promise<DevelopmentRequest[]> {\n const all = await this.requests.listForProject(\n viewer.tenantId,\n viewer.projectId,\n );\n const roles = new Set(viewer.roles ?? []);\n return all.filter((request) => {\n if (roles.has('internal')) return true;\n if (request.requesterId === viewer.requesterId) return true;\n if (\n request.visibility === 'internal' ||\n request.visibility === 'requester'\n )\n return false;\n if (request.visibility === 'public') return true;\n if (roles.has('project_team'))\n return (\n request.visibility === 'workspace' ||\n request.visibility === 'project_team'\n );\n return roles.has('workspace') && request.visibility === 'workspace';\n });\n }\n\n async linksFor(\n request: DevelopmentRequest,\n ): Promise<DevelopmentRequestWorkLink[]> {\n return withTenant({ tenantId: request.tenantId }, () =>\n this.links.list({\n where: { requestId: request.id },\n orderBy: 'createdAt ASC',\n }),\n );\n }\n\n async triage(\n request: DevelopmentRequest,\n input: {\n decision: DevelopmentTriageDecision;\n reason: string;\n actorRef: string;\n mergeIntoRequestId?: string;\n split?: Array<{ description: string; type?: string }>;\n },\n ): Promise<{\n request: DevelopmentRequest;\n links: DevelopmentRequestWorkLink[];\n splitRequests: DevelopmentRequest[];\n }> {\n if (!input.reason.trim()) throw new Error('Triage reason is required.');\n requiredId(request.id, 'Development Request');\n const createdLinks: DevelopmentRequestWorkLink[] = [];\n const splitRequests: DevelopmentRequest[] = [];\n\n if (input.decision === 'accept') {\n const existing = await this.linksFor(request);\n if (existing.length > 0) createdLinks.push(...existing);\n else {\n if (!this.workAdapter)\n throw new Error(\n 'DevelopmentWorkAdapter is required to accept requests.',\n );\n const work = await this.workAdapter.createWorkItem({\n request,\n idempotencyKey: `development-request:${request.id}`,\n });\n createdLinks.push(await this.linkWork(request, work));\n }\n if (request.status !== 'planned')\n await this.transition(request, 'planned', input.actorRef, input.reason);\n }\n\n if (input.decision === 'decline' && request.status !== 'declined')\n await this.transition(request, 'declined', input.actorRef, input.reason);\n\n if (input.decision === 'merge') {\n if (!input.mergeIntoRequestId)\n throw new Error('mergeIntoRequestId is required.');\n if (input.mergeIntoRequestId === request.id)\n throw new Error('A Development Request cannot be merged into itself.');\n const target = await withTenant({ tenantId: request.tenantId }, () =>\n this.requests.get({ id: input.mergeIntoRequestId }),\n );\n if (!target || target.projectId !== request.projectId)\n throw new Error(\n 'Merge target must be a Development Request in the same project and tenant.',\n );\n createdLinks.push(\n await this.linkWork(request, {\n type: '@happyvertical/smrt-projects:DevelopmentRequest',\n id: input.mergeIntoRequestId,\n canonicalStatus: 'merged',\n metadata: { reason: input.reason },\n }),\n );\n if (request.status !== 'triaged')\n await this.transition(request, 'triaged', input.actorRef, input.reason);\n }\n\n if (input.decision === 'split') {\n if (!input.split?.length)\n throw new Error('At least one split request is required.');\n const parts = input.split.map((part) => {\n const description = part.description.trim();\n if (!description)\n throw new Error('Split request description is required.');\n return { description, type: part.type ?? request.type };\n });\n const origin = `split:${request.id}`;\n const unmatchedExisting = await withTenant(\n { tenantId: request.tenantId },\n () =>\n this.requests.list({\n where: {\n tenantId: request.tenantId,\n projectId: request.projectId,\n integrationId: request.integrationId,\n origin,\n },\n orderBy: 'createdAt ASC',\n }),\n );\n for (const { description, type } of parts) {\n const existingIndex = unmatchedExisting.findIndex(\n (candidate) =>\n candidate.description.trim() === description &&\n candidate.type === type &&\n candidate.requesterId === request.requesterId &&\n candidate.participantId === request.participantId &&\n candidate.visibility === request.visibility,\n );\n if (existingIndex >= 0) {\n splitRequests.push(unmatchedExisting.splice(existingIndex, 1)[0]);\n } else {\n splitRequests.push(\n await this.requests.createManaged({\n tenantId: request.tenantId,\n projectId: request.projectId,\n integrationId: request.integrationId,\n requesterId: request.requesterId,\n participantId: request.participantId || undefined,\n type,\n description,\n evidence: request.getEvidence(),\n visibility: request.visibility,\n origin,\n discussion: input.reason,\n }),\n );\n }\n }\n if (request.status !== 'triaged')\n await this.transition(request, 'triaged', input.actorRef, input.reason);\n }\n\n return { request, links: createdLinks, splitRequests };\n }\n\n async syncWorkStatus(\n link: DevelopmentRequestWorkLink,\n ): Promise<DevelopmentRequest> {\n if (!this.workAdapter)\n throw new Error(\n 'DevelopmentWorkAdapter is required to project board status.',\n );\n const work = await this.workAdapter.getWorkItem(link);\n link.canonicalStatus = work.canonicalStatus;\n link.metadata = JSON.stringify(work.metadata ?? {});\n link.lastProjectedAt = new Date();\n await withTenant({ tenantId: link.tenantId }, () => link.save());\n const request = await withTenant({ tenantId: link.tenantId }, () =>\n this.requests.get({ id: link.requestId }),\n );\n if (!request)\n throw new Error(`Development Request ${link.requestId} not found.`);\n const requestLinks = await this.linksFor(request);\n const completed = requestLinks.every((item) =>\n ['done', 'closed', 'completed', 'deployed'].includes(\n item.canonicalStatus.toLowerCase(),\n ),\n );\n const nextStatus = completed ? 'completed' : 'in_progress';\n if (request.status !== nextStatus)\n await this.transition(\n request,\n nextStatus,\n 'system',\n `Canonical work status: ${work.canonicalStatus}`,\n );\n return request;\n }\n\n private async transition(\n request: DevelopmentRequest,\n status: 'triaged' | 'planned' | 'in_progress' | 'completed' | 'declined',\n actorRef: string,\n reason: string,\n ): Promise<void> {\n const updated = await this.requests.transitionStatus(\n request.tenantId,\n requiredId(request.id, 'Development Request'),\n { status, actorType: 'system', actorId: actorRef, note: reason },\n );\n request.status = updated.status;\n }\n\n private async linkWork(\n request: DevelopmentRequest,\n work: DevelopmentWorkItem,\n ): Promise<DevelopmentRequestWorkLink> {\n const existing = (\n await withTenant({ tenantId: request.tenantId }, () =>\n this.links.list({\n where: {\n requestId: request.id,\n workItemType: work.type,\n workItemId: work.id,\n },\n limit: 1,\n }),\n )\n )[0];\n if (existing) return existing;\n const link = await withTenant({ tenantId: request.tenantId }, () =>\n this.links.create({\n tenantId: request.tenantId,\n requestId: requiredId(request.id, 'Development Request'),\n workItemType: work.type,\n workItemId: work.id,\n canonicalStatus: work.canonicalStatus,\n providerRef: work.providerRef ?? '',\n metadata: JSON.stringify(work.metadata ?? {}),\n lastProjectedAt: new Date(),\n }),\n );\n await withTenant({ tenantId: request.tenantId }, () => link.save());\n return link;\n }\n}\n\nfunction requiredId(value: string | null | undefined, label: string): string {\n if (!value) throw new Error(`${label} must be saved.`);\n return value;\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport {\n ServiceChargeSnapshotCollection,\n ServiceCompensationSnapshotCollection,\n type ServiceTimeEntry,\n ServiceTimeEntryCollection,\n} from '../models/service-evidence.js';\nimport type {\n ServiceEvidence,\n ServiceParticipantKind,\n ServiceTimeEntrySource,\n} from '../types.js';\n\nexport interface RecordServiceTimeInput {\n tenantId?: string | null;\n caseId?: string | null;\n workRefType?: string | null;\n workRefId?: string | null;\n specialistId?: string | null;\n participantKind: ServiceParticipantKind;\n participantProfileId?: string | null;\n agentRef?: string;\n source: ServiceTimeEntrySource;\n description: string;\n startedAt?: Date | null;\n endedAt?: Date | null;\n durationSeconds?: number;\n evidence?: ServiceEvidence[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CommercialSnapshot {\n /**\n * Integer minor units of `currency` — `$19.99` is `1999` (#2401).\n *\n * Written straight into `ServiceChargeSnapshot.amount` /\n * `ServiceCompensationSnapshot.amount`, which are INTEGER columns, so a\n * resolver that returns major units corrupts the snapshot silently on SQLite\n * and fails with `22P02` on PostgreSQL.\n */\n amount: number;\n currency?: string;\n version: string;\n strategy?: string;\n terms: Record<string, unknown>;\n sourceRef?: string;\n}\n\nexport interface ServiceCommercialResolver {\n priceClient(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n compensateProvider(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n}\n\nexport class ServiceEvidenceService {\n constructor(\n private readonly entries: ServiceTimeEntryCollection,\n private readonly charges: ServiceChargeSnapshotCollection,\n private readonly compensation: ServiceCompensationSnapshotCollection,\n private readonly commercial?: ServiceCommercialResolver,\n ) {}\n\n static async create(\n options: SmrtClassOptions = {},\n commercial?: ServiceCommercialResolver,\n ): Promise<ServiceEvidenceService> {\n const [entries, charges, compensation] = await Promise.all([\n ServiceTimeEntryCollection.create(options),\n ServiceChargeSnapshotCollection.create(options),\n ServiceCompensationSnapshotCollection.create(options),\n ]);\n return new ServiceEvidenceService(\n entries,\n charges,\n compensation,\n commercial,\n );\n }\n\n async record(input: RecordServiceTimeInput): Promise<ServiceTimeEntry> {\n if (!input.caseId && !(input.workRefType && input.workRefId))\n throw new Error('Service time requires a case or work reference.');\n if (Boolean(input.workRefType) !== Boolean(input.workRefId))\n throw new Error('workRefType and workRefId must be provided together.');\n if (input.participantKind === 'human' && !input.participantProfileId)\n throw new Error('Human service time requires participantProfileId.');\n if (input.participantKind === 'agent' && !input.agentRef)\n throw new Error('Agent service time requires agentRef.');\n if (input.source === 'timer' && (!input.startedAt || !input.endedAt))\n throw new Error('Timer service time requires startedAt and endedAt.');\n if (input.startedAt && input.endedAt && input.startedAt >= input.endedAt)\n throw new Error('Service time startedAt must be before endedAt.');\n const duration =\n input.durationSeconds ??\n (input.startedAt && input.endedAt\n ? Math.round(\n (input.endedAt.getTime() - input.startedAt.getTime()) / 1000,\n )\n : 0);\n if (!Number.isInteger(duration) || duration <= 0)\n throw new Error(\n 'Service time durationSeconds must be a positive integer.',\n );\n const entry = await this.entries.create({\n ...input,\n durationSeconds: duration,\n evidence: JSON.stringify(input.evidence ?? []),\n metadata: JSON.stringify(input.metadata ?? {}),\n status: 'draft',\n submittedAt: null,\n submittedByProfileId: null,\n approvedAt: null,\n approvedByProfileId: null,\n approvalPath: '',\n rejectedAt: null,\n rejectedByProfileId: null,\n rejectionReason: '',\n correctionOfId: null,\n });\n await entry.save();\n return entry;\n }\n\n async submit(\n entry: ServiceTimeEntry,\n profileId?: string,\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'draft' && entry.status !== 'rejected')\n throw new Error('Only draft or rejected service time may be submitted.');\n entry.status = 'submitted';\n entry.submittedAt = new Date();\n entry.submittedByProfileId = profileId ?? null;\n return entry.save();\n }\n\n async approve(\n entry: ServiceTimeEntry,\n options: { actorProfileId?: string; approvalPath: string },\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'submitted' && entry.status !== 'approved')\n throw new Error(\n 'Only submitted service time or an incomplete approval may be approved.',\n );\n if (!this.commercial)\n throw new Error(\n 'A ServiceCommercialResolver is required to approve service time.',\n );\n const timeEntryId = entry.id;\n if (!timeEntryId)\n throw new Error('ServiceTimeEntry must be saved before approval.');\n const existingCharge = (\n await this.charges.list({ where: { timeEntryId }, limit: 1 })\n )[0];\n const existingCompensation = (\n await this.compensation.list({ where: { timeEntryId }, limit: 1 })\n )[0];\n if (entry.status === 'approved' && existingCharge && existingCompensation)\n return entry;\n\n // Commit approval before either commercial resolver runs. The subscription\n // resolver creates an approved ClientCharge as part of priceClient(), so a\n // failed approval must never leave billable spend behind.\n if (entry.status === 'submitted') {\n entry.status = 'approved';\n entry.approvedAt = new Date();\n entry.approvedByProfileId = options.actorProfileId ?? null;\n entry.approvalPath = options.approvalPath;\n try {\n await entry.save();\n } catch (error) {\n const revisionConflict =\n error instanceof Error &&\n 'code' in error &&\n error.code === 'RUNTIME_REVISION_CONFLICT';\n if (!revisionConflict) throw error;\n const concurrent = await this.entries.get(timeEntryId);\n if (concurrent?.status !== 'approved') throw error;\n entry = concurrent;\n }\n }\n const provider = existingCompensation\n ? null\n : await this.commercial.compensateProvider(entry);\n if (provider) {\n const snapshotId = await deterministicSnapshotId(\n 'service-compensation-snapshot',\n timeEntryId,\n );\n try {\n await this.compensation.create({\n id: snapshotId,\n tenantId: entry.tenantId,\n timeEntryId,\n amount: provider.amount,\n currency: provider.currency ?? 'USD',\n termsVersion: provider.version,\n rateSnapshot: JSON.stringify(provider.terms),\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent =\n (await this.compensation.get(snapshotId)) ??\n (\n await this.compensation.list({\n where: { timeEntryId },\n limit: 1,\n })\n )[0];\n if (!concurrent) throw error;\n }\n }\n const client = existingCharge\n ? null\n : await this.commercial.priceClient(entry);\n if (client) {\n const snapshotId = await deterministicSnapshotId(\n 'service-charge-snapshot',\n timeEntryId,\n );\n try {\n await this.charges.create({\n id: snapshotId,\n tenantId: entry.tenantId,\n timeEntryId,\n amount: client.amount,\n currency: client.currency ?? 'USD',\n pricingVersion: client.version,\n strategy: client.strategy ?? '',\n rateSnapshot: JSON.stringify(client.terms),\n sourceChargeRef: client.sourceRef ?? '',\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent =\n (await this.charges.get(snapshotId)) ??\n (\n await this.charges.list({\n where: { timeEntryId },\n limit: 1,\n })\n )[0];\n if (!concurrent) throw error;\n }\n }\n return entry;\n }\n\n async correct(\n entry: ServiceTimeEntry,\n input: RecordServiceTimeInput,\n ): Promise<ServiceTimeEntry> {\n if (entry.status !== 'approved')\n throw new Error('Only approved service time may be corrected.');\n if (input.tenantId !== undefined && input.tenantId !== entry.tenantId) {\n throw new Error(\n 'Service time corrections must remain in the original tenant.',\n );\n }\n const correction = await this.record({\n ...input,\n tenantId: entry.tenantId,\n });\n correction.correctionOfId = entry.id ?? null;\n await correction.save();\n entry.status = 'corrected';\n await entry.save();\n return correction;\n }\n}\n\nasync function deterministicSnapshotId(\n kind: string,\n timeEntryId: string,\n): Promise<string> {\n const bytes = new TextEncoder().encode(JSON.stringify([kind, timeEntryId]));\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));\n const uuid = digest.slice(0, 16);\n uuid[6] = (uuid[6] & 0x0f) | 0x50;\n uuid[8] = (uuid[8] & 0x3f) | 0x80;\n const hex = Array.from(uuid, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n","import {\n CommercialUsageService,\n type CommercialUsageServiceOptions,\n} from '@happyvertical/smrt-subscriptions';\nimport type { ServiceTimeEntry } from '../models/service-evidence.js';\nimport type {\n CommercialSnapshot,\n ServiceCommercialResolver,\n} from './service-evidence-service.js';\n\nexport interface ProviderCompensationResolver {\n compensate(entry: ServiceTimeEntry): Promise<CommercialSnapshot>;\n}\n\n/** Bridges shared Professional Service evidence to #1925's effective pricing. */\nexport class SubscriptionServiceCommercialResolver\n implements ServiceCommercialResolver\n{\n constructor(\n private readonly usage: CommercialUsageService,\n private readonly provider: ProviderCompensationResolver,\n ) {}\n\n static async create(\n options: CommercialUsageServiceOptions,\n provider: ProviderCompensationResolver,\n ): Promise<SubscriptionServiceCommercialResolver> {\n return new SubscriptionServiceCommercialResolver(\n await CommercialUsageService.create(options),\n provider,\n );\n }\n\n async priceClient(entry: ServiceTimeEntry): Promise<CommercialSnapshot> {\n if (!entry.id || !entry.tenantId)\n throw new Error(\n 'Saved tenant-scoped ServiceTimeEntry is required for client pricing.',\n );\n const at = entry.endedAt ?? entry.startedAt ?? new Date();\n const metadata = entry.getMetadata();\n const usageEvent = await this.usage.record({\n tenantId: entry.tenantId,\n metricKey: 'duration.seconds',\n quantity: entry.durationSeconds,\n windowStart: at,\n windowEnd: at,\n source: 'service-time-entry',\n sourceId: entry.id,\n projectId:\n typeof metadata.projectId === 'string' ? metadata.projectId : undefined,\n workRefType:\n entry.workRefType ??\n (entry.caseId ? '@happyvertical/smrt-support:SupportCase' : undefined),\n workRefId: entry.workRefId ?? entry.caseId ?? undefined,\n provider: entry.participantKind,\n dimensions: {\n serviceKey: 'professional-services',\n source: entry.source,\n specialistId: entry.specialistId,\n agentRef: entry.agentRef || undefined,\n },\n });\n if (!usageEvent.id)\n throw new Error('Professional Service usage event was not persisted.');\n const charge = await this.usage.price({\n usageEventId: usageEvent.id,\n approved: true,\n at,\n });\n const snapshot = charge.getPricingSnapshot();\n return {\n amount: charge.amount,\n currency: charge.currency,\n version: String(snapshot.ruleKey ?? charge.pricingRuleId),\n strategy: String(snapshot.strategy ?? ''),\n terms: snapshot,\n sourceRef: `@happyvertical/smrt-subscriptions:ClientCharge:${charge.id}`,\n };\n }\n\n compensateProvider(entry: ServiceTimeEntry): Promise<CommercialSnapshot> {\n return this.provider.compensate(entry);\n }\n}\n"],"mappings":"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"}
|