seekstone 0.15.1 → 0.16.0
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 +1 -0
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -147,6 +147,7 @@ Every write tool (`append_note`, `patch_note`, `patch_frontmatter`, `replace_in_
|
|
|
147
147
|
| `SEEKSTONE_LOG_LEVEL` | no | `error` \| `warn` \| `info` (default) \| `debug`. |
|
|
148
148
|
| `SEEKSTONE_LOG_FILE` | no | Absolute path; when set, JSON-line logs are appended here (size-rotated). |
|
|
149
149
|
| `SEEKSTONE_WATCH_POLL` | no | Set to `1` to stat-poll for changes instead of native OS events — reliable on network drives, WSL, containers. |
|
|
150
|
+
| `SEEKSTONE_WATCH_POLL_INTERVAL` | no | Stat-poll interval in ms (default `10000`). Only used with `SEEKSTONE_WATCH_POLL=1`. Lower = faster pickup of external edits, higher CPU. |
|
|
150
151
|
| `SEEKSTONE_LOG_MAX_SIZE` | no | Log-rotation threshold for `SEEKSTONE_LOG_FILE` (e.g. `10mb`; default 5 MB). |
|
|
151
152
|
| `SEEKSTONE_READ_ONLY` | no | Set to `1` to run read-only: the 9 write tools are unregistered entirely (and rejected if called anyway), so the session provably cannot modify your vault. |
|
|
152
153
|
| `SEEKSTONE_WRITE_PATHS` | no | Comma-separated vault-relative globs (e.g. `journal/**,inbox/*.md`). Writes are permitted only under matching paths; the rest of the vault stays read-only. |
|
package/dist/index.js
CHANGED
|
@@ -173,6 +173,7 @@ Optional environment:
|
|
|
173
173
|
SEEKSTONE_LOG_LEVEL error | warn | info (default) | debug
|
|
174
174
|
SEEKSTONE_LOG_FILE Absolute path; append JSON-line logs here
|
|
175
175
|
SEEKSTONE_WATCH_POLL Set to 1 to poll for changes (network drives, WSL)
|
|
176
|
+
SEEKSTONE_WATCH_POLL_INTERVAL Poll interval in ms (default 10000)
|
|
176
177
|
SEEKSTONE_SEMANTIC Set to 1 to enable semantic search (needs fetch-model first)
|
|
177
178
|
SEEKSTONE_MODEL_PATH Override the embedding-model directory
|
|
178
179
|
SEEKSTONE_CACHE_DIR Override the cache root (default ~/.cache/seekstone)
|
|
@@ -517,7 +518,7 @@ function routeToLexical(query, topPaths, topN = 3) {
|
|
|
517
518
|
const words = new Set(queryWords(query));
|
|
518
519
|
if (words.size === 0) return false;
|
|
519
520
|
return topPaths.slice(0, topN).some((path2) => {
|
|
520
|
-
const base = (path2.split(/
|
|
521
|
+
const base = (path2.split("/").pop() ?? "").replace(/\.md$/, "").toLowerCase();
|
|
521
522
|
const parts = new Set(base.split(/\W+/).filter(Boolean));
|
|
522
523
|
return parts.size === words.size && [...parts].every((p) => words.has(p));
|
|
523
524
|
});
|
|
@@ -2508,8 +2509,8 @@ async function walkVault(vaultRoot2) {
|
|
|
2508
2509
|
const absPath = typeof m === "string" ? m : m.path;
|
|
2509
2510
|
const stats = typeof m === "string" ? await stat(absPath) : m.stats;
|
|
2510
2511
|
if (!stats) continue;
|
|
2511
|
-
const relPath = relative(vaultRoot2, absPath);
|
|
2512
|
-
const topDir = relPath.split(
|
|
2512
|
+
const relPath = relative(vaultRoot2, absPath).split(sep2).join("/");
|
|
2513
|
+
const topDir = relPath.split("/")[0] ?? "";
|
|
2513
2514
|
entries.push({
|
|
2514
2515
|
absPath,
|
|
2515
2516
|
relPath,
|
|
@@ -4190,8 +4191,27 @@ import { realpathSync } from "fs";
|
|
|
4190
4191
|
import { readFile as readFile16 } from "fs/promises";
|
|
4191
4192
|
import { join as join10, relative as relative2, sep as sep3 } from "path";
|
|
4192
4193
|
import chokidar from "chokidar";
|
|
4194
|
+
var DEFAULT_POLL_INTERVAL_MS = 1e4;
|
|
4195
|
+
function resolvePollInterval(optValue, envValue, log2) {
|
|
4196
|
+
if (optValue !== void 0) return optValue;
|
|
4197
|
+
if (envValue === void 0 || envValue === "") return DEFAULT_POLL_INTERVAL_MS;
|
|
4198
|
+
const parsed = Number(envValue);
|
|
4199
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
4200
|
+
log2?.warn("invalid SEEKSTONE_WATCH_POLL_INTERVAL, using default", {
|
|
4201
|
+
value: envValue,
|
|
4202
|
+
defaultMs: DEFAULT_POLL_INTERVAL_MS
|
|
4203
|
+
});
|
|
4204
|
+
return DEFAULT_POLL_INTERVAL_MS;
|
|
4205
|
+
}
|
|
4206
|
+
return parsed;
|
|
4207
|
+
}
|
|
4193
4208
|
function startWatcher(ctx2, log2, opts) {
|
|
4194
4209
|
const usePolling = opts?.usePolling ?? process.env.SEEKSTONE_WATCH_POLL === "1";
|
|
4210
|
+
const pollInterval = resolvePollInterval(
|
|
4211
|
+
opts?.pollInterval,
|
|
4212
|
+
process.env.SEEKSTONE_WATCH_POLL_INTERVAL,
|
|
4213
|
+
log2
|
|
4214
|
+
);
|
|
4195
4215
|
let vaultRoot2 = ctx2.vaultRoot;
|
|
4196
4216
|
try {
|
|
4197
4217
|
vaultRoot2 = realpathSync(ctx2.vaultRoot);
|
|
@@ -4227,8 +4247,8 @@ function startWatcher(ctx2, log2, opts) {
|
|
|
4227
4247
|
// The startup index build already covers existing files.
|
|
4228
4248
|
ignoreInitial: true,
|
|
4229
4249
|
usePolling,
|
|
4230
|
-
interval:
|
|
4231
|
-
binaryInterval:
|
|
4250
|
+
interval: pollInterval,
|
|
4251
|
+
binaryInterval: pollInterval * 2,
|
|
4232
4252
|
// Skip dot-dirs (.obsidian, .git, .trash, …) regardless of where the vault
|
|
4233
4253
|
// lives — matched on the path relative to the vault root.
|
|
4234
4254
|
ignored: (p) => {
|
|
@@ -4254,7 +4274,7 @@ function startWatcher(ctx2, log2, opts) {
|
|
|
4254
4274
|
}
|
|
4255
4275
|
|
|
4256
4276
|
// src/index.ts
|
|
4257
|
-
var VERSION = true ? "0.
|
|
4277
|
+
var VERSION = true ? "0.16.0" : "0.0.0-dev";
|
|
4258
4278
|
var intent = parseCliIntent(process.argv.slice(2));
|
|
4259
4279
|
if (intent === "version") {
|
|
4260
4280
|
process.stdout.write(`${VERSION}
|