@alook/daemon 0.1.47 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/cli/index.js +445 -328
  2. package/dist/index.js +441 -323
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -12257,9 +12257,9 @@ function cliCommandsSection() {
12257
12257
  "### Messaging",
12258
12258
  "",
12259
12259
  `1. \`${CLI} inbox pull\` — fetch unread messages and advance their read waterlines.`,
12260
- `2. \`${CLI} message send --target <ref> --remind-after <0|Nm|Nh> --stdin\` — send to a ` + `channel, DM, or thread. ` + `The body is required through \`--stdin\` and limited to 1 KiB of UTF-8. ` + `Attach uploaded files with \`--attachment <id>\` (repeatable, order matters). ` + `\`--remind-after\` accepts \`0\`, or a whole-number duration from \`1m\` to \`24h\`.`,
12261
- `3. \`${CLI} message attachment upload --target <ref> --file <path>\` — upload a file; ` + `returns an id stable across pending→persisted.`,
12262
- `4. \`${CLI} message attachment download --id <id> [--out <path>]\` — download any ` + `attachment you can see (or your own pending uploads).`,
12260
+ `2. \`${CLI} message send --target <ref> --remind-after <0|Nm|Nh> --stdin\` — send to a ` + `channel, DM, or thread. ` + `The body is required through \`--stdin\` and limited to 1 KiB of UTF-8. ` + `Attach files with \`--attachment <id>\` (repeatable, order matters). ` + `\`--remind-after\` accepts \`0\`, or a whole-number duration from \`1m\` to \`24h\`.`,
12261
+ `3. \`${CLI} message attachment upload --file <path>\` — upload a local file and get a reusable attachment ID.`,
12262
+ `4. \`${CLI} message attachment download --id <id> [--out <path>]\` — download an attachment you can read, including your own unsent uploads.`,
12263
12263
  `5. \`${CLI} message property set --target <full-message-ref> --json <json>\` — add a supported property value to a message.`,
12264
12264
  `6. \`${CLI} message property list --target <full-message-ref>\` — list the message's current properties and supported capabilities.`,
12265
12265
  `7. \`${CLI} message property remove --target <full-message-ref> --json <json>\` — remove a supported property value from a message.`,
@@ -12320,7 +12320,8 @@ function messagingSection() {
12320
12320
  "#### Sending mechanics",
12321
12321
  "",
12322
12322
  `- Send body: use \`${CLI} message send --target <ref> --remind-after T --stdin\` with the ` + "quoted-heredoc form under *Message formatting*.",
12323
- `- Long detail: upload it with \`${CLI} message attachment upload --target <ref> --file <path>.md\`; ` + "add the returned id as `--attachment <id>` on the short stdin send.",
12323
+ `- Long detail: upload it with \`${CLI} message attachment upload --file <path>.md\`; ` + "add the returned id as `--attachment <id>` on the short stdin send.",
12324
+ "- Reuse files: to forward an attachment or send the same file again, pass its existing ID with `--attachment <id>`. " + "Do not download and upload it again. Reuse works across channels, DMs, and threads while you can still read the file. " + "Upload only a new or changed file.",
12324
12325
  `- Cite a specific message: add \`--reply "#37"\` — \`--reply\` takes the \`#N\` seq ` + "(within `--target`) of the message you're answering.",
12325
12326
  "",
12326
12327
  "Reply where the message came from. Post results in the channel that owns the topic. " + "When uncertain, read history (below) or DM the relevant people.",
@@ -12436,7 +12437,19 @@ function utilsSection() {
12436
12437
  "",
12437
12438
  "### Join a new server",
12438
12439
  "",
12439
- `If a message contains a \`/c/invite/...\` link, just run \`${CLI} server join --invite <link>\`. ` + "The server enforces owner-only: it accepts only invites your owner created and rejects the " + "rest with a reason. Safe to attempt without reasoning about who sent it."
12440
+ `If a message contains a \`/c/invite/...\` link, just run \`${CLI} server join --invite <link>\`. ` + "The server enforces owner-only: it accepts only invites your owner created and rejects the " + "rest with a reason. Safe to attempt without reasoning about who sent it.",
12441
+ "",
12442
+ "### Answer questions about Alook itself",
12443
+ "",
12444
+ "Alook frontend source code: https://github.com/alookai/alook/tree/main/src/web/src",
12445
+ "",
12446
+ "Only when a user specifically asks for Alook product guidance or clarification about " + "the product, read the relevant frontend code before answering. " + "Check the page, visible labels, and interaction handlers to verify the steps.",
12447
+ "",
12448
+ "Give clear UI click instructions in the user's language. Start with the page they are on. " + "Use simple positions such as top-left or left sidebar, visible icons, and button labels " + "to identify exactly where to click. Explain each click in order and what appears next. " + "Keep frontend code names and layout terms out of the user's instructions.",
12449
+ "",
12450
+ 'Bad: "Click thisReactButton, on the same layer as serverRailContainer."',
12451
+ "",
12452
+ 'Good: "From the channel chat page in XX server, look at the top-left corner. Click the ' + "Home button with the Alook logo. After Home opens, click My Bots near the top-left " + 'of the left sidebar."'
12440
12453
  ].join(`
12441
12454
  `);
12442
12455
  }
@@ -37564,30 +37577,288 @@ function writeStatusFile(path14, snapshot) {
37564
37577
  renameSync3(tmp, path14);
37565
37578
  } catch {}
37566
37579
  }
37567
- // ../shared/src/community-attention.ts
37580
+ // ../shared/src/community-contract.ts
37581
+ var COMMUNITY_RESOURCE_CONTRACT_VERSION = 3;
37582
+
37583
+ // ../shared/src/community-friend-approval.ts
37584
+ var profile = exports_external.strictObject({
37585
+ id: exports_external.string(),
37586
+ name: exports_external.string(),
37587
+ discriminator: exports_external.string(),
37588
+ image: exports_external.string().nullable(),
37589
+ avatarVersion: exports_external.number().int().nonnegative()
37590
+ });
37591
+ var FriendApprovalPayloadSchema = exports_external.strictObject({
37592
+ friendshipId: exports_external.string(),
37593
+ status: exports_external.enum(["pending", "approved", "denied", "superseded", "cancelled"]),
37594
+ waitingOn: exports_external.enum(["you", "other-owner", "addressee"]).nullable(),
37595
+ otherProfile: profile,
37596
+ botProfile: profile,
37597
+ waitingOnProfile: profile.nullable().optional()
37598
+ });
37599
+
37600
+ // ../shared/src/community-resources.ts
37568
37601
  var id = exports_external.string().min(1);
