@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/cli/index.js CHANGED
@@ -22143,30 +22143,288 @@ var HostCommandSchema = exports_external.discriminatedUnion("type", [
22143
22143
  // src/cli/proxyServerApi.ts
22144
22144
  import * as fs from "fs";
22145
22145
  import * as path from "path";
22146
- // ../shared/src/community-attention.ts
22146
+ // ../shared/src/community-contract.ts
22147
+ var COMMUNITY_RESOURCE_CONTRACT_VERSION = 3;
22148
+
22149
+ // ../shared/src/community-friend-approval.ts
22150
+ var profile = exports_external.strictObject({
22151
+ id: exports_external.string(),
22152
+ name: exports_external.string(),
22153
+ discriminator: exports_external.string(),
22154
+ image: exports_external.string().nullable(),
22155
+ avatarVersion: exports_external.number().int().nonnegative()
22156
+ });
22157
+ var FriendApprovalPayloadSchema = exports_external.strictObject({
22158
+ friendshipId: exports_external.string(),
22159
+ status: exports_external.enum(["pending", "approved", "denied", "superseded", "cancelled"]),
22160
+ waitingOn: exports_external.enum(["you", "other-owner", "addressee"]).nullable(),
22161
+ otherProfile: profile,
22162
+ botProfile: profile,
22163
+ waitingOnProfile: profile.nullable().optional()
22164
+ });
22165
+
22166
+ // ../shared/src/community-resources.ts
22147
22167
  var id = exports_external.string().min(1);
22148
- var AttentionScopeSchema = exports_external.strictObject({
22149
- scopeId: id,
22168
+ var nullableId = id.nullable();
22169
+ var legacyArchivedSchema = exports_external.union([exports_external.boolean(), exports_external.literal(0), exports_external.literal(1)]).transform((value) => value === true || value === 1);
22170
+ var CommunityChannelResourceSchema = exports_external.strictObject({
22171
+ id,
22172
+ type: exports_external.enum(["text", "forum", "thread", "dm"]),
22173
+ serverId: nullableId,
22174
+ categoryId: nullableId,
22175
+ name: exports_external.string().nullable(),
22176
+ topic: exports_external.string(),
22177
+ parentChannelId: nullableId,
22178
+ parentMessageId: nullableId,
22179
+ creatorId: nullableId,
22180
+ position: exports_external.number(),
22181
+ archived: exports_external.boolean(),
22182
+ createdAt: exports_external.string(),
22183
+ lastMessageAt: exports_external.string().nullable(),
22184
+ messageCount: exports_external.number().int().nonnegative()
22185
+ });
22186
+ var CommunityChannelIdentitySchema = CommunityChannelResourceSchema.pick({
22187
+ id: true,
22188
+ type: true,
22189
+ serverId: true,
22190
+ name: true,
22191
+ parentChannelId: true,
22192
+ parentMessageId: true,
22193
+ creatorId: true,
22194
+ archived: true,
22195
+ lastMessageAt: true,
22196
+ createdAt: true
22197
+ }).partial({ createdAt: true }).strip();
22198
+ var legacyChannelIdentitySchema = CommunityChannelIdentitySchema.extend({
22199
+ archived: legacyArchivedSchema,
22200
+ parentChannelId: nullableId.default(null),
22201
+ parentMessageId: nullableId.default(null),
22202
+ creatorId: nullableId.default(null),
22203
+ lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null)
22204
+ });
22205
+ var CommunityAccessDecisionSchema = exports_external.strictObject({
22206
+ channelId: id,
22207
+ canRead: exports_external.boolean(),
22208
+ canSend: exports_external.boolean(),
22209
+ canCreateDiscussion: exports_external.boolean()
22210
+ });
22211
+ var CommunityLegacyMessageAttachmentSchema = exports_external.strictObject({
22212
+ kind: exports_external.enum(["image", "file"]),
22213
+ name: exports_external.string(),
22214
+ url: exports_external.string(),
22215
+ thumbnailUrl: exports_external.string().optional(),
22216
+ contentType: exports_external.string().optional(),
22217
+ size: exports_external.string().optional(),
22218
+ sizeBytes: exports_external.number().nonnegative().optional(),
22219
+ width: exports_external.number().nonnegative().optional(),
22220
+ height: exports_external.number().nonnegative().optional()
22221
+ });
22222
+ var CommunityMessageAttachmentSchema = exports_external.strictObject({
22223
+ id,
22224
+ name: exports_external.string(),
22225
+ url: exports_external.string(),
22226
+ thumbnailUrl: exports_external.string().nullable(),
22227
+ contentType: exports_external.string().nullable(),
22228
+ sizeBytes: exports_external.number().int().nonnegative().nullable(),
22229
+ width: exports_external.number().int().nonnegative().nullable(),
22230
+ height: exports_external.number().int().nonnegative().nullable()
22231
+ });
22232
+ var CommunityMessagePreviewAttachmentSchema = CommunityMessageAttachmentSchema.partial().required({ name: true, url: true });
22233
+ var CommunityResourceProfileSchema = exports_external.strictObject({
22234
+ id,
22235
+ name: exports_external.string(),
22236
+ discriminator: exports_external.string().min(1).nullable(),
22237
+ avatar: exports_external.string().nullable(),
22238
+ avatarVersion: exports_external.number().int().nonnegative(),
22239
+ aboutMe: exports_external.string().optional(),
22240
+ bannerColor: exports_external.string().nullable().optional(),
22241
+ kind: exports_external.enum(["human", "bot"]).optional(),
22242
+ ownerUserId: nullableId.optional(),
22243
+ ownerHandle: exports_external.string().nullable().optional(),
22244
+ mutualServers: exports_external.number().int().nonnegative().optional(),
22245
+ ownedByViewer: exports_external.boolean().optional(),
22246
+ statusEmoji: exports_external.string().nullable().optional(),
22247
+ statusText: exports_external.string().nullable().optional()
22248
+ });
22249
+ var CommunityMessageThreadParticipantSchema = CommunityResourceProfileSchema.pick({ id: true, name: true, avatar: true, avatarVersion: true });
22250
+ var messageThreadSchema = exports_external.strictObject({
22251
+ id,
22252
+ name: CommunityChannelResourceSchema.shape.name,
22253
+ messageCount: CommunityChannelResourceSchema.shape.messageCount,
22254
+ lastReplyAt: CommunityChannelResourceSchema.shape.lastMessageAt.optional(),
22255
+ tags: exports_external.array(exports_external.string()).optional(),
22256
+ preview: exports_external.string().optional(),
22257
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema).optional(),
22258
+ participantCount: exports_external.number().int().nonnegative().optional()
22259
+ });
22260
+ var legacyMessageThreadSchema = messageThreadSchema.extend({
22261
+ name: exports_external.string(),
22262
+ lastReplyAt: exports_external.string().optional(),
22263
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema.extend({ avatar: exports_external.string() })).optional()
22264
+ });
22265
+ var messageThreadPreviewSchema = messageThreadSchema.partial().required({ id: true }).extend({
22266
+ participants: exports_external.array(CommunityMessageThreadParticipantSchema.partial().required({ id: true })).optional()
22267
+ });
22268
+ var CommunityMessageResourceSchema = exports_external.strictObject({
22269
+ id,
22150
22270
  channelId: id,
22151
- serverId: id.nullable().optional(),
22152
- parentChannelId: id.nullable().optional(),
22271
+ seq: exports_external.number().int().nonnegative(),
22272
+ authorId: id,
22273
+ createdAt: exports_external.string(),
22274
+ type: exports_external.enum(["chat", "system"]),
22275
+ content: exports_external.string(),
22276
+ replyToId: nullableId,
22277
+ clientNonce: exports_external.string().nullable(),
22278
+ attachments: exports_external.array(CommunityMessageAttachmentSchema),
22279
+ systemKind: exports_external.literal("thread").optional(),
22280
+ authorName: exports_external.string().optional(),
22281
+ authorAvatar: exports_external.string().nullable().optional(),
22282
+ authorAvatarVersion: exports_external.number().int().nonnegative().optional(),
22283
+ mentionType: exports_external.literal("everyone").nullable().optional(),
22284
+ replyTo: exports_external.strictObject({
22285
+ id,
22286
+ authorId: id.optional(),
22287
+ authorName: exports_external.string(),
22288
+ text: exports_external.string(),
22289
+ deleted: exports_external.boolean().optional()
22290
+ }).optional(),
22291
+ embeds: exports_external.array(exports_external.unknown()).optional(),
22292
+ reactions: exports_external.array(exports_external.strictObject({
22293
+ emoji: exports_external.string(),
22294
+ count: exports_external.number().int().nonnegative(),
22295
+ me: exports_external.boolean(),
22296
+ userIds: exports_external.array(id)
22297
+ })).optional(),
22298
+ thread: messageThreadSchema.optional(),
22299
+ approval: FriendApprovalPayloadSchema.optional()
22300
+ });
22301
+ var CommunityMessagePreviewSchema = CommunityMessageResourceSchema.partial().required({
22302
+ id: true,
22303
+ type: true
22304
+ }).extend({ attachments: exports_external.array(CommunityMessagePreviewAttachmentSchema).optional(), thread: messageThreadPreviewSchema.optional() });
22305
+ var CommunityReadStateResourceSchema = exports_external.strictObject({
22306
+ channelId: id,
22307
+ lastReadMessageId: nullableId,
22308
+ lastReadAt: exports_external.string().nullable(),
22309
+ lastReadSeq: exports_external.number().int().nonnegative()
22310
+ });
22311
+ var CommunityMemberRelationSchema = exports_external.strictObject({
22312
+ channelId: id,
22313
+ userId: id,
22314
+ relation: exports_external.enum(["access", "notify"]),
22315
+ source: exports_external.string(),
22316
+ isCreator: exports_external.boolean(),
22317
+ role: exports_external.string().nullable(),
22318
+ memberId: nullableId
22319
+ });
22320
+ var CommunityPageSchema = exports_external.strictObject({
22321
+ olderCursor: exports_external.string().nullable(),
22322
+ newerCursor: exports_external.string().nullable(),
22323
+ hasMoreOlder: exports_external.boolean(),
22324
+ hasMoreNewer: exports_external.boolean(),
22325
+ latestSeq: exports_external.number().int().nonnegative()
22326
+ });
22327
+ var envelope = { contractVersion: exports_external.literal(COMMUNITY_RESOURCE_CONTRACT_VERSION), channelId: id };
22328
+ var CommunityChannelReadSchema = exports_external.strictObject({ ...envelope, channel: CommunityChannelResourceSchema, access: CommunityAccessDecisionSchema });
22329
+ var CommunityMessagesReadSchema = exports_external.strictObject({
22330
+ ...envelope,
22331
+ messages: exports_external.array(CommunityMessageResourceSchema),
22332
+ page: CommunityPageSchema,
22333
+ surfaceReceipt: exports_external.strictObject({ channelId: id, surfaceKind: exports_external.enum(["channel", "forum", "thread", "dm"]) })
22334
+ });
22335
+ var CommunityMessagePostedSchema = CommunityMessagesReadSchema.pick({ contractVersion: true, channelId: true }).extend({
22336
+ message: CommunityMessageResourceSchema,
22337
+ deduped: exports_external.boolean(),
22338
+ threadId: id.optional()
22339
+ });
22340
+ var CommunityMessageReadSchema = CommunityMessagePostedSchema.omit({ deduped: true, threadId: true });
22341
+ var CommunityReadStateReadSchema = exports_external.strictObject({ ...envelope, readState: CommunityReadStateResourceSchema });
22342
+ var CommunityMembersReadSchema = exports_external.strictObject({ ...envelope, relation: exports_external.enum(["access", "notify"]), members: exports_external.array(CommunityMemberRelationSchema), profiles: exports_external.array(CommunityResourceProfileSchema) });
22343
+ var CommunityThreadsReadSchema = exports_external.strictObject({
22344
+ ...envelope,
22345
+ channel: CommunityChannelResourceSchema,
22346
+ threads: exports_external.array(CommunityChannelResourceSchema),
22347
+ included: exports_external.strictObject({
22348
+ messages: exports_external.array(CommunityMessageResourceSchema),
22349
+ members: exports_external.array(CommunityMemberRelationSchema),
22350
+ profiles: exports_external.array(CommunityResourceProfileSchema),
22351
+ tags: exports_external.array(exports_external.strictObject({ messageId: id, tag: exports_external.string() })),
22352
+ participantCounts: exports_external.array(exports_external.strictObject({ channelId: id, count: exports_external.number().int().nonnegative() }))
22353
+ }),
22354
+ page: exports_external.strictObject({ nextCursor: exports_external.string().nullable(), hasMore: exports_external.boolean() })
22355
+ });
22356
+ var CommunityReadAdvanceSchema = exports_external.strictObject({ ...envelope, changed: exports_external.boolean(), targetSeq: exports_external.number().int().nonnegative(), revision: exports_external.number().int().nonnegative() });
22357
+ var CommunityReadErrorSchema = exports_external.strictObject({ contractVersion: exports_external.literal(COMMUNITY_RESOURCE_CONTRACT_VERSION), error: exports_external.strictObject({
22358
+ code: exports_external.enum(["invalid_input", "invalid_reply_target", "unauthenticated", "not_found", "not_allowed", "blocked", "idempotency_conflict", "rate_limited", "temporarily_unavailable"]),
22359
+ message: exports_external.string(),
22360
+ retryable: exports_external.boolean()
22361
+ }) });
22362
+ var legacyProfileSchema = CommunityResourceProfileSchema.pick({
22363
+ id: true,
22364
+ name: true,
22365
+ avatar: true,
22366
+ avatarVersion: true
22367
+ }).extend({ discriminator: exports_external.string().nullable(), statusEmoji: exports_external.string().nullable(), statusText: exports_external.string() });
22368
+ var CommunityLegacyMessageResourceSchema = CommunityMessageResourceSchema.extend({ authorAvatar: exports_external.string().optional(), attachments: exports_external.array(CommunityLegacyMessageAttachmentSchema), thread: legacyMessageThreadSchema.optional() });
22369
+ var legacyEnvelope = { contractVersion: exports_external.literal(2), channelId: id };
22370
+ var legacyReadSchemas = {
22371
+ channel: CommunityChannelReadSchema.extend(legacyEnvelope),
22372
+ messages: CommunityMessagesReadSchema.extend({ ...legacyEnvelope, messages: exports_external.array(CommunityLegacyMessageResourceSchema) }),
22373
+ readState: CommunityReadStateReadSchema.extend(legacyEnvelope),
22374
+ members: CommunityMembersReadSchema.extend({ ...legacyEnvelope, profiles: exports_external.array(legacyProfileSchema) }),
22375
+ threads: CommunityThreadsReadSchema.extend({ ...legacyEnvelope, included: CommunityThreadsReadSchema.shape.included.extend({
22376
+ messages: exports_external.array(CommunityLegacyMessageResourceSchema),
22377
+ profiles: exports_external.array(legacyProfileSchema)
22378
+ }) }),
22379
+ readAdvance: CommunityReadAdvanceSchema.extend(legacyEnvelope),
22380
+ error: CommunityReadErrorSchema.extend({ contractVersion: exports_external.literal(2) })
22381
+ };
22382
+ var legacyChannelResourcePreviewSchema = CommunityChannelResourceSchema.partial().strip().extend({
22383
+ archived: legacyArchivedSchema.optional()
22384
+ });
22385
+ var legacyChannelResourceSchema = CommunityChannelResourceSchema.strip().extend({
22386
+ topic: CommunityChannelResourceSchema.shape.topic.nullish().transform((value) => value ?? ""),
22387
+ position: CommunityChannelResourceSchema.shape.position.nullish().transform((value) => value ?? 0),
22388
+ messageCount: CommunityChannelResourceSchema.shape.messageCount.nullish().transform((value) => value ?? 0),
22389
+ categoryId: nullableId.default(null),
22390
+ parentChannelId: nullableId.default(null),
22391
+ parentMessageId: nullableId.default(null),
22392
+ creatorId: nullableId.default(null),
22393
+ lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null),
22394
+ archived: legacyArchivedSchema
22395
+ });
22396
+ var legacyMessageResourceSchema = CommunityLegacyMessageResourceSchema.strip().extend({
22397
+ channelId: id.optional(),
22398
+ replyToId: nullableId.optional(),
22399
+ clientNonce: CommunityMessageResourceSchema.shape.clientNonce.default(null),
22400
+ attachments: CommunityLegacyMessageResourceSchema.shape.attachments.default([]),
22401
+ embeds: CommunityMessageResourceSchema.shape.embeds.nullable().transform((value) => value ?? undefined)
22402
+ });
22403
+
22404
+ // ../shared/src/community-attention.ts
22405
+ var id2 = exports_external.string().min(1);
22406
+ var AttentionScopeSchema = exports_external.strictObject({
22407
+ scopeId: id2,
22408
+ channelId: id2,
22409
+ serverId: id2.nullable().optional(),
22410
+ parentChannelId: id2.nullable().optional(),
22153
22411
  ordinaryUnread: exports_external.boolean(),
22154
22412
  lastUnreadSeq: exports_external.number().int().nonnegative(),
22155
22413
  lastAttentionSeq: exports_external.number().int().nonnegative().nullable().optional(),
22156
22414
  attentionCount: exports_external.number().int().nonnegative()
22157
22415
  });
