ccsini 0.1.19 → 0.1.21

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.
Files changed (3) hide show
  1. package/README.md +17 -10
  2. package/dist/index.js +634 -508
  3. package/package.json +41 -41
package/README.md CHANGED
@@ -43,6 +43,8 @@ ccsini init --token <your-token>
43
43
  | `ccsini sync pull` | Pull settings from cloud |
44
44
  | `ccsini sync status` | Show current sync status |
45
45
  | `ccsini sync cleanup` | Remove orphaned blobs from cloud storage |
46
+ | `ccsini update` | Update ccsini to the latest version |
47
+ | `ccsini version` | Show current version |
46
48
  | `ccsini doctor` | Diagnose configuration issues |
47
49
 
48
50
  ### Cleanup
@@ -59,28 +61,33 @@ ccsini sync cleanup
59
61
 
60
62
  ## What Gets Synced
61
63
 
64
+ Only the files that matter for cross-device coding context:
65
+
62
66
  | Category | Examples |
63
67
  |---|---|
64
- | Sessions | `projects/**/*.jsonl` |
65
- | Memory | `projects/*/memory/**` |
68
+ | Memory | `projects/*/memory/**` (MEMORY.md) |
69
+ | CLAUDE.md | `projects/**/CLAUDE.md` |
66
70
  | Skills | `skills/**` |
67
71
  | Commands | `commands/**` |
68
72
  | Config | `settings.json`, `keybindings.json`, `mcp.json` |
69
- | CLAUDE.md | `projects/**/CLAUDE.md` |
70
73
 
71
74
  ### Excluded from sync
72
75
 
73
- - `node_modules/` (at any depth)
76
+ - `node_modules/`, `cache/` (at any depth)
74
77
  - `file-history/` (local undo data)
75
- - `cache/`, `telemetry/`, `debug/`, `downloads/`
78
+ - `tool-results/` (ephemeral tool output)
79
+ - `todos/` (session task lists)
80
+ - `plugins/`, `plans/`
81
+ - `*.jsonl` session transcripts
82
+ - `telemetry/`, `debug/`, `downloads/`
76
83
  - `.credentials.json`
77
84
 
78
- ## How It Works
85
+ ## Security
79
86
 
80
- 1. Your Claude Code settings are encrypted locally before leaving your device
81
- 2. Encrypted data is synced to the ccsini cloud
82
- 3. Other devices pull and decrypt with your encryption key
83
- 4. We never see your settings zero-knowledge encryption
87
+ - **Argon2id** key derivation (64MB memory-hard, same as 1Password/Bitwarden)
88
+ - **AES-256-GCM** per-file encryption with HKDF-derived keys
89
+ - **Zero-knowledge** server never sees your data
90
+ - **Pure WASM** crypto no native build dependencies, works on all platforms
84
91
 
85
92
  ## Requirements
86
93
 
package/dist/index.js CHANGED
@@ -2474,18 +2474,18 @@ var stdoutColor, stderrColor, GENERATOR, STYLER, IS_EMPTY, levelMapping, styles2
2474
2474
  closeAll,
2475
2475
  parent
2476
2476
  };
2477
- }, createBuilder = (self, _styler, _isEmpty) => {
2477
+ }, createBuilder = (self2, _styler, _isEmpty) => {
2478
2478
  const builder = (...arguments_) => applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" "));
2479
2479
  Object.setPrototypeOf(builder, proto);
2480
- builder[GENERATOR] = self;
2480
+ builder[GENERATOR] = self2;
2481
2481
  builder[STYLER] = _styler;
2482
2482
  builder[IS_EMPTY] = _isEmpty;
2483
2483
  return builder;
