@alook/daemon 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -12,6 +12,85 @@ var __export = (target, all) => {
12
12
  set: __exportSetter.bind(all, name)
13
13
  });
14
14
  };
15
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
16
+
17
+ // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/url-alphabet/index.js
18
+ var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
19
+
20
+ // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
21
+ import { webcrypto as crypto2 } from "node:crypto";
22
+ function fillPool(bytes) {
23
+ if (bytes < 0)
24
+ throw new RangeError("Wrong ID size");
25
+ try {
26
+ if (!pool || pool.length < bytes) {
27
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
28
+ crypto2.getRandomValues(pool);
29
+ poolOffset = 0;
30
+ } else if (poolOffset + bytes > pool.length) {
31
+ crypto2.getRandomValues(pool);
32
+ poolOffset = 0;
33
+ }
34
+ } catch (e) {
35
+ pool = undefined;
36
+ throw e;
37
+ }
38
+ poolOffset += bytes;
39
+ }
40
+ function random(bytes) {
41
+ fillPool(bytes |= 0);
42
+ return pool.subarray(poolOffset - bytes, poolOffset);
43
+ }
44
+ function customRandom(alphabet, defaultSize, getRandom) {
45
+ let safeByteCutoff = 256 - 256 % alphabet.length;
46
+ if (safeByteCutoff === 256) {
47
+ let mask = alphabet.length - 1;
48
+ return (size = defaultSize) => {
49
+ if (!size)
50
+ return "";
51
+ let id = "";
52
+ while (true) {
53
+ let bytes = getRandom(size);
54
+ let i = size;
55
+ while (i--) {
56
+ id += alphabet[bytes[i] & mask];
57
+ if (id.length >= size)
58
+ return id;
59
+ }
60
+ }
61
+ };
62
+ }
63
+ let step = Math.ceil(1.6 * 256 * defaultSize / safeByteCutoff);
64
+ return (size = defaultSize) => {
65
+ if (!size)
66
+ return "";
67
+ let id = "";
68
+ while (true) {
69
+ let bytes = getRandom(step);
70
+ let i = step;
71
+ while (i--) {
72
+ if (bytes[i] < safeByteCutoff) {
73
+ id += alphabet[bytes[i] % alphabet.length];
74
+ if (id.length >= size)
75
+ return id;
76
+ }
77
+ }
78
+ }
79
+ };
80
+ }
81
+ function customAlphabet(alphabet, size = 21) {
82
+ return customRandom(alphabet, size, random);
83
+ }
84
+ function nanoid3(size = 21) {
85
+ fillPool(size |= 0);
86
+ let id = "";
87
+ for (let i = poolOffset - size;i < poolOffset; i++) {
88
+ id += urlAlphabet[pool[i] & 63];
89
+ }
90
+ return id;
91
+ }
92
+ var POOL_SIZE_MULTIPLIER = 128, pool, poolOffset;
93
+ var init_nanoid = () => {};
15
94
  // agent-driver/dist/host/default-host.js
16
95
  import { randomUUID } from "node:crypto";