22158
22416
  var AttentionItemSchema = exports_external.strictObject({
22159
- id,
22417
+ id: id2,
22160
22418
  kind: exports_external.enum(["mention", "reply", "friend_request", "forum_post"]),
22161
- sourceId: id,
22162
- scopeId: id.nullable().optional(),
22163
- messageId: id.nullable().optional(),
22164
- actorUserId: id.nullable().optional(),
22419
+ sourceId: id2,
22420
+ scopeId: id2.nullable().optional(),
22421
+ messageId: id2.nullable().optional(),
22422
+ actorUserId: id2.nullable().optional(),
22165
22423
  createdAt: exports_external.string(),
22166
- childChannelId: id.optional(),
22424
+ childChannelId: id2.optional(),
22167
22425
  openerSeq: exports_external.number().int().nonnegative().optional(),
22168
22426
  readTarget: exports_external.strictObject({
22169
- channelId: id,
22427
+ channelId: id2,
22170
22428
  seq: exports_external.number().int().nonnegative()
22171
22429
  }).optional()
22172
22430
  }).superRefine((item, ctx) => {
@@ -22196,26 +22454,30 @@ var AttentionItemSchema = exports_external.strictObject({
22196
22454
  }
22197
22455
  });
22198
22456
  var AttentionIncludedServerSchema = exports_external.strictObject({
22199
- id,
22457
+ id: id2,
22200
22458
  name: exports_external.string(),
22201
22459
  discriminator: exports_external.string()
22202
22460
  });
22203
- var AttentionIncludedChannelSchema = exports_external.strictObject({
22204
- id,
22205
- serverId: id,
22206
- name: exports_external.string(),
22207
- type: exports_external.enum(["text", "forum", "thread"]),
22208
- parentChannelId: id.nullable(),
22209
- parentMessageId: id.nullable(),
22210
- creatorId: id.nullable(),
22211
- archived: exports_external.boolean(),
22212
- lastMessageAt: exports_external.string().nullable(),
22461
+ var AttentionIncludedChannelSchema = CommunityChannelResourceSchema.pick({
22462
+ id: true,
22463
+ serverId: true,
22464
+ name: true,
22465
+ type: true,
22466
+ parentChannelId: true,
22467
+ parentMessageId: true,
22468
+ creatorId: true,
22469
+ archived: true,
22470
+ lastMessageAt: true
22471
+ }).extend({
22472
+ serverId: CommunityChannelResourceSchema.shape.serverId.unwrap(),
22473
+ name: CommunityChannelResourceSchema.shape.name.unwrap(),
22474
+ type: CommunityChannelResourceSchema.shape.type.extract(["text", "forum", "thread"]),
22213
22475
  openerSeq: exports_external.number().int().nonnegative().optional(),
22214
22476
  openerUnread: exports_external.boolean().optional()
22215
22477
  });
22216
22478
  var AttentionIncludedDmSchema = exports_external.strictObject({
22217
- id,
22218
- userId: id,
22479
+ id: id2,
22480
+ userId: id2,
22219
22481
  name: exports_external.string(),
22220
22482
  discriminator: exports_external.string(),
22221
22483
  avatar: exports_external.string(),
@@ -22224,22 +22486,21 @@ var AttentionIncludedDmSchema = exports_external.strictObject({
22224
22486
  lastUnreadSeq: exports_external.number().int().nonnegative()
22225
22487
  });
22226
22488
  var AttentionIncludedProfileSchema = exports_external.strictObject({
22227
- userId: id,
22228
- name: exports_external.string(),
22489
+ userId: CommunityResourceProfileSchema.shape.id,
22490
+ ...CommunityResourceProfileSchema.pick({ name: true, discriminator: true, avatar: true, avatarVersion: true }).shape,
22229
22491
  discriminator: exports_external.string(),
22230
- avatar: exports_external.string(),
22231
- avatarVersion: exports_external.number().int().nonnegative()
22232
- });
22233
- var AttentionIncludedMessageSchema = exports_external.strictObject({
22234
- id,
22235
- channelId: id,
22236
- type: exports_external.enum(["chat", "system"]),
22237
- authorId: id.optional(),
22238
- authorName: exports_external.string().optional(),
22239
- seq: exports_external.number().int().nonnegative(),
22240
- createdAt: exports_external.string(),
22241
- content: exports_external.string()
22492
+ avatar: exports_external.string()
22242
22493
  });
22494
+ var AttentionIncludedMessageSchema = CommunityMessagePreviewSchema.pick({
22495
+ id: true,
22496
+ channelId: true,
22497
+ type: true,
22498
+ authorId: true,
22499
+ authorName: true,
22500
+ seq: true,
22501
+ createdAt: true,
22502
+ content: true
22503
+ }).required({ channelId: true, seq: true, createdAt: true, content: true });
22243
22504
  var AttentionIncludedSchema = exports_external.strictObject({
22244
22505
  servers: exports_external.array(AttentionIncludedServerSchema),
22245
22506
  channels: exports_external.array(AttentionIncludedChannelSchema),
@@ -22265,7 +22526,7 @@ var AccountAttentionSnapshotSchema = exports_external.strictObject({
22265
22526
  const serverById = new Map(snapshot.included.servers.map((server) => [server.id, server]));
22266
22527
  const channelById = new Map(snapshot.included.channels.map((channel2) => [channel2.id, channel2]));
22267
22528
  const dmById = new Map(snapshot.included.dms.map((dm) => [dm.id, dm]));
22268
- const profileById = new Map(snapshot.included.profiles.map((profile) => [profile.userId, profile]));
22529
+ const profileById = new Map(snapshot.included.profiles.map((profile2) => [profile2.userId, profile2]));
22269
22530
  const messageById = new Map(snapshot.included.messages.map((message2) => [message2.id, message2]));
22270
22531
  const rejectDuplicates = (values, kind) => {
22271
22532
  const seen = new Set;
@@ -22278,7 +22539,7 @@ var AccountAttentionSnapshotSchema = exports_external.strictObject({
22278
22539
  rejectDuplicates(snapshot.included.servers.map((server) => server.id), "server");
22279
22540
  rejectDuplicates(snapshot.included.channels.map((channel2) => channel2.id), "channel");
22280
22541
  rejectDuplicates(snapshot.included.dms.map((dm) => dm.id), "dm");
22281
- rejectDuplicates(snapshot.included.profiles.map((profile) => profile.userId), "profile");
22542
+ rejectDuplicates(snapshot.included.profiles.map((profile2) => profile2.userId), "profile");
22282
22543
  rejectDuplicates(snapshot.included.messages.map((message2) => message2.id), "message");
22283
22544
  for (const scope of snapshot.scopes) {
22284
22545
  if (scope.serverId) {
@@ -23090,15 +23351,15 @@ var CommunityMachineRuntimeListSchema = exports_external.array(CommunityMachineR
23090
23351
  var CommunityRunningAgentListSchema = exports_external.array(exports_external.string()).transform((list) => {
23091
23352
  const seen = new Set;
23092
23353
  const out = [];
23093
- for (const id2 of list) {
23094
- if (seen.has(id2))
23354
+ for (const id3 of list) {
23355
+ if (seen.has(id3))
23095
23356
  continue;
23096
- seen.add(id2);
23097
- out.push(id2);
23357
+ seen.add(id3);
23358
+ out.push(id3);
23098
23359
  }
23099
23360
  return out;
23100
23361
  });
23101
- var CommunityMachineSummarySchema = exports_external.object({
23362
+ var CommunityMachineSummarySchema = exports_external.strictObject({
23102
23363
  id: exports_external.string(),
23103
23364
  hostname: exports_external.string(),
23104
23365
  displayName: exports_external.string(),
@@ -23108,8 +23369,8 @@ var CommunityMachineSummarySchema = exports_external.object({
23108
23369
  daemonVersion: exports_external.string(),
23109
23370
  lastSeenAt: exports_external.string().nullable(),
23110
23371
  status: exports_external.enum(["online", "offline"]),
23111
- availableRuntimes: exports_external.array(CommunityMachineRuntimeSchema).default([]),
23112
- lastRuntimeError: exports_external.object({
23372
+ availableRuntimes: exports_external.array(CommunityMachineRuntimeSchema.strict()),
23373
+ lastRuntimeError: exports_external.strictObject({
23113
23374
  requested: exports_external.string(),
23114
23375
  available: exports_external.array(exports_external.string()),
23115
23376
  at: exports_external.string()
@@ -23492,6 +23753,7 @@ __export(exports_community_schema, {
23492
23753
  communityMessageTag: () => communityMessageTag,
23493
23754
  communityMessageSeq: () => communityMessageSeq,
23494
23755
  communityMessageMark: () => communityMessageMark,
23756
+ communityMessageAttachment: () => communityMessageAttachment,
23495
23757
  communityMessage: () => communityMessage,
23496
23758
  communityMention: () => communityMention,
23497
23759
  communityFriendship: () => communityFriendship,
@@ -23667,11 +23929,7 @@ var communityReaction = sqliteTable("community_reaction", {
23667
23929
  ]);
23668
23930
  var communityAttachment = sqliteTable("community_attachment", {
23669
23931
  id: text("id").primaryKey().$defaultFn(() => nanoid3()),
23670
- messageId: text("message_id").references(() => communityMessage.id, {
23671
- onDelete: "cascade"
23672
- }),
23673
23932
  uploaderId: text("uploader_id").notNull(),
23674
- targetId: text("target_id").notNull(),
23675
23933
  r2Key: text("r2_key").notNull(),
23676
23934
  thumbnailR2Key: text("thumbnail_r2_key"),
23677
23935
  filename: text("filename").notNull(),
@@ -23679,10 +23937,20 @@ var communityAttachment = sqliteTable("community_attachment", {
23679
23937
  size: integer2("size"),
23680
23938
  width: integer2("width"),
23681
23939
  height: integer2("height"),
23682
- position: integer2("position"),
23683
23940
  createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
23684
23941
  }, (t) => [
23685
- index("idx_attachment_message").on(t.messageId, t.position)
23942
+ index("idx_attachment_uploader").on(t.uploaderId),
23943
+ index("idx_attachment_r2_key").on(t.r2Key),
23944
+ index("idx_attachment_thumbnail_r2_key").on(t.thumbnailR2Key)
23945
+ ]);
23946
+ var communityMessageAttachment = sqliteTable("community_message_attachment", {
23947
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
23948
+ attachmentId: text("attachment_id").notNull().references(() => communityAttachment.id, { onDelete: "restrict" }),
23949
+ position: integer2("position").notNull()
23950
+ }, (t) => [
23951
+ primaryKey({ columns: [t.messageId, t.attachmentId] }),
23952
+ unique("uq_message_attachment_position").on(t.messageId, t.position),
23953
+ index("idx_message_attachment_file").on(t.attachmentId, t.messageId)
23686
23954
  ]);
23687
23955
  var communityPin = sqliteTable("community_pin", {
23688
23956
  id: text("id").primaryKey().$defaultFn(() => nanoid3()),
@@ -23804,6 +24072,41 @@ var communityMessageTag = sqliteTable("community_message_tag", {
23804
24072
  index("idx_message_tag_tag").on(t.tag, t.messageId)
23805
24073
  ]);
23806
24074
 
24075
+ // ../shared/src/db/queries/_chunk.ts
24076
+ var D1_MAX_BIND_PARAMS = 100;
24077
+ function maxInParams(fixedParams) {
24078
+ if (!Number.isInteger(fixedParams) || fixedParams < 0) {
24079
+ throw new Error("fixed params must be a non-negative integer");
24080
+ }
24081
+ if (fixedParams >= D1_MAX_BIND_PARAMS) {
24082
+ throw new Error("fixed params must leave room for at least one IN parameter");
24083
+ }
24084
+ return D1_MAX_BIND_PARAMS - fixedParams;
24085
+ }
24086
+ function maxRowsPerInsert(paramsPerRow) {
24087
+ if (paramsPerRow < 1)
24088
+ throw new Error("paramsPerRow must be >= 1");
24089
+ return Math.floor(D1_MAX_BIND_PARAMS / paramsPerRow);
24090
+ }
24091
+
24092
+ // ../shared/src/db/queries/community/channel.ts
24093
+ var CHANNEL_COLUMNS = {
24094
+ id: communityChannel.id,
24095
+ serverId: communityChannel.serverId,
24096
+ categoryId: communityChannel.categoryId,
24097
+ name: communityChannel.name,
24098
+ type: communityChannel.type,
24099
+ topic: communityChannel.topic,
24100
+ position: communityChannel.position,
24101
+ parentChannelId: communityChannel.parentChannelId,
24102
+ creatorId: communityChannel.creatorId,
24103
+ messageCount: communityChannel.messageCount,
24104
+ archived: communityChannel.archived,
24105
+ parentMessageId: communityChannel.parentMessageId,
24106
+ lastMessageAt: communityChannel.lastMessageAt,
24107
+ createdAt: communityChannel.createdAt
24108
+ };
24109
+
23807
24110
  // ../shared/src/logger.ts
23808
24111
  var LEVELS = {
23809
24112
  debug: 0,
@@ -23884,23 +24187,6 @@ function createLogger(opts) {
23884
24187
  return new Logger(opts);
23885
24188
  }
23886
24189
 
23887
- // ../shared/src/db/queries/_chunk.ts
23888
- var D1_MAX_BIND_PARAMS = 100;
23889
- function maxInParams(fixedParams) {
23890
- if (!Number.isInteger(fixedParams) || fixedParams < 0) {
23891
- throw new Error("fixed params must be a non-negative integer");
23892
- }
23893
- if (fixedParams >= D1_MAX_BIND_PARAMS) {
23894
- throw new Error("fixed params must leave room for at least one IN parameter");
23895
- }
23896
- return D1_MAX_BIND_PARAMS - fixedParams;
23897
- }
23898
- function maxRowsPerInsert(paramsPerRow) {
23899
- if (paramsPerRow < 1)
23900
- throw new Error("paramsPerRow must be >= 1");
23901
- return Math.floor(D1_MAX_BIND_PARAMS / paramsPerRow);
23902
- }
23903
-
23904
24190
  // ../shared/src/db/queries/community/message.ts
23905
24191
  var log = createLogger({ service: "community-queries" });
23906
24192
  var messageProjection = {
@@ -23999,24 +24285,6 @@ var userProductPlan = sqliteTable("user_product_plan", {
23999
24285
  updatedAt: text("updated_at").notNull().$defaultFn(() => new Date().toISOString())
24000
24286
  }, (t) => [index("idx_user_product_plan_plan").on(t.planId)]);
24001
24287
 
24002
- // ../shared/src/db/queries/community/channel.ts
24003
- var CHANNEL_COLUMNS = {
24004
- id: communityChannel.id,
24005
- serverId: communityChannel.serverId,
24006
- categoryId: communityChannel.categoryId,
24007
- name: communityChannel.name,
24008
- type: communityChannel.type,
24009
- topic: communityChannel.topic,
24010
- position: communityChannel.position,
24011
- parentChannelId: communityChannel.parentChannelId,
24012
- creatorId: communityChannel.creatorId,
24013
- messageCount: communityChannel.messageCount,
24014
- archived: communityChannel.archived,
24015
- parentMessageId: communityChannel.parentMessageId,
24016
- lastMessageAt: communityChannel.lastMessageAt,
24017
- createdAt: communityChannel.createdAt
24018
- };
24019
-
24020
24288
  // ../shared/src/db/queries/community/thread.ts
24021
24289
  var NOTIFY_CONFLICT_TARGET = [
24022
24290
  communityChannelMember.channelId,
@@ -24042,203 +24310,6 @@ var AGENT_UNREAD_CHANNEL_CHUNK_SIZE = maxInParams(13);
24042
24310
 
24043
24311
  // ../shared/src/db/queries/community/mention.ts
24044
24312
  var MENTION_INSERT_MAX_ROWS = maxRowsPerInsert(5);
24045
- // ../shared/src/community-friend-approval.ts
24046
- var profile = exports_external.strictObject({
24047
- id: exports_external.string(),
24048
- name: exports_external.string(),
24049
- discriminator: exports_external.string(),
24050
- image: exports_external.string().nullable(),
24051
- avatarVersion: exports_external.number().int().nonnegative()
24052
- });
24053
- var FriendApprovalPayloadSchema = exports_external.strictObject({
24054
- friendshipId: exports_external.string(),
24055
- status: exports_external.enum(["pending", "approved", "denied", "superseded", "cancelled"]),
24056
- waitingOn: exports_external.enum(["you", "other-owner", "addressee"]).nullable(),
24057
- otherProfile: profile,
24058
- botProfile: profile,
24059
- waitingOnProfile: profile.nullable().optional()
24060
- });
24061
-
24062
- // ../shared/src/community-contract.ts
24063
- var COMMUNITY_CONTRACT_VERSION = 2;
24064
-
24065
- // ../shared/src/community-resources.ts
24066
- var id2 = exports_external.string().min(1);
24067
- var nullableId = id2.nullable();
24068
- var legacyArchivedSchema = exports_external.union([exports_external.boolean(), exports_external.literal(0), exports_external.literal(1)]).transform((value) => value === true || value === 1);
24069
- var CommunityChannelResourceSchema = exports_external.strictObject({
24070
- id: id2,
24071
- type: exports_external.enum(["text", "forum", "thread", "dm"]),
24072
- serverId: nullableId,
24073
- categoryId: nullableId,
24074
- name: exports_external.string().nullable(),
24075
- topic: exports_external.string(),
24076
- parentChannelId: nullableId,
24077
- parentMessageId: nullableId,
24078
- creatorId: nullableId,
24079
- position: exports_external.number(),
24080
- archived: exports_external.boolean(),
24081
- createdAt: exports_external.string(),
24082
- lastMessageAt: exports_external.string().nullable(),
24083
- messageCount: exports_external.number().int().nonnegative()
24084
- });
24085
- var CommunityChannelIdentitySchema = CommunityChannelResourceSchema.pick({
24086
- id: true,
24087
- type: true,
24088
- serverId: true,
24089
- name: true,
24090
- parentChannelId: true,
24091
- parentMessageId: true,
24092
- creatorId: true,
24093
- archived: true,
24094
- lastMessageAt: true,
24095
- createdAt: true
24096
- }).partial({ createdAt: true }).strip();
24097
- var legacyChannelIdentitySchema = CommunityChannelIdentitySchema.extend({
24098
- archived: legacyArchivedSchema,
24099
- parentChannelId: nullableId.default(null),
24100
- parentMessageId: nullableId.default(null),
24101
- creatorId: nullableId.default(null),
24102
- lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null)
24103
- });
24104
- var CommunityAccessDecisionSchema = exports_external.strictObject({
24105
- channelId: id2,
24106
- canRead: exports_external.boolean(),
24107
- canSend: exports_external.boolean(),
24108
- canCreateDiscussion: exports_external.boolean()
24109
- });
24110
- var CommunityMessageAttachmentSchema = exports_external.strictObject({
24111
- kind: exports_external.enum(["image", "file"]),
24112
- name: exports_external.string(),
24113
- url: exports_external.string(),
24114
- thumbnailUrl: exports_external.string().optional(),
24115
- contentType: exports_external.string().optional(),
24116
- size: exports_external.string().optional(),
24117
- sizeBytes: exports_external.number().nonnegative().optional(),
24118
- width: exports_external.number().nonnegative().optional(),
24119
- height: exports_external.number().nonnegative().optional()
24120
- });
24121
- var CommunityMessageResourceSchema = exports_external.strictObject({
24122
- id: id2,
24123
- channelId: id2,
24124
- seq: exports_external.number().int().nonnegative(),
24125
- authorId: id2,
24126
- createdAt: exports_external.string(),
24127
- type: exports_external.enum(["chat", "system"]),
24128
- content: exports_external.string(),
24129
- replyToId: nullableId,
24130
- clientNonce: exports_external.string().nullable(),
24131
- attachments: exports_external.array(CommunityMessageAttachmentSchema),
24132
- systemKind: exports_external.literal("thread").optional(),
24133
- authorName: exports_external.string().optional(),
24134
- authorAvatar: exports_external.string().optional(),
24135
- authorAvatarVersion: exports_external.number().int().nonnegative().optional(),
24136
- mentionType: exports_external.literal("everyone").nullable().optional(),
24137
- replyTo: exports_external.strictObject({
24138
- id: id2,
24139
- authorId: id2.optional(),
24140
- authorName: exports_external.string(),
24141
- text: exports_external.string(),
24142
- deleted: exports_external.boolean().optional()
24143
- }).optional(),
24144
- embeds: exports_external.array(exports_external.unknown()).optional(),
24145
- reactions: exports_external.array(exports_external.strictObject({
24146
- emoji: exports_external.string(),
24147
- count: exports_external.number().int().nonnegative(),
24148
- me: exports_external.boolean(),
24149
- userIds: exports_external.array(id2)
24150
- })).optional(),
24151
- thread: exports_external.strictObject({
24152
- id: id2,
24153
- name: exports_external.string(),
24154
- messageCount: exports_external.number().int().nonnegative(),
24155
- lastReplyAt: exports_external.string().optional(),
24156
- tags: exports_external.array(exports_external.string()).optional(),
24157
- preview: exports_external.string().optional(),
24158
- participants: exports_external.array(exports_external.strictObject({ id: id2, name: exports_external.string(), avatar: exports_external.string(), avatarVersion: exports_external.number().int().nonnegative() })).optional(),
24159
- participantCount: exports_external.number().int().nonnegative().optional()
24160
- }).optional(),
24161
- approval: FriendApprovalPayloadSchema.optional()
24162
- });
24163
- var CommunityReadStateResourceSchema = exports_external.strictObject({
24164
- channelId: id2,
24165
- lastReadMessageId: nullableId,
24166
- lastReadAt: exports_external.string().nullable(),
24167
- lastReadSeq: exports_external.number().int().nonnegative()
24168
- });
24169
- var CommunityMemberRelationSchema = exports_external.strictObject({
24170
- channelId: id2,
24171
- userId: id2,
24172
- relation: exports_external.enum(["access", "notify"]),
24173
- source: exports_external.string(),
24174
- isCreator: exports_external.boolean(),
24175
- role: exports_external.string().nullable(),
24176
- memberId: nullableId
24177
- });
24178
- var CommunityResourceProfileSchema = exports_external.strictObject({
24179
- id: id2,
24180
- name: exports_external.string(),
24181
- discriminator: exports_external.string().nullable(),
24182
- avatar: exports_external.string().nullable(),
24183
- avatarVersion: exports_external.number().int().nonnegative(),
24184
- statusEmoji: exports_external.string().nullable(),
24185
- statusText: exports_external.string()
24186
- });
24187
- var CommunityPageSchema = exports_external.strictObject({
24188
- olderCursor: exports_external.string().nullable(),
24189
- newerCursor: exports_external.string().nullable(),
24190
- hasMoreOlder: exports_external.boolean(),
24191
- hasMoreNewer: exports_external.boolean(),
24192
- latestSeq: exports_external.number().int().nonnegative()
24193
- });
24194
- var envelope = { contractVersion: exports_external.literal(COMMUNITY_CONTRACT_VERSION), channelId: id2 };
24195
- var CommunityChannelReadSchema = exports_external.strictObject({ ...envelope, channel: CommunityChannelResourceSchema, access: CommunityAccessDecisionSchema });
24196
- var CommunityMessagesReadSchema = exports_external.strictObject({
24197
- ...envelope,
24198
- messages: exports_external.array(CommunityMessageResourceSchema),
24199
- page: CommunityPageSchema,
24200
- surfaceReceipt: exports_external.strictObject({ channelId: id2, surfaceKind: exports_external.enum(["channel", "forum", "thread", "dm"]) })
24201
- });
24202
- var CommunityReadStateReadSchema = exports_external.strictObject({ ...envelope, readState: CommunityReadStateResourceSchema });
24203
- var CommunityMembersReadSchema = exports_external.strictObject({ ...envelope, relation: exports_external.enum(["access", "notify"]), members: exports_external.array(CommunityMemberRelationSchema), profiles: exports_external.array(CommunityResourceProfileSchema) });
24204
- var CommunityThreadsReadSchema = exports_external.strictObject({
24205
- ...envelope,
24206
- channel: CommunityChannelResourceSchema,
24207
- threads: exports_external.array(CommunityChannelResourceSchema),
24208
- included: exports_external.strictObject({
24209
- messages: exports_external.array(CommunityMessageResourceSchema),
24210
- members: exports_external.array(CommunityMemberRelationSchema),
24211
- profiles: exports_external.array(CommunityResourceProfileSchema),
24212
- tags: exports_external.array(exports_external.strictObject({ messageId: id2, tag: exports_external.string() })),
24213
- participantCounts: exports_external.array(exports_external.strictObject({ channelId: id2, count: exports_external.number().int().nonnegative() }))
24214
- }),
24215
- page: exports_external.strictObject({ nextCursor: exports_external.string().nullable(), hasMore: exports_external.boolean() })
24216
- });
24217
- var CommunityReadAdvanceSchema = exports_external.strictObject({ ...envelope, changed: exports_external.boolean(), targetSeq: exports_external.number().int().nonnegative(), revision: exports_external.number().int().nonnegative() });
24218
- var CommunityReadErrorSchema = exports_external.strictObject({ contractVersion: exports_external.literal(COMMUNITY_CONTRACT_VERSION), error: exports_external.strictObject({
24219
- code: exports_external.enum(["invalid_input", "invalid_reply_target", "unauthenticated", "not_found", "not_allowed", "blocked", "idempotency_conflict", "rate_limited", "temporarily_unavailable"]),
24220
- message: exports_external.string(),
24221
- retryable: exports_external.boolean()
24222
- }) });
24223
- var legacyChannelResourceSchema = CommunityChannelResourceSchema.strip().extend({
24224
- topic: CommunityChannelResourceSchema.shape.topic.nullish().transform((value) => value ?? ""),
24225
- position: CommunityChannelResourceSchema.shape.position.nullish().transform((value) => value ?? 0),
24226
- messageCount: CommunityChannelResourceSchema.shape.messageCount.nullish().transform((value) => value ?? 0),
24227
- categoryId: nullableId.default(null),
24228
- parentChannelId: nullableId.default(null),
24229
- parentMessageId: nullableId.default(null),
24230
- creatorId: nullableId.default(null),
24231
- lastMessageAt: CommunityChannelResourceSchema.shape.lastMessageAt.default(null),
24232
- archived: legacyArchivedSchema
24233
- });
24234
- var legacyMessageResourceSchema = CommunityMessageResourceSchema.strip().extend({
24235
- channelId: id2.optional(),
24236
- replyToId: nullableId.optional(),
24237
- clientNonce: CommunityMessageResourceSchema.shape.clientNonce.default(null),
24238
- attachments: CommunityMessageResourceSchema.shape.attachments.default([]),
24239
- embeds: CommunityMessageResourceSchema.shape.embeds.nullable().transform((value) => value ?? undefined)
24240
- });
24241
-
24242
24313
  // ../shared/src/community-ws-events.ts
24243
24314
  var string4 = exports_external.string();
24244
24315
  var nullableString = string4.nullable();
@@ -24268,6 +24339,7 @@ var messageSchema = CommunityMessageResourceSchema.pick({
24268
24339
  seq: exports_external.number(),
24269
24340
  authorId: string4,
24270
24341
  authorName: string4,
24342
+ authorAvatar: string4.optional(),
24271
24343
  authorAvatarVersion: CommunityMessageResourceSchema.shape.authorAvatarVersion.unwrap(),
24272
24344
  replyToId: nullableString.optional(),
24273
24345
  replyTo: CommunityMessageResourceSchema.shape.replyTo.unwrap().extend({
@@ -24277,7 +24349,7 @@ var messageSchema = CommunityMessageResourceSchema.pick({
24277
24349
  attachments: exports_external.array(messageAttachmentSchema).optional(),
24278
24350
  clientNonce: string4.optional()
24279
24351
  });
24280
- var communityMessageCreateSchema = exports_external.strictObject({
24352
+ var CommunityLegacyMessageCreateSchema = exports_external.strictObject({
24281
24353
  type: exports_external.literal("community:message.create"),
24282
24354
  channelId: string4,
24283
24355
  serverId: string4.optional(),
@@ -24589,29 +24661,9 @@ var communityProfileUpdateSchema = exports_external.strictObject({
24589
24661
  kind: exports_external.enum(["human", "bot"]),
24590
24662
  ownerUserId: nullableString
24591
24663
  });
24592
- var machineRuntimeSchema = CommunityMachineRuntimeSchema.strict();
24593
- var CommunityMachineSummarySchema2 = exports_external.strictObject({
24594
- id: string4,
24595
- hostname: string4,
24596
- displayName: string4,
24597
- platform: string4,
24598
- arch: string4,
24599
- osRelease: string4,
24600
- daemonVersion: string4,
24601
- lastSeenAt: nullableString,
24602
- status: exports_external.enum(["online", "offline"]),
24603
- availableRuntimes: exports_external.array(machineRuntimeSchema),
24604
- lastRuntimeError: exports_external.strictObject({
24605
- requested: string4,
24606
- available: exports_external.array(string4),
24607
- at: string4
24608
- }).optional(),
24609
- createdAt: string4,
24610
- updatedAt: string4
24611
- });
24612
24664
  var communityMachineCreatedSchema = exports_external.strictObject({
24613
24665
  type: exports_external.literal("community:machine.created"),
24614
- machine: CommunityMachineSummarySchema2,
24666
+ machine: CommunityMachineSummarySchema,
24615
24667
  tokenId: string4
24616
24668
  });
24617
24669
  var communityMachineStatusSchema = exports_external.strictObject({
@@ -24622,7 +24674,7 @@ var communityMachineStatusSchema = exports_external.strictObject({
24622
24674
  });
24623
24675
  var communityMachineUpdatedSchema = exports_external.strictObject({
24624
24676
  type: exports_external.literal("community:machine.updated"),
24625
- machine: CommunityMachineSummarySchema2
24677
+ machine: CommunityMachineSummarySchema
24626
24678
  });
24627
24679
  var communityMachineRemovedSchema = exports_external.strictObject({
24628
24680
  type: exports_external.literal("community:machine.removed"),
@@ -24638,8 +24690,7 @@ var communityBotAuditEventSchema = exports_external.strictObject({
24638
24690
  launchId: nullableString.optional(),
24639
24691
  createdAt: string4
24640
24692
  }).refine((event) => Object.prototype.hasOwnProperty.call(event, "payload"));
24641
- var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
24642
- communityMessageCreateSchema,
24693
+ var commonCommunityEventSchemas = [
24643
24694
  communityMessageUpdatedSchema,
24644
24695
  communityMessageEditedSchema,
24645
24696
  communityReactionAddSchema,
@@ -24648,12 +24699,8 @@ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("t
24648
24699
  communityPinRemoveSchema,
24649
24700
  communityTypingStartSchema,
24650
24701
  communityTypingStopSchema,
24651
- communityChildChannelCreateSchema,
24652
- communityChildChannelUpdateSchema,
24653
24702
  communityServerUpdateSchema,
24654
24703
  communityServerDeleteSchema,
24655
- communityChannelCreateSchema,
24656
- communityChannelUpdateSchema,
24657
24704
  communityChannelDeleteSchema,
24658
24705
  communityChannelReorderSchema,
24659
24706
  communityChannelMemberAddSchema,
@@ -24678,15 +24725,34 @@ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("t
24678
24725
  communityInboxChangedSchema,
24679
24726
  communityPresenceUpdateSchema,
24680
24727
  communityStatusUpdateSchema,
24681
- communityIdentityUpdateSchema,
24682
- communityProfileUpdateSchema,
24683
24728
  communityMachineCreatedSchema,
24684
24729
  communityMachineStatusSchema,
24685
24730
  communityMachineUpdatedSchema,
24686
24731
  communityMachineRemovedSchema,
24687
24732
  communityBotAuditEventSchema
24733
+ ];
24734
+ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
24735
+ ...commonCommunityEventSchemas,
24736
+ CommunityLegacyMessageCreateSchema,
24737
+ communityChildChannelCreateSchema,
24738
+ communityChannelCreateSchema,
24739
+ communityChildChannelUpdateSchema,
24740
+ communityChannelUpdateSchema,
24741
+ communityIdentityUpdateSchema,
24742
+ communityProfileUpdateSchema
24743
+ ]);
24744
+ var CommunityResourceWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
24745
+ ...commonCommunityEventSchemas,
24746
+ CommunityLegacyMessageCreateSchema.extend({ message: CommunityMessageResourceSchema.required({ authorName: true, authorAvatarVersion: true }) }).refine((event) => event.message.channelId === event.channelId),
24747
+ 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)),
24748
+ communityChannelCreateSchema.extend({ channel: CommunityChannelResourceSchema.extend({ type: channelTypeSchema }) }).refine((event) => event.channel.serverId === event.serverId),
24749
+ communityChildChannelUpdateSchema.extend({ changes: CommunityChannelResourceSchema.pick({ name: true, archived: true, lastMessageAt: true, messageCount: true }).partial().extend({ tags: exports_external.array(string4).nullable().optional() }) }),
24750
+ communityChannelUpdateSchema.extend({ changes: CommunityChannelResourceSchema.pick({ name: true, topic: true, categoryId: true, type: true }).partial().extend({ type: channelTypeSchema.optional() }) }),
24751
+ communityIdentityUpdateSchema.extend({ avatar: CommunityResourceProfileSchema.shape.avatar, avatarVersion: CommunityResourceProfileSchema.shape.avatarVersion.refine((version3) => version3 > 0) }),
24752
+ 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 })
24688
24753
  ]);
24689
24754
  var CommunityWsEventSchema = CommunityWsEventDiscriminatedSchema.transform((event) => event);
24755
+ var CommunityResourceWsEventSchema = CommunityResourceWsEventDiscriminatedSchema.transform((event) => event);
24690
24756
  var WS_EVENTS = {
24691
24757
  MESSAGE_CREATE: "community:message.create",
24692
24758
  MESSAGE_UPDATED: "community:message.updated",
@@ -24770,6 +24836,7 @@ var memberAddedSchema = exports_external.strictObject({
24770
24836
  channelId: exports_external.string().min(1)
24771
24837
  });
24772
24838
  var batchShape = exports_external.strictObject({
24839
+ communityContract: exports_external.literal(3).optional(),
24773
24840
  messageId: exports_external.string().min(1),
24774
24841
  messageEvent: exports_external.unknown(),
24775
24842
  contentUserIds: targetList,
@@ -24886,8 +24953,46 @@ var communityFunnelAnalyticsEvent = sqliteTable("community_funnel_analytics_even
24886
24953
  index("idx_community_funnel_analytics_owner_claimed_created").on(t.ownerUserId, t.claimedAt, t.createdAt)
24887
24954
  ]);
24888
24955
 
24956
+ // ../shared/src/db/product-analytics-schema.ts
24957
+ var exports_product_analytics_schema = {};
24958
+ __export(exports_product_analytics_schema, {
24959
+ productAnalyticsEvent: () => productAnalyticsEvent,
24960
+ PRODUCT_ANALYTICS_EVENTS: () => PRODUCT_ANALYTICS_EVENTS
24961
+ });
24962
+ var PRODUCT_ANALYTICS_EVENTS = [
24963
+ "landing_cta_clicked",
24964
+ "login_page_view",
24965
+ "sign_up",
24966
+ "sign_in_success",
24967
+ "sign_in_failed",
24968
+ "onboarding_enter_clicked",
24969
+ "onboarding_first_message",
24970
+ "invitation_link_visit"
24971
+ ];
24972
+ var productAnalyticsEvent = sqliteTable("product_analytics_event", {
24973
+ id: text("id").primaryKey(),
24974
+ eventName: text("event_name").notNull().$type(),
24975
+ actorUserId: text("actor_user_id").references(() => user.id, { onDelete: "cascade" }),
24976
+ serverId: text("server_id").references(() => communityServer.id, { onDelete: "cascade" }),
24977
+ sourceId: text("source_id"),
24978
+ dedupeKey: text("dedupe_key").notNull(),
24979
+ clientId: text("client_id").notNull(),
24980
+ sessionId: text("session_id").notNull(),
24981
+ method: text("method"),
24982
+ accountKind: text("account_kind").$type(),
24983
+ ctaName: text("cta_name"),
24984
+ failureStage: text("failure_stage").$type(),
24985
+ createdAt: text("created_at").notNull(),
24986
+ deliveryStatus: text("delivery_status").notNull().default("pending").$type(),
24987
+ deliveryReason: text("delivery_reason"),
24988
+ attemptedAt: text("attempted_at")
24989
+ }, (t) => [
24990
+ uniqueIndex("uq_product_analytics_dedupe").on(t.dedupeKey),
24991
+ index("idx_product_analytics_actor_server_event").on(t.actorUserId, t.serverId, t.eventName)
24992
+ ]);
24993
+
24889
24994
  // ../shared/src/db/index.ts
24890
- var allSchema = { ...exports_schema, ...exports_community_schema, ...exports_community_machine_schema, ...exports_product_plan_schema, ...exports_billing_schema, ...exports_community_funnel_analytics_schema };
24995
+ 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 };
24891
24996
  // ../shared/src/community-server-rail.ts
24892
24997
  var MAX_SERVER_RAIL_COMMANDS = 3;
24893
24998
  var idSchema = exports_external.string().trim().min(1);
@@ -25170,7 +25275,8 @@ function createProxyServerApi(config2) {
25170
25275
  form.append("width", String(req.width));
25171
25276
  if (req.height !== undefined)
25172
25277
  form.append("height", String(req.height));
25173
- const url2 = `${base}/api/community/channels/${REF_PLACEHOLDER_ID}/attachments?target=${encodeURIComponent(req.target)}`;
25278
+ const query = req.target === undefined ? "" : `?target=${encodeURIComponent(req.target)}`;
25279
+ const url2 = `${base}/api/community/channels/${REF_PLACEHOLDER_ID}/attachments${query}`;
25174
25280
  const res = await fetchImpl(url2, {
25175
25281
  method: "POST",
25176
25282
  headers: { authorization: `Bearer ${config2.voucher}` },
@@ -38494,9 +38600,9 @@ function cliCommandsSection() {
38494
38600
  "### Messaging",
38495
38601
  "",
38496
38602
  `1. \`${CLI} inbox pull\` — fetch unread messages and advance their read waterlines.`,
38497
- `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\`.`,
38498
- `3. \`${CLI} message attachment upload --target <ref> --file <path>\` — upload a file; ` + `returns an id stable across pending→persisted.`,
38499
- `4. \`${CLI} message attachment download --id <id> [--out <path>]\` — download any ` + `attachment you can see (or your own pending uploads).`,
38603
+ `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\`.`,
38604
+ `3. \`${CLI} message attachment upload --file <path>\` — upload a local file and get a reusable attachment ID.`,
38605
+ `4. \`${CLI} message attachment download --id <id> [--out <path>]\` — download an attachment you can read, including your own unsent uploads.`,
38500
38606
  `5. \`${CLI} message property set --target <full-message-ref> --json <json>\` — add a supported property value to a message.`,
38501
38607
  `6. \`${CLI} message property list --target <full-message-ref>\` — list the message's current properties and supported capabilities.`,
38502
38608
  `7. \`${CLI} message property remove --target <full-message-ref> --json <json>\` — remove a supported property value from a message.`,
@@ -38557,7 +38663,8 @@ function messagingSection() {
38557
38663
  "#### Sending mechanics",
38558
38664
  "",
38559
38665
  `- Send body: use \`${CLI} message send --target <ref> --remind-after T --stdin\` with the ` + "quoted-heredoc form under *Message formatting*.",
38560
- `- 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.",
38666
+ `- Long detail: upload it with \`${CLI} message attachment upload --file <path>.md\`; ` + "add the returned id as `--attachment <id>` on the short stdin send.",
38667
+ "- 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.",
38561
38668
  `- Cite a specific message: add \`--reply "#37"\` — \`--reply\` takes the \`#N\` seq ` + "(within `--target`) of the message you're answering.",
38562
38669
  "",
38563
38670
  "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.",
@@ -38673,7 +38780,19 @@ function utilsSection() {
38673
38780
  "",
38674
38781
  "### Join a new server",
38675
38782
  "",
38676
- `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."
38783
+ `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.",
38784
+ "",
38785
+ "### Answer questions about Alook itself",
38786
+ "",
38787
+ "Alook frontend source code: https://github.com/alookai/alook/tree/main/src/web/src",
38788
+ "",
38789
+ "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.",
38790
+ "",
38791
+ "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.",
38792
+ "",
38793
+ 'Bad: "Click thisReactButton, on the same layer as serverRailContainer."',
38794
+ "",
38795
+ '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."'
38677
38796
  ].join(`
38678
38797
  `);
38679
38798
  }
@@ -47007,8 +47126,6 @@ async function cmdAttachmentUpload(opts) {
47007
47126
  const agent2 = agentId(opts);
47008
47127
  const target2 = opts.target;
47009
47128
  const filePath = opts.file;
47010
- if (!target2)
47011
- throw new CliError("message attachment upload: --target <ref> is required");
47012
47129
  if (!filePath)
47013
47130
  throw new CliError("message attachment upload: --file <path> is required");
47014
47131
  const fs13 = await import("fs/promises");
@@ -47045,7 +47162,7 @@ async function cmdAttachmentUpload(opts) {
47045
47162
  }
47046
47163
  const result = await api2.attachmentUpload({
47047
47164
  agentId: agent2,
47048
- target: target2,
47165
+ ...target2 !== undefined ? { target: target2 } : {},
47049
47166
  file: { data: new Uint8Array(bytes), filename, contentType },
47050
47167
  ...thumbnail ? { thumbnail } : {},
47051
47168
  ...width !== undefined ? { width } : {},
@@ -47329,7 +47446,7 @@ function buildProgram(stdin) {
47329
47446
  });
47330
47447
  const attachment = message2.command("attachment").description("attachment operations").exitOverride();
47331
47448
  attachment.configureOutput({ writeOut: () => {}, writeErr: () => {} });
47332
- attachment.command("upload").description("upload a local file as a pending attachment for a future send").option("--target <ref>", "destination (channel, DM, or thread ref)").option("--file <path>", "local file to upload").exitOverride().configureOutput({ writeOut: () => {}, writeErr: () => {} }).action(async function() {
47449
+ attachment.command("upload").description("upload a local file and get its reusable attachment id").option("--target <ref>", "optional legacy target (channel, DM, or thread ref)").option("--file <path>", "local file to upload").exitOverride().configureOutput({ writeOut: () => {}, writeErr: () => {} }).action(async function() {
47333
47450
  const localOpts = this.opts();
47334
47451
  const globalOpts = program.opts();
47335
47452
  const result = await cmdAttachmentUpload({ ...globalOpts, ...localOpts });