overlane 0.1.138 → 0.1.140

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/overlane.mjs CHANGED
@@ -22623,7 +22623,38 @@ var init_audit = __esm({
22623
22623
  "data.exported": "admin",
22624
22624
  "data.deleted": "admin",
22625
22625
  "restore.drill_run": "admin",
22626
- "mcp_allowlist.updated": "policy"
22626
+ "mcp_allowlist.updated": "policy",
22627
+ // Admin, policy and token routes added by MS-A6, MS-A8, MS-A9 and MS-C1 that wrote no row until the platform end-to-end check found it (additive)
22628
+ "repo.mirror_set": "policy",
22629
+ "repo.deleted": "admin",
22630
+ "branch_protection.updated": "policy",
22631
+ "ci_settings.updated": "policy",
22632
+ "ci_secret.set": "token",
22633
+ "ci_secret.deleted": "token",
22634
+ "deploy_target.created": "policy",
22635
+ "deploy_environment.created": "policy",
22636
+ "deploy_secret.set": "token",
22637
+ "decision_settings.updated": "policy",
22638
+ "claim_policy.updated": "policy",
22639
+ "budget.set": "policy",
22640
+ "budget.removed": "policy",
22641
+ "pr_routing_policy.updated": "policy",
22642
+ "egress_policy.updated": "policy",
22643
+ "agent_readonly.changed": "policy",
22644
+ "connector.connected": "token",
22645
+ "connector.revoked": "token",
22646
+ "mcp_server.added": "policy",
22647
+ "mcp_server.removed": "policy",
22648
+ "chat_user.mapped": "admin",
22649
+ "api_key.created": "token",
22650
+ "api_key.revoked": "token",
22651
+ "api_key.rotated": "token",
22652
+ "webhook.created": "policy",
22653
+ "webhook.deleted": "policy",
22654
+ "webhook.rotated": "token",
22655
+ "alert_rule.updated": "policy",
22656
+ "alert_rule.deleted": "policy",
22657
+ "observe_retention.purged": "policy"
22627
22658
  };
22628
22659
  AUDIT_ACTION_NAMES = Object.keys(AUDIT_ACTIONS);
22629
22660
  AuditActionName = external_exports.enum(Object.keys(AUDIT_ACTIONS));
@@ -34526,7 +34557,7 @@ var VERSION;
34526
34557
  var init_assets = __esm({
34527
34558
  "src/assets.ts"() {
34528
34559
  "use strict";
34529
- VERSION = true ? "0.1.138" : "0.0.0-dev";
34560
+ VERSION = true ? "0.1.140" : "0.0.0-dev";
34530
34561
  }
34531
34562
  });
34532
34563
 
@@ -42682,20 +42713,45 @@ function wordsOf(text) {
42682
42713
  function idf(index, word) {
42683
42714
  return Math.log(index.wordDocs / (1 + (index.words.get(word) ?? 0)));
42684
42715
  }
42685
- function scoreSymbols(index, task) {
42686
- const exactNames = /* @__PURE__ */ new Set();
42716
+ function isGeneric(index, word) {
42717
+ return (index.words.get(word) ?? 0) >= Math.max(GENERIC_DF_FLOOR, index.wordDocs * GENERIC_DF_SHARE);
42718
+ }
42719
+ function isTestPath(path) {
42720
+ return /(^|\/)(tests?|__tests__|__mocks__|fixtures?|__fixtures__)\//.test(path) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(path) || /(^|\/)[^/]*\.fixtures?\.[cm]?[jt]sx?$/.test(path);
42721
+ }
42722
+ function testFilter(task) {
42723
+ if (/\b(tests?|specs?|fixtures?|testing|vitest|jest|mocks?)\b/i.test(task)) return () => true;
42724
+ const lower = task.toLowerCase();
42725
+ return (path) => {
42726
+ if (!isTestPath(path)) return true;
42727
+ const file2 = (path.split("/").pop() ?? path).toLowerCase();
42728
+ return lower.includes(file2) || lower.includes(file2.replace(/\.[cm]?[jt]sx?$/, ""));
42729
+ };
42730
+ }
42731
+ function identifierTokens(task) {
42732
+ const out2 = /* @__PURE__ */ new Set();
42687
42733
  for (const match of task.matchAll(/[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*/g)) {
42688
42734
  const token = match[0];
42735
+ if (/^[A-Za-z][a-z]*$/.test(token) && task.charAt((match.index ?? 0) - 1) !== "`") continue;
42736
+ out2.add(token);
42737
+ }
42738
+ return out2;
42739
+ }
42740
+ function scoreSymbols(index, task) {
42741
+ const exactNames = /* @__PURE__ */ new Set();
42742
+ for (const token of identifierTokens(task)) {
42689
42743
  if (token.length >= 4 && index.byName.has(token)) exactNames.add(token);
42690
42744
  if (token.includes(".")) exactNames.add(token);
42691
42745
  }
42692
42746
  const taskWords = new Set(wordsOf(task));
42747
+ const allowed = testFilter(task);
42693
42748
  const scored = [];
42694
42749
  for (const symbol2 of index.symbols.values()) {
42695
- if (!SEEDABLE.has(symbol2.kind)) continue;
42750
+ if (!SEEDABLE.has(symbol2.kind) || !allowed(symbol2.path)) continue;
42696
42751
  if (symbol2.kind === "constant" && !/^[A-Z][A-Z0-9_]+$/.test(symbol2.name)) continue;
42697
42752
  let score = 0;
42698
42753
  let exact = false;
42754
+ const hitWords = [];
42699
42755
  if (exactNames.has(symbol2.qualified)) {
42700
42756
  score = 200;
42701
42757
  exact = true;
@@ -42711,14 +42767,19 @@ function scoreSymbols(index, task) {
42711
42767
  let hits = 0;
42712
42768
  for (const word of own2) if (taskWords.has(word) && idf(index, word) >= MIN_WORD_IDF) {
42713
42769
  score += idf(index, word);
42770
+ if (isGeneric(index, word)) continue;
42714
42771
  hits += 1;
42772
+ hitWords.push([word, idf(index, word)]);
42773
+ }
42774
+ for (const word of fileWords) if (!own2.has(word) && taskWords.has(word) && idf(index, word) >= MIN_WORD_IDF) {
42775
+ score += idf(index, word) * 0.4;
42776
+ if (!isGeneric(index, word)) hitWords.push([word, idf(index, word) * 0.4]);
42715
42777
  }
42716
- for (const word of fileWords) if (!own2.has(word) && taskWords.has(word) && idf(index, word) >= MIN_WORD_IDF) score += idf(index, word) * 0.4;
42717
42778
  if (hits === 0) score = 0;
42718
42779
  else score /= 1 + 0.15 * own2.size;
42719
42780
  if (score < MIN_SOFT_SCORE) score = 0;
42720
42781
  }
42721
- if (score > 0) scored.push({ symbol: symbol2, score, exact });
42782
+ if (score > 0) scored.push({ symbol: symbol2, score, exact, hits: hitWords });
42722
42783
  }
42723
42784
  return scored.sort((a, b) => b.score - a.score || a.symbol.path.localeCompare(b.symbol.path) || a.symbol.line - b.symbol.line);
42724
42785
  }
@@ -42816,11 +42877,11 @@ function layout(index) {
42816
42877
  }
42817
42878
  return [`Layout: ${index.files} source files. ${[...domains].sort().map(([key, count]) => `${key}(${count})`).join(" ")}`];
42818
42879
  }
42819
- function mostCalled(index, limit) {
42880
+ function mostCalled(index, limit, allowed) {
42820
42881
  const counts2 = [];
42821
42882
  for (const [id2, callers] of index.callers) {
42822
42883
  const symbol2 = index.symbols.get(id2);
42823
- if (symbol2 === void 0 || !SEEDABLE.has(symbol2.kind) || symbol2.kind === "constant") continue;
42884
+ if (symbol2 === void 0 || !SEEDABLE.has(symbol2.kind) || symbol2.kind === "constant" || !allowed(symbol2.path)) continue;
42824
42885
  counts2.push({ symbol: symbol2, callers: callers.size });
42825
42886
  }
42826
42887
  counts2.sort((a, b) => b.callers - a.callers || a.symbol.path.localeCompare(b.symbol.path) || a.symbol.line - b.symbol.line);
@@ -42830,11 +42891,12 @@ function buildCodeMap(index, task, options = DEFAULT_MAP_OPTIONS) {
42830
42891
  const lines = [...layout(index), "Edges: 'called by' and 'calls' are resolved by name within imported files, ignoring comments and strings. Lines are file:line of the declaration."];
42831
42892
  const fits = (extra) => estimateTokens(`${[...lines, ...extra].join("\n")}
42832
42893
  `) <= options.maxTokens;
42894
+ const allowed = testFilter(task);
42833
42895
  const scored = scoreSymbols(index, task);
42834
42896
  const seeds = [];
42835
42897
  const shownFiles = /* @__PURE__ */ new Set();
42836
42898
  const taskFree = scored.length === 0;
42837
- const candidates = taskFree ? mostCalled(index, options.maxSeeds).map((symbol2) => ({ symbol: symbol2, score: 1 })) : scored;
42899
+ const candidates = taskFree ? mostCalled(index, options.maxSeeds, allowed).map((symbol2) => ({ symbol: symbol2, score: 1 })) : scored;
42838
42900
  lines.push("", taskFree ? "Most called symbols:" : "Symbols most relevant to the task:");
42839
42901
  for (const item of candidates) {
42840
42902
  if (seeds.length >= options.maxSeeds) break;
@@ -42848,10 +42910,13 @@ function buildCodeMap(index, task, options = DEFAULT_MAP_OPTIONS) {
42848
42910
  shownFiles.add(item.symbol.path);
42849
42911
  }
42850
42912
  const personal = /* @__PURE__ */ new Map();
42851
- if (taskFree) for (const path of index.byFile.keys()) personal.set(path, 1);
42852
- else for (const item of scored.slice(0, 40)) personal.set(item.symbol.path, (personal.get(item.symbol.path) ?? 0) + item.score);
42913
+ if (taskFree) {
42914
+ for (const path of index.byFile.keys()) if (allowed(path)) personal.set(path, 1);
42915
+ } else {
42916
+ for (const item of scored.slice(0, 40)) personal.set(item.symbol.path, (personal.get(item.symbol.path) ?? 0) + item.score);
42917
+ }
42853
42918
  const rank = pageRank(index, personal);
42854
- const ordered = [...rank].filter(([path]) => !shownFiles.has(path)).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
42919
+ const ordered = [...rank].filter(([path]) => !shownFiles.has(path) && allowed(path)).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
42855
42920
  const related = [];
42856
42921
  const top = ordered[0]?.[1] ?? 0;
42857
42922
  for (const [path, mass] of ordered) {
@@ -42885,7 +42950,7 @@ function serializeRepoIndex(index) {
42885
42950
  const heritage = [...index.heritage].map(([id2, h]) => ({ id: at(id2), extends: h.extends.map(at), implements: h.implements.map(at) }));
42886
42951
  return { schemaVersion: "1", files: index.files, wordDocs: index.wordDocs, symbols: symbols2, callees, heritage, paths: [...index.imports.keys()], words: [...index.words] };
42887
42952
  }
42888
- var SEEDABLE, MIN_WORD_IDF, MIN_SOFT_SCORE, MAX_RELATED_FILES, STOP, DEFAULT_MAP_OPTIONS, estimateTokens, where;
42953
+ var SEEDABLE, MIN_WORD_IDF, MIN_SOFT_SCORE, MAX_RELATED_FILES, GENERIC_DF_SHARE, GENERIC_DF_FLOOR, STOP, DEFAULT_MAP_OPTIONS, estimateTokens, where;
42889
42954
  var init_rank = __esm({
42890
42955
  "../index-builder/src/rank.ts"() {
42891
42956
  "use strict";
@@ -42894,6 +42959,8 @@ var init_rank = __esm({
42894
42959
  MIN_WORD_IDF = 2.5;
42895
42960
  MIN_SOFT_SCORE = 3.5;
42896
42961
  MAX_RELATED_FILES = 14;
42962
+ GENERIC_DF_SHARE = 4e-3;
42963
+ GENERIC_DF_FLOOR = 30;
42897
42964
  STOP = /* @__PURE__ */ new Set(["the", "a", "an", "of", "to", "in", "is", "are", "and", "or", "for", "that", "this", "it", "its", "by", "be", "on", "as", "at", "with", "from", "which", "what", "when", "where", "who", "how", "do", "does", "not", "any", "each", "every", "all", "also", "than", "then", "so", "if", "into", "file", "path", "answer", "end", "final", "message", "line", "start", "follow", "separate", "comma", "give", "name", "modify", "files", "repository", "source", "code", "change", "update", "make", "use", "uses", "used", "other", "only", "about", "will", "can", "should", "need", "needs", "happen", "merely", "share", "same", "return", "returns", "pass", "passes"]);
42898
42965
  DEFAULT_MAP_OPTIONS = { maxTokens: 3400, maxSeeds: 6 };
42899
42966
  estimateTokens = estimateCodeMapTokens;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlane",
3
- "version": "0.1.138",
3
+ "version": "0.1.140",
4
4
  "description": "Overlane: connect a GitHub project to your coding agents. One portable CLI with project memory, tasks, a code index, guardrails and the Claude Code and Codex plugin.",
5
5
  "keywords": [
6
6
  "overlane",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mvrx-harness",
3
- "version": "0.1.138",
3
+ "version": "0.1.140",
4
4
  "description": "Overlane context at session start and the shared Overlane skills.",
5
5
  "author": {
6
6
  "name": "owenob1"