17
96
  function createDefaultAgentDriverHost(options = {}) {
@@ -7914,14 +7993,14 @@ class AgentProcessManager {
7914
7993
  const effects = this.dispatch({ type: "wake", agentId, message: normalized, nowMs: this.now() });
7915
7994
  return effects.length > 0;
7916
7995
  }
7917
- forgetSession(agentId, barrierType = "reset_session", forgottenSessionId) {
7918
- if (!this.forgetSessionSources(agentId, barrierType, forgottenSessionId))
7996
+ forgetSession(agentId, barrierType = "reset_session", forgottenSessionId, pendingIdleResetEvent) {
7997
+ if (!this.forgetSessionSources(agentId, barrierType, forgottenSessionId, pendingIdleResetEvent))
7919
7998
  return false;
7920
7999
  this.dispatch({ type: "reset_session", agentId });
7921
8000
  return true;
7922
8001
  }
7923
- forgetSessionSources(agentId, barrierType, forgottenSessionId) {
7924
- const persisted = this.opts.timeline?.forgetSession(agentId, barrierType, forgottenSessionId);
8002
+ forgetSessionSources(agentId, barrierType, forgottenSessionId, pendingIdleResetEvent) {
8003
+ const persisted = pendingIdleResetEvent ? this.opts.timeline?.forgetSession(agentId, barrierType, forgottenSessionId, pendingIdleResetEvent) : this.opts.timeline?.forgetSession(agentId, barrierType, forgottenSessionId);
7925
8004
  if (persisted === false)
7926
8005
  return false;
7927
8006
  this.resumeSessions.delete(agentId);
@@ -8025,6 +8104,9 @@ class AgentProcessManager {
8025
8104
  snapshot() {
8026
8105
  return this.state;
8027
8106
  }
8107
+ runningAgentCount() {
8108
+ return this.sessions.size;
8109
+ }
8028
8110
  auditContext(agentId) {
8029
8111
  return {
8030
8112
  sessionId: this.liveSessions.get(agentId) ?? null,
@@ -8497,7 +8579,11 @@ ${this.opts.wakePromptFooter}` : text;
8497
8579
  break;
8498
8580
  case "reset_idle_session": {
8499
8581
  const spawnState = this.activeSpawnState.get(effect.agentId);
8500
- const persisted = this.forgetSession(effect.agentId, "reset_session", effect.sessionId);
8582
+ const completion = {
8583
+ eventId: `bae_${randomUUID5()}`,
8584
+ occurredAt: new Date(this.now()).toISOString()
8585
+ };
8586
+ const persisted = this.forgetSession(effect.agentId, "reset_session", effect.sessionId, completion);
8501
8587
  if (!persisted) {
8502
8588
  this.log.error("idle session reset barrier was not persisted; reset deferred", {
8503
8589
  agentId: effect.agentId,
@@ -8509,6 +8595,23 @@ ${this.opts.wakePromptFooter}` : text;
8509
8595
  if (spawnState)
8510
8596
  spawnState.discardEvents = true;
8511
8597
  this.dispatch({ type: "idle_reset_committed", agentId: effect.agentId, nowMs: this.now() });
8598
+ if (this.opts.onBotAuditEvent) {
8599
+ try {
8600
+ this.opts.onBotAuditEvent(effect.agentId, {
8601
+ kind: "session_reset",
8602
+ payload: { trigger: "idle_timeout" }
8603
+ }, {
8604
+ sessionId: null,
8605
+ launchId: null,
8606
+ ...completion
8607
+ });
8608
+ } catch (err) {
8609
+ this.log.debug("audit emit failed (idle session reset)", {
8610
+ agentId: effect.agentId,
8611
+ err: String(err)
8612
+ });
8613
+ }
8614
+ }
8512
8615
  this.log.info("idle agent session reset", {
8513
8616
  agentId: effect.agentId,
8514
8617
  sessionId: effect.sessionId
@@ -23381,6 +23484,18 @@ function formatHandle(name, discriminator) {
23381
23484
  return `${name}#${discriminator}`;
23382
23485
  }
23383
23486
 
23487
+ // ../shared/src/db/community-machine-schema.ts
23488
+ var exports_community_machine_schema = {};
23489
+ __export(exports_community_machine_schema, {
23490
+ communityMachineToken: () => communityMachineToken,
23491
+ communityMachineCredential: () => communityMachineCredential,
23492
+ communityMachine: () => communityMachine,
23493
+ communityDiagnosticReport: () => communityDiagnosticReport,
23494
+ communityBotBinding: () => communityBotBinding,
23495
+ communityAgentRunnerKey: () => communityAgentRunnerKey,
23496
+ DIAGNOSTIC_REPORT_FAILURE_CODES: () => DIAGNOSTIC_REPORT_FAILURE_CODES
23497
+ });
23498
+
23384
23499
  // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/entity.js
23385
23500
  var entityKind = Symbol.for("drizzle:entityKind");
23386
23501
  var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
@@ -23922,6 +24037,9 @@ class Name {
23922
24037
  return new SQL([this]);
23923
24038
  }
23924
24039
  }
24040
+ function isDriverValueEncoder(value) {
24041
+ return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
24042
+ }
23925
24043
  var noopDecoder = {
23926
24044
  mapFromDriverValue: (value) => value
23927
24045
  };
@@ -24050,6 +24168,67 @@ Subquery.prototype.getSQL = function() {
24050
24168
  return new SQL([this]);
24051
24169
  };
24052
24170
 
24171
+ // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/alias.js
24172
+ class ColumnAliasProxyHandler {
24173
+ constructor(table) {
24174
+ this.table = table;
24175
+ }
24176
+ static [entityKind] = "ColumnAliasProxyHandler";
24177
+ get(columnObj, prop) {
24178
+ if (prop === "table") {
24179
+ return this.table;
24180
+ }
24181
+ return columnObj[prop];
24182
+ }
24183
+ }
24184
+
24185
+ class TableAliasProxyHandler {
24186
+ constructor(alias, replaceOriginalName) {
24187
+ this.alias = alias;
24188
+ this.replaceOriginalName = replaceOriginalName;
24189
+ }
24190
+ static [entityKind] = "TableAliasProxyHandler";
24191
+ get(target, prop) {
24192
+ if (prop === Table.Symbol.IsAlias) {
24193
+ return true;
24194
+ }
24195
+ if (prop === Table.Symbol.Name) {
24196
+ return this.alias;
24197
+ }
24198
+ if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
24199
+ return this.alias;
24200
+ }
24201
+ if (prop === ViewBaseConfig) {
24202
+ return {
24203
+ ...target[ViewBaseConfig],
24204
+ name: this.alias,
24205
+ isAlias: true
24206
+ };
24207
+ }
24208
+ if (prop === Table.Symbol.Columns) {
24209
+ const columns = target[Table.Symbol.Columns];
24210
+ if (!columns) {
24211
+ return columns;
24212
+ }
24213
+ const proxiedColumns = {};
24214
+ Object.keys(columns).map((key) => {
24215
+ proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
24216
+ });
24217
+ return proxiedColumns;
24218
+ }
24219
+ const value = target[prop];
24220
+ if (is(value, Column)) {
24221
+ return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
24222
+ }
24223
+ return value;
24224
+ }
24225
+ }
24226
+
24227
+ // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/sqlite-core/alias.js
24228
+ function alias(table, alias2) {
24229
+ return new Proxy(table, new TableAliasProxyHandler(alias2, false));
24230
+ }
24231
+
24053
24232
  // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/sqlite-core/checks.js
24054
24233
  class CheckBuilder {
24055
24234
  constructor(name, value) {
@@ -24754,43 +24933,82 @@ class PrimaryKey {
24754
24933
  }
24755
24934
  }
24756
24935
 
24757
- // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
24758
- import { webcrypto as crypto } from "node:crypto";
24759
-
24760
- // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/url-alphabet/index.js
24761
- var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
24762
-
24763
- // ../../node_modules/.pnpm/nanoid@5.1.16/node_modules/nanoid/index.js
24764
- var POOL_SIZE_MULTIPLIER = 128;
24765
- var pool;
24766
- var poolOffset;
24767
- function fillPool(bytes) {
24768
- if (bytes < 0)
24769
- throw new RangeError("Wrong ID size");
24770
- try {
24771
- if (!pool || pool.length < bytes) {
24772
- pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
24773
- crypto.getRandomValues(pool);
24774
- poolOffset = 0;
24775
- } else if (poolOffset + bytes > pool.length) {
24776
- crypto.getRandomValues(pool);
24777
- poolOffset = 0;
24778
- }
24779
- } catch (e) {
24780
- pool = undefined;
24781
- throw e;
24936
+ // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/sql/expressions/conditions.js
24937
+ function bindIfParam(value, column) {
24938
+ if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
24939
+ return new Param(value, column);
24782
24940
  }
24783
- poolOffset += bytes;
24941
+ return value;
24784
24942
  }
24785
- function nanoid3(size = 21) {
24786
- fillPool(size |= 0);
24787
- let id = "";
24788
- for (let i = poolOffset - size;i < poolOffset; i++) {
24789
- id += urlAlphabet[pool[i] & 63];
24943
+ var eq = (left, right) => {
24944
+ return sql`${left} = ${bindIfParam(right, left)}`;
24945
+ };
24946
+ function and(...unfilteredConditions) {
24947
+ const conditions = unfilteredConditions.filter((c) => c !== undefined);
24948
+ if (conditions.length === 0) {
24949
+ return;
24790
24950
  }
24791
- return id;
24951
+ if (conditions.length === 1) {
24952
+ return new SQL(conditions);
24953
+ }
24954
+ return new SQL([
24955
+ new StringChunk("("),
24956
+ sql.join(conditions, new StringChunk(" and ")),
24957
+ new StringChunk(")")
24958
+ ]);
24959
+ }
24960
+ function isNotNull(value) {
24961
+ return sql`${value} is not null`;
24962
+ }
24963
+
24964
+ // ../../node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare+workers-types@4.20260702.1_@opentelemetry+api@1.9.1_@typ_5aa9492b131e5fac58fa98e88e5c0ad3/node_modules/drizzle-orm/sql/expressions/select.js
24965
+ function desc(column) {
24966
+ return sql`${column} desc`;
24792
24967
  }
24793
24968
 
24969
+ // ../shared/src/db/community-machine-schema.ts
24970
+ init_nanoid();
24971
+
24972
+ // ../shared/src/db/schema.ts
24973
+ var exports_schema = {};
24974
+ __export(exports_schema, {
24975
+ workspaceInvite: () => workspaceInvite,
24976
+ workspaceFileRequest: () => workspaceFileRequest,
24977
+ workspace: () => workspace,
24978
+ verification: () => verification,
24979
+ user: () => user,
24980
+ taskMessage: () => taskMessage,
24981
+ session: () => session,
24982
+ messageFlag: () => messageFlag,
24983
+ message: () => message,
24984
+ member: () => member,
24985
+ meetingSession: () => meetingSession,
24986
+ machineToken: () => machineToken,
24987
+ machine: () => machine,
24988
+ issueComment: () => issueComment,
24989
+ issue: () => issue2,
24990
+ inboxUnread: () => inboxUnread,
24991
+ emails: () => emails,
24992
+ conversationReadState: () => conversationReadState,
24993
+ conversationMap: () => conversationMap,
24994
+ conversation: () => conversation,
24995
+ channel: () => channel,
24996
+ calendarEvent: () => calendarEvent,
24997
+ artifact: () => artifact,
24998
+ agentWhitelist: () => agentWhitelist,
24999
+ agentTaskQueue: () => agentTaskQueue,
25000
+ agentSkill: () => agentSkill,
25001
+ agentSidebarOrder: () => agentSidebarOrder,
25002
+ agentRuntime: () => agentRuntime,
25003
+ agentPin: () => agentPin,
25004
+ agentLink: () => agentLink,
25005
+ agentEmailAccount: () => agentEmailAccount,
25006
+ agentAccess: () => agentAccess,
25007
+ agent: () => agent,
25008
+ account: () => account
25009
+ });
25010
+ init_nanoid();
25011
+
24794
25012
  // ../shared/src/constants.ts
24795
25013
  var TaskStatus = {
24796
25014
  QUEUED: "queued",
@@ -24852,6 +25070,10 @@ var TERMINAL_MEETING_STATUSES = [
24852
25070
  MeetingStatus.COMPLETED,
24853
25071
  MeetingStatus.FAILED
24854
25072
  ];
25073
+ var COMMUNITY_BOT_NAME_MIN = 1;
25074
+ var COMMUNITY_BOT_NAME_MAX = 32;
25075
+ var COMMUNITY_BOT_DESCRIPTION_MAX = 1024;
25076
+ var COMMUNITY_BOT_IMAGE_URL_MAX = 2048;
24855
25077
  var DEV_PORTS = {
24856
25078
  web: 3000,
24857
25079
  emailWorker: 8787,
@@ -25814,6 +26036,7 @@ Then read @memory.md and your .context_timeline for durable context, and pull `
25814
26036
  class AgentRouter {
25815
26037
  opts;
25816
26038
  running = new Set;
26039
+ nextWakeAdmissionOrdinal = 1;
25817
26040
  runtimes = new Map;
25818
26041
  pendingResend = false;
25819
26042
  scheduleResend;
@@ -25974,7 +26197,7 @@ class AgentRouter {
25974
26197
  this.opts.typingTracker?.add(cmd.agentId, channelScope);
25975
26198
  const text2 = (this.opts.formatUnreadNoticeText ?? defaultFormatUnreadNoticeText)(cmd.unreadNotice);
25976
26199
  const producedEffect = this.opts.manager.deliver(cmd.agentId, {
25977
- id: `${cmd.agentId}:wake:${cmd.unreadNotice.channel}:${cmd.unreadNotice.latestSeq}`,
26200
+ id: `${cmd.agentId}:wake:${cmd.unreadNotice.channel}:${cmd.unreadNotice.latestSeq}:admission:${this.nextWakeAdmissionOrdinal++}`,
25978
26201
  seq: cmd.unreadNotice.latestSeq,
25979
26202
  text: text2
25980
26203
  });
@@ -26128,7 +26351,7 @@ function createTypingScopeTracker() {
26128
26351
  };
26129
26352
  }
26130
26353
  // src/credentials/credentialProxy.ts
26131
- import * as crypto2 from "crypto";
26354
+ import * as crypto3 from "crypto";
26132
26355
  import * as fs5 from "fs";
26133
26356
  import * as http from "http";
26134
26357
  import * as https from "https";
@@ -26145,7 +26368,7 @@ var DEFAULT_HEADER_NAMES = {
26145
26368
  capabilities: "X-Agent-Active-Capabilities"
26146
26369
  };
26147
26370
  function randomVoucher(prefix) {
26148
- return prefix + crypto2.randomBytes(32).toString("base64url");
26371
+ return prefix + crypto3.randomBytes(32).toString("base64url");
26149
26372
  }
26150
26373
  function sanitizeIdSegment(id) {
26151
26374
  return id.replace(/[^A-Za-z0-9._-]/g, "_") || "_";
@@ -26824,7 +27047,1902 @@ function writeStatusFile(path9, snapshot) {
26824
27047
  renameSync2(tmp, path9);
26825
27048
  } catch {}
26826
27049
  }
27050
+ // ../shared/src/constants/community.ts
27051
+ var MAX_PROFILE_NAME_LENGTH = 100;
27052
+ var MAX_PROFILE_ABOUT_LENGTH = 1000;
27053
+ var MAX_MESSAGE_CONTENT_LENGTH = 4000;
27054
+ var MAX_ATTACHMENTS_PER_MESSAGE = 10;
27055
+ var MAX_ATTACHMENT_SIZE_BYTES = 25 * 1024 * 1024;
27056
+ var MAX_ATTACHMENT_THUMBNAIL_SIZE_BYTES = 50 * 1024;
27057
+ var MAX_SERVER_ICON_SIZE_BYTES = 5 * 1024 * 1024;
27058
+ var ALLOWED_ICON_MIME_TYPES = [
27059
+ "image/png",
27060
+ "image/jpeg",
27061
+ "image/webp",
27062
+ "image/gif"
27063
+ ];
27064
+ var MAX_ICON_SOURCE_FILE_SIZE_BYTES = 15 * 1024 * 1024;
27065
+ // ../shared/src/utils/slug.ts
27066
+ init_nanoid();
27067
+ var slugId = customAlphabet("0123456789abcdefghijklmnopqrstuvwxyz");
27068
+ function sanitizeSlug(input) {
27069
+ return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60).replace(/-+$/g, "");
27070
+ }
27071
+
27072
+ // ../shared/src/lib/community-name.ts
27073
+ var FORBIDDEN_NAME_CHARS = /[#@\x00-\x1f\x7f-\x9f]/;
27074
+ function validateCommunityName(name) {
27075
+ const trimmed = name.trim();
27076
+ if (!trimmed)
27077
+ return { ok: false, reason: "name cannot be empty" };
27078
+ if (trimmed.length > MAX_PROFILE_NAME_LENGTH) {
27079
+ return { ok: false, reason: `name must be ≤ ${MAX_PROFILE_NAME_LENGTH} characters` };
27080
+ }
27081
+ if (FORBIDDEN_NAME_CHARS.test(trimmed)) {
27082
+ return { ok: false, reason: "name cannot contain #, @, or line breaks" };
27083
+ }
27084
+ return { ok: true };
27085
+ }
26827
27086
 
27087
+ // ../shared/src/schemas.ts
27088
+ var TaskStatusSchema = exports_external.enum([
27089
+ "queued",
27090
+ "dispatched",
27091
+ "running",
27092
+ "completed",
27093
+ "failed",
27094
+ "cancelled",
27095
+ "superseded"
27096
+ ]);
27097
+ var ClaimedTaskRowSchema = exports_external.object({
27098
+ id: exports_external.string(),
27099
+ agentId: exports_external.string(),
27100
+ runtimeId: exports_external.string(),
27101
+ workspaceId: exports_external.string(),
27102
+ conversationId: exports_external.string(),
27103
+ prompt: exports_external.string(),
27104
+ status: exports_external.string(),
27105
+ priority: exports_external.coerce.number(),
27106
+ result: exports_external.unknown().nullable(),
27107
+ context: exports_external.unknown().nullable(),
27108
+ type: exports_external.string().default(TASK_TYPES.USER_DM_MESSAGE),
27109
+ contextKey: exports_external.string().nullable().optional(),
27110
+ sessionId: exports_external.string().nullable(),
27111
+ createdAt: exports_external.coerce.date(),
27112
+ dispatchedAt: exports_external.coerce.date().nullable(),
27113
+ startedAt: exports_external.coerce.date().nullable(),
27114
+ completedAt: exports_external.coerce.date().nullable(),
27115
+ error: exports_external.string().nullable(),
27116
+ traceId: exports_external.string().nullable().optional(),
27117
+ parentTaskId: exports_external.string().nullable().optional()
27118
+ });
27119
+ var ColleagueDataApiSchema = exports_external.object({
27120
+ name: exports_external.string(),
27121
+ email: exports_external.string(),
27122
+ description: exports_external.string(),
27123
+ instruction: exports_external.string()
27124
+ });
27125
+ var TaskAgentDataApiSchema = exports_external.object({
27126
+ instructions: exports_external.string(),
27127
+ name: exports_external.string(),
27128
+ runtime_config: exports_external.record(exports_external.string(), exports_external.unknown()).default({}),
27129
+ email_handle: exports_external.string().nullable().optional(),
27130
+ email_addresses: exports_external.array(exports_external.string()).default([]),
27131
+ user_email: exports_external.string().nullable().optional(),
27132
+ user_name: exports_external.string().nullable().optional(),
27133
+ colleagues: exports_external.array(ColleagueDataApiSchema).default([])
27134
+ });
27135
+ var TaskApiBaseSchema = exports_external.object({
27136
+ id: exports_external.string(),
27137
+ agent_id: exports_external.string(),
27138
+ runtime_id: exports_external.string(),
27139
+ conversation_id: exports_external.string(),
27140
+ workspace_id: exports_external.string(),
27141
+ prompt: exports_external.string(),
27142
+ status: exports_external.string(),
27143
+ priority: exports_external.number(),
27144
+ dispatched_at: exports_external.string().nullable(),
27145
+ started_at: exports_external.string().nullable(),
27146
+ completed_at: exports_external.string().nullable(),
27147
+ result: exports_external.unknown().nullable(),
27148
+ error: exports_external.string().nullable(),
27149
+ created_at: exports_external.string(),
27150
+ type: exports_external.string(),
27151
+ context_key: exports_external.string().nullable().optional(),
27152
+ context: exports_external.unknown().nullable().optional(),
27153
+ trace_id: exports_external.string().nullable().optional(),
27154
+ parent_task_id: exports_external.string().nullable().optional(),
27155
+ channel: exports_external.string().nullable().optional()
27156
+ });
27157
+ var TaskSenderApiSchema = exports_external.object({
27158
+ name: exports_external.string(),
27159
+ email: exports_external.string(),
27160
+ is_owner: exports_external.boolean()
27161
+ });
27162
+ var TaskApiSchema = TaskApiBaseSchema.extend({
27163
+ agent: TaskAgentDataApiSchema.nullable().optional(),
27164
+ sender: TaskSenderApiSchema.nullable().optional()
27165
+ });
27166
+ var HeartbeatRequestSchema = exports_external.object({
27167
+ daemon_id: exports_external.string().min(1)
27168
+ });
27169
+ var PollRequestSchema = exports_external.object({
27170
+ daemon_id: exports_external.string().min(1),
27171
+ max_tasks: exports_external.number().int().min(1).default(1),
27172
+ cli_version: exports_external.string().optional()
27173
+ });
27174
+ var FileRequestItemSchema = exports_external.object({
27175
+ id: exports_external.string(),
27176
+ agent_id: exports_external.string(),
27177
+ request_type: exports_external.enum(["tree", "read"]),
27178
+ path: exports_external.string()
27179
+ });
27180
+ var PollMeetingItemSchema = exports_external.object({
27181
+ id: exports_external.string(),
27182
+ meeting_url: exports_external.string(),
27183
+ participants: exports_external.array(exports_external.string()),
27184
+ workspace_id: exports_external.string(),
27185
+ agent_id: exports_external.string(),
27186
+ agent_name: exports_external.string(),
27187
+ title: exports_external.string().optional()
27188
+ });
27189
+ var PollResponseSchema = exports_external.object({
27190
+ tasks: exports_external.array(TaskApiSchema),
27191
+ evicted: exports_external.boolean().optional(),
27192
+ pending_update: exports_external.object({ version: exports_external.string() }).optional(),
27193
+ pending_rescan: exports_external.boolean().optional(),
27194
+ file_requests: exports_external.array(FileRequestItemSchema).optional(),
27195
+ meetings: exports_external.array(PollMeetingItemSchema).optional()
27196
+ });
27197
+ var DaemonPushMessageSchema = exports_external.discriminatedUnion("type", [
27198
+ exports_external.object({ type: exports_external.literal("daemon.tasks"), tasks: exports_external.array(TaskApiSchema) }),
27199
+ exports_external.object({ type: exports_external.literal("daemon.file_requests"), workspaceId: exports_external.string(), requests: exports_external.array(FileRequestItemSchema) }),
27200
+ exports_external.object({ type: exports_external.literal("daemon.meetings"), meetings: exports_external.array(PollMeetingItemSchema) }),
27201
+ exports_external.object({ type: exports_external.literal("daemon.evict"), workspaceId: exports_external.string() }),
27202
+ exports_external.object({ type: exports_external.literal("daemon.update"), version: exports_external.string() }),
27203
+ exports_external.object({ type: exports_external.literal("daemon.rescan") }),
27204
+ exports_external.object({ type: exports_external.literal("daemon.kill"), workspaceId: exports_external.string(), agentId: exports_external.string().min(1), taskId: exports_external.string(), targetTaskId: exports_external.string() })
27205
+ ]);
27206
+ var RegisterResponseSchema = exports_external.object({
27207
+ runtimes: exports_external.array(exports_external.object({ id: exports_external.string() }))
27208
+ });
27209
+ var DaemonRuntimeItemSchema = exports_external.object({
27210
+ type: exports_external.string().optional(),
27211
+ provider: exports_external.string().optional(),
27212
+ runtime_mode: exports_external.string().optional(),
27213
+ version: exports_external.string().optional(),
27214
+ status: exports_external.string().optional(),
27215
+ model: exports_external.string().optional()
27216
+ });
27217
+ var ActivateTokenRuntimeSchema = exports_external.object({
27218
+ type: exports_external.string().min(1),
27219
+ version: exports_external.string().optional().default("")
27220
+ });
27221
+ var ActivateTokenRequestSchema = exports_external.object({
27222
+ token: exports_external.string().min(1),
27223
+ hostname: exports_external.string().min(1),
27224
+ runtimes: exports_external.array(ActivateTokenRuntimeSchema).min(1)
27225
+ });
27226
+ var RegisterDaemonRequestSchema = exports_external.object({
27227
+ workspace_id: exports_external.string().min(1).optional(),
27228
+ daemon_id: exports_external.string().min(1),
27229
+ device_name: exports_external.string().optional().default(""),
27230
+ cli_version: exports_external.string().optional().default(""),
27231
+ workspaces_root: exports_external.string().optional().default(""),
27232
+ runtimes: exports_external.array(DaemonRuntimeItemSchema).min(1)
27233
+ });
27234
+ var DeregisterRequestSchema = exports_external.object({
27235
+ daemon_id: exports_external.string().min(1)
27236
+ });
27237
+ var CompleteTaskRequestSchema = exports_external.object({
27238
+ output: exports_external.string().optional(),
27239
+ session_id: exports_external.string().optional(),
27240
+ branch_name: exports_external.string().optional()
27241
+ });
27242
+ var FailTaskRequestSchema = exports_external.object({
27243
+ error: exports_external.string().optional().default("")
27244
+ });
27245
+ var MessageItemSchema = exports_external.object({
27246
+ seq: exports_external.number(),
27247
+ type: exports_external.string(),
27248
+ tool: exports_external.string().optional(),
27249
+ call_id: exports_external.string().optional(),
27250
+ content: exports_external.string().optional(),
27251
+ input: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
27252
+ output: exports_external.string().optional()
27253
+ });
27254
+ var ReportMessagesRequestSchema = exports_external.object({
27255
+ messages: exports_external.array(MessageItemSchema)
27256
+ });
27257
+ var RepeatIntervalSchema = exports_external.string().regex(/^\d+(min|hour|day|week|month)$/, {
27258
+ message: "repeat_interval must match <positive_integer><min|hour|day|week|month>"
27259
+ });
27260
+ var CreateCalendarEventRequestSchema = exports_external.object({
27261
+ agent_id: exports_external.string().min(1),
27262
+ title: exports_external.string().min(1),
27263
+ description: exports_external.string().max(20000).optional(),
27264
+ scheduled_at: exports_external.string().min(1).refine((s) => !Number.isNaN(Date.parse(s)), {
27265
+ message: "scheduled_at must be a valid ISO datetime"
27266
+ }),
27267
+ repeat_interval: RepeatIntervalSchema.optional(),
27268
+ repeat_stop_date: exports_external.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
27269
+ conversation_id: exports_external.string().optional()
27270
+ }).refine((data) => !data.repeat_stop_date || !!data.repeat_interval, {
27271
+ message: "repeat_stop_date requires repeat_interval",
27272
+ path: ["repeat_stop_date"]
27273
+ });
27274
+ var UpdateCalendarEventRequestSchema = exports_external.object({
27275
+ title: exports_external.string().min(1).optional(),
27276
+ description: exports_external.string().max(20000).nullable().optional(),
27277
+ agent_id: exports_external.string().min(1).optional(),
27278
+ scheduled_at: exports_external.string().min(1).refine((s) => !Number.isNaN(Date.parse(s)), {
27279
+ message: "scheduled_at must be a valid ISO datetime"
27280
+ }).optional(),
27281
+ repeat_interval: RepeatIntervalSchema.nullable().optional(),
27282
+ repeat_stop_date: exports_external.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional(),
27283
+ scope: exports_external.enum(["this", "following"]).optional(),
27284
+ occurrence_at: exports_external.string().min(1).refine((s) => !Number.isNaN(Date.parse(s)), {
27285
+ message: "occurrence_at must be a valid ISO datetime"
27286
+ }).optional()
27287
+ }).refine((v) => v.title !== undefined || v.description !== undefined || v.agent_id !== undefined || v.scheduled_at !== undefined || v.repeat_interval !== undefined || v.repeat_stop_date !== undefined, { message: "at least one field is required" });
27288
+ var DeleteCalendarEventRequestSchema = exports_external.object({
27289
+ scope: exports_external.enum(["this", "following"]).optional(),
27290
+ occurrence_at: exports_external.string().min(1).refine((s) => !Number.isNaN(Date.parse(s)), {
27291
+ message: "occurrence_at must be a valid ISO datetime"
27292
+ }).optional()
27293
+ });
27294
+ var CalendarEventApiSchema = exports_external.object({
27295
+ id: exports_external.string(),
27296
+ agent_id: exports_external.string(),
27297
+ workspace_id: exports_external.string(),
27298
+ title: exports_external.string(),
27299
+ description: exports_external.string().nullable(),
27300
+ scheduled_at: exports_external.string(),
27301
+ occurrence_at: exports_external.string(),
27302
+ collapsed_count: exports_external.number().nullable().optional(),
27303
+ repeat_interval: exports_external.string().nullable(),
27304
+ repeat_stop_at: exports_external.string().nullable(),
27305
+ last_triggered_at: exports_external.string().nullable(),
27306
+ created_at: exports_external.string(),
27307
+ updated_at: exports_external.string()
27308
+ });
27309
+ var IssueStatusSchema = exports_external.enum([
27310
+ IssueStatus.TODO,
27311
+ IssueStatus.IN_PROGRESS,
27312
+ IssueStatus.REVIEW,
27313
+ IssueStatus.DONE,
27314
+ IssueStatus.CLOSED,
27315
+ IssueStatus.CANCELED,
27316
+ IssueStatus.FAILED
27317
+ ]);
27318
+ var CreateIssueRequestSchema = exports_external.object({
27319
+ agent_id: exports_external.string().min(1).optional(),
27320
+ title: exports_external.string().min(1, "title is required").max(200),
27321
+ description: exports_external.string().max(20000).optional().default("")
27322
+ });
27323
+ var UpdateIssueRequestSchema = exports_external.object({
27324
+ title: exports_external.string().min(1).max(200).optional(),
27325
+ description: exports_external.string().max(20000).optional(),
27326
+ status: IssueStatusSchema.optional(),
27327
+ agent_id: exports_external.string().min(1).optional()
27328
+ }).refine((v) => v.title !== undefined || v.description !== undefined || v.status !== undefined || v.agent_id !== undefined, { message: "at least one field is required" });
27329
+ var CreateIssueCommentBodySchema = exports_external.object({
27330
+ content: exports_external.string().min(1, "content is required").max(20000)
27331
+ });
27332
+ var IssueCommentApiSchema = exports_external.object({
27333
+ id: exports_external.string(),
27334
+ issue_id: exports_external.string(),
27335
+ workspace_id: exports_external.string(),
27336
+ author_type: exports_external.enum(["user", "agent"]),
27337
+ author_id: exports_external.string(),
27338
+ content: exports_external.string(),
27339
+ created_at: exports_external.string()
27340
+ });
27341
+ var IssueApiSchema = exports_external.object({
27342
+ id: exports_external.string(),
27343
+ workspace_id: exports_external.string(),
27344
+ agent_id: exports_external.string().nullable(),
27345
+ creator_user_id: exports_external.string(),
27346
+ conversation_id: exports_external.string().nullable(),
27347
+ latest_task_id: exports_external.string().nullable(),
27348
+ title: exports_external.string(),
27349
+ description: exports_external.string(),
27350
+ status: IssueStatusSchema,
27351
+ created_at: exports_external.string(),
27352
+ updated_at: exports_external.string(),
27353
+ completed_at: exports_external.string().nullable()
27354
+ });
27355
+ var CreateAgentLinkRequestSchema = exports_external.object({
27356
+ source_agent_id: exports_external.string().min(1, "source_agent_id is required"),
27357
+ target_agent_id: exports_external.string().min(1, "target_agent_id is required"),
27358
+ instruction: exports_external.string().optional().default("")
27359
+ });
27360
+ var UpdateAgentLinkRequestSchema = exports_external.object({
27361
+ instruction: exports_external.string()
27362
+ });
27363
+ var UpsertAgentLinkRequestSchema = exports_external.object({
27364
+ target_agent_id: exports_external.string().min(1, "target_agent_id is required"),
27365
+ instruction: exports_external.string()
27366
+ });
27367
+ var AddWhitelistRequestSchema = exports_external.object({
27368
+ email: exports_external.string().email()
27369
+ });
27370
+ var RuntimeConfigSchema = exports_external.object({ model: exports_external.string().max(100).optional() }).passthrough().optional();
27371
+ var CreateAgentRequestSchema = exports_external.object({
27372
+ name: exports_external.string().min(1, "name is required"),
27373
+ description: exports_external.string().optional().default(""),
27374
+ instructions: exports_external.string().optional().default(""),
27375
+ runtime_id: exports_external.string().min(1, "runtime_id is required"),
27376
+ runtime_config: RuntimeConfigSchema,
27377
+ max_concurrent_tasks: exports_external.number().int().optional(),
27378
+ email_handle: exports_external.string().optional(),
27379
+ avatar_url: exports_external.string().max(2000).nullable().optional()
27380
+ });
27381
+ var UpdateAgentRequestSchema = exports_external.object({
27382
+ name: exports_external.string().min(1).optional(),
27383
+ description: exports_external.string().optional(),
27384
+ instructions: exports_external.string().optional(),
27385
+ runtime_id: exports_external.string().min(1).optional(),
27386
+ runtime_config: RuntimeConfigSchema,
27387
+ visibility: exports_external.enum(["public", "private"]).optional(),
27388
+ avatar_url: exports_external.string().max(2000).nullable().optional()
27389
+ }).refine((v) => v.name !== undefined || v.description !== undefined || v.instructions !== undefined || v.runtime_id !== undefined || v.runtime_config !== undefined || v.visibility !== undefined || v.avatar_url !== undefined, { message: "at least one field is required" });
27390
+ var CreateConversationRequestSchema = exports_external.object({
27391
+ agent_id: exports_external.string().min(1, "agent_id is required"),
27392
+ channel: exports_external.string().optional()
27393
+ });
27394
+ var CreateMessageRequestSchema = exports_external.object({
27395
+ content: exports_external.string().min(1, "content is required"),
27396
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
27397
+ });
27398
+ var AgentDmRequestSchema = exports_external.object({
27399
+ content: exports_external.string().min(1, "content is required"),
27400
+ task_id: exports_external.string().min(1).optional()
27401
+ });
27402
+ var EmailAttachmentSchema = exports_external.object({
27403
+ key: exports_external.string().min(1),
27404
+ filename: exports_external.string().min(1),
27405
+ size: exports_external.number().int().nonnegative().optional(),
27406
+ contentType: exports_external.string().min(1)
27407
+ });
27408
+ var SendEmailRequestSchema = exports_external.object({
27409
+ agentId: exports_external.string().min(1, "agentId is required"),
27410
+ to: exports_external.string().min(1, "to is required"),
27411
+ subject: exports_external.string().min(1, "subject is required"),
27412
+ htmlBody: exports_external.string().default(""),
27413
+ inReplyTo: exports_external.string().optional(),
27414
+ references: exports_external.string().optional(),
27415
+ attachments: exports_external.array(EmailAttachmentSchema).optional(),
27416
+ customAccountId: exports_external.string().optional(),
27417
+ from: exports_external.string().email().optional(),
27418
+ conversationId: exports_external.string().optional(),
27419
+ traceId: exports_external.string().optional(),
27420
+ sourceTaskId: exports_external.string().optional()
27421
+ });
27422
+ var UpdateEmailStatusRequestSchema = exports_external.object({
27423
+ status: exports_external.enum(["unread", "read", "archived", "sent"])
27424
+ });
27425
+ var MeetingInfoSchema = exports_external.object({
27426
+ title: exports_external.string(),
27427
+ meetingUrl: exports_external.string(),
27428
+ startTime: exports_external.string().nullable(),
27429
+ endTime: exports_external.string().nullable(),
27430
+ attendees: exports_external.array(exports_external.object({ name: exports_external.string(), email: exports_external.string() }))
27431
+ });
27432
+ var EmailNotifyRequestSchema = exports_external.object({
27433
+ agentId: exports_external.string().min(1),
27434
+ workspaceId: exports_external.string().min(1),
27435
+ r2Key: exports_external.string().min(1),
27436
+ from: exports_external.string().min(1),
27437
+ to: exports_external.string().optional(),
27438
+ subject: exports_external.string(),
27439
+ isWhitelisted: exports_external.boolean(),
27440
+ forwarded: exports_external.boolean().optional().default(false),
27441
+ messageId: exports_external.string().optional().default(""),
27442
+ inReplyTo: exports_external.string().optional().default(""),
27443
+ references: exports_external.string().optional().default(""),
27444
+ meetingInfo: MeetingInfoSchema.nullable().optional(),
27445
+ attachments: exports_external.string().optional(),
27446
+ traceId: exports_external.string().optional(),
27447
+ sourceTaskId: exports_external.string().optional(),
27448
+ isInternal: exports_external.boolean().optional().default(false),
27449
+ senderConversationId: exports_external.string().optional(),
27450
+ senderAgentId: exports_external.string().optional()
27451
+ });
27452
+ var CreateEmailAccountSchema = exports_external.object({
27453
+ emailAddress: exports_external.string().email("valid email required"),
27454
+ displayName: exports_external.string().default(""),
27455
+ imapHost: exports_external.string().min(1, "IMAP host is required"),
27456
+ imapPort: exports_external.number().int().min(1).max(65535).default(993),
27457
+ imapUsername: exports_external.string().min(1, "IMAP username is required"),
27458
+ imapPassword: exports_external.string().min(1, "IMAP password is required"),
27459
+ imapTls: exports_external.boolean().default(true),
27460
+ smtpHost: exports_external.string().min(1, "SMTP host is required"),
27461
+ smtpPort: exports_external.number().int().min(1).max(65535).default(587),
27462
+ smtpUsername: exports_external.string().min(1, "SMTP username is required"),
27463
+ smtpPassword: exports_external.string().min(1, "SMTP password is required"),
27464
+ smtpTls: exports_external.number().int().min(0).max(2).default(1),
27465
+ pollIntervalSeconds: exports_external.number().int().min(30).max(3600).default(60)
27466
+ });
27467
+ var UpdateEmailAccountSchema = exports_external.object({
27468
+ emailAddress: exports_external.string().email().optional(),
27469
+ displayName: exports_external.string().optional(),
27470
+ imapHost: exports_external.string().min(1).optional(),
27471
+ imapPort: exports_external.number().int().min(1).max(65535).optional(),
27472
+ imapUsername: exports_external.string().min(1).optional(),
27473
+ imapPassword: exports_external.string().min(1).optional(),
27474
+ imapTls: exports_external.boolean().optional(),
27475
+ smtpHost: exports_external.string().min(1).optional(),
27476
+ smtpPort: exports_external.number().int().min(1).max(65535).optional(),
27477
+ smtpUsername: exports_external.string().min(1).optional(),
27478
+ smtpPassword: exports_external.string().min(1).optional(),
27479
+ smtpTls: exports_external.number().int().min(0).max(2).optional(),
27480
+ pollIntervalSeconds: exports_external.number().int().min(30).max(3600).optional()
27481
+ });
27482
+ var TestEmailConnectionSchema = exports_external.object({
27483
+ imapHost: exports_external.string().min(1),
27484
+ imapPort: exports_external.number().int().min(1).max(65535).default(993),
27485
+ imapUsername: exports_external.string().min(1),
27486
+ imapPassword: exports_external.string().min(1),
27487
+ imapTls: exports_external.boolean().default(true),
27488
+ smtpHost: exports_external.string().min(1),
27489
+ smtpPort: exports_external.number().int().min(1).max(65535).default(587),
27490
+ smtpUsername: exports_external.string().min(1),
27491
+ smtpPassword: exports_external.string().min(1),
27492
+ smtpTls: exports_external.number().int().min(0).max(2).default(1)
27493
+ });
27494
+ var UpdateMemberRequestSchema = exports_external.object({
27495
+ global_instruction: exports_external.string().max(50000).trim()
27496
+ });
27497
+ var CreateWorkspaceRequestSchema = exports_external.object({
27498
+ name: exports_external.string().min(1, "name is required"),
27499
+ slug: exports_external.string().optional().default("").transform(sanitizeSlug)
27500
+ });
27501
+ var UpdateWorkspaceRequestSchema = exports_external.object({
27502
+ name: exports_external.string().min(1, "name is required").max(100).trim().optional(),
27503
+ slug: exports_external.string().min(1, "slug is required").trim().toLowerCase().transform(sanitizeSlug).optional()
27504
+ });
27505
+ var DeleteWorkspaceRequestSchema = exports_external.object({
27506
+ confirm_name: exports_external.string().min(1, "confirm_name is required")
27507
+ });
27508
+ var GrantAgentAccessRequestSchema = exports_external.object({
27509
+ user_id: exports_external.string().min(1, "user_id is required")
27510
+ });
27511
+ var WorkspaceFileBrowseRequestSchema = exports_external.object({
27512
+ request_type: exports_external.enum(["tree", "read"]),
27513
+ path: exports_external.string().default(".")
27514
+ });
27515
+ var WorkspaceFileEntrySchema = exports_external.object({
27516
+ name: exports_external.string(),
27517
+ path: exports_external.string(),
27518
+ isDirectory: exports_external.boolean(),
27519
+ size: exports_external.number(),
27520
+ modifiedAt: exports_external.string()
27521
+ });
27522
+ var WorkspaceFileReportSchema = exports_external.object({
27523
+ request_id: exports_external.string().min(1),
27524
+ entries: exports_external.array(WorkspaceFileEntrySchema).optional(),
27525
+ content: exports_external.string().nullable().optional(),
27526
+ isBinary: exports_external.boolean().optional(),
27527
+ error: exports_external.string().optional(),
27528
+ path: exports_external.string()
27529
+ });
27530
+ var SkillEntrySchema = exports_external.object({
27531
+ name: exports_external.string(),
27532
+ description: exports_external.string(),
27533
+ isGlobal: exports_external.boolean().optional()
27534
+ });
27535
+ var SkillItemSchema = exports_external.object({
27536
+ name: exports_external.string(),
27537
+ description: exports_external.string()
27538
+ });
27539
+ var SkillSyncRequestSchema = exports_external.object({
27540
+ scope: exports_external.enum(["global", "agent"]),
27541
+ agent_id: exports_external.string().min(1).optional(),
27542
+ daemon_id: exports_external.string().min(1).optional(),
27543
+ runtime: exports_external.enum(["claude", "codex", "opencode"]),
27544
+ skills: exports_external.array(SkillItemSchema)
27545
+ });
27546
+ var StudioMemberSchema = exports_external.object({
27547
+ name: exports_external.string().optional(),
27548
+ role: exports_external.enum(["leader", "researcher", "engineer", "assistant"]),
27549
+ runtime_id: exports_external.string().min(1, "runtime_id is required"),
27550
+ runtime_config: exports_external.object({ model: exports_external.string().max(100).optional() }).passthrough().optional(),
27551
+ description: exports_external.string().optional().default(""),
27552
+ instructions: exports_external.string().optional().default(""),
27553
+ avatar_url: exports_external.string().max(2000).nullable().optional(),
27554
+ email_handle: exports_external.string().max(30).optional(),
27555
+ relationship: exports_external.string().optional()
27556
+ });
27557
+ var CreateStudioRequestSchema = exports_external.object({
27558
+ name: exports_external.string().max(100).optional(),
27559
+ scenario: exports_external.string().max(50).optional(),
27560
+ members: exports_external.array(StudioMemberSchema).min(1).max(4)
27561
+ }).refine((v) => v.members.some((m) => m.role === "leader"), { message: "at least one member must have the leader role" });
27562
+ var RecruitAgentRequestSchema = exports_external.object({
27563
+ instructions: exports_external.string().min(1, "instructions is required"),
27564
+ relationship: exports_external.string().min(1, "relationship is required"),
27565
+ name: exports_external.string().optional(),
27566
+ description: exports_external.string().optional().default(""),
27567
+ model: exports_external.string().max(100).optional(),
27568
+ context_key: exports_external.string().optional()
27569
+ });
27570
+ var CreateThreadRequestSchema = exports_external.object({
27571
+ parent_message_id: exports_external.string().min(1),
27572
+ content: exports_external.string().optional().default(""),
27573
+ attachment_ids: exports_external.array(exports_external.string()).optional()
27574
+ });
27575
+ var COMMUNITY_RUNTIME_ID_MAX = 64;
27576
+ var COMMUNITY_RUNTIME_VERSION_MAX = 64;
27577
+ var COMMUNITY_RUNTIME_LIST_MAX = 64;
27578
+ var RUNTIME_ID_RE = /^[A-Za-z0-9._@/-]+$/;
27579
+ var CommunityMachineRuntimeSchema = exports_external.object({
27580
+ id: exports_external.string().min(1).max(COMMUNITY_RUNTIME_ID_MAX).regex(RUNTIME_ID_RE, "invalid runtime id charset"),
27581
+ version: exports_external.string().max(COMMUNITY_RUNTIME_VERSION_MAX).optional(),
27582
+ status: exports_external.enum(["healthy", "unhealthy"]).catch("healthy").default("healthy"),
27583
+ lastError: exports_external.string().max(128).optional(),
27584
+ lastErrorAt: exports_external.string().optional()
27585
+ });
27586
+ var CommunityMachineRuntimeListSchema = exports_external.array(CommunityMachineRuntimeSchema).max(COMMUNITY_RUNTIME_LIST_MAX).transform((list) => {
27587
+ const seen = new Set;
27588
+ const out = [];
27589
+ for (const r of list) {
27590
+ if (seen.has(r.id))
27591
+ continue;
27592
+ seen.add(r.id);
27593
+ out.push(r);
27594
+ }
27595
+ return out;
27596
+ });
27597
+ var CommunityMachineSummarySchema = exports_external.object({
27598
+ id: exports_external.string(),
27599
+ hostname: exports_external.string(),
27600
+ displayName: exports_external.string(),
27601
+ platform: exports_external.string(),
27602
+ arch: exports_external.string(),
27603
+ osRelease: exports_external.string(),
27604
+ daemonVersion: exports_external.string(),
27605
+ lastSeenAt: exports_external.string().nullable(),
27606
+ status: exports_external.enum(["online", "offline"]),
27607
+ availableRuntimes: exports_external.array(CommunityMachineRuntimeSchema).default([]),
27608
+ lastRuntimeError: exports_external.object({
27609
+ requested: exports_external.string(),
27610
+ available: exports_external.array(exports_external.string()),
27611
+ at: exports_external.string()
27612
+ }).optional(),
27613
+ createdAt: exports_external.string(),
27614
+ updatedAt: exports_external.string()
27615
+ });
27616
+ var HostReadyMessageSchema = exports_external.object({
27617
+ type: exports_external.literal("ready"),
27618
+ runtimeReport: CommunityMachineRuntimeListSchema,
27619
+ capabilities: exports_external.array(exports_external.string().min(1).max(64)).max(16).optional().default([]),
27620
+ runningAgents: exports_external.array(exports_external.string()).default([]),
27621
+ hostname: exports_external.string().optional(),
27622
+ platform: exports_external.string().optional(),
27623
+ arch: exports_external.string().optional(),
27624
+ osRelease: exports_external.string().optional(),
27625
+ daemonVersion: exports_external.string().optional()
27626
+ });
27627
+ var CommunityDaemonReadySchema = exports_external.object({
27628
+ runtimeReport: CommunityMachineRuntimeListSchema.optional(),
27629
+ runningAgents: exports_external.array(exports_external.string()).default([]),
27630
+ hostname: exports_external.string().optional(),
27631
+ os: exports_external.string().optional(),
27632
+ arch: exports_external.string().optional(),
27633
+ osRelease: exports_external.string().optional(),
27634
+ daemonVersion: exports_external.string().optional()
27635
+ });
27636
+ var SessionErrorFrameSchema = exports_external.object({
27637
+ type: exports_external.literal("session.error"),
27638
+ code: exports_external.enum(["runtime_not_available"]),
27639
+ agentId: exports_external.string().optional(),
27640
+ launchId: exports_external.string().optional(),
27641
+ payload: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
27642
+ });
27643
+ var AgentActivityMessageSchema = exports_external.object({
27644
+ type: exports_external.literal("agent_activity"),
27645
+ agentId: exports_external.string(),
27646
+ state: exports_external.enum(["idle", "starting", "running", "stopping"])
27647
+ });
27648
+ var AgentTypingMessageSchema = exports_external.object({
27649
+ type: exports_external.literal("agent_typing"),
27650
+ agentId: exports_external.string(),
27651
+ channelId: exports_external.string().min(1)
27652
+ });
27653
+ var AgentTypingStopMessageSchema = exports_external.object({
27654
+ type: exports_external.literal("agent_typing_stop"),
27655
+ agentId: exports_external.string(),
27656
+ channelId: exports_external.string().min(1)
27657
+ });
27658
+ var AgentSessionMessageSchema = exports_external.object({
27659
+ type: exports_external.literal("agent_session"),
27660
+ agentId: exports_external.string().min(1),
27661
+ sessionId: exports_external.string().min(1),
27662
+ launchId: exports_external.string().min(1)
27663
+ });
27664
+ var AgentWakeAckMessageSchema = exports_external.object({
27665
+ type: exports_external.literal("agent_wake_ack"),
27666
+ agentId: exports_external.string().min(1),
27667
+ launchId: exports_external.string().min(1),
27668
+ status: exports_external.enum(["ok", "error"]),
27669
+ error: exports_external.object({ code: exports_external.string().optional(), message: exports_external.string().optional() }).optional()
27670
+ });
27671
+ var MachineHeartbeatAckMessageSchema = exports_external.strictObject({
27672
+ type: exports_external.literal("machine_heartbeat_ack"),
27673
+ nonce: exports_external.string().min(1).max(128)
27674
+ });
27675
+ var DiagnosticCommandAckMessageSchema = exports_external.strictObject({
27676
+ type: exports_external.literal("diagnostics_ack"),
27677
+ reportId: DiagnosticReportIdSchema
27678
+ });
27679
+ var CommunityPairTokenResponseSchema = exports_external.object({
27680
+ tokenId: exports_external.string(),
27681
+ expiresAt: exports_external.string()
27682
+ });
27683
+ var CommunityDaemonActivateRequestSchema = exports_external.object({
27684
+ hostname: exports_external.string(),
27685
+ platform: exports_external.string(),
27686
+ arch: exports_external.string(),
27687
+ expectedMachineId: exports_external.string().min(1).optional(),
27688
+ osRelease: exports_external.string().optional(),
27689
+ daemonVersion: exports_external.string().optional(),
27690
+ runtimeReport: CommunityMachineRuntimeListSchema.optional()
27691
+ });
27692
+ var CommunityDaemonActivateResponseSchema = exports_external.object({
27693
+ credential: exports_external.string(),
27694
+ machineId: exports_external.string(),
27695
+ expiresAt: exports_external.string().nullable(),
27696
+ sessionOutcome: exports_external.literal("committed")
27697
+ });
27698
+ var CommunityDaemonActivateErrorResponseSchema = exports_external.object({
27699
+ error: exports_external.string(),
27700
+ sessionOutcome: exports_external.enum(["not_committed", "unknown"])
27701
+ });
27702
+ var CommunityDaemonEnrollAgentRequestSchema = exports_external.object({
27703
+ agentId: exports_external.string().min(1).max(128)
27704
+ });
27705
+ var CommunityDaemonEnrollAgentResponseSchema = exports_external.object({
27706
+ runnerKey: exports_external.string(),
27707
+ expiresAt: exports_external.string().nullable()
27708
+ });
27709
+ var isMentionSafeName = (name) => validateCommunityName(name).ok;
27710
+ var MENTION_SAFE_NAME_MSG = "name cannot contain #, @, or line breaks";
27711
+ var BOT_AVATAR_ROUTE_PATTERN = /^\/api\/community\/bots\/[A-Za-z0-9_-]+\/avatar$/;
27712
+ var BotImageUrlSchema = exports_external.string().max(COMMUNITY_BOT_IMAGE_URL_MAX).refine((v) => v.startsWith("https://") || v.startsWith("avatar:") || BOT_AVATAR_ROUTE_PATTERN.test(v), {
27713
+ message: "image must be an https URL, the bot avatar route, or an avatar: config"
27714
+ });
27715
+ var CommunityBotCreateRequestSchema = exports_external.object({
27716
+ name: exports_external.string().trim().min(COMMUNITY_BOT_NAME_MIN).max(COMMUNITY_BOT_NAME_MAX).refine(isMentionSafeName, { message: MENTION_SAFE_NAME_MSG }),
27717
+ description: exports_external.string().max(COMMUNITY_BOT_DESCRIPTION_MAX).optional(),
27718
+ machineId: exports_external.string().min(1),
27719
+ runtime: exports_external.string().min(1),
27720
+ image: BotImageUrlSchema.optional(),
27721
+ model: exports_external.string().trim().min(1).max(100).nullable().optional()
27722
+ });
27723
+ var CommunityBotPatchRequestSchema = exports_external.object({
27724
+ name: exports_external.string().trim().min(COMMUNITY_BOT_NAME_MIN).max(COMMUNITY_BOT_NAME_MAX).refine(isMentionSafeName, { message: MENTION_SAFE_NAME_MSG }).optional(),
27725
+ description: exports_external.string().max(COMMUNITY_BOT_DESCRIPTION_MAX).optional(),
27726
+ image: BotImageUrlSchema.nullable().optional(),
27727
+ model: exports_external.string().trim().min(1).max(100).nullable().optional(),
27728
+ runtime: exports_external.string().trim().min(1).max(COMMUNITY_RUNTIME_ID_MAX).optional()
27729
+ }).refine((v) => v.name !== undefined || v.description !== undefined || v.image !== undefined || v.runtime !== undefined || ("model" in v), {
27730
+ message: "at least one field must be provided"
27731
+ });
27732
+ var CommunityBotAddToServerRequestSchema = exports_external.object({
27733
+ botId: exports_external.string().min(1)
27734
+ });
27735
+ var CommunityAgentMessageContentSchema = exports_external.object({ text: exports_external.string().max(MAX_MESSAGE_CONTENT_LENGTH).default("") }).catchall(exports_external.unknown());
27736
+ var CommunityAgentSeqSchema = exports_external.number().int().min(0);
27737
+ var CommunityAgentPositiveSeqSchema = exports_external.number().int().min(1);
27738
+ var CommunityAgentCursorSchema = exports_external.object({
27739
+ channel: exports_external.string().min(1),
27740
+ seq: CommunityAgentPositiveSeqSchema
27741
+ });
27742
+ var CommunityAgentSendRequestSchema = exports_external.object({
27743
+ channel: exports_external.string().min(1),
27744
+ content: CommunityAgentMessageContentSchema,
27745
+ attachments: exports_external.array(exports_external.string().min(1)).max(MAX_ATTACHMENTS_PER_MESSAGE).default([]),
27746
+ seenUpToSeq: CommunityAgentSeqSchema.optional(),
27747
+ replyToSeq: CommunityAgentPositiveSeqSchema.optional(),
27748
+ nonce: exports_external.string().min(1).max(128).optional()
27749
+ }).refine((d) => d.content.text.trim().length > 0 || d.attachments.length > 0, { message: "message must have text or attachments" });
27750
+ var CommunityAgentAttachmentUploadResponseSchema = exports_external.object({
27751
+ id: exports_external.string(),
27752
+ filename: exports_external.string(),
27753
+ contentType: exports_external.string(),
27754
+ size: exports_external.number(),
27755
+ hasThumbnail: exports_external.boolean().optional()
27756
+ });
27757
+ var CommunityAgentAttachmentDownloadRequestSchema = exports_external.object({
27758
+ id: exports_external.string().min(1)
27759
+ });
27760
+ var CommunityAgentUpdateProfileRequestSchema = exports_external.object({
27761
+ bio: exports_external.string().max(MAX_PROFILE_ABOUT_LENGTH).optional(),
27762
+ avatar: exports_external.object({
27763
+ filename: exports_external.string().min(1),
27764
+ contentType: exports_external.enum(ALLOWED_ICON_MIME_TYPES),
27765
+ data: exports_external.instanceof(Uint8Array).refine((value) => value.byteLength > 0, "avatar must not be empty").refine((value) => value.byteLength <= MAX_SERVER_ICON_SIZE_BYTES, `avatar must be ≤ ${MAX_SERVER_ICON_SIZE_BYTES} bytes`)
27766
+ }).optional()
27767
+ }).refine((value) => value.bio !== undefined || value.avatar !== undefined, {
27768
+ message: "bio or avatar is required"
27769
+ });
27770
+ var CommunityAgentInboxPullRequestSchema = exports_external.object({
27771
+ max: exports_external.number().int().min(1).max(200).optional()
27772
+ });
27773
+ var CommunityAgentAckRequestSchema = exports_external.object({
27774
+ cursors: exports_external.array(CommunityAgentCursorSchema).min(1)
27775
+ });
27776
+ var CommunityAgentReadRequestSchema = exports_external.object({
27777
+ channel: exports_external.string().min(1),
27778
+ before: CommunityAgentSeqSchema.optional(),
27779
+ after: CommunityAgentSeqSchema.optional(),
27780
+ around: CommunityAgentSeqSchema.optional(),
27781
+ limit: exports_external.number().int().min(1).max(200).optional()
27782
+ }).refine((v) => [v.before, v.after, v.around].filter((x) => x !== undefined).length <= 1, { message: "at most one of before/after/around may be supplied" });
27783
+ var CommunityAgentResolveRequestSchema = exports_external.object({
27784
+ channel: exports_external.string().min(1),
27785
+ seq: CommunityAgentSeqSchema
27786
+ });
27787
+ var CommunityAgentListChannelsRequestSchema = exports_external.object({
27788
+ server: exports_external.string().min(1).optional()
27789
+ });
27790
+ var CommunityAgentListMembersRequestSchema = exports_external.object({
27791
+ server: exports_external.string().min(1),
27792
+ limit: exports_external.number().int().positive().optional(),
27793
+ cursor: exports_external.string().min(1).optional()
27794
+ });
27795
+ var CommunityAgentChannelMemberRequestSchema = exports_external.object({
27796
+ channel: exports_external.string().min(1),
27797
+ agentId: exports_external.string().optional()
27798
+ });
27799
+ var CommunityAgentJoinServerRequestSchema = exports_external.object({
27800
+ invite: exports_external.string().min(1)
27801
+ });
27802
+ var CommunityAgentNapRequestSchema = exports_external.object({
27803
+ handoff: exports_external.string().refine((value) => value.trim().length > 0, {
27804
+ message: "handoff is required"
27805
+ })
27806
+ });
27807
+ var CommunityAgentReactAddRequestSchema = exports_external.object({
27808
+ channel: exports_external.string().min(1),
27809
+ seq: CommunityAgentPositiveSeqSchema,
27810
+ emoji: exports_external.string().min(1)
27811
+ });
27812
+ var CommunityAgentFriendRequestSchema = exports_external.object({
27813
+ username: exports_external.string().min(1)
27814
+ });
27815
+ var CommunityAgentListFriendsSchema = exports_external.object({});
27816
+ var AuditLogCliInvocationPayloadSchema = exports_external.object({
27817
+ subcommand: exports_external.string().min(1)
27818
+ });
27819
+ var AuditLogToolCallPayloadSchema = exports_external.object({
27820
+ name: exports_external.string().min(1),
27821
+ target: exports_external.string().max(240).optional()
27822
+ });
27823
+ var AuditLogThinkingPayloadSchema = exports_external.object({
27824
+ text: exports_external.string(),
27825
+ truncated: exports_external.boolean(),
27826
+ chars: exports_external.number().int().nonnegative()
27827
+ });
27828
+ var AuditLogWakeTriggerPayloadSchema = exports_external.object({
27829
+ messageId: exports_external.string().min(1),
27830
+ channel: exports_external.string().min(1),
27831
+ seq: CommunityAgentPositiveSeqSchema,
27832
+ senderId: exports_external.string().min(1),
27833
+ senderHandle: exports_external.string().min(1),
27834
+ reason: exports_external.enum(["unread", "mention"])
27835
+ });
27836
+ var AuditLogSessionResetPayloadSchema = exports_external.object({
27837
+ trigger: exports_external.enum(["single", "reset_all", "idle_timeout"])
27838
+ });
27839
+ var AuditLogNapPayloadSchema = exports_external.object({
27840
+ trigger: exports_external.literal("nap")
27841
+ });
27842
+ var AuditLogModelChangedPayloadSchema = exports_external.object({
27843
+ from: exports_external.string().nullable(),
27844
+ to: exports_external.string().nullable()
27845
+ });
27846
+ var AuditLogProviderChangedPayloadSchema = exports_external.object({
27847
+ from: exports_external.string().min(1),
27848
+ to: exports_external.string().min(1)
27849
+ });
27850
+ var AuditLogErrorPayloadSchema = exports_external.object({
27851
+ scope: exports_external.enum(["spawn", "runtime", "exit", "handshake_timeout", "model_switch", "reset"]),
27852
+ code: exports_external.string().min(1).max(120),
27853
+ message: exports_external.string().max(2048),
27854
+ model: exports_external.string().nullable()
27855
+ });
27856
+ var BotAuditEventSchema = exports_external.discriminatedUnion("kind", [
27857
+ exports_external.object({ kind: exports_external.literal("cli_invocation"), payload: AuditLogCliInvocationPayloadSchema }),
27858
+ exports_external.object({ kind: exports_external.literal("tool_call"), payload: AuditLogToolCallPayloadSchema }),
27859
+ exports_external.object({ kind: exports_external.literal("thinking"), payload: AuditLogThinkingPayloadSchema }),
27860
+ exports_external.object({ kind: exports_external.literal("wake_trigger"), payload: AuditLogWakeTriggerPayloadSchema }),
27861
+ exports_external.object({ kind: exports_external.literal("session_reset"), payload: AuditLogSessionResetPayloadSchema }),
27862
+ exports_external.object({ kind: exports_external.literal("nap"), payload: AuditLogNapPayloadSchema }),
27863
+ exports_external.object({ kind: exports_external.literal("model_changed"), payload: AuditLogModelChangedPayloadSchema }),
27864
+ exports_external.object({ kind: exports_external.literal("provider_changed"), payload: AuditLogProviderChangedPayloadSchema }),
27865
+ exports_external.object({ kind: exports_external.literal("error"), payload: AuditLogErrorPayloadSchema })
27866
+ ]);
27867
+ var BotAuditEventKindSchema = exports_external.enum([
27868
+ "cli_invocation",
27869
+ "tool_call",
27870
+ "thinking",
27871
+ "wake_trigger",
27872
+ "session_reset",
27873
+ "nap",
27874
+ "model_changed",
27875
+ "provider_changed",
27876
+ "error"
27877
+ ]);
27878
+ var HostBotAuditEventFrameSchema = exports_external.object({
27879
+ type: exports_external.literal("bot_audit_event"),
27880
+ eventId: exports_external.string().min(1).max(128).optional(),
27881
+ occurredAt: exports_external.string().datetime({ offset: true }).optional(),
27882
+ agentId: exports_external.string().min(1),
27883
+ sessionId: exports_external.string().nullable().optional(),
27884
+ launchId: exports_external.string().nullable().optional(),
27885
+ event: BotAuditEventSchema
27886
+ }).superRefine((frame, ctx) => {
27887
+ if (frame.event.kind === "session_reset" && frame.event.payload.trigger === "idle_timeout" && (!frame.eventId || !frame.occurredAt)) {
27888
+ if (!frame.eventId) {
27889
+ ctx.addIssue({
27890
+ code: "custom",
27891
+ path: ["eventId"],
27892
+ message: "eventId is required for idle_timeout session_reset"
27893
+ });
27894
+ }
27895
+ if (!frame.occurredAt) {
27896
+ ctx.addIssue({
27897
+ code: "custom",
27898
+ path: ["occurredAt"],
27899
+ message: "occurredAt is required for idle_timeout session_reset"
27900
+ });
27901
+ }
27902
+ }
27903
+ });
27904
+ var BotAuditEventAckFrameSchema = exports_external.strictObject({
27905
+ type: exports_external.literal("bot_audit_event_ack"),
27906
+ eventId: exports_external.string().min(1).max(128)
27907
+ });
27908
+ // ../shared/src/db/community-schema.ts
27909
+ var exports_community_schema = {};
27910
+ __export(exports_community_schema, {
27911
+ communityUserProfile: () => communityUserProfile,
27912
+ communityServerMember: () => communityServerMember,
27913
+ communityServerInvite: () => communityServerInvite,
27914
+ communityServerFolderItem: () => communityServerFolderItem,
27915
+ communityServerFolder: () => communityServerFolder,
27916
+ communityServer: () => communityServer,
27917
+ communityReadStateRevision: () => communityReadStateRevision,
27918
+ communityReadState: () => communityReadState,
27919
+ communityReaction: () => communityReaction,
27920
+ communityPin: () => communityPin,
27921
+ communityNotificationSetting: () => communityNotificationSetting,
27922
+ communityMessageTag: () => communityMessageTag,
27923
+ communityMessageSeq: () => communityMessageSeq,
27924
+ communityMessageMark: () => communityMessageMark,
27925
+ communityMessage: () => communityMessage,
27926
+ communityMention: () => communityMention,
27927
+ communityFriendship: () => communityFriendship,
27928
+ communityChannelMember: () => communityChannelMember,
27929
+ communityChannel: () => communityChannel,
27930
+ communityCategory: () => communityCategory,
27931
+ communityBotDailyActivity: () => communityBotDailyActivity,
27932
+ communityBotApprovalRequest: () => communityBotApprovalRequest,
27933
+ communityBotActivityEvent: () => communityBotActivityEvent,
27934
+ communityAttachment: () => communityAttachment
27935
+ });
27936
+ init_nanoid();
27937
+ var communityServer = sqliteTable("community_server", {
27938
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
27939
+ name: text("name").notNull(),
27940
+ discriminator: text("discriminator").notNull().default("0000"),
27941
+ description: text("description").default(""),
27942
+ icon: text("icon"),
27943
+ ownerId: text("owner_id").notNull().references(() => user.id, { onDelete: "restrict" }),
27944
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
27945
+ }, (t) => [
27946
+ uniqueIndex("idx_community_server_name_discriminator").on(t.name, t.discriminator)
27947
+ ]);
27948
+ var communityCategory = sqliteTable("community_category", {
27949
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
27950
+ serverId: text("server_id").notNull().references(() => communityServer.id, { onDelete: "cascade" }),
27951
+ name: text("name").notNull(),
27952
+ position: integer2("position").default(0),
27953
+ private: integer2("private").default(0),
27954
+ creatorId: text("creator_id").references(() => user.id, { onDelete: "set null" })
27955
+ }, (t) => [unique("uq_category_server_name").on(t.serverId, t.name)]);
27956
+ var communityChannel = sqliteTable("community_channel", {
27957
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
27958
+ serverId: text("server_id").references(() => communityServer.id, {
27959
+ onDelete: "cascade"
27960
+ }),
27961
+ categoryId: text("category_id").references(() => communityCategory.id, {
27962
+ onDelete: "set null"
27963
+ }),
27964
+ name: text("name"),
27965
+ type: text("type").notNull().default("text"),
27966
+ topic: text("topic").default(""),
27967
+ position: integer2("position").default(0),
27968
+ parentChannelId: text("parent_channel_id").references(() => communityChannel.id, {
27969
+ onDelete: "cascade"
27970
+ }),
27971
+ creatorId: text("creator_id").references(() => user.id, { onDelete: "set null" }),
27972
+ messageCount: integer2("message_count").default(0),
27973
+ archived: integer2("archived").default(0),
27974
+ parentMessageId: text("parent_message_id").references(() => communityMessage.id, {
27975
+ onDelete: "cascade"
27976
+ }),
27977
+ lastMessageAt: text("last_message_at"),
27978
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
27979
+ }, (t) => [
27980
+ index("idx_channel_server_position").on(t.serverId, t.position),
27981
+ index("idx_channel_server_last_message").on(t.serverId, t.lastMessageAt),
27982
+ index("idx_channel_parent").on(t.parentChannelId),
27983
+ index("idx_channel_forum_created").on(t.parentChannelId, desc(t.createdAt), desc(t.id)).where(and(eq(t.type, "thread"), eq(t.archived, 0), isNotNull(t.parentMessageId))),
27984
+ uniqueIndex("idx_channel_server_name").on(t.serverId, t.name).where(sql`parent_channel_id IS NULL`)
27985
+ ]);
27986
+ var communityChannelMember = sqliteTable("community_channel_member", {
27987
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
27988
+ channelId: text("channel_id").notNull().references(() => communityChannel.id, { onDelete: "cascade" }),
27989
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
27990
+ relation: text("relation").notNull().default("access"),
27991
+ source: text("source").notNull().default("added"),
27992
+ addedBy: text("added_by").references(() => user.id, { onDelete: "set null" }),
27993
+ addedAt: text("added_at").notNull().$defaultFn(() => new Date().toISOString())
27994
+ }, (t) => [
27995
+ unique("uq_channel_member").on(t.channelId, t.userId, t.relation),
27996
+ index("idx_channel_member_user").on(t.userId)
27997
+ ]);
27998
+ var communityMessage = sqliteTable("community_message", {
27999
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28000
+ authorId: text("author_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28001
+ content: text("content").notNull().default(""),
28002
+ type: text("type").notNull().default("default"),
28003
+ mentionType: text("mention_type"),
28004
+ replyToId: text("reply_to_id"),
28005
+ embeds: text("embeds"),
28006
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString()),
28007
+ channelId: text("channel_id").notNull().references(() => communityChannel.id, {
28008
+ onDelete: "cascade"
28009
+ }),
28010
+ seq: integer2("seq").notNull().default(0),
28011
+ friendshipId: text("friendship_id").references(() => communityFriendship.id, { onDelete: "set null" }),
28012
+ clientNonce: text("client_nonce")
28013
+ }, (t) => [
28014
+ index("idx_message_channel_created").on(t.channelId, t.createdAt),
28015
+ index("idx_message_channel_mention_created").on(t.channelId, t.mentionType, t.createdAt)
28016
+ ]);
28017
+ var communityMessageSeq = sqliteTable("community_message_seq", {
28018
+ channelId: text("channel_id").primaryKey().references(() => communityChannel.id, { onDelete: "cascade" }),
28019
+ nextSeq: integer2("next_seq").notNull()
28020
+ });
28021
+ var communityServerMember = sqliteTable("community_server_member", {
28022
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28023
+ serverId: text("server_id").notNull().references(() => communityServer.id, { onDelete: "cascade" }),
28024
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28025
+ role: text("role").default("member"),
28026
+ railOrder: integer2("rail_order").default(0),
28027
+ joinedAt: text("joined_at").notNull().$defaultFn(() => new Date().toISOString())
28028
+ }, (t) => [
28029
+ unique("uq_server_member_server_user").on(t.serverId, t.userId),
28030
+ index("idx_server_member_user").on(t.userId),
28031
+ index("idx_server_member_user_rail_order").on(t.userId, t.railOrder),
28032
+ index("idx_server_member_server_joined").on(t.serverId, t.joinedAt)
28033
+ ]);
28034
+ var communityServerFolder = sqliteTable("community_server_folder", {
28035
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28036
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28037
+ name: text("name").notNull(),
28038
+ position: integer2("position").default(0)
28039
+ }, (t) => [index("idx_server_folder_user_position").on(t.userId, t.position)]);
28040
+ var communityServerFolderItem = sqliteTable("community_server_folder_item", {
28041
+ folderId: text("folder_id").notNull().references(() => communityServerFolder.id, { onDelete: "cascade" }),
28042
+ serverId: text("server_id").notNull().references(() => communityServer.id, { onDelete: "cascade" }),
28043
+ position: integer2("position").default(0)
28044
+ }, (t) => [
28045
+ primaryKey({ columns: [t.folderId, t.serverId] }),
28046
+ index("idx_server_folder_item_folder_position").on(t.folderId, t.position)
28047
+ ]);
28048
+ var communityServerInvite = sqliteTable("community_server_invite", {
28049
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28050
+ serverId: text("server_id").notNull().references(() => communityServer.id, { onDelete: "cascade" }),
28051
+ createdBy: text("created_by").references(() => user.id, { onDelete: "set null" }),
28052
+ token: text("token").unique().notNull().$defaultFn(() => nanoid3(10)),
28053
+ maxUses: integer2("max_uses"),
28054
+ uses: integer2("uses").default(0),
28055
+ expiresAt: text("expires_at"),
28056
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28057
+ }, (t) => [index("idx_server_invite_server").on(t.serverId)]);
28058
+ var communityFriendship = sqliteTable("community_friendship", {
28059
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28060
+ requesterId: text("requester_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28061
+ addresseeId: text("addressee_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28062
+ status: text("status").notNull().default("pending"),
28063
+ needsOwnerApproval: text("needs_owner_approval").references(() => user.id),
28064
+ blockerId: text("blocker_id"),
28065
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString()),
28066
+ updatedAt: text("updated_at").notNull().$defaultFn(() => new Date().toISOString()),
28067
+ resolvedAt: text("resolved_at")
28068
+ }, (t) => [
28069
+ index("idx_friendship_addressee_status").on(t.addresseeId, t.status),
28070
+ index("idx_friendship_requester_status").on(t.requesterId, t.status)
28071
+ ]);
28072
+ var communityReadState = sqliteTable("community_read_state", {
28073
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28074
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28075
+ channelId: text("channel_id").notNull().references(() => communityChannel.id, {
28076
+ onDelete: "cascade"
28077
+ }),
28078
+ lastReadAt: text("last_read_at").notNull(),
28079
+ lastReadMessageId: text("last_read_message_id"),
28080
+ lastReadSeq: integer2("last_read_seq").notNull().default(0)
28081
+ }, (t) => [index("idx_read_state_user").on(t.userId)]);
28082
+ var communityReadStateRevision = sqliteTable("community_read_state_revision", {
28083
+ userId: text("user_id").primaryKey().references(() => user.id, { onDelete: "cascade" }),
28084
+ revision: integer2("revision").notNull().default(0)
28085
+ });
28086
+ var communityReaction = sqliteTable("community_reaction", {
28087
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28088
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28089
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28090
+ emoji: text("emoji").notNull(),
28091
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28092
+ }, (t) => [
28093
+ unique("uq_reaction_message_user_emoji").on(t.messageId, t.userId, t.emoji),
28094
+ index("idx_reaction_message").on(t.messageId)
28095
+ ]);
28096
+ var communityAttachment = sqliteTable("community_attachment", {
28097
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28098
+ messageId: text("message_id").references(() => communityMessage.id, {
28099
+ onDelete: "cascade"
28100
+ }),
28101
+ uploaderId: text("uploader_id").notNull(),
28102
+ targetId: text("target_id").notNull(),
28103
+ r2Key: text("r2_key").notNull(),
28104
+ thumbnailR2Key: text("thumbnail_r2_key"),
28105
+ filename: text("filename").notNull(),
28106
+ contentType: text("content_type"),
28107
+ size: integer2("size"),
28108
+ width: integer2("width"),
28109
+ height: integer2("height"),
28110
+ position: integer2("position"),
28111
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28112
+ }, (t) => [
28113
+ index("idx_attachment_message").on(t.messageId, t.position)
28114
+ ]);
28115
+ var communityPin = sqliteTable("community_pin", {
28116
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28117
+ channelId: text("channel_id").notNull().references(() => communityChannel.id, { onDelete: "cascade" }),
28118
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28119
+ pinnedBy: text("pinned_by").references(() => user.id, { onDelete: "set null" }),
28120
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28121
+ }, (t) => [
28122
+ unique("uq_pin_channel_message").on(t.channelId, t.messageId),
28123
+ index("idx_pin_channel").on(t.channelId)
28124
+ ]);
28125
+ var communityMention = sqliteTable("community_mention", {
28126
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28127
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28128
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28129
+ kind: text("kind").notNull().default("mention"),
28130
+ read: integer2("read").default(0)
28131
+ }, (t) => [
28132
+ index("idx_mention_user_read").on(t.userId, t.read),
28133
+ index("idx_mention_message").on(t.messageId)
28134
+ ]);
28135
+ var communityUserProfile = sqliteTable("community_user_profile", {
28136
+ userId: text("user_id").primaryKey().references(() => user.id, { onDelete: "cascade" }),
28137
+ aboutMe: text("about_me").default(""),
28138
+ bannerColor: text("banner_color"),
28139
+ statusEmoji: text("status_emoji"),
28140
+ statusText: text("status_text").default("")
28141
+ });
28142
+ var communityNotificationSetting = sqliteTable("community_notification_setting", {
28143
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28144
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28145
+ serverId: text("server_id").references(() => communityServer.id, {
28146
+ onDelete: "cascade"
28147
+ }),
28148
+ channelId: text("channel_id").references(() => communityChannel.id, {
28149
+ onDelete: "cascade"
28150
+ }),
28151
+ level: text("level").notNull().default("all")
28152
+ }, (t) => [index("idx_notification_setting_user").on(t.userId)]);
28153
+ var communityBotApprovalRequest = sqliteTable("community_bot_approval_request", {
28154
+ id: text("id").primaryKey().$defaultFn(() => "bar_" + nanoid3()),
28155
+ botId: text("bot_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28156
+ kind: text("kind").notNull(),
28157
+ serverId: text("server_id").references(() => communityServer.id, {
28158
+ onDelete: "cascade"
28159
+ }),
28160
+ requestedByUserId: text("requested_by_user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28161
+ dmMessageId: text("dm_message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28162
+ status: text("status").notNull().default("pending"),
28163
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString()),
28164
+ resolvedAt: text("resolved_at")
28165
+ }, (t) => [index("idx_community_bot_approval_bot").on(t.botId, t.status)]);
28166
+ var communityBotActivityEvent = sqliteTable("community_bot_activity_event", {
28167
+ id: text("id").primaryKey().$defaultFn(() => "bae_" + nanoid3()),
28168
+ botId: text("bot_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28169
+ sessionId: text("session_id"),
28170
+ launchId: text("launch_id"),
28171
+ kind: text("kind").notNull(),
28172
+ payload: text("payload").notNull(),
28173
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28174
+ }, (t) => [
28175
+ index("idx_bot_activity_event_bot_created").on(t.botId, t.createdAt, t.id)
28176
+ ]);
28177
+ var communityBotDailyActivity = sqliteTable("community_bot_daily_activity", {
28178
+ botId: text("bot_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28179
+ day: text("day").notNull(),
28180
+ handledCount: integer2("handled_count").notNull().default(0),
28181
+ sentCount: integer2("sent_count").notNull().default(0)
28182
+ }, (t) => [primaryKey({ columns: [t.botId, t.day] })]);
28183
+ var communityMessageMark = sqliteTable("community_message_mark", {
28184
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28185
+ userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
28186
+ channelId: text("channel_id").notNull().references(() => communityChannel.id, { onDelete: "cascade" }),
28187
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28188
+ createdAt: text("created_at").notNull().$defaultFn(() => new Date().toISOString())
28189
+ }, (t) => [
28190
+ unique("uq_mark_user_message").on(t.userId, t.messageId),
28191
+ index("idx_mark_user_created").on(t.userId, t.createdAt)
28192
+ ]);
28193
+ var communityMessageTag = sqliteTable("community_message_tag", {
28194
+ id: text("id").primaryKey().$defaultFn(() => nanoid3()),
28195
+ messageId: text("message_id").notNull().references(() => communityMessage.id, { onDelete: "cascade" }),
28196
+ tag: text("tag").notNull()
28197
+ }, (t) => [
28198
+ unique("uq_message_tag").on(t.messageId, t.tag),
28199
+ index("idx_message_tag_tag").on(t.tag, t.messageId)
28200
+ ]);
28201
+
28202
+ // ../shared/src/logger.ts
28203
+ var LEVELS = {
28204
+ debug: 0,
28205
+ info: 1,
28206
+ warn: 2,
28207
+ error: 3,
28208
+ silent: 4
28209
+ };
28210
+
28211
+ class Logger {
28212
+ service;
28213
+ level;
28214
+ pretty;
28215
+ fields;
28216
+ constructor(opts, fields) {
28217
+ this.service = opts.service;
28218
+ this.level = LEVELS[opts.level ?? "info"];
28219
+ this.pretty = opts.pretty ?? false;
28220
+ this.fields = fields ?? {};
28221
+ }
28222
+ debug(msg, ctx) {
28223
+ this.write("debug", msg, ctx);
28224
+ }
28225
+ info(msg, ctx) {
28226
+ this.write("info", msg, ctx);
28227
+ }
28228
+ warn(msg, ctx) {
28229
+ this.write("warn", msg, ctx);
28230
+ }
28231
+ error(msg, ctx) {
28232
+ this.write("error", msg, ctx);
28233
+ }
28234
+ child(fields) {
28235
+ const merged = { ...this.fields, ...fields };
28236
+ const child = new Logger({ service: this.service, level: this.levelName(), pretty: this.pretty }, merged);
28237
+ return child;
28238
+ }
28239
+ levelName() {
28240
+ for (const [name, num] of Object.entries(LEVELS)) {
28241
+ if (num === this.level)
28242
+ return name;
28243
+ }
28244
+ return "info";
28245
+ }
28246
+ write(level, msg, ctx) {
28247
+ if (LEVELS[level] < this.level)
28248
+ return;
28249
+ const entry = {
28250
+ level,
28251
+ msg,
28252
+ service: this.service,
28253
+ ...this.fields,
28254
+ ...ctx,
28255
+ ts: new Date().toISOString()
28256
+ };
28257
+ for (const [k, v] of Object.entries(entry)) {
28258
+ if (v instanceof Error) {
28259
+ entry[k] = { message: v.message, stack: v.stack };
28260
+ }
28261
+ }
28262
+ let line;
28263
+ if (this.pretty) {
28264
+ const ts = entry.ts.replace("T", " ").replace("Z", "");
28265
+ const lvl = entry.level.toUpperCase().padEnd(5);
28266
+ const pairs = Object.entries(entry).filter(([k]) => k !== "level" && k !== "msg" && k !== "service" && k !== "ts").map(([k, v]) => `${k}=${typeof v === "object" ? JSON.stringify(v) : v}`).join(" ");
28267
+ line = `${ts} ${lvl} [${entry.service}] ${entry.msg}${pairs ? " " + pairs : ""}`;
28268
+ } else {
28269
+ line = JSON.stringify(entry);
28270
+ }
28271
+ if (level === "error") {
28272
+ console.error(line);
28273
+ } else {
28274
+ console.log(line);
28275
+ }
28276
+ }
28277
+ }
28278
+ function createLogger2(opts) {
28279
+ return new Logger(opts);
28280
+ }
28281
+
28282
+ // ../shared/src/db/queries/_chunk.ts
28283
+ var D1_MAX_BIND_PARAMS = 100;
28284
+ function maxRowsPerInsert(paramsPerRow) {
28285
+ if (paramsPerRow < 1)
28286
+ throw new Error("paramsPerRow must be >= 1");
28287
+ return Math.floor(D1_MAX_BIND_PARAMS / paramsPerRow);
28288
+ }
28289
+
28290
+ // ../shared/src/db/queries/community/message.ts
28291
+ var log = createLogger2({ service: "community-queries" });
28292
+ var listedMessageProjection = {
28293
+ id: communityMessage.id,
28294
+ authorId: communityMessage.authorId,
28295
+ content: communityMessage.content,
28296
+ type: communityMessage.type,
28297
+ mentionType: communityMessage.mentionType,
28298
+ replyToId: communityMessage.replyToId,
28299
+ embeds: communityMessage.embeds,
28300
+ seq: communityMessage.seq,
28301
+ createdAt: communityMessage.createdAt,
28302
+ channelId: communityMessage.channelId,
28303
+ friendshipId: communityMessage.friendshipId,
28304
+ clientNonce: communityMessage.clientNonce,
28305
+ authorName: user.name,
28306
+ authorEmail: user.email,
28307
+ authorImage: user.image
28308
+ };
28309
+
28310
+ // ../shared/src/db/queries/user.ts
28311
+ var publicUserColumns = {
28312
+ id: user.id,
28313
+ name: user.name,
28314
+ email: user.email,
28315
+ emailVerified: user.emailVerified,
28316
+ image: user.image,
28317
+ createdAt: user.createdAt,
28318
+ updatedAt: user.updatedAt,
28319
+ discriminator: user.discriminator
28320
+ };
28321
+ var internalUserColumns = {
28322
+ ...publicUserColumns,
28323
+ isBot: user.isBot,
28324
+ ownerUserId: user.ownerUserId,
28325
+ deletedAt: user.deletedAt
28326
+ };
28327
+
28328
+ // ../shared/src/db/queries/community/channel.ts
28329
+ var CHANNEL_COLUMNS = {
28330
+ id: communityChannel.id,
28331
+ serverId: communityChannel.serverId,
28332
+ categoryId: communityChannel.categoryId,
28333
+ name: communityChannel.name,
28334
+ type: communityChannel.type,
28335
+ topic: communityChannel.topic,
28336
+ position: communityChannel.position,
28337
+ parentChannelId: communityChannel.parentChannelId,
28338
+ creatorId: communityChannel.creatorId,
28339
+ messageCount: communityChannel.messageCount,
28340
+ archived: communityChannel.archived,
28341
+ parentMessageId: communityChannel.parentMessageId,
28342
+ lastMessageAt: communityChannel.lastMessageAt,
28343
+ createdAt: communityChannel.createdAt
28344
+ };
28345
+
28346
+ // ../shared/src/db/queries/community/thread.ts
28347
+ var NOTIFY_CONFLICT_TARGET = [
28348
+ communityChannelMember.channelId,
28349
+ communityChannelMember.userId,
28350
+ communityChannelMember.relation
28351
+ ];
28352
+
28353
+ // ../shared/src/db/resilience.ts
28354
+ var defaultLogger = createLogger2({ service: "d1-resilience" });
28355
+
28356
+ // ../shared/src/db/queries/community/agent-inbox.ts
28357
+ var AGENT_MESSAGE_COLUMNS = {
28358
+ id: communityMessage.id,
28359
+ authorId: communityMessage.authorId,
28360
+ content: communityMessage.content,
28361
+ createdAt: communityMessage.createdAt,
28362
+ channelId: communityMessage.channelId,
28363
+ seq: communityMessage.seq,
28364
+ replyToId: communityMessage.replyToId
28365
+ };
28366
+ var channelJoinBaselineGuard = sql`${communityMessage.createdAt} > COALESCE(${communityChannelMember.addedAt}, ${communityServerMember.joinedAt}, '')`;
28367
+
28368
+ // ../shared/src/db/queries/community/mention.ts
28369
+ var MENTION_INSERT_MAX_ROWS = maxRowsPerInsert(5);
28370
+ // ../shared/src/community-ws-events.ts
28371
+ var string4 = exports_external.string();
28372
+ var nullableString = string4.nullable();
28373
+ var channelTypeSchema = exports_external.enum(["text", "forum"]);
28374
+ var mentionTypeSchema = exports_external.literal("everyone");
28375
+ var friendApprovalProfileSchema = exports_external.strictObject({
28376
+ id: string4,
28377
+ name: string4,
28378
+ discriminator: string4,
28379
+ image: nullableString
28380
+ });
28381
+ var FriendApprovalPayloadSchema = exports_external.strictObject({
28382
+ friendshipId: string4,
28383
+ status: exports_external.enum(["pending", "approved", "denied", "superseded", "cancelled"]),
28384
+ waitingOn: exports_external.enum(["you", "other-owner", "addressee"]).nullable(),
28385
+ otherProfile: friendApprovalProfileSchema,
28386
+ botProfile: friendApprovalProfileSchema,
28387
+ waitingOnProfile: friendApprovalProfileSchema.nullable().optional()
28388
+ });
28389
+ var messageAttachmentSchema = exports_external.strictObject({
28390
+ id: string4,
28391
+ filename: string4,
28392
+ url: string4,
28393
+ thumbnailUrl: string4.optional(),
28394
+ contentType: string4.optional(),
28395
+ size: exports_external.number().optional(),
28396
+ width: exports_external.number().nullable().optional(),
28397
+ height: exports_external.number().nullable().optional()
28398
+ });
28399
+ var messageSchema = exports_external.strictObject({
28400
+ id: string4,
28401
+ seq: exports_external.number(),
28402
+ authorId: string4,
28403
+ authorName: string4,
28404
+ authorAvatar: string4.optional(),
28405
+ content: string4,
28406
+ type: exports_external.enum(["chat", "system"]),
28407
+ systemKind: exports_external.literal("thread").optional(),
28408
+ mentionType: mentionTypeSchema.nullable().optional(),
28409
+ replyToId: nullableString.optional(),
28410
+ replyTo: exports_external.strictObject({
28411
+ id: string4,
28412
+ authorName: string4,
28413
+ text: string4,
28414
+ deleted: exports_external.boolean().optional()
28415
+ }).optional(),
28416
+ embeds: exports_external.array(exports_external.unknown()).optional(),
28417
+ attachments: exports_external.array(messageAttachmentSchema).optional(),
28418
+ createdAt: string4,
28419
+ clientNonce: string4.optional(),
28420
+ approval: FriendApprovalPayloadSchema.optional()
28421
+ });
28422
+ var communityMessageCreateSchema = exports_external.strictObject({
28423
+ type: exports_external.literal("community:message.create"),
28424
+ channelId: string4,
28425
+ serverId: string4.optional(),
28426
+ parentChannelId: string4.optional(),
28427
+ message: messageSchema
28428
+ });
28429
+ var communityMessageUpdatedSchema = exports_external.strictObject({
28430
+ type: exports_external.literal("community:message.updated"),
28431
+ channelId: string4,
28432
+ messageId: string4,
28433
+ approval: FriendApprovalPayloadSchema
28434
+ });
28435
+ var communityMessageEditedSchema = exports_external.strictObject({
28436
+ type: exports_external.literal("community:message.edited"),
28437
+ channelId: string4,
28438
+ messageId: string4,
28439
+ content: string4,
28440
+ parentChannelId: string4.optional(),
28441
+ serverId: string4.optional()
28442
+ }).refine((event) => event.parentChannelId === undefined || event.serverId !== undefined);
28443
+ var communityReactionAddSchema = exports_external.strictObject({
28444
+ type: exports_external.literal("community:reaction.add"),
28445
+ channelId: string4,
28446
+ messageId: string4,
28447
+ userId: string4,
28448
+ emoji: string4
28449
+ });
28450
+ var communityReactionRemoveSchema = exports_external.strictObject({
28451
+ type: exports_external.literal("community:reaction.remove"),
28452
+ channelId: string4,
28453
+ messageId: string4,
28454
+ userId: string4,
28455
+ emoji: string4
28456
+ });
28457
+ var communityPinAddSchema = exports_external.strictObject({
28458
+ type: exports_external.literal("community:pin.add"),
28459
+ channelId: string4,
28460
+ messageId: string4
28461
+ });
28462
+ var communityPinRemoveSchema = exports_external.strictObject({
28463
+ type: exports_external.literal("community:pin.remove"),
28464
+ channelId: string4,
28465
+ messageId: string4
28466
+ });
28467
+ var typingFields = {
28468
+ channelId: string4,
28469
+ userId: string4,
28470
+ name: string4.optional(),
28471
+ discriminator: string4.optional()
28472
+ };
28473
+ var communityTypingStartSchema = exports_external.strictObject({
28474
+ type: exports_external.literal("community:typing.start"),
28475
+ ...typingFields
28476
+ });
28477
+ var communityTypingStopSchema = exports_external.strictObject({
28478
+ type: exports_external.literal("community:typing.stop"),
28479
+ ...typingFields
28480
+ });
28481
+ var communityChildChannelCreateSchema = exports_external.strictObject({
28482
+ type: exports_external.literal("community:channel.child_create"),
28483
+ parentChannelId: string4,
28484
+ channel: exports_external.strictObject({
28485
+ id: string4,
28486
+ name: string4,
28487
+ type: exports_external.literal("thread"),
28488
+ creatorId: string4.optional(),
28489
+ createdAt: string4
28490
+ }),
28491
+ parentMessageId: string4.optional()
28492
+ });
28493
+ var communityChildChannelUpdateSchema = exports_external.strictObject({
28494
+ type: exports_external.literal("community:channel.child_update"),
28495
+ parentChannelId: string4,
28496
+ channelId: string4,
28497
+ changes: exports_external.strictObject({
28498
+ name: string4.optional(),
28499
+ archived: exports_external.boolean().optional(),
28500
+ tags: exports_external.array(string4).nullable().optional(),
28501
+ lastMessageAt: string4.optional(),
28502
+ messageCount: exports_external.number().optional()
28503
+ })
28504
+ });
28505
+ var communityServerUpdateSchema = exports_external.strictObject({
28506
+ type: exports_external.literal("community:server.update"),
28507
+ serverId: string4,
28508
+ changes: exports_external.strictObject({
28509
+ name: string4.optional(),
28510
+ description: string4.optional(),
28511
+ icon: nullableString.optional()
28512
+ })
28513
+ });
28514
+ var communityServerDeleteSchema = exports_external.strictObject({
28515
+ type: exports_external.literal("community:server.delete"),
28516
+ serverId: string4
28517
+ });
28518
+ var communityChannelCreateSchema = exports_external.strictObject({
28519
+ type: exports_external.literal("community:channel.create"),
28520
+ serverId: string4,
28521
+ channel: exports_external.strictObject({
28522
+ id: string4,
28523
+ name: string4,
28524
+ type: channelTypeSchema,
28525
+ categoryId: nullableString.optional(),
28526
+ topic: string4.optional(),
28527
+ position: exports_external.number(),
28528
+ createdAt: string4
28529
+ })
28530
+ });
28531
+ var communityChannelUpdateSchema = exports_external.strictObject({
28532
+ type: exports_external.literal("community:channel.update"),
28533
+ serverId: string4,
28534
+ channelId: string4,
28535
+ changes: exports_external.strictObject({
28536
+ name: string4.optional(),
28537
+ topic: string4.optional(),
28538
+ categoryId: nullableString.optional(),
28539
+ type: channelTypeSchema.optional()
28540
+ })
28541
+ });
28542
+ var communityChannelDeleteSchema = exports_external.strictObject({
28543
+ type: exports_external.literal("community:channel.delete"),
28544
+ serverId: string4,
28545
+ channelId: string4,
28546
+ parentChannelId: nullableString.optional(),
28547
+ parentMessageId: string4.optional()
28548
+ }).refine((event) => event.parentMessageId === undefined || typeof event.parentChannelId === "string" && event.parentChannelId.length > 0, { message: "parentMessageId requires parentChannelId" });
28549
+ var positionedIdSchema = exports_external.strictObject({ id: string4, position: exports_external.number() });
28550
+ var communityChannelReorderSchema = exports_external.strictObject({
28551
+ type: exports_external.literal("community:channel.reorder"),
28552
+ serverId: string4,
28553
+ channels: exports_external.array(positionedIdSchema)
28554
+ });
28555
+ var communityChannelMemberAddSchema = exports_external.strictObject({
28556
+ type: exports_external.literal("community:channel.member_add"),
28557
+ serverId: string4,
28558
+ channelId: string4,
28559
+ userId: string4
28560
+ });
28561
+ var communityChannelMemberRemoveSchema = exports_external.strictObject({
28562
+ type: exports_external.literal("community:channel.member_remove"),
28563
+ serverId: string4,
28564
+ channelId: string4,
28565
+ userId: string4
28566
+ });
28567
+ var communityCategoryCreateSchema = exports_external.strictObject({
28568
+ type: exports_external.literal("community:category.create"),
28569
+ serverId: string4,
28570
+ category: exports_external.strictObject({
28571
+ id: string4,
28572
+ name: string4,
28573
+ position: exports_external.number(),
28574
+ private: exports_external.boolean()
28575
+ })
28576
+ });
28577
+ var communityCategoryUpdateSchema = exports_external.strictObject({
28578
+ type: exports_external.literal("community:category.update"),
28579
+ serverId: string4,
28580
+ categoryId: string4,
28581
+ changes: exports_external.strictObject({
28582
+ name: string4.optional(),
28583
+ position: exports_external.number().optional(),
28584
+ private: exports_external.boolean().optional()
28585
+ })
28586
+ });
28587
+ var communityCategoryDeleteSchema = exports_external.strictObject({
28588
+ type: exports_external.literal("community:category.delete"),
28589
+ serverId: string4,
28590
+ categoryId: string4
28591
+ });
28592
+ var communityCategoryReorderSchema = exports_external.strictObject({
28593
+ type: exports_external.literal("community:category.reorder"),
28594
+ serverId: string4,
28595
+ categories: exports_external.array(positionedIdSchema)
28596
+ });
28597
+ var communityMemberJoinSchema = exports_external.strictObject({
28598
+ type: exports_external.literal("community:member.join"),
28599
+ serverId: string4,
28600
+ member: exports_external.strictObject({
28601
+ id: string4,
28602
+ userId: string4,
28603
+ name: string4,
28604
+ discriminator: string4,
28605
+ avatar: string4.optional(),
28606
+ role: string4,
28607
+ joinedAt: string4
28608
+ })
28609
+ });
28610
+ var communityMemberLeaveSchema = exports_external.strictObject({
28611
+ type: exports_external.literal("community:member.leave"),
28612
+ serverId: string4,
28613
+ userId: string4
28614
+ });
28615
+ var communityMemberUpdateSchema = exports_external.strictObject({
28616
+ type: exports_external.literal("community:member.update"),
28617
+ serverId: string4,
28618
+ memberId: string4,
28619
+ userId: string4.optional(),
28620
+ changes: exports_external.strictObject({
28621
+ role: string4.optional(),
28622
+ nickname: nullableString.optional()
28623
+ })
28624
+ });
28625
+ var communityFriendRequestSchema = exports_external.strictObject({
28626
+ type: exports_external.literal("community:friend.request"),
28627
+ friendship: exports_external.strictObject({
28628
+ id: string4,
28629
+ requesterId: string4,
28630
+ addresseeId: string4,
28631
+ status: exports_external.literal("pending"),
28632
+ createdAt: string4
28633
+ })
28634
+ });
28635
+ var friendshipIdFields = { friendshipId: string4 };
28636
+ var communityFriendAcceptSchema = exports_external.strictObject({
28637
+ type: exports_external.literal("community:friend.accept"),
28638
+ ...friendshipIdFields
28639
+ });
28640
+ var communityFriendRejectSchema = exports_external.strictObject({
28641
+ type: exports_external.literal("community:friend.reject"),
28642
+ ...friendshipIdFields
28643
+ });
28644
+ var communityFriendRemoveSchema = exports_external.strictObject({
28645
+ type: exports_external.literal("community:friend.remove"),
28646
+ ...friendshipIdFields
28647
+ });
28648
+ var communityFriendBlockSchema = exports_external.strictObject({
28649
+ type: exports_external.literal("community:friend.block"),
28650
+ userId: string4
28651
+ });
28652
+ var communityInviteCreateSchema = exports_external.strictObject({
28653
+ type: exports_external.literal("community:invite.create"),
28654
+ serverId: string4,
28655
+ invite: exports_external.strictObject({
28656
+ id: string4,
28657
+ token: string4,
28658
+ maxUses: exports_external.number().nullable().optional(),
28659
+ uses: exports_external.number().nullable().optional(),
28660
+ expiresAt: nullableString.optional(),
28661
+ createdAt: string4
28662
+ })
28663
+ });
28664
+ var communityMentionCreateSchema = exports_external.strictObject({
28665
+ type: exports_external.literal("community:mention.create"),
28666
+ userId: string4,
28667
+ messageId: string4,
28668
+ channelId: string4.optional(),
28669
+ authorName: string4
28670
+ });
28671
+ var communityUnreadBumpSchema = exports_external.strictObject({
28672
+ type: exports_external.literal("community:unread.bump"),
28673
+ userId: string4,
28674
+ channelId: string4,
28675
+ serverId: string4.optional(),
28676
+ railChannelId: string4.optional(),
28677
+ isMention: exports_external.boolean().optional()
28678
+ });
28679
+ var readStateEnvelopeFields = {
28680
+ revision: exports_external.number().int().positive(),
28681
+ inboxChanged: exports_external.literal(true)
28682
+ };
28683
+ var communityReadStateAdvancedSchema = exports_external.strictObject({
28684
+ type: exports_external.literal("community:read_state.advanced"),
28685
+ ...readStateEnvelopeFields
28686
+ });
28687
+ var communityInboxChangedSchema = exports_external.strictObject({
28688
+ type: exports_external.literal("community:inbox.changed"),
28689
+ ...readStateEnvelopeFields,
28690
+ reason: exports_external.enum([
28691
+ "read_all",
28692
+ "mention_read_all",
28693
+ "mention_dismiss",
28694
+ "notification_policy"
28695
+ ])
28696
+ });
28697
+ var communityPresenceUpdateSchema = exports_external.strictObject({
28698
+ type: exports_external.literal("community:presence.update"),
28699
+ userId: string4,
28700
+ online: exports_external.boolean()
28701
+ });
28702
+ var communityStatusUpdateSchema = exports_external.strictObject({
28703
+ type: exports_external.literal("community:status.update"),
28704
+ userId: string4,
28705
+ statusEmoji: nullableString,
28706
+ statusText: nullableString
28707
+ });
28708
+ var machineRuntimeSchema = CommunityMachineRuntimeSchema.strict();
28709
+ var CommunityMachineSummarySchema2 = exports_external.strictObject({
28710
+ id: string4,
28711
+ hostname: string4,
28712
+ displayName: string4,
28713
+ platform: string4,
28714
+ arch: string4,
28715
+ osRelease: string4,
28716
+ daemonVersion: string4,
28717
+ lastSeenAt: nullableString,
28718
+ status: exports_external.enum(["online", "offline"]),
28719
+ availableRuntimes: exports_external.array(machineRuntimeSchema),
28720
+ lastRuntimeError: exports_external.strictObject({
28721
+ requested: string4,
28722
+ available: exports_external.array(string4),
28723
+ at: string4
28724
+ }).optional(),
28725
+ createdAt: string4,
28726
+ updatedAt: string4
28727
+ });
28728
+ var communityMachineCreatedSchema = exports_external.strictObject({
28729
+ type: exports_external.literal("community:machine.created"),
28730
+ machine: CommunityMachineSummarySchema2,
28731
+ tokenId: string4
28732
+ });
28733
+ var communityMachineStatusSchema = exports_external.strictObject({
28734
+ type: exports_external.literal("community:machine.status"),
28735
+ machineId: string4,
28736
+ status: exports_external.enum(["online", "offline"]),
28737
+ lastSeenAt: string4
28738
+ });
28739
+ var communityMachineUpdatedSchema = exports_external.strictObject({
28740
+ type: exports_external.literal("community:machine.updated"),
28741
+ machine: CommunityMachineSummarySchema2
28742
+ });
28743
+ var communityMachineRemovedSchema = exports_external.strictObject({
28744
+ type: exports_external.literal("community:machine.removed"),
28745
+ machineId: string4
28746
+ });
28747
+ var communityBotAuditEventSchema = exports_external.strictObject({
28748
+ type: exports_external.literal("community:bot.audit_event"),
28749
+ botId: string4,
28750
+ id: string4,
28751
+ kind: exports_external.enum(["cli_invocation", "tool_call", "thinking", "wake_trigger", "session_reset", "nap", "model_changed", "provider_changed", "error"]),
28752
+ payload: exports_external.unknown(),
28753
+ sessionId: nullableString.optional(),
28754
+ launchId: nullableString.optional(),
28755
+ createdAt: string4
28756
+ }).refine((event) => Object.prototype.hasOwnProperty.call(event, "payload"));
28757
+ var CommunityWsEventDiscriminatedSchema = exports_external.discriminatedUnion("type", [
28758
+ communityMessageCreateSchema,
28759
+ communityMessageUpdatedSchema,
28760
+ communityMessageEditedSchema,
28761
+ communityReactionAddSchema,
28762
+ communityReactionRemoveSchema,
28763
+ communityPinAddSchema,
28764
+ communityPinRemoveSchema,
28765
+ communityTypingStartSchema,
28766
+ communityTypingStopSchema,
28767
+ communityChildChannelCreateSchema,
28768
+ communityChildChannelUpdateSchema,
28769
+ communityServerUpdateSchema,
28770
+ communityServerDeleteSchema,
28771
+ communityChannelCreateSchema,
28772
+ communityChannelUpdateSchema,
28773
+ communityChannelDeleteSchema,
28774
+ communityChannelReorderSchema,
28775
+ communityChannelMemberAddSchema,
28776
+ communityChannelMemberRemoveSchema,
28777
+ communityCategoryCreateSchema,
28778
+ communityCategoryUpdateSchema,
28779
+ communityCategoryDeleteSchema,
28780
+ communityCategoryReorderSchema,
28781
+ communityMemberJoinSchema,
28782
+ communityMemberLeaveSchema,
28783
+ communityMemberUpdateSchema,
28784
+ communityFriendRequestSchema,
28785
+ communityFriendAcceptSchema,
28786
+ communityFriendRejectSchema,
28787
+ communityFriendRemoveSchema,
28788
+ communityFriendBlockSchema,
28789
+ communityInviteCreateSchema,
28790
+ communityMentionCreateSchema,
28791
+ communityUnreadBumpSchema,
28792
+ communityReadStateAdvancedSchema,
28793
+ communityInboxChangedSchema,
28794
+ communityPresenceUpdateSchema,
28795
+ communityStatusUpdateSchema,
28796
+ communityMachineCreatedSchema,
28797
+ communityMachineStatusSchema,
28798
+ communityMachineUpdatedSchema,
28799
+ communityMachineRemovedSchema,
28800
+ communityBotAuditEventSchema
28801
+ ]);
28802
+ var CommunityWsEventSchema = CommunityWsEventDiscriminatedSchema.transform((event) => event);
28803
+ var WS_EVENTS = {
28804
+ MESSAGE_CREATE: "community:message.create",
28805
+ MESSAGE_UPDATED: "community:message.updated",
28806
+ MESSAGE_EDITED: "community:message.edited",
28807
+ REACTION_ADD: "community:reaction.add",
28808
+ REACTION_REMOVE: "community:reaction.remove",
28809
+ PIN_ADD: "community:pin.add",
28810
+ PIN_REMOVE: "community:pin.remove",
28811
+ TYPING_START: "community:typing.start",
28812
+ TYPING_STOP: "community:typing.stop",
28813
+ CHILD_CHANNEL_CREATE: "community:channel.child_create",
28814
+ CHILD_CHANNEL_UPDATE: "community:channel.child_update",
28815
+ SERVER_UPDATE: "community:server.update",
28816
+ SERVER_DELETE: "community:server.delete",
28817
+ CHANNEL_CREATE: "community:channel.create",
28818
+ CHANNEL_UPDATE: "community:channel.update",
28819
+ CHANNEL_DELETE: "community:channel.delete",
28820
+ CHANNEL_REORDER: "community:channel.reorder",
28821
+ CHANNEL_MEMBER_ADD: "community:channel.member_add",
28822
+ CHANNEL_MEMBER_REMOVE: "community:channel.member_remove",
28823
+ CATEGORY_CREATE: "community:category.create",
28824
+ CATEGORY_UPDATE: "community:category.update",
28825
+ CATEGORY_DELETE: "community:category.delete",
28826
+ CATEGORY_REORDER: "community:category.reorder",
28827
+ MEMBER_JOIN: "community:member.join",
28828
+ MEMBER_LEAVE: "community:member.leave",
28829
+ MEMBER_UPDATE: "community:member.update",
28830
+ FRIEND_REQUEST: "community:friend.request",
28831
+ FRIEND_ACCEPT: "community:friend.accept",
28832
+ FRIEND_REJECT: "community:friend.reject",
28833
+ FRIEND_REMOVE: "community:friend.remove",
28834
+ FRIEND_BLOCK: "community:friend.block",
28835
+ INVITE_CREATE: "community:invite.create",
28836
+ MENTION_CREATE: "community:mention.create",
28837
+ UNREAD_BUMP: "community:unread.bump",
28838
+ READ_STATE_ADVANCED: "community:read_state.advanced",
28839
+ INBOX_CHANGED: "community:inbox.changed",
28840
+ PRESENCE_UPDATE: "community:presence.update",
28841
+ STATUS_UPDATE: "community:status.update",
28842
+ MACHINE_CREATED: "community:machine.created",
28843
+ MACHINE_STATUS: "community:machine.status",
28844
+ MACHINE_UPDATED: "community:machine.updated",
28845
+ MACHINE_REMOVED: "community:machine.removed",
28846
+ BOT_AUDIT_EVENT: "community:bot.audit_event"
28847
+ };
28848
+ var COMMUNITY_EVENT_TYPES = new Set(Object.values(WS_EVENTS));
28849
+ var COMMUNITY_BROWSER_EVENT_MAX_BYTES = 65536;
28850
+ var COMMUNITY_USER_TARGET_MAX_BYTES = 128;
28851
+ function utf8ByteLength(value) {
28852
+ return new TextEncoder().encode(value).byteLength;
28853
+ }
28854
+ function isWellFormedUnicode(value) {
28855
+ for (let index2 = 0;index2 < value.length; index2 += 1) {
28856
+ const codeUnit = value.charCodeAt(index2);
28857
+ if (codeUnit >= 55296 && codeUnit <= 56319) {
28858
+ const next = value.charCodeAt(index2 + 1);
28859
+ if (!Number.isInteger(next) || next < 56320 || next > 57343)
28860
+ return false;
28861
+ index2 += 1;
28862
+ } else if (codeUnit >= 56320 && codeUnit <= 57343) {
28863
+ return false;
28864
+ }
28865
+ }
28866
+ return true;
28867
+ }
28868
+ function isValidCommunityUserTarget(value) {
28869
+ return typeof value === "string" && value.length > 0 && isWellFormedUnicode(value) && utf8ByteLength(value) <= COMMUNITY_USER_TARGET_MAX_BYTES;
28870
+ }
28871
+
28872
+ // ../shared/src/community-message-delivery.ts
28873
+ var MESSAGE_DELIVERY_MAX_USERS = 1000;
28874
+ var MESSAGE_DELIVERY_MAX_EVENTS_PER_USER = 5;
28875
+ var target = exports_external.string().refine(isValidCommunityUserTarget);
28876
+ var targetList = exports_external.array(target).max(MESSAGE_DELIVERY_MAX_USERS);
28877
+ var memberAddedSchema = exports_external.strictObject({
28878
+ userId: target,
28879
+ serverId: exports_external.string().min(1),
28880
+ channelId: exports_external.string().min(1)
28881
+ });
28882
+ var batchShape = exports_external.strictObject({
28883
+ messageId: exports_external.string().min(1),
28884
+ messageEvent: exports_external.unknown(),
28885
+ contentUserIds: targetList,
28886
+ unreadPlainUserIds: targetList,
28887
+ unreadMentionUserIds: targetList,
28888
+ mentionUserIds: targetList,
28889
+ memberAdded: memberAddedSchema.optional(),
28890
+ parentProjection: exports_external.unknown().optional(),
28891
+ parentProjectionUserIds: targetList.optional()
28892
+ });
28893
+ // ../shared/src/community/bot-activity-presets.ts
28894
+ var BOT_ACTIVITY_PRESETS = {
28895
+ idle: { emoji: "\uD83D\uDCA4", text: "Idle" },
28896
+ starting: { emoji: "\uD83C\uDF00", text: "Waking up" },
28897
+ stopping: { emoji: "\uD83C\uDF19", text: "Wrapping up" }
28898
+ };
28899
+ var RUNNING_PRESETS = [
28900
+ { emoji: "⚡", text: "Working on it" },
28901
+ { emoji: "\uD83D\uDEE0️", text: "Cooking" },
28902
+ { emoji: "\uD83E\uDDE0", text: "Thinking hard" },
28903
+ { emoji: "\uD83D\uDD27", text: "Tinkering" },
28904
+ { emoji: "\uD83D\uDE80", text: "On it" },
28905
+ { emoji: "\uD83D\uDD25", text: "In the zone" }
28906
+ ];
28907
+ var BOT_ACTIVITY_STATUS_PAIRS = [
28908
+ BOT_ACTIVITY_PRESETS.idle,
28909
+ BOT_ACTIVITY_PRESETS.starting,
28910
+ BOT_ACTIVITY_PRESETS.stopping,
28911
+ ...RUNNING_PRESETS
28912
+ ];
28913
+ // ../shared/src/community-ws-bundle.ts
28914
+ var COMMUNITY_BROWSER_EVENT_BATCH_ENVELOPE_BYTES = 1024;
28915
+ var COMMUNITY_BROWSER_EVENT_BATCH_MAX_BYTES = MESSAGE_DELIVERY_MAX_EVENTS_PER_USER * COMMUNITY_BROWSER_EVENT_MAX_BYTES + COMMUNITY_BROWSER_EVENT_BATCH_ENVELOPE_BYTES;
28916
+ // ../shared/src/db/index.ts
28917
+ var allSchema = { ...exports_schema, ...exports_community_schema, ...exports_community_machine_schema };
28918
+ // ../shared/src/db/queries/task.ts
28919
+ var DEFAULT_STALE_SECONDS = Number(process.env.ALOOK_STALE_DISPATCH_TIMEOUT_S) || 20;
28920
+ var DEFAULT_STALE_RUNNING_SECONDS = Number(process.env.ALOOK_STALE_RUNNING_TIMEOUT_S) || 3600;
28921
+ // ../shared/src/utils/email.ts
28922
+ var DOMAIN = `@${process.env.ALOOK_DOMAIN || "alook.ai"}`;
28923
+ var RESERVED_HANDLES = new Set([
28924
+ "no-reply",
28925
+ "noreply",
28926
+ "admin",
28927
+ "support",
28928
+ "help",
28929
+ "info",
28930
+ "postmaster",
28931
+ "abuse",
28932
+ "security",
28933
+ "mailer-daemon",
28934
+ "root",
28935
+ "webmaster",
28936
+ "hostmaster",
28937
+ "system",
28938
+ "alook"
28939
+ ]);
28940
+ // ../shared/src/db/queries/community/search.ts
28941
+ var FTS_KEYWORDS = new Set(["and", "or", "not", "near"]);
28942
+ // ../shared/src/db/queries/community/server-folder.ts
28943
+ var FOLDER_ITEM_INSERT_MAX_ROWS = maxRowsPerInsert(3);
28944
+ // ../shared/src/db/queries/community/diagnostic-report.ts
28945
+ var diagnosticOwner = alias(user, "diagnostic_owner");
26828
28946
  // src/manager/wakeCoordinator.ts
26829
28947
  class WakeCoordinator {
26830
28948
  agents = new Map;
@@ -27110,6 +29228,7 @@ var DEFAULT_PING_INTERVAL_MS = 15000;
27110
29228
  var DEFAULT_PONG_TIMEOUT_MS = 30000;
27111
29229
  var DEFAULT_RECONNECT_BASE_MS = 500;
27112
29230
  var DEFAULT_RECONNECT_MAX_MS = 30000;
29231
+ var DEFAULT_AUDIT_ACK_RETRY_MS = 5000;
27113
29232
  function describeErr(err) {
27114
29233
  return err instanceof Error ? err.message : String(err);
27115
29234
  }
@@ -27125,8 +29244,10 @@ class WsControlChannel {
27125
29244
  closedByUser = false;
27126
29245
  authRejected = false;
27127
29246
  pingTimer = null;
29247
+ auditRetryTimer = null;
27128
29248
  pongDeadline = 0;
27129
29249
  resyncProvider = null;
29250
+ pendingBotAuditEvents = new Map;
27130
29251
  log;
27131
29252
  wakeCoordinator = new WakeCoordinator;
27132
29253
  constructor(opts) {
@@ -27144,6 +29265,7 @@ class WsControlChannel {
27144
29265
  close() {
27145
29266
  this.closedByUser = true;
27146
29267
  this.clearHeartbeat();
29268
+ this.clearAuditRetry();
27147
29269
  this.ws?.close();
27148
29270
  this.ws = null;
27149
29271
  this.statusValue = "closed";
@@ -27201,8 +29323,27 @@ class WsControlChannel {
27201
29323
  this.sendFrame({ type: "agent_typing_stop", ...info });
27202
29324
  }
27203
29325
  async reportBotAuditEvent(frame) {
29326
+ if (frame.event.kind === "session_reset" && frame.event.payload.trigger === "idle_timeout") {
29327
+ if (!frame.eventId || !frame.occurredAt) {
29328
+ this.log.error("durable idle-reset audit missing local receipt", {
29329
+ agentId: frame.agentId
29330
+ });
29331
+ return;
29332
+ }
29333
+ this.pendingBotAuditEvents.set(frame.eventId, frame);
29334
+ this.sendFrame(frame);
29335
+ this.scheduleAuditRetry();
29336
+ return;
29337
+ }
27204
29338
  this.sendFrame(frame);
27205
29339
  }
29340
+ restorePendingBotAuditEvent(frame) {
29341
+ if (!frame.eventId || !frame.occurredAt)
29342
+ return;
29343
+ this.pendingBotAuditEvents.set(frame.eventId, frame);
29344
+ this.sendFrame(frame);
29345
+ this.scheduleAuditRetry();
29346
+ }
27206
29347
  async reportWakeAck(info) {
27207
29348
  this.wakeCoordinator.recordDeliveryAck(info.agentId, info.launchId, info.status);
27208
29349
  this.sendFrame({ type: "agent_wake_ack", ...info });
@@ -27229,10 +29370,14 @@ class WsControlChannel {
27229
29370
  const liveActivities = activities ?? [];
27230
29371
  for (const a of liveActivities)
27231
29372
  this.sendFrame({ type: "agent_activity", ...a });
29373
+ for (const frame of this.pendingBotAuditEvents.values())
29374
+ this.sendFrame(frame);
29375
+ this.scheduleAuditRetry();
27232
29376
  this.log.info("resync sent", {
27233
29377
  ready: ready.runtimeReport.length,
27234
29378
  sessions: sessions.length,
27235
- activities: liveActivities.length
29379
+ activities: liveActivities.length,
29380
+ pendingAuditEvents: this.pendingBotAuditEvents.size
27236
29381
  });
27237
29382
  }
27238
29383
  for (const hook of this.resyncHooks) {
@@ -27275,6 +29420,34 @@ class WsControlChannel {
27275
29420
  this.opts.onAuthRejected?.();
27276
29421
  return;
27277
29422
  }
29423
+ const auditAck = BotAuditEventAckFrameSchema.safeParse(frame);
29424
+ if (auditAck.success) {
29425
+ this.attempt = 0;
29426
+ const pending = this.pendingBotAuditEvents.get(auditAck.data.eventId);
29427
+ if (!pending)
29428
+ return;
29429
+ let durableCleared = this.opts.onBotAuditEventAck === undefined;
29430
+ try {
29431
+ durableCleared = this.opts.onBotAuditEventAck?.({
29432
+ agentId: pending.agentId,
29433
+ eventId: auditAck.data.eventId
29434
+ }) ?? true;
29435
+ } catch (err) {
29436
+ this.log.warn("bot audit ack local clear threw", {
29437
+ eventId: auditAck.data.eventId,
29438
+ err: describeErr(err)
29439
+ });
29440
+ }
29441
+ if (durableCleared)
29442
+ this.pendingBotAuditEvents.delete(auditAck.data.eventId);
29443
+ else
29444
+ this.log.warn("bot audit ack local clear deferred", { eventId: auditAck.data.eventId });
29445
+ if (this.pendingBotAuditEvents.size === 0)
29446
+ this.clearAuditRetry();
29447
+ else
29448
+ this.scheduleAuditRetry();
29449
+ return;
29450
+ }
27278
29451
  this.attempt = 0;
27279
29452
  this.ingestCommand(frame).catch((err) => {
27280
29453
  this.log.warn("command ingress failed", { type: frame.type, err: describeErr(err) });
@@ -27349,6 +29522,7 @@ class WsControlChannel {
27349
29522
  onSocketClosed(code, reason) {
27350
29523
  this.log.warn("control channel closed", { code, reason: reason ? String(reason) : "" });
27351
29524
  this.clearHeartbeat();
29525
+ this.clearAuditRetry();
27352
29526
  this.ws = null;
27353
29527
  if (this.closedByUser)
27354
29528
  return;
@@ -27396,6 +29570,26 @@ class WsControlChannel {
27396
29570
  this.pingTimer = null;
27397
29571
  }
27398
29572
  }
29573
+ scheduleAuditRetry() {
29574
+ if (this.auditRetryTimer || this.pendingBotAuditEvents.size === 0)
29575
+ return;
29576
+ const delayMs = this.opts.auditAckRetryMs ?? DEFAULT_AUDIT_ACK_RETRY_MS;
29577
+ this.auditRetryTimer = setTimeout(() => {
29578
+ this.auditRetryTimer = null;
29579
+ if (this.statusValue === "open") {
29580
+ for (const frame of this.pendingBotAuditEvents.values())
29581
+ this.sendFrame(frame);
29582
+ }
29583
+ this.scheduleAuditRetry();
29584
+ }, delayMs);
29585
+ this.auditRetryTimer.unref?.();
29586
+ }
29587
+ clearAuditRetry() {
29588
+ if (!this.auditRetryTimer)
29589
+ return;
29590
+ clearTimeout(this.auditRetryTimer);
29591
+ this.auditRetryTimer = null;
29592
+ }
27399
29593
  now() {
27400
29594
  return this.opts.now ? this.opts.now() : Date.now();
27401
29595
  }
@@ -27471,11 +29665,13 @@ var TIMELINE_READ_CHUNK_BYTES = 65536;
27471
29665
  var DATE_FILENAME_PATTERN = /^\d{4}-\d{2}-\d{2}\.jsonl$/;
27472
29666
  var RESUME_CONTROL_FILENAME = ".resume-control.json";
27473
29667
  var RESUME_CONTROL_MAX_BYTES = 4096;
29668
+ var MAX_PENDING_IDLE_RESET_EVENTS = 32;
27474
29669
  var EMPTY_RESUME_CONTROL = {
27475
29670
  version: 1,
27476
29671
  attemptedSessionId: null,
27477
29672
  fencedSessionId: null,
27478
- fullBarrier: null
29673
+ fullBarrier: null,
29674
+ pendingIdleResetEvents: []
27479
29675
  };
27480
29676
  function isBarrier(entry) {
27481
29677
  return entry.system !== undefined;
@@ -27624,7 +29820,7 @@ function scanTimelineFile(filePath) {
27624
29820
  const stat = fs7.fstatSync(fd);
27625
29821
  if (!stat.isFile())
27626
29822
  return null;
27627
- const chunk = Buffer.allocUnsafe(TIMELINE_READ_CHUNK_BYTES);
29823
+ const chunk2 = Buffer.allocUnsafe(TIMELINE_READ_CHUNK_BYTES);
27628
29824
  const newest = [];
27629
29825
  let retainedBytes = 0;
27630
29826
  let overflowed = false;
@@ -27698,11 +29894,11 @@ function scanTimelineFile(filePath) {
27698
29894
  };
27699
29895
  let position = stat.size;
27700
29896
  while (position > 0 && !stop) {
27701
- const start = Math.max(0, position - chunk.length);
29897
+ const start = Math.max(0, position - chunk2.length);
27702
29898
  const requested = position - start;
27703
29899
  let count = 0;
27704
29900
  while (count < requested) {
27705
- const read = fs7.readSync(fd, chunk, count, requested - count, start + count);
29901
+ const read = fs7.readSync(fd, chunk2, count, requested - count, start + count);
27706
29902
  if (read <= 0)
27707
29903
  break;
27708
29904
  count += read;
@@ -27711,15 +29907,15 @@ function scanTimelineFile(filePath) {
27711
29907
  return null;
27712
29908
  let segmentEnd = count;
27713
29909
  for (let index2 = count - 1;index2 >= 0; index2--) {
27714
- if (chunk[index2] !== 10)
29910
+ if (chunk2[index2] !== 10)
27715
29911
  continue;
27716
- finishPhysicalLine(chunk.subarray(index2 + 1, segmentEnd));
29912
+ finishPhysicalLine(chunk2.subarray(index2 + 1, segmentEnd));
27717
29913
  segmentEnd = index2;
27718
29914
  if (stop)
27719
29915
  break;
27720
29916
  }
27721
29917
  if (!stop && segmentEnd > 0)
27722
- addPart(chunk.subarray(0, segmentEnd));
29918
+ addPart(chunk2.subarray(0, segmentEnd));
27723
29919
  position = start;
27724
29920
  }
27725
29921
  if (!stop && position === 0 && (parts.length > 0 || oversized) && !discardIncompleteTail) {
@@ -27865,7 +30061,8 @@ function readResumeControlState(timelineDir) {
27865
30061
  const raw = bounded.subarray(0, bytesRead).toString("utf8");
27866
30062
  const value = JSON.parse(raw);
27867
30063
  const validSessionId = (candidate) => candidate === null || typeof candidate === "string" && candidate.length > 0 && candidate.length <= 512;
27868
- if (value.version !== 1 || !validSessionId(value.attemptedSessionId) || !validSessionId(value.fencedSessionId) || value.fullBarrier !== null && value.fullBarrier !== "reset_session" && value.fullBarrier !== "nap")
30064
+ const pendingIdleResetEvents = value.pendingIdleResetEvents === undefined ? [] : value.pendingIdleResetEvents;
30065
+ if (value.version !== 1 || !validSessionId(value.attemptedSessionId) || !validSessionId(value.fencedSessionId) || !Array.isArray(pendingIdleResetEvents) || pendingIdleResetEvents.length > MAX_PENDING_IDLE_RESET_EVENTS || pendingIdleResetEvents.some((event) => !event || typeof event !== "object" || typeof event.eventId !== "string" || event.eventId.length < 1 || event.eventId.length > 128 || typeof event.occurredAt !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(event.occurredAt) || !Number.isFinite(Date.parse(event.occurredAt))) || new Set(pendingIdleResetEvents.map((event) => event.eventId)).size !== pendingIdleResetEvents.length || value.fullBarrier !== null && value.fullBarrier !== "reset_session" && value.fullBarrier !== "nap")
27869
30066
  return { kind: "invalid" };
27870
30067
  return {
27871
30068
  kind: "state",
@@ -27873,7 +30070,8 @@ function readResumeControlState(timelineDir) {
27873
30070
  version: 1,
27874
30071
  attemptedSessionId: value.attemptedSessionId,
27875
30072
  fencedSessionId: value.fencedSessionId,
27876
- fullBarrier: value.fullBarrier
30073
+ fullBarrier: value.fullBarrier,
30074
+ pendingIdleResetEvents
27877
30075
  }
27878
30076
  };
27879
30077
  } catch {
@@ -27896,11 +30094,14 @@ function updateResumeControlState(timelineDir, update) {
27896
30094
  const current = readResumeControlState(timelineDir);
27897
30095
  const base = current.kind === "state" ? current.state : EMPTY_RESUME_CONTROL;
27898
30096
  const next = update({ ...base });
30097
+ if (!Array.isArray(next.pendingIdleResetEvents) || next.pendingIdleResetEvents.length > MAX_PENDING_IDLE_RESET_EVENTS || next.pendingIdleResetEvents.some((event) => !event || typeof event !== "object" || typeof event.eventId !== "string" || event.eventId.length < 1 || event.eventId.length > 128 || typeof event.occurredAt !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(event.occurredAt) || !Number.isFinite(Date.parse(event.occurredAt))) || new Set(next.pendingIdleResetEvents.map((event) => event.eventId)).size !== next.pendingIdleResetEvents.length)
30098
+ return false;
27899
30099
  const canonical = {
27900
30100
  version: 1,
27901
30101
  attemptedSessionId: next.attemptedSessionId,
27902
30102
  fencedSessionId: next.fencedSessionId,
27903
- fullBarrier: next.fullBarrier
30103
+ fullBarrier: next.fullBarrier,
30104
+ pendingIdleResetEvents: next.pendingIdleResetEvents
27904
30105
  };
27905
30106
  const body = JSON.stringify(canonical) + `
27906
30107
  `;
@@ -28564,7 +30765,7 @@ function createTimelineRecorder(opts) {
28564
30765
  clearSessionStall(agentId, sessionId) {
28565
30766
  return appendStallMarker(agentId, "stall_recovery_clear", sessionId);
28566
30767
  },
28567
- forgetSession(agentId, barrierType = "reset_session", forgottenSessionId) {
30768
+ forgetSession(agentId, barrierType = "reset_session", forgottenSessionId, pendingIdleResetEvent) {
28568
30769
  retryPending(agentId);
28569
30770
  const dir = dirFor(agentId);
28570
30771
  if (!prepareTimelineDirectory(dir))
@@ -28576,7 +30777,8 @@ function createTimelineRecorder(opts) {
28576
30777
  ...state,
28577
30778
  attemptedSessionId: null,
28578
30779
  fencedSessionId: null,
28579
- fullBarrier: barrierType
30780
+ fullBarrier: barrierType,
30781
+ pendingIdleResetEvents: pendingIdleResetEvent && !state.pendingIdleResetEvents.some(({ eventId }) => eventId === pendingIdleResetEvent.eventId) ? [...state.pendingIdleResetEvents, pendingIdleResetEvent] : state.pendingIdleResetEvents
28580
30782
  }));
28581
30783
  } else if (barrierType === "stall_recovery") {
28582
30784
  persisted = updateResumeControlState(dir, (state) => ({
@@ -28607,6 +30809,19 @@ function createTimelineRecorder(opts) {
28607
30809
  const result = appendTrackedEntry(dir, createSystemEntry(barrierType, stamp.toISOString(), forgottenSessionId), stamp);
28608
30810
  handleTrackedResult(agentId, null, result);
28609
30811
  return true;
30812
+ },
30813
+ pendingIdleResetEvents(agentId) {
30814
+ const state = readResumeControlState(dirFor(agentId));
30815
+ return state.kind === "state" ? state.state.pendingIdleResetEvents.map((event) => ({ ...event })) : [];
30816
+ },
30817
+ acknowledgeIdleResetEvent(agentId, eventId) {
30818
+ const dir = dirFor(agentId);
30819
+ if (!prepareTimelineDirectory(dir))
30820
+ return false;
30821
+ return updateResumeControlState(dir, (state) => ({
30822
+ ...state,
30823
+ pendingIdleResetEvents: state.pendingIdleResetEvents.filter((event) => event.eventId !== eventId)
30824
+ }));
28610
30825
  }
28611
30826
  };
28612
30827
  function appendStallMarker(agentId, type, sessionId) {
@@ -28633,8 +30848,8 @@ import * as fs8 from "fs";
28633
30848
  import { fileURLToPath } from "url";
28634
30849
  function resolveAlookCliPath(moduleDir) {
28635
30850
  const thisDir = moduleDir ?? path9.dirname(fileURLToPath(import.meta.url));
28636
- const target = path9.basename(thisDir) === "dist" ? path9.resolve(thisDir, "cli", "index.js") : path9.resolve(thisDir, "..", "scripts", "alook-shim.mjs");
28637
- return fs8.existsSync(target) ? target : null;
30851
+ const target2 = path9.basename(thisDir) === "dist" ? path9.resolve(thisDir, "cli", "index.js") : path9.resolve(thisDir, "..", "scripts", "alook-shim.mjs");
30852
+ return fs8.existsSync(target2) ? target2 : null;
28638
30853
  }
28639
30854
  function deriveCliFallbackCandidates(cliPath) {
28640
30855
  if (!cliPath)
@@ -29204,18 +31419,18 @@ function createBuiltinDaemonSessionFactory(onRuntimeRawLine) {
29204
31419
  };
29205
31420
  }
29206
31421
  async function createDaemon(opts) {
29207
- const log = opts.logger ?? createLogger({ header: "@alook/daemon" });
31422
+ const log2 = opts.logger ?? createLogger({ header: "@alook/daemon" });
29208
31423
  const fallbackBase = (process.env.ALOOK_PROJECT_ROOT || `${homedir4()}/.alook`) + "/daemon";
29209
31424
  const workingDirectoryBase = opts.workingDirectoryBase ?? fallbackBase;
29210
31425
  const workdirFor = (agentId) => `${workingDirectoryBase}/${agentId}`;
29211
31426
  sweepTimelineHistory(workingDirectoryBase).catch(() => {
29212
- log.warn("timeline startup sweep failed");
31427
+ log2.warn("timeline startup sweep failed");
29213
31428
  });
29214
31429
  const resolvedCliPath = resolveAlookCliPathWithFallback(opts.agentCliPath);
29215
31430
  const onRuntimeRawLine = createRuntimeRawLineTap({
29216
31431
  traceDir: opts.fsmTraceDir,
29217
31432
  enabledAgentIds: parseRuntimeRawTraceAgentIds(process.env[RUNTIME_RAW_TRACE_AGENT_IDS_ENV]),
29218
- logger: log
31433
+ logger: log2
29219
31434
  });
29220
31435
  const timeline2 = createTimelineRecorder({
29221
31436
  timelineDirFor: (agentId) => `${workdirFor(agentId)}/.context_timeline`,
@@ -29231,6 +31446,8 @@ async function createDaemon(opts) {
29231
31446
  const emitBotAuditEvent = (agentId, event, context) => {
29232
31447
  channelRef?.reportBotAuditEvent?.({
29233
31448
  type: "bot_audit_event",
31449
+ ...context?.eventId ? { eventId: context.eventId } : {},
31450
+ ...context?.occurredAt ? { occurredAt: context.occurredAt } : {},
29234
31451
  agentId,
29235
31452
  sessionId: context?.sessionId ?? null,
29236
31453
  launchId: context?.launchId ?? null,
@@ -29252,7 +31469,7 @@ async function createDaemon(opts) {
29252
31469
  }
29253
31470
  },
29254
31471
  onInboxPullObservationError: ({ agentId, reason, contentEncoding }) => {
29255
- log.warn("inbox pull timeline observation failed", { agentId, reason, contentEncoding });
31472
+ log2.warn("inbox pull timeline observation failed", { agentId, reason, contentEncoding });
29256
31473
  },
29257
31474
  onMessageReminderArm: (input) => reminderSchedulerRef?.arm(input) ?? { armed: false, reason: "reminder_scheduler_unavailable" },
29258
31475
  onProxyRequest: (agentId, method, pathname) => {
@@ -29309,6 +31526,7 @@ async function createDaemon(opts) {
29309
31526
  typingTracker.clear(agentId);
29310
31527
  }
29311
31528
  const botsById = new Map;
31529
+ let botCacheReady = false;
29312
31530
  async function listMyBotsHttp() {
29313
31531
  const res = await fetch(`${opts.serverUrl}/api/community/daemon/bots`, {
29314
31532
  method: "GET",
@@ -29319,23 +31537,28 @@ async function createDaemon(opts) {
29319
31537
  const json2 = await res.json();
29320
31538
  return json2.bots ?? [];
29321
31539
  }
31540
+ function replaceBotCache(bots) {
31541
+ botsById.clear();
31542
+ for (const b of bots) {
31543
+ botsById.set(b.id, {
31544
+ name: b.name,
31545
+ discriminator: b.discriminator,
31546
+ description: b.description,
31547
+ ownerName: b.ownerName,
31548
+ ownerDiscriminator: b.ownerDiscriminator
31549
+ });
31550
+ restorePendingIdleResetEvents(b.id);
31551
+ }
31552
+ botCacheReady = true;
31553
+ }
29322
31554
  async function coldStartWarmup() {
29323
31555
  const start = Date.now();
29324
31556
  let attempt = 0;
29325
31557
  while (Date.now() - start < WARMUP_CEILING_MS) {
29326
31558
  try {
29327
31559
  const bots = await listMyBotsHttp();
29328
- botsById.clear();
29329
- for (const b of bots) {
29330
- botsById.set(b.id, {
29331
- name: b.name,
29332
- discriminator: b.discriminator,
29333
- description: b.description,
29334
- ownerName: b.ownerName,
29335
- ownerDiscriminator: b.ownerDiscriminator
29336
- });
29337
- }
29338
- log.info("cold-start bot-cache warmup succeeded", { bots: bots.length, attempt });
31560
+ replaceBotCache(bots);
31561
+ log2.info("cold-start bot-cache warmup succeeded", { bots: bots.length, attempt });
29339
31562
  return;
29340
31563
  } catch {
29341
31564
  const delay3 = WARMUP_BACKOFF_MS[Math.min(attempt, WARMUP_BACKOFF_MS.length - 1)];
@@ -29343,7 +31566,7 @@ async function createDaemon(opts) {
29343
31566
  attempt++;
29344
31567
  }
29345
31568
  }
29346
- log.warn("cold-start bot-cache warmup exhausted its ceiling", { ceilingMs: WARMUP_CEILING_MS, attempts: attempt });
31569
+ log2.warn("cold-start bot-cache warmup exhausted its ceiling", { ceilingMs: WARMUP_CEILING_MS, attempts: attempt });
29347
31570
  }
29348
31571
  async function resyncPendingWakes() {
29349
31572
  try {
@@ -29354,9 +31577,9 @@ async function createDaemon(opts) {
29354
31577
  if (!res.ok)
29355
31578
  throw new Error(`resync-wakes ${res.status}`);
29356
31579
  const json2 = await res.json();
29357
- log.info("wake resync completed", { attempted: json2.attempted ?? 0 });
31580
+ log2.info("wake resync completed", { attempted: json2.attempted ?? 0 });
29358
31581
  } catch (err) {
29359
- log.warn("wake resync failed", { err: err instanceof Error ? err.message : String(err) });
31582
+ log2.warn("wake resync failed", { err: err instanceof Error ? err.message : String(err) });
29360
31583
  }
29361
31584
  }
29362
31585
  async function resyncPendingDiagnostics() {
@@ -29368,13 +31591,13 @@ async function createDaemon(opts) {
29368
31591
  if (!res.ok)
29369
31592
  throw new Error(`resync-diagnostics ${res.status}`);
29370
31593
  const json2 = await res.json();
29371
- log.info("diagnostics resync completed", {
31594
+ log2.info("diagnostics resync completed", {
29372
31595
  pending: json2.pending ?? 0,
29373
31596
  attempted: json2.attempted ?? 0,
29374
31597
  ambiguous: json2.ambiguous ?? 0
29375
31598
  });
29376
31599
  } catch (err) {
29377
- log.warn("diagnostics resync failed", { err: err instanceof Error ? err.message : String(err) });
31600
+ log2.warn("diagnostics resync failed", { err: err instanceof Error ? err.message : String(err) });
29378
31601
  }
29379
31602
  }
29380
31603
  const enrollAgent = async (agentId) => {
@@ -29406,11 +31629,11 @@ async function createDaemon(opts) {
29406
31629
  return json2.runnerKey;
29407
31630
  } catch (err) {
29408
31631
  if (err instanceof UnknownBotError || err instanceof BotEnrollFailedError) {
29409
- log.warn("agent enroll failed", { agentId, err: err.message });
31632
+ log2.warn("agent enroll failed", { agentId, err: err.message });
29410
31633
  throw err;
29411
31634
  }
29412
31635
  const wrapped = new BotEnrollFailedError(agentId, err);
29413
- log.warn("agent enroll failed", { agentId, err: wrapped.message });
31636
+ log2.warn("agent enroll failed", { agentId, err: wrapped.message });
29414
31637
  throw wrapped;
29415
31638
  }
29416
31639
  };
@@ -29419,9 +31642,23 @@ async function createDaemon(opts) {
29419
31642
  headers: { Authorization: `Bearer ${opts.machineKey}` },
29420
31643
  webSocketFactory: opts.webSocketFactory,
29421
31644
  onAuthRejected: opts.onAuthRejected,
29422
- logger: log.child("ws")
31645
+ onBotAuditEventAck: ({ agentId, eventId }) => timeline2.acknowledgeIdleResetEvent(agentId, eventId),
31646
+ logger: log2.child("ws")
29423
31647
  });
29424
31648
  channelRef = channel2;
31649
+ function restorePendingIdleResetEvents(agentId) {
31650
+ for (const pending of timeline2.pendingIdleResetEvents(agentId)) {
31651
+ channel2.restorePendingBotAuditEvent({
31652
+ type: "bot_audit_event",
31653
+ eventId: pending.eventId,
31654
+ occurredAt: pending.occurredAt,
31655
+ agentId,
31656
+ sessionId: null,
31657
+ launchId: null,
31658
+ event: { kind: "session_reset", payload: { trigger: "idle_timeout" } }
31659
+ });
31660
+ }
31661
+ }
29425
31662
  function handleBotFrame(cmd) {
29426
31663
  switch (cmd.type) {
29427
31664
  case "bot:added":
@@ -29432,7 +31669,8 @@ async function createDaemon(opts) {
29432
31669
  ownerName: cmd.ownerName,
29433
31670
  ownerDiscriminator: cmd.ownerDiscriminator
29434
31671
  });
29435
- log.debug("bot:added", { botId: cmd.botId, name: cmd.name });
31672
+ restorePendingIdleResetEvents(cmd.botId);
31673
+ log2.debug("bot:added", { botId: cmd.botId, name: cmd.name });
29436
31674
  break;
29437
31675
  case "bot:updated": {
29438
31676
  const prev = botsById.get(cmd.botId);
@@ -29445,7 +31683,7 @@ async function createDaemon(opts) {
29445
31683
  });
29446
31684
  const nameChanged = prev && prev.name !== cmd.name;
29447
31685
  const descChanged = prev && (prev.description ?? "") !== (cmd.description ?? "");
29448
- log.debug("bot:updated", { botId: cmd.botId, name: cmd.name });
31686
+ log2.debug("bot:updated", { botId: cmd.botId, name: cmd.name });
29449
31687
  if (nameChanged || descChanged) {
29450
31688
  manager.stop(cmd.botId);
29451
31689
  }
@@ -29454,7 +31692,7 @@ async function createDaemon(opts) {
29454
31692
  case "bot:removed":
29455
31693
  botsById.delete(cmd.botId);
29456
31694
  enrolledKeys.delete(cmd.botId);
29457
- log.debug("bot:removed", { botId: cmd.botId });
31695
+ log2.debug("bot:removed", { botId: cmd.botId });
29458
31696
  manager.stop(cmd.botId);
29459
31697
  break;
29460
31698
  default:
@@ -29542,7 +31780,7 @@ async function createDaemon(opts) {
29542
31780
  timeline: timeline2,
29543
31781
  wakePromptFooter: "Use `alook inbox pull` to read your messages.",
29544
31782
  stampWakePromptTime: true,
29545
- logger: log.child("manager")
31783
+ logger: log2.child("manager")
29546
31784
  });
29547
31785
  managerRef = manager;
29548
31786
  manager.start();
@@ -29555,7 +31793,14 @@ async function createDaemon(opts) {
29555
31793
  const statusPath = opts.statusFilePath;
29556
31794
  const writeStatus = () => {
29557
31795
  const nowMs = Date.now();
29558
- writeStatusFile(statusPath, { writtenAt: nowMs, agents: manager.statusProjection(nowMs) });
31796
+ writeStatusFile(statusPath, {
31797
+ writtenAt: nowMs,
31798
+ agentSummary: {
31799
+ total: botCacheReady ? botsById.size : null,
31800
+ running: manager.runningAgentCount()
31801
+ },
31802
+ agents: manager.statusProjection(nowMs)
31803
+ });
29559
31804
  };
29560
31805
  writeStatus();
29561
31806
  statusTimer = setInterval(writeStatus, STATUS_WRITE_INTERVAL_MS);
@@ -29575,20 +31820,12 @@ async function createDaemon(opts) {
29575
31820
  osRelease: opts.osRelease,
29576
31821
  daemonVersion: opts.daemonVersion,
29577
31822
  typingTracker,
29578
- logger: log.child("router"),
31823
+ logger: log2.child("router"),
29579
31824
  onBeforeAgent: async (agentId) => {
29580
31825
  if (!botsById.has(agentId)) {
29581
31826
  try {
29582
31827
  const bots = await listMyBotsHttp();
29583
- for (const b of bots) {
29584
- botsById.set(b.id, {
29585
- name: b.name,
29586
- discriminator: b.discriminator,
29587
- description: b.description,
29588
- ownerName: b.ownerName,
29589
- ownerDiscriminator: b.ownerDiscriminator
29590
- });
29591
- }
31828
+ replaceBotCache(bots);
29592
31829
  } catch {}
29593
31830
  }
29594
31831
  if (!botsById.has(agentId)) {