@hydra-acp/archiver 0.1.0
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/LICENSE +21 -0
- package/README.md +169 -0
- package/dist/acp/attach.js +192 -0
- package/dist/acp/attach.js.map +1 -0
- package/dist/acp/protocol.js +13 -0
- package/dist/acp/protocol.js.map +1 -0
- package/dist/archive-loop.js +134 -0
- package/dist/archive-loop.js.map +1 -0
- package/dist/backend/factory.js +19 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/fs.js +73 -0
- package/dist/backend/fs.js.map +1 -0
- package/dist/backend/google-drive.js +151 -0
- package/dist/backend/google-drive.js.map +1 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/bridge.js +100 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cold-sweep.js +45 -0
- package/dist/cold-sweep.js.map +1 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.js +74 -0
- package/dist/daemon.js.map +1 -0
- package/dist/discovery.js +82 -0
- package/dist/discovery.js.map +1 -0
- package/dist/envelope.js +111 -0
- package/dist/envelope.js.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth/google.js +193 -0
- package/dist/oauth/google.js.map +1 -0
- package/dist/pull-loop.js +129 -0
- package/dist/pull-loop.js.map +1 -0
- package/dist/rule.js +37 -0
- package/dist/rule.js.map +1 -0
- package/dist/state.js +68 -0
- package/dist/state.js.map +1 -0
- package/dist/util/log.js +46 -0
- package/dist/util/log.js.map +1 -0
- package/package.json +42 -0
package/dist/rule.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAkB3B,MAAM,CAAC,MAAM,YAAY,GAAiB,GAAG,EAAE,CAAC,IAAI,CAAC;AAErD,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CACN,qBAAqB,IAAI,4FAA4F,CACtH,CAAC;YACF,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,sBAAsB,CAAC,CAAC;QAClE,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,WAAW,IAAI,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAA0B,CAAC;QACzD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,wDAAwD,CAAC,CAAC;YAC1E,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,EAAkB,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,YAAa,GAAa,CAAC,OAAO,sBAAsB,CAAC,CAAC;QACjF,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { logger } from "./util/log.js";
|
|
4
|
+
const log = logger("state");
|
|
5
|
+
function emptyState() {
|
|
6
|
+
return { version: 1, lineages: {} };
|
|
7
|
+
}
|
|
8
|
+
// All writes go through a single in-process queue so concurrent
|
|
9
|
+
// setLineageState calls don't interleave their read-modify-write cycles
|
|
10
|
+
// and lose updates. Cross-process safety is out of scope — only one
|
|
11
|
+
// archiver runs per hydra daemon.
|
|
12
|
+
export class SyncState {
|
|
13
|
+
path;
|
|
14
|
+
cache;
|
|
15
|
+
writeChain = Promise.resolve();
|
|
16
|
+
constructor(path) {
|
|
17
|
+
this.path = path;
|
|
18
|
+
}
|
|
19
|
+
async load() {
|
|
20
|
+
try {
|
|
21
|
+
const text = await readFile(this.path, "utf8");
|
|
22
|
+
const parsed = JSON.parse(text);
|
|
23
|
+
if (parsed.version !== 1 || !parsed.lineages) {
|
|
24
|
+
log.warn(`state file at ${this.path} had unexpected shape; ignoring`);
|
|
25
|
+
this.cache = emptyState();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.cache = parsed;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const e = err;
|
|
32
|
+
if (e.code === "ENOENT") {
|
|
33
|
+
this.cache = emptyState();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
log.warn(`failed to read ${this.path}: ${e.message}; starting fresh`);
|
|
37
|
+
this.cache = emptyState();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
get(lineageId) {
|
|
41
|
+
if (!this.cache) {
|
|
42
|
+
throw new Error("SyncState.get called before load()");
|
|
43
|
+
}
|
|
44
|
+
return this.cache.lineages[lineageId] ?? {};
|
|
45
|
+
}
|
|
46
|
+
set(lineageId, patch) {
|
|
47
|
+
if (!this.cache) {
|
|
48
|
+
throw new Error("SyncState.set called before load()");
|
|
49
|
+
}
|
|
50
|
+
const prev = this.cache.lineages[lineageId] ?? {};
|
|
51
|
+
this.cache.lineages[lineageId] = { ...prev, ...patch };
|
|
52
|
+
return this.flush();
|
|
53
|
+
}
|
|
54
|
+
flush() {
|
|
55
|
+
const snapshot = JSON.stringify(this.cache, null, 2);
|
|
56
|
+
const next = this.writeChain.then(async () => {
|
|
57
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
58
|
+
const tmp = `${this.path}.tmp`;
|
|
59
|
+
await writeFile(tmp, snapshot, { mode: 0o600 });
|
|
60
|
+
await rename(tmp, this.path);
|
|
61
|
+
});
|
|
62
|
+
this.writeChain = next.catch((err) => {
|
|
63
|
+
log.warn(`failed to persist ${this.path}: ${err.message}`);
|
|
64
|
+
});
|
|
65
|
+
return next;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/util/log.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
let debugEnabled = false;
|
|
2
|
+
export function setDebug(on) {
|
|
3
|
+
debugEnabled = on;
|
|
4
|
+
}
|
|
5
|
+
function emit(level, scope, args) {
|
|
6
|
+
const ts = new Date().toISOString();
|
|
7
|
+
const stream = level === "error" || level === "warn" ? process.stderr : process.stdout;
|
|
8
|
+
stream.write(`[${ts}] ${level} [${scope}] ${formatArgs(args)}\n`);
|
|
9
|
+
}
|
|
10
|
+
function formatArgs(args) {
|
|
11
|
+
return args
|
|
12
|
+
.map((a) => {
|
|
13
|
+
if (typeof a === "string") {
|
|
14
|
+
return a;
|
|
15
|
+
}
|
|
16
|
+
if (a instanceof Error) {
|
|
17
|
+
return a.stack ?? a.message;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
return JSON.stringify(a);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return String(a);
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
.join(" ");
|
|
27
|
+
}
|
|
28
|
+
export function logger(scope) {
|
|
29
|
+
return {
|
|
30
|
+
debug(...args) {
|
|
31
|
+
if (debugEnabled) {
|
|
32
|
+
emit("debug", scope, args);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
info(...args) {
|
|
36
|
+
emit("info", scope, args);
|
|
37
|
+
},
|
|
38
|
+
warn(...args) {
|
|
39
|
+
emit("warn", scope, args);
|
|
40
|
+
},
|
|
41
|
+
error(...args) {
|
|
42
|
+
emit("error", scope, args);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/util/log.ts"],"names":[],"mappings":"AAEA,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,QAAQ,CAAC,EAAW;IAClC,YAAY,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,IAAI,CAAC,KAAY,EAAE,KAAa,EAAE,IAAe;IACxD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,IAAe;IACjC,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AASD,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO;QACL,KAAK,CAAC,GAAG,IAAe;YACtB,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,IAAe;YACrB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,GAAG,IAAe;YACrB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,IAAe;YACtB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hydra-acp/archiver",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Session sync extension for hydra-acp — uploads session bundles to a shared backend (Google Drive, fs) and imports peers' bundles.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public",
|
|
9
|
+
"registry": "https://registry.npmjs.org"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"hydra-acp-archiver": "dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p .",
|
|
22
|
+
"watch": "tsc -p . --watch",
|
|
23
|
+
"start": "node dist/index.js",
|
|
24
|
+
"dev": "tsc -p . && node dist/index.js",
|
|
25
|
+
"test": "node --test --import tsx 'test/**/*.test.ts'",
|
|
26
|
+
"lint": "tsc -p . --noEmit",
|
|
27
|
+
"prepublishOnly": "npm run build && npm test"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"googleapis": "^144.0.0",
|
|
34
|
+
"ws": "^8.20.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.10.0",
|
|
38
|
+
"@types/ws": "^8.18.1",
|
|
39
|
+
"tsx": "^4.20.0",
|
|
40
|
+
"typescript": "^5.6.3"
|
|
41
|
+
}
|
|
42
|
+
}
|