@veewo/claw-core 0.1.93 → 0.1.94

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.
@@ -0,0 +1,112 @@
1
+ import fs from "node:fs";
2
+ import net from "node:net";
3
+ import path from "node:path";
4
+ import { ClawError } from "./errors.js";
5
+ import { searchMemoryAsync } from "./memory.js";
6
+ import { createSearchDaemonState, removeSearchDaemonState, } from "./search-daemon-protocol.js";
7
+ const DEFAULT_IDLE_TTL_MS = 10 * 60 * 1000;
8
+ const runtimeDir = resolveRuntimeDir(process.argv.slice(2));
9
+ const idleTtlMs = readPositiveInteger(process.env.CLAW_SEARCH_DAEMON_IDLE_TTL_MS, DEFAULT_IDLE_TTL_MS);
10
+ let state = null;
11
+ let activeRequests = 0;
12
+ let idleTimer = null;
13
+ let shuttingDown = false;
14
+ process.env.CLAW_SEARCH_DAEMON = "1";
15
+ fs.mkdirSync(runtimeDir, { recursive: true, mode: 0o700 });
16
+ const server = net.createServer((socket) => {
17
+ resetIdleTimer();
18
+ socket.setEncoding("utf-8");
19
+ let payload = "";
20
+ socket.on("data", (chunk) => {
21
+ payload += chunk;
22
+ const newline = payload.indexOf("\n");
23
+ if (newline < 0) {
24
+ return;
25
+ }
26
+ const raw = payload.slice(0, newline);
27
+ payload = payload.slice(newline + 1);
28
+ void handleRequest(raw).then((response) => socket.end(`${JSON.stringify(response)}\n`));
29
+ });
30
+ });
31
+ server.listen(0, "127.0.0.1", () => {
32
+ const address = server.address();
33
+ if (!address || typeof address === "string") {
34
+ void shutdown(1);
35
+ return;
36
+ }
37
+ state = createSearchDaemonState(runtimeDir, address.port);
38
+ resetIdleTimer();
39
+ });
40
+ process.on("SIGTERM", () => void shutdown(0));
41
+ process.on("SIGINT", () => void shutdown(0));
42
+ async function handleRequest(raw) {
43
+ let request;
44
+ try {
45
+ request = JSON.parse(raw);
46
+ }
47
+ catch {
48
+ return errorResponse("", "PROJECT_CONFIG_INVALID", "Search daemon request is not valid JSON.");
49
+ }
50
+ if (!state || request.token !== state.token || request.protocolVersion !== state.protocolVersion) {
51
+ return errorResponse(request.requestId, "PROJECT_CONFIG_INVALID", "Search daemon request authentication failed.");
52
+ }
53
+ activeRequests += 1;
54
+ resetIdleTimer();
55
+ try {
56
+ const output = await searchMemoryAsync(request.input);
57
+ return { ok: true, requestId: request.requestId, output };
58
+ }
59
+ catch (error) {
60
+ return error instanceof ClawError
61
+ ? errorResponse(request.requestId, error.code, error.message, error.details)
62
+ : errorResponse(request.requestId, "UNEXPECTED_ERROR", error instanceof Error ? error.message : String(error));
63
+ }
64
+ finally {
65
+ activeRequests -= 1;
66
+ resetIdleTimer();
67
+ }
68
+ }
69
+ function errorResponse(requestId, code, message, details) {
70
+ return { ok: false, requestId, error: { code, message, ...(details ? { details } : {}) } };
71
+ }
72
+ function resetIdleTimer() {
73
+ if (idleTimer) {
74
+ clearTimeout(idleTimer);
75
+ }
76
+ idleTimer = setTimeout(() => {
77
+ if (activeRequests === 0) {
78
+ void shutdown(0);
79
+ }
80
+ else {
81
+ resetIdleTimer();
82
+ }
83
+ }, idleTtlMs);
84
+ idleTimer.unref();
85
+ }
86
+ async function shutdown(exitCode) {
87
+ if (shuttingDown) {
88
+ return;
89
+ }
90
+ shuttingDown = true;
91
+ if (idleTimer) {
92
+ clearTimeout(idleTimer);
93
+ }
94
+ await new Promise((resolve) => server.close(() => resolve()));
95
+ if (state) {
96
+ removeSearchDaemonState(runtimeDir, state.instanceId);
97
+ }
98
+ process.exitCode = exitCode;
99
+ }
100
+ function resolveRuntimeDir(args) {
101
+ const index = args.indexOf("--runtime-dir");
102
+ const value = index >= 0 ? args[index + 1] : null;
103
+ if (!value) {
104
+ throw new Error("Search daemon requires --runtime-dir.");
105
+ }
106
+ return path.resolve(value);
107
+ }
108
+ function readPositiveInteger(raw, fallback) {
109
+ const value = Number.parseInt(raw ?? "", 10);
110
+ return Number.isFinite(value) && value > 0 ? value : fallback;
111
+ }
112
+ //# sourceMappingURL=search-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-daemon.js","sourceRoot":"","sources":["../../src/search-daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { buildMemoryIndex, searchMemoryAsync } from "./memory.js";
2
+ export { ClawError } from "./errors.js";
3
+ export { requestPersistentSearch } from "./search-daemon-protocol.js";
@@ -0,0 +1,4 @@
1
+ export { buildMemoryIndex, searchMemoryAsync } from "./memory.js";
2
+ export { ClawError } from "./errors.js";
3
+ export { requestPersistentSearch } from "./search-daemon-protocol.js";
4
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export const defaultPlanTemplate = {
2
2
  id: "default",
3
- version: "0.1.93",
3
+ version: "0.1.94",
4
4
  status: "process.discussing",
5
5
  goal: {
6
6
  text: "",
@@ -597,6 +597,10 @@ export type MemorySearchResult = {
597
597
  route: "task_fts" | "lexical_fast_path" | "hybrid";
598
598
  queryEmbedding: "skipped" | "cache_hit" | "generated";
599
599
  embeddingRuntime?: "mock" | "persistent_daemon" | "one_shot" | "remote";
600
+ vectorScanMs?: number;
601
+ fusionMs?: number;
602
+ vectorCount?: number;
603
+ vectorBytes?: number;
600
604
  durationMs: number;
601
605
  };
602
606
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veewo/claw-core",
3
- "version": "0.1.93",
3
+ "version": "0.1.94",
4
4
  "type": "module",
5
5
  "description": "Core workflow primitives for .claw project planning, recall, truth ingestion, and task closeout.",
6
6
  "keywords": [
@@ -31,6 +31,10 @@
31
31
  ".": {
32
32
  "types": "./dist/src/index.d.ts",
33
33
  "default": "./dist/src/index.js"
34
+ },
35
+ "./search": {
36
+ "types": "./dist/src/search.d.ts",
37
+ "default": "./dist/src/search.js"
34
38
  }
35
39
  },
36
40
  "dependencies": {