@zcloak/ai-agent 1.0.24 → 1.0.26
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/SKILL.md +89 -50
- package/dist/bind.js +9 -8
- package/dist/bind.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +61 -26
- package/dist/cli.js.map +1 -1
- package/dist/compat.d.ts +32 -0
- package/dist/compat.js +91 -0
- package/dist/compat.js.map +1 -0
- package/dist/daemon.d.ts +4 -5
- package/dist/daemon.js +15 -21
- package/dist/daemon.js.map +1 -1
- package/dist/delete.js +8 -7
- package/dist/delete.js.map +1 -1
- package/dist/doc.js +4 -3
- package/dist/doc.js.map +1 -1
- package/dist/feed.js +2 -1
- package/dist/feed.js.map +1 -1
- package/dist/identity.js +2 -1
- package/dist/identity.js.map +1 -1
- package/dist/identity_cmd.js +2 -1
- package/dist/identity_cmd.js.map +1 -1
- package/dist/log.js +3 -6
- package/dist/log.js.map +1 -1
- package/dist/mailbox-store.d.ts +92 -0
- package/dist/mailbox-store.js +166 -0
- package/dist/mailbox-store.js.map +1 -0
- package/dist/paths.d.ts +39 -0
- package/dist/paths.js +77 -0
- package/dist/paths.js.map +1 -0
- package/dist/pow.js +2 -1
- package/dist/pow.js.map +1 -1
- package/dist/pre-check.d.ts +4 -4
- package/dist/pre-check.js +43 -13
- package/dist/pre-check.js.map +1 -1
- package/dist/register.js +200 -35
- package/dist/register.js.map +1 -1
- package/dist/rpc.d.ts +4 -6
- package/dist/rpc.js +3 -3
- package/dist/rpc.js.map +1 -1
- package/dist/serve.d.ts +4 -30
- package/dist/serve.js +22 -90
- package/dist/serve.js.map +1 -1
- package/dist/session.js +4 -3
- package/dist/session.js.map +1 -1
- package/dist/sign.js +9 -8
- package/dist/sign.js.map +1 -1
- package/dist/social.js +6 -5
- package/dist/social.js.map +1 -1
- package/dist/types/registry.d.ts +1 -1
- package/dist/types/registry.js +1 -1
- package/dist/types/sign-event.d.ts +1 -1
- package/dist/types/sign-event.js +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/verify.js +3 -2
- package/dist/verify.js.map +1 -1
- package/dist/vetkey.d.ts +18 -15
- package/dist/vetkey.js +104 -78
- package/dist/vetkey.js.map +1 -1
- package/dist/zmail.d.ts +7 -3
- package/dist/zmail.js +316 -20
- package/dist/zmail.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local mailbox storage layer for zMail.
|
|
3
|
+
*
|
|
4
|
+
* Follows the zmail-skill pattern: messages are synced from the server and
|
|
5
|
+
* cached locally so that `inbox` and `sent` can read from disk without
|
|
6
|
+
* network access.
|
|
7
|
+
*
|
|
8
|
+
* Storage layout:
|
|
9
|
+
* ~/.config/zcloak/mailboxes/{principal}/
|
|
10
|
+
* inbox.json Cached inbox messages
|
|
11
|
+
* sent.json Cached sent messages
|
|
12
|
+
* sync-state.json Incremental sync cursors
|
|
13
|
+
*
|
|
14
|
+
* Directory permissions: 0o700 (owner only)
|
|
15
|
+
* File permissions: 0o600 (owner read/write)
|
|
16
|
+
*
|
|
17
|
+
* All writes use an atomic .tmp → rename pattern to prevent data corruption
|
|
18
|
+
* if the process is interrupted mid-write.
|
|
19
|
+
*/
|
|
20
|
+
/** A single cached message — stored as the raw API response object. */
|
|
21
|
+
export type CachedMessage = Record<string, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* On-disk format for inbox.json and sent.json.
|
|
24
|
+
* Messages are stored as-is from the API (still ciphertext, never decrypted here).
|
|
25
|
+
*/
|
|
26
|
+
export interface MailboxFile {
|
|
27
|
+
/** Schema version (currently 1) */
|
|
28
|
+
version: number;
|
|
29
|
+
/** Unix timestamp (seconds) of when this file was last written */
|
|
30
|
+
synced_at: number;
|
|
31
|
+
/** Ordered array of message objects */
|
|
32
|
+
messages: CachedMessage[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Incremental sync state — tracks the server-side pagination cursor
|
|
36
|
+
* so that subsequent syncs only fetch new messages.
|
|
37
|
+
*/
|
|
38
|
+
export interface SyncState {
|
|
39
|
+
/** Schema version (currently 1) */
|
|
40
|
+
version: number;
|
|
41
|
+
/** Last inbox pagination cursor from the server */
|
|
42
|
+
inbox_cursor?: string;
|
|
43
|
+
/** Last sent pagination cursor from the server */
|
|
44
|
+
sent_cursor?: string;
|
|
45
|
+
/** Unix timestamp (seconds) of the most recent sync */
|
|
46
|
+
last_sync_at: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Return the mailbox directory path for a given principal.
|
|
50
|
+
* Does NOT create the directory — call {@link ensureMailboxDir} for that.
|
|
51
|
+
*/
|
|
52
|
+
export declare function mailboxDir(principal: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Ensure the principal's mailbox directory exists.
|
|
55
|
+
* Creates it (and parents) with 0o700 permissions if missing.
|
|
56
|
+
*
|
|
57
|
+
* @returns The absolute path to the mailbox directory
|
|
58
|
+
*/
|
|
59
|
+
export declare function ensureMailboxDir(principal: string): string;
|
|
60
|
+
/** Read the local inbox cache for a principal. */
|
|
61
|
+
export declare function readInbox(principal: string): MailboxFile;
|
|
62
|
+
/** Read the local sent cache for a principal. */
|
|
63
|
+
export declare function readSent(principal: string): MailboxFile;
|
|
64
|
+
/**
|
|
65
|
+
* Read the sync state for a principal.
|
|
66
|
+
* Returns null if no sync has been performed yet.
|
|
67
|
+
*/
|
|
68
|
+
export declare function readSyncState(principal: string): SyncState | null;
|
|
69
|
+
/** Write the inbox cache for a principal. */
|
|
70
|
+
export declare function writeInbox(principal: string, data: MailboxFile): void;
|
|
71
|
+
/** Write the sent cache for a principal. */
|
|
72
|
+
export declare function writeSent(principal: string, data: MailboxFile): void;
|
|
73
|
+
/** Write the sync state for a principal. */
|
|
74
|
+
export declare function writeSyncState(principal: string, state: SyncState): void;
|
|
75
|
+
/**
|
|
76
|
+
* Merge incoming messages into an existing message list.
|
|
77
|
+
*
|
|
78
|
+
* - De-duplicates by message `id`
|
|
79
|
+
* - For duplicate IDs, incoming data wins (e.g. updated `read` status)
|
|
80
|
+
* - Result is sorted by `created_at` descending (newest first)
|
|
81
|
+
*
|
|
82
|
+
* @param existing - Previously cached messages
|
|
83
|
+
* @param incoming - Newly fetched messages from the server
|
|
84
|
+
* @returns Merged, de-duplicated, sorted message array
|
|
85
|
+
*/
|
|
86
|
+
export declare function mergeMessages(existing: CachedMessage[], incoming: CachedMessage[]): CachedMessage[];
|
|
87
|
+
/**
|
|
88
|
+
* Clean up leftover .tmp files in a principal's mailbox directory.
|
|
89
|
+
* Called defensively after sync in case a previous run was interrupted.
|
|
90
|
+
*/
|
|
91
|
+
export declare function cleanupTmpFiles(principal: string): void;
|
|
92
|
+
//# sourceMappingURL=mailbox-store.d.ts.map
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local mailbox storage layer for zMail.
|
|
3
|
+
*
|
|
4
|
+
* Follows the zmail-skill pattern: messages are synced from the server and
|
|
5
|
+
* cached locally so that `inbox` and `sent` can read from disk without
|
|
6
|
+
* network access.
|
|
7
|
+
*
|
|
8
|
+
* Storage layout:
|
|
9
|
+
* ~/.config/zcloak/mailboxes/{principal}/
|
|
10
|
+
* inbox.json Cached inbox messages
|
|
11
|
+
* sent.json Cached sent messages
|
|
12
|
+
* sync-state.json Incremental sync cursors
|
|
13
|
+
*
|
|
14
|
+
* Directory permissions: 0o700 (owner only)
|
|
15
|
+
* File permissions: 0o600 (owner read/write)
|
|
16
|
+
*
|
|
17
|
+
* All writes use an atomic .tmp → rename pattern to prevent data corruption
|
|
18
|
+
* if the process is interrupted mid-write.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync } from 'fs';
|
|
21
|
+
import { join } from 'path';
|
|
22
|
+
import { mailboxDir as mailboxDirFromPaths } from './paths.js';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Path Helpers
|
|
25
|
+
// ============================================================================
|
|
26
|
+
/**
|
|
27
|
+
* Return the mailbox directory path for a given principal.
|
|
28
|
+
* Does NOT create the directory — call {@link ensureMailboxDir} for that.
|
|
29
|
+
*/
|
|
30
|
+
export function mailboxDir(principal) {
|
|
31
|
+
return mailboxDirFromPaths(principal);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Ensure the principal's mailbox directory exists.
|
|
35
|
+
* Creates it (and parents) with 0o700 permissions if missing.
|
|
36
|
+
*
|
|
37
|
+
* @returns The absolute path to the mailbox directory
|
|
38
|
+
*/
|
|
39
|
+
export function ensureMailboxDir(principal) {
|
|
40
|
+
const dir = mailboxDir(principal);
|
|
41
|
+
if (!existsSync(dir)) {
|
|
42
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
return dir;
|
|
45
|
+
}
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Read Helpers
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/** Default empty mailbox file returned when no local cache exists. */
|
|
50
|
+
function emptyMailboxFile() {
|
|
51
|
+
return { version: 1, synced_at: 0, messages: [] };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read a JSON mailbox file from disk.
|
|
55
|
+
* Returns a default empty structure if the file does not exist.
|
|
56
|
+
*
|
|
57
|
+
* @throws Error if the file exists but contains invalid JSON
|
|
58
|
+
*/
|
|
59
|
+
function readMailboxFile(filePath) {
|
|
60
|
+
if (!existsSync(filePath))
|
|
61
|
+
return emptyMailboxFile();
|
|
62
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
63
|
+
const parsed = JSON.parse(raw);
|
|
64
|
+
if (typeof parsed.version !== 'number' || !Array.isArray(parsed.messages)) {
|
|
65
|
+
throw new Error(`Invalid mailbox file format: ${filePath}`);
|
|
66
|
+
}
|
|
67
|
+
return parsed;
|
|
68
|
+
}
|
|
69
|
+
/** Read the local inbox cache for a principal. */
|
|
70
|
+
export function readInbox(principal) {
|
|
71
|
+
return readMailboxFile(join(mailboxDir(principal), 'inbox.json'));
|
|
72
|
+
}
|
|
73
|
+
/** Read the local sent cache for a principal. */
|
|
74
|
+
export function readSent(principal) {
|
|
75
|
+
return readMailboxFile(join(mailboxDir(principal), 'sent.json'));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Read the sync state for a principal.
|
|
79
|
+
* Returns null if no sync has been performed yet.
|
|
80
|
+
*/
|
|
81
|
+
export function readSyncState(principal) {
|
|
82
|
+
const filePath = join(mailboxDir(principal), 'sync-state.json');
|
|
83
|
+
if (!existsSync(filePath))
|
|
84
|
+
return null;
|
|
85
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
86
|
+
return JSON.parse(raw);
|
|
87
|
+
}
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Write Helpers (atomic: write .tmp then rename)
|
|
90
|
+
// ============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Atomically write a JSON file: write to a .tmp sibling, then rename.
|
|
93
|
+
* This prevents data corruption if the process is killed mid-write.
|
|
94
|
+
*/
|
|
95
|
+
function atomicWriteJson(filePath, data) {
|
|
96
|
+
const tmpPath = `${filePath}.tmp`;
|
|
97
|
+
const content = JSON.stringify(data, null, 2);
|
|
98
|
+
writeFileSync(tmpPath, content, { mode: 0o600 });
|
|
99
|
+
renameSync(tmpPath, filePath);
|
|
100
|
+
}
|
|
101
|
+
/** Write the inbox cache for a principal. */
|
|
102
|
+
export function writeInbox(principal, data) {
|
|
103
|
+
ensureMailboxDir(principal);
|
|
104
|
+
atomicWriteJson(join(mailboxDir(principal), 'inbox.json'), data);
|
|
105
|
+
}
|
|
106
|
+
/** Write the sent cache for a principal. */
|
|
107
|
+
export function writeSent(principal, data) {
|
|
108
|
+
ensureMailboxDir(principal);
|
|
109
|
+
atomicWriteJson(join(mailboxDir(principal), 'sent.json'), data);
|
|
110
|
+
}
|
|
111
|
+
/** Write the sync state for a principal. */
|
|
112
|
+
export function writeSyncState(principal, state) {
|
|
113
|
+
ensureMailboxDir(principal);
|
|
114
|
+
atomicWriteJson(join(mailboxDir(principal), 'sync-state.json'), state);
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// Message Merging
|
|
118
|
+
// ============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Merge incoming messages into an existing message list.
|
|
121
|
+
*
|
|
122
|
+
* - De-duplicates by message `id`
|
|
123
|
+
* - For duplicate IDs, incoming data wins (e.g. updated `read` status)
|
|
124
|
+
* - Result is sorted by `created_at` descending (newest first)
|
|
125
|
+
*
|
|
126
|
+
* @param existing - Previously cached messages
|
|
127
|
+
* @param incoming - Newly fetched messages from the server
|
|
128
|
+
* @returns Merged, de-duplicated, sorted message array
|
|
129
|
+
*/
|
|
130
|
+
export function mergeMessages(existing, incoming) {
|
|
131
|
+
// Build a map keyed by message id; incoming overwrites existing
|
|
132
|
+
const map = new Map();
|
|
133
|
+
for (const msg of existing) {
|
|
134
|
+
const id = msg.id;
|
|
135
|
+
if (id)
|
|
136
|
+
map.set(id, msg);
|
|
137
|
+
}
|
|
138
|
+
for (const msg of incoming) {
|
|
139
|
+
const id = msg.id;
|
|
140
|
+
if (id)
|
|
141
|
+
map.set(id, msg);
|
|
142
|
+
}
|
|
143
|
+
// Sort by timestamp descending (newest first).
|
|
144
|
+
// Messages may carry created_at, received_at, or stored_at depending on
|
|
145
|
+
// whether they are inbox or sent records — fall through in priority order.
|
|
146
|
+
return Array.from(map.values()).sort((a, b) => {
|
|
147
|
+
const ta = (a.created_at ?? a.received_at ?? a.stored_at ?? 0);
|
|
148
|
+
const tb = (b.created_at ?? b.received_at ?? b.stored_at ?? 0);
|
|
149
|
+
return tb - ta;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Clean up leftover .tmp files in a principal's mailbox directory.
|
|
154
|
+
* Called defensively after sync in case a previous run was interrupted.
|
|
155
|
+
*/
|
|
156
|
+
export function cleanupTmpFiles(principal) {
|
|
157
|
+
const dir = mailboxDir(principal);
|
|
158
|
+
for (const name of ['inbox.json.tmp', 'sent.json.tmp', 'sync-state.json.tmp']) {
|
|
159
|
+
const tmpPath = join(dir, name);
|
|
160
|
+
try {
|
|
161
|
+
unlinkSync(tmpPath);
|
|
162
|
+
}
|
|
163
|
+
catch { /* file may not exist */ }
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=mailbox-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox-store.js","sourceRoot":"","sources":["../src/mailbox-store.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized file system path definitions for zcloak-agent.
|
|
3
|
+
*
|
|
4
|
+
* ALL directory and file paths used by the application are defined here.
|
|
5
|
+
* No other module should construct paths using os.homedir() directly.
|
|
6
|
+
*
|
|
7
|
+
* Directory layout:
|
|
8
|
+
* ~/.config/zcloak/
|
|
9
|
+
* ai-id.pem Identity PEM file
|
|
10
|
+
* debug.log Debug log file
|
|
11
|
+
* .last-update-check Update check timestamp
|
|
12
|
+
* run/ Daemon runtime files (PID, socket, logs)
|
|
13
|
+
* {sanitized_id}.pid
|
|
14
|
+
* {sanitized_id}.sock
|
|
15
|
+
* {keyname}-daemon.log
|
|
16
|
+
* mailboxes/{principal}/ Per-principal mailbox cache
|
|
17
|
+
* inbox.json
|
|
18
|
+
* sent.json
|
|
19
|
+
* sync-state.json
|
|
20
|
+
*/
|
|
21
|
+
/** Root configuration directory: ~/.config/zcloak/ */
|
|
22
|
+
export declare function configDir(): string;
|
|
23
|
+
/** Daemon runtime directory: ~/.config/zcloak/run/ */
|
|
24
|
+
export declare function runtimeDir(): string;
|
|
25
|
+
/** Mailboxes root: ~/.config/zcloak/mailboxes/ */
|
|
26
|
+
export declare function mailboxesRoot(): string;
|
|
27
|
+
/** Default identity PEM file path: ~/.config/zcloak/ai-id.pem */
|
|
28
|
+
export declare function defaultPemPath(): string;
|
|
29
|
+
/** Debug log file path: ~/.config/zcloak/debug.log */
|
|
30
|
+
export declare function debugLogPath(): string;
|
|
31
|
+
/** Daemon log file path for a given key name: ~/.config/zcloak/run/{keyname}-daemon.log */
|
|
32
|
+
export declare function daemonLogPath(keyName: string): string;
|
|
33
|
+
/** Last update check timestamp file: ~/.config/zcloak/.last-update-check */
|
|
34
|
+
export declare function lastUpdateCheckPath(): string;
|
|
35
|
+
/** Mailbox directory for a given principal: ~/.config/zcloak/mailboxes/{principal}/ */
|
|
36
|
+
export declare function mailboxDir(principal: string): string;
|
|
37
|
+
/** Old daemon runtime directory: ~/.vetkey-tool/ (migrated to ~/.config/zcloak/run/) */
|
|
38
|
+
export declare function legacyRuntimeDir(): string;
|
|
39
|
+
//# sourceMappingURL=paths.d.ts.map
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized file system path definitions for zcloak-agent.
|
|
3
|
+
*
|
|
4
|
+
* ALL directory and file paths used by the application are defined here.
|
|
5
|
+
* No other module should construct paths using os.homedir() directly.
|
|
6
|
+
*
|
|
7
|
+
* Directory layout:
|
|
8
|
+
* ~/.config/zcloak/
|
|
9
|
+
* ai-id.pem Identity PEM file
|
|
10
|
+
* debug.log Debug log file
|
|
11
|
+
* .last-update-check Update check timestamp
|
|
12
|
+
* run/ Daemon runtime files (PID, socket, logs)
|
|
13
|
+
* {sanitized_id}.pid
|
|
14
|
+
* {sanitized_id}.sock
|
|
15
|
+
* {keyname}-daemon.log
|
|
16
|
+
* mailboxes/{principal}/ Per-principal mailbox cache
|
|
17
|
+
* inbox.json
|
|
18
|
+
* sent.json
|
|
19
|
+
* sync-state.json
|
|
20
|
+
*/
|
|
21
|
+
import { join } from 'path';
|
|
22
|
+
import { homedir } from 'os';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Root Directories
|
|
25
|
+
// ============================================================================
|
|
26
|
+
/** Root configuration directory: ~/.config/zcloak/ */
|
|
27
|
+
export function configDir() {
|
|
28
|
+
return join(homedir(), '.config', 'zcloak');
|
|
29
|
+
}
|
|
30
|
+
/** Daemon runtime directory: ~/.config/zcloak/run/ */
|
|
31
|
+
export function runtimeDir() {
|
|
32
|
+
return join(configDir(), 'run');
|
|
33
|
+
}
|
|
34
|
+
/** Mailboxes root: ~/.config/zcloak/mailboxes/ */
|
|
35
|
+
export function mailboxesRoot() {
|
|
36
|
+
return join(configDir(), 'mailboxes');
|
|
37
|
+
}
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Identity
|
|
40
|
+
// ============================================================================
|
|
41
|
+
/** Default identity PEM file path: ~/.config/zcloak/ai-id.pem */
|
|
42
|
+
export function defaultPemPath() {
|
|
43
|
+
return join(configDir(), 'ai-id.pem');
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Logging
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/** Debug log file path: ~/.config/zcloak/debug.log */
|
|
49
|
+
export function debugLogPath() {
|
|
50
|
+
return join(configDir(), 'debug.log');
|
|
51
|
+
}
|
|
52
|
+
/** Daemon log file path for a given key name: ~/.config/zcloak/run/{keyname}-daemon.log */
|
|
53
|
+
export function daemonLogPath(keyName) {
|
|
54
|
+
return join(runtimeDir(), `${keyName.toLowerCase()}-daemon.log`);
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Update Check
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/** Last update check timestamp file: ~/.config/zcloak/.last-update-check */
|
|
60
|
+
export function lastUpdateCheckPath() {
|
|
61
|
+
return join(configDir(), '.last-update-check');
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Mailbox Per-Principal Paths
|
|
65
|
+
// ============================================================================
|
|
66
|
+
/** Mailbox directory for a given principal: ~/.config/zcloak/mailboxes/{principal}/ */
|
|
67
|
+
export function mailboxDir(principal) {
|
|
68
|
+
return join(mailboxesRoot(), principal);
|
|
69
|
+
}
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Legacy Paths (for backward compatibility migration)
|
|
72
|
+
// ============================================================================
|
|
73
|
+
/** Old daemon runtime directory: ~/.vetkey-tool/ (migrated to ~/.config/zcloak/run/) */
|
|
74
|
+
export function legacyRuntimeDir() {
|
|
75
|
+
return join(homedir(), '.vetkey-tool');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,sDAAsD;AACtD,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,iEAAiE;AACjE,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,sDAAsD;AACtD,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACnE,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACjD,CAAC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,+EAA+E;AAC/E,sDAAsD;AACtD,+EAA+E;AAE/E,wFAAwF;AACxF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/pow.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* zcloak-ai pow 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 5
|
|
13
13
|
*/
|
|
14
14
|
import crypto from 'crypto';
|
|
15
|
+
import * as log from './log.js';
|
|
15
16
|
// ========== Exported run() — called by cli.ts ==========
|
|
16
17
|
/**
|
|
17
18
|
* Entry point when invoked via cli.ts.
|
|
@@ -69,7 +70,7 @@ export function run(session) {
|
|
|
69
70
|
if (nonce % 10000 === 0) {
|
|
70
71
|
const elapsed = Date.now() - start;
|
|
71
72
|
if (elapsed > POW_TIMEOUT_MS) {
|
|
72
|
-
|
|
73
|
+
log.error(`PoW computation timed out after ${Math.round(elapsed / 1000)}s ` +
|
|
73
74
|
`(${nonce} hashes tried, zeros=${zeros}). ` +
|
|
74
75
|
`Consider reducing the zeros parameter.`);
|
|
75
76
|
process.exit(1);
|
package/dist/pow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pow.js","sourceRoot":"","sources":["../src/pow.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"pow.js","sourceRoot":"","sources":["../src/pow.ts"],"names":[],"mappings":"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"}
|
package/dist/pre-check.d.ts
CHANGED
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
*/
|
|
22
22
|
/** Result returned by preCheck() to the caller (cli.ts) */
|
|
23
23
|
export interface PreCheckResult {
|
|
24
|
-
/** Whether the CLI package was updated (requires re-execution) */
|
|
24
|
+
/** Whether the CLI package was successfully updated (requires re-execution) */
|
|
25
25
|
updated: boolean;
|
|
26
|
-
/** Human / agent-readable message (empty string when nothing
|
|
26
|
+
/** Human / agent-readable message (empty string when nothing noteworthy happened) */
|
|
27
27
|
message: string;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Run the pre-flight update check.
|
|
31
31
|
*
|
|
32
32
|
* Called by cli.ts before dispatching any sub-command. If an update is
|
|
33
|
-
* detected and applied, the returned result contains a descriptive
|
|
34
|
-
* (for stderr) and `updated: true`.
|
|
33
|
+
* detected and applied successfully, the returned result contains a descriptive
|
|
34
|
+
* message (for stderr) and `updated: true`.
|
|
35
35
|
*
|
|
36
36
|
* When `updated` is true the caller should exit and prompt the agent /
|
|
37
37
|
* user to re-run the command (the running binary and SKILL.md are stale).
|
package/dist/pre-check.js
CHANGED
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
import fs from "fs";
|
|
23
23
|
import https from "https";
|
|
24
24
|
import path from "path";
|
|
25
|
-
import os from "os";
|
|
26
25
|
import { execSync } from "child_process";
|
|
27
26
|
import { fileURLToPath } from "url";
|
|
28
27
|
import { debug } from "./log.js";
|
|
28
|
+
import { configDir as getConfigDir, lastUpdateCheckPath } from "./paths.js";
|
|
29
29
|
// ---------------------------------------------------------------------------
|
|
30
30
|
// Path constants
|
|
31
31
|
// ---------------------------------------------------------------------------
|
|
@@ -36,9 +36,9 @@ const PACKAGE_ROOT = path.resolve(__dirname, "..");
|
|
|
36
36
|
/** Local package.json path */
|
|
37
37
|
const LOCAL_PACKAGE_JSON = path.join(PACKAGE_ROOT, "package.json");
|
|
38
38
|
/** Directory for zCloak configuration files */
|
|
39
|
-
const CONFIG_DIR =
|
|
39
|
+
const CONFIG_DIR = getConfigDir();
|
|
40
40
|
/** Timestamp file recording when we last checked for updates */
|
|
41
|
-
const CHECK_FILE =
|
|
41
|
+
const CHECK_FILE = lastUpdateCheckPath();
|
|
42
42
|
/** Workspace SKILL.md path expected by openClaw. */
|
|
43
43
|
const WORKSPACE_SKILL_PATH = path.resolve(process.cwd(), "skills", "zcloak-ai-agent", "SKILL.md");
|
|
44
44
|
// ---------------------------------------------------------------------------
|
|
@@ -96,7 +96,13 @@ function shouldCheck() {
|
|
|
96
96
|
return true;
|
|
97
97
|
const delta = Date.now() - timestamp;
|
|
98
98
|
const should = delta >= CHECK_INTERVAL_MS;
|
|
99
|
-
debug("pre-check timestamp read", {
|
|
99
|
+
debug("pre-check timestamp read", {
|
|
100
|
+
file: CHECK_FILE,
|
|
101
|
+
timestamp,
|
|
102
|
+
deltaMs: delta,
|
|
103
|
+
intervalMs: CHECK_INTERVAL_MS,
|
|
104
|
+
shouldCheck: should,
|
|
105
|
+
});
|
|
100
106
|
return should;
|
|
101
107
|
}
|
|
102
108
|
catch {
|
|
@@ -149,8 +155,9 @@ function getNpmLatestVersion() {
|
|
|
149
155
|
* Attempt to update the globally-installed CLI package via npm.
|
|
150
156
|
*
|
|
151
157
|
* This may fail if the user doesn't have write permissions to the global
|
|
152
|
-
* node_modules directory (e.g. needs sudo).
|
|
153
|
-
*
|
|
158
|
+
* node_modules directory (e.g. needs sudo).
|
|
159
|
+
*
|
|
160
|
+
* @returns true when npm install completed successfully, false otherwise
|
|
154
161
|
*/
|
|
155
162
|
function updateCli() {
|
|
156
163
|
try {
|
|
@@ -160,10 +167,12 @@ function updateCli() {
|
|
|
160
167
|
timeout: NPM_INSTALL_TIMEOUT_MS,
|
|
161
168
|
});
|
|
162
169
|
debug("pre-check npm package update completed", NPM_PACKAGE_NAME);
|
|
170
|
+
return true;
|
|
163
171
|
}
|
|
164
172
|
catch {
|
|
165
173
|
// Non-critical — the current command can still continue on older bits
|
|
166
174
|
debug("pre-check npm package update failed", NPM_PACKAGE_NAME);
|
|
175
|
+
return false;
|
|
167
176
|
}
|
|
168
177
|
}
|
|
169
178
|
/**
|
|
@@ -202,6 +211,7 @@ function downloadText(url) {
|
|
|
202
211
|
* Network failures or filesystem failures are silently ignored.
|
|
203
212
|
*/
|
|
204
213
|
async function updateSkill() {
|
|
214
|
+
debug("pre-check starting workspace", process.cwd());
|
|
205
215
|
debug("pre-check refreshing workspace SKILL.md from", SKILL_MD_URL);
|
|
206
216
|
const remoteContent = await downloadText(SKILL_MD_URL);
|
|
207
217
|
if (!remoteContent) {
|
|
@@ -211,7 +221,10 @@ async function updateSkill() {
|
|
|
211
221
|
try {
|
|
212
222
|
const targetDir = path.dirname(WORKSPACE_SKILL_PATH);
|
|
213
223
|
const tempPath = `${WORKSPACE_SKILL_PATH}.tmp`;
|
|
214
|
-
debug("pre-check writing workspace SKILL.md", {
|
|
224
|
+
debug("pre-check writing workspace SKILL.md", {
|
|
225
|
+
target: WORKSPACE_SKILL_PATH,
|
|
226
|
+
temp: tempPath,
|
|
227
|
+
});
|
|
215
228
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
216
229
|
fs.writeFileSync(tempPath, remoteContent, "utf-8");
|
|
217
230
|
fs.renameSync(tempPath, WORKSPACE_SKILL_PATH);
|
|
@@ -229,8 +242,8 @@ async function updateSkill() {
|
|
|
229
242
|
* Run the pre-flight update check.
|
|
230
243
|
*
|
|
231
244
|
* Called by cli.ts before dispatching any sub-command. If an update is
|
|
232
|
-
* detected and applied, the returned result contains a descriptive
|
|
233
|
-
* (for stderr) and `updated: true`.
|
|
245
|
+
* detected and applied successfully, the returned result contains a descriptive
|
|
246
|
+
* message (for stderr) and `updated: true`.
|
|
234
247
|
*
|
|
235
248
|
* When `updated` is true the caller should exit and prompt the agent /
|
|
236
249
|
* user to re-run the command (the running binary and SKILL.md are stale).
|
|
@@ -257,9 +270,26 @@ export async function preCheck() {
|
|
|
257
270
|
recordCheckTime();
|
|
258
271
|
return { updated: false, message: "" };
|
|
259
272
|
}
|
|
260
|
-
// --- Version mismatch → update
|
|
261
|
-
debug("pre-check update required", {
|
|
262
|
-
|
|
273
|
+
// --- Version mismatch → first update the CLI package itself ---
|
|
274
|
+
debug("pre-check update required", {
|
|
275
|
+
localVersion,
|
|
276
|
+
remoteVersion,
|
|
277
|
+
skillPath: WORKSPACE_SKILL_PATH,
|
|
278
|
+
});
|
|
279
|
+
const cliUpdated = updateCli();
|
|
280
|
+
if (!cliUpdated) {
|
|
281
|
+
recordCheckTime();
|
|
282
|
+
return {
|
|
283
|
+
updated: false,
|
|
284
|
+
message: [
|
|
285
|
+
"[zcloak-ai] Version update detected, but automatic CLI update failed.",
|
|
286
|
+
`[zcloak-ai] CLI: ${localVersion ?? "unknown"} → ${remoteVersion} (not installed)`,
|
|
287
|
+
`[zcloak-ai] Tried: npm install -g ${NPM_PACKAGE_NAME}@latest`,
|
|
288
|
+
"[zcloak-ai] Continuing with the current CLI version.",
|
|
289
|
+
].join("\n"),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// CLI upgrade succeeded → refresh workspace SKILL.md as best-effort follow-up.
|
|
263
293
|
await updateSkill();
|
|
264
294
|
recordCheckTime();
|
|
265
295
|
return {
|
|
@@ -268,7 +298,7 @@ export async function preCheck() {
|
|
|
268
298
|
"[zcloak-ai] Version update detected!",
|
|
269
299
|
`[zcloak-ai] CLI: ${localVersion ?? "unknown"} → ${remoteVersion} (updated)`,
|
|
270
300
|
`[zcloak-ai] Workspace SKILL.md target: ${WORKSPACE_SKILL_PATH}`,
|
|
271
|
-
`[zcloak-ai] if updated, tell the user version changed.
|
|
301
|
+
`[zcloak-ai] if updated, tell the user version changed. and 1. ${WORKSPACE_SKILL_PATH} maybe not the claw workingspace, you may move the SKILL.md to <claw_workingspace>/skills/zcloak-ai-agent/SKILL.md"; 2. also you must reload the updated SKILL.md and re-run the previous command because of those changes.`,
|
|
272
302
|
].join("\n"),
|
|
273
303
|
};
|
|
274
304
|
}
|
package/dist/pre-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-check.js","sourceRoot":"","sources":["../src/pre-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pre-check.js","sourceRoot":"","sources":["../src/pre-check.ts"],"names":[],"mappings":"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"}
|