eve-hub 0.6.62 → 0.6.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +1 -1
  3. package/world.mjs +36 -24
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # eve-hub
2
2
 
3
+ ## 0.6.64
4
+
5
+ ### Patch Changes
6
+
7
+ - Hosted hub: who takes part in a thread is read with one index seek per bot, not by reading every message in it, so a send or a fold costs the bots in the thread; the reads the feed, sweep and runner polls repeat now use indexes and cost what is waiting, not what the workspace holds.
8
+
9
+ ## 0.6.63
10
+
11
+ ### Patch Changes
12
+
13
+ - Hosted hub: the state snapshot reads about a fifth of the rows (the last-turn, cache-gap, visibility and queue reads were rewritten), with the same state.
14
+
3
15
  ## 0.6.62
4
16
 
5
17
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve-hub",
3
- "version": "0.6.62",
3
+ "version": "0.6.64",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Bot-side code shared by every hub agent: registry tools, the roster hook, the eve channel, the host sandbox and browser, and model helpers.",
6
6
  "type": "module",
package/world.mjs CHANGED
@@ -20178,14 +20178,14 @@ function eventStatements(threadId2, event, text, at, id = eventId(), only) {
20178
20178
  }
20179
20179
 
20180
20180
  // ../../hosted-hub/src/store/routing.ts
20181
- var THREAD_REFS = 3;
20182
- var threadArgs = (threadId2, ...rest) => [...Array(THREAD_REFS).fill(threadId2), ...rest];
20183
- var PARTICIPANTS = (thread, except = "''") => `SELECT bot FROM (
20184
- SELECT bot, created_at AS at, 0 AS leave, NULL AS mid FROM sessions WHERE thread_id = ${thread}
20185
- UNION ALL SELECT author, created_at, 0, id FROM messages WHERE thread_id = ${thread} AND author_kind = 'agent'
20186
- UNION ALL SELECT json_extract(event, '$.agent'), created_at, json_extract(event, '$.kind') = 'leave', id FROM messages
20187
- WHERE thread_id = ${thread} AND author_kind = 'event' AND json_extract(event, '$.kind') IN ('join', 'leave'))
20188
- GROUP BY bot HAVING MAX(CASE WHEN NOT leave AND mid IS NOT ${except} THEN at END) > COALESCE(MAX(CASE WHEN leave THEN at END), -1)`;
20181
+ var PARTICIPANTS = (thread, except = "''") => `SELECT b.name AS bot FROM bots b, (SELECT ${thread} AS t, ${except} AS x) p WHERE MAX(
20182
+ COALESCE((SELECT created_at FROM sessions WHERE thread_id = p.t AND bot = b.name ORDER BY created_at DESC LIMIT 1), -2),
20183
+ COALESCE((SELECT created_at FROM messages WHERE thread_id = p.t AND author = b.name AND author_kind = 'agent' AND id IS NOT p.x ORDER BY created_at DESC LIMIT 1), -2),
20184
+ COALESCE((SELECT created_at FROM messages WHERE thread_id = p.t AND author_kind = 'event' AND json_extract(event, '$.agent') = +b.name AND json_extract(event, '$.kind') = 'join'
20185
+ AND id IS NOT p.x ORDER BY created_at DESC LIMIT 1), -2))
20186
+ > COALESCE((SELECT created_at FROM messages WHERE thread_id = p.t AND author_kind = 'event' AND json_extract(event, '$.agent') = +b.name AND json_extract(event, '$.kind') = 'leave'
20187
+ ORDER BY created_at DESC LIMIT 1), -1)`;
20188
+ var NOT_IN_BEFORE = `NOT EXISTS (SELECT 1 FROM (${PARTICIPANTS("?", "?")}) WHERE bot = ?)`;
20189
20189
  var hasJoins = (threadId2) => !threadId2.startsWith("dm-") && !threadId2.startsWith("sch-");
