robrain 2.5.0 → 2.6.1

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 (39) hide show
  1. package/dist/commands/capture.test.js +4 -1
  2. package/dist/commands/capture.test.js.map +1 -1
  3. package/dist/commands/check.d.ts +5 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +15 -0
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/governance.d.ts +32 -0
  8. package/dist/commands/governance.d.ts.map +1 -0
  9. package/dist/commands/governance.js +181 -0
  10. package/dist/commands/governance.js.map +1 -0
  11. package/dist/commands/governance.test.d.ts +2 -0
  12. package/dist/commands/governance.test.d.ts.map +1 -0
  13. package/dist/commands/governance.test.js +42 -0
  14. package/dist/commands/governance.test.js.map +1 -0
  15. package/dist/commands/install.js +2 -2
  16. package/dist/commands/projects.d.ts +35 -0
  17. package/dist/commands/projects.d.ts.map +1 -1
  18. package/dist/commands/projects.js +166 -0
  19. package/dist/commands/projects.js.map +1 -1
  20. package/dist/commands/review.d.ts.map +1 -1
  21. package/dist/commands/review.js +6 -4
  22. package/dist/commands/review.js.map +1 -1
  23. package/dist/commands/search.d.ts +34 -0
  24. package/dist/commands/search.d.ts.map +1 -0
  25. package/dist/commands/search.js +100 -0
  26. package/dist/commands/search.js.map +1 -0
  27. package/dist/commands/search.test.d.ts +2 -0
  28. package/dist/commands/search.test.d.ts.map +1 -0
  29. package/dist/commands/search.test.js +43 -0
  30. package/dist/commands/search.test.js.map +1 -0
  31. package/dist/index.js +80 -3
  32. package/dist/index.js.map +1 -1
  33. package/package.json +3 -4
  34. package/vendor/codex-hooks/user-prompt-submit.mjs +14 -1
  35. package/vendor/sensing-mcp/dist/index.js +91 -19
  36. package/vendor/sensing-mcp/package.json +1 -1
  37. package/vendor/synthesis/dist/index.js +43 -9
  38. package/vendor/synthesis/package.json +1 -1
  39. package/scripts/chmod-bin.cjs +0 -14
package/dist/index.js CHANGED
@@ -26,12 +26,15 @@ import { exportMemoryCommand } from './commands/export-memory.js';
26
26
  import { exportInterchangeCommand } from './commands/export-interchange.js';
27
27
  import { outcomesScanCommand, outcomesRecordCommand } from './commands/outcomes.js';
28
28
  import { explainCommand } from './commands/explain.js';
29
- import { projectsListCommand, projectsMergeCommand } from './commands/projects.js';
29
+ import { projectsListCommand, projectsMergeCommand, projectsCreateCommand, projectsTagCommand, tagsMapCommand } from './commands/projects.js';
30
30
  import { captureShowCommand, captureSetCommand, captureTestCommand } from './commands/capture.js';
31
+ import { searchCommand } from './commands/search.js';
32
+ import { rulesAddCommand, promoteCommand } from './commands/governance.js';
31
33
  import { upCommand, downCommand, DEFAULT_IMAGE_REPO } from './commands/up.js';
32
34
  import { mcpCommand } from './commands/mcp.js';
33
35
  import { installHermesPlugin, resolveHermesHome } from './lib/hermes-plugin.js';
34
- const VERSION = '2.5.0';
36
+ const VERSION = '2.6.1';
37
+ const collect = (value, previous) => [...previous, value];
35
38
  program
36
39
  .name('robrain')
37
40
  .description('Institutional memory for AI coding agents — by Rory Plans')
@@ -208,6 +211,42 @@ program
208
211
  .action(async (opts) => {
209
212
  await initProjectCommand({ projectId: opts.projectId, skipClaudePlugin: opts.skipClaudePlugin, force: opts.force });
210
213
  });
