@cleocode/core 2026.4.51 → 2026.4.52

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
@@ -9575,11 +9575,14 @@ var init_brain_schema = __esm({
9575
9575
  source: text("source").notNull(),
9576
9576
  /** Estimated tokens consumed by this retrieval. */
9577
9577
  tokensUsed: integer("tokens_used"),
9578
+ /** Session ID (soft FK to tasks.db sessions). Enables grouping retrievals by session for STDP analysis. */
9579
+ sessionId: text("session_id"),
9578
9580
  createdAt: text("created_at").notNull().default(sql2`(datetime('now'))`)
9579
9581
  },
9580
9582
  (table) => [
9581
9583
  index("idx_retrieval_log_created").on(table.createdAt),
9582
- index("idx_retrieval_log_source").on(table.source)
9584
+ index("idx_retrieval_log_source").on(table.source),
9585
+ index("idx_retrieval_log_session").on(table.sessionId)
9583
9586
  ]
9584
9587
  );
9585
9588
  brainPlasticityEvents = sqliteTable(
@@ -14382,7 +14385,7 @@ function clearEmbeddingProvider() {
14382
14385
  currentProvider = null;
14383
14386
  }
14384
14387
  async function embedText(text3) {
14385
- if (!currentProvider || !currentProvider.isAvailable()) return null;
14388
+ if (!currentProvider?.isAvailable()) return null;
14386
14389
  return currentProvider.embed(text3);
14387
14390
  }
14388
14391
  function isEmbeddingAvailable() {
@@ -19364,7 +19367,7 @@ function parseIdPrefix(id) {
19364
19367
  return null;
19365
19368
  }
19366
19369
  async function searchSimilar(query, projectRoot, limit) {
19367
- if (!query || !query.trim()) return [];
19370
+ if (!query?.trim()) return [];
19368
19371
  if (!isEmbeddingAvailable()) return [];
19369
19372
  const maxResults = limit ?? 10;
19370
19373
  const queryVector = await embedText(query);
@@ -46911,7 +46914,7 @@ async function computeLastSession(projectRoot, scopeFilter) {
46911
46914
  const accessor = await getAccessor(projectRoot);
46912
46915
  const allSessions = await accessor.loadSessions();
46913
46916
  const session = allSessions.find((s) => s.id === sessionId);
46914
- if (!session || !session.endedAt) return null;
46917
+ if (!session?.endedAt) return null;
46915
46918
  let duration3 = 0;
46916
46919
  if (session.startedAt) {
46917
46920
  duration3 = Math.round(
@@ -48098,10 +48101,17 @@ async function searchBrainCompact(projectRoot, params) {
48098
48101
  setImmediate(() => {
48099
48102
  incrementCitationCounts(projectRoot, returnedIds).catch(() => {
48100
48103
  });
48101
- logRetrieval(projectRoot, query, returnedIds, "find-rrf", results2.length * 50).catch(
48102
- () => {
48103
- }
48104
- );
48104
+ getCurrentSessionId(projectRoot).then((sessionId) => {
48105
+ return logRetrieval(
48106
+ projectRoot,
48107
+ query,
48108
+ returnedIds,
48109
+ "find-rrf",
48110
+ results2.length * 50,
48111
+ sessionId
48112
+ );
48113
+ }).catch(() => {
48114
+ });
48105
48115
  });
48106
48116
  }
48107
48117
  return { results: results2, total: results2.length, tokensEstimated: results2.length * 50 };
@@ -48164,7 +48174,16 @@ async function searchBrainCompact(projectRoot, params) {
48164
48174
  setImmediate(() => {
48165
48175
  incrementCitationCounts(projectRoot, returnedIds).catch(() => {
48166
48176
  });
48167
- logRetrieval(projectRoot, query, returnedIds, "find", results.length * 50).catch(() => {
48177
+ getCurrentSessionId(projectRoot).then((sessionId) => {
48178
+ return logRetrieval(
48179
+ projectRoot,
48180
+ query,
48181
+ returnedIds,
48182
+ "find",
48183
+ results.length * 50,
48184
+ sessionId
48185
+ );
48186
+ }).catch(() => {
48168
48187
  });
48169
48188
  });
48170
48189
  }
@@ -48352,13 +48371,16 @@ async function fetchBrainEntries(projectRoot, params) {
48352
48371
  setImmediate(() => {
48353
48372
  incrementCitationCounts(projectRoot, fetchedIds).catch(() => {
48354
48373
  });
48355
- logRetrieval(
48356
- projectRoot,
48357
- fetchedIds.join(","),
48358
- fetchedIds,
48359
- "fetch",
48360
- results.length * 500
48361
- ).catch(() => {
48374
+ getCurrentSessionId(projectRoot).then((sessionId) => {
48375
+ return logRetrieval(
48376
+ projectRoot,
48377
+ fetchedIds.join(","),
48378
+ fetchedIds,
48379
+ "fetch",
48380
+ results.length * 500,
48381
+ sessionId
48382
+ );
48383
+ }).catch(() => {
48362
48384
  });
48363
48385
  });
48364
48386
  }
@@ -48776,6 +48798,15 @@ async function retrieveWithBudget(projectRoot, query, tokenBudget = 500, options
48776
48798
  excluded
48777
48799
  };
48778
48800
  }
48801
+ async function getCurrentSessionId(projectRoot) {
48802
+ try {
48803
+ const { sessionStatus: sessionStatus2 } = await Promise.resolve().then(() => (init_sessions2(), sessions_exports2));
48804
+ const session = await sessionStatus2(projectRoot);
48805
+ return session?.id;
48806
+ } catch {
48807
+ return void 0;
48808
+ }
48809
+ }
48779
48810
  async function incrementCitationCounts(projectRoot, ids) {
48780
48811
  if (ids.length === 0) return;
48781
48812
  const { getBrainDb: getBrainDb2, getBrainNativeDb: getBrainNativeDb2 } = await Promise.resolve().then(() => (init_brain_sqlite(), brain_sqlite_exports));
@@ -48802,13 +48833,13 @@ async function incrementCitationCounts(projectRoot, ids) {
48802
48833
  }
48803
48834
  }
48804
48835
  }
48805
- async function logRetrieval(projectRoot, query, entryIds, source, tokensUsed) {
48836
+ async function logRetrieval(projectRoot, query, entryIds, source, tokensUsed, sessionId) {
48806
48837
  if (entryIds.length === 0) return;
48807
48838
  const { getBrainDb: getBrainDb2, getBrainNativeDb: getBrainNativeDb2 } = await Promise.resolve().then(() => (init_brain_sqlite(), brain_sqlite_exports));
48808
48839
  await getBrainDb2(projectRoot);
48809
48840
  const nativeDb = getBrainNativeDb2();
48810
48841
  if (!nativeDb) return;
48811
- const createSql = "CREATE TABLE IF NOT EXISTS brain_retrieval_log (id INTEGER PRIMARY KEY AUTOINCREMENT,query TEXT NOT NULL,entry_ids TEXT NOT NULL,entry_count INTEGER NOT NULL,source TEXT NOT NULL,tokens_used INTEGER,created_at TEXT NOT NULL DEFAULT (datetime('now')))";
48842
+ const createSql = "CREATE TABLE IF NOT EXISTS brain_retrieval_log (id INTEGER PRIMARY KEY AUTOINCREMENT,query TEXT NOT NULL,entry_ids TEXT NOT NULL,entry_count INTEGER NOT NULL,source TEXT NOT NULL,tokens_used INTEGER,session_id TEXT,created_at TEXT NOT NULL DEFAULT (datetime('now')))";
48812
48843
  try {
48813
48844
  nativeDb.prepare(createSql).run();
48814
48845
  } catch {
@@ -48816,8 +48847,15 @@ async function logRetrieval(projectRoot, query, entryIds, source, tokensUsed) {
48816
48847
  }
48817
48848
  try {
48818
48849
  nativeDb.prepare(
48819
- "INSERT INTO brain_retrieval_log (query, entry_ids, entry_count, source, tokens_used) VALUES (?, ?, ?, ?, ?)"
48820
- ).run(query, entryIds.join(","), entryIds.length, source, tokensUsed ?? null);
48850
+ "INSERT INTO brain_retrieval_log (query, entry_ids, entry_count, source, tokens_used, session_id) VALUES (?, ?, ?, ?, ?, ?)"
48851
+ ).run(
48852
+ query,
48853
+ entryIds.join(","),
48854
+ entryIds.length,
48855
+ source,
48856
+ tokensUsed ?? null,
48857
+ sessionId ?? null
48858
+ );
48821
48859
  } catch {
48822
48860
  }
48823
48861
  }
@@ -61391,7 +61429,7 @@ function prepareSpawnMulti(skillNames, tokenValues, cwd) {
61391
61429
  const skillName = skillNames[i];
61392
61430
  const isPrimary = i === 0;
61393
61431
  const skill = findSkill(skillName, cwd);
61394
- if (!skill || !skill.content) {
61432
+ if (!skill?.content) {
61395
61433
  continue;
61396
61434
  }
61397
61435
  let content = isPrimary ? skill.content : loadProgressive(skill.content);
@@ -73560,7 +73598,7 @@ async function injectProtocol(skillContent, taskId, tokenValues, cwd, tier) {
73560
73598
  }
73561
73599
  async function orchestratorSpawnSkill(taskId, skillName, tokenValues, cwd, tier) {
73562
73600
  const skill = findSkill(skillName, cwd);
73563
- if (!skill || !skill.content) {
73601
+ if (!skill?.content) {
73564
73602
  throw new CleoError(4 /* NOT_FOUND */, `Skill not found: ${skillName}`, {
73565
73603
  fix: `Check skills directory for ${skillName}/SKILL.md`
73566
73604
  });
@@ -74096,7 +74134,7 @@ async function buildPrompt(taskId, templateName = "TASK-EXECUTOR", cwd, tier) {
74096
74134
  throw new CleoError(4 /* NOT_FOUND */, `Task ${taskId} not found`);
74097
74135
  }
74098
74136
  const skill = findSkill(templateName, cwd);
74099
- if (!skill || !skill.content) {
74137
+ if (!skill?.content) {
74100
74138
  const { canonical } = mapSkillName(templateName);
74101
74139
  throw new CleoError(4 /* NOT_FOUND */, `Skill template ${templateName} not found`, {
74102
74140
  fix: `Expected at skills/${canonical}/SKILL.md`
@@ -76654,7 +76692,7 @@ async function analyzeArchive(opts, accessor) {
76654
76692
  const acc = accessor ?? await getAccessor(opts.cwd);
76655
76693
  const data = await acc.loadArchive();
76656
76694
  const reportType = opts.report ?? "summary";
76657
- if (!data || !data.archivedTasks?.length) {
76695
+ if (!data?.archivedTasks?.length) {
76658
76696
  return {
76659
76697
  report: reportType,
76660
76698
  filters: null,
@@ -83194,16 +83232,12 @@ function allEpicChildrenVerified(epicId, tasks2) {
83194
83232
  if (children.length === 0) return false;
83195
83233
  const incomplete = children.filter((t) => t.status !== "done");
83196
83234
  if (incomplete.length > 0) return false;
83197
- const unverified = children.filter(
83198
- (t) => t.status === "done" && (!t.verification || !t.verification.passed)
83199
- );
83235
+ const unverified = children.filter((t) => t.status === "done" && !t.verification?.passed);
83200
83236
  return unverified.length === 0;
83201
83237
  }
83202
83238
  function allSiblingsVerified(parentId, tasks2) {
83203
83239
  const siblings = tasks2.filter((t) => t.parentId === parentId);
83204
- const unverifiedDone = siblings.filter(
83205
- (t) => t.status === "done" && (!t.verification || !t.verification.passed)
83206
- );
83240
+ const unverifiedDone = siblings.filter((t) => t.status === "done" && !t.verification?.passed);
83207
83241
  const incomplete = siblings.filter(
83208
83242
  (t) => t.status === "pending" || t.status === "active" || t.status === "blocked"
83209
83243
  );
@@ -83580,7 +83614,7 @@ import { randomUUID as randomUUID8 } from "node:crypto";
83580
83614
  init_paths();
83581
83615
  import { existsSync as existsSync107, readFileSync as readFileSync77, writeFileSync as writeFileSync20 } from "node:fs";
83582
83616
  import { join as join107 } from "node:path";
83583
- function getCurrentSessionId(cwd) {
83617
+ function getCurrentSessionId2(cwd) {
83584
83618
  if (process.env.CLEO_SESSION) return process.env.CLEO_SESSION;
83585
83619
  const sessionFile = join107(getCleoDir(cwd), ".current-session");
83586
83620
  if (existsSync107(sessionFile)) {
@@ -83608,7 +83642,7 @@ function createCliMeta(operation, duration_ms = 0) {
83608
83642
  duration_ms,
83609
83643
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
83610
83644
  };
83611
- const sessionId = getCurrentSessionId();
83645
+ const sessionId = getCurrentSessionId2();
83612
83646
  if (sessionId) {
83613
83647
  meta3["sessionId"] = sessionId;
83614
83648
  }