@polycode-projects/seonix 0.7.0 → 0.7.3

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/README.md CHANGED
@@ -7,45 +7,25 @@ bounded **edit digest** you inject once at session start. Your agent edits from
7
7
  turn 1 without fishing through the repo.
8
8
 
9
9
  > **Headline.** Measured as **mean** input tokens per both-solved task (paired
10
- > arms, identical model pin). Under the shipped score-gap default (R1b), B017
11
- > re-tested across three models on a held-out TypeScript corpus and the existing
12
- > suites: two cells clear the ≥50% decision bar, both on exploration-bound
13
- > complex tasks a TypeScript middleware task on **Haiku 4.5 at 59.6%** and a C#
14
- > service task on **Sonnet 4.6 at 53.5%** with several more in the 35 to 48%
15
- > range. Across all measured cells the token cut tracks the turn cut
16
- > (Pearson 0.91): seonix saves tokens by removing exploration turns, so tasks
17
- > whose edit site is obvious change little. Indexing costs **$0**. The win is
18
- > task- and model-conditional; full method, numbers and the measurement contract
19
- > are in `BENCHMARK_017.md`.
10
+ > arms, identical model pin). Under the shipped score-gap default, two cells clear
11
+ > the ≥50% bar, both on exploration-bound complex tasks (a TypeScript middleware
12
+ > task on **Haiku 4.5** and a C# service task on **Sonnet 4.6**), with several more
13
+ > in the 35 to 48% range. The token cut tracks the turn cut: seonix saves tokens by
14
+ > removing exploration turns, so tasks whose edit site is obvious change little.
15
+ > Indexing costs **$0**. The win is task- and model-conditional. Full method,
16
+ > numbers, and the measurement contract are in
17
+ > [`BENCHMARKS.md`](https://gitlab.com/polycode-projects/seonix/-/blob/main/BENCHMARKS.md).
20
18
 
21
19
  - **Website / live demo:** https://seonix.polycode.co.uk
22
20
  - **Source + benchmarks:** https://gitlab.com/polycode-projects/seonix
23
21
  - **Licence:** AGPL-3.0-only
24
22
 
25
- ## Cross-model comparison
26
-
27
- seonix on the cheaper **Sonnet 4.6** vs the flagship **Opus 4.8** out of the box,
28
- mean input tokens per solved run (N=3; N=5 where an otb cell reuses the B015
29
- baseline). `+` means seonix on Sonnet used fewer tokens.
30
-
31
- | full task name | otb / Opus 4.8 | solved | seonix / Sonnet 4.6 | solved | token change |
32
- | --- | --- | --- | --- | --- | --- |
33
- | ts-hono-utils-helper (simple) | 135k | 3/3 | 117k | 3/3 | +13% |
34
- | ts-hono-response-time-middleware | 345k | 3/3 | 555k | 3/3 | −61% |
35
- | ts-hono-json-envelope | 1,102k | 3/3 | 864k | 3/3 | +22% |
36
- | py-django-truncatelines-filter | 610k | 5/5 | 524k | 5/5 | +14% |
37
- | cs-eshoponweb-order-service-total | 318k | 5/5 | 154k | 3/3 | +51% |
38
- | cs-eshoponweb-basket-service-total | 353k | 5/5 | 255k | 3/3 | +28% |
39
- | js-express-request-id | 330k | 5/5 | 267k | 3/3 | +19% |
40
- | js-express-json-envelope | 174k | 5/5 | 185k | 3/3 | −7% |
41
-
42
- seonix on Sonnet used fewer input tokens than otb on Opus on six of these eight
43
- tasks, at equal correctness. This crosses model and arm together, so
44
- it is an illustration of practical value, not the paired within-model measurement
45
- the ≥50% decision rule uses. Across all 13 measured seonix cells the drop in input
46
- tokens is 0.91-correlated (Pearson) with the drop in turns (slope about 0.71):
47
- seonix saves tokens by letting the agent skip exploration turns, so where it
48
- removes no turns there is little to save.
23
+ ## A cheaper model, matched
24
+
25
+ seonix on the cheaper **Sonnet 4.6** used fewer input tokens than out-of-the-box
26
+ **Opus 4.8** on six of eight tasks, at equal correctness. The full cross-model
27
+ table and the turns correlation (Pearson 0.91) are in
28
+ [`BENCHMARKS.md`](https://gitlab.com/polycode-projects/seonix/-/blob/main/BENCHMARKS.md).
49
29
 
50
30
  ## Install
51
31
 
@@ -102,7 +82,10 @@ filesystem root). In the merged graph every module id and label is prefixed with
102
82
  the repo's directory basename (`mod:<repoName>/<relpath>`); when two repos share a
103
83
  basename the first in path sort order keeps the bare name and later ones get `-2`,
104
84
  `-3`, … appended. Each repo's git history and `.seonixignore` are handled per repo,
105
- exactly as in single mode. Cross-repo call edges only arise where a symbol name
85
+ exactly as in single mode a `.seonixignore` at the `multi_root` **parent** is NOT read
86
+ (each sub-repo loads only its own). For an **estate-wide exclude**, put it in a `seonix.toml`
87
+ at the directory you index from (`[index].exclude` / `secret_exclude`); that propagates to
88
+ every sub-repo. Cross-repo call edges only arise where a symbol name
106
89
  resolves uniquely across the whole merged graph; ambiguous names are dropped, as
107
90
  within one repo. Query a merged graph by passing the merge root as `repo_path`
108
91
  (e.g. `seonix cli seonix_search '{"repo_path":"/abs/estate","query":"…"}'`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polycode-projects/seonix",
3
- "version": "0.7.0",
3
+ "version": "0.7.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "SEONIX — a deterministic, offline, $0 code-graph tool that makes a cheap coding agent edit like an expensive one. Indexes a repo with Python ast + git (zero model calls) and renders a bounded edit-digest.",
package/src/ask.mjs CHANGED
@@ -62,7 +62,9 @@ import { nlpAdapter } from "./ask-nlp.mjs";
62
62
  * classification, so they cannot drift in meaning). */
63
63
  function edgesOfKind(graph, kind) {
64
64
  const out = [];
65
- for (const g of graph.relations) if (relationKind(g) === kind) out.push(...g.edges);
65
+ // Append iteratively: `out.push(...g.edges)` spreads the group's edges as function arguments,
66
+ // overflowing the call stack on a large estate graph (mirrors the codegraph.mjs edgesOfKind fix).
67
+ for (const g of graph.relations) if (relationKind(g) === kind) for (const e of g.edges) out.push(e);
66
68
  return out;
67
69
  }
68
70
 
package/src/codegraph.mjs CHANGED
@@ -1180,7 +1180,10 @@ export function renderSearch(graph, query, { limit = SEARCH_LIMIT, kind = "", de
1180
1180
  * mechanical NL-query engine (PLAN_MECHANICAL_CHAT.md) to orchestrate rather than duplicate. */
1181
1181
  export function edgesOfKind(graph, kind) {
1182
1182
  const out = [];
1183
- for (const g of graph.relations) if (relationKind(g) === kind) out.push(...g.edges);
1183
+ // NB: append iteratively `out.push(...g.edges)` spreads the group's edges as function
1184
+ // arguments, which overflows the call stack on a large estate graph (e.g. `defines` with
1185
+ // 176k edges → "Maximum call stack size exceeded"). A plain loop has no argument-count limit.
1186
+ for (const g of graph.relations) if (relationKind(g) === kind) for (const e of g.edges) out.push(e);
1184
1187
  return out;
1185
1188
  }
1186
1189
 
package/src/walk.mjs CHANGED
Binary file