214
+ // ── search — semantic search over stored memory, for people ───
215
+ program
216
+ .command('search <query>')
217
+ .description('Search stored decisions and other memory; shows who decided each one and when')
218
+ .option('-l, --limit <n>', 'Max results (default: 10, max 100)', parseInt)
219
+ .option('--kind <name>', 'Only this kind of memory (e.g. run, preference)')
220
+ .option('--project-id <id>', 'Project to search (default: the one pinned in this directory)')
221
+ .option('--json', 'Print the raw rows as JSON')
222
+ .action(async (query, opts) => {
223
+ await searchCommand(query, opts);
224
+ });
225
+ // ── rules — write a rule by hand ──────────────────────────────
226
+ const rulesCmd = program
227
+ .command('rules')
228
+ .description('Rules written by hand: stored like captured decisions, with confidence 1.0 and your email as author');
229
+ rulesCmd
230
+ .command('add <rule>')
231
+ .description('Store a rule now, without waiting for a session to capture it')
232
+ .option('--because <text>', 'Why (one short sentence)')
233
+ .option('--rejected <option:reason>', 'An alternative that was ruled out, "option: reason" (repeatable)', collect, [])
234
+ .option('--kind <name>', 'Store as one of the kinds the project declared (default: decision)')
235
+ .option('--subject <text>', 'Subject for a kind with changing state; a newer entry on the same subject replaces this one')
236
+ .option('--scope <scope>', 'user | local | team | global (default: team)')
237
+ .option('--project-id <id>', 'Project to write into (default: the one pinned in this directory)')
238
+ .option('--email <addr>', 'Author email (default: git user.email of this directory)')
239
+ .action(async (rule, opts) => {
240
+ await rulesAddCommand(rule, opts);
241
+ });
242
+ // ── promote — push a decision to production agents (cloud) ────
243
+ program
244
+ .command('promote <decision-id>')
245
+ .description('RoBrain cloud: push a decision into the org governance project (every agent) or one agent project')
246
+ .requiredOption('--to <target>', 'production-agents (every production agent), tag:<tag> (every agent with that tag), or a project id')
247
+ .action(async (decisionId, opts) => {
248
+ await promoteCommand(decisionId, opts);
249
+ });
211
250
  // ── projects — list / merge Perception project ids ────────────
212
251
  const projectsCmd = program
213
252
  .command('projects')
@@ -218,6 +257,45 @@ projectsCmd
218
257
  .action(async () => {
219
258
  await projectsListCommand();
220
259
  });
260
+ projectsCmd
261
+ .command('create <id>')
262
+ .description('Create (or rename) a project by id, e.g. one shared by a team across several repos; pin it with ROBRAIN_PROJECT_ID or --project-id')
263
+ .option('--name <name>', 'Display name (default: the id)')
264
+ .option('--tag <tag>', 'Tag (repeatable or comma-separated); on RoBrain cloud a rule can be pushed to one tag of agents', collect, [])
265
+ .action(async (id, opts) => {
266
+ await projectsCreateCommand(id, opts);
267
+ });
268
+ projectsCmd
269
+ .command('tag <id> [tags...]')
270
+ .description('RoBrain cloud: show or set a project\'s tags (what kind of agent it is), so robrain promote --to tag:<tag> can reach it')
271
+ .option('--suppress <tag>', 'Remove a tag the tool mapping derived (repeatable)', collect, [])
272
+ .option('--unsuppress <tag>', 'Let a removed derived tag apply again (repeatable)', collect, [])
273
+ .option('--show', 'Only show the tags and the tools seen')
274
+ .action(async (id, tags, opts) => {
275
+ await projectsTagCommand(id, tags, opts);
276
+ });
277
+ // ── tags — the org's tool → tag mapping (cloud) ───────────────
278
+ const tagsCmd = program
279
+ .command('tags')
280
+ .description('RoBrain cloud: tags derived from the tools an agent uses, through the org\'s tool → tag mapping');
281
+ const tagsMapCmd = tagsCmd
282
+ .command('map')
283
+ .description('List the mapping; `add "<tool pattern>" <tag>` and `remove "<tool pattern>" <tag>` change it (admins)')
284
+ .action(async () => {
285
+ await tagsMapCommand('list');
286
+ });
287
+ tagsMapCmd
288
+ .command('add <pattern> <tag>')
289
+ .description('Map tools matching the pattern (e.g. "send_email*") to a tag; applies after three turns of use')
290
+ .action(async (pattern, tag) => {
291
+ await tagsMapCommand('add', pattern, tag);
292
+ });
293
+ tagsMapCmd
294
+ .command('remove <pattern> <tag>')
295
+ .description('Remove one mapping')
296
+ .action(async (pattern, tag) => {
297
+ await tagsMapCommand('remove', pattern, tag);
298
+ });
221
299
  projectsCmd
