claude-flow 3.59.14 → 3.59.15
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/.claude/proven-config.json +1 -1
- package/package.json +1 -1
- package/v3/@claude-flow/cli/catalog-manifest.json +2 -2
- package/v3/@claude-flow/cli/dist/src/commands/agntcy/runtime.d.ts +22 -0
- package/v3/@claude-flow/cli/dist/src/commands/agntcy/runtime.js +22 -0
- package/v3/@claude-flow/cli/dist/src/encryption/vault.d.ts +10 -1
- package/v3/@claude-flow/cli/dist/src/encryption/vault.js +17 -1
- package/v3/@claude-flow/cli/dist/src/fs-secure.js +3 -1
- package/v3/@claude-flow/cli/dist/src/mcp-tools/terminal-tools.js +3 -3
- package/v3/@claude-flow/cli/dist/src/services/worker-daemon.js +10 -2
- package/v3/@claude-flow/cli/package.json +2 -2
package/package.json
CHANGED
|
@@ -27,6 +27,28 @@
|
|
|
27
27
|
* pre-release channel, pin deliberately rather than floating) until the fix
|
|
28
28
|
* is promoted to `latest`, tracked by the same issue.
|
|
29
29
|
*
|
|
30
|
+
* UPDATE (2026-10-22, #4371): `2.0.0-alpha.5`'s own `optionalDependencies`
|
|
31
|
+
* claimed `@agntcy/slim-bindings-linux-arm64-musl@2.0.0-alpha.5`, but that
|
|
32
|
+
* platform package was never published upstream (its own first version is
|
|
33
|
+
* `2.1.1-rc.2` — confirmed via `npm view @agntcy/slim-bindings-linux-arm64-musl
|
|
34
|
+
* versions`, which is also true of every other `2.0.0-alpha.*`/`2.0.0`/`2.1.0`
|
|
35
|
+
* release). npm tolerates an unresolvable optional dependency and silently
|
|
36
|
+
* skips it, so this never surfaced in this repo's own npm-based CI, but
|
|
37
|
+
* strict resolvers (`mise`'s `aube` backend, pnpm in some modes) fail the
|
|
38
|
+
* whole install. `package.json` now pins `2.1.1` — the earliest release where
|
|
39
|
+
* every platform's optional package actually exists at that exact version
|
|
40
|
+
* (verified against the live registry for all 8 platforms). Re-verified live
|
|
41
|
+
* under plain Node against the real installed `2.1.1` package: the dynamic
|
|
42
|
+
* `import()` resolves with zero errors (same module shape — a `Session`/
|
|
43
|
+
* `Channel`/`App`-class-based SDK, not the `joinGroup`/`createSlimTransport`/
|
|
44
|
+
* `publishAgentRecord` flat functions `transport.ts`/`swarm-join.ts`/
|
|
45
|
+
* `publish.ts` call. Confirmed this mismatch predates this pin change — it
|
|
46
|
+
* was equally absent from `2.0.0-alpha.5` — so it's a pre-existing gap this
|
|
47
|
+
* version bump does not introduce or worsen; tracked separately in #4376),
|
|
48
|
+
* and the full
|
|
49
|
+
* `__tests__/agntcy/agntcy-commands.test.ts` suite (19 tests, including the
|
|
50
|
+
* real-resolution "configured: true" case) passes against this version.
|
|
51
|
+
*
|
|
30
52
|
* This module's existing graceful-degradation design already handled this
|
|
31
53
|
* correctly without any change to its logic: `detectAgntcyRuntime()`'s
|
|
32
54
|
* catch-all branch (anything other than MODULE_NOT_FOUND) reports the real
|
|
@@ -27,6 +27,28 @@
|
|
|
27
27
|
* pre-release channel, pin deliberately rather than floating) until the fix
|
|
28
28
|
* is promoted to `latest`, tracked by the same issue.
|
|
29
29
|
*
|
|
30
|
+
* UPDATE (2026-10-22, #4371): `2.0.0-alpha.5`'s own `optionalDependencies`
|
|
31
|
+
* claimed `@agntcy/slim-bindings-linux-arm64-musl@2.0.0-alpha.5`, but that
|
|
32
|
+
* platform package was never published upstream (its own first version is
|
|
33
|
+
* `2.1.1-rc.2` — confirmed via `npm view @agntcy/slim-bindings-linux-arm64-musl
|
|
34
|
+
* versions`, which is also true of every other `2.0.0-alpha.*`/`2.0.0`/`2.1.0`
|
|
35
|
+
* release). npm tolerates an unresolvable optional dependency and silently
|
|
36
|
+
* skips it, so this never surfaced in this repo's own npm-based CI, but
|
|
37
|
+
* strict resolvers (`mise`'s `aube` backend, pnpm in some modes) fail the
|
|
38
|
+
* whole install. `package.json` now pins `2.1.1` — the earliest release where
|
|
39
|
+
* every platform's optional package actually exists at that exact version
|
|
40
|
+
* (verified against the live registry for all 8 platforms). Re-verified live
|
|
41
|
+
* under plain Node against the real installed `2.1.1` package: the dynamic
|
|
42
|
+
* `import()` resolves with zero errors (same module shape — a `Session`/
|
|
43
|
+
* `Channel`/`App`-class-based SDK, not the `joinGroup`/`createSlimTransport`/
|
|
44
|
+
* `publishAgentRecord` flat functions `transport.ts`/`swarm-join.ts`/
|
|
45
|
+
* `publish.ts` call. Confirmed this mismatch predates this pin change — it
|
|
46
|
+
* was equally absent from `2.0.0-alpha.5` — so it's a pre-existing gap this
|
|
47
|
+
* version bump does not introduce or worsen; tracked separately in #4376),
|
|
48
|
+
* and the full
|
|
49
|
+
* `__tests__/agntcy/agntcy-commands.test.ts` suite (19 tests, including the
|
|
50
|
+
* real-resolution "configured: true" case) passes against this version.
|
|
51
|
+
*
|
|
30
52
|
* This module's existing graceful-degradation design already handled this
|
|
31
53
|
* correctly without any change to its logic: `detectAgntcyRuntime()`'s
|
|
32
54
|
* catch-all branch (anything other than MODULE_NOT_FOUND) reports the real
|
|
@@ -41,6 +41,15 @@ export declare function isEncryptionEnabled(): boolean;
|
|
|
41
41
|
* encryption is enabled but no key resolves, this throws with a clear
|
|
42
42
|
* message rather than silently falling back to plaintext (fail-closed).
|
|
43
43
|
*
|
|
44
|
+
* The optional `context` selects which missing-key message to throw:
|
|
45
|
+
* - `'encrypt'` (default): the caller is about to encrypt because
|
|
46
|
+
* `CLAUDE_FLOW_ENCRYPT_AT_REST` is set, so the original message is
|
|
47
|
+
* accurate.
|
|
48
|
+
* - `'decrypt'`: the caller hit an RFE1-encrypted blob on read (e.g. a
|
|
49
|
+
* store restored from another machine) while the enable flag may be
|
|
50
|
+
* unset (issue #3212). The message echoes the flag's actual value and
|
|
51
|
+
* the on-disk state instead of asserting the flag is set.
|
|
52
|
+
*
|
|
44
53
|
* Accepted encodings (auto-detected by length):
|
|
45
54
|
* - 64-char hex (32 bytes)
|
|
46
55
|
* - 44-char base64 (32 bytes + padding)
|
|
@@ -49,7 +58,7 @@ export declare function isEncryptionEnabled(): boolean;
|
|
|
49
58
|
* Anything else is rejected — we'd rather fail loudly than encrypt with a
|
|
50
59
|
* truncated key.
|
|
51
60
|
*/
|
|
52
|
-
export declare function getKey(): Buffer;
|
|
61
|
+
export declare function getKey(context?: 'encrypt' | 'decrypt'): Buffer;
|
|
53
62
|
/**
|
|
54
63
|
* Decode a key string. Exposed for testing and for the future passphrase
|
|
55
64
|
* resolver, which will scrypt-derive a Buffer and hand it back through here
|
|
@@ -58,6 +58,15 @@ export function isEncryptionEnabled() {
|
|
|
58
58
|
* encryption is enabled but no key resolves, this throws with a clear
|
|
59
59
|
* message rather than silently falling back to plaintext (fail-closed).
|
|
60
60
|
*
|
|
61
|
+
* The optional `context` selects which missing-key message to throw:
|
|
62
|
+
* - `'encrypt'` (default): the caller is about to encrypt because
|
|
63
|
+
* `CLAUDE_FLOW_ENCRYPT_AT_REST` is set, so the original message is
|
|
64
|
+
* accurate.
|
|
65
|
+
* - `'decrypt'`: the caller hit an RFE1-encrypted blob on read (e.g. a
|
|
66
|
+
* store restored from another machine) while the enable flag may be
|
|
67
|
+
* unset (issue #3212). The message echoes the flag's actual value and
|
|
68
|
+
* the on-disk state instead of asserting the flag is set.
|
|
69
|
+
*
|
|
61
70
|
* Accepted encodings (auto-detected by length):
|
|
62
71
|
* - 64-char hex (32 bytes)
|
|
63
72
|
* - 44-char base64 (32 bytes + padding)
|
|
@@ -66,9 +75,16 @@ export function isEncryptionEnabled() {
|
|
|
66
75
|
* Anything else is rejected — we'd rather fail loudly than encrypt with a
|
|
67
76
|
* truncated key.
|
|
68
77
|
*/
|
|
69
|
-
export function getKey() {
|
|
78
|
+
export function getKey(context = 'encrypt') {
|
|
70
79
|
const raw = process.env[ENV_KEY_VAR];
|
|
71
80
|
if (!raw) {
|
|
81
|
+
if (context === 'decrypt') {
|
|
82
|
+
const flag = process.env[ENV_ENABLE_FLAG] ?? 'unset';
|
|
83
|
+
throw new Error(`${ENV_KEY_VAR} is required but not set ` +
|
|
84
|
+
`(${ENV_ENABLE_FLAG}=${flag}; the store on disk is RFE1-encrypted). ` +
|
|
85
|
+
`Supply the key this store was encrypted with — a newly generated key will not decrypt it. ` +
|
|
86
|
+
`Provide a 32-byte key as 64-char hex or 44-char base64.`);
|
|
87
|
+
}
|
|
72
88
|
throw new Error(`${ENV_ENABLE_FLAG} is set but ${ENV_KEY_VAR} is not. ` +
|
|
73
89
|
`Provide a 32-byte key as 64-char hex or 44-char base64. ` +
|
|
74
90
|
`See ADR-096 for keychain/passphrase support (coming in a follow-up).`);
|
|
@@ -172,7 +172,9 @@ export function readFileMaybeEncrypted(path, encoding = 'utf-8') {
|
|
|
172
172
|
const raw = readFileSync(path);
|
|
173
173
|
let plain;
|
|
174
174
|
if (isEncryptedBlob(raw)) {
|
|
175
|
-
|
|
175
|
+
// 'decrypt': the blob on disk is RFE1-encrypted but the enable flag may
|
|
176
|
+
// be unset (e.g. store restored from another machine) — see #3212.
|
|
177
|
+
plain = decryptBuffer(raw, getKey('decrypt'));
|
|
176
178
|
}
|
|
177
179
|
else {
|
|
178
180
|
plain = raw;
|
|
@@ -304,10 +304,10 @@ export const terminalTools = [
|
|
|
304
304
|
// Return combined history from all sessions
|
|
305
305
|
const allHistory = Object.values(store.sessions)
|
|
306
306
|
.flatMap(s => s.history.map(h => ({ ...h, sessionId: s.id })))
|
|
307
|
-
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
308
|
-
.slice(offset, offset + limit);
|
|
307
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
309
308
|
return {
|
|
310
|
-
history: allHistory,
|
|
309
|
+
history: allHistory.slice(offset, offset + limit),
|
|
310
|
+
// Every stored entry, like the single-session branch, not just this page.
|
|
311
311
|
total: allHistory.length,
|
|
312
312
|
};
|
|
313
313
|
},
|
|
@@ -404,14 +404,22 @@ export class WorkerDaemon extends EventEmitter {
|
|
|
404
404
|
return {};
|
|
405
405
|
}
|
|
406
406
|
try {
|
|
407
|
-
// The CLI writes nested objects; legacy files use dotted keys.
|
|
407
|
+
// The CLI writes nested objects; legacy files use dotted keys. Each
|
|
408
|
+
// key resolves independently through scopes.project -> values -> root
|
|
409
|
+
// — `values` is the envelope config_set writes for its default scope
|
|
410
|
+
// (#3192 — without this, config_set daemon.idleSecs 0 has no effect
|
|
411
|
+
// on the running daemon even though it succeeds and updates
|
|
412
|
+
// config.json) — rather than picking one whole object as "cfg", since
|
|
413
|
+
// a config.json can legitimately have some keys written under
|
|
414
|
+
// scopes.project (project-scoped config_set calls) and others under
|
|
415
|
+
// values (default-scope config_set calls) at the same time. Scoped
|
|
408
416
|
// values retain precedence, including explicit false and zero.
|
|
409
417
|
const read = (obj, key) => {
|
|
410
418
|
if (!obj)
|
|
411
419
|
return undefined;
|
|
412
420
|
return obj[key] ?? key.split('.').reduce((value, part) => value && typeof value === 'object' && Object.hasOwn(value, part) ? value[part] : undefined, obj);
|
|
413
421
|
};
|
|
414
|
-
const get = (key) => read(raw?.scopes?.project, key) ?? read(raw, key);
|
|
422
|
+
const get = (key) => read(raw?.scopes?.project, key) ?? read(raw?.values, key) ?? read(raw, key);
|
|
415
423
|
const rawAutoStart = get('daemon.autoStart');
|
|
416
424
|
const rawCpuLoad = get('daemon.resourceThresholds.maxCpuLoad');
|
|
417
425
|
const rawMinMem = get('daemon.resourceThresholds.minFreeMemoryPercent');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claude-flow/cli",
|
|
3
|
-
"version": "3.59.
|
|
3
|
+
"version": "3.59.15",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ruflo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"@claude-flow/memory": "3.0.8"
|
|
130
130
|
},
|
|
131
131
|
"optionalDependencies": {
|
|
132
|
-
"@agntcy/slim-bindings": "2.
|
|
132
|
+
"@agntcy/slim-bindings": "2.1.1",
|
|
133
133
|
"@claude-flow/memory": "3.0.8",
|
|
134
134
|
"@metaharness/darwin": "~0.12.0",
|
|
135
135
|
"@metaharness/flywheel": "~0.1.10",
|