@axon-assistant/core 2026.8.26 → 2026.8.27
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/dist/Daemon.d.ts.map +1 -1
- package/dist/cli.js +51 -4
- package/dist/index.js +51 -4
- package/dist/plugin-host.js +9 -1
- package/package.json +1 -1
package/dist/Daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Daemon.d.ts","sourceRoot":"","sources":["../src/Daemon.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKtD,OAAO,EAML,OAAO,EAER,MAAM,gBAAgB,CAAC;AAKxB,eAAO,MAAM,cAAc,QAC4C,CAAC;AAIxE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAoCD;;;;;;;;;;GAUG;AACH,qBAAa,MAAM;IA8BL,OAAO,CAAC,QAAQ,CAAC,OAAO;IA7BpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAgC;IAChD,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,IAAI,CAA4B;IACxC;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;IACvE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,sEAAsE;IACtE,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;gBAEnB,OAAO,GAAE,aAAkB;IAsClD,KAAK,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAqDhF;;;;;;;OAOG;YACW,YAAY;IAmC1B;;;;;OAKG;YACW,WAAW;IAkBzB;;;;;OAKG;IACG,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;IAoC3E,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC,cAAc;;;;IAOd;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAInB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAKzB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,QAAQ;IAIV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,IAAI,GAAG,IAAI,MAAM,CAGhB;IAED,4EAA4E;IAC5E,OAAO,CAAC,WAAW;YAWL,SAAS;
|
|
1
|
+
{"version":3,"file":"Daemon.d.ts","sourceRoot":"","sources":["../src/Daemon.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKtD,OAAO,EAML,OAAO,EAER,MAAM,gBAAgB,CAAC;AAKxB,eAAO,MAAM,cAAc,QAC4C,CAAC;AAIxE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAoCD;;;;;;;;;;GAUG;AACH,qBAAa,MAAM;IA8BL,OAAO,CAAC,QAAQ,CAAC,OAAO;IA7BpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAgC;IAChD,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,IAAI,CAA4B;IACxC;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;IACvE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,sEAAsE;IACtE,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;gBAEnB,OAAO,GAAE,aAAkB;IAsClD,KAAK,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAqDhF;;;;;;;OAOG;YACW,YAAY;IAmC1B;;;;;OAKG;YACW,WAAW;IAkBzB;;;;;OAKG;IACG,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;IAoC3E,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC,cAAc;;;;IAOd;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAInB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAKzB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,QAAQ;IAIV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,IAAI,GAAG,IAAI,MAAM,CAGhB;IAED,4EAA4E;IAC5E,OAAO,CAAC,WAAW;YAWL,SAAS;IAuHvB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,SAAS;CA+BlB"}
|
package/dist/cli.js
CHANGED
|
@@ -680,10 +680,33 @@ var SecretStore = class {
|
|
|
680
680
|
const row = this.db.prepare(`SELECT * FROM secrets WHERE key = ?`).get(key);
|
|
681
681
|
if (!row)
|
|
682
682
|
return null;
|
|
683
|
+
return this.decrypt(row);
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Расшифровать строку. Бросает, если значение не сходится с ключом.
|
|
687
|
+
*
|
|
688
|
+
* GCM проверяет подпись, поэтому чужой ключ шифрования — это не мусор на
|
|
689
|
+
* выходе, а честный отказ. Ловить его здесь нельзя: молча вернуть `null`
|
|
690
|
+
* значит превратить «ключ не читается» в «ключа нет», а лечатся они
|
|
691
|
+
* по-разному.
|
|
692
|
+
*/
|
|
693
|
+
decrypt(row) {
|
|
683
694
|
const decipher = crypto.createDecipheriv(ALGORITHM, this.masterKey(), row.iv);
|
|
684
695
|
decipher.setAuthTag(row.tag);
|
|
685
696
|
return Buffer.concat([decipher.update(row.ciphertext), decipher.final()]).toString("utf8");
|
|
686
697
|
}
|
|
698
|
+
/** Читается ли значение здешним ключом шифрования. */
|
|
699
|
+
readable(key) {
|
|
700
|
+
const row = this.db.prepare(`SELECT * FROM secrets WHERE key = ?`).get(key);
|
|
701
|
+
if (!row)
|
|
702
|
+
return false;
|
|
703
|
+
try {
|
|
704
|
+
this.decrypt(row);
|
|
705
|
+
return true;
|
|
706
|
+
} catch {
|
|
707
|
+
return false;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
687
710
|
delete(key) {
|
|
688
711
|
this.db.prepare(`DELETE FROM secrets WHERE key = ?`).run(key);
|
|
689
712
|
}
|
|
@@ -704,7 +727,12 @@ var SecretStore = class {
|
|
|
704
727
|
key,
|
|
705
728
|
set: true,
|
|
706
729
|
...row.hint ? { hint: row.hint } : {},
|
|
707
|
-
updatedAt: row.updated_at
|
|
730
|
+
updatedAt: row.updated_at,
|
|
731
|
+
// Наличие строки в базе — ещё не рабочий секрет: база могла приехать
|
|
732
|
+
// с другой машины, а ключ шифрования остаться там. «Ключ на месте» в
|
|
733
|
+
// таком случае врало, и человек искал причину в чём угодно, кроме
|
|
734
|
+
// переноса.
|
|
735
|
+
...this.readable(key) ? {} : { unreadable: true }
|
|
708
736
|
};
|
|
709
737
|
});
|
|
710
738
|
}
|
|
@@ -1861,7 +1889,7 @@ import fs15 from "node:fs";
|
|
|
1861
1889
|
// ../protocol/dist/primitives.js
|
|
1862
1890
|
import { z } from "zod";
|
|
1863
1891
|
var PROTOCOL_VERSION = 1;
|
|
1864
|
-
var PROTOCOL_REVISION =
|
|
1892
|
+
var PROTOCOL_REVISION = 11;
|
|
1865
1893
|
var zTimestamp = z.string().datetime();
|
|
1866
1894
|
var zId = z.string().uuid();
|
|
1867
1895
|
var zExternalId = z.string().min(1).max(256);
|
|
@@ -2907,7 +2935,15 @@ var zSecretStatus = z10.object({
|
|
|
2907
2935
|
set: z10.boolean(),
|
|
2908
2936
|
/** Последние символы значения. Присутствует, только если секрет задан. */
|
|
2909
2937
|
hint: z10.string().max(8).optional(),
|
|
2910
|
-
updatedAt: zTimestamp.optional()
|
|
2938
|
+
updatedAt: zTimestamp.optional(),
|
|
2939
|
+
/**
|
|
2940
|
+
* Значение лежит, но расшифровать его нечем.
|
|
2941
|
+
*
|
|
2942
|
+
* Так бывает после переноса: база приехала, а ключ шифрования рядом с ней —
|
|
2943
|
+
* нет (`axon backup` не кладёт его в архив без спроса). Снаружи это выглядело
|
|
2944
|
+
* как «ключ на месте», хотя ни один запрос с ним не проходит.
|
|
2945
|
+
*/
|
|
2946
|
+
unreadable: z10.boolean().optional()
|
|
2911
2947
|
});
|
|
2912
2948
|
var zSettingsGetReq = z10.object({
|
|
2913
2949
|
/** Какие ключи вернуть. Пусто — все, к которым у устройства есть доступ. */
|
|
@@ -11690,7 +11726,7 @@ var WsSession = class {
|
|
|
11690
11726
|
};
|
|
11691
11727
|
|
|
11692
11728
|
// src/Daemon.ts
|
|
11693
|
-
var DAEMON_VERSION = true ? "2026.8.
|
|
11729
|
+
var DAEMON_VERSION = true ? "2026.8.27" : "0.0.0-dev";
|
|
11694
11730
|
var MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
|
|
11695
11731
|
function isWildcard(host) {
|
|
11696
11732
|
return host === "0.0.0.0" || host === "::" || host === "";
|
|
@@ -11979,6 +12015,17 @@ var Daemon = class {
|
|
|
11979
12015
|
// ─── HTTP ─────────────────────────────────────────────────────────────────
|
|
11980
12016
|
async onRequest(req, res) {
|
|
11981
12017
|
const url = new URL(req.url ?? "/", "http://localhost");
|
|
12018
|
+
if (url.pathname.startsWith("/v1/blobs")) {
|
|
12019
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
12020
|
+
res.setHeader("Access-Control-Allow-Headers", "authorization, content-type");
|
|
12021
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
12022
|
+
res.setHeader("Access-Control-Max-Age", "86400");
|
|
12023
|
+
if (req.method === "OPTIONS") {
|
|
12024
|
+
res.writeHead(204);
|
|
12025
|
+
res.end();
|
|
12026
|
+
return;
|
|
12027
|
+
}
|
|
12028
|
+
}
|
|
11982
12029
|
if (req.method === "GET" && url.pathname === "/health") {
|
|
11983
12030
|
return respond(res, 200, {
|
|
11984
12031
|
ok: true,
|
package/dist/index.js
CHANGED
|
@@ -681,10 +681,33 @@ var SecretStore = class {
|
|
|
681
681
|
const row = this.db.prepare(`SELECT * FROM secrets WHERE key = ?`).get(key);
|
|
682
682
|
if (!row)
|
|
683
683
|
return null;
|
|
684
|
+
return this.decrypt(row);
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Расшифровать строку. Бросает, если значение не сходится с ключом.
|
|
688
|
+
*
|
|
689
|
+
* GCM проверяет подпись, поэтому чужой ключ шифрования — это не мусор на
|
|
690
|
+
* выходе, а честный отказ. Ловить его здесь нельзя: молча вернуть `null`
|
|
691
|
+
* значит превратить «ключ не читается» в «ключа нет», а лечатся они
|
|
692
|
+
* по-разному.
|
|
693
|
+
*/
|
|
694
|
+
decrypt(row) {
|
|
684
695
|
const decipher = crypto.createDecipheriv(ALGORITHM, this.masterKey(), row.iv);
|
|
685
696
|
decipher.setAuthTag(row.tag);
|
|
686
697
|
return Buffer.concat([decipher.update(row.ciphertext), decipher.final()]).toString("utf8");
|
|
687
698
|
}
|
|
699
|
+
/** Читается ли значение здешним ключом шифрования. */
|
|
700
|
+
readable(key) {
|
|
701
|
+
const row = this.db.prepare(`SELECT * FROM secrets WHERE key = ?`).get(key);
|
|
702
|
+
if (!row)
|
|
703
|
+
return false;
|
|
704
|
+
try {
|
|
705
|
+
this.decrypt(row);
|
|
706
|
+
return true;
|
|
707
|
+
} catch {
|
|
708
|
+
return false;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
688
711
|
delete(key) {
|
|
689
712
|
this.db.prepare(`DELETE FROM secrets WHERE key = ?`).run(key);
|
|
690
713
|
}
|
|
@@ -705,7 +728,12 @@ var SecretStore = class {
|
|
|
705
728
|
key,
|
|
706
729
|
set: true,
|
|
707
730
|
...row.hint ? { hint: row.hint } : {},
|
|
708
|
-
updatedAt: row.updated_at
|
|
731
|
+
updatedAt: row.updated_at,
|
|
732
|
+
// Наличие строки в базе — ещё не рабочий секрет: база могла приехать
|
|
733
|
+
// с другой машины, а ключ шифрования остаться там. «Ключ на месте» в
|
|
734
|
+
// таком случае врало, и человек искал причину в чём угодно, кроме
|
|
735
|
+
// переноса.
|
|
736
|
+
...this.readable(key) ? {} : { unreadable: true }
|
|
709
737
|
};
|
|
710
738
|
});
|
|
711
739
|
}
|
|
@@ -1725,7 +1753,7 @@ import fs14 from "node:fs";
|
|
|
1725
1753
|
// ../protocol/dist/primitives.js
|
|
1726
1754
|
import { z } from "zod";
|
|
1727
1755
|
var PROTOCOL_VERSION = 1;
|
|
1728
|
-
var PROTOCOL_REVISION =
|
|
1756
|
+
var PROTOCOL_REVISION = 11;
|
|
1729
1757
|
var zTimestamp = z.string().datetime();
|
|
1730
1758
|
var zId = z.string().uuid();
|
|
1731
1759
|
var zExternalId = z.string().min(1).max(256);
|
|
@@ -2699,7 +2727,15 @@ var zSecretStatus = z10.object({
|
|
|
2699
2727
|
set: z10.boolean(),
|
|
2700
2728
|
/** Последние символы значения. Присутствует, только если секрет задан. */
|
|
2701
2729
|
hint: z10.string().max(8).optional(),
|
|
2702
|
-
updatedAt: zTimestamp.optional()
|
|
2730
|
+
updatedAt: zTimestamp.optional(),
|
|
2731
|
+
/**
|
|
2732
|
+
* Значение лежит, но расшифровать его нечем.
|
|
2733
|
+
*
|
|
2734
|
+
* Так бывает после переноса: база приехала, а ключ шифрования рядом с ней —
|
|
2735
|
+
* нет (`axon backup` не кладёт его в архив без спроса). Снаружи это выглядело
|
|
2736
|
+
* как «ключ на месте», хотя ни один запрос с ним не проходит.
|
|
2737
|
+
*/
|
|
2738
|
+
unreadable: z10.boolean().optional()
|
|
2703
2739
|
});
|
|
2704
2740
|
var zSettingsGetReq = z10.object({
|
|
2705
2741
|
/** Какие ключи вернуть. Пусто — все, к которым у устройства есть доступ. */
|
|
@@ -11353,7 +11389,7 @@ var WsSession = class {
|
|
|
11353
11389
|
};
|
|
11354
11390
|
|
|
11355
11391
|
// src/Daemon.ts
|
|
11356
|
-
var DAEMON_VERSION = true ? "2026.8.
|
|
11392
|
+
var DAEMON_VERSION = true ? "2026.8.27" : "0.0.0-dev";
|
|
11357
11393
|
var MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
|
|
11358
11394
|
function isWildcard(host) {
|
|
11359
11395
|
return host === "0.0.0.0" || host === "::" || host === "";
|
|
@@ -11642,6 +11678,17 @@ var Daemon = class {
|
|
|
11642
11678
|
// ─── HTTP ─────────────────────────────────────────────────────────────────
|
|
11643
11679
|
async onRequest(req, res) {
|
|
11644
11680
|
const url = new URL(req.url ?? "/", "http://localhost");
|
|
11681
|
+
if (url.pathname.startsWith("/v1/blobs")) {
|
|
11682
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
11683
|
+
res.setHeader("Access-Control-Allow-Headers", "authorization, content-type");
|
|
11684
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
11685
|
+
res.setHeader("Access-Control-Max-Age", "86400");
|
|
11686
|
+
if (req.method === "OPTIONS") {
|
|
11687
|
+
res.writeHead(204);
|
|
11688
|
+
res.end();
|
|
11689
|
+
return;
|
|
11690
|
+
}
|
|
11691
|
+
}
|
|
11645
11692
|
if (req.method === "GET" && url.pathname === "/health") {
|
|
11646
11693
|
return respond(res, 200, {
|
|
11647
11694
|
ok: true,
|
package/dist/plugin-host.js
CHANGED
|
@@ -986,7 +986,15 @@ var zSecretStatus = z10.object({
|
|
|
986
986
|
set: z10.boolean(),
|
|
987
987
|
/** Последние символы значения. Присутствует, только если секрет задан. */
|
|
988
988
|
hint: z10.string().max(8).optional(),
|
|
989
|
-
updatedAt: zTimestamp.optional()
|
|
989
|
+
updatedAt: zTimestamp.optional(),
|
|
990
|
+
/**
|
|
991
|
+
* Значение лежит, но расшифровать его нечем.
|
|
992
|
+
*
|
|
993
|
+
* Так бывает после переноса: база приехала, а ключ шифрования рядом с ней —
|
|
994
|
+
* нет (`axon backup` не кладёт его в архив без спроса). Снаружи это выглядело
|
|
995
|
+
* как «ключ на месте», хотя ни один запрос с ним не проходит.
|
|
996
|
+
*/
|
|
997
|
+
unreadable: z10.boolean().optional()
|
|
990
998
|
});
|
|
991
999
|
var zSettingsGetReq = z10.object({
|
|
992
1000
|
/** Какие ключи вернуть. Пусто — все, к которым у устройства есть доступ. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axon-assistant/core",
|
|
3
|
-
"version": "2026.8.
|
|
3
|
+
"version": "2026.8.27",
|
|
4
4
|
"comment:version": "Заглушка. Настоящий номер проставляется из git-тега при публикации: см. scripts/release-npm.mjs. Версия, которую правят руками, рано или поздно расходится с тем, что опубликовано.",
|
|
5
5
|
"description": "Ядро Axon: персональный AI-агент, который живёт на вашей машине",
|
|
6
6
|
"keywords": [
|