222
300
  .command('merge <from-id> <to-id>')
223
301
  .description('Merge sessions and decisions from one project id into another, then delete the source project row')
@@ -225,7 +303,6 @@ projectsCmd
225
303
  await projectsMergeCommand(fromId, toId);
226
304
  });
227
305
  // ── capture — what the classifier stores for this project ─────
228
- const collect = (value, previous) => [...previous, value];
229
306
  function addCaptureSettingFlags(cmd) {
230
307
  return cmd
231
308
  .option('--project-id <id>', 'Project to change (default: the one pinned in this directory)')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robrain",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "type": "module",
5
5
  "description": "RoBrain CLI for installation, setup, and memory workflows",
6
6
  "author": "Rory Plans, Inc.",
@@ -57,8 +57,7 @@
57
57
  "build": "tsc",
58
58
  "dev": "tsc --watch",
59
59
  "typecheck": "tsc --noEmit",
60
- "test": "pnpm build && node --test dist/lib/editor.codex.test.js dist/lib/editor.stale-block.test.js dist/lib/release-guard.test.js dist/lib/auth.test.js dist/lib/perception-errors.test.js dist/lib/mcp-bundle.test.js dist/lib/control-bundle.test.js dist/lib/claude-plugin.test.js dist/lib/hermes-plugin.test.js dist/lib/codex-hooks.test.js dist/commands/outcomes.test.js dist/commands/export-interchange.test.js dist/commands/up.test.js dist/commands/mcp.test.js dist/commands/install.test.js dist/commands/synth.test.js dist/commands/status.test.js dist/lib/synthesis-bundle.test.js dist/lib/spinner.test.js dist/lib/config.test.js dist/commands/inject.test.js dist/commands/capture.test.js",
61
- "pack:verify": "node scripts/verify-publish-tarball.mjs",
62
- "postinstall": "node scripts/chmod-bin.cjs"
60
+ "test": "pnpm build && node --test dist/lib/editor.codex.test.js dist/lib/editor.stale-block.test.js dist/lib/release-guard.test.js dist/lib/auth.test.js dist/lib/perception-errors.test.js dist/lib/mcp-bundle.test.js dist/lib/control-bundle.test.js dist/lib/claude-plugin.test.js dist/lib/hermes-plugin.test.js dist/lib/codex-hooks.test.js dist/commands/outcomes.test.js dist/commands/export-interchange.test.js dist/commands/up.test.js dist/commands/mcp.test.js dist/commands/install.test.js dist/commands/synth.test.js dist/commands/status.test.js dist/lib/synthesis-bundle.test.js dist/lib/spinner.test.js dist/lib/config.test.js dist/commands/inject.test.js dist/commands/capture.test.js dist/commands/search.test.js dist/commands/governance.test.js",
61
+ "pack:verify": "node scripts/verify-publish-tarball.mjs"
63
62
  }
64
63
  }
