@veewo/claw 0.2.2 → 0.2.4

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,292 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { ClawError, readJsonFile, withSerializedQueue, writeJsonFileAtomic, } from "@veewo/claw-core";
6
+ export const SESSION_RECORD_TTL_MS = 7 * 24 * 60 * 60 * 1000;
7
+ export function resolveSessionDaemonRuntimeRoot(env = process.env) {
8
+ if (env.CLAW_SESSION_DAEMON_RUNTIME_DIR?.trim()) {
9
+ return path.resolve(env.CLAW_SESSION_DAEMON_RUNTIME_DIR);
10
+ }
11
+ const userRuntime = process.platform === "win32"
12
+ ? env.LOCALAPPDATA ?? path.join(os.homedir(), "AppData", "Local")
13
+ : env.XDG_RUNTIME_DIR ?? env.XDG_CACHE_HOME ?? path.join(os.homedir(), ".cache");
14
+ return path.resolve(userRuntime, "claw", "session-daemon-v2");
15
+ }
16
+ export function canonicalizeSessionWorkdir(workdir) {
17
+ const absolute = path.resolve(workdir);
18
+ let canonical = absolute;
19
+ try {
20
+ canonical = fs.realpathSync.native(absolute);
21
+ }
22
+ catch {
23
+ // Opening a session does not require an initialized .claw project, but the
24
+ // directory itself is validated by the caller before command execution.
25
+ }
26
+ if (process.platform === "win32" && /^[a-z]:/i.test(canonical)) {
27
+ canonical = `${canonical[0].toUpperCase()}${canonical.slice(1)}`;
28
+ }
29
+ const root = path.parse(canonical).root;
30
+ while (canonical.length > root.length && /[\\/]$/.test(canonical)) {
31
+ canonical = canonical.slice(0, -1);
32
+ }
33
+ return canonical;
34
+ }
35
+ export function createSessionIdentity(agentSessionId, workdir) {
36
+ const normalizedId = agentSessionId.trim();
37
+ if (!normalizedId) {
38
+ throw new ClawError("SESSION_IDENTITY_INVALID", "agentSessionId must be non-empty.");
39
+ }
40
+ const canonicalWorkdir = canonicalizeSessionWorkdir(workdir);
41
+ try {
42
+ if (!fs.statSync(canonicalWorkdir).isDirectory()) {
43
+ throw new Error("not a directory");
44
+ }
45
+ }
46
+ catch {
47
+ throw new ClawError("SESSION_IDENTITY_INVALID", `Session workdir is not an existing directory: ${canonicalWorkdir}`, { canonicalWorkdir });
48
+ }
49
+ return {
50
+ agentSessionId: normalizedId,
51
+ canonicalWorkdir,
52
+ sessionKeyHash: createHash("sha256")
53
+ .update(`${canonicalWorkdir}\0${normalizedId}`)
54
+ .digest("hex"),
55
+ };
56
+ }
57
+ export function sessionFocusKey(identity) {
58
+ return `${identity.canonicalWorkdir}\0${identity.agentSessionId}`;
59
+ }
60
+ export class SessionRegistryV2 {
61
+ runtimeRoot;
62
+ constructor(runtimeRoot = resolveSessionDaemonRuntimeRoot()) {
63
+ this.runtimeRoot = path.resolve(runtimeRoot);
64
+ ensurePrivateDirectory(this.runtimeRoot);
65
+ ensurePrivateDirectory(path.join(this.runtimeRoot, "sessions"));
66
+ }
67
+ async open(agentSessionId, workdir, client, now = new Date()) {
68
+ const identity = createSessionIdentity(agentSessionId, workdir);
69
+ const recordPath = this.recordPath(identity.sessionKeyHash);
70
+ return withSerializedQueue(this.commandQueuePath(identity.sessionKeyHash), async () => {
71
+ const existing = fs.existsSync(recordPath) ? this.read(identity.sessionKeyHash) : undefined;
72
+ if (existing
73
+ && (existing.agentSessionId !== identity.agentSessionId
74
+ || existing.canonicalWorkdir !== identity.canonicalWorkdir)) {
75
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Session hash collision or corrupt session identity.");
76
+ }
77
+ const timestamp = now.toISOString();
78
+ const record = {
79
+ schemaVersion: 2,
80
+ agentSessionId: identity.agentSessionId,
81
+ canonicalWorkdir: identity.canonicalWorkdir,
82
+ state: "live",
83
+ ...(existing?.currentPlan ? { currentPlan: existing.currentPlan } : {}),
84
+ createdAt: existing?.createdAt ?? timestamp,
85
+ updatedAt: timestamp,
86
+ lastConnectedAt: timestamp,
87
+ expiresAt: new Date(now.getTime() + SESSION_RECORD_TTL_MS).toISOString(),
88
+ lastClient: client,
89
+ };
90
+ this.write(identity.sessionKeyHash, record);
91
+ return { identity, record, created: !existing };
92
+ });
93
+ }
94
+ async close(sessionKeyHash, now = new Date()) {
95
+ return withSerializedQueue(this.commandQueuePath(sessionKeyHash), async () => {
96
+ const current = this.read(sessionKeyHash);
97
+ const record = refreshRecord(current, now, { state: "disconnected" });
98
+ this.write(sessionKeyHash, record);
99
+ return record;
100
+ });
101
+ }
102
+ async touch(sessionKeyHash, now = new Date()) {
103
+ return withSerializedQueue(this.commandQueuePath(sessionKeyHash), async () => {
104
+ const record = refreshRecord(this.read(sessionKeyHash), now);
105
+ this.write(sessionKeyHash, record);
106
+ return record;
107
+ });
108
+ }
109
+ read(sessionKeyHash) {
110
+ const recordPath = this.recordPath(sessionKeyHash);
111
+ if (!fs.existsSync(recordPath)) {
112
+ throw new ClawError("SESSION_NOT_FOUND", `Session "${sessionKeyHash}" does not exist.`);
113
+ }
114
+ const record = readJsonFile(recordPath);
115
+ if (record.schemaVersion !== 2) {
116
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", `Invalid v2 session record: ${recordPath}`);
117
+ }
118
+ return record;
119
+ }
120
+ write(sessionKeyHash, record) {
121
+ const expected = createSessionIdentity(record.agentSessionId, record.canonicalWorkdir).sessionKeyHash;
122
+ if (expected !== sessionKeyHash) {
123
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Session record does not match its composite identity.");
124
+ }
125
+ writeJsonFileAtomic(this.recordPath(sessionKeyHash), record);
126
+ }
127
+ recover(now = new Date()) {
128
+ const normalized = [];
129
+ const removed = [];
130
+ for (const sessionKeyHash of this.listSessionKeys()) {
131
+ let record;
132
+ try {
133
+ record = this.read(sessionKeyHash);
134
+ }
135
+ catch {
136
+ continue;
137
+ }
138
+ if (record.state === "live") {
139
+ record = refreshRecord(record, now, { state: "disconnected", preserveExpiry: true });
140
+ this.write(sessionKeyHash, record);
141
+ normalized.push(sessionKeyHash);
142
+ }
143
+ if (record.state === "disconnected" && Date.parse(record.expiresAt) <= now.getTime()) {
144
+ if (!record.currentPlan) {
145
+ this.removeSessionDirectory(sessionKeyHash);
146
+ removed.push(sessionKeyHash);
147
+ }
148
+ }
149
+ }
150
+ return { normalized, removed };
151
+ }
152
+ cleanupExpired(now = new Date(), liveSessionKeys = new Set()) {
153
+ const removed = [];
154
+ for (const sessionKeyHash of this.listSessionKeys()) {
155
+ if (liveSessionKeys.has(sessionKeyHash))
156
+ continue;
157
+ try {
158
+ const record = this.read(sessionKeyHash);
159
+ if (record.state === "disconnected"
160
+ && !record.currentPlan
161
+ && Date.parse(record.expiresAt) <= now.getTime()) {
162
+ this.removeSessionDirectory(sessionKeyHash);
163
+ removed.push(sessionKeyHash);
164
+ }
165
+ }
166
+ catch {
167
+ // Invalid records are retained for diagnosis rather than deleted.
168
+ }
169
+ }
170
+ return removed;
171
+ }
172
+ listExpiredRecords(now = new Date(), liveSessionKeys = new Set()) {
173
+ return this.listSessionKeys().flatMap((sessionKeyHash) => {
174
+ if (liveSessionKeys.has(sessionKeyHash))
175
+ return [];
176
+ try {
177
+ const record = this.read(sessionKeyHash);
178
+ return record.state === "disconnected" && Date.parse(record.expiresAt) <= now.getTime()
179
+ ? [{ sessionKeyHash, record }]
180
+ : [];
181
+ }
182
+ catch {
183
+ return [];
184
+ }
185
+ });
186
+ }
187
+ removeExpired(sessionKeyHash, now = new Date()) {
188
+ const record = this.read(sessionKeyHash);
189
+ if (record.state !== "disconnected"
190
+ || record.currentPlan
191
+ || Date.parse(record.expiresAt) > now.getTime()) {
192
+ return false;
193
+ }
194
+ this.removeSessionDirectory(sessionKeyHash);
195
+ return true;
196
+ }
197
+ removeReleasedExpired(sessionKeyHash) {
198
+ const record = this.read(sessionKeyHash);
199
+ if (record.state !== "disconnected" || record.currentPlan)
200
+ return false;
201
+ this.removeSessionDirectory(sessionKeyHash);
202
+ return true;
203
+ }
204
+ recordPath(sessionKeyHash) {
205
+ return path.join(this.sessionDirectory(sessionKeyHash), "session.json");
206
+ }
207
+ commandQueuePath(sessionKeyHash) {
208
+ return path.join(this.sessionDirectory(sessionKeyHash), "command.queue.json");
209
+ }
210
+ sessionDirectory(sessionKeyHash) {
211
+ assertSessionKeyHash(sessionKeyHash);
212
+ return path.join(this.runtimeRoot, "sessions", sessionKeyHash);
213
+ }
214
+ listSessionKeys() {
215
+ const sessionsRoot = path.join(this.runtimeRoot, "sessions");
216
+ if (!fs.existsSync(sessionsRoot))
217
+ return [];
218
+ return fs.readdirSync(sessionsRoot, { withFileTypes: true })
219
+ .filter((entry) => entry.isDirectory() && /^[a-f0-9]{64}$/i.test(entry.name))
220
+ .map((entry) => entry.name);
221
+ }
222
+ removeSessionDirectory(sessionKeyHash) {
223
+ const sessionsRoot = path.resolve(this.runtimeRoot, "sessions");
224
+ const target = path.resolve(this.sessionDirectory(sessionKeyHash));
225
+ if (path.dirname(target) !== sessionsRoot || target === this.runtimeRoot) {
226
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Refusing unsafe v2 session cleanup target.", {
227
+ target,
228
+ sessionsRoot,
229
+ });
230
+ }
231
+ fs.rmSync(target, { recursive: true, force: true });
232
+ }
233
+ }
234
+ export function ensurePrivateDirectory(directory) {
235
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
236
+ try {
237
+ fs.chmodSync(directory, 0o700);
238
+ }
239
+ catch {
240
+ // Windows uses the current user's inherited ACL.
241
+ }
242
+ }
243
+ export class RegistryFocusSessionStore {
244
+ registry;
245
+ constructor(registry) {
246
+ this.registry = registry;
247
+ }
248
+ read(sessionKeyHash) {
249
+ const record = this.registry.read(sessionKeyHash);
250
+ return {
251
+ schemaVersion: 1,
252
+ sessionKeyHash,
253
+ ...(record.currentPlan ? { currentPlan: record.currentPlan } : {}),
254
+ updatedAt: record.updatedAt,
255
+ };
256
+ }
257
+ buildPersistedRecord(sessionKeyHash, focus) {
258
+ const current = this.registry.read(sessionKeyHash);
259
+ return {
260
+ ...current,
261
+ ...(focus.currentPlan ? { currentPlan: focus.currentPlan } : { currentPlan: undefined }),
262
+ updatedAt: focus.updatedAt,
263
+ expiresAt: new Date(Date.parse(focus.updatedAt) + SESSION_RECORD_TTL_MS).toISOString(),
264
+ };
265
+ }
266
+ writePersistedAtomic(sessionKeyHash, persistedRecord) {
267
+ this.registry.write(sessionKeyHash, persistedRecord);
268
+ }
269
+ queuePath(sessionKeyHash) {
270
+ return this.registry.commandQueuePath(sessionKeyHash);
271
+ }
272
+ resourcePath(sessionKeyHash) {
273
+ return this.registry.recordPath(sessionKeyHash);
274
+ }
275
+ }
276
+ function refreshRecord(record, now, options) {
277
+ const updatedAt = now.toISOString();
278
+ return {
279
+ ...record,
280
+ ...(options?.state ? { state: options.state } : {}),
281
+ updatedAt,
282
+ expiresAt: options?.preserveExpiry
283
+ ? record.expiresAt
284
+ : new Date(now.getTime() + SESSION_RECORD_TTL_MS).toISOString(),
285
+ };
286
+ }
287
+ function assertSessionKeyHash(sessionKeyHash) {
288
+ if (!/^[a-f0-9]{64}$/i.test(sessionKeyHash)) {
289
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Invalid session key hash.");
290
+ }
291
+ }
292
+ //# sourceMappingURL=session-registry-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry-v2.js","sourceRoot":"","sources":["../src/session-registry-v2.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,41 +1,45 @@
1
- {
2
- "name": "@veewo/claw",
3
- "version": "0.2.2",
4
- "type": "module",
5
- "description": "CLI for running the .claw workflow: project planning, recall, truth ingestion, and closeout.",
6
- "keywords": [
7
- "claw",
8
- ".claw",
9
- "agent-workflow",
10
- "knowledge-capture",
11
- "project-memory",
12
- "truth",
13
- "adr",
14
- "cli"
15
- ],
16
- "homepage": "https://github.com/chanyuenpang/claw-kit",
17
- "repository": {
18
- "type": "git",
19
- "url": "https://github.com/chanyuenpang/claw-kit.git",
20
- "directory": "packages/cli"
21
- },
22
- "license": "MIT",
23
- "publishConfig": {
24
- "access": "public"
25
- },
26
- "files": [
27
- "dist",
28
- "README.md"
29
- ],
30
- "bin": {
31
- "claw": "./dist/bin.js"
32
- },
33
- "dependencies": {
34
- "@veewo/claw-core": "0.2.2"
35
- },
36
- "scripts": {
37
- "build": "node ./scripts/clean-dist.mjs && tsc -p tsconfig.json",
38
- "check": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
39
- "test": "tsc -p tsconfig.test.json && node --test dist-test/**/*.test.js"
40
- }
41
- }
1
+ {
2
+ "name": "@veewo/claw",
3
+ "version": "0.2.4",
4
+ "type": "module",
5
+ "description": "CLI for running the .claw workflow: project planning, recall, truth ingestion, and closeout.",
6
+ "keywords": [
7
+ "claw",
8
+ ".claw",
9
+ "agent-workflow",
10
+ "knowledge-capture",
11
+ "project-memory",
12
+ "truth",
13
+ "adr",
14
+ "cli"
15
+ ],
16
+ "homepage": "https://github.com/chanyuenpang/claw-kit",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/chanyuenpang/claw-kit.git",
20
+ "directory": "packages/cli"
21
+ },
22
+ "license": "MIT",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "bin": {
31
+ "claw": "./dist/bin.js"
32
+ },
33
+ "dependencies": {
34
+ "@veewo/claw-client": "0.2.4",
35
+ "@veewo/claw-core": "0.2.4"
36
+ },
37
+ "exports": {
38
+ "./session-daemon": "./dist/session-daemon-entry.js"
39
+ },
40
+ "scripts": {
41
+ "build": "node ./scripts/clean-dist.mjs && tsc -p tsconfig.json",
42
+ "check": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
43
+ "test": "tsc -p tsconfig.test.json && node --test dist-test/**/*.test.js"
44
+ }
45
+ }