20190
20190
  function routingStatements(messageId2, threadId2, bots, now, { by, joins }, held = {}, steer = false) {
20191
20191
  const quiet2 = !joins || !hasJoins(threadId2);
@@ -20198,7 +20198,7 @@ function routingStatements(messageId2, threadId2, bots, now, { by, joins }, held
20198
20198
  `@${bot} joined${by !== bot ? ` (added by @${by})` : ""}`,
20199
20199
  now,
20200
20200
  eventId(),
20201
- s(`${fresh} AND NOT EXISTS (SELECT 1 FROM (${PARTICIPANTS("?")}) WHERE bot = ?)`, messageId2, ...threadArgs(threadId2), bot)
20201
+ s(`${fresh} AND NOT EXISTS (SELECT 1 FROM (${PARTICIPANTS("?")}) WHERE bot = ?)`, messageId2, threadId2, bot)
20202
20202
  ),
20203
20203
  s(`INSERT OR IGNORE INTO sessions (id,thread_id,bot,created_at) SELECT ?,?,?,? WHERE ${fresh}`, sessionId(), threadId2, bot, now, messageId2),
20204
20204
  s(
@@ -20243,6 +20243,7 @@ var LEASE_LEFT = `SELECT l.setup_failed_until - ${NOW_MS} AS ms FROM local_runne
20243
20243
 
20244
20244
  // ../../hosted-hub/src/store/schema.ts
20245
20245
  var OPEN_TURN_STATUSES = "('streaming','cancelling')";
20246
+ var UNSETTLED_DELIVERIES = "unsettled AS MATERIALIZED (SELECT rowid AS rid, * FROM deliveries WHERE accepted_at IS NULL AND failed_at IS NULL AND revoked_at IS NULL)";
20246
20247
 
20247
20248
  // mention-tokens.mjs
20248
20249
  function codeRanges(text) {
@@ -27221,11 +27222,11 @@ var SESSION_WORK_DELIVERY = `busy.accepted_at IS NOT NULL AND busy.failed_at IS
27221
27222
  WHERE td.delivery_id = busy.id AND t.status NOT IN ('streaming','cancelling'))`;
27222
27223
  var SESSION_BUSY = `s.ended_at IS NULL AND EXISTS (SELECT 1 FROM deliveries busy
27223
27224
  WHERE busy.session_id = s.id AND ${SESSION_WORK_DELIVERY})`;
27224
- var PENDING_FROM = `SELECT d.id, d.message_id, d.session_id, d.bot, m.thread_id, t.title, m.author, m.author_kind, m.text, m.status, m.status_from, m.metadata, d.steer,
27225
+ var PENDING_FROM = `WITH ${UNSETTLED_DELIVERIES} SELECT d.id, d.message_id, d.session_id, d.bot, m.thread_id, t.title, m.author, m.author_kind, m.text, m.status, m.status_from, m.metadata, d.steer,
27225
27226
  EXISTS (SELECT 1 FROM deliveries a WHERE a.session_id = d.session_id AND a.accepted_at IS NOT NULL) AS session_started,
27226
27227
  s.ended_at IS NOT NULL AS session_ended, ${onLocal("d.bot")} AS on_local,
27227
27228
  (SELECT json_group_array(json_object('id', a.upload_id, 'name', a.name, 'size', a.size)) FROM (SELECT * FROM message_attachments WHERE message_id = m.id ORDER BY position) a) AS attachments
27228
- FROM deliveries d JOIN messages m ON m.id = d.message_id JOIN threads t ON t.id = m.thread_id JOIN sessions s ON s.id = d.session_id`;
27229
+ FROM unsettled d JOIN messages m ON m.id = d.message_id JOIN threads t ON t.id = m.thread_id JOIN sessions s ON s.id = d.session_id`;
27229
27230
  var UNSETTLED = `d.accepted_at IS NULL AND d.failed_at IS NULL AND d.revoked_at IS NULL AND d.held_at IS NULL AND NOT ${heldByHopLimit("m")}`;
27230
27231
  var TASK_CARD = `(SELECT CASE WHEN json_array_length(json_extract(t.activity, '$.taskCard.tasks')) > 0 THEN json_extract(t.activity, '$.taskCard') END
27231
27232
  FROM turns t WHERE t.id = m.turn_id AND m.author_kind = 'agent' AND t.status NOT IN ${OPEN_TURN_STATUSES}
@@ -27258,29 +27259,40 @@ function handedBack({ session, roster, asked = [], posted = [], notify }, text,
27258
27259
  if ([text, ...posted].some((t) => mentionTokens(t).some((name) => name !== me && known.has(name)))) return [];
27259
27260
  return [...new Set(asked.filter((a) => (a.linked || named.has(a.id)) && a.author !== session.bot && roster.includes(a.author) && mentionTokens(a.text).includes(me)).map((a) => a.author))];
27260
27261
  }
27261
- var FOLD_STATE_SQL = `SELECT s.id, s.thread_id, s.bot, COALESCE(f.folded_index, -1) AS folded_index, (SELECT json_group_array(name) FROM (SELECT name FROM bots WHERE ${inRoster} ORDER BY position)) AS roster,
27262
- (SELECT json_group_array(bot) FROM (${PARTICIPANTS("s.thread_id")})) AS participants,
27263
- (SELECT d.message_id FROM deliveries d WHERE d.bot = s.bot AND d.held_at IS NOT NULL AND d.held_paused IS NOT 1 AND d.accepted_at IS NULL AND d.failed_at IS NULL AND d.revoked_at IS NULL ORDER BY d.rowid LIMIT 1) AS held,
27264
- (SELECT json_group_array(json_object('id', dd.id, 'author', m.author, 'text', m.text, 'linked', EXISTS (SELECT 1 FROM turn_deliveries td JOIN turns t ON t.id = td.turn_id WHERE td.delivery_id = dd.id AND t.status IN ${OPEN_TURN_STATUSES})))
27265
- FROM deliveries dd JOIN messages m ON m.id = dd.message_id WHERE dd.session_id = s.id AND m.author_kind = 'agent'
27266
- AND (EXISTS (SELECT 1 FROM turn_deliveries td JOIN turns t ON t.id = td.turn_id WHERE td.delivery_id = dd.id AND t.status IN ${OPEN_TURN_STATUSES}) OR NOT EXISTS (SELECT 1 FROM turn_deliveries td WHERE td.delivery_id = dd.id))) AS asked,
27267
- (SELECT json_group_array(p.text) FROM messages p WHERE p.turn_id = (SELECT t.id FROM turns t WHERE t.session_id = s.id AND t.status IN ${OPEN_TURN_STATUSES} ORDER BY t.started_at DESC LIMIT 1)
27268
- AND p.author = s.bot AND p.author_kind = 'agent' AND p.status IS NULL) AS posted,
27269
- (SELECT p.id FROM messages p WHERE p.turn_id = (SELECT t.id FROM turns t WHERE t.session_id = s.id AND t.status IN ${OPEN_TURN_STATUSES} ORDER BY t.started_at DESC LIMIT 1)
27270
- AND p.author = s.bot AND p.author_kind = 'agent' AND p.status IS NULL ORDER BY p.created_at DESC, p.rowid DESC LIMIT 1) AS last_post,
27262
+ var FOLD_STATE_SQL = `SELECT * FROM (WITH sess AS (SELECT * FROM sessions WHERE id = ?), ${UNSETTLED_DELIVERIES}
27263
+ SELECT s.id, s.thread_id, s.bot, COALESCE(f.folded_index, -1) AS folded_index, (SELECT json_group_array(name) FROM (SELECT name FROM bots WHERE ${inRoster} ORDER BY position)) AS roster,
27264
+ (SELECT d.message_id FROM unsettled d WHERE d.bot = s.bot AND d.held_at IS NOT NULL AND d.held_paused IS NOT 1 ORDER BY d.rid LIMIT 1) AS held,
27271
27265
  (SELECT json_object('person', person, 'names', json(names)) FROM human_notify) AS notify,
27272
27266
  (SELECT json_object('status', t.status, 'id', t.id, 'text', t.reply_text, 'lastStep', json(t.last_step), 'activity', json(t.activity),
27273
27267
  'trigger', ${triggerOf("t")}) FROM turns t WHERE t.session_id = s.id AND t.status IN ${OPEN_TURN_STATUSES}
27274
27268
  ORDER BY t.started_at DESC LIMIT 1) AS open_turn,
27275
27269
  (SELECT json_object('to', c.report_to, 'trigger', c.report_trigger, 'before', c.report_before, 'title', (SELECT title FROM threads WHERE id = s.thread_id))
27276
27270
  FROM compactions c WHERE c.session_id = s.id AND c.report_to IS NOT NULL) AS report
27277
- FROM sessions s LEFT JOIN session_folds f ON f.session_id = s.id WHERE s.id = ?`;
27271
+ FROM sess s LEFT JOIN session_folds f ON f.session_id = s.id)`;
27272
+ var TURN_END_SQL = `SELECT * FROM (WITH sess AS (SELECT * FROM sessions WHERE id = ?),
27273
+ open_turn AS (SELECT t.id FROM turns t WHERE t.session_id = (SELECT id FROM sess) AND t.status IN ${OPEN_TURN_STATUSES} ORDER BY t.started_at DESC LIMIT 1),
27274
+ answered AS (SELECT delivery_id AS id FROM turn_deliveries WHERE turn_id = (SELECT id FROM open_turn) UNION SELECT value FROM json_each(?))
27275
+ SELECT (SELECT json_group_array(bot) FROM (${PARTICIPANTS("(SELECT thread_id FROM sess)")})) AS participants,
27276
+ (SELECT json_group_array(json_object('id', dd.id, 'author', m.author, 'text', m.text, 'linked', EXISTS (SELECT 1 FROM turn_deliveries td WHERE td.delivery_id = dd.id AND td.turn_id = (SELECT id FROM open_turn))))
27277
+ FROM answered a CROSS JOIN deliveries dd ON dd.id = a.id CROSS JOIN messages m ON m.id = dd.message_id WHERE dd.session_id = (SELECT id FROM sess) AND m.author_kind = 'agent'
27278
+ AND (EXISTS (SELECT 1 FROM turn_deliveries td WHERE td.delivery_id = dd.id AND td.turn_id = (SELECT id FROM open_turn)) OR NOT EXISTS (SELECT 1 FROM turn_deliveries td WHERE td.delivery_id = dd.id))) AS asked,
27279
+ (SELECT json_group_array(p.text) FROM messages p WHERE p.turn_id = (SELECT id FROM open_turn)
27280
+ AND p.author = (SELECT bot FROM sess) AND p.author_kind = 'agent' AND p.status IS NULL) AS posted,
27281
+ (SELECT p.id FROM messages p WHERE p.turn_id = (SELECT id FROM open_turn)
27282
+ AND p.author = (SELECT bot FROM sess) AND p.author_kind = 'agent' AND p.status IS NULL ORDER BY p.created_at DESC, p.rowid DESC LIMIT 1) AS last_post)`;
27283
+ var namedDeliveries = (chunks) => [...new Set(chunks.flatMap((c) => c.events.flatMap((e) => e.meta?.deliveryIds ?? [])))];
27284
+ var completes = (chunks) => chunks.some((c) => c.events.some((e) => e.type === "turn.completed"));
27285
+ async function readFoldState(get, sessionId2, chunks) {
27286
+ const row = await get(FOLD_STATE_SQL, sessionId2);
27287
+ if (!row) return void 0;
27288
+ return foldState({ ...row, ...completes(chunks) ? await get(TURN_END_SQL, sessionId2, JSON.stringify(namedDeliveries(chunks))) : {} });
27289
+ }
27278
27290
  function foldState(row) {
27279
27291
  if (!row) return void 0;
27280
27292
  return {
27281
27293
  session: { id: String(row.id), thread: String(row.thread_id), bot: String(row.bot) },
27282
27294
  roster: JSON.parse(String(row.roster)),
27283
- participants: JSON.parse(String(row.participants)),
27295
+ participants: JSON.parse(String(row.participants ?? "[]")),
27284
27296
  held: row.held == null ? null : String(row.held),
27285
27297
  asked: JSON.parse(String(row.asked ?? "[]")),
27286
27298
  posted: JSON.parse(String(row.posted ?? "[]")),
@@ -27530,7 +27542,7 @@ function fold(state, chunks, now = Date.now()) {
27530
27542
  return { statements: stmts, deliver };
27531
27543
  }
27532
27544
  async function foldInTx(tx, sessionId2, chunks) {
27533
- const state = foldState(await tx.get(FOLD_STATE_SQL, sessionId2));
27545
+ const state = await readFoldState((sql, ...args) => tx.get(sql, ...args), sessionId2, chunks);
27534
27546
  const result = state ? fold(state, chunks) : foldSubagent(subagentState(sessionId2, await tx.get(SUBAGENT_STATE_SQL, sessionId2)), chunks);
27535
27547
  for (const stmt of result.statements) await tx.write(stmt.sql, ...stmt.args);
27536
27548
  return result.deliver;