@@ -74,13 +74,26 @@ for (const d of [...exact, ...semantic]) {
74
74
 
75
75
  if (vetoes.length === 0) exitSilently()
76
76
 
77
+ // Who decided and when (Perception ≥ 2.6 sends author_email / decided_at
78
+ // on veto-scan matches and author_email / created_at on decisions).
79
+ function decidedBy(d) {
80
+ const iso = d.decided_at ?? d.created_at
81
+ const parsed = iso ? new Date(iso) : null
82
+ const day = parsed && !Number.isNaN(parsed.getTime()) ? parsed.toISOString().slice(0, 10) : ''
83
+ const who = typeof d.author_email === 'string' && d.author_email ? d.author_email : ''
84
+ if (who && day) return ` (decided by ${who} on ${day})`
85
+ if (who) return ` (decided by ${who})`
86
+ if (day) return ` (decided ${day})`
87
+ return ''
88
+ }
89
+
77
90
  const lines = vetoes.map(d => {
78
91
  const rej = d.rejected
79
92
  .slice(0, 2)
80
93
  .map(r => `**${r.option}** (${r.reason})`)
81
94
  .join('; ')
82
95
  const tag = d.exact ? ' *(exact match on rejected option)*' : ''
83
- return `- ${d.decision}${tag}\n Rejected: ${rej}`
96
+ return `- ${d.decision}${tag}${decidedBy(d)}\n Rejected: ${rej}`
84
97
  })
85
98
 
86
99
  recordWarnedIds(sessionId, vetoes.map(d => d.id))
@@ -6589,22 +6589,26 @@ var require_embeddings = __commonJS({
6589
6589
  }
6590
6590
  };
6591
6591
  exports.EmbeddingProviderError = EmbeddingProviderError;
6592
- async function embed2(text, config3, signal) {
6593
- let vec;
6592
+ async function embed2(text, config3, signal, onUsage) {
6593
+ let out;
6594
6594
  switch (config3.provider) {
6595
6595
  case "openai":
6596
- vec = await embedOpenAI(text, config3, signal);
6596
+ out = await embedOpenAI(text, config3, signal);
6597
6597
  break;
6598
6598
  case "voyage":
6599
- vec = await embedVoyage(text, config3, signal);
6599
+ out = await embedVoyage(text, config3, signal);
6600
6600
  break;
6601
6601
  case "cohere":
6602
- vec = await embedCohere(text, config3, signal);
6602
+ out = await embedCohere(text, config3, signal);
6603
6603
  break;
6604
6604
  default:
6605
6605
  throw new EmbeddingProviderError(config3.provider, `Unknown embedding provider: ${config3.provider}`);
6606
6606
  }
6607
- return padToLength(vec, exports.EMBEDDING_TARGET_DIMS);
6607
+ onUsage?.({ inputTokens: out.inputTokens });
6608
+ return padToLength(out.vector, exports.EMBEDDING_TARGET_DIMS);
6609
+ }
6610
+ function tokenCount(x) {
6611
+ return typeof x === "number" && Number.isFinite(x) && x >= 0 ? Math.round(x) : null;
6608
6612
  }
6609
6613
  async function embedOpenAI(text, config3, signal) {
6610
6614
  const baseUrl = config3.openaiBaseUrl.replace(/\/+$/, "");
@@ -6624,7 +6628,10 @@ var require_embeddings = __commonJS({
6624
6628
  })
6625
6629
  }, "openai", config3, signal);
6626
6630
  const data = await res.json();
6627
- return ensureEmbedding("openai", data.data?.[0]?.embedding);
6631
+ return {
6632
+ vector: ensureEmbedding("openai", data.data?.[0]?.embedding),
6633
+ inputTokens: tokenCount(data.usage?.prompt_tokens) ?? tokenCount(data.usage?.total_tokens)
6634
+ };
6628
6635
  }
6629
6636
  async function embedVoyage(text, config3, signal) {
6630
6637
  if (!config3.voyageApiKey) {
@@ -6642,7 +6649,10 @@ var require_embeddings = __commonJS({
6642
6649
  })
6643
6650
  }, "voyage", config3, signal);