37569
- var AttentionScopeSchema = exports_external.strictObject({
37570
- scopeId: id,
37602
+ var nullableId = id.nullable();
37603
+ var legacyArchivedSchema = exports_external.union([exports_external.boolean(), exports_external.literal(0), exports_external.literal(1)]).transform((value) => value === true || value === 1);
37604
+ var CommunityChannelResourceSchema = exports_external.strictObject({
37605
+ id,
37606
+ type: exports_external.enum(["text", "forum", "thread", "dm"]),
37607
+ serverId: nullableId,
37608
+ categoryId: nullableId,
37609
+ name: exports_external.string().nullable(),
37610
+ topic: exports_external.string(),
37611
+ parentChannelId: nullableId,
37612
+ parentMessageId: nullableId,
37613
+ creatorId: nullableId,
37614
+ position: exports_external.number(),
37615
+ archived: exports_external.boolean(),
37616
+ createdAt: exports_external.string(),
37617
+ lastMessageAt: exports_external.string().nullable(),
37618
+ messageCount: exports_external.number().int().nonnegative()
37619
+ });
37620
+ var CommunityChannelIdentitySchema = CommunityChannelResourceSchema.pick({
37621
+ id: true,
37622
+ type: true,
37623
+ serverId: true,
37624
+ name: true,
37625
+ parentChannelId: true,
37626
+ parentMessageId: true,
37627
+ creatorId: true,
37628
+ archived: true,
37629
+ lastMessageAt: true,
37630
+ createdAt: true
37631
+ }).partial({ createdAt: true }).strip();
37632
+ var legacyChannelIdentitySchema = CommunityChannelIdentitySchema.extend({
37633
+ archived: legacyArchivedSchema,
37634
+ parentChannelId: nullableId.default(null),
37635
+ parentMessageId: nullableId.default(null),
37636
+ creatorId: nullableId.default(null),
37637
+ lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null)
37638
+ });
37639
+ var CommunityAccessDecisionSchema = exports_external.strictObject({
37640
+ channelId: id,
37641
+ canRead: exports_external.boolean(),
37642
+ canSend: exports_external.boolean(),
37643
+ canCreateDiscussion: exports_external.boolean()
37644
+ });
37645
+ var CommunityLegacyMessageAttachmentSchema = exports_external.strictObject({
37646
+ kind: exports_external.enum(["image", "file"]),
37647
+ name: exports_external.string(),
37648
+ url: exports_external.string(),
37649
+ thumbnailUrl: exports_external.string().optional(),
37650
+ contentType: exports_external.string().optional(),
37651
+ size: exports_external.string().optional(),
37652
+ sizeBytes: exports_external.number().nonnegative().optional(),
37653
+ width: exports_external.number().nonnegative().optional(),
37654
+ height: exports_external.number().nonnegative().optional()
37655
+ });
37656
+ var CommunityMessageAttachmentSchema = exports_external.strictObject({
37657
+ id,
37658
+ name: exports_external.string(),
37659
+ url: exports_external.string(),
37660
+ thumbnailUrl: exports_external.string().nullable(),
37661
+ contentType: exports_external.string().nullable(),
37662
+ sizeBytes: exports_external.number().int().nonnegative().nullable(),
37663
+ width: exports_external.number().int().nonnegative().nullable(),
37664
+ height: exports_external.number().int().nonnegative().nullable()
37665
+ });
37666
+ var CommunityMessagePreviewAttachmentSchema = CommunityMessageAttachmentSchema.partial().required({ name: true, url: true });
37667
+ var CommunityResourceProfileSchema = exports_external.strictObject({
37668
+ id,
37669
+ name: exports_external.string(),
37670
+ discriminator: exports_external.string().min(1).nullable(),
37671
+ avatar: exports_external.string().nullable(),
37672
+ avatarVersion: exports_external.number().int().nonnegative(),
37673
+ aboutMe: exports_external.string().optional(),
37674
+ bannerColor: exports_external.string().nullable().optional(),
37675
+ kind: exports_external.enum(["human", "bot"]).optional(),
37676
+ ownerUserId: nullableId.optional(),
37677
+ ownerHandle: exports_external.string().nullable().optional(),
37678
+ mutualServers: exports_external.number().int().nonnegative().optional(),
37679
+ ownedByViewer: exports_external.boolean().optional(),
37680
+ statusEmoji: exports_external.string().nullable().optional(),
37681
+ statusText: exports_external.string().nullable().optional()
37682
+ });
37683
+ var CommunityMessageThreadParticipantSchema = CommunityResourceProfileSchema.pick({ id: true, name: true, avatar: true, avatarVersion: true });
37684
+ var messageThreadSchema = exports_external.strictObject({
37685
+ id,
37686
+ name: CommunityChannelResourceSchema.shape.name,
37687
+ messageCount: CommunityChannelResourceSchema.shape.messageCount,
37688
+ lastReplyAt: CommunityChannelResourceSchema.shape.lastMessageAt.optional(),
37689
+ tags: exports_external.array(exports_external.string()).optional(),
37690
+ preview: exports_external.string().optional(),
37691
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema).optional(),
37692
+ participantCount: exports_external.number().int().nonnegative().optional()
37693
+ });
37694
+ var legacyMessageThreadSchema = messageThreadSchema.extend({
37695
+ name: exports_external.string(),
37696
+ lastReplyAt: exports_external.string().optional(),
37697
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema.extend({ avatar: exports_external.string() })).optional()
37698
+ });
37699
+ var messageThreadPreviewSchema = messageThreadSchema.partial().required({ id: true }).extend({
37700
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema.partial().required({ id: true })).optional()
37701
+ });
37702
+ var CommunityMessageResourceSchema = exports_external.strictObject({
37703
+ id,
37704
+ channelId: id,
37705
+ seq: exports_external.number().int().nonnegative(),
37706
+ authorId: id,
37707
+ createdAt: exports_external.string(),
37708
+ type: exports_external.enum(["chat", "system"]),
37709
+ content: exports_external.string(),
37710
+ replyToId: nullableId,
37711
+ clientNonce: exports_external.string().nullable(),
37712
+ attachments: exports_external.array(CommunityMessageAttachmentSchema),
37713
+ systemKind: exports_external.literal("thread").optional(),
37714
+ authorName: exports_external.string().optional(),
37715
+ authorAvatar: exports_external.string().nullable().optional(),
37716
+ authorAvatarVersion: exports_external.number().int().nonnegative().optional(),
37717
+ mentionType: exports_external.literal("everyone").nullable().optional(),
37718
+ replyTo: exports_external.strictObject({
37719
+ id,
37720
+ authorId: id.optional(),
37721
+ authorName: exports_external.string(),
37722
+ text: exports_external.string(),
37723
+ deleted: exports_external.boolean().optional()
37724
+ }).optional(),
37725
+ embeds: exports_external.array(exports_external.unknown()).optional(),
37726
+ reactions: exports_external.array(exports_external.strictObject({
37727
+ emoji: exports_external.string(),
37728
+ count: exports_external.number().int().nonnegative(),
37729
+ me: exports_external.boolean(),
37730
+ userIds: exports_external.array(id)
37731
+ })).optional(),
37732
+ thread: messageThreadSchema.optional(),
37733
+ approval: FriendApprovalPayloadSchema.optional()
37734
+ });
37735
+ var CommunityMessagePreviewSchema = CommunityMessageResourceSchema.partial().required({
37736
+ id: true,
37737
+ type: true
37738
+ }).extend({ attachments: exports_external.array(CommunityMessagePreviewAttachmentSchema).optional(), thread: messageThreadPreviewSchema.optional() });
37739
+ var CommunityReadStateResourceSchema = exports_external.strictObject({
37740
+ channelId: id,
37741
+ lastReadMessageId: nullableId,
37742
+ lastReadAt: exports_external.string().nullable(),
37743
+ lastReadSeq: exports_external.number().int().nonnegative()
37744
+ });
37745
+ var CommunityMemberRelationSchema = exports_external.strictObject({
37571
37746
  channelId: id,
37572
- serverId: id.nullable().optional(),
37573
- parentChannelId: id.nullable().optional(),
37747
+ userId: id,
37748
+ relation: exports_external.enum(["access", "notify"]),
37749
+ source: exports_external.string(),
37750
+ isCreator: exports_external.boolean(),
37751
+ role: exports_external.string().nullable(),
37752
+ memberId: nullableId
37753
+ });
37754
+ var CommunityPageSchema = exports_external.strictObject({
37755
+ olderCursor: exports_external.string().nullable(),
37756
+ newerCursor: exports_external.string().nullable(),
37757
+ hasMoreOlder: exports_external.boolean(),
37758
+ hasMoreNewer: exports_external.boolean(),
37759
+ latestSeq: exports_external.number().int().nonnegative()
37760
+ });
37761
+ var envelope = { contractVersion: exports_external.literal(COMMUNITY_RESOURCE_CONTRACT_VERSION), channelId: id };
37762
+ var CommunityChannelReadSchema = exports_external.strictObject({ ...envelope, channel: CommunityChannelResourceSchema, access: CommunityAccessDecisionSchema });
37763
+ var CommunityMessagesReadSchema = exports_external.strictObject({
37764
+ ...envelope,
37765
+ messages: exports_external.array(CommunityMessageResourceSchema),
37766
+ page: CommunityPageSchema,
37767
+ surfaceReceipt: exports_external.strictObject({ channelId: id, surfaceKind: exports_external.enum(["channel", "forum", "thread", "dm"]) })
37768
+ });
37769
+ var CommunityMessagePostedSchema = CommunityMessagesReadSchema.pick({ contractVersion: true, channelId: true }).extend({
37770
+ message: CommunityMessageResourceSchema,
37771
+ deduped: exports_external.boolean(),
37772
+ threadId: id.optional()
37773
+ });
37774
+ var CommunityMessageReadSchema = CommunityMessagePostedSchema.omit({ deduped: true, threadId: true });
37775
+ var CommunityReadStateReadSchema = exports_external.strictObject({ ...envelope, readState: CommunityReadStateResourceSchema });
37776
+ var CommunityMembersReadSchema = exports_external.strictObject({ ...envelope, relation: exports_external.enum(["access", "notify"]), members: exports_external.array(CommunityMemberRelationSchema), profiles: exports_external.array(CommunityResourceProfileSchema) });
37777
+ var CommunityThreadsReadSchema = exports_external.strictObject({
37778
+ ...envelope,
37779
+ channel: CommunityChannelResourceSchema,
37780
+ threads: exports_external.array(CommunityChannelResourceSchema),
37781
+ included: exports_external.strictObject({
37782
+ messages: exports_external.array(CommunityMessageResourceSchema),
37783
+ members: exports_external.array(CommunityMemberRelationSchema),
37784
+ profiles: exports_external.array(CommunityResourceProfileSchema),
37785
+ tags: exports_external.array(exports_external.strictObject({ messageId: id, tag: exports_external.string() })),
37786
+ participantCounts: exports_external.array(exports_external.strictObject({ channelId: id, count: exports_external.number().int().nonnegative() }))
37787
+ }),
37788
+ page: exports_external.strictObject({ nextCursor: exports_external.string().nullable(), hasMore: exports_external.boolean() })
37789
+ });
37790
+ var CommunityReadAdvanceSchema = exports_external.strictObject({ ...envelope, changed: exports_external.boolean(), targetSeq: exports_external.number().int().nonnegative(), revision: exports_external.number().int().nonnegative() });
37791
+ var CommunityReadErrorSchema = exports_external.strictObject({ contractVersion: exports_external.literal(COMMUNITY_RESOURCE_CONTRACT_VERSION), error: exports_external.strictObject({
37792
+ code: exports_external.enum(["invalid_input", "invalid_reply_target", "unauthenticated", "not_found", "not_allowed", "blocked", "idempotency_conflict", "rate_limited", "temporarily_unavailable"]),
37793
+ message: exports_external.string(),
37794
+ retryable: exports_external.boolean()
37795
+ }) });
37796
+ var legacyProfileSchema = CommunityResourceProfileSchema.pick({
37797
+ id: true,
37798
+ name: true,
37799
+ avatar: true,
37800
+ avatarVersion: true
37801
+ }).extend({ discriminator: exports_external.string().nullable(), statusEmoji: exports_external.string().nullable(), statusText: exports_external.string() });
37802
+ var CommunityLegacyMessageResourceSchema = CommunityMessageResourceSchema.extend({ authorAvatar: exports_external.string().optional(), attachments: exports_external.array(CommunityLegacyMessageAttachmentSchema), thread: legacyMessageThreadSchema.optional() });
37803
+ var legacyEnvelope = { contractVersion: exports_external.literal(2), channelId: id };
37804
+ var legacyReadSchemas = {
37805
+ channel: CommunityChannelReadSchema.extend(legacyEnvelope),
37806
+ messages: CommunityMessagesReadSchema.extend({ ...legacyEnvelope, messages: exports_external.array(CommunityLegacyMessageResourceSchema) }),
37807
+ readState: CommunityReadStateReadSchema.extend(legacyEnvelope),
37808
+ members: CommunityMembersReadSchema.extend({ ...legacyEnvelope, profiles: exports_external.array(legacyProfileSchema) }),
37809
+ threads: CommunityThreadsReadSchema.extend({ ...legacyEnvelope, included: CommunityThreadsReadSchema.shape.included.extend({
37810
+ messages: exports_external.array(CommunityLegacyMessageResourceSchema),
37811
+ profiles: exports_external.array(legacyProfileSchema)
37812
+ }) }),
37813
+ readAdvance: CommunityReadAdvanceSchema.extend(legacyEnvelope),
37814
+ error: CommunityReadErrorSchema.extend({ contractVersion: exports_external.literal(2) })
37815
+ };
37816
+ var legacyChannelResourcePreviewSchema = CommunityChannelResourceSchema.partial().strip().extend({
37817
+ archived: legacyArchivedSchema.optional()
37818
+ });
37819
+ var legacyChannelResourceSchema = CommunityChannelResourceSchema.strip().extend({
37820
+ topic: CommunityChannelResourceSchema.shape.topic.nullish().transform((value) => value ?? ""),
37821
+ position: CommunityChannelResourceSchema.shape.position.nullish().transform((value) => value ?? 0),
37822
+ messageCount: CommunityChannelResourceSchema.shape.messageCount.nullish().transform((value) => value ?? 0),
37823
+ categoryId: nullableId.default(null),
37824
+ parentChannelId: nullableId.default(null),
37825
+ parentMessageId: nullableId.default(null),
37826
+ creatorId: nullableId.default(null),
37827
+ lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null),
37828
+ archived: legacyArchivedSchema
37829
+ });
37830
+ var legacyMessageResourceSchema = CommunityLegacyMessageResourceSchema.strip().extend({
37831
+ channelId: id.optional(),
37832
+ replyToId: nullableId.optional(),
37833
+ clientNonce: CommunityMessageResourceSchema.shape.clientNonce.default(null),
37834
+ attachments: CommunityLegacyMessageResourceSchema.shape.attachments.default([]),
37835
+ embeds: CommunityMessageResourceSchema.shape.embeds.nullable().transform((value) => value ?? undefined)
37836
+ });
37837
+
37838
+ // ../shared/src/community-attention.ts
37839
+ var id2 = exports_external.string().min(1);
37840
+ var AttentionScopeSchema = exports_external.strictObject({
37841
+ scopeId: id2,
37842
+ channelId: id2,
37843
+ serverId: id2.nullable().optional(),
37844
+ parentChannelId: id2.nullable().optional(),
37574
37845
  ordinaryUnread: exports_external.boolean(),
37575
37846
  lastUnreadSeq: exports_external.number().int().nonnegative(),
37576
37847
  lastAttentionSeq: exports_external.number().int().nonnegative().nullable().optional(),
37577
37848
  attentionCount: exports_external.number().int().nonnegative()
37578
37849
  });