2484
- }, applyStyle = (self, string) => {
2485
- if (self.level <= 0 || !string) {
2486
- return self[IS_EMPTY] ? "" : string;
2484
+ }, applyStyle = (self2, string) => {
2485
+ if (self2.level <= 0 || !string) {
2486
+ return self2[IS_EMPTY] ? "" : string;
2487
2487
  }
2488
- let styler = self[STYLER];
2488
+ let styler = self2[STYLER];
2489
2489
  if (styler === undefined) {
2490
2490
  return string;
2491
2491
  }
@@ -2679,10 +2679,10 @@ class Emitter {
2679
2679
  count = 0;
2680
2680
  id = Math.random();
2681
2681
  constructor() {
2682
- if (global[kExitEmitter]) {
2683
- return global[kExitEmitter];
2682
+ if (global2[kExitEmitter]) {
2683
+ return global2[kExitEmitter];
2684
2684
  }
2685
- ObjectDefineProperty(global, kExitEmitter, {
2685
+ ObjectDefineProperty(global2, kExitEmitter, {
2686
2686
  value: this,
2687
2687
  writable: false,
2688
2688
  enumerable: false,
@@ -2722,7 +2722,7 @@ class Emitter {
2722
2722
 
2723
2723
  class SignalExitBase {
2724
2724
  }
2725
- var processOk = (process3) => !!process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function", kExitEmitter, global, ObjectDefineProperty, signalExitWrap = (handler) => {
2725
+ var processOk = (process3) => !!process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function", kExitEmitter, global2, ObjectDefineProperty, signalExitWrap = (handler) => {
2726
2726
  return {
2727
2727
  onExit(cb, opts) {
2728
2728
  return handler.onExit(cb, opts);
@@ -2738,7 +2738,7 @@ var processOk = (process3) => !!process3 && typeof process3 === "object" && type
2738
2738
  var init_mjs = __esm(() => {
2739
2739
  init_signals();
2740
2740
  kExitEmitter = Symbol.for("signal-exit emitter");
2741
- global = globalThis;
2741
+ global2 = globalThis;
2742
2742
  ObjectDefineProperty = Object.defineProperty.bind(Object);
2743
2743
  SignalExitFallback = class SignalExitFallback extends SignalExitBase {
2744
2744
  onExit() {
@@ -26459,480 +26459,6 @@ var init_dist16 = __esm(() => {
26459
26459
  dist_default12 = inquirer;
26460
26460
  });
26461
26461
 
26462
- // ../../node_modules/.bun/@phc+format@1.0.0/node_modules/@phc/format/index.js
26463
- var require_format = __commonJS((exports, module) => {
26464
- var idRegex = /^[a-z0-9-]{1,32}$/;
26465
- var nameRegex = /^[a-z0-9-]{1,32}$/;
26466
- var valueRegex = /^[a-zA-Z0-9/+.-]+$/;
26467
- var b64Regex = /^([a-zA-Z0-9/+.-]+|)$/;
26468
- var decimalRegex = /^((-)?[1-9]\d*|0)$/;
26469
- var versionRegex = /^v=(\d+)$/;
26470
- function objToKeyVal(obj) {
26471
- return objectKeys(obj).map((k) => [k, obj[k]].join("=")).join(",");
26472
- }
26473
- function keyValtoObj(str) {
26474
- const obj = {};
26475
- str.split(",").forEach((ps) => {
26476
- const pss = ps.split("=");
26477
- if (pss.length < 2) {
26478
- throw new TypeError(`params must be in the format name=value`);
26479
- }
26480
- obj[pss.shift()] = pss.join("=");
26481
- });
26482
- return obj;
26483
- }
26484
- function objectKeys(object) {
26485
- return Object.keys(object);
26486
- }
26487
- function objectValues(object) {
26488
- if (typeof Object.values === "function")
26489
- return Object.values(object);
26490
- return objectKeys(object).map((k) => object[k]);
26491
- }
26492
- function serialize(opts) {
26493
- const fields = [""];
26494
- if (typeof opts !== "object" || opts === null) {
26495
- throw new TypeError("opts must be an object");
26496
- }
26497
- if (typeof opts.id !== "string") {
26498
- throw new TypeError("id must be a string");
26499
- }
26500
- if (!idRegex.test(opts.id)) {
26501
- throw new TypeError(`id must satisfy ${idRegex}`);
26502
- }
26503
- fields.push(opts.id);
26504
- if (typeof opts.version !== "undefined") {
26505
- if (typeof opts.version !== "number" || opts.version < 0 || !Number.isInteger(opts.version)) {
26506
- throw new TypeError("version must be a positive integer number");
26507
- }
26508
- fields.push(`v=${opts.version}`);
26509
- }
26510
- if (typeof opts.params !== "undefined") {
26511
- if (typeof opts.params !== "object" || opts.params === null) {
26512
- throw new TypeError("params must be an object");
26513
- }
26514
- const pk = objectKeys(opts.params);
26515
- if (!pk.every((p) => nameRegex.test(p))) {
26516
- throw new TypeError(`params names must satisfy ${nameRegex}`);
26517
- }
26518
- pk.forEach((k) => {
26519
- if (typeof opts.params[k] === "number") {
26520
- opts.params[k] = opts.params[k].toString();
26521
- } else if (Buffer.isBuffer(opts.params[k])) {
26522
- opts.params[k] = opts.params[k].toString("base64").split("=")[0];
26523
- }
26524
- });
26525
- const pv = objectValues(opts.params);
26526
- if (!pv.every((v) => typeof v === "string")) {
26527
- throw new TypeError("params values must be strings");
26528
- }
26529
- if (!pv.every((v) => valueRegex.test(v))) {
26530
- throw new TypeError(`params values must satisfy ${valueRegex}`);
26531
- }
26532
- const strpar = objToKeyVal(opts.params);
26533
- fields.push(strpar);
26534
- }
26535
- if (typeof opts.salt !== "undefined") {
26536
- if (!Buffer.isBuffer(opts.salt)) {
26537
- throw new TypeError("salt must be a Buffer");
26538
- }
26539
- fields.push(opts.salt.toString("base64").split("=")[0]);
26540
- if (typeof opts.hash !== "undefined") {
26541
- if (!Buffer.isBuffer(opts.hash)) {
26542
- throw new TypeError("hash must be a Buffer");
26543
- }
26544
- fields.push(opts.hash.toString("base64").split("=")[0]);
26545
- }
26546
- }
26547
- const phcstr = fields.join("$");
26548
- return phcstr;
26549
- }
26550
- function deserialize(phcstr) {
26551
- if (typeof phcstr !== "string" || phcstr === "") {
26552
- throw new TypeError("pchstr must be a non-empty string");
26553
- }
26554
- if (phcstr[0] !== "$") {
26555
- throw new TypeError("pchstr must contain a $ as first char");
26556
- }
26557
- const fields = phcstr.split("$");
26558
- fields.shift();
26559
- let maxf = 5;
26560
- if (!versionRegex.test(fields[1]))
26561
- maxf--;
26562
- if (fields.length > maxf) {
26563
- throw new TypeError(`pchstr contains too many fileds: ${fields.length}/${maxf}`);
26564
- }
26565
- const id = fields.shift();
26566
- if (!idRegex.test(id)) {
26567
- throw new TypeError(`id must satisfy ${idRegex}`);
26568
- }
26569
- let version;
26570
- if (versionRegex.test(fields[0])) {
26571
- version = parseInt(fields.shift().match(versionRegex)[1], 10);
26572
- }
26573
- let hash;
26574
- let salt;
26575
- if (b64Regex.test(fields[fields.length - 1])) {
26576
- if (fields.length > 1 && b64Regex.test(fields[fields.length - 2])) {
26577
- hash = Buffer.from(fields.pop(), "base64");
26578
- salt = Buffer.from(fields.pop(), "base64");
26579
- } else {
26580
- salt = Buffer.from(fields.pop(), "base64");
26581
- }
26582
- }
26583
- let params;
26584
- if (fields.length > 0) {
26585
- const parstr = fields.pop();
26586
- params = keyValtoObj(parstr);
26587
- if (!objectKeys(params).every((p) => nameRegex.test(p))) {
26588
- throw new TypeError(`params names must satisfy ${nameRegex}`);
26589
- }
26590
- const pv = objectValues(params);
26591
- if (!pv.every((v) => valueRegex.test(v))) {
26592
- throw new TypeError(`params values must satisfy ${valueRegex}`);
26593
- }
26594
- const pk = objectKeys(params);
26595
- pk.forEach((k) => {
26596
- params[k] = decimalRegex.test(params[k]) ? parseInt(params[k], 10) : params[k];
26597
- });
26598
- }
26599
- if (fields.length > 0) {
26600
- throw new TypeError(`pchstr contains unrecognized fileds: ${fields}`);
26601
- }
26602
- const phcobj = { id };
26603
- if (version)
26604
- phcobj.version = version;
26605
- if (params)
26606
- phcobj.params = params;
26607
- if (salt)
26608
- phcobj.salt = salt;
26609
- if (hash)
26610
- phcobj.hash = hash;
26611
- return phcobj;
26612
- }
26613
- module.exports = {
26614
- serialize,
26615
- deserialize
26616
- };
26617
- });
26618
-
26619
- // ../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js
26620
- var require_node_gyp_build = __commonJS((exports, module) => {
26621
- var fs = __require("fs");
26622
- var path2 = __require("path");
26623
- var os3 = __require("os");
26624
- var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
26625
- var vars = process.config && process.config.variables || {};
26626
- var prebuildsOnly = !!process.env.PREBUILDS_ONLY;
26627
- var abi = process.versions.modules;
26628
- var runtime = isElectron() ? "electron" : isNwjs() ? "node-webkit" : "node";
26629
- var arch = process.env.npm_config_arch || os3.arch();
26630
- var platform = process.env.npm_config_platform || os3.platform();
26631
- var libc = process.env.LIBC || (isAlpine(platform) ? "musl" : "glibc");
26632
- var armv = process.env.ARM_VERSION || (arch === "arm64" ? "8" : vars.arm_version) || "";
26633
- var uv = (process.versions.uv || "").split(".")[0];
26634
- module.exports = load2;
26635
- function load2(dir) {
26636
- return runtimeRequire(load2.resolve(dir));
26637
- }
26638
- load2.resolve = load2.path = function(dir) {
26639
- dir = path2.resolve(dir || ".");
26640
- try {
26641
- var name = runtimeRequire(path2.join(dir, "package.json")).name.toUpperCase().replace(/-/g, "_");
26642
- if (process.env[name + "_PREBUILD"])
26643
- dir = process.env[name + "_PREBUILD"];
26644
- } catch (err) {}
26645
- if (!prebuildsOnly) {
26646
- var release = getFirst(path2.join(dir, "build/Release"), matchBuild);
26647
- if (release)
26648
- return release;
26649
- var debug = getFirst(path2.join(dir, "build/Debug"), matchBuild);
26650
- if (debug)
26651
- return debug;
26652
- }
26653
- var prebuild = resolve(dir);
26654
- if (prebuild)
26655
- return prebuild;
26656
- var nearby = resolve(path2.dirname(process.execPath));
26657
- if (nearby)
26658
- return nearby;
26659
- var target = [
26660
- "platform=" + platform,
26661
- "arch=" + arch,
26662
- "runtime=" + runtime,
26663
- "abi=" + abi,
26664
- "uv=" + uv,
26665
- armv ? "armv=" + armv : "",
26666
- "libc=" + libc,
26667
- "node=" + process.versions.node,
26668
- process.versions.electron ? "electron=" + process.versions.electron : "",
26669
- typeof __webpack_require__ === "function" ? "webpack=true" : ""
26670
- ].filter(Boolean).join(" ");
26671
- throw new Error("No native build was found for " + target + `
26672
- loaded from: ` + dir + `
26673
- `);
26674
- function resolve(dir2) {
26675
- var tuples = readdirSync(path2.join(dir2, "prebuilds")).map(parseTuple);
26676
- var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0];
26677
- if (!tuple)
26678
- return;
26679
- var prebuilds = path2.join(dir2, "prebuilds", tuple.name);
26680
- var parsed = readdirSync(prebuilds).map(parseTags);
26681
- var candidates = parsed.filter(matchTags(runtime, abi));
26682
- var winner = candidates.sort(compareTags(runtime))[0];
26683
- if (winner)
26684
- return path2.join(prebuilds, winner.file);
26685
- }
26686
- };
26687
- function readdirSync(dir) {
26688
- try {
26689
- return fs.readdirSync(dir);
26690
- } catch (err) {
26691
- return [];
26692
- }
26693
- }
26694
- function getFirst(dir, filter2) {
26695
- var files = readdirSync(dir).filter(filter2);
26696
- return files[0] && path2.join(dir, files[0]);
26697
- }
26698
- function matchBuild(name) {
26699
- return /\.node$/.test(name);
26700
- }
26701
- function parseTuple(name) {
26702
- var arr = name.split("-");
26703
- if (arr.length !== 2)
26704
- return;
26705
- var platform2 = arr[0];
26706
- var architectures = arr[1].split("+");
26707
- if (!platform2)
26708
- return;
26709
- if (!architectures.length)
26710
- return;
26711
- if (!architectures.every(Boolean))
26712
- return;
26713
- return { name, platform: platform2, architectures };
26714
- }
26715
- function matchTuple(platform2, arch2) {
26716
- return function(tuple) {
26717
- if (tuple == null)
26718
- return false;
26719
- if (tuple.platform !== platform2)
26720
- return false;
26721
- return tuple.architectures.includes(arch2);
26722
- };
26723
- }
26724
- function compareTuples(a, b) {
26725
- return a.architectures.length - b.architectures.length;
26726
- }
26727
- function parseTags(file) {
26728
- var arr = file.split(".");
26729
- var extension = arr.pop();
26730
- var tags = { file, specificity: 0 };
26731
- if (extension !== "node")
26732
- return;
26733
- for (var i = 0;i < arr.length; i++) {
26734
- var tag2 = arr[i];
26735
- if (tag2 === "node" || tag2 === "electron" || tag2 === "node-webkit") {
26736
- tags.runtime = tag2;
26737
- } else if (tag2 === "napi") {
26738
- tags.napi = true;
26739
- } else if (tag2.slice(0, 3) === "abi") {
26740
- tags.abi = tag2.slice(3);
26741
- } else if (tag2.slice(0, 2) === "uv") {
26742
- tags.uv = tag2.slice(2);
26743
- } else if (tag2.slice(0, 4) === "armv") {
26744
- tags.armv = tag2.slice(4);
26745
- } else if (tag2 === "glibc" || tag2 === "musl") {
26746
- tags.libc = tag2;
26747
- } else {
26748
- continue;
26749
- }
26750
- tags.specificity++;
26751
- }
26752
- return tags;
26753
- }
26754
- function matchTags(runtime2, abi2) {
26755
- return function(tags) {
26756
- if (tags == null)
26757
- return false;
26758
- if (tags.runtime && tags.runtime !== runtime2 && !runtimeAgnostic(tags))
26759
- return false;
26760
- if (tags.abi && tags.abi !== abi2 && !tags.napi)
26761
- return false;
26762
- if (tags.uv && tags.uv !== uv)
26763
- return false;
26764
- if (tags.armv && tags.armv !== armv)
26765
- return false;
26766
- if (tags.libc && tags.libc !== libc)
26767
- return false;
26768
- return true;
26769
- };
26770
- }
26771
- function runtimeAgnostic(tags) {
26772
- return tags.runtime === "node" && tags.napi;
26773
- }
26774
- function compareTags(runtime2) {
26775
- return function(a, b) {
26776
- if (a.runtime !== b.runtime) {
26777
- return a.runtime === runtime2 ? -1 : 1;
26778
- } else if (a.abi !== b.abi) {
26779
- return a.abi ? -1 : 1;
26780
- } else if (a.specificity !== b.specificity) {
26781
- return a.specificity > b.specificity ? -1 : 1;
26782
- } else {
26783
- return 0;
26784
- }
26785
- };
26786
- }
26787
- function isNwjs() {
26788
- return !!(process.versions && process.versions.nw);
26789
- }
26790
- function isElectron() {
26791
- if (process.versions && process.versions.electron)
26792
- return true;
26793
- if (process.env.ELECTRON_RUN_AS_NODE)
26794
- return true;
26795
- return typeof window !== "undefined" && window.process && window.process.type === "renderer";
26796
- }
26797
- function isAlpine(platform2) {
26798
- return platform2 === "linux" && fs.existsSync("/etc/alpine-release");
26799
- }
26800
- load2.parseTags = parseTags;
26801
- load2.matchTags = matchTags;
26802
- load2.compareTags = compareTags;
26803
- load2.parseTuple = parseTuple;
26804
- load2.matchTuple = matchTuple;
26805
- load2.compareTuples = compareTuples;
26806
- });
26807
-
26808
- // ../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js
26809
- var require_node_gyp_build2 = __commonJS((exports, module) => {
26810
- var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
26811
- if (typeof runtimeRequire.addon === "function") {
26812
- module.exports = runtimeRequire.addon.bind(runtimeRequire);
26813
- } else {
26814
- module.exports = require_node_gyp_build();
26815
- }
26816
- });
26817
-
26818
- // ../../node_modules/.bun/argon2@0.44.0/node_modules/argon2/argon2.cjs
26819
- var require_argon2 = __commonJS((exports, module) => {
26820
- var __dirname = "D:\\Projects\\klaude-sync\\node_modules\\.bun\\argon2@0.44.0\\node_modules\\argon2";
26821
- var { randomBytes, timingSafeEqual } = __require("crypto");
26822
- var { promisify } = __require("util");
26823
- var { deserialize, serialize } = require_format();
26824
- var gypBuild = require_node_gyp_build2();
26825
- var { hash: bindingsHash } = gypBuild(__dirname);
26826
- var generateSalt = promisify(randomBytes);
26827
- var argon2d = 0;
26828
- var argon2i = 1;
26829
- var argon2id = 2;
26830
- exports.argon2d = argon2d;
26831
- exports.argon2i = argon2i;
26832
- exports.argon2id = argon2id;
26833
- var types2 = Object.freeze({ argon2d, argon2i, argon2id });
26834
- var names = Object.freeze({
26835
- [types2.argon2d]: "argon2d",
26836
- [types2.argon2i]: "argon2i",
26837
- [types2.argon2id]: "argon2id"
26838
- });
26839
- var defaults = {
26840
- hashLength: 32,
26841
- timeCost: 3,
26842
- memoryCost: 1 << 16,
26843
- parallelism: 4,
26844
- type: argon2id,
26845
- version: 19
26846
- };
26847
- async function hash(password, options) {
26848
- let { raw, salt, ...rest } = { ...defaults, ...options };
26849
- if (rest.hashLength > 2 ** 32 - 1) {
26850
- throw new RangeError("Hash length is too large");
26851
- }
26852
- if (rest.memoryCost > 2 ** 32 - 1) {
26853
- throw new RangeError("Memory cost is too large");
26854
- }
26855
- if (rest.timeCost > 2 ** 32 - 1) {
26856
- throw new RangeError("Time cost is too large");
26857
- }
26858
- if (rest.parallelism > 2 ** 24 - 1) {
26859
- throw new RangeError("Parallelism is too large");
26860
- }
26861
- salt = salt ?? await generateSalt(16);
26862
- const {
26863
- hashLength,
26864
- secret = Buffer.alloc(0),
26865
- type,
26866
- version,
26867
- memoryCost: m,
26868
- timeCost: t,
26869
- parallelism: p,
26870
- associatedData: data = Buffer.alloc(0)
26871
- } = rest;
26872
- const hash2 = await bindingsHash({
26873
- password: Buffer.from(password),
26874
- salt,
26875
- secret,
26876
- data,
26877
- hashLength,
26878
- m,
26879
- t,
26880
- p,
26881
- version,
26882
- type
26883
- });
26884
- if (raw) {
26885
- return hash2;
26886
- }
26887
- return serialize({
26888
- id: names[type],
26889
- version,
26890
- params: { m, t, p, ...data.byteLength > 0 ? { data } : {} },
26891
- salt,
26892
- hash: hash2
26893
- });
26894
- }
26895
- exports.hash = hash;
26896
- function needsRehash(digest, options = {}) {
26897
- const { memoryCost, timeCost, parallelism, version } = {
26898
- ...defaults,
26899
- ...options
26900
- };
26901
- const {
26902
- version: v,
26903
- params: { m, t, p }
26904
- } = deserialize(digest);
26905
- return +v !== +version || +m !== +memoryCost || +t !== +timeCost || +p !== +parallelism;
26906
- }
26907
- exports.needsRehash = needsRehash;
26908
- async function verify(digest, password, options = {}) {
26909
- const { id, ...rest } = deserialize(digest);
26910
- if (!(id in types2)) {
26911
- return false;
26912
- }
26913
- const {
26914
- version = 16,
26915
- params: { m, t, p, data = "" },
26916
- salt,
26917
- hash: hash2
26918
- } = rest;
26919
- const { secret = Buffer.alloc(0) } = options;
26920
- return timingSafeEqual(await bindingsHash({
26921
- password: Buffer.from(password),
26922
- salt,
26923
- secret,
26924
- data: Buffer.from(data, "base64"),
26925
- hashLength: hash2.byteLength,
26926
- m: +m,
26927
- t: +t,
26928
- p: +p,
26929
- version: +version,
26930
- type: types2[id]
26931
- }), hash2);
26932
- }
26933
- exports.verify = verify;
26934
- });
26935
-
26936
26462
  // ../../node_modules/.bun/commander@13.1.0/node_modules/commander/esm.mjs
26937
26463
  var import__ = __toESM(require_commander(), 1);
26938
26464
  var {
@@ -26950,7 +26476,7 @@ var {
26950
26476
  } = import__.default;
26951
26477
 
26952
26478
  // src/version.ts
26953
- var VERSION = "0.1.19";
26479
+ var VERSION = "0.1.21";
26954
26480
 
26955
26481
  // src/commands/init.ts
26956
26482
  init_source();
@@ -28077,18 +27603,630 @@ async function createDeviceJWT(privateKey, deviceId) {
28077
27603
  return new SignJWT({}).setProtectedHeader({ alg: "EdDSA" }).setIssuer("ccsini").setSubject(deviceId).setIssuedAt().setExpirationTime(`${JWT_EXPIRY_SECONDS}s`).sign(privateKey);
28078
27604
  }
28079
27605
 
27606
+ // ../../node_modules/.bun/hash-wasm@4.12.0/node_modules/hash-wasm/dist/index.esm.js
27607
+ /*!
27608
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
27609
+ * (c) Dani Biro
27610
+ * @license MIT
27611
+ */
27612
+ function __awaiter(thisArg, _arguments, P, generator) {
27613
+ function adopt(value) {
27614
+ return value instanceof P ? value : new P(function(resolve) {
27615
+ resolve(value);
27616
+ });
27617
+ }
27618
+ return new (P || (P = Promise))(function(resolve, reject) {
27619
+ function fulfilled(value) {
27620
+ try {
27621
+ step(generator.next(value));
27622
+ } catch (e) {
27623
+ reject(e);
27624
+ }
27625
+ }
27626
+ function rejected(value) {
27627
+ try {
27628
+ step(generator["throw"](value));
27629
+ } catch (e) {
27630
+ reject(e);
27631
+ }
27632
+ }
27633
+ function step(result) {
27634
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
27635
+ }
27636
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
27637
+ });
27638
+ }
27639
+ class Mutex {
27640
+ constructor() {
27641
+ this.mutex = Promise.resolve();
27642
+ }
27643
+ lock() {
27644
+ let begin = () => {};
27645
+ this.mutex = this.mutex.then(() => new Promise(begin));
27646
+ return new Promise((res) => {
27647
+ begin = res;
27648
+ });
27649
+ }
27650
+ dispatch(fn) {
27651
+ return __awaiter(this, undefined, undefined, function* () {
27652
+ const unlock = yield this.lock();
27653
+ try {
27654
+ return yield Promise.resolve(fn());
27655
+ } finally {
27656
+ unlock();
27657
+ }
27658
+ });
27659
+ }
27660
+ }
27661
+ var _a;
27662
+ function getGlobal() {
27663
+ if (typeof globalThis !== "undefined")
27664
+ return globalThis;
27665
+ if (typeof self !== "undefined")
27666
+ return self;
27667
+ if (typeof window !== "undefined")
27668
+ return window;
27669
+ return global;
27670
+ }
27671
+ var globalObject = getGlobal();
27672
+ var nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== undefined ? _a : null;
27673
+ var textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder : null;
27674
+ function hexCharCodesToInt(a, b) {
27675
+ return (a & 15) + (a >> 6 | a >> 3 & 8) << 4 | (b & 15) + (b >> 6 | b >> 3 & 8);
27676
+ }
27677
+ function writeHexToUInt8(buf, str) {
27678
+ const size = str.length >> 1;
27679
+ for (let i = 0;i < size; i++) {
27680
+ const index = i << 1;
27681
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
27682
+ }
27683
+ }
27684
+ function hexStringEqualsUInt8(str, buf) {
27685
+ if (str.length !== buf.length * 2) {
27686
+ return false;
27687
+ }
27688
+ for (let i = 0;i < buf.length; i++) {
27689
+ const strIndex = i << 1;
27690
+ if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
27691
+ return false;
27692
+ }
27693
+ }
27694
+ return true;
27695
+ }
27696
+ var alpha = 97 - 10;
27697
+ var digit = 48;
27698
+ function getDigestHex(tmpBuffer, input, hashLength) {
27699
+ let p = 0;
27700
+ for (let i = 0;i < hashLength; i++) {
27701
+ let nibble = input[i] >>> 4;
27702
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
27703
+ nibble = input[i] & 15;
27704
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
27705
+ }
27706
+ return String.fromCharCode.apply(null, tmpBuffer);
27707
+ }
27708
+ var getUInt8Buffer = nodeBuffer !== null ? (data) => {
27709
+ if (typeof data === "string") {
27710
+ const buf = nodeBuffer.from(data, "utf8");
27711
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
27712
+ }
27713
+ if (nodeBuffer.isBuffer(data)) {
27714
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
27715
+ }
27716
+ if (ArrayBuffer.isView(data)) {
27717
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
27718
+ }
27719
+ throw new Error("Invalid data type!");
27720
+ } : (data) => {
27721
+ if (typeof data === "string") {
27722
+ return textEncoder.encode(data);
27723
+ }
27724
+ if (ArrayBuffer.isView(data)) {
27725
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
27726
+ }
27727
+ throw new Error("Invalid data type!");
27728
+ };
27729
+ var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
27730
+ var base64Lookup = new Uint8Array(256);
27731
+ for (let i = 0;i < base64Chars.length; i++) {
27732
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
27733
+ }
27734
+ function encodeBase642(data, pad = true) {
27735
+ const len = data.length;
27736
+ const extraBytes = len % 3;
27737
+ const parts = [];
27738
+ const len2 = len - extraBytes;
27739
+ for (let i = 0;i < len2; i += 3) {
27740
+ const tmp = (data[i] << 16 & 16711680) + (data[i + 1] << 8 & 65280) + (data[i + 2] & 255);
27741
+ const triplet = base64Chars.charAt(tmp >> 18 & 63) + base64Chars.charAt(tmp >> 12 & 63) + base64Chars.charAt(tmp >> 6 & 63) + base64Chars.charAt(tmp & 63);
27742
+ parts.push(triplet);
27743
+ }
27744
+ if (extraBytes === 1) {
27745
+ const tmp = data[len - 1];
27746
+ const a = base64Chars.charAt(tmp >> 2);
27747
+ const b = base64Chars.charAt(tmp << 4 & 63);
27748
+ parts.push(`${a}${b}`);
27749
+ if (pad) {
27750
+ parts.push("==");
27751
+ }
27752
+ } else if (extraBytes === 2) {
27753
+ const tmp = (data[len - 2] << 8) + data[len - 1];
27754
+ const a = base64Chars.charAt(tmp >> 10);
27755
+ const b = base64Chars.charAt(tmp >> 4 & 63);
27756
+ const c = base64Chars.charAt(tmp << 2 & 63);
27757
+ parts.push(`${a}${b}${c}`);
27758
+ if (pad) {
27759
+ parts.push("=");
27760
+ }
27761
+ }
27762
+ return parts.join("");
27763
+ }
27764
+ function getDecodeBase64Length(data) {
27765
+ let bufferLength = Math.floor(data.length * 0.75);
27766
+ const len = data.length;
27767
+ if (data[len - 1] === "=") {
27768
+ bufferLength -= 1;
27769
+ if (data[len - 2] === "=") {
27770
+ bufferLength -= 1;
27771
+ }
27772
+ }
27773
+ return bufferLength;
27774
+ }
27775
+ function decodeBase642(data) {
27776
+ const bufferLength = getDecodeBase64Length(data);
27777
+ const len = data.length;
27778
+ const bytes = new Uint8Array(bufferLength);
27779
+ let p = 0;
27780
+ for (let i = 0;i < len; i += 4) {
27781
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
27782
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
27783
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
27784
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
27785
+ bytes[p] = encoded1 << 2 | encoded2 >> 4;
27786
+ p += 1;
27787
+ bytes[p] = (encoded2 & 15) << 4 | encoded3 >> 2;
27788
+ p += 1;
27789
+ bytes[p] = (encoded3 & 3) << 6 | encoded4 & 63;
27790
+ p += 1;
27791
+ }
27792
+ return bytes;
27793
+ }
27794
+ var MAX_HEAP = 16 * 1024;
27795
+ var WASM_FUNC_HASH_LENGTH = 4;
27796
+ var wasmMutex = new Mutex;
27797
+ var wasmModuleCache = new Map;
27798
+ function WASMInterface(binary, hashLength) {
27799
+ return __awaiter(this, undefined, undefined, function* () {
27800
+ let wasmInstance = null;
27801
+ let memoryView = null;
27802
+ let initialized = false;
27803
+ if (typeof WebAssembly === "undefined") {
27804
+ throw new Error("WebAssembly is not supported in this environment!");
27805
+ }
27806
+ const writeMemory = (data, offset = 0) => {
27807
+ memoryView.set(data, offset);
27808
+ };
27809
+ const getMemory = () => memoryView;
27810
+ const getExports = () => wasmInstance.exports;
27811
+ const setMemorySize = (totalSize) => {
27812
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
27813
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
27814
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
27815
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
27816
+ };
27817
+ const getStateSize = () => {
27818
+ const view = new DataView(wasmInstance.exports.memory.buffer);
27819
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
27820
+ return stateSize;
27821
+ };
27822
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, undefined, undefined, function* () {
27823
+ if (!wasmModuleCache.has(binary.name)) {
27824
+ const asm = decodeBase642(binary.data);
27825
+ const promise = WebAssembly.compile(asm);
27826
+ wasmModuleCache.set(binary.name, promise);
27827
+ }
27828
+ const module = yield wasmModuleCache.get(binary.name);
27829
+ wasmInstance = yield WebAssembly.instantiate(module, {});
27830
+ }));
27831
+ const setupInterface = () => __awaiter(this, undefined, undefined, function* () {
27832
+ if (!wasmInstance) {
27833
+ yield loadWASMPromise;
27834
+ }
27835
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
27836
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
27837
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
27838
+ });
27839
+ const init = (bits = null) => {
27840
+ initialized = true;
27841
+ wasmInstance.exports.Hash_Init(bits);
27842
+ };
27843
+ const updateUInt8Array = (data) => {
27844
+ let read = 0;
27845
+ while (read < data.length) {
27846
+ const chunk = data.subarray(read, read + MAX_HEAP);
27847
+ read += chunk.length;
27848
+ memoryView.set(chunk);
27849
+ wasmInstance.exports.Hash_Update(chunk.length);
27850
+ }
27851
+ };
27852
+ const update = (data) => {
27853
+ if (!initialized) {
27854
+ throw new Error("update() called before init()");
27855
+ }
27856
+ const Uint8Buffer = getUInt8Buffer(data);
27857
+ updateUInt8Array(Uint8Buffer);
27858
+ };
27859
+ const digestChars = new Uint8Array(hashLength * 2);
27860
+ const digest = (outputType, padding = null) => {
27861
+ if (!initialized) {
27862
+ throw new Error("digest() called before init()");
27863
+ }
27864
+ initialized = false;
27865
+ wasmInstance.exports.Hash_Final(padding);
27866
+ if (outputType === "binary") {
27867
+ return memoryView.slice(0, hashLength);
27868
+ }
27869
+ return getDigestHex(digestChars, memoryView, hashLength);
27870
+ };
27871
+ const save = () => {
27872
+ if (!initialized) {
27873
+ throw new Error("save() can only be called after init() and before digest()");
27874
+ }
27875
+ const stateOffset = wasmInstance.exports.Hash_GetState();
27876
+ const stateLength = getStateSize();
27877
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
27878
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
27879
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
27880
+ writeHexToUInt8(prefixedState, binary.hash);
27881
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
27882
+ return prefixedState;
27883
+ };
27884
+ const load2 = (state) => {
27885
+ if (!(state instanceof Uint8Array)) {
27886
+ throw new Error("load() expects an Uint8Array generated by save()");
27887
+ }
27888
+ const stateOffset = wasmInstance.exports.Hash_GetState();
27889
+ const stateLength = getStateSize();
27890
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
27891
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
27892
+ if (state.length !== overallLength) {
27893
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
27894
+ }
27895
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
27896
+ throw new Error("This state was written by an incompatible hash implementation");
27897
+ }
27898
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
27899
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
27900
+ initialized = true;
27901
+ };
27902
+ const isDataShort = (data) => {
27903
+ if (typeof data === "string") {
27904
+ return data.length < MAX_HEAP / 4;
27905
+ }
27906
+ return data.byteLength < MAX_HEAP;
27907
+ };
27908
+ let canSimplify = isDataShort;
27909
+ switch (binary.name) {
27910
+ case "argon2":
27911
+ case "scrypt":
27912
+ canSimplify = () => true;
27913
+ break;
27914
+ case "blake2b":
27915
+ case "blake2s":
27916
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
27917
+ break;
27918
+ case "blake3":
27919
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
27920
+ break;
27921
+ case "xxhash64":
27922
+ case "xxhash3":
27923
+ case "xxhash128":
27924
+ case "crc64":
27925
+ canSimplify = () => false;
27926
+ break;
27927
+ }
27928
+ const calculate = (data, initParam = null, digestParam = null) => {
27929
+ if (!canSimplify(data, initParam)) {
27930
+ init(initParam);
27931
+ update(data);
27932
+ return digest("hex", digestParam);
27933
+ }
27934
+ const buffer = getUInt8Buffer(data);
27935
+ memoryView.set(buffer);
27936
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
27937
+ return getDigestHex(digestChars, memoryView, hashLength);
27938
+ };
27939
+ yield setupInterface();
27940
+ return {
27941
+ getMemory,
27942
+ writeMemory,
27943
+ getExports,
27944
+ setMemorySize,
27945
+ init,
27946
+ update,
27947
+ digest,
27948
+ save,
27949
+ load: load2,
27950
+ calculate,
27951
+ hashLength
27952
+ };
27953
+ });
27954
+ }
27955
+ var mutex$l = new Mutex;
27956
+ var name$k = "argon2";
27957
+ var data$k = "AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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";
27958
+ var hash$k = "e4cdc523";
27959
+ var wasmJson$k = {
27960
+ name: name$k,
27961
+ data: data$k,
27962
+ hash: hash$k
27963
+ };
27964
+ var name$j = "blake2b";
27965
+ var data$j = "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";
27966
+ var hash$j = "c6f286e6";
27967
+ var wasmJson$j = {
27968
+ name: name$j,
27969
+ data: data$j,
27970
+ hash: hash$j
27971
+ };
27972
+ var mutex$k = new Mutex;
27973
+ function validateBits$4(bits) {
27974
+ if (!Number.isInteger(bits) || bits < 8 || bits > 512 || bits % 8 !== 0) {
27975
+ return new Error("Invalid variant! Valid values: 8, 16, ..., 512");
27976
+ }
27977
+ return null;
27978
+ }
27979
+ function getInitParam$1(outputBits, keyBits) {
27980
+ return outputBits | keyBits << 16;
27981
+ }
27982
+ function createBLAKE2b(bits = 512, key = null) {
27983
+ if (validateBits$4(bits)) {
27984
+ return Promise.reject(validateBits$4(bits));
27985
+ }
27986
+ let keyBuffer = null;
27987
+ let initParam = bits;
27988
+ if (key !== null) {
27989
+ keyBuffer = getUInt8Buffer(key);
27990
+ if (keyBuffer.length > 64) {
27991
+ return Promise.reject(new Error("Max key length is 64 bytes"));
27992
+ }
27993
+ initParam = getInitParam$1(bits, keyBuffer.length);
27994
+ }
27995
+ const outputSize = bits / 8;
27996
+ return WASMInterface(wasmJson$j, outputSize).then((wasm) => {
27997
+ if (initParam > 512) {
27998
+ wasm.writeMemory(keyBuffer);
27999
+ }
28000
+ wasm.init(initParam);
28001
+ const obj = {
28002
+ init: initParam > 512 ? () => {
28003
+ wasm.writeMemory(keyBuffer);
28004
+ wasm.init(initParam);
28005
+ return obj;
28006
+ } : () => {
28007
+ wasm.init(initParam);
28008
+ return obj;
28009
+ },
28010
+ update: (data) => {
28011
+ wasm.update(data);
28012
+ return obj;
28013
+ },
28014
+ digest: (outputType) => wasm.digest(outputType),
28015
+ save: () => wasm.save(),
28016
+ load: (data) => {
28017
+ wasm.load(data);
28018
+ return obj;
28019
+ },
28020
+ blockSize: 128,
28021
+ digestSize: outputSize
28022
+ };
28023
+ return obj;
28024
+ });
28025
+ }
28026
+ function encodeResult(salt, options, res) {
28027
+ const parameters = [
28028
+ `m=${options.memorySize}`,
28029
+ `t=${options.iterations}`,
28030
+ `p=${options.parallelism}`
28031
+ ].join(",");
28032
+ return `$argon2${options.hashType}$v=19$${parameters}$${encodeBase642(salt, false)}$${encodeBase642(res, false)}`;
28033
+ }
28034
+ var uint32View = new DataView(new ArrayBuffer(4));
28035
+ function int32LE(x) {
28036
+ uint32View.setInt32(0, x, true);
28037
+ return new Uint8Array(uint32View.buffer);
28038
+ }
28039
+ function hashFunc(blake512, buf, len) {
28040
+ return __awaiter(this, undefined, undefined, function* () {
28041
+ if (len <= 64) {
28042
+ const blake = yield createBLAKE2b(len * 8);
28043
+ blake.update(int32LE(len));
28044
+ blake.update(buf);
28045
+ return blake.digest("binary");
28046
+ }
28047
+ const r = Math.ceil(len / 32) - 2;
28048
+ const ret = new Uint8Array(len);
28049
+ blake512.init();
28050
+ blake512.update(int32LE(len));
28051
+ blake512.update(buf);
28052
+ let vp = blake512.digest("binary");
28053
+ ret.set(vp.subarray(0, 32), 0);
28054
+ for (let i = 1;i < r; i++) {
28055
+ blake512.init();
28056
+ blake512.update(vp);
28057
+ vp = blake512.digest("binary");
28058
+ ret.set(vp.subarray(0, 32), i * 32);
28059
+ }
28060
+ const partialBytesNeeded = len - 32 * r;
28061
+ let blakeSmall;
28062
+ if (partialBytesNeeded === 64) {
28063
+ blakeSmall = blake512;
28064
+ blakeSmall.init();
28065
+ } else {
28066
+ blakeSmall = yield createBLAKE2b(partialBytesNeeded * 8);
28067
+ }
28068
+ blakeSmall.update(vp);
28069
+ vp = blakeSmall.digest("binary");
28070
+ ret.set(vp.subarray(0, partialBytesNeeded), r * 32);
28071
+ return ret;
28072
+ });
28073
+ }
28074
+ function getHashType(type) {
28075
+ switch (type) {
28076
+ case "d":
28077
+ return 0;
28078
+ case "i":
28079
+ return 1;
28080
+ default:
28081
+ return 2;
28082
+ }
28083
+ }
28084
+ function argon2Internal(options) {
28085
+ return __awaiter(this, undefined, undefined, function* () {
28086
+ var _a2;
28087
+ const { parallelism, iterations, hashLength } = options;
28088
+ const password = getUInt8Buffer(options.password);
28089
+ const salt = getUInt8Buffer(options.salt);
28090
+ const version = 19;
28091
+ const hashType = getHashType(options.hashType);
28092
+ const { memorySize } = options;
28093
+ const secret = getUInt8Buffer((_a2 = options.secret) !== null && _a2 !== undefined ? _a2 : "");
28094
+ const [argon2Interface, blake512] = yield Promise.all([
28095
+ WASMInterface(wasmJson$k, 1024),
28096
+ createBLAKE2b(512)
28097
+ ]);
28098
+ argon2Interface.setMemorySize(memorySize * 1024 + 1024);
28099
+ const initVector = new Uint8Array(24);
28100
+ const initVectorView = new DataView(initVector.buffer);
28101
+ initVectorView.setInt32(0, parallelism, true);
28102
+ initVectorView.setInt32(4, hashLength, true);
28103
+ initVectorView.setInt32(8, memorySize, true);
28104
+ initVectorView.setInt32(12, iterations, true);
28105
+ initVectorView.setInt32(16, version, true);
28106
+ initVectorView.setInt32(20, hashType, true);
28107
+ argon2Interface.writeMemory(initVector, memorySize * 1024);
28108
+ blake512.init();
28109
+ blake512.update(initVector);
28110
+ blake512.update(int32LE(password.length));
28111
+ blake512.update(password);
28112
+ blake512.update(int32LE(salt.length));
28113
+ blake512.update(salt);
28114
+ blake512.update(int32LE(secret.length));
28115
+ blake512.update(secret);
28116
+ blake512.update(int32LE(0));
28117
+ const segments = Math.floor(memorySize / (parallelism * 4));
28118
+ const lanes = segments * 4;
28119
+ const param = new Uint8Array(72);
28120
+ const H0 = blake512.digest("binary");
28121
+ param.set(H0);
28122
+ for (let lane = 0;lane < parallelism; lane++) {
28123
+ param.set(int32LE(0), 64);
28124
+ param.set(int32LE(lane), 68);
28125
+ let position = lane * lanes;
28126
+ let chunk = yield hashFunc(blake512, param, 1024);
28127
+ argon2Interface.writeMemory(chunk, position * 1024);
28128
+ position += 1;
28129
+ param.set(int32LE(1), 64);
28130
+ chunk = yield hashFunc(blake512, param, 1024);
28131
+ argon2Interface.writeMemory(chunk, position * 1024);
28132
+ }
28133
+ const C = new Uint8Array(1024);
28134
+ writeHexToUInt8(C, argon2Interface.calculate(new Uint8Array([]), memorySize));
28135
+ const res = yield hashFunc(blake512, C, hashLength);
28136
+ if (options.outputType === "hex") {
28137
+ const digestChars = new Uint8Array(hashLength * 2);
28138
+ return getDigestHex(digestChars, res, hashLength);
28139
+ }
28140
+ if (options.outputType === "encoded") {
28141
+ return encodeResult(salt, options, res);
28142
+ }
28143
+ return res;
28144
+ });
28145
+ }
28146
+ var validateOptions$3 = (options) => {
28147
+ var _a2;
28148
+ if (!options || typeof options !== "object") {
28149
+ throw new Error("Invalid options parameter. It requires an object.");
28150
+ }
28151
+ if (!options.password) {
28152
+ throw new Error("Password must be specified");
28153
+ }
28154
+ options.password = getUInt8Buffer(options.password);
28155
+ if (options.password.length < 1) {
28156
+ throw new Error("Password must be specified");
28157
+ }
28158
+ if (!options.salt) {
28159
+ throw new Error("Salt must be specified");
28160
+ }
28161
+ options.salt = getUInt8Buffer(options.salt);
28162
+ if (options.salt.length < 8) {
28163
+ throw new Error("Salt should be at least 8 bytes long");
28164
+ }
28165
+ options.secret = getUInt8Buffer((_a2 = options.secret) !== null && _a2 !== undefined ? _a2 : "");
28166
+ if (!Number.isInteger(options.iterations) || options.iterations < 1) {
28167
+ throw new Error("Iterations should be a positive number");
28168
+ }
28169
+ if (!Number.isInteger(options.parallelism) || options.parallelism < 1) {
28170
+ throw new Error("Parallelism should be a positive number");
28171
+ }
28172
+ if (!Number.isInteger(options.hashLength) || options.hashLength < 4) {
28173
+ throw new Error("Hash length should be at least 4 bytes.");
28174
+ }
28175
+ if (!Number.isInteger(options.memorySize)) {
28176
+ throw new Error("Memory size should be specified.");
28177
+ }
28178
+ if (options.memorySize < 8 * options.parallelism) {
28179
+ throw new Error("Memory size should be at least 8 * parallelism.");
28180
+ }
28181
+ if (options.outputType === undefined) {
28182
+ options.outputType = "hex";
28183
+ }
28184
+ if (!["hex", "binary", "encoded"].includes(options.outputType)) {
28185
+ throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary', 'encoded']`);
28186
+ }
28187
+ };
28188
+ function argon2id(options) {
28189
+ return __awaiter(this, undefined, undefined, function* () {
28190
+ validateOptions$3(options);
28191
+ return argon2Internal(Object.assign(Object.assign({}, options), { hashType: "id" }));
28192
+ });
28193
+ }
28194
+ var mutex$j = new Mutex;
28195
+ var mutex$i = new Mutex;
28196
+ var mutex$h = new Mutex;
28197
+ var mutex$g = new Mutex;
28198
+ var polyBuffer = new Uint8Array(8);
28199
+ var mutex$f = new Mutex;
28200
+ var mutex$e = new Mutex;
28201
+ var mutex$d = new Mutex;
28202
+ var mutex$c = new Mutex;
28203
+ var mutex$b = new Mutex;
28204
+ var mutex$a = new Mutex;
28205
+ var mutex$9 = new Mutex;
28206
+ var mutex$8 = new Mutex;
28207
+ var mutex$7 = new Mutex;
28208
+ var mutex$6 = new Mutex;
28209
+ var mutex$5 = new Mutex;
28210
+ var seedBuffer$2 = new Uint8Array(8);
28211
+ var mutex$4 = new Mutex;
28212
+ var seedBuffer$1 = new Uint8Array(8);
28213
+ var mutex$3 = new Mutex;
28214
+ var seedBuffer = new Uint8Array(8);
28215
+ var mutex$2 = new Mutex;
28216
+ var mutex$1 = new Mutex;
28217
+ var mutex = new Mutex;
28218
+
28080
28219
  // src/core/crypto.ts
28081
- var import_argon2 = __toESM(require_argon2(), 1);
28082
28220
  import { hkdfSync, createCipheriv, createDecipheriv } from "crypto";
28083
28221
  async function deriveKeyFromPassphrase(passphrase, salt) {
28084
- const hash = await import_argon2.default.hash(passphrase, {
28085
- type: import_argon2.default.argon2id,
28086
- memoryCost: 65536,
28087
- timeCost: 3,
28222
+ const hash = await argon2id({
28223
+ password: passphrase,
28224
+ salt,
28088
28225
  parallelism: 1,
28226
+ iterations: 3,
28227
+ memorySize: 65536,
28089
28228
  hashLength: 32,
28090
- salt: Buffer.from(salt),
28091
- raw: true
28229
+ outputType: "binary"
28092
28230
  });
28093
28231
  return new Uint8Array(hash);
28094
28232
  }
@@ -28978,24 +29116,12 @@ function registerSelfCommands(program2) {
28978
29116
  console.log(`Updating...
28979
29117
  `);
28980
29118
  const installedWith = detectInstalledWith();
28981
- if (installedWith === "bun") {
28982
- try {
28983
- console.log("Removing bun global install...");
28984
- execSync("bun remove -g ccsini", { stdio: "inherit" });
28985
- } catch {}
28986
- }
28987
- const cmd = `npm install -g ccsini@${latest}`;
29119
+ const cmd = installedWith === "bun" ? `bun add -g ccsini@${latest} --force` : `npm install -g ccsini@${latest}`;
28988
29120
  try {
28989
29121
  execSync(cmd, { stdio: "inherit" });
28990
- const installed = execSync("ccsini --version", { encoding: "utf-8" }).trim();
28991
- if (installed === latest) {
28992
- console.log(`
29122
+ console.log(`
28993
29123
  Updated to v${latest}`);
28994
- } else {
28995
- console.log(`
28996
- Installed version: ${installed} (expected ${latest})`);
28997
- console.log("Try: npm install -g ccsini@" + latest);
28998
- }
29124
+ console.log("Restart your terminal to use the new version.");
28999
29125
  } catch {
29000
29126
  console.error(`
29001
29127
  Update failed. Try manually:`);
package/package.json CHANGED
@@ -1,41 +1,41 @@
1
- {
2
- "name": "ccsini",
3
- "version": "0.1.19",
4
- "description": "Claude Code seamless sync across devices",
5
- "type": "module",
6
- "bin": {
7
- "ccsini": "./dist/index.js"
8
- },
9
- "files": [
10
- "dist"
11
- ],
12
- "keywords": [
13
- "claude",
14
- "claude-code",
15
- "sync",
16
- "dotfiles",
17
- "settings",
18
- "cli"
19
- ],
20
- "license": "MIT",
21
- "scripts": {
22
- "build": "bun build src/index.ts --outdir dist --target bun",
23
- "prepublishOnly": "bun run build",
24
- "dev": "bun run src/index.ts",
25
- "test": "bun test",
26
- "typecheck": "tsc --noEmit"
27
- },
28
- "dependencies": {
29
- "argon2": "^0.44.0",
30
- "chalk": "^5.4.0",
31
- "chokidar": "^5.0.0",
32
- "commander": "^13.0.0",
33
- "inquirer": "^13.2.2",
34
- "jose": "^6.1.3",
35
- "ora": "^8.2.0"
36
- },
37
- "devDependencies": {
38
- "@types/bun": "^1.2.0",
39
- "@types/inquirer": "^9.0.9"
40
- }
41
- }
1
+ {
2
+ "name": "ccsini",
3
+ "version": "0.1.21",
4
+ "description": "Claude Code seamless sync across devices",
5
+ "type": "module",
6
+ "bin": {
7
+ "ccsini": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "keywords": [
13
+ "claude",
14
+ "claude-code",
15
+ "sync",
16
+ "dotfiles",
17
+ "settings",
18
+ "cli"
19
+ ],
20
+ "license": "MIT",
21
+ "scripts": {
22
+ "build": "bun build src/index.ts --outdir dist --target bun",
23
+ "prepublishOnly": "bun run build",
24
+ "dev": "bun run src/index.ts",
25
+ "test": "bun test",
26
+ "typecheck": "tsc --noEmit"
27
+ },
28
+ "dependencies": {
29
+ "chalk": "^5.4.0",
30
+ "chokidar": "^5.0.0",
31
+ "commander": "^13.0.0",
32
+ "hash-wasm": "^4.12.0",
33
+ "inquirer": "^13.2.2",
34
+ "jose": "^6.1.3",
35
+ "ora": "^8.2.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/bun": "^1.2.0",
39
+ "@types/inquirer": "^9.0.9"
40
+ }
41
+ }