6644
6651
  const data = await res.json();
6645
- return ensureEmbedding("voyage", data.data?.[0]?.embedding);
6652
+ return {
6653
+ vector: ensureEmbedding("voyage", data.data?.[0]?.embedding),
6654
+ inputTokens: tokenCount(data.usage?.total_tokens)
6655
+ };
6646
6656
  }
6647
6657
  async function embedCohere(text, config3, signal) {
6648
6658
  if (!config3.cohereApiKey) {
@@ -6662,7 +6672,10 @@ var require_embeddings = __commonJS({
6662
6672
  })
6663
6673
  }, "cohere", config3, signal);
6664
6674
  const data = await res.json();
6665
- return ensureEmbedding("cohere", data.embeddings?.float?.[0]);
6675
+ return {
6676
+ vector: ensureEmbedding("cohere", data.embeddings?.float?.[0]),
6677
+ inputTokens: tokenCount(data.meta?.billed_units?.input_tokens)
6678
+ };
6666
6679
  }
6667
6680
  async function fetchEmbedding(url, init, provider, config3, callerSignal) {
6668
6681
  let lastDetail = "";
@@ -7558,6 +7571,26 @@ var require_capture_gate = __commonJS({
7558
7571
  }
7559
7572
  });
7560
7573
 
7574
+ // ../shared/dist/author-email.js
7575
+ var require_author_email = __commonJS({
7576
+ "../shared/dist/author-email.js"(exports) {
7577
+ "use strict";
7578
+ Object.defineProperty(exports, "__esModule", { value: true });
7579
+ exports.AUTHOR_EMAIL_MAX_CHARS = void 0;
7580
+ exports.normalizeAuthorEmail = normalizeAuthorEmail2;
7581
+ exports.AUTHOR_EMAIL_MAX_CHARS = 254;
7582
+ var AUTHOR_EMAIL_RE = /^[a-z0-9._%+-]{1,64}@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
7583
+ function normalizeAuthorEmail2(raw) {
7584
+ if (typeof raw !== "string")
7585
+ return null;
7586
+ const email2 = raw.trim().toLowerCase();
7587
+ if (!email2 || email2.length > exports.AUTHOR_EMAIL_MAX_CHARS)
7588
+ return null;
7589
+ return AUTHOR_EMAIL_RE.test(email2) ? email2 : null;
7590
+ }
7591
+ }
7592
+ });
7593
+
7561
7594
  // ../shared/dist/db.js