37579
37850
  var AttentionItemSchema = exports_external.strictObject({
37580
- id,
37851
+ id: id2,
37581
37852
  kind: exports_external.enum(["mention", "reply", "friend_request", "forum_post"]),
37582
- sourceId: id,
37583
- scopeId: id.nullable().optional(),
37584
- messageId: id.nullable().optional(),
37585
- actorUserId: id.nullable().optional(),
37853
+ sourceId: id2,
37854
+ scopeId: id2.nullable().optional(),
37855
+ messageId: id2.nullable().optional(),
37856
+ actorUserId: id2.nullable().optional(),
37586
37857
  createdAt: exports_external.string(),
37587
- childChannelId: id.optional(),
37858
+ childChannelId: id2.optional(),
37588
37859
  openerSeq: exports_external.number().int().nonnegative().optional(),
37589
37860
  readTarget: exports_external.strictObject({
37590
- channelId: id,
37861
+ channelId: id2,
37591
37862
  seq: exports_external.number().int().nonnegative()
37592
37863
  }).optional()
37593
37864
  }).superRefine((item, ctx) => {
@@ -37617,26 +37888,30 @@ var AttentionItemSchema = exports_external.strictObject({
37617
37888
  }
37618
37889
  });
37619
37890
  var AttentionIncludedServerSchema = exports_external.strictObject({
37620
- id,
37891
+ id: id2,
37621
37892
  name: exports_external.string(),
37622
37893
  discriminator: exports_external.string()
37623
37894
  });
37624
- var AttentionIncludedChannelSchema = exports_external.strictObject({
37625
- id,
37626
- serverId: id,
37627
- name: exports_external.string(),
37628
- type: exports_external.enum(["text", "forum", "thread"]),
37629
- parentChannelId: id.nullable(),
37630
- parentMessageId: id.nullable(),
37631
- creatorId: id.nullable(),
37632
- archived: exports_external.boolean(),
37633
- lastMessageAt: exports_external.string().nullable(),
37895
+ var AttentionIncludedChannelSchema = CommunityChannelResourceSchema.pick({
37896
+ id: true,
37897
+ serverId: true,
37898
+ name: true,
37899
+ type: true,
37900
+ parentChannelId: true,
37901
+ parentMessageId: true,
37902
+ creatorId: true,
37903
+ archived: true,
37904
+ lastMessageAt: true
37905
+ }).extend({
37906
+ serverId: CommunityChannelResourceSchema.shape.serverId.unwrap(),
37907
+ name: CommunityChannelResourceSchema.shape.name.unwrap(),
37908
+ type: CommunityChannelResourceSchema.shape.type.extract(["text", "forum", "thread"]),
37634
37909
  openerSeq: exports_external.number().int().nonnegative().optional(),
37635
37910
  openerUnread: exports_external.boolean().optional()
37636
37911
  });
37637
37912
  var AttentionIncludedDmSchema = exports_external.strictObject({
37638
- id,
37639
- userId: id,
37913
+ id: id2,
37914
+ userId: id2,
37640
37915
  name: exports_external.string(),
37641
37916
  discriminator: exports_external.string(),
37642
37917
  avatar: exports_external.string(),
@@ -37645,22 +37920,21 @@ var AttentionIncludedDmSchema = exports_external.strictObject({
37645
37920
  lastUnreadSeq: exports_external.number().int().nonnegative()
37646
37921
  });
37647
37922
  var AttentionIncludedProfileSchema = exports_external.strictObject({
37648
- userId: id,
37649
- name: exports_external.string(),
37923
+ userId: CommunityResourceProfileSchema.shape.id,
37924
+ ...CommunityResourceProfileSchema.pick({ name: true, discriminator: true, avatar: true, avatarVersion: true }).shape,
37650
37925
  discriminator: exports_external.string(),
37651
- avatar: exports_external.string(),
37652
- avatarVersion: exports_external.number().int().nonnegative()
37653
- });
37654
- var AttentionIncludedMessageSchema = exports_external.strictObject({
37655
- id,
37656
- channelId: id,
37657
- type: exports_external.enum(["chat", "system"]),
37658
- authorId: id.optional(),
37659
- authorName: exports_external.string().optional(),
37660
- seq: exports_external.number().int().nonnegative(),
37661
- createdAt: exports_external.string(),
37662
- content: exports_external.string()
37926
+ avatar: exports_external.string()
37663
37927
  });
37928
+ var AttentionIncludedMessageSchema = CommunityMessagePreviewSchema.pick({
37929
+ id: true,
37930
+ channelId: true,
37931
+ type: true,
37932
+ authorId: true,
37933
+ authorName: true,
37934
+ seq: true,
37935
+ createdAt: true,
37936
+ content: true
37937
+ }).required({ channelId: true, seq: true, createdAt: true, content: true });
37664
37938
  var AttentionIncludedSchema = exports_external.strictObject({
37665
37939
  servers: exports_external.array(AttentionIncludedServerSchema),
37666
37940
  channels: exports_external.array(AttentionIncludedChannelSchema),
@@ -37686,7 +37960,7 @@ var AccountAttentionSnapshotSchema = exports_external.strictObject({
37686
37960
  const serverById = new Map(snapshot.included.servers.map((server) => [server.id, server]));
37687
37961
  const channelById = new Map(snapshot.included.channels.map((channel2) => [channel2.id, channel2]));
37688
37962
  const dmById = new Map(snapshot.included.dms.map((dm) => [dm.id, dm]));
37689
- const profileById = new Map(snapshot.included.profiles.map((profile) => [profile.userId, profile]));
37963
+ const profileById = new Map(snapshot.included.profiles.map((profile2) => [profile2.userId, profile2]));
37690
37964
  const messageById = new Map(snapshot.included.messages.map((message2) => [message2.id, message2]));
37691
37965
  const rejectDuplicates = (values, kind) => {
37692
37966
  const seen = new Set;
@@ -37699,7 +37973,7 @@ var AccountAttentionSnapshotSchema = exports_external.strictObject({
37699
37973
  rejectDuplicates(snapshot.included.servers.map((server) => server.id), "server");
37700
37974
  rejectDuplicates(snapshot.included.channels.map((channel2) => channel2.id), "channel");
37701
37975
  rejectDuplicates(snapshot.included.dms.map((dm) => dm.id), "dm");
37702
- rejectDuplicates(snapshot.included.profiles.map((profile) => profile.userId), "profile");
37976
+ rejectDuplicates(snapshot.included.profiles.map((profile2) => profile2.userId), "profile");
37703
37977
  rejectDuplicates(snapshot.included.messages.map((message2) => message2.id), "message");
37704
37978
  for (const scope of snapshot.scopes) {
37705
37979
  if (scope.serverId) {
@@ -38510,15 +38784,15 @@ var CommunityMachineRuntimeListSchema = exports_external.array(CommunityMachineR
38510
38784
  var CommunityRunningAgentListSchema = exports_external.array(exports_external.string()).transform((list) => {
38511
38785
  const seen = new Set;
38512
38786
  const out = [];
38513
- for (const id2 of list) {
38514
- if (seen.has(id2))
38787
+ for (const id3 of list) {
38788
+ if (seen.has(id3))
38515
38789
  continue;
38516
- seen.add(id2);
38517
- out.push(id2);
38790
+ seen.add(id3);
38791
+ out.push(id3);
38518
38792
  }
38519
38793
  return out;
38520
38794
  });
38521
- var CommunityMachineSummarySchema = exports_external.object({
38795
+ var CommunityMachineSummarySchema = exports_external.strictObject({
38522
38796
  id: exports_external.string(),
38523
38797
  hostname: exports_external.string(),
38524
38798
  displayName: exports_external.string(),
@@ -38528,8 +38802,8 @@ var CommunityMachineSummarySchema = exports_external.object({
38528
38802
  daemonVersion: exports_external.string(),
38529
38803
  lastSeenAt: exports_external.string().nullable(),
38530
38804
  status: exports_external.enum(["online", "offline"]),
38531
- availableRuntimes: exports_external.array(CommunityMachineRuntimeSchema).default([]),
38532
- lastRuntimeError: exports_external.object({
38805
+ availableRuntimes: exports_external.array(CommunityMachineRuntimeSchema.strict()),
38806
+ lastRuntimeError: exports_external.strictObject({
38533
38807
  requested: exports_external.string(),
38534
38808
  available: exports_external.array(exports_external.string()),
38535
38809
  at: exports_external.string()
@@ -38912,6 +39186,7 @@ __export(exports_community_schema, {
38912
39186
  communityMessageTag: () => communityMessageTag,
38913
39187
  communityMessageSeq: () => communityMessageSeq,
38914
39188
  communityMessageMark: () => communityMessageMark,
39189
+ communityMessageAttachment: () => communityMessageAttachment,
38915
39190
  communityMessage: () => communityMessage,
38916
39191
  communityMention: () => communityMention,
38917
39192
  communityFriendship: () => communityFriendship,
@@ -39087,11 +39362,7 @@ var communityReaction = sqliteTable("community_reaction", {
39087
39362
  ]);
39088
39363
  var communityAttachment = sqliteTable("community_attachment", {
39089
39364
  id: text2("id").primaryKey().$defaultFn(() => nanoid3()),
39090
- messageId: text2("message_id").references(() => communityMessage.id, {
39091
- onDelete: "cascade"
39092
- }),
39093
39365
  uploaderId: text2("uploader_id").notNull(),
39094
- targetId: text2("target_id").notNull(),
39095
39366
  r2Key: text2("r2_key").notNull(),
39096
39367
  thumbnailR2Key: text2("thumbnail_r2_key"),
39097
39368
  filename: text2("filename").notNull(),
@@ -39099,10 +39370,20 @@ var communityAttachment = sqliteTable("community_attachment", {
39099
39370
  size: integer2("size"),
39100
39371
  width: integer2("width"),
39101
39372
  height: integer2("height"),
39102
- position: integer2("position"),
39103
39373
  createdAt: text2("created_at").notNull().$defaultFn(() => new Date().toISOString())
39104
39374
  }, (t) => [
39105
- index("idx_attachment_message").on(t.messageId, t.position)
39375
+ index("idx_attachment_uploader").on(t.uploaderId),
39376
+ index("idx_attachment_r2_key").on(t.r2Key),
39377
+ index("idx_attachment_thumbnail_r2_key").on(t.thumbnailR2Key)
39378
+ ]);
39379
+ var communityMessageAttachment = sqliteTable("community_message_attachment", {
39380
+ messageId: text2("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
39381
+ attachmentId: text2("attachment_id").notNull().references(() => communityAttachment.id, { onDelete: "restrict" }),
39382
+ position: integer2("position").notNull()
39383
+ }, (t) => [
39384
+ primaryKey({ columns: [t.messageId, t.attachmentId] }),
39385
+ unique("uq_message_attachment_position").on(t.messageId, t.position),
39386
+ index("idx_message_attachment_file").on(t.attachmentId, t.messageId)
39106
39387
  ]);
39107
39388
  var communityPin = sqliteTable("community_pin", {
39108
39389
  id: text2("id").primaryKey().$defaultFn(() => nanoid3()),
@@ -39224,6 +39505,41 @@ var communityMessageTag = sqliteTable("community_message_tag", {
39224
39505
  index("idx_message_tag_tag").on(t.tag, t.messageId)
39225
39506
  ]);
39226
39507
 
39508
+ // ../shared/src/db/queries/_chunk.ts
39509
+ var D1_MAX_BIND_PARAMS = 100;
39510
+ function maxInParams(fixedParams) {
39511
+ if (!Number.isInteger(fixedParams) || fixedParams < 0) {
39512
+ throw new Error("fixed params must be a non-negative integer");
39513
+ }
39514
+ if (fixedParams >= D1_MAX_BIND_PARAMS) {
39515
+ throw new Error("fixed params must leave room for at least one IN parameter");
39516
+ }
39517
+ return D1_MAX_BIND_PARAMS - fixedParams;
39518
+ }
39519
+ function maxRowsPerInsert(paramsPerRow) {
39520
+ if (paramsPerRow < 1)
39521
+ throw new Error("paramsPerRow must be >= 1");
39522
+ return Math.floor(D1_MAX_BIND_PARAMS / paramsPerRow);
39523
+ }
39524
+
39525
+ // ../shared/src/db/queries/community/channel.ts
39526
+ var CHANNEL_COLUMNS = {
39527
+ id: communityChannel.id,
39528
+ serverId: communityChannel.serverId,
39529
+ categoryId: communityChannel.categoryId,
39530
+ name: communityChannel.name,
39531
+ type: communityChannel.type,
39532
+ topic: communityChannel.topic,
39533
+ position: communityChannel.position,
39534
+ parentChannelId: communityChannel.parentChannelId,
39535
+ creatorId: communityChannel.creatorId,
39536
+ messageCount: communityChannel.messageCount,
39537
+ archived: communityChannel.archived,
39538
+ parentMessageId: communityChannel.parentMessageId,
39539
+ lastMessageAt: communityChannel.lastMessageAt,
39540
+ createdAt: communityChannel.createdAt
39541
+ };
39542
+
39227
39543
  // ../shared/src/logger.ts
39228
39544
  var LEVELS = {
39229
39545
  debug: 0,
@@ -39304,23 +39620,6 @@ function createLogger2(opts) {
39304
39620
  return new Logger(opts);
39305
39621
  }
39306
39622
 
39307
- // ../shared/src/db/queries/_chunk.ts
39308
- var D1_MAX_BIND_PARAMS = 100;
39309
- function maxInParams(fixedParams) {
39310
- if (!Number.isInteger(fixedParams) || fixedParams < 0) {
39311
- throw new Error("fixed params must be a non-negative integer");
39312
- }
39313
- if (fixedParams >= D1_MAX_BIND_PARAMS) {
39314
- throw new Error("fixed params must leave room for at least one IN parameter");
39315
- }
39316
- return D1_MAX_BIND_PARAMS - fixedParams;
39317
- }
39318
- function maxRowsPerInsert(paramsPerRow) {
39319
- if (paramsPerRow < 1)
39320
- throw new Error("paramsPerRow must be >= 1");
39321
- return Math.floor(D1_MAX_BIND_PARAMS / paramsPerRow);
39322
- }
39323
-
39324
39623
  // ../shared/src/db/queries/community/message.ts
39325
39624
  var log = createLogger2({ service: "community-queries" });
39326
39625
  var messageProjection = {
@@ -39419,24 +39718,6 @@ var userProductPlan = sqliteTable("user_product_plan", {
39419
39718
  updatedAt: text2("updated_at").notNull().$defaultFn(() => new Date().toISOString())
39420
39719
  }, (t) => [index("idx_user_product_plan_plan").on(t.planId)]);
39421
39720
 
39422
- // ../shared/src/db/queries/community/channel.ts
39423
- var CHANNEL_COLUMNS = {
39424
- id: communityChannel.id,
39425
- serverId: communityChannel.serverId,
39426
- categoryId: communityChannel.categoryId,
39427
- name: communityChannel.name,
39428
- type: communityChannel.type,
39429
- topic: communityChannel.topic,
39430
- position: communityChannel.position,
39431
- parentChannelId: communityChannel.parentChannelId,
39432
- creatorId: communityChannel.creatorId,
39433
- messageCount: communityChannel.messageCount,
39434
- archived: communityChannel.archived,
39435
- parentMessageId: communityChannel.parentMessageId,
39436
- lastMessageAt: communityChannel.lastMessageAt,
39437
- createdAt: communityChannel.createdAt
39438
- };
39439
-
39440
39721
  // ../shared/src/db/queries/community/thread.ts
39441
39722
  var NOTIFY_CONFLICT_TARGET = [
39442
39723
  communityChannelMember.channelId,
@@ -39462,203 +39743,6 @@ var AGENT_UNREAD_CHANNEL_CHUNK_SIZE = maxInParams(13);
39462
39743
 
39463
39744
  // ../shared/src/db/queries/community/mention.ts
39464
39745
  var MENTION_INSERT_MAX_ROWS = maxRowsPerInsert(5);
39465
- // ../shared/src/community-friend-approval.ts
39466
- var profile = exports_external.strictObject({
39467
- id: exports_external.string(),
39468
- name: exports_external.string(),
39469
- discriminator: exports_external.string(),
39470
- image: exports_external.string().nullable(),
39471
- avatarVersion: exports_external.number().int().nonnegative()
39472
- });
39473
- var FriendApprovalPayloadSchema = exports_external.strictObject({
39474
- friendshipId: exports_external.string(),
39475
- status: exports_external.enum(["pending", "approved", "denied", "superseded", "cancelled"]),
39476
- waitingOn: exports_external.enum(["you", "other-owner", "addressee"]).nullable(),
39477
- otherProfile: profile,
39478
- botProfile: profile,
39479
- waitingOnProfile: profile.nullable().optional()
39480
- });
39481
-
39482
- // ../shared/src/community-contract.ts
39483
- var COMMUNITY_CONTRACT_VERSION = 2;
39484
-
39485
- // ../shared/src/community-resources.ts
39486
- var id2 = exports_external.string().min(1);
39487
- var nullableId = id2.nullable();
39488
- var legacyArchivedSchema = exports_external.union([exports_external.boolean(), exports_external.literal(0), exports_external.literal(1)]).transform((value) => value === true || value === 1);
39489
- var CommunityChannelResourceSchema = exports_external.strictObject({
39490
- id: id2,
39491
- type: exports_external.enum(["text", "forum", "thread", "dm"]),
39492
- serverId: nullableId,
39493
- categoryId: nullableId,
39494
- name: exports_external.string().nullable(),
39495
- topic: exports_external.string(),
39496
- parentChannelId: nullableId,
39497
- parentMessageId: nullableId,
39498
- creatorId: nullableId,
39499
- position: exports_external.number(),
39500
- archived: exports_external.boolean(),
39501
- createdAt: exports_external.string(),
39502
- lastMessageAt: exports_external.string().nullable(),
39503
- messageCount: exports_external.number().int().nonnegative()
39504
- });
39505
- var CommunityChannelIdentitySchema = CommunityChannelResourceSchema.pick({
39506
- id: true,
39507
- type: true,
39508
- serverId: true,
39509
- name: true,
39510
- parentChannelId: true,
39511
- parentMessageId: true,
39512
- creatorId: true,
39513
- archived: true,
39514
- lastMessageAt: true,
39515
- createdAt: true
39516
- }).partial({ createdAt: true }).strip();
39517
- var legacyChannelIdentitySchema = CommunityChannelIdentitySchema.extend({
39518
- archived: legacyArchivedSchema,
39519
- parentChannelId: nullableId.default(null),
39520
- parentMessageId: nullableId.default(null),
39521
- creatorId: nullableId.default(null),
39522
- lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null)
39523
- });
39524
- var CommunityAccessDecisionSchema = exports_external.strictObject({
39525
- channelId: id2,
39526
- canRead: exports_external.boolean(),
39527
- canSend: exports_external.boolean(),
39528
- canCreateDiscussion: exports_external.boolean()
39529
- });
39530
- var CommunityMessageAttachmentSchema = exports_external.strictObject({
39531
- kind: exports_external.enum(["image", "file"]),
39532
- name: exports_external.string(),
39533
- url: exports_external.string(),
39534
- thumbnailUrl: exports_external.string().optional(),
39535
- contentType: exports_external.string().optional(),
39536
- size: exports_external.string().optional(),
39537
- sizeBytes: exports_external.number().nonnegative().optional(),
39538
- width: exports_external.number().nonnegative().optional(),
39539
- height: exports_external.number().nonnegative().optional()
39540
- });
39541
- var CommunityMessageResourceSchema = exports_external.strictObject({
39542
- id: id2,
39543
- channelId: id2,
39544
- seq: exports_external.number().int().nonnegative(),
39545
- authorId: id2,
39546
- createdAt: exports_external.string(),
39547
- type: exports_external.enum(["chat", "system"]),
39548
- content: exports_external.string(),
39549
- replyToId: nullableId,
39550
- clientNonce: exports_external.string().nullable(),
39551
- attachments: exports_external.array(CommunityMessageAttachmentSchema),
39552
- systemKind: exports_external.literal("thread").optional(),
39553
- authorName: exports_external.string().optional(),
39554
- authorAvatar: exports_external.string().optional(),
39555
- authorAvatarVersion: exports_external.number().int().nonnegative().optional(),
39556
- mentionType: exports_external.literal("everyone").nullable().optional(),
39557
- replyTo: exports_external.strictObject({
39558
- id: id2,
39559
- authorId: id2.optional(),
39560
- authorName: exports_external.string(),
39561
- text: exports_external.string(),
39562
- deleted: exports_external.boolean().optional()
39563
- }).optional(),
39564
- embeds: exports_external.array(exports_external.unknown()).optional(),
39565
- reactions: exports_external.array(exports_external.strictObject({
39566
- emoji: exports_external.string(),
39567
- count: exports_external.number().int().nonnegative(),
39568
- me: exports_external.boolean(),
39569
- userIds: exports_external.array(id2)
39570
- })).optional(),
39571
- thread: exports_external.strictObject({
39572
- id: id2,
39573
- name: exports_external.string(),
39574
- messageCount: exports_external.number().int().nonnegative(),
39575
- lastReplyAt: exports_external.string().optional(),
39576
- tags: exports_external.array(exports_external.string()).optional(),
39577
- preview: exports_external.string().optional(),
39578
- participants: exports_external.array(exports_external.strictObject({ id: id2, name: exports_external.string(), avatar: exports_external.string(), avatarVersion: exports_external.number().int().nonnegative() })).optional(),
39579
- participantCount: exports_external.number().int().nonnegative().optional()
39580
- }).optional(),
39581
- approval: FriendApprovalPayloadSchema.optional()
39582
- });
39583
- var CommunityReadStateResourceSchema = exports_external.strictObject({
39584
- channelId: id2,
39585
- lastReadMessageId: nullableId,
39586
- lastReadAt: exports_external.string().nullable(),
39587
- lastReadSeq: exports_external.number().int().nonnegative()
39588
- });
39589
- var CommunityMemberRelationSchema = exports_external.strictObject({
39590
- channelId: id2,
39591
- userId: id2,
39592
- relation: exports_external.enum(["access", "notify"]),
39593
- source: exports_external.string(),
39594
- isCreator: exports_external.boolean(),
39595
- role: exports_external.string().nullable(),
39596
- memberId: nullableId
39597
- });
39598
- var CommunityResourceProfileSchema = exports_external.strictObject({
39599
- id: id2,
39600
- name: exports_external.string(),
39601
- discriminator: exports_external.string().nullable(),
39602
- avatar: exports_external.string().nullable(),
39603
- avatarVersion: exports_external.number().int().nonnegative(),
39604
- statusEmoji: exports_external.string().nullable(),
39605
- statusText: exports_external.string()
39606
- });
39607
- var CommunityPageSchema = exports_external.strictObject({
39608
- olderCursor: exports_external.string().nullable(),
39609
- newerCursor: exports_external.string().nullable(),
39610
- hasMoreOlder: exports_external.boolean(),
39611
- hasMoreNewer: exports_external.boolean(),
39612
- latestSeq: exports_external.number().int().nonnegative()
39613
- });
39614
- var envelope = { contractVersion: exports_external.literal(COMMUNITY_CONTRACT_VERSION), channelId: id2 };
39615
- var CommunityChannelReadSchema = exports_external.strictObject({ ...envelope, channel: CommunityChannelResourceSchema, access: CommunityAccessDecisionSchema });
39616
- var CommunityMessagesReadSchema = exports_external.strictObject({
39617
- ...envelope,
39618
- messages: exports_external.array(CommunityMessageResourceSchema),
39619
- page: CommunityPageSchema,
39620
- surfaceReceipt: exports_external.strictObject({ channelId: id2, surfaceKind: exports_external.enum(["channel", "forum", "thread", "dm"]) })
39621
- });
39622
- var CommunityReadStateReadSchema = exports_external.strictObject({ ...envelope, readState: CommunityReadStateResourceSchema });
39623
- var CommunityMembersReadSchema = exports_external.strictObject({ ...envelope, relation: exports_external.enum(["access", "notify"]), members: exports_external.array(CommunityMemberRelationSchema), profiles: exports_external.array(CommunityResourceProfileSchema) });
39624
- var CommunityThreadsReadSchema = exports_external.strictObject({
39625
- ...envelope,
39626
- channel: CommunityChannelResourceSchema,
39627
- threads: exports_external.array(CommunityChannelResourceSchema),
39628
- included: exports_external.strictObject({
39629
- messages: exports_external.array(CommunityMessageResourceSchema),
39630
- members: exports_external.array(CommunityMemberRelationSchema),
39631
- profiles: exports_external.array(CommunityResourceProfileSchema),
39632
- tags: exports_external.array(exports_external.strictObject({ messageId: id2, tag: exports_external.string() })),
39633
- participantCounts: exports_external.array(exports_external.strictObject({ channelId: id2, count: exports_external.number().int().nonnegative() }))
39634
- }),
39635
- page: exports_external.strictObject({ nextCursor: exports_external.string().nullable(), hasMore: exports_external.boolean() })
39636
- });
39637
- var CommunityReadAdvanceSchema = exports_external.strictObject({ ...envelope, changed: exports_external.boolean(), targetSeq: exports_external.number().int().nonnegative(), revision: exports_external.number().int().nonnegative() });
39638
- var CommunityReadErrorSchema = exports_external.strictObject({ contractVersion: exports_external.literal(COMMUNITY_CONTRACT_VERSION), error: exports_external.strictObject({
39639
- code: exports_external.enum(["invalid_input", "invalid_reply_target", "unauthenticated", "not_found", "not_allowed", "blocked", "idempotency_conflict", "rate_limited", "temporarily_unavailable"]),
39640
- message: exports_external.string(),
39641
- retryable: exports_external.boolean()
39642
- }) });
39643
- var legacyChannelResourceSchema = CommunityChannelResourceSchema.strip().extend({
39644
- topic: CommunityChannelResourceSchema.shape.topic.nullish().transform((value) => value ?? ""),
39645
- position: CommunityChannelResourceSchema.shape.position.nullish().transform((value) => value ?? 0),
39646
- messageCount: CommunityChannelResourceSchema.shape.messageCount.nullish().transform((value) => value ?? 0),
39647
- categoryId: nullableId.default(null),
39648
- parentChannelId: nullableId.default(null),
39649
- parentMessageId: nullableId.default(null),
39650
- creatorId: nullableId.default(null),
39651
- lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null),
39652
- archived: legacyArchivedSchema
39653
- });
39654
- var legacyMessageResourceSchema = CommunityMessageResourceSchema.strip().extend({
39655
- channelId: id2.optional(),
39656
- replyToId: nullableId.optional(),
39657
- clientNonce: CommunityMessageResourceSchema.shape.clientNonce.default(null),
39658
- attachments: CommunityMessageResourceSchema.shape.attachments.default([]),
39659
- embeds: CommunityMessageResourceSchema.shape.embeds.nullable().transform((value) => value ?? undefined)
39660
- });
39661
-
39662
39746
  // ../shared/src/community-ws-events.ts
39663
39747
  var string4 = exports_external.string();
39664
39748
  var nullableString = string4.nullable();
@@ -39688,6 +39772,7 @@ var messageSchema = CommunityMessageResourceSchema.pick({
39688
39772
  seq: exports_external.number(),
39689
39773
  authorId: string4,
39690
39774
  authorName: string4,
39775
+ authorAvatar: string4.optional(),
39691
39776
  authorAvatarVersion: CommunityMessageResourceSchema.shape.authorAvatarVersion.unwrap(),
39692
39777
  replyToId: nullableString.optional(),
39693
39778
  replyTo: CommunityMessageResourceSchema.shape.replyTo.unwrap().extend({
@@ -39697,7 +39782,7 @@ var messageSchema = CommunityMessageResourceSchema.pick({
39697
39782
  attachments: exports_external.array(messageAttachmentSchema).optional(),
39698
39783
  clientNonce: string4.optional()
39699
39784
  });
39700
- var communityMessageCreateSchema = exports_external.strictObject({
39785
+ var CommunityLegacyMessageCreateSchema = exports_external.strictObject({
39701
39786
  type: exports_external.literal("community:message.create"),
39702
39787
  channelId: string4,
39703
39788
  serverId: string4.optional(),
@@ -40009,29 +40094,9 @@ var communityProfileUpdateSchema = exports_external.strictObject({
40009
40094
  kind: exports_external.enum(["human", "bot"]),
40010
40095
  ownerUserId: nullableString
40011
40096
  });
40012
- var machineRuntimeSchema = CommunityMachineRuntimeSchema.strict();
40013
- var CommunityMachineSummarySchema2 = exports_external.strictObject({
40014
- id: string4,
40015
- hostname: string4,
40016
- displayName: string4,
40017
- platform: string4,
40018
- arch: string4,
40019
- osRelease: string4,
40020
- daemonVersion: string4,
40021
- lastSeenAt: nullableString,
40022
- status: exports_external.enum(["online", "offline"]),
40023
- availableRuntimes: exports_external.array(machineRuntimeSchema),
40024
- lastRuntimeError: exports_external.strictObject({
40025
- requested: string4,
40026
- available: exports_external.array(string4),
40027
- at: string4
40028
- }).optional(),
40029
- createdAt: string4,
40030
- updatedAt: string4
40031
- });
40032
40097
  var communityMachineCreatedSchema = exports_external.strictObject({
40033
40098
  type: exports_external.literal("community:machine.created"),
40034
- machine: CommunityMachineSummarySchema2,
40099
+ machine: CommunityMachineSummarySchema,
40035
40100
  tokenId: string4
40036
40101
  });
40037
40102
  var communityMachineStatusSchema = exports_external.strictObject({
@@ -40042,7 +40107,7 @@ var communityMachineStatusSchema = exports_external.strictObject({
40042
40107
  });
40043
40108
  var communityMachineUpdatedSchema = exports_external.strictObject({
40044
40109
  type: exports_external.literal("community:machine.updated"),
40045
- machine: CommunityMachineSummarySchema2
40110
+ machine: CommunityMachineSummarySchema
40046
40111
  });
40047
40112
  var communityMachineRemovedSchema = exports_external.strictObject({
40048
40113
  type: exports_external.literal("community:machine.removed"),
@@ -40058,8 +40123,7 @@ var communityBotAuditEventSchema = exports_external.strictObject({
40058
40123
  launchId: nullableString.optional(),
40059
40124
  createdAt: string4
40060
40125
  }).refine((event) => Object.prototype.hasOwnProperty.call(event, "payload"));
40061
- var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
40062
- communityMessageCreateSchema,
40126
+ var commonCommunityEventSchemas = [
40063
40127
  communityMessageUpdatedSchema,
40064
40128
  communityMessageEditedSchema,
40065
40129
  communityReactionAddSchema,
@@ -40068,12 +40132,8 @@ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("t
40068
40132
  communityPinRemoveSchema,
40069
40133
  communityTypingStartSchema,
40070
40134
  communityTypingStopSchema,
40071
- communityChildChannelCreateSchema,
40072
- communityChildChannelUpdateSchema,
40073
40135
  communityServerUpdateSchema,
40074
40136
  communityServerDeleteSchema,
40075
- communityChannelCreateSchema,
40076
- communityChannelUpdateSchema,
40077
40137
  communityChannelDeleteSchema,
40078
40138
  communityChannelReorderSchema,
40079
40139
  communityChannelMemberAddSchema,
@@ -40098,15 +40158,34 @@ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("t
40098
40158
  communityInboxChangedSchema,
40099
40159
  communityPresenceUpdateSchema,
40100
40160
  communityStatusUpdateSchema,
40101
- communityIdentityUpdateSchema,
40102
- communityProfileUpdateSchema,
40103
40161
  communityMachineCreatedSchema,
40104
40162
  communityMachineStatusSchema,
40105
40163
  communityMachineUpdatedSchema,
40106
40164
  communityMachineRemovedSchema,
40107
40165
  communityBotAuditEventSchema
40166
+ ];
40167
+ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
40168
+ ...commonCommunityEventSchemas,
40169
+ CommunityLegacyMessageCreateSchema,
40170
+ communityChildChannelCreateSchema,
40171
+ communityChannelCreateSchema,
40172
+ communityChildChannelUpdateSchema,
40173
+ communityChannelUpdateSchema,
40174
+ communityIdentityUpdateSchema,
40175
+ communityProfileUpdateSchema
40176
+ ]);
40177
+ var CommunityResourceWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
40178
+ ...commonCommunityEventSchemas,
40179
+ CommunityLegacyMessageCreateSchema.extend({ message: CommunityMessageResourceSchema.required({ authorName: true, authorAvatarVersion: true }) }).refine((event) => event.message.channelId === event.channelId),
40180
+ communityChildChannelCreateSchema.extend({ channel: CommunityChannelResourceSchema.extend({ type: exports_external.literal("thread") }) }).refine((event) => event.channel.parentChannelId === event.parentChannelId && (event.parentMessageId === undefined || event.parentMessageId === event.channel.parentMessageId)),
40181
+ communityChannelCreateSchema.extend({ channel: CommunityChannelResourceSchema.extend({ type: channelTypeSchema }) }).refine((event) => event.channel.serverId === event.serverId),
40182
+ communityChildChannelUpdateSchema.extend({ changes: CommunityChannelResourceSchema.pick({ name: true, archived: true, lastMessageAt: true, messageCount: true }).partial().extend({ tags: exports_external.array(string4).nullable().optional() }) }),
40183
+ communityChannelUpdateSchema.extend({ changes: CommunityChannelResourceSchema.pick({ name: true, topic: true, categoryId: true, type: true }).partial().extend({ type: channelTypeSchema.optional() }) }),
40184
+ communityIdentityUpdateSchema.extend({ avatar: CommunityResourceProfileSchema.shape.avatar, avatarVersion: CommunityResourceProfileSchema.shape.avatarVersion.refine((version3) => version3 > 0) }),
40185
+ CommunityResourceProfileSchema.pick({ name: true, discriminator: true, aboutMe: true, bannerColor: true, kind: true, ownerUserId: true }).required().extend({ type: exports_external.literal("community:profile.update"), userId: string4 })
40108
40186
  ]);
40109
40187
  var CommunityWsEventSchema = CommunityWsEventDiscriminatedSchema.transform((event) => event);
40188
+ var CommunityResourceWsEventSchema = CommunityResourceWsEventDiscriminatedSchema.transform((event) => event);
40110
40189
  var WS_EVENTS = {
40111
40190
  MESSAGE_CREATE: "community:message.create",
40112
40191
  MESSAGE_UPDATED: "community:message.updated",
@@ -40190,6 +40269,7 @@ var memberAddedSchema = exports_external.strictObject({
40190
40269
  channelId: exports_external.string().min(1)
40191
40270
  });
40192
40271
  var batchShape = exports_external.strictObject({
40272
+ communityContract: exports_external.literal(3).optional(),
40193
40273
  messageId: exports_external.string().min(1),
40194
40274
  messageEvent: exports_external.unknown(),
40195
40275
  contentUserIds: targetList,
@@ -40306,8 +40386,46 @@ var communityFunnelAnalyticsEvent = sqliteTable("community_funnel_analytics_even
40306
40386
  index("idx_community_funnel_analytics_owner_claimed_created").on(t.ownerUserId, t.claimedAt, t.createdAt)
40307
40387
  ]);
40308
40388
 
40389
+ // ../shared/src/db/product-analytics-schema.ts
40390
+ var exports_product_analytics_schema = {};
40391
+ __export(exports_product_analytics_schema, {
40392
+ productAnalyticsEvent: () => productAnalyticsEvent,
40393
+ PRODUCT_ANALYTICS_EVENTS: () => PRODUCT_ANALYTICS_EVENTS
40394
+ });
40395
+ var PRODUCT_ANALYTICS_EVENTS = [
40396
+ "landing_cta_clicked",
40397
+ "login_page_view",
40398
+ "sign_up",
40399
+ "sign_in_success",
40400
+ "sign_in_failed",
40401
+ "onboarding_enter_clicked",
40402
+ "onboarding_first_message",
40403
+ "invitation_link_visit"
40404
+ ];
40405
+ var productAnalyticsEvent = sqliteTable("product_analytics_event", {
40406
+ id: text2("id").primaryKey(),
40407
+ eventName: text2("event_name").notNull().$type(),
40408
+ actorUserId: text2("actor_user_id").references(() => user.id, { onDelete: "cascade" }),
40409
+ serverId: text2("server_id").references(() => communityServer.id, { onDelete: "cascade" }),
40410
+ sourceId: text2("source_id"),
40411
+ dedupeKey: text2("dedupe_key").notNull(),
40412
+ clientId: text2("client_id").notNull(),
40413
+ sessionId: text2("session_id").notNull(),
40414
+ method: text2("method"),
40415
+ accountKind: text2("account_kind").$type(),
40416
+ ctaName: text2("cta_name"),
40417
+ failureStage: text2("failure_stage").$type(),
40418
+ createdAt: text2("created_at").notNull(),
40419
+ deliveryStatus: text2("delivery_status").notNull().default("pending").$type(),
40420
+ deliveryReason: text2("delivery_reason"),
40421
+ attemptedAt: text2("attempted_at")
40422
+ }, (t) => [
40423
+ uniqueIndex("uq_product_analytics_dedupe").on(t.dedupeKey),
40424
+ index("idx_product_analytics_actor_server_event").on(t.actorUserId, t.serverId, t.eventName)
40425
+ ]);
40426
+
40309
40427
  // ../shared/src/db/index.ts
40310
- var allSchema = { ...exports_schema, ...exports_community_schema, ...exports_community_machine_schema, ...exports_product_plan_schema, ...exports_billing_schema, ...exports_community_funnel_analytics_schema };
40428
+ var allSchema = { ...exports_schema, ...exports_community_schema, ...exports_community_machine_schema, ...exports_product_plan_schema, ...exports_billing_schema, ...exports_community_funnel_analytics_schema, ...exports_product_analytics_schema };
40311
40429
  // ../shared/src/community-server-rail.ts
40312
40430
  var MAX_SERVER_RAIL_COMMANDS = 3;
40313
40431
  var idSchema = exports_external.string().trim().min(1);