@mastra/factory 0.12.0-alpha.0 → 0.12.0-alpha.1
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/CHANGELOG.md +29 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +6 -1
- package/dist/factory.js.map +1 -1
- package/dist/feed-events.d.ts +13 -0
- package/dist/feed-events.d.ts.map +1 -0
- package/dist/feed-events.js +25 -0
- package/dist/feed-events.js.map +1 -0
- package/dist/integrations/github/reconcile-worker.js +1 -1
- package/dist/integrations/issue-reconcile-worker.js +1 -1
- package/dist/integrations/platform/github/event-worker.js +1 -1
- package/dist/integrations/platform/linear/event-worker.js +1 -1
- package/dist/routes/attention-activity.d.ts +24 -0
- package/dist/routes/attention-activity.d.ts.map +1 -0
- package/dist/routes/attention-activity.js +143 -0
- package/dist/routes/attention-activity.js.map +1 -0
- package/dist/routes/attention-providers.d.ts +31 -1
- package/dist/routes/attention-providers.d.ts.map +1 -1
- package/dist/routes/attention-providers.js +4 -4
- package/dist/routes/attention-providers.js.map +1 -1
- package/dist/routes/attention.d.ts.map +1 -1
- package/dist/routes/attention.js +39 -11
- package/dist/routes/attention.js.map +1 -1
- package/dist/storage/domains/comments/activity.d.ts +40 -0
- package/dist/storage/domains/comments/activity.d.ts.map +1 -0
- package/dist/storage/domains/comments/activity.js +94 -0
- package/dist/storage/domains/comments/activity.js.map +1 -0
- package/dist/storage/domains/comments/base.d.ts +13 -1
- package/dist/storage/domains/comments/base.d.ts.map +1 -1
- package/dist/storage/domains/comments/base.js +41 -3
- package/dist/storage/domains/comments/base.js.map +1 -1
- package/dist/storage/domains/comments/domain.d.ts +4 -1
- package/dist/storage/domains/comments/domain.d.ts.map +1 -1
- package/dist/storage/domains/comments/domain.js +17 -5
- package/dist/storage/domains/comments/domain.js.map +1 -1
- package/dist/storage/domains/comments/parse.d.ts +1 -0
- package/dist/storage/domains/comments/parse.d.ts.map +1 -1
- package/dist/storage/domains/comments/parse.js +2 -2
- package/dist/storage/domains/comments/parse.js.map +1 -1
- package/dist/storage/domains/comments/routes.d.ts +2 -0
- package/dist/storage/domains/comments/routes.d.ts.map +1 -1
- package/dist/storage/domains/comments/routes.js +49 -3
- package/dist/storage/domains/comments/routes.js.map +1 -1
- package/dist/storage/domains/comments/schema.d.ts +1 -0
- package/dist/storage/domains/comments/schema.d.ts.map +1 -1
- package/dist/storage/domains/comments/schema.js +45 -1
- package/dist/storage/domains/comments/schema.js.map +1 -1
- package/dist/storage/domains/work-items/base.d.ts +14 -1
- package/dist/storage/domains/work-items/base.d.ts.map +1 -1
- package/dist/storage/domains/work-items/base.js +60 -11
- package/dist/storage/domains/work-items/base.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","names":["#auth","#comments","#workItems","#projects","#channelIdentity","#members","#audit","#publishers","#rosterCache","#mirrorComment","#cleanupMentionReceipts","#organizationRoster","#seenRoster"],"sources":["../../../../src/storage/domains/comments/domain.ts"],"sourcesContent":["/**\n * Comments domain — feed orchestration behind service methods; the HTTP layer\n * lives in `routes.ts` and only maps their result statuses. Service methods\n * take the author as a `FactoryActorRef` (never derived from the request\n * inside), so agent-authored comments later become a thin tool over\n * `createComment` instead of a re-implementation.\n */\n\nimport type { ApiRoute } from '@mastra/core/server';\n\nimport type { RouteAuth } from '../../../routes/route.js';\nimport type { AuditEmitter } from '../audit/domain.js';\nimport type { ChannelIdentityStorage } from '../channel-identity/base.js';\nimport type { FactoryProjectsStorage } from '../projects/base.js';\nimport type { WorkItemRow, WorkItemsStorage } from '../work-items/base.js';\nimport { factoryMentionAttentionIdentity } from '../work-items/base.js';\nimport type { FactoryActorRef } from './actor.js';\nimport { isMentionableActorId } from './actor.js';\nimport type {\n EditWorkItemCommentResult,\n FactoryMentionRef,\n WorkItemCommentReplyRef,\n WorkItemCommentRow,\n WorkItemCommentsStorage,\n} from './base.js';\nimport { CommentTokenConflictError, commentBodyError, MAX_COMMENT_MENTIONS, MAX_COMMENT_QUOTE_LENGTH } from './base.js';\nimport type { WorkItemFeedPublisher } from './feed-sync.js';\nimport { buildCommentRoutes } from './routes.js';\n\nexport interface FactoryRosterMember {\n id: string;\n name?: string;\n avatarUrl?: string;\n}\n\nexport interface OrganizationMembersProvider {\n listOrganizationMembers(orgId: string): Promise<FactoryRosterMember[]>;\n}\n\nexport interface CommentsDomainOptions {\n auth: RouteAuth;\n comments: WorkItemCommentsStorage;\n workItems: WorkItemsStorage;\n projects: FactoryProjectsStorage;\n channelIdentity?: ChannelIdentityStorage;\n /** Host-wired org membership listing for the mention roster (e.g. WorkOS). */\n members?: OrganizationMembersProvider;\n audit?: AuditEmitter;\n /** Outbound platform mirrors (COR-1174); empty until a platform wires one. */\n publishers?: WorkItemFeedPublisher[];\n}\n\nexport interface CreateCommentServiceInput {\n orgId: string;\n workItemId: string;\n author: FactoryActorRef;\n body: string;\n replyTo?: { commentId: string; quote?: string };\n mentions?: FactoryMentionRef[];\n clientToken?: string;\n}\n\nexport type CreateCommentServiceResult =\n | { status: 'created'; comment: WorkItemCommentRow; workItem: WorkItemRow }\n | { status: 'work_item_not_found' }\n | { status: 'token_conflict' }\n | { status: 'invalid'; message: string };\n\nexport interface CommentEditor {\n userId: string;\n /** Lazily checked, only when the caller is not the author. */\n canModerate: () => Promise<boolean>;\n}\n\nexport interface EditCommentServiceInput {\n orgId: string;\n workItemId: string;\n commentId: string;\n editor: CommentEditor;\n body: string;\n mentions?: FactoryMentionRef[];\n expectedRevision?: number;\n}\n\nexport type EditCommentServiceResult =\n | ({ status: 'edited'; previousBody: string } & EditWorkItemCommentResult)\n | { status: 'not_found' }\n | { status: 'forbidden' }\n | { status: 'not_editable' }\n | { status: 'conflict' }\n | { status: 'invalid'; message: string };\n\nexport interface DeleteCommentServiceInput {\n orgId: string;\n workItemId: string;\n commentId: string;\n editor: CommentEditor;\n}\n\nexport type DeleteCommentServiceResult =\n | { status: 'deleted'; comment: WorkItemCommentRow }\n | { status: 'not_found' }\n | { status: 'forbidden' }\n | { status: 'not_editable' };\n\nconst MAX_ROSTER_SIZE = 100;\nconst ROSTER_CACHE_TTL_MS = 60_000;\n\nexport class CommentsDomain {\n readonly #auth: RouteAuth;\n readonly #comments: WorkItemCommentsStorage;\n readonly #workItems: WorkItemsStorage;\n readonly #projects: FactoryProjectsStorage;\n readonly #channelIdentity: ChannelIdentityStorage | undefined;\n readonly #members: OrganizationMembersProvider | undefined;\n readonly #audit: AuditEmitter | undefined;\n readonly #publishers: WorkItemFeedPublisher[];\n readonly #rosterCache = new Map<string, { at: number; members: FactoryRosterMember[] }>();\n\n constructor({\n auth,\n comments,\n workItems,\n projects,\n channelIdentity,\n members,\n audit,\n publishers,\n }: CommentsDomainOptions) {\n this.#auth = auth;\n this.#comments = comments;\n this.#workItems = workItems;\n this.#projects = projects;\n this.#channelIdentity = channelIdentity;\n this.#members = members;\n this.#audit = audit;\n this.#publishers = publishers ?? [];\n }\n\n async createComment(input: CreateCommentServiceInput): Promise<CreateCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const bodyError = commentBodyError(input.body);\n if (bodyError) return { status: 'invalid', message: bodyError };\n if ((input.mentions?.length ?? 0) > MAX_COMMENT_MENTIONS) {\n return { status: 'invalid', message: `At most ${MAX_COMMENT_MENTIONS} mentions per comment.` };\n }\n\n const workItem = await this.#workItems.get({ orgId: input.orgId, id: input.workItemId });\n if (!workItem) return { status: 'work_item_not_found' };\n\n let replyTo: WorkItemCommentReplyRef | undefined;\n if (input.replyTo) {\n const parent = await this.#comments.get({ orgId: input.orgId, commentId: input.replyTo.commentId });\n if (!parent || parent.workItemId !== input.workItemId) {\n return { status: 'invalid', message: 'Reply target is not a comment on this work item.' };\n }\n replyTo = {\n commentId: parent.id,\n ...(input.replyTo.quote ? { quote: input.replyTo.quote.slice(0, MAX_COMMENT_QUOTE_LENGTH) } : {}),\n authorId: parent.author.id,\n ...(parent.author.displayName ? { authorName: parent.author.displayName } : {}),\n };\n }\n\n let comment: WorkItemCommentRow;\n try {\n comment = await this.#comments.create({\n orgId: input.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId: input.workItemId,\n author: input.author,\n body: input.body,\n ...(replyTo ? { replyTo } : {}),\n ...(input.mentions ? { mentions: input.mentions } : {}),\n ...(input.clientToken ? { clientToken: input.clientToken } : {}),\n });\n } catch (error) {\n if (error instanceof CommentTokenConflictError) return { status: 'token_conflict' };\n throw error;\n }\n await this.#comments.refreshWorkItemFeedActivity({\n orgId: input.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId: input.workItemId,\n });\n await this.#mirrorComment(comment, workItem);\n return { status: 'created', comment, workItem };\n }\n\n /**\n * Best-effort: a failed publish never fails the create. The write-back is\n * the replay guard — a replayed create sees its own platform on the row and\n * skips it. Known ceiling, single publisher only: `external_source` is\n * single-valued, so with two publishers a replayed create re-publishes to\n * the one that is not recorded, and nothing persists a failed attempt for a\n * later pass to retry. Both need an outbox if a second publisher ever lands.\n */\n async #mirrorComment(comment: WorkItemCommentRow, workItem: WorkItemRow): Promise<void> {\n let current = comment;\n for (const publisher of this.#publishers) {\n if (current.externalSource?.integrationId === publisher.id) continue;\n try {\n const { source } = await publisher.publish(current, workItem);\n current =\n (await this.#comments.attachExternalSource({ orgId: current.orgId, commentId: current.id, source })) ??\n current;\n } catch (err) {\n console.warn('[Comments] Failed to mirror a comment to a platform', {\n publisherId: publisher.id,\n commentId: current.id,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n async editComment(input: EditCommentServiceInput): Promise<EditCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const bodyError = commentBodyError(input.body);\n if (bodyError) return { status: 'invalid', message: bodyError };\n if ((input.mentions?.length ?? 0) > MAX_COMMENT_MENTIONS) {\n return { status: 'invalid', message: `At most ${MAX_COMMENT_MENTIONS} mentions per comment.` };\n }\n\n const existing = await this.#comments.get({ orgId: input.orgId, commentId: input.commentId });\n if (!existing || existing.workItemId !== input.workItemId) return { status: 'not_found' };\n if (existing.deletedAt) return { status: 'not_editable' };\n if (existing.author.id !== input.editor.userId && !(await input.editor.canModerate())) {\n return { status: 'forbidden' };\n }\n\n const edited = await this.#comments.edit({\n orgId: input.orgId,\n commentId: input.commentId,\n body: input.body,\n editorId: input.editor.userId,\n ...(input.mentions ? { mentions: input.mentions } : {}),\n ...(input.expectedRevision !== undefined ? { expectedRevision: input.expectedRevision } : {}),\n });\n if (edited === 'conflict') return { status: 'conflict' };\n if (!edited) return { status: 'not_editable' };\n\n await this.#cleanupMentionReceipts(existing, edited.removedMentions);\n await this.#comments.refreshWorkItemFeedActivity({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n workItemId: existing.workItemId,\n });\n return { status: 'edited', previousBody: existing.body, ...edited };\n }\n\n async deleteComment(input: DeleteCommentServiceInput): Promise<DeleteCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const existing = await this.#comments.get({ orgId: input.orgId, commentId: input.commentId });\n if (!existing || existing.workItemId !== input.workItemId) return { status: 'not_found' };\n if (existing.deletedAt) return { status: 'not_editable' };\n if (existing.author.id !== input.editor.userId && !(await input.editor.canModerate())) {\n return { status: 'forbidden' };\n }\n\n const deleted = await this.#comments.softDelete({\n orgId: input.orgId,\n commentId: input.commentId,\n deletedBy: input.editor.userId,\n });\n if (!deleted) return { status: 'not_editable' };\n\n await this.#workItems.deleteAttentionReceipts({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n identities: [factoryMentionAttentionIdentity(existing.id)],\n });\n await this.#comments.refreshWorkItemFeedActivity({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n workItemId: existing.workItemId,\n });\n return { status: 'deleted', comment: deleted };\n }\n\n /**\n * A removed mention deletes only that user's receipt: the receipt identity\n * is per-comment, and other still-mentioned users must keep their read state.\n */\n async #cleanupMentionReceipts(comment: WorkItemCommentRow, removed: FactoryMentionRef[]): Promise<void> {\n for (const mention of removed) {\n await this.#workItems.deleteAttentionReceipts({\n orgId: comment.orgId,\n factoryProjectId: comment.factoryProjectId,\n userId: mention.id,\n identities: [factoryMentionAttentionIdentity(comment.id)],\n });\n }\n }\n\n /**\n * Mentionable people: the host's org roster when it answers, otherwise the\n * people the project has actually seen (comment authors, linked channel\n * accounts). Cached per project so a dropdown session costs one read.\n */\n async mentionRoster({\n orgId,\n factoryProjectId,\n }: {\n orgId: string;\n factoryProjectId: string;\n }): Promise<FactoryRosterMember[]> {\n const cacheKey = `${orgId}\\0${factoryProjectId}`;\n const cached = this.#rosterCache.get(cacheKey);\n if (cached && Date.now() - cached.at < ROSTER_CACHE_TTL_MS) return cached.members;\n\n const members = await this.#organizationRoster(orgId);\n if (members.size === 0) await this.#seenRoster(orgId, factoryProjectId, members);\n\n const roster = [...members.values()].slice(0, MAX_ROSTER_SIZE);\n // Sweep on write: a long-lived server would otherwise hold one roster per\n // project it ever served.\n const cutoff = Date.now() - ROSTER_CACHE_TTL_MS;\n for (const [key, entry] of this.#rosterCache) {\n if (entry.at < cutoff) this.#rosterCache.delete(key);\n }\n this.#rosterCache.set(cacheKey, { at: Date.now(), members: roster });\n return roster;\n }\n\n /** Empty when no provider is wired, or when the host listing fails. */\n async #organizationRoster(orgId: string): Promise<Map<string, FactoryRosterMember>> {\n const members = new Map<string, FactoryRosterMember>();\n if (!this.#members) return members;\n try {\n for (const member of await this.#members.listOrganizationMembers(orgId)) {\n if (isMentionableActorId(member.id)) members.set(member.id, member);\n }\n } catch (err) {\n console.warn('[Comments] Failed to list organization members for the mention roster', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return members;\n }\n\n async #seenRoster(orgId: string, factoryProjectId: string, members: Map<string, FactoryRosterMember>): Promise<void> {\n for (const author of await this.#comments.listRecentAuthors({ orgId, factoryProjectId })) {\n if (author.kind !== 'user' || !isMentionableActorId(author.id)) continue;\n members.set(author.id, {\n id: author.id,\n ...(author.displayName ? { name: author.displayName } : {}),\n ...(author.avatarUrl ? { avatarUrl: author.avatarUrl } : {}),\n });\n }\n if (!this.#channelIdentity) return;\n await this.#channelIdentity.ensureReady();\n for (const link of await this.#channelIdentity.listAccountLinksForOrg(orgId)) {\n if (members.has(link.userId)) continue;\n members.set(link.userId, {\n id: link.userId,\n ...(link.externalUserName ? { name: link.externalUserName } : {}),\n });\n }\n }\n\n routes(): ApiRoute[] {\n return buildCommentRoutes({\n domain: this,\n auth: this.#auth,\n comments: this.#comments,\n workItems: this.#workItems,\n projects: this.#projects,\n ...(this.#audit ? { audit: this.#audit } : {}),\n });\n }\n}\n\nexport { toWireComment } from './wire.js';\nexport type { WireComment, WireCommentPage } from './wire.js';\n"],"mappings":";;;;;;AAyGA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,+BAAwB,IAAI,IAA4D;CAExF,YAAY,EACV,MACA,UACA,WACA,UACA,iBACA,SACA,OACA,cACwB;EACxB,KAAKA,QAAQ;EACb,KAAKC,YAAY;EACjB,KAAKC,aAAa;EAClB,KAAKC,YAAY;EACjB,KAAKC,mBAAmB;EACxB,KAAKC,WAAW;EAChB,KAAKC,SAAS;EACd,KAAKC,cAAc,cAAc,CAAC;CACpC;CAEA,MAAM,cAAc,OAAuE;EACzF,MAAM,KAAKN,UAAU,YAAY;EACjC,MAAM,KAAKC,WAAW,YAAY;EAElC,MAAM,YAAY,iBAAiB,MAAM,IAAI;EAC7C,IAAI,WAAW,OAAO;GAAE,QAAQ;GAAW,SAAS;EAAU;EAC9D,KAAK,MAAM,UAAU,UAAU,KAAA,IAC7B,OAAO;GAAE,QAAQ;GAAW,SAAS;EAAwD;EAG/F,MAAM,WAAW,MAAM,KAAKA,WAAW,IAAI;GAAE,OAAO,MAAM;GAAO,IAAI,MAAM;EAAW,CAAC;EACvF,IAAI,CAAC,UAAU,OAAO,EAAE,QAAQ,sBAAsB;EAEtD,IAAI;EACJ,IAAI,MAAM,SAAS;GACjB,MAAM,SAAS,MAAM,KAAKD,UAAU,IAAI;IAAE,OAAO,MAAM;IAAO,WAAW,MAAM,QAAQ;GAAU,CAAC;GAClG,IAAI,CAAC,UAAU,OAAO,eAAe,MAAM,YACzC,OAAO;IAAE,QAAQ;IAAW,SAAS;GAAmD;GAE1F,UAAU;IACR,WAAW,OAAO;IAClB,GAAI,MAAM,QAAQ,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,MAAM,GAAA,GAA2B,EAAE,IAAI,CAAC;IAC/F,UAAU,OAAO,OAAO;IACxB,GAAI,OAAO,OAAO,cAAc,EAAE,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;GAC/E;EACF;EAEA,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,KAAKA,UAAU,OAAO;IACpC,OAAO,MAAM;IACb,kBAAkB,SAAS;IAC3B,YAAY,MAAM;IAClB,QAAQ,MAAM;IACd,MAAM,MAAM;IACZ,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;IAC7B,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;IACrD,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;GAChE,CAAC;EACH,SAAS,OAAO;GACd,IAAI,iBAAiB,2BAA2B,OAAO,EAAE,QAAQ,iBAAiB;GAClF,MAAM;EACR;EACA,MAAM,KAAKA,UAAU,4BAA4B;GAC/C,OAAO,MAAM;GACb,kBAAkB,SAAS;GAC3B,YAAY,MAAM;EACpB,CAAC;EACD,MAAM,KAAKQ,eAAe,SAAS,QAAQ;EAC3C,OAAO;GAAE,QAAQ;GAAW;GAAS;EAAS;CAChD;;;;;;;;;CAUA,MAAMA,eAAe,SAA6B,UAAsC;EACtF,IAAI,UAAU;EACd,KAAK,MAAM,aAAa,KAAKF,aAAa;GACxC,IAAI,QAAQ,gBAAgB,kBAAkB,UAAU,IAAI;GAC5D,IAAI;IACF,MAAM,EAAE,WAAW,MAAM,UAAU,QAAQ,SAAS,QAAQ;IAC5D,UACG,MAAM,KAAKN,UAAU,qBAAqB;KAAE,OAAO,QAAQ;KAAO,WAAW,QAAQ;KAAI;IAAO,CAAC,KAClG;GACJ,SAAS,KAAK;IACZ,QAAQ,KAAK,uDAAuD;KAClE,aAAa,UAAU;KACvB,WAAW,QAAQ;KACnB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;IACxD,CAAC;GACH;EACF;CACF;CAEA,MAAM,YAAY,OAAmE;EACnF,MAAM,KAAKA,UAAU,YAAY;EACjC,MAAM,KAAKC,WAAW,YAAY;EAElC,MAAM,YAAY,iBAAiB,MAAM,IAAI;EAC7C,IAAI,WAAW,OAAO;GAAE,QAAQ;GAAW,SAAS;EAAU;EAC9D,KAAK,MAAM,UAAU,UAAU,KAAA,IAC7B,OAAO;GAAE,QAAQ;GAAW,SAAS;EAAwD;EAG/F,MAAM,WAAW,MAAM,KAAKD,UAAU,IAAI;GAAE,OAAO,MAAM;GAAO,WAAW,MAAM;EAAU,CAAC;EAC5F,IAAI,CAAC,YAAY,SAAS,eAAe,MAAM,YAAY,OAAO,EAAE,QAAQ,YAAY;EACxF,IAAI,SAAS,WAAW,OAAO,EAAE,QAAQ,eAAe;EACxD,IAAI,SAAS,OAAO,OAAO,MAAM,OAAO,UAAU,CAAE,MAAM,MAAM,OAAO,YAAY,GACjF,OAAO,EAAE,QAAQ,YAAY;EAG/B,MAAM,SAAS,MAAM,KAAKA,UAAU,KAAK;GACvC,OAAO,MAAM;GACb,WAAW,MAAM;GACjB,MAAM,MAAM;GACZ,UAAU,MAAM,OAAO;GACvB,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;GACrD,GAAI,MAAM,qBAAqB,KAAA,IAAY,EAAE,kBAAkB,MAAM,iBAAiB,IAAI,CAAC;EAC7F,CAAC;EACD,IAAI,WAAW,YAAY,OAAO,EAAE,QAAQ,WAAW;EACvD,IAAI,CAAC,QAAQ,OAAO,EAAE,QAAQ,eAAe;EAE7C,MAAM,KAAKS,wBAAwB,UAAU,OAAO,eAAe;EACnE,MAAM,KAAKT,UAAU,4BAA4B;GAC/C,OAAO,SAAS;GAChB,kBAAkB,SAAS;GAC3B,YAAY,SAAS;EACvB,CAAC;EACD,OAAO;GAAE,QAAQ;GAAU,cAAc,SAAS;GAAM,GAAG;EAAO;CACpE;CAEA,MAAM,cAAc,OAAuE;EACzF,MAAM,KAAKA,UAAU,YAAY;EACjC,MAAM,KAAKC,WAAW,YAAY;EAElC,MAAM,WAAW,MAAM,KAAKD,UAAU,IAAI;GAAE,OAAO,MAAM;GAAO,WAAW,MAAM;EAAU,CAAC;EAC5F,IAAI,CAAC,YAAY,SAAS,eAAe,MAAM,YAAY,OAAO,EAAE,QAAQ,YAAY;EACxF,IAAI,SAAS,WAAW,OAAO,EAAE,QAAQ,eAAe;EACxD,IAAI,SAAS,OAAO,OAAO,MAAM,OAAO,UAAU,CAAE,MAAM,MAAM,OAAO,YAAY,GACjF,OAAO,EAAE,QAAQ,YAAY;EAG/B,MAAM,UAAU,MAAM,KAAKA,UAAU,WAAW;GAC9C,OAAO,MAAM;GACb,WAAW,MAAM;GACjB,WAAW,MAAM,OAAO;EAC1B,CAAC;EACD,IAAI,CAAC,SAAS,OAAO,EAAE,QAAQ,eAAe;EAE9C,MAAM,KAAKC,WAAW,wBAAwB;GAC5C,OAAO,SAAS;GAChB,kBAAkB,SAAS;GAC3B,YAAY,CAAC,gCAAgC,SAAS,EAAE,CAAC;EAC3D,CAAC;EACD,MAAM,KAAKD,UAAU,4BAA4B;GAC/C,OAAO,SAAS;GAChB,kBAAkB,SAAS;GAC3B,YAAY,SAAS;EACvB,CAAC;EACD,OAAO;GAAE,QAAQ;GAAW,SAAS;EAAQ;CAC/C;;;;;CAMA,MAAMS,wBAAwB,SAA6B,SAA6C;EACtG,KAAK,MAAM,WAAW,SACpB,MAAM,KAAKR,WAAW,wBAAwB;GAC5C,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC1B,QAAQ,QAAQ;GAChB,YAAY,CAAC,gCAAgC,QAAQ,EAAE,CAAC;EAC1D,CAAC;CAEL;;;;;;CAOA,MAAM,cAAc,EAClB,OACA,oBAIiC;EACjC,MAAM,WAAW,GAAG,MAAM,IAAI;EAC9B,MAAM,SAAS,KAAKM,aAAa,IAAI,QAAQ;EAC7C,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,qBAAqB,OAAO,OAAO;EAE1E,MAAM,UAAU,MAAM,KAAKG,oBAAoB,KAAK;EACpD,IAAI,QAAQ,SAAS,GAAG,MAAM,KAAKC,YAAY,OAAO,kBAAkB,OAAO;EAE/E,MAAM,SAAS,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,eAAe;EAG7D,MAAM,SAAS,KAAK,IAAI,IAAI;EAC5B,KAAK,MAAM,CAAC,KAAK,UAAU,KAAKJ,cAC9B,IAAI,MAAM,KAAK,QAAQ,KAAKA,aAAa,OAAO,GAAG;EAErD,KAAKA,aAAa,IAAI,UAAU;GAAE,IAAI,KAAK,IAAI;GAAG,SAAS;EAAO,CAAC;EACnE,OAAO;CACT;;CAGA,MAAMG,oBAAoB,OAA0D;EAClF,MAAM,0BAAU,IAAI,IAAiC;EACrD,IAAI,CAAC,KAAKN,UAAU,OAAO;EAC3B,IAAI;GACF,KAAK,MAAM,UAAU,MAAM,KAAKA,SAAS,wBAAwB,KAAK,GACpE,IAAI,qBAAqB,OAAO,EAAE,GAAG,QAAQ,IAAI,OAAO,IAAI,MAAM;EAEtE,SAAS,KAAK;GACZ,QAAQ,KAAK,yEAAyE,EACpF,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EACxD,CAAC;EACH;EACA,OAAO;CACT;CAEA,MAAMO,YAAY,OAAe,kBAA0B,SAA0D;EACnH,KAAK,MAAM,UAAU,MAAM,KAAKX,UAAU,kBAAkB;GAAE;GAAO;EAAiB,CAAC,GAAG;GACxF,IAAI,OAAO,SAAS,UAAU,CAAC,qBAAqB,OAAO,EAAE,GAAG;GAChE,QAAQ,IAAI,OAAO,IAAI;IACrB,IAAI,OAAO;IACX,GAAI,OAAO,cAAc,EAAE,MAAM,OAAO,YAAY,IAAI,CAAC;IACzD,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;GAC5D,CAAC;EACH;EACA,IAAI,CAAC,KAAKG,kBAAkB;EAC5B,MAAM,KAAKA,iBAAiB,YAAY;EACxC,KAAK,MAAM,QAAQ,MAAM,KAAKA,iBAAiB,uBAAuB,KAAK,GAAG;GAC5E,IAAI,QAAQ,IAAI,KAAK,MAAM,GAAG;GAC9B,QAAQ,IAAI,KAAK,QAAQ;IACvB,IAAI,KAAK;IACT,GAAI,KAAK,mBAAmB,EAAE,MAAM,KAAK,iBAAiB,IAAI,CAAC;GACjE,CAAC;EACH;CACF;CAEA,SAAqB;EACnB,OAAO,mBAAmB;GACxB,QAAQ;GACR,MAAM,KAAKJ;GACX,UAAU,KAAKC;GACf,WAAW,KAAKC;GAChB,UAAU,KAAKC;GACf,GAAI,KAAKG,SAAS,EAAE,OAAO,KAAKA,OAAO,IAAI,CAAC;EAC9C,CAAC;CACH;AACF"}
|
|
1
|
+
{"version":3,"file":"domain.js","names":["#auth","#comments","#workItems","#projects","#channelIdentity","#members","#audit","#publishers","#pubsub","#rosterCache","#touchFeed","#mirrorComment","#cleanupMentionReceipts","#organizationRoster","#seenRoster"],"sources":["../../../../src/storage/domains/comments/domain.ts"],"sourcesContent":["/**\n * Comments domain — feed orchestration behind service methods; the HTTP layer\n * lives in `routes.ts` and only maps their result statuses. Service methods\n * take the author as a `FactoryActorRef` (never derived from the request\n * inside), so agent-authored comments later become a thin tool over\n * `createComment` instead of a re-implementation.\n */\n\nimport type { PubSub } from '@mastra/core/events';\nimport type { ApiRoute } from '@mastra/core/server';\n\nimport { touchFeed } from '../../../feed-events.js';\nimport type { RouteAuth } from '../../../routes/route.js';\nimport type { AuditEmitter } from '../audit/domain.js';\nimport type { ChannelIdentityStorage } from '../channel-identity/base.js';\nimport type { FactoryProjectsStorage } from '../projects/base.js';\nimport type { WorkItemRow, WorkItemsStorage } from '../work-items/base.js';\nimport { factoryMentionAttentionIdentity } from '../work-items/base.js';\nimport type { FactoryActorRef } from './actor.js';\nimport { isMentionableActorId } from './actor.js';\nimport type {\n EditWorkItemCommentResult,\n FactoryMentionRef,\n WorkItemCommentReplyRef,\n WorkItemCommentRow,\n WorkItemCommentsStorage,\n} from './base.js';\nimport { CommentTokenConflictError, commentBodyError, MAX_COMMENT_MENTIONS, MAX_COMMENT_QUOTE_LENGTH } from './base.js';\nimport type { WorkItemFeedPublisher } from './feed-sync.js';\nimport { buildCommentRoutes } from './routes.js';\n\nexport interface FactoryRosterMember {\n id: string;\n name?: string;\n avatarUrl?: string;\n}\n\nexport interface OrganizationMembersProvider {\n listOrganizationMembers(orgId: string): Promise<FactoryRosterMember[]>;\n}\n\nexport interface CommentsDomainOptions {\n auth: RouteAuth;\n comments: WorkItemCommentsStorage;\n workItems: WorkItemsStorage;\n projects: FactoryProjectsStorage;\n channelIdentity?: ChannelIdentityStorage;\n /** Host-wired org membership listing for the mention roster (e.g. WorkOS). */\n members?: OrganizationMembersProvider;\n audit?: AuditEmitter;\n /** Outbound platform mirrors (COR-1174); empty until a platform wires one. */\n publishers?: WorkItemFeedPublisher[];\n /** Carries feed touches to every replica's open SSE streams. */\n pubsub: PubSub;\n}\n\nexport interface CreateCommentServiceInput {\n orgId: string;\n workItemId: string;\n author: FactoryActorRef;\n body: string;\n replyTo?: { commentId: string; quote?: string };\n mentions?: FactoryMentionRef[];\n clientToken?: string;\n}\n\nexport type CreateCommentServiceResult =\n | { status: 'created'; comment: WorkItemCommentRow; workItem: WorkItemRow }\n | { status: 'work_item_not_found' }\n | { status: 'token_conflict' }\n | { status: 'invalid'; message: string };\n\nexport interface CommentEditor {\n userId: string;\n /** Lazily checked, only when the caller is not the author. */\n canModerate: () => Promise<boolean>;\n}\n\nexport interface EditCommentServiceInput {\n orgId: string;\n workItemId: string;\n commentId: string;\n editor: CommentEditor;\n body: string;\n mentions?: FactoryMentionRef[];\n expectedRevision?: number;\n}\n\nexport type EditCommentServiceResult =\n | ({ status: 'edited'; previousBody: string } & EditWorkItemCommentResult)\n | { status: 'not_found' }\n | { status: 'forbidden' }\n | { status: 'not_editable' }\n | { status: 'conflict' }\n | { status: 'invalid'; message: string };\n\nexport interface DeleteCommentServiceInput {\n orgId: string;\n workItemId: string;\n commentId: string;\n editor: CommentEditor;\n}\n\nexport type DeleteCommentServiceResult =\n | { status: 'deleted'; comment: WorkItemCommentRow }\n | { status: 'not_found' }\n | { status: 'forbidden' }\n | { status: 'not_editable' };\n\nconst MAX_ROSTER_SIZE = 100;\nconst ROSTER_CACHE_TTL_MS = 60_000;\n\nexport class CommentsDomain {\n readonly #auth: RouteAuth;\n readonly #comments: WorkItemCommentsStorage;\n readonly #workItems: WorkItemsStorage;\n readonly #projects: FactoryProjectsStorage;\n readonly #channelIdentity: ChannelIdentityStorage | undefined;\n readonly #members: OrganizationMembersProvider | undefined;\n readonly #audit: AuditEmitter | undefined;\n readonly #publishers: WorkItemFeedPublisher[];\n readonly #pubsub: PubSub;\n readonly #rosterCache = new Map<string, { at: number; members: FactoryRosterMember[] }>();\n\n constructor({\n auth,\n comments,\n workItems,\n projects,\n channelIdentity,\n members,\n audit,\n publishers,\n pubsub,\n }: CommentsDomainOptions) {\n this.#auth = auth;\n this.#comments = comments;\n this.#workItems = workItems;\n this.#projects = projects;\n this.#channelIdentity = channelIdentity;\n this.#members = members;\n this.#audit = audit;\n this.#publishers = publishers ?? [];\n this.#pubsub = pubsub;\n }\n\n /**\n * The one seam every feed mutation routes through — future\n * `WorkItemFeedIngest` impls included.\n */\n async #touchFeed(scope: { orgId: string; factoryProjectId: string; workItemId: string }): Promise<void> {\n await this.#comments.refreshWorkItemFeedActivity(scope);\n touchFeed(this.#pubsub, scope, scope.workItemId);\n }\n\n async createComment(input: CreateCommentServiceInput): Promise<CreateCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const bodyError = commentBodyError(input.body);\n if (bodyError) return { status: 'invalid', message: bodyError };\n if ((input.mentions?.length ?? 0) > MAX_COMMENT_MENTIONS) {\n return { status: 'invalid', message: `At most ${MAX_COMMENT_MENTIONS} mentions per comment.` };\n }\n\n const workItem = await this.#workItems.get({ orgId: input.orgId, id: input.workItemId });\n if (!workItem) return { status: 'work_item_not_found' };\n\n let replyTo: WorkItemCommentReplyRef | undefined;\n if (input.replyTo) {\n const parent = await this.#comments.get({ orgId: input.orgId, commentId: input.replyTo.commentId });\n if (!parent || parent.workItemId !== input.workItemId) {\n return { status: 'invalid', message: 'Reply target is not a comment on this work item.' };\n }\n replyTo = {\n commentId: parent.id,\n ...(input.replyTo.quote ? { quote: input.replyTo.quote.slice(0, MAX_COMMENT_QUOTE_LENGTH) } : {}),\n authorId: parent.author.id,\n ...(parent.author.displayName ? { authorName: parent.author.displayName } : {}),\n };\n }\n\n let comment: WorkItemCommentRow;\n try {\n comment = await this.#comments.create({\n orgId: input.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId: input.workItemId,\n author: input.author,\n body: input.body,\n ...(replyTo ? { replyTo } : {}),\n ...(input.mentions ? { mentions: input.mentions } : {}),\n ...(input.clientToken ? { clientToken: input.clientToken } : {}),\n });\n } catch (error) {\n if (error instanceof CommentTokenConflictError) return { status: 'token_conflict' };\n throw error;\n }\n await this.#touchFeed({\n orgId: input.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId: input.workItemId,\n });\n await this.#mirrorComment(comment, workItem);\n return { status: 'created', comment, workItem };\n }\n\n /**\n * Best-effort: a failed publish never fails the create. The write-back is\n * the replay guard — a replayed create sees its own platform on the row and\n * skips it. Known ceiling, single publisher only: `external_source` is\n * single-valued, so with two publishers a replayed create re-publishes to\n * the one that is not recorded, and nothing persists a failed attempt for a\n * later pass to retry. Both need an outbox if a second publisher ever lands.\n */\n async #mirrorComment(comment: WorkItemCommentRow, workItem: WorkItemRow): Promise<void> {\n let current = comment;\n for (const publisher of this.#publishers) {\n if (current.externalSource?.integrationId === publisher.id) continue;\n try {\n const { source } = await publisher.publish(current, workItem);\n current =\n (await this.#comments.attachExternalSource({ orgId: current.orgId, commentId: current.id, source })) ??\n current;\n } catch (err) {\n console.warn('[Comments] Failed to mirror a comment to a platform', {\n publisherId: publisher.id,\n commentId: current.id,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n async editComment(input: EditCommentServiceInput): Promise<EditCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const bodyError = commentBodyError(input.body);\n if (bodyError) return { status: 'invalid', message: bodyError };\n if ((input.mentions?.length ?? 0) > MAX_COMMENT_MENTIONS) {\n return { status: 'invalid', message: `At most ${MAX_COMMENT_MENTIONS} mentions per comment.` };\n }\n\n const existing = await this.#comments.get({ orgId: input.orgId, commentId: input.commentId });\n if (!existing || existing.workItemId !== input.workItemId) return { status: 'not_found' };\n if (existing.deletedAt) return { status: 'not_editable' };\n if (existing.author.id !== input.editor.userId && !(await input.editor.canModerate())) {\n return { status: 'forbidden' };\n }\n\n const edited = await this.#comments.edit({\n orgId: input.orgId,\n commentId: input.commentId,\n body: input.body,\n editorId: input.editor.userId,\n ...(input.mentions ? { mentions: input.mentions } : {}),\n ...(input.expectedRevision !== undefined ? { expectedRevision: input.expectedRevision } : {}),\n });\n if (edited === 'conflict') return { status: 'conflict' };\n if (!edited) return { status: 'not_editable' };\n\n await this.#cleanupMentionReceipts(existing, edited.removedMentions);\n await this.#touchFeed({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n workItemId: existing.workItemId,\n });\n return { status: 'edited', previousBody: existing.body, ...edited };\n }\n\n async deleteComment(input: DeleteCommentServiceInput): Promise<DeleteCommentServiceResult> {\n await this.#comments.ensureReady();\n await this.#workItems.ensureReady();\n\n const existing = await this.#comments.get({ orgId: input.orgId, commentId: input.commentId });\n if (!existing || existing.workItemId !== input.workItemId) return { status: 'not_found' };\n if (existing.deletedAt) return { status: 'not_editable' };\n if (existing.author.id !== input.editor.userId && !(await input.editor.canModerate())) {\n return { status: 'forbidden' };\n }\n\n const deleted = await this.#comments.softDelete({\n orgId: input.orgId,\n commentId: input.commentId,\n deletedBy: input.editor.userId,\n });\n if (!deleted) return { status: 'not_editable' };\n\n await this.#workItems.deleteAttentionReceipts({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n identities: [factoryMentionAttentionIdentity(existing.id)],\n });\n await this.#touchFeed({\n orgId: existing.orgId,\n factoryProjectId: existing.factoryProjectId,\n workItemId: existing.workItemId,\n });\n return { status: 'deleted', comment: deleted };\n }\n\n /**\n * A removed mention deletes only that user's receipt: the receipt identity\n * is per-comment, and other still-mentioned users must keep their read state.\n */\n async #cleanupMentionReceipts(comment: WorkItemCommentRow, removed: FactoryMentionRef[]): Promise<void> {\n for (const mention of removed) {\n await this.#workItems.deleteAttentionReceipts({\n orgId: comment.orgId,\n factoryProjectId: comment.factoryProjectId,\n userId: mention.id,\n identities: [factoryMentionAttentionIdentity(comment.id)],\n });\n }\n }\n\n /**\n * Mentionable people: the host's org roster when it answers, otherwise the\n * people the project has actually seen (comment authors, linked channel\n * accounts). Cached per project so a dropdown session costs one read.\n */\n async mentionRoster({\n orgId,\n factoryProjectId,\n }: {\n orgId: string;\n factoryProjectId: string;\n }): Promise<FactoryRosterMember[]> {\n const cacheKey = `${orgId}\\0${factoryProjectId}`;\n const cached = this.#rosterCache.get(cacheKey);\n if (cached && Date.now() - cached.at < ROSTER_CACHE_TTL_MS) return cached.members;\n\n const members = await this.#organizationRoster(orgId);\n if (members.size === 0) await this.#seenRoster(orgId, factoryProjectId, members);\n\n const roster = [...members.values()].slice(0, MAX_ROSTER_SIZE);\n // Sweep on write: a long-lived server would otherwise hold one roster per\n // project it ever served.\n const cutoff = Date.now() - ROSTER_CACHE_TTL_MS;\n for (const [key, entry] of this.#rosterCache) {\n if (entry.at < cutoff) this.#rosterCache.delete(key);\n }\n this.#rosterCache.set(cacheKey, { at: Date.now(), members: roster });\n return roster;\n }\n\n /** Empty when no provider is wired, or when the host listing fails. */\n async #organizationRoster(orgId: string): Promise<Map<string, FactoryRosterMember>> {\n const members = new Map<string, FactoryRosterMember>();\n if (!this.#members) return members;\n try {\n for (const member of await this.#members.listOrganizationMembers(orgId)) {\n if (isMentionableActorId(member.id)) members.set(member.id, member);\n }\n } catch (err) {\n console.warn('[Comments] Failed to list organization members for the mention roster', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return members;\n }\n\n async #seenRoster(orgId: string, factoryProjectId: string, members: Map<string, FactoryRosterMember>): Promise<void> {\n for (const author of await this.#comments.listRecentAuthors({ orgId, factoryProjectId })) {\n if (author.kind !== 'user' || !isMentionableActorId(author.id)) continue;\n members.set(author.id, {\n id: author.id,\n ...(author.displayName ? { name: author.displayName } : {}),\n ...(author.avatarUrl ? { avatarUrl: author.avatarUrl } : {}),\n });\n }\n if (!this.#channelIdentity) return;\n await this.#channelIdentity.ensureReady();\n for (const link of await this.#channelIdentity.listAccountLinksForOrg(orgId)) {\n if (members.has(link.userId)) continue;\n members.set(link.userId, {\n id: link.userId,\n ...(link.externalUserName ? { name: link.externalUserName } : {}),\n });\n }\n }\n\n routes(): ApiRoute[] {\n return buildCommentRoutes({\n domain: this,\n auth: this.#auth,\n comments: this.#comments,\n workItems: this.#workItems,\n projects: this.#projects,\n pubsub: this.#pubsub,\n ...(this.#audit ? { audit: this.#audit } : {}),\n });\n }\n}\n\nexport { toWireComment } from './wire.js';\nexport type { WireComment, WireCommentPage } from './wire.js';\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import type { Context } from 'hono';
|
|
3
3
|
import type { FactoryMentionRef } from './base.js';
|
|
4
4
|
export declare const UUID_RE: RegExp;
|
|
5
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
5
6
|
export declare function readJson(c: Context): Promise<unknown>;
|
|
6
7
|
export interface ParsedCreateComment {
|
|
7
8
|
body: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/parse.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,eAAO,MAAM,OAAO,QAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/parse.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,eAAO,MAAM,OAAO,QAAoE,CAAC;AAGzF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAM3D;AAyCD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAkB/E;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAe3E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { commentBodyError } from "./base.js";
|
|
2
1
|
import { isMentionableActorId } from "./actor.js";
|
|
2
|
+
import { commentBodyError } from "./base.js";
|
|
3
3
|
//#region src/storage/domains/comments/parse.ts
|
|
4
4
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
5
5
|
const CLIENT_TOKEN_RE = /^[A-Za-z0-9-]{8,64}$/;
|
|
@@ -85,6 +85,6 @@ function parseEditCommentBody(raw) {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
//#endregion
|
|
88
|
-
export { UUID_RE, parseCreateCommentBody, parseEditCommentBody, readJson };
|
|
88
|
+
export { UUID_RE, isRecord, parseCreateCommentBody, parseEditCommentBody, readJson };
|
|
89
89
|
|
|
90
90
|
//# sourceMappingURL=parse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","names":[],"sources":["../../../../src/storage/domains/comments/parse.ts"],"sourcesContent":["/** Request-body parsing for the comment routes: unknown JSON in, a typed input or `null` out. */\n\nimport type { Context } from 'hono';\n\nimport { isMentionableActorId } from './actor.js';\nimport type { FactoryMentionRef } from './base.js';\nimport { commentBodyError, MAX_COMMENT_MENTIONS, MAX_COMMENT_QUOTE_LENGTH } from './base.js';\n\nexport const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst CLIENT_TOKEN_RE = /^[A-Za-z0-9-]{8,64}$/;\n\
|
|
1
|
+
{"version":3,"file":"parse.js","names":[],"sources":["../../../../src/storage/domains/comments/parse.ts"],"sourcesContent":["/** Request-body parsing for the comment routes: unknown JSON in, a typed input or `null` out. */\n\nimport type { Context } from 'hono';\n\nimport { isMentionableActorId } from './actor.js';\nimport type { FactoryMentionRef } from './base.js';\nimport { commentBodyError, MAX_COMMENT_MENTIONS, MAX_COMMENT_QUOTE_LENGTH } from './base.js';\n\nexport const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst CLIENT_TOKEN_RE = /^[A-Za-z0-9-]{8,64}$/;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport async function readJson(c: Context): Promise<unknown> {\n try {\n return await c.req.json();\n } catch {\n return undefined;\n }\n}\n\n/** `undefined` when the field is absent, `null` when it is present but malformed. */\nfunction parseMentions(raw: unknown): FactoryMentionRef[] | null | undefined {\n if (raw === undefined) return undefined;\n if (!Array.isArray(raw) || raw.length > MAX_COMMENT_MENTIONS) return null;\n const mentions: FactoryMentionRef[] = [];\n for (const entry of raw) {\n if (!isRecord(entry)) return null;\n if (entry.kind !== 'user' || typeof entry.id !== 'string' || !isMentionableActorId(entry.id)) return null;\n mentions.push({ kind: 'user', id: entry.id });\n }\n return mentions;\n}\n\nfunction parseBody(raw: unknown): string | null {\n if (typeof raw !== 'string' || commentBodyError(raw)) return null;\n return raw;\n}\n\nfunction parseClientToken(raw: unknown): string | null | undefined {\n if (raw === undefined) return undefined;\n if (typeof raw !== 'string' || !CLIENT_TOKEN_RE.test(raw)) return null;\n return raw;\n}\n\nfunction parseExpectedRevision(raw: unknown): number | null | undefined {\n if (raw === undefined) return undefined;\n if (typeof raw !== 'number' || !Number.isInteger(raw)) return null;\n return raw;\n}\n\nfunction parseReplyTo(raw: unknown): { commentId: string; quote?: string } | null | undefined {\n if (raw === undefined) return undefined;\n if (!isRecord(raw)) return null;\n if (typeof raw.commentId !== 'string' || !UUID_RE.test(raw.commentId)) return null;\n if (raw.quote !== undefined && typeof raw.quote !== 'string') return null;\n const quote = typeof raw.quote === 'string' ? raw.quote.slice(0, MAX_COMMENT_QUOTE_LENGTH) : undefined;\n return { commentId: raw.commentId, ...(quote ? { quote } : {}) };\n}\n\nexport interface ParsedCreateComment {\n body: string;\n clientToken?: string;\n replyTo?: { commentId: string; quote?: string };\n mentions?: FactoryMentionRef[];\n}\n\nexport function parseCreateCommentBody(raw: unknown): ParsedCreateComment | null {\n if (!isRecord(raw)) return null;\n\n const body = parseBody(raw.body);\n if (body === null) return null;\n const mentions = parseMentions(raw.mentions);\n if (mentions === null) return null;\n const replyTo = parseReplyTo(raw.replyTo);\n if (replyTo === null) return null;\n const clientToken = parseClientToken(raw.clientToken);\n if (clientToken === null) return null;\n\n return {\n body,\n ...(clientToken ? { clientToken } : {}),\n ...(replyTo ? { replyTo } : {}),\n ...(mentions ? { mentions } : {}),\n };\n}\n\nexport interface ParsedEditComment {\n body: string;\n mentions?: FactoryMentionRef[];\n expectedRevision?: number;\n}\n\nexport function parseEditCommentBody(raw: unknown): ParsedEditComment | null {\n if (!isRecord(raw)) return null;\n\n const body = parseBody(raw.body);\n if (body === null) return null;\n const mentions = parseMentions(raw.mentions);\n if (mentions === null) return null;\n const expectedRevision = parseExpectedRevision(raw.expectedRevision);\n if (expectedRevision === null) return null;\n\n return {\n body,\n ...(mentions ? { mentions } : {}),\n ...(expectedRevision !== undefined ? { expectedRevision } : {}),\n };\n}\n"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* validate the path ids, delegate to a `CommentsDomain` service method, map its
|
|
4
4
|
* result status to a status code, then emit audit.
|
|
5
5
|
*/
|
|
6
|
+
import type { PubSub } from '@mastra/core/events';
|
|
6
7
|
import type { ApiRoute } from '@mastra/core/server';
|
|
7
8
|
import type { RouteAuth } from '../../../routes/route.js';
|
|
8
9
|
import type { AuditEmitter } from '../audit/domain.js';
|
|
@@ -16,6 +17,7 @@ export interface CommentRouteDependencies {
|
|
|
16
17
|
comments: WorkItemCommentsStorage;
|
|
17
18
|
workItems: WorkItemsStorage;
|
|
18
19
|
projects: FactoryProjectsStorage;
|
|
20
|
+
pubsub: PubSub;
|
|
19
21
|
audit?: AuditEmitter;
|
|
20
22
|
}
|
|
21
23
|
export declare function buildCommentRoutes(dependencies: CommentRouteDependencies): ApiRoute[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAOpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;AAWjE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAWD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,wBAAwB,GAAG,QAAQ,EAAE,CAyRrF"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { getFactoryAuthUser } from "../../../auth.js";
|
|
2
|
-
import {
|
|
2
|
+
import { feedTopic } from "../../../feed-events.js";
|
|
3
3
|
import { actorFromAuthUser } from "./actor.js";
|
|
4
|
-
import {
|
|
4
|
+
import { decodeCommentCursor } from "./base.js";
|
|
5
|
+
import { UUID_RE, isRecord, parseCreateCommentBody, parseEditCommentBody, readJson } from "./parse.js";
|
|
5
6
|
import { toWireComment } from "./wire.js";
|
|
6
7
|
import { registerApiRoute } from "@mastra/core/server";
|
|
8
|
+
import { streamSSE } from "hono/streaming";
|
|
7
9
|
//#region src/storage/domains/comments/routes.ts
|
|
8
10
|
const MAX_AUDIT_BODY_SNAPSHOT = 1024;
|
|
11
|
+
/** Comment frames only — proxies drop an idle stream, and `write` can't detect a dead peer. */
|
|
12
|
+
const FEED_KEEPALIVE_MS = 25e3;
|
|
9
13
|
function loose(c) {
|
|
10
14
|
return c;
|
|
11
15
|
}
|
|
12
16
|
function buildCommentRoutes(dependencies) {
|
|
13
|
-
const { domain, auth, comments, workItems, projects, audit } = dependencies;
|
|
17
|
+
const { domain, auth, comments, workItems, projects, pubsub, audit } = dependencies;
|
|
14
18
|
async function resolveTenant(c) {
|
|
15
19
|
await auth.ensureUser(c);
|
|
16
20
|
const tenant = auth.tenant(c);
|
|
@@ -239,6 +243,48 @@ function buildCommentRoutes(dependencies) {
|
|
|
239
243
|
const members = query ? roster.filter((member) => (member.name ?? member.id).toLowerCase().startsWith(query)) : roster;
|
|
240
244
|
return c.json({ members });
|
|
241
245
|
}
|
|
246
|
+
}),
|
|
247
|
+
registerApiRoute("/web/factory/projects/:id/feed-events", {
|
|
248
|
+
method: "GET",
|
|
249
|
+
handler: async (cc) => {
|
|
250
|
+
const c = loose(cc);
|
|
251
|
+
const tenant = await resolveTenant(c);
|
|
252
|
+
if ("response" in tenant) return tenant.response;
|
|
253
|
+
const projectId = c.req.param("id");
|
|
254
|
+
if (!projectId || !UUID_RE.test(projectId)) return c.json({ error: "Project not found" }, 404);
|
|
255
|
+
await projects.ensureReady();
|
|
256
|
+
if (!await projects.get({
|
|
257
|
+
orgId: tenant.orgId,
|
|
258
|
+
id: projectId
|
|
259
|
+
})) return c.json({ error: "Project not found" }, 404);
|
|
260
|
+
const topic = feedTopic(tenant.orgId, projectId);
|
|
261
|
+
return streamSSE(c, async (stream) => {
|
|
262
|
+
const onEvent = async (event) => {
|
|
263
|
+
if (stream.aborted) return;
|
|
264
|
+
const data = event.data;
|
|
265
|
+
const workItemId = isRecord(data) && typeof data.workItemId === "string" ? data.workItemId : void 0;
|
|
266
|
+
await stream.writeSSE({
|
|
267
|
+
event: "feed",
|
|
268
|
+
data: JSON.stringify(workItemId ? { workItemId } : {})
|
|
269
|
+
});
|
|
270
|
+
};
|
|
271
|
+
const closed = new Promise((resolve) => stream.onAbort(resolve));
|
|
272
|
+
let keepalive;
|
|
273
|
+
try {
|
|
274
|
+
await pubsub.subscribe(topic, onEvent, { startFrom: "latest" });
|
|
275
|
+
if (!stream.aborted) {
|
|
276
|
+
keepalive = setInterval(() => {
|
|
277
|
+
if (stream.aborted) return;
|
|
278
|
+
stream.write(": ping\n\n");
|
|
279
|
+
}, FEED_KEEPALIVE_MS);
|
|
280
|
+
await closed;
|
|
281
|
+
}
|
|
282
|
+
} finally {
|
|
283
|
+
clearInterval(keepalive);
|
|
284
|
+
await pubsub.unsubscribe(topic, onEvent);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
242
288
|
})
|
|
243
289
|
];
|
|
244
290
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","names":[],"sources":["../../../../src/storage/domains/comments/routes.ts"],"sourcesContent":["/**\n * HTTP for the item feed. Every handler is the same shape: resolve the tenant,\n * validate the path ids, delegate to a `CommentsDomain` service method, map its\n * result status to a status code, then emit audit.\n */\n\nimport type { ApiRoute } from '@mastra/core/server';\nimport { registerApiRoute } from '@mastra/core/server';\nimport type { Context } from 'hono';\n\nimport { getFactoryAuthUser } from '../../../auth.js';\nimport type { RouteAuth } from '../../../routes/route.js';\nimport type { AuditEmitter } from '../audit/domain.js';\nimport type { FactoryProjectsStorage } from '../projects/base.js';\nimport type { WorkItemsStorage } from '../work-items/base.js';\nimport { actorFromAuthUser } from './actor.js';\nimport type { WorkItemCommentsStorage } from './base.js';\nimport { decodeCommentCursor } from './base.js';\nimport type { CommentEditor, CommentsDomain } from './domain.js';\nimport { parseCreateCommentBody, parseEditCommentBody, readJson, UUID_RE } from './parse.js';\nimport { toWireComment } from './wire.js';\nimport type { WireCommentPage } from './wire.js';\n\nconst MAX_AUDIT_BODY_SNAPSHOT = 1024;\n\nexport interface CommentRouteDependencies {\n domain: CommentsDomain;\n auth: RouteAuth;\n comments: WorkItemCommentsStorage;\n workItems: WorkItemsStorage;\n projects: FactoryProjectsStorage;\n audit?: AuditEmitter;\n}\n\ninterface Tenant {\n orgId: string;\n userId: string;\n}\n\nfunction loose(c: unknown): Context {\n return c as Context;\n}\n\nexport function buildCommentRoutes(dependencies: CommentRouteDependencies): ApiRoute[] {\n const { domain, auth, comments, workItems, projects, audit } = dependencies;\n\n async function resolveTenant(c: Context): Promise<Tenant | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (!tenant.orgId) {\n return {\n response: c.json({ error: 'organization_required', message: 'The item feed requires an organization.' }, 403),\n };\n }\n return { orgId: tenant.orgId, userId: tenant.userId };\n }\n\n function editorFor(c: Context, tenant: Tenant): CommentEditor {\n return {\n userId: tenant.userId,\n canModerate: () => auth.isOrganizationAdmin(c, tenant.orgId),\n };\n }\n\n async function emitMentionAudit(\n c: Context,\n target: { factoryProjectId: string; workItemId: string; title?: string },\n commentId: string,\n mentionedIds: string[],\n ): Promise<void> {\n if (mentionedIds.length === 0) return;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_mentioned',\n factoryProjectId: target.factoryProjectId,\n targets: [{ type: 'work_item', id: target.workItemId, ...(target.title ? { name: target.title } : {}) }],\n metadata: { commentId, mentionedIds },\n },\n });\n }\n\n return [\n registerApiRoute('/web/factory/work-items/:workItemId/comments', {\n method: 'GET',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n if (!workItemId || !UUID_RE.test(workItemId)) return c.json({ error: 'Work item not found' }, 404);\n await workItems.ensureReady();\n const workItem = await workItems.get({ orgId: tenant.orgId, id: workItemId });\n if (!workItem) return c.json({ error: 'Work item not found' }, 404);\n\n await comments.ensureReady();\n const limitRaw = c.req.query('limit');\n const limit = limitRaw ? Number.parseInt(limitRaw, 10) : undefined;\n const before = c.req.query('before') || undefined;\n if (before && !decodeCommentCursor(before)) return c.json({ error: 'invalid_cursor' }, 422);\n const around = c.req.query('around') || undefined;\n if (around && !UUID_RE.test(around)) return c.json({ error: 'invalid_comment_id' }, 422);\n const page = await comments.list({\n orgId: tenant.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId,\n before,\n ...(around ? { around } : {}),\n ...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),\n });\n const wirePage: WireCommentPage = {\n comments: page.comments.map(comment => toWireComment(comment, tenant.userId)),\n ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n };\n return c.json(wirePage);\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments', {\n method: 'POST',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n if (!workItemId || !UUID_RE.test(workItemId)) return c.json({ error: 'Work item not found' }, 404);\n\n const parsed = parseCreateCommentBody(await readJson(c));\n if (!parsed) return c.json({ error: 'invalid_comment' }, 422);\n\n const result = await domain.createComment({\n orgId: tenant.orgId,\n workItemId,\n author: actorFromAuthUser(tenant.userId, getFactoryAuthUser(c)),\n body: parsed.body,\n ...(parsed.replyTo ? { replyTo: parsed.replyTo } : {}),\n ...(parsed.mentions ? { mentions: parsed.mentions } : {}),\n ...(parsed.clientToken ? { clientToken: parsed.clientToken } : {}),\n });\n if (result.status === 'work_item_not_found') return c.json({ error: 'Work item not found' }, 404);\n if (result.status === 'token_conflict') return c.json({ error: 'comment_token_conflict' }, 409);\n if (result.status === 'invalid') return c.json({ error: 'invalid_comment', message: result.message }, 422);\n\n const { comment, workItem } = result;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_created',\n factoryProjectId: workItem.factoryProjectId,\n targets: [{ type: 'work_item', id: workItem.id, name: workItem.title }],\n metadata: { commentId: comment.id },\n },\n });\n await emitMentionAudit(\n c,\n { factoryProjectId: workItem.factoryProjectId, workItemId: workItem.id, title: workItem.title },\n comment.id,\n comment.mentions.map(mention => mention.id).filter(id => id !== comment.author.id),\n );\n return c.json({ comment: toWireComment(comment, tenant.userId) }, 201);\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments/:commentId', {\n method: 'PATCH',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n const commentId = c.req.param('commentId');\n if (!workItemId || !UUID_RE.test(workItemId) || !commentId || !UUID_RE.test(commentId)) {\n return c.json({ error: 'Comment not found' }, 404);\n }\n\n const parsed = parseEditCommentBody(await readJson(c));\n if (!parsed) return c.json({ error: 'invalid_comment' }, 422);\n\n const result = await domain.editComment({\n orgId: tenant.orgId,\n workItemId,\n commentId,\n editor: editorFor(c, tenant),\n body: parsed.body,\n ...(parsed.mentions ? { mentions: parsed.mentions } : {}),\n ...(parsed.expectedRevision !== undefined ? { expectedRevision: parsed.expectedRevision } : {}),\n });\n if (result.status === 'not_found') return c.json({ error: 'Comment not found' }, 404);\n if (result.status === 'forbidden') return c.json({ error: 'not_comment_author' }, 403);\n if (result.status === 'not_editable') return c.json({ error: 'comment_not_editable' }, 409);\n if (result.status === 'conflict') return c.json({ error: 'comment_conflict' }, 409);\n if (result.status === 'invalid') return c.json({ error: 'invalid_comment', message: result.message }, 422);\n\n const { comment } = result;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_edited',\n factoryProjectId: comment.factoryProjectId,\n targets: [{ type: 'work_item', id: comment.workItemId }],\n metadata: {\n commentId: comment.id,\n previousBody: result.previousBody.slice(0, MAX_AUDIT_BODY_SNAPSHOT),\n },\n },\n });\n await emitMentionAudit(\n c,\n { factoryProjectId: comment.factoryProjectId, workItemId: comment.workItemId },\n comment.id,\n result.addedMentions.map(mention => mention.id),\n );\n return c.json({ comment: toWireComment(comment, tenant.userId) });\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments/:commentId', {\n method: 'DELETE',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n const commentId = c.req.param('commentId');\n if (!workItemId || !UUID_RE.test(workItemId) || !commentId || !UUID_RE.test(commentId)) {\n return c.json({ error: 'Comment not found' }, 404);\n }\n\n const result = await domain.deleteComment({\n orgId: tenant.orgId,\n workItemId,\n commentId,\n editor: editorFor(c, tenant),\n });\n if (result.status === 'not_found') return c.json({ error: 'Comment not found' }, 404);\n if (result.status === 'forbidden') return c.json({ error: 'not_comment_author' }, 403);\n if (result.status === 'not_editable') return c.json({ error: 'comment_not_editable' }, 409);\n\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_deleted',\n factoryProjectId: result.comment.factoryProjectId,\n targets: [{ type: 'work_item', id: result.comment.workItemId }],\n metadata: { commentId: result.comment.id },\n },\n });\n return c.json({ comment: toWireComment(result.comment, tenant.userId) });\n },\n }),\n\n registerApiRoute('/web/factory/projects/:id/mention-roster', {\n method: 'GET',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const projectId = c.req.param('id');\n if (!projectId || !UUID_RE.test(projectId)) return c.json({ error: 'Project not found' }, 404);\n await projects.ensureReady();\n const project = await projects.get({ orgId: tenant.orgId, id: projectId });\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n await comments.ensureReady();\n const roster = await domain.mentionRoster({ orgId: tenant.orgId, factoryProjectId: projectId });\n const query = c.req.query('q')?.trim().toLowerCase();\n const members = query\n ? roster.filter(member => (member.name ?? member.id).toLowerCase().startsWith(query))\n : roster;\n return c.json({ members });\n },\n }),\n ];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routes.js","names":[],"sources":["../../../../src/storage/domains/comments/routes.ts"],"sourcesContent":["/**\n * HTTP for the item feed. Every handler is the same shape: resolve the tenant,\n * validate the path ids, delegate to a `CommentsDomain` service method, map its\n * result status to a status code, then emit audit.\n */\n\nimport type { EventCallback, PubSub } from '@mastra/core/events';\nimport type { ApiRoute } from '@mastra/core/server';\nimport { registerApiRoute } from '@mastra/core/server';\nimport type { Context } from 'hono';\nimport { streamSSE } from 'hono/streaming';\n\nimport { getFactoryAuthUser } from '../../../auth.js';\nimport { feedTopic } from '../../../feed-events.js';\nimport type { RouteAuth } from '../../../routes/route.js';\nimport type { AuditEmitter } from '../audit/domain.js';\nimport type { FactoryProjectsStorage } from '../projects/base.js';\nimport type { WorkItemsStorage } from '../work-items/base.js';\nimport { actorFromAuthUser } from './actor.js';\nimport type { WorkItemCommentsStorage } from './base.js';\nimport { decodeCommentCursor } from './base.js';\nimport type { CommentEditor, CommentsDomain } from './domain.js';\nimport { isRecord, parseCreateCommentBody, parseEditCommentBody, readJson, UUID_RE } from './parse.js';\nimport { toWireComment } from './wire.js';\nimport type { WireCommentPage } from './wire.js';\n\nconst MAX_AUDIT_BODY_SNAPSHOT = 1024;\n/** Comment frames only — proxies drop an idle stream, and `write` can't detect a dead peer. */\nconst FEED_KEEPALIVE_MS = 25_000;\n// Ceiling: one broker subscription per open tab, not per project. A per-replica\n// topic multiplexer is the upgrade path if tab counts ever make that hurt.\n\nexport interface CommentRouteDependencies {\n domain: CommentsDomain;\n auth: RouteAuth;\n comments: WorkItemCommentsStorage;\n workItems: WorkItemsStorage;\n projects: FactoryProjectsStorage;\n pubsub: PubSub;\n audit?: AuditEmitter;\n}\n\ninterface Tenant {\n orgId: string;\n userId: string;\n}\n\nfunction loose(c: unknown): Context {\n return c as Context;\n}\n\nexport function buildCommentRoutes(dependencies: CommentRouteDependencies): ApiRoute[] {\n const { domain, auth, comments, workItems, projects, pubsub, audit } = dependencies;\n\n async function resolveTenant(c: Context): Promise<Tenant | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (!tenant.orgId) {\n return {\n response: c.json({ error: 'organization_required', message: 'The item feed requires an organization.' }, 403),\n };\n }\n return { orgId: tenant.orgId, userId: tenant.userId };\n }\n\n function editorFor(c: Context, tenant: Tenant): CommentEditor {\n return {\n userId: tenant.userId,\n canModerate: () => auth.isOrganizationAdmin(c, tenant.orgId),\n };\n }\n\n async function emitMentionAudit(\n c: Context,\n target: { factoryProjectId: string; workItemId: string; title?: string },\n commentId: string,\n mentionedIds: string[],\n ): Promise<void> {\n if (mentionedIds.length === 0) return;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_mentioned',\n factoryProjectId: target.factoryProjectId,\n targets: [{ type: 'work_item', id: target.workItemId, ...(target.title ? { name: target.title } : {}) }],\n metadata: { commentId, mentionedIds },\n },\n });\n }\n\n return [\n registerApiRoute('/web/factory/work-items/:workItemId/comments', {\n method: 'GET',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n if (!workItemId || !UUID_RE.test(workItemId)) return c.json({ error: 'Work item not found' }, 404);\n await workItems.ensureReady();\n const workItem = await workItems.get({ orgId: tenant.orgId, id: workItemId });\n if (!workItem) return c.json({ error: 'Work item not found' }, 404);\n\n await comments.ensureReady();\n const limitRaw = c.req.query('limit');\n const limit = limitRaw ? Number.parseInt(limitRaw, 10) : undefined;\n const before = c.req.query('before') || undefined;\n if (before && !decodeCommentCursor(before)) return c.json({ error: 'invalid_cursor' }, 422);\n const around = c.req.query('around') || undefined;\n if (around && !UUID_RE.test(around)) return c.json({ error: 'invalid_comment_id' }, 422);\n const page = await comments.list({\n orgId: tenant.orgId,\n factoryProjectId: workItem.factoryProjectId,\n workItemId,\n before,\n ...(around ? { around } : {}),\n ...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),\n });\n const wirePage: WireCommentPage = {\n comments: page.comments.map(comment => toWireComment(comment, tenant.userId)),\n ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),\n };\n return c.json(wirePage);\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments', {\n method: 'POST',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n if (!workItemId || !UUID_RE.test(workItemId)) return c.json({ error: 'Work item not found' }, 404);\n\n const parsed = parseCreateCommentBody(await readJson(c));\n if (!parsed) return c.json({ error: 'invalid_comment' }, 422);\n\n const result = await domain.createComment({\n orgId: tenant.orgId,\n workItemId,\n author: actorFromAuthUser(tenant.userId, getFactoryAuthUser(c)),\n body: parsed.body,\n ...(parsed.replyTo ? { replyTo: parsed.replyTo } : {}),\n ...(parsed.mentions ? { mentions: parsed.mentions } : {}),\n ...(parsed.clientToken ? { clientToken: parsed.clientToken } : {}),\n });\n if (result.status === 'work_item_not_found') return c.json({ error: 'Work item not found' }, 404);\n if (result.status === 'token_conflict') return c.json({ error: 'comment_token_conflict' }, 409);\n if (result.status === 'invalid') return c.json({ error: 'invalid_comment', message: result.message }, 422);\n\n const { comment, workItem } = result;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_created',\n factoryProjectId: workItem.factoryProjectId,\n targets: [{ type: 'work_item', id: workItem.id, name: workItem.title }],\n metadata: { commentId: comment.id },\n },\n });\n await emitMentionAudit(\n c,\n { factoryProjectId: workItem.factoryProjectId, workItemId: workItem.id, title: workItem.title },\n comment.id,\n comment.mentions.map(mention => mention.id).filter(id => id !== comment.author.id),\n );\n return c.json({ comment: toWireComment(comment, tenant.userId) }, 201);\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments/:commentId', {\n method: 'PATCH',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n const commentId = c.req.param('commentId');\n if (!workItemId || !UUID_RE.test(workItemId) || !commentId || !UUID_RE.test(commentId)) {\n return c.json({ error: 'Comment not found' }, 404);\n }\n\n const parsed = parseEditCommentBody(await readJson(c));\n if (!parsed) return c.json({ error: 'invalid_comment' }, 422);\n\n const result = await domain.editComment({\n orgId: tenant.orgId,\n workItemId,\n commentId,\n editor: editorFor(c, tenant),\n body: parsed.body,\n ...(parsed.mentions ? { mentions: parsed.mentions } : {}),\n ...(parsed.expectedRevision !== undefined ? { expectedRevision: parsed.expectedRevision } : {}),\n });\n if (result.status === 'not_found') return c.json({ error: 'Comment not found' }, 404);\n if (result.status === 'forbidden') return c.json({ error: 'not_comment_author' }, 403);\n if (result.status === 'not_editable') return c.json({ error: 'comment_not_editable' }, 409);\n if (result.status === 'conflict') return c.json({ error: 'comment_conflict' }, 409);\n if (result.status === 'invalid') return c.json({ error: 'invalid_comment', message: result.message }, 422);\n\n const { comment } = result;\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_edited',\n factoryProjectId: comment.factoryProjectId,\n targets: [{ type: 'work_item', id: comment.workItemId }],\n metadata: {\n commentId: comment.id,\n previousBody: result.previousBody.slice(0, MAX_AUDIT_BODY_SNAPSHOT),\n },\n },\n });\n await emitMentionAudit(\n c,\n { factoryProjectId: comment.factoryProjectId, workItemId: comment.workItemId },\n comment.id,\n result.addedMentions.map(mention => mention.id),\n );\n return c.json({ comment: toWireComment(comment, tenant.userId) });\n },\n }),\n\n registerApiRoute('/web/factory/work-items/:workItemId/comments/:commentId', {\n method: 'DELETE',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const workItemId = c.req.param('workItemId');\n const commentId = c.req.param('commentId');\n if (!workItemId || !UUID_RE.test(workItemId) || !commentId || !UUID_RE.test(commentId)) {\n return c.json({ error: 'Comment not found' }, 404);\n }\n\n const result = await domain.deleteComment({\n orgId: tenant.orgId,\n workItemId,\n commentId,\n editor: editorFor(c, tenant),\n });\n if (result.status === 'not_found') return c.json({ error: 'Comment not found' }, 404);\n if (result.status === 'forbidden') return c.json({ error: 'not_comment_author' }, 403);\n if (result.status === 'not_editable') return c.json({ error: 'comment_not_editable' }, 409);\n\n await audit?.emit({\n context: c,\n input: {\n action: 'factory.work_item.comment_deleted',\n factoryProjectId: result.comment.factoryProjectId,\n targets: [{ type: 'work_item', id: result.comment.workItemId }],\n metadata: { commentId: result.comment.id },\n },\n });\n return c.json({ comment: toWireComment(result.comment, tenant.userId) });\n },\n }),\n\n registerApiRoute('/web/factory/projects/:id/mention-roster', {\n method: 'GET',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const projectId = c.req.param('id');\n if (!projectId || !UUID_RE.test(projectId)) return c.json({ error: 'Project not found' }, 404);\n await projects.ensureReady();\n const project = await projects.get({ orgId: tenant.orgId, id: projectId });\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n await comments.ensureReady();\n const roster = await domain.mentionRoster({ orgId: tenant.orgId, factoryProjectId: projectId });\n const query = c.req.query('q')?.trim().toLowerCase();\n const members = query\n ? roster.filter(member => (member.name ?? member.id).toLowerCase().startsWith(query))\n : roster;\n return c.json({ members });\n },\n }),\n\n registerApiRoute('/web/factory/projects/:id/feed-events', {\n method: 'GET',\n handler: async cc => {\n const c = loose(cc);\n const tenant = await resolveTenant(c);\n if ('response' in tenant) return tenant.response;\n\n const projectId = c.req.param('id');\n if (!projectId || !UUID_RE.test(projectId)) return c.json({ error: 'Project not found' }, 404);\n await projects.ensureReady();\n const project = await projects.get({ orgId: tenant.orgId, id: projectId });\n if (!project) return c.json({ error: 'Project not found' }, 404);\n\n const topic = feedTopic(tenant.orgId, projectId);\n return streamSSE(c, async stream => {\n const onEvent: EventCallback = async event => {\n if (stream.aborted) return;\n const data = event.data;\n const workItemId = isRecord(data) && typeof data.workItemId === 'string' ? data.workItemId : undefined;\n await stream.writeSSE({ event: 'feed', data: JSON.stringify(workItemId ? { workItemId } : {}) });\n };\n // Claimed before any await: `onAbort` handlers registered after the\n // reader is gone never run, and a broker subscribe is a round trip.\n const closed = new Promise<void>(resolve => stream.onAbort(resolve));\n let keepalive: ReturnType<typeof setInterval> | undefined;\n try {\n // Without `latest`, a retaining broker replays its whole backlog into\n // every new connection as spurious invalidations.\n await pubsub.subscribe(topic, onEvent, { startFrom: 'latest' });\n if (!stream.aborted) {\n keepalive = setInterval(() => {\n if (stream.aborted) return;\n void stream.write(': ping\\n\\n');\n }, FEED_KEEPALIVE_MS);\n // `streamSSE` closes the stream the moment this callback returns.\n await closed;\n }\n } finally {\n clearInterval(keepalive);\n await pubsub.unsubscribe(topic, onEvent);\n }\n });\n },\n }),\n ];\n}\n"],"mappings":";;;;;;;;;AA0BA,MAAM,0BAA0B;;AAEhC,MAAM,oBAAoB;AAmB1B,SAAS,MAAM,GAAqB;CAClC,OAAO;AACT;AAEA,SAAgB,mBAAmB,cAAoD;CACrF,MAAM,EAAE,QAAQ,MAAM,UAAU,WAAW,UAAU,QAAQ,UAAU;CAEvE,eAAe,cAAc,GAAsD;EACjF,MAAM,KAAK,WAAW,CAAC;EACvB,MAAM,SAAS,KAAK,OAAO,CAAC;EAC5B,IAAI,CAAC,QAAQ,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG,EAAE;EACvE,IAAI,CAAC,OAAO,OACV,OAAO,EACL,UAAU,EAAE,KAAK;GAAE,OAAO;GAAyB,SAAS;EAA0C,GAAG,GAAG,EAC9G;EAEF,OAAO;GAAE,OAAO,OAAO;GAAO,QAAQ,OAAO;EAAO;CACtD;CAEA,SAAS,UAAU,GAAY,QAA+B;EAC5D,OAAO;GACL,QAAQ,OAAO;GACf,mBAAmB,KAAK,oBAAoB,GAAG,OAAO,KAAK;EAC7D;CACF;CAEA,eAAe,iBACb,GACA,QACA,WACA,cACe;EACf,IAAI,aAAa,WAAW,GAAG;EAC/B,MAAM,OAAO,KAAK;GAChB,SAAS;GACT,OAAO;IACL,QAAQ;IACR,kBAAkB,OAAO;IACzB,SAAS,CAAC;KAAE,MAAM;KAAa,IAAI,OAAO;KAAY,GAAI,OAAO,QAAQ,EAAE,MAAM,OAAO,MAAM,IAAI,CAAC;IAAG,CAAC;IACvG,UAAU;KAAE;KAAW;IAAa;GACtC;EACF,CAAC;CACH;CAEA,OAAO;EACL,iBAAiB,gDAAgD;GAC/D,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;IAC3C,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;IACjG,MAAM,UAAU,YAAY;IAC5B,MAAM,WAAW,MAAM,UAAU,IAAI;KAAE,OAAO,OAAO;KAAO,IAAI;IAAW,CAAC;IAC5E,IAAI,CAAC,UAAU,OAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;IAElE,MAAM,SAAS,YAAY;IAC3B,MAAM,WAAW,EAAE,IAAI,MAAM,OAAO;IACpC,MAAM,QAAQ,WAAW,OAAO,SAAS,UAAU,EAAE,IAAI,KAAA;IACzD,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ,KAAK,KAAA;IACxC,IAAI,UAAU,CAAC,oBAAoB,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;IAC1F,MAAM,SAAS,EAAE,IAAI,MAAM,QAAQ,KAAK,KAAA;IACxC,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;IACvF,MAAM,OAAO,MAAM,SAAS,KAAK;KAC/B,OAAO,OAAO;KACd,kBAAkB,SAAS;KAC3B;KACA;KACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;KAC3B,GAAI,UAAU,KAAA,KAAa,OAAO,SAAS,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;IACnE,CAAC;IACD,MAAM,WAA4B;KAChC,UAAU,KAAK,SAAS,KAAI,YAAW,cAAc,SAAS,OAAO,MAAM,CAAC;KAC5E,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;IAC3D;IACA,OAAO,EAAE,KAAK,QAAQ;GACxB;EACF,CAAC;EAED,iBAAiB,gDAAgD;GAC/D,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;IAC3C,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;IAEjG,MAAM,SAAS,uBAAuB,MAAM,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,OAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;IAE5D,MAAM,SAAS,MAAM,OAAO,cAAc;KACxC,OAAO,OAAO;KACd;KACA,QAAQ,kBAAkB,OAAO,QAAQ,mBAAmB,CAAC,CAAC;KAC9D,MAAM,OAAO;KACb,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;KACpD,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;KACvD,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,WAAW,uBAAuB,OAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;IAChG,IAAI,OAAO,WAAW,kBAAkB,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;IAC9F,IAAI,OAAO,WAAW,WAAW,OAAO,EAAE,KAAK;KAAE,OAAO;KAAmB,SAAS,OAAO;IAAQ,GAAG,GAAG;IAEzG,MAAM,EAAE,SAAS,aAAa;IAC9B,MAAM,OAAO,KAAK;KAChB,SAAS;KACT,OAAO;MACL,QAAQ;MACR,kBAAkB,SAAS;MAC3B,SAAS,CAAC;OAAE,MAAM;OAAa,IAAI,SAAS;OAAI,MAAM,SAAS;MAAM,CAAC;MACtE,UAAU,EAAE,WAAW,QAAQ,GAAG;KACpC;IACF,CAAC;IACD,MAAM,iBACJ,GACA;KAAE,kBAAkB,SAAS;KAAkB,YAAY,SAAS;KAAI,OAAO,SAAS;IAAM,GAC9F,QAAQ,IACR,QAAQ,SAAS,KAAI,YAAW,QAAQ,EAAE,CAAC,CAAC,QAAO,OAAM,OAAO,QAAQ,OAAO,EAAE,CACnF;IACA,OAAO,EAAE,KAAK,EAAE,SAAS,cAAc,SAAS,OAAO,MAAM,EAAE,GAAG,GAAG;GACvE;EACF,CAAC;EAED,iBAAiB,2DAA2D;GAC1E,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;IAC3C,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;IACzC,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,UAAU,KAAK,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS,GACnF,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAGnD,MAAM,SAAS,qBAAqB,MAAM,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,OAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;IAE5D,MAAM,SAAS,MAAM,OAAO,YAAY;KACtC,OAAO,OAAO;KACd;KACA;KACA,QAAQ,UAAU,GAAG,MAAM;KAC3B,MAAM,OAAO;KACb,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;KACvD,GAAI,OAAO,qBAAqB,KAAA,IAAY,EAAE,kBAAkB,OAAO,iBAAiB,IAAI,CAAC;IAC/F,CAAC;IACD,IAAI,OAAO,WAAW,aAAa,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IACpF,IAAI,OAAO,WAAW,aAAa,OAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;IACrF,IAAI,OAAO,WAAW,gBAAgB,OAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;IAC1F,IAAI,OAAO,WAAW,YAAY,OAAO,EAAE,KAAK,EAAE,OAAO,mBAAmB,GAAG,GAAG;IAClF,IAAI,OAAO,WAAW,WAAW,OAAO,EAAE,KAAK;KAAE,OAAO;KAAmB,SAAS,OAAO;IAAQ,GAAG,GAAG;IAEzG,MAAM,EAAE,YAAY;IACpB,MAAM,OAAO,KAAK;KAChB,SAAS;KACT,OAAO;MACL,QAAQ;MACR,kBAAkB,QAAQ;MAC1B,SAAS,CAAC;OAAE,MAAM;OAAa,IAAI,QAAQ;MAAW,CAAC;MACvD,UAAU;OACR,WAAW,QAAQ;OACnB,cAAc,OAAO,aAAa,MAAM,GAAG,uBAAuB;MACpE;KACF;IACF,CAAC;IACD,MAAM,iBACJ,GACA;KAAE,kBAAkB,QAAQ;KAAkB,YAAY,QAAQ;IAAW,GAC7E,QAAQ,IACR,OAAO,cAAc,KAAI,YAAW,QAAQ,EAAE,CAChD;IACA,OAAO,EAAE,KAAK,EAAE,SAAS,cAAc,SAAS,OAAO,MAAM,EAAE,CAAC;GAClE;EACF,CAAC;EAED,iBAAiB,2DAA2D;GAC1E,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,aAAa,EAAE,IAAI,MAAM,YAAY;IAC3C,MAAM,YAAY,EAAE,IAAI,MAAM,WAAW;IACzC,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,UAAU,KAAK,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS,GACnF,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAGnD,MAAM,SAAS,MAAM,OAAO,cAAc;KACxC,OAAO,OAAO;KACd;KACA;KACA,QAAQ,UAAU,GAAG,MAAM;IAC7B,CAAC;IACD,IAAI,OAAO,WAAW,aAAa,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IACpF,IAAI,OAAO,WAAW,aAAa,OAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;IACrF,IAAI,OAAO,WAAW,gBAAgB,OAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;IAE1F,MAAM,OAAO,KAAK;KAChB,SAAS;KACT,OAAO;MACL,QAAQ;MACR,kBAAkB,OAAO,QAAQ;MACjC,SAAS,CAAC;OAAE,MAAM;OAAa,IAAI,OAAO,QAAQ;MAAW,CAAC;MAC9D,UAAU,EAAE,WAAW,OAAO,QAAQ,GAAG;KAC3C;IACF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,cAAc,OAAO,SAAS,OAAO,MAAM,EAAE,CAAC;GACzE;EACF,CAAC;EAED,iBAAiB,4CAA4C;GAC3D,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,YAAY,EAAE,IAAI,MAAM,IAAI;IAClC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAC7F,MAAM,SAAS,YAAY;IAE3B,IAAI,CAAC,MADiB,SAAS,IAAI;KAAE,OAAO,OAAO;KAAO,IAAI;IAAU,CAAC,GAC3D,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAE/D,MAAM,SAAS,YAAY;IAC3B,MAAM,SAAS,MAAM,OAAO,cAAc;KAAE,OAAO,OAAO;KAAO,kBAAkB;IAAU,CAAC;IAC9F,MAAM,QAAQ,EAAE,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,YAAY;IACnD,MAAM,UAAU,QACZ,OAAO,QAAO,YAAW,OAAO,QAAQ,OAAO,GAAA,CAAI,YAAY,CAAC,CAAC,WAAW,KAAK,CAAC,IAClF;IACJ,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;GAC3B;EACF,CAAC;EAED,iBAAiB,yCAAyC;GACxD,QAAQ;GACR,SAAS,OAAM,OAAM;IACnB,MAAM,IAAI,MAAM,EAAE;IAClB,MAAM,SAAS,MAAM,cAAc,CAAC;IACpC,IAAI,cAAc,QAAQ,OAAO,OAAO;IAExC,MAAM,YAAY,EAAE,IAAI,MAAM,IAAI;IAClC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAC7F,MAAM,SAAS,YAAY;IAE3B,IAAI,CAAC,MADiB,SAAS,IAAI;KAAE,OAAO,OAAO;KAAO,IAAI;IAAU,CAAC,GAC3D,OAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;IAE/D,MAAM,QAAQ,UAAU,OAAO,OAAO,SAAS;IAC/C,OAAO,UAAU,GAAG,OAAM,WAAU;KAClC,MAAM,UAAyB,OAAM,UAAS;MAC5C,IAAI,OAAO,SAAS;MACpB,MAAM,OAAO,MAAM;MACnB,MAAM,aAAa,SAAS,IAAI,KAAK,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAA;MAC7F,MAAM,OAAO,SAAS;OAAE,OAAO;OAAQ,MAAM,KAAK,UAAU,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC;MAAE,CAAC;KACjG;KAGA,MAAM,SAAS,IAAI,SAAc,YAAW,OAAO,QAAQ,OAAO,CAAC;KACnE,IAAI;KACJ,IAAI;MAGF,MAAM,OAAO,UAAU,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC;MAC9D,IAAI,CAAC,OAAO,SAAS;OACnB,YAAY,kBAAkB;QAC5B,IAAI,OAAO,SAAS;QACpB,OAAY,MAAM,YAAY;OAChC,GAAG,iBAAiB;OAEpB,MAAM;MACR;KACF,UAAU;MACR,cAAc,SAAS;MACvB,MAAM,OAAO,YAAY,OAAO,OAAO;KACzC;IACF,CAAC;GACH;EACF,CAAC;CACH;AACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CollectionSchema } from '@mastra/core/storage';
|
|
2
2
|
export declare const WORK_ITEM_COMMENTS_SCHEMA: CollectionSchema;
|
|
3
3
|
export declare const WORK_ITEM_COMMENT_MENTIONS_SCHEMA: CollectionSchema;
|
|
4
|
+
export declare const WORK_ITEM_ACTIVITY_SCHEMA: CollectionSchema;
|
|
4
5
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,yBAAyB,EAAE,gBA2CvC,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,gBA6B/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/comments/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,yBAAyB,EAAE,gBA2CvC,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,gBA6B/C,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,gBAgCvC,CAAC"}
|
|
@@ -129,7 +129,51 @@ const WORK_ITEM_COMMENT_MENTIONS_SCHEMA = {
|
|
|
129
129
|
]
|
|
130
130
|
}]
|
|
131
131
|
};
|
|
132
|
+
const WORK_ITEM_ACTIVITY_SCHEMA = {
|
|
133
|
+
name: "work_item_activity",
|
|
134
|
+
columns: {
|
|
135
|
+
id: { type: "uuid-pk" },
|
|
136
|
+
org_id: { type: "text" },
|
|
137
|
+
factory_project_id: { type: "text" },
|
|
138
|
+
work_item_id: { type: "text" },
|
|
139
|
+
participant_id: { type: "text" },
|
|
140
|
+
occurrence: {
|
|
141
|
+
type: "integer",
|
|
142
|
+
default: 1
|
|
143
|
+
},
|
|
144
|
+
latest_comment_id: { type: "text" },
|
|
145
|
+
latest_author_id: { type: "text" },
|
|
146
|
+
latest_author_name: {
|
|
147
|
+
type: "text",
|
|
148
|
+
nullable: true
|
|
149
|
+
},
|
|
150
|
+
occurred_at: { type: "timestamp" },
|
|
151
|
+
created_at: { type: "timestamp" },
|
|
152
|
+
updated_at: { type: "timestamp" }
|
|
153
|
+
},
|
|
154
|
+
uniqueIndexes: [{
|
|
155
|
+
name: "work_item_activity_item_participant_unique",
|
|
156
|
+
columns: ["work_item_id", "participant_id"]
|
|
157
|
+
}],
|
|
158
|
+
indexes: [{
|
|
159
|
+
name: "work_item_activity_inbox_idx",
|
|
160
|
+
columns: [
|
|
161
|
+
"org_id",
|
|
162
|
+
"factory_project_id",
|
|
163
|
+
"participant_id",
|
|
164
|
+
"occurred_at",
|
|
165
|
+
"id"
|
|
166
|
+
]
|
|
167
|
+
}, {
|
|
168
|
+
name: "work_item_activity_item_idx",
|
|
169
|
+
columns: [
|
|
170
|
+
"org_id",
|
|
171
|
+
"factory_project_id",
|
|
172
|
+
"work_item_id"
|
|
173
|
+
]
|
|
174
|
+
}]
|
|
175
|
+
};
|
|
132
176
|
//#endregion
|
|
133
|
-
export { WORK_ITEM_COMMENTS_SCHEMA, WORK_ITEM_COMMENT_MENTIONS_SCHEMA };
|
|
177
|
+
export { WORK_ITEM_ACTIVITY_SCHEMA, WORK_ITEM_COMMENTS_SCHEMA, WORK_ITEM_COMMENT_MENTIONS_SCHEMA };
|
|
134
178
|
|
|
135
179
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../src/storage/domains/comments/schema.ts"],"sourcesContent":["import type { CollectionSchema } from '@mastra/core/storage';\n\nexport const WORK_ITEM_COMMENTS_SCHEMA: CollectionSchema = {\n name: 'work_item_comments',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n kind: { type: 'text', default: 'comment' },\n body: { type: 'text' },\n body_format: { type: 'text', default: 'markdown' },\n author_kind: { type: 'text' },\n author_id: { type: 'text' },\n author_display_name: { type: 'text', nullable: true },\n author_avatar_url: { type: 'text', nullable: true },\n author_external: { type: 'json', nullable: true },\n reply_to_comment_id: { type: 'text', nullable: true },\n reply_quote: { type: 'text', nullable: true },\n reply_to_author_id: { type: 'text', nullable: true },\n reply_to_author_name: { type: 'text', nullable: true },\n mentions: { type: 'json' },\n external_source: { type: 'json', nullable: true },\n source_key: { type: 'text', nullable: true },\n occurred_at: { type: 'timestamp' },\n edited_at: { type: 'timestamp', nullable: true },\n deleted_at: { type: 'timestamp', nullable: true },\n deleted_by: { type: 'text', nullable: true },\n revision: { type: 'integer', default: 1 },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_item_comments_project_source_key_unique',\n columns: ['factory_project_id', 'source_key'],\n whereNotNull: 'source_key',\n },\n ],\n indexes: [\n {\n name: 'work_item_comments_feed_idx',\n columns: ['org_id', 'factory_project_id', 'work_item_id', 'occurred_at', 'id'],\n },\n ],\n};\n\nexport const WORK_ITEM_COMMENT_MENTIONS_SCHEMA: CollectionSchema = {\n name: 'work_item_comment_mentions',\n columns: {\n id: { type: 'uuid-pk' },\n comment_id: { type: 'text' },\n mentioned_kind: { type: 'text' },\n mentioned_id: { type: 'text' },\n author_id: { type: 'text' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n occurred_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_item_comment_mentions_comment_target_unique',\n columns: ['comment_id', 'mentioned_kind', 'mentioned_id'],\n },\n ],\n indexes: [\n {\n name: 'work_item_comment_mentions_inbox_idx',\n columns: ['org_id', 'factory_project_id', 'mentioned_id', 'occurred_at', 'id'],\n },\n {\n name: 'work_item_comment_mentions_item_idx',\n columns: ['org_id', 'factory_project_id', 'work_item_id'],\n },\n ],\n};\n"],"mappings":";AAEA,MAAa,4BAA8C;CACzD,MAAM;CACN,SAAS;EACP,IAAI,EAAE,MAAM,UAAU;EACtB,QAAQ,EAAE,MAAM,OAAO;EACvB,oBAAoB,EAAE,MAAM,OAAO;EACnC,cAAc,EAAE,MAAM,OAAO;EAC7B,MAAM;GAAE,MAAM;GAAQ,SAAS;EAAU;EACzC,MAAM,EAAE,MAAM,OAAO;EACrB,aAAa;GAAE,MAAM;GAAQ,SAAS;EAAW;EACjD,aAAa,EAAE,MAAM,OAAO;EAC5B,WAAW,EAAE,MAAM,OAAO;EAC1B,qBAAqB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACpD,mBAAmB;GAAE,MAAM;GAAQ,UAAU;EAAK;EAClD,iBAAiB;GAAE,MAAM;GAAQ,UAAU;EAAK;EAChD,qBAAqB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACpD,aAAa;GAAE,MAAM;GAAQ,UAAU;EAAK;EAC5C,oBAAoB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACnD,sBAAsB;GAAE,MAAM;GAAQ,UAAU;EAAK;EACrD,UAAU,EAAE,MAAM,OAAO;EACzB,iBAAiB;GAAE,MAAM;GAAQ,UAAU;EAAK;EAChD,YAAY;GAAE,MAAM;GAAQ,UAAU;EAAK;EAC3C,aAAa,EAAE,MAAM,YAAY;EACjC,WAAW;GAAE,MAAM;GAAa,UAAU;EAAK;EAC/C,YAAY;GAAE,MAAM;GAAa,UAAU;EAAK;EAChD,YAAY;GAAE,MAAM;GAAQ,UAAU;EAAK;EAC3C,UAAU;GAAE,MAAM;GAAW,SAAS;EAAE;EACxC,YAAY,EAAE,MAAM,YAAY;EAChC,YAAY,EAAE,MAAM,YAAY;CAClC;CACA,eAAe,CACb;EACE,MAAM;EACN,SAAS,CAAC,sBAAsB,YAAY;EAC5C,cAAc;CAChB,CACF;CACA,SAAS,CACP;EACE,MAAM;EACN,SAAS;GAAC;GAAU;GAAsB;GAAgB;GAAe;EAAI;CAC/E,CACF;AACF;AAEA,MAAa,oCAAsD;CACjE,MAAM;CACN,SAAS;EACP,IAAI,EAAE,MAAM,UAAU;EACtB,YAAY,EAAE,MAAM,OAAO;EAC3B,gBAAgB,EAAE,MAAM,OAAO;EAC/B,cAAc,EAAE,MAAM,OAAO;EAC7B,WAAW,EAAE,MAAM,OAAO;EAC1B,QAAQ,EAAE,MAAM,OAAO;EACvB,oBAAoB,EAAE,MAAM,OAAO;EACnC,cAAc,EAAE,MAAM,OAAO;EAC7B,aAAa,EAAE,MAAM,YAAY;CACnC;CACA,eAAe,CACb;EACE,MAAM;EACN,SAAS;GAAC;GAAc;GAAkB;EAAc;CAC1D,CACF;CACA,SAAS,CACP;EACE,MAAM;EACN,SAAS;GAAC;GAAU;GAAsB;GAAgB;GAAe;EAAI;CAC/E,GACA;EACE,MAAM;EACN,SAAS;GAAC;GAAU;GAAsB;EAAc;CAC1D,CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../src/storage/domains/comments/schema.ts"],"sourcesContent":["import type { CollectionSchema } from '@mastra/core/storage';\n\nexport const WORK_ITEM_COMMENTS_SCHEMA: CollectionSchema = {\n name: 'work_item_comments',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n kind: { type: 'text', default: 'comment' },\n body: { type: 'text' },\n body_format: { type: 'text', default: 'markdown' },\n author_kind: { type: 'text' },\n author_id: { type: 'text' },\n author_display_name: { type: 'text', nullable: true },\n author_avatar_url: { type: 'text', nullable: true },\n author_external: { type: 'json', nullable: true },\n reply_to_comment_id: { type: 'text', nullable: true },\n reply_quote: { type: 'text', nullable: true },\n reply_to_author_id: { type: 'text', nullable: true },\n reply_to_author_name: { type: 'text', nullable: true },\n mentions: { type: 'json' },\n external_source: { type: 'json', nullable: true },\n source_key: { type: 'text', nullable: true },\n occurred_at: { type: 'timestamp' },\n edited_at: { type: 'timestamp', nullable: true },\n deleted_at: { type: 'timestamp', nullable: true },\n deleted_by: { type: 'text', nullable: true },\n revision: { type: 'integer', default: 1 },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_item_comments_project_source_key_unique',\n columns: ['factory_project_id', 'source_key'],\n whereNotNull: 'source_key',\n },\n ],\n indexes: [\n {\n name: 'work_item_comments_feed_idx',\n columns: ['org_id', 'factory_project_id', 'work_item_id', 'occurred_at', 'id'],\n },\n ],\n};\n\nexport const WORK_ITEM_COMMENT_MENTIONS_SCHEMA: CollectionSchema = {\n name: 'work_item_comment_mentions',\n columns: {\n id: { type: 'uuid-pk' },\n comment_id: { type: 'text' },\n mentioned_kind: { type: 'text' },\n mentioned_id: { type: 'text' },\n author_id: { type: 'text' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n occurred_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_item_comment_mentions_comment_target_unique',\n columns: ['comment_id', 'mentioned_kind', 'mentioned_id'],\n },\n ],\n indexes: [\n {\n name: 'work_item_comment_mentions_inbox_idx',\n columns: ['org_id', 'factory_project_id', 'mentioned_id', 'occurred_at', 'id'],\n },\n {\n name: 'work_item_comment_mentions_item_idx',\n columns: ['org_id', 'factory_project_id', 'work_item_id'],\n },\n ],\n};\n\nexport const WORK_ITEM_ACTIVITY_SCHEMA: CollectionSchema = {\n name: 'work_item_activity',\n columns: {\n id: { type: 'uuid-pk' },\n org_id: { type: 'text' },\n factory_project_id: { type: 'text' },\n work_item_id: { type: 'text' },\n participant_id: { type: 'text' },\n occurrence: { type: 'integer', default: 1 },\n latest_comment_id: { type: 'text' },\n latest_author_id: { type: 'text' },\n latest_author_name: { type: 'text', nullable: true },\n occurred_at: { type: 'timestamp' },\n created_at: { type: 'timestamp' },\n updated_at: { type: 'timestamp' },\n },\n uniqueIndexes: [\n {\n name: 'work_item_activity_item_participant_unique',\n columns: ['work_item_id', 'participant_id'],\n },\n ],\n indexes: [\n {\n name: 'work_item_activity_inbox_idx',\n columns: ['org_id', 'factory_project_id', 'participant_id', 'occurred_at', 'id'],\n },\n {\n name: 'work_item_activity_item_idx',\n columns: ['org_id', 'factory_project_id', 'work_item_id'],\n },\n ],\n};\n"],"mappings":"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"}
|
|
@@ -173,7 +173,7 @@ export interface FactoryDeferredDecisionRecord {
|
|
|
173
173
|
createdAt: Date;
|
|
174
174
|
updatedAt: Date;
|
|
175
175
|
}
|
|
176
|
-
export type FactoryAttentionKind = 'automation-failed' | 'mention';
|
|
176
|
+
export type FactoryAttentionKind = 'automation-failed' | 'mention' | 'activity';
|
|
177
177
|
export type FactoryAttentionReceiptState = 'read' | 'archived';
|
|
178
178
|
export type FactoryAttentionReceiptAction = 'read' | 'archive' | 'restore';
|
|
179
179
|
export interface FactoryAttentionIdentity {
|
|
@@ -202,6 +202,8 @@ interface SetAttentionReceiptInput {
|
|
|
202
202
|
}
|
|
203
203
|
export declare function factoryDecisionAttentionIdentity(decisionId: string, failureOccurrence: number): FactoryAttentionIdentity;
|
|
204
204
|
export declare function factoryMentionAttentionIdentity(commentId: string): FactoryAttentionIdentity;
|
|
205
|
+
/** Collapsed per work item, so the occurrence is what a new comment bumps. */
|
|
206
|
+
export declare function factoryActivityAttentionIdentity(workItemId: string, occurrence: number): FactoryAttentionIdentity;
|
|
205
207
|
export declare function factoryAttentionKey(factoryProjectId: string, identity: FactoryAttentionIdentity): string;
|
|
206
208
|
export interface FactoryRunBindingSessionAddress {
|
|
207
209
|
factoryProjectId: string;
|
|
@@ -415,9 +417,20 @@ export declare function validateParentRelation(projectItems: WorkItemRow[], item
|
|
|
415
417
|
*/
|
|
416
418
|
export declare function applyStageTransition(history: WorkItemStageEntry[], oldStages: WorkItemStage[], newStages: WorkItemStage[], by: string, now: Date): WorkItemStageEntry[];
|
|
417
419
|
export declare function stampSessions(sessions: Record<string, WorkItemSessionInput>, by: string): WorkItemSessions;
|
|
420
|
+
/** The project whose attention list a write just changed. */
|
|
421
|
+
export interface FactoryAttentionScope {
|
|
422
|
+
orgId: string;
|
|
423
|
+
factoryProjectId: string;
|
|
424
|
+
}
|
|
418
425
|
export declare class WorkItemsStorage extends FactoryStorageDomain {
|
|
419
426
|
#private;
|
|
420
427
|
constructor();
|
|
428
|
+
/**
|
|
429
|
+
* Wired once at boot. Every write below that changes what this project's
|
|
430
|
+
* attention list projects announces it here — the one place a new such write
|
|
431
|
+
* has to remember, since clients stop polling while their stream is up.
|
|
432
|
+
*/
|
|
433
|
+
onAttentionChanged(listener: (scope: FactoryAttentionScope) => void): void;
|
|
421
434
|
init(): Promise<void>;
|
|
422
435
|
dangerouslyClearAll(): Promise<void>;
|
|
423
436
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/work-items/base.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/work-items/base.ts"],"names":[],"mappings":"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"}
|