7562
7595
  var require_db = __commonJS({
7563
7596
  "../shared/dist/db.js"(exports) {
@@ -7603,6 +7636,7 @@ var require_dist = __commonJS({
7603
7636
  __exportStar(require_extract_decision(), exports);
7604
7637
  __exportStar(require_capture_settings(), exports);
7605
7638
  __exportStar(require_capture_gate(), exports);
7639
+ __exportStar(require_author_email(), exports);
7606
7640
  __exportStar(require_db(), exports);
7607
7641
  }
7608
7642
  });
@@ -23341,7 +23375,42 @@ var init_classifiers = __esm({
23341
23375
  }
23342
23376
  });
23343
23377
 
23378
+ // src/author.ts
23379
+ import { execFile } from "node:child_process";
23380
+ function normalizeEmail(raw) {
23381
+ return (0, import_shared6.normalizeAuthorEmail)(raw);
23382
+ }
23383
+ function gitUserEmail(cwd) {
23384
+ return new Promise((resolve) => {
23385
+ try {
23386
+ execFile("git", ["config", "--get", "user.email"], { cwd, timeout: GIT_TIMEOUT_MS }, (err, stdout) => {
23387
+ resolve(err ? null : normalizeEmail(String(stdout)));
23388
+ });
23389
+ } catch {
23390
+ resolve(null);
23391
+ }
23392
+ });
23393
+ }
23394
+ function resolveAuthorEmail(env = process.env, cwd = process.cwd()) {
23395
+ if (!cached2) {
23396
+ cached2 = (async () => normalizeEmail(env.ROBRAIN_AUTHOR_EMAIL) ?? await gitUserEmail(cwd))();
23397
+ }
23398
+ return cached2;
23399
+ }
23400
+ var import_shared6, GIT_TIMEOUT_MS, cached2;
23401
+ var init_author = __esm({
23402
+ "src/author.ts"() {
23403
+ "use strict";
23404
+ import_shared6 = __toESM(require_dist(), 1);
23405
+ GIT_TIMEOUT_MS = 2e3;
23406
+ }
23407
+ });
23408
+
23344
23409
  // src/router.ts
23410
+ async function withAuthor(signal) {
23411
+ const authorEmail = await resolveAuthorEmail();
23412
+ return authorEmail ? { ...signal, author_email: authorEmail } : signal;
23413
+ }
23345
23414
  function parsePerceptionUserMessage(status, rawText) {
23346
23415
  try {
23347
23416
  const j = JSON.parse(rawText);
@@ -23372,7 +23441,7 @@ async function routeDecisionSignal(signal, projectId) {
23372
23441
  "Authorization": `Bearer ${config2.perceptionApiKey}`,
23373
23442
  "X-Project-Id": projectId
23374
23443
  },
23375
- body: JSON.stringify({ signal })
23444
+ body: JSON.stringify({ signal: await withAuthor(signal) })
23376
23445
  });
23377
23446
  const raw = await res.text();
23378
23447
  if (!res.ok) {
@@ -23447,6 +23516,7 @@ async function routeFlushTurns(turns, projectId) {
23447
23516
  errors.push("PERCEPTION_API_URL is not set \u2014 flush could not reach Perception.");
23448
23517
  return errors;
23449
23518
  }
23519
+ const authorEmail = await resolveAuthorEmail();
23450
23520
  const signals = turns.map((turn) => ({
23451
23521
  signal: {
23452
23522
  turn,
@@ -23454,7 +23524,8 @@ async function routeFlushTurns(turns, projectId) {
23454
23524
  confidence: 0.5,
23455
23525
  files_affected: turn.files_touched,
23456
23526
  scope: "team",
23457
- needs_classification: true
23527
+ needs_classification: true,
23528
+ ...authorEmail ? { author_email: authorEmail } : {}
23458
23529
  }
23459
23530
  }));
23460
23531
  await Promise.allSettled(
@@ -23484,6 +23555,7 @@ var init_router = __esm({
23484
23555
  "src/router.ts"() {
23485
23556
  "use strict";
23486
23557
  init_config();
23558
+ init_author();
23487
23559
  }
23488
23560
  });
23489
23561
 
@@ -23625,7 +23697,7 @@ function resolveSessionId(raw) {
23625
23697
  function buildServer() {
23626
23698
  const server = new McpServer({
23627
23699
  name: "sensing-mcp",
23628
- version: "2.5.0"
23700
+ version: "2.6.1"
23629
23701
  });
23630
23702
  server.tool(
23631
23703
  "sensing_start_session",
@@ -23693,9 +23765,9 @@ function buildServer() {
23693
23765
  console.error(`[Sensing] Unknown session adopted: ${session_id} (${session.project_id})`);
23694
23766
  }
23695
23767
  }
23696
- const redactedUser = (0, import_shared6.redactSecrets)(user_message);
23697
- const redactedReply = (0, import_shared6.redactSecrets)(claude_reply);
23698
- const secretsRedacted = (0, import_shared6.totalRedactions)(redactedUser.redactions) + (0, import_shared6.totalRedactions)(redactedReply.redactions);
23768
+ const redactedUser = (0, import_shared7.redactSecrets)(user_message);
23769
+ const redactedReply = (0, import_shared7.redactSecrets)(claude_reply);
23770
+ const secretsRedacted = (0, import_shared7.totalRedactions)(redactedUser.redactions) + (0, import_shared7.totalRedactions)(redactedReply.redactions);
23699
23771
  if (secretsRedacted > 0) {
23700
23772
  console.error(`[Sensing] Redacted ${secretsRedacted} secret(s) from turn ${sequence} before buffering`);
23701
23773
  }
@@ -23912,13 +23984,13 @@ async function fetchAlwaysOnSummary(projectId) {
23912
23984
  return { text: `Project: ${projectId}` };
23913
23985
  }
23914
23986
  }
23915
- var import_shared6, sessionRegistry, lastDecisionShipFailure, pendingConflictNotices;
23987
+ var import_shared7, sessionRegistry, lastDecisionShipFailure, pendingConflictNotices;
23916
23988
  var init_server3 = __esm({
23917
23989
  "src/server.ts"() {
23918
23990
  "use strict";
23919
23991
  init_mcp();
23920
23992
  init_zod();
23921
- import_shared6 = __toESM(require_dist(), 1);
23993
+ import_shared7 = __toESM(require_dist(), 1);
23922
23994
  init_buffer();
23923
23995
  init_classifiers();
23924
23996
  init_router();
@@ -24026,8 +24098,8 @@ var StdioServerTransport = class {
24026
24098
  };
24027
24099
 
24028
24100
  // src/index.ts
24029
- var import_shared7 = __toESM(require_dist(), 1);
24030
- (0, import_shared7.loadEnv)();
24101
+ var import_shared8 = __toESM(require_dist(), 1);
24102
+ (0, import_shared8.loadEnv)();
24031
24103
  process.on("unhandledRejection", (reason) => {
24032
24104
  console.error("[Sensing] Unhandled rejection (process kept alive):", reason);
24033
24105
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robrain/sensing-mcp",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js"
@@ -11853,22 +11853,26 @@ var require_embeddings = __commonJS({
11853
11853
  }
11854
11854
  };
11855
11855
  exports.EmbeddingProviderError = EmbeddingProviderError;
11856
- async function embed(text, config2, signal) {
11857
- let vec;
11856
+ async function embed(text, config2, signal, onUsage) {
11857
+ let out;
11858
11858
  switch (config2.provider) {
11859
11859
  case "openai":
11860
- vec = await embedOpenAI(text, config2, signal);
11860
+ out = await embedOpenAI(text, config2, signal);
11861
11861
  break;
11862
11862
  case "voyage":
11863
- vec = await embedVoyage(text, config2, signal);
11863
+ out = await embedVoyage(text, config2, signal);
11864
11864
  break;
11865
11865
  case "cohere":
11866
- vec = await embedCohere(text, config2, signal);
11866
+ out = await embedCohere(text, config2, signal);
11867
11867
  break;
11868
11868
  default:
11869
11869
  throw new EmbeddingProviderError(config2.provider, `Unknown embedding provider: ${config2.provider}`);
11870
11870
  }
11871
- return padToLength(vec, exports.EMBEDDING_TARGET_DIMS);
11871
+ onUsage?.({ inputTokens: out.inputTokens });
11872
+ return padToLength(out.vector, exports.EMBEDDING_TARGET_DIMS);
11873
+ }
11874
+ function tokenCount(x2) {
11875
+ return typeof x2 === "number" && Number.isFinite(x2) && x2 >= 0 ? Math.round(x2) : null;
11872
11876
  }
11873
11877
  async function embedOpenAI(text, config2, signal) {
11874
11878
  const baseUrl = config2.openaiBaseUrl.replace(/\/+$/, "");
@@ -11888,7 +11892,10 @@ var require_embeddings = __commonJS({
11888
11892
  })
11889
11893
  }, "openai", config2, signal);
11890
11894
  const data = await res.json();
11891
- return ensureEmbedding("openai", data.data?.[0]?.embedding);
11895
+ return {
11896
+ vector: ensureEmbedding("openai", data.data?.[0]?.embedding),
11897
+ inputTokens: tokenCount(data.usage?.prompt_tokens) ?? tokenCount(data.usage?.total_tokens)
11898
+ };
11892
11899
  }
11893
11900
  async function embedVoyage(text, config2, signal) {
11894
11901
  if (!config2.voyageApiKey) {
@@ -11906,7 +11913,10 @@ var require_embeddings = __commonJS({
11906
11913
  })
11907
11914
  }, "voyage", config2, signal);
11908
11915
  const data = await res.json();
11909
- return ensureEmbedding("voyage", data.data?.[0]?.embedding);
11916
+ return {
11917
+ vector: ensureEmbedding("voyage", data.data?.[0]?.embedding),
11918
+ inputTokens: tokenCount(data.usage?.total_tokens)
11919
+ };
11910
11920
  }
11911
11921
  async function embedCohere(text, config2, signal) {
11912
11922
  if (!config2.cohereApiKey) {
@@ -11926,7 +11936,10 @@ var require_embeddings = __commonJS({
11926
11936
  })
11927
11937
  }, "cohere", config2, signal);
11928
11938
  const data = await res.json();
11929
- return ensureEmbedding("cohere", data.embeddings?.float?.[0]);
11939
+ return {
11940
+ vector: ensureEmbedding("cohere", data.embeddings?.float?.[0]),
11941
+ inputTokens: tokenCount(data.meta?.billed_units?.input_tokens)
11942
+ };
11930
11943
  }
11931
11944
  async function fetchEmbedding(url, init, provider, config2, callerSignal) {
11932
11945
  let lastDetail = "";
@@ -12822,6 +12835,26 @@ var require_capture_gate = __commonJS({
12822
12835
  }
12823
12836
  });
12824
12837
 
12838
+ // ../shared/dist/author-email.js
12839
+ var require_author_email = __commonJS({
12840
+ "../shared/dist/author-email.js"(exports) {
12841
+ "use strict";
12842
+ Object.defineProperty(exports, "__esModule", { value: true });
12843
+ exports.AUTHOR_EMAIL_MAX_CHARS = void 0;
12844
+ exports.normalizeAuthorEmail = normalizeAuthorEmail;
12845
+ exports.AUTHOR_EMAIL_MAX_CHARS = 254;
12846
+ var AUTHOR_EMAIL_RE = /^[a-z0-9._%+-]{1,64}@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
12847
+ function normalizeAuthorEmail(raw) {
12848
+ if (typeof raw !== "string")
12849
+ return null;
12850
+ const email = raw.trim().toLowerCase();
12851
+ if (!email || email.length > exports.AUTHOR_EMAIL_MAX_CHARS)
12852
+ return null;
12853
+ return AUTHOR_EMAIL_RE.test(email) ? email : null;
12854
+ }
12855
+ }
12856
+ });
12857
+
12825
12858
  // ../shared/dist/db.js
12826
12859
  var require_db = __commonJS({
12827
12860
  "../shared/dist/db.js"(exports) {
@@ -12867,6 +12900,7 @@ var require_dist2 = __commonJS({
12867
12900
  __exportStar(require_extract_decision(), exports);
12868
12901
  __exportStar(require_capture_settings(), exports);
12869
12902
  __exportStar(require_capture_gate(), exports);
12903
+ __exportStar(require_author_email(), exports);
12870
12904
  __exportStar(require_db(), exports);
12871
12905
  }
12872
12906
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robrain/synthesis",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js"
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- /** Older npm/npx (e.g. 9.6.x on Node 18.17) sometimes extract bins without +x — fix after install. */
3
- const fs = require('fs')
4
- const path = require('path')
5
- const root = path.join(__dirname, '..')
6
- for (const rel of ['dist/index.js', 'bin/robrain.js']) {
7
- const p = path.join(root, rel)
8
- try {
9
- fs.chmodSync(p, 0o755)
10
- }
11
- catch {
12
- /* missing during partial install — ignore */
13
- }
14
- }