claude-code-infinite 1.0.18 → 1.0.20

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.
@@ -7,21 +7,37 @@
7
7
  * pre-launch terminal is covered by the TUI within a second, so a line printed
8
8
  * there is never read. Bounded by a short timeout and silent on every failure
9
9
  * (registry down, offline, malformed JSON, timeout) so startup is never gated
10
- * on the registry. `CCC_SKIP_UPDATE_CHECK=1` disables the fetch entirely.
10
+ * on the registry. The registry's answer is cached for a day, so most starts
11
+ * make no request at all. `CCC_NO_UPDATE_CHECK=1` (or the older
12
+ * `CCC_SKIP_UPDATE_CHECK=1`), or `"updateCheck": false` in
13
+ * ~/.claude-code-infinite/config.json, disables the check entirely.
11
14
  */
12
15
  export declare const PACKAGE_NAME = "claude-code-infinite";
13
16
  export declare const NPM_LATEST_URL = "https://registry.npmjs.org/claude-code-infinite/latest";
17
+ export declare const NO_UPDATE_CHECK_ENV = "CCC_NO_UPDATE_CHECK";
18
+ /** The original opt-out name, still honored. */
14
19
  export declare const SKIP_UPDATE_CHECK_ENV = "CCC_SKIP_UPDATE_CHECK";
15
- export declare const UPGRADE_COMMAND = "npm install -g claude-code-infinite";
20
+ export declare const UPGRADE_COMMAND = "npm i -g claude-code-infinite@latest";
21
+ export declare const UPDATE_CHECK_TIMEOUT_MS = 1500;
22
+ export declare const UPDATE_CHECK_CACHE_TTL_MS: number;
23
+ export declare const UPDATE_CHECK_CACHE_FILE = "update-check.json";
16
24
  export interface UpdateAvailable {
17
25
  /** Newest version on the registry's `latest` tag. */
18
26
  latest: string;
19
27
  /** The running client's version. */
20
28
  current: string;
21
29
  }
30
+ /** The config.json fields this check reads. */
31
+ export interface UpdateCheckConfig {
32
+ updateCheck?: boolean;
33
+ }
22
34
  export interface UpdateCheckOptions {
23
35
  currentVersion: string;
24
36
  env?: NodeJS.ProcessEnv;
37
+ config?: UpdateCheckConfig;
38
+ /** Where the registry's answer is cached; no caching when omitted. */
39
+ cacheFile?: string;
40
+ now?: () => number;
25
41
  fetchImpl?: typeof fetch;
26
42
  timeoutMs?: number;
27
43
  url?: string;
@@ -31,6 +47,8 @@ export interface UpdateCheckOptions {
31
47
  * of `currentVersion`, else null. Never rejects.
32
48
  */
33
49
  export declare function checkForUpdate(opts: UpdateCheckOptions): Promise<UpdateAvailable | null>;
50
+ /** False when the user opted out by env (either name) or config. */
51
+ export declare function updateCheckEnabled(env: NodeJS.ProcessEnv, config: UpdateCheckConfig): boolean;
34
52
  /** Parse `1.2.3` (optionally `v`-prefixed / suffixed) into numeric parts. */
35
53
  export declare function parseVersion(version: string): [number, number, number] | null;
36
54
  /** Numeric per-component compare: negative when a < b, positive when a > b. */
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,cAAc,2DAAsD,CAAC;AAClF,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,eAAe,wCAAmC,CAAC;AAOhE,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsBjC;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAI7E;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC3B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAKR"}
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,cAAc,2DAAsD,CAAC;AAClF,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,eAAe,yCAAoC,CAAC;AACjE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,yBAAyB,QAAsB,CAAC;AAC7D,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAOD,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQjC;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAGT;AAgED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAI7E;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC3B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAKR"}
@@ -7,13 +7,22 @@
7
7
  * pre-launch terminal is covered by the TUI within a second, so a line printed
8
8
  * there is never read. Bounded by a short timeout and silent on every failure
9
9
  * (registry down, offline, malformed JSON, timeout) so startup is never gated
10
- * on the registry. `CCC_SKIP_UPDATE_CHECK=1` disables the fetch entirely.
10
+ * on the registry. The registry's answer is cached for a day, so most starts
11
+ * make no request at all. `CCC_NO_UPDATE_CHECK=1` (or the older
12
+ * `CCC_SKIP_UPDATE_CHECK=1`), or `"updateCheck": false` in
13
+ * ~/.claude-code-infinite/config.json, disables the check entirely.
11
14
  */
15
+ import * as fs from "node:fs";
16
+ import * as path from "node:path";
12
17
  export const PACKAGE_NAME = "claude-code-infinite";
13
18
  export const NPM_LATEST_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
19
+ export const NO_UPDATE_CHECK_ENV = "CCC_NO_UPDATE_CHECK";
20
+ /** The original opt-out name, still honored. */
14
21
  export const SKIP_UPDATE_CHECK_ENV = "CCC_SKIP_UPDATE_CHECK";
15
- export const UPGRADE_COMMAND = `npm install -g ${PACKAGE_NAME}`;
16
- const UPDATE_CHECK_TIMEOUT_MS = 2000;
22
+ export const UPGRADE_COMMAND = `npm i -g ${PACKAGE_NAME}@latest`;
23
+ export const UPDATE_CHECK_TIMEOUT_MS = 1500;
24
+ export const UPDATE_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
25
+ export const UPDATE_CHECK_CACHE_FILE = "update-check.json";
17
26
  // Dotted numeric core with an optional pre-release/build suffix, as npm
18
27
  // publishes it. Anything else (a tag name, an error page) is ignored.
19
28
  const VERSION_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:[-+][0-9A-Za-z.-]{0,40})?$/;
@@ -22,12 +31,36 @@ const VERSION_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:[-+][0-9A-Za-z.-]{0,40})?$/;
22
31
  * of `currentVersion`, else null. Never rejects.
23
32
  */
24
33
  export async function checkForUpdate(opts) {
25
- const env = opts.env ?? process.env;
26
- if (env[SKIP_UPDATE_CHECK_ENV] === "1")
34
+ if (!updateCheckEnabled(opts.env ?? process.env, opts.config ?? {}))
27
35
  return null;
28
36
  const current = parseVersion(opts.currentVersion);
29
37
  if (current === null)
30
38
  return null;
39
+ const latestRaw = await latestVersion(opts);
40
+ const latest = latestRaw === null ? null : parseReleaseVersion(latestRaw);
41
+ if (latest === null || compareVersions(latest, current) <= 0)
42
+ return null;
43
+ return { latest: latestRaw, current: opts.currentVersion };
44
+ }
45
+ /** False when the user opted out by env (either name) or config. */
46
+ export function updateCheckEnabled(env, config) {
47
+ if (env[NO_UPDATE_CHECK_ENV] === "1" || env[SKIP_UPDATE_CHECK_ENV] === "1")
48
+ return false;
49
+ return config.updateCheck !== false;
50
+ }
51
+ /** The registry's `latest`, from a fresh cache or a bounded fetch; null on any failure. */
52
+ async function latestVersion(opts) {
53
+ const now = (opts.now ?? Date.now)();
54
+ const cached = opts.cacheFile ? readCache(opts.cacheFile) : null;
55
+ const age = cached ? now - cached.checkedAt : -1;
56
+ if (cached && age >= 0 && age < UPDATE_CHECK_CACHE_TTL_MS)
57
+ return cached.latest;
58
+ const latest = await fetchLatestVersion(opts);
59
+ if (latest !== null && opts.cacheFile)
60
+ writeCache(opts.cacheFile, { checkedAt: now, latest });
61
+ return latest;
62
+ }
63
+ async function fetchLatestVersion(opts) {
31
64
  try {
32
65
  const fetchImpl = opts.fetchImpl ?? fetch;
33
66
  const res = await fetchImpl(opts.url ?? NPM_LATEST_URL, {
@@ -37,11 +70,8 @@ export async function checkForUpdate(opts) {
37
70
  if (!res.ok)
38
71
  return null;
39
72
  const body = (await res.json());
40
- const latestRaw = typeof body?.version === "string" ? body.version : "";
41
- const latest = parseVersion(latestRaw);
42
- if (latest === null || compareVersions(latest, current) <= 0)
43
- return null;
44
- return { latest: latestRaw, current: opts.currentVersion };
73
+ const version = typeof body?.version === "string" ? body.version : "";
74
+ return parseVersion(version) === null ? null : version;
45
75
  }
46
76
  catch {
47
77
  // Registry unreachable, timed out, or answered with something that is
@@ -49,6 +79,42 @@ export async function checkForUpdate(opts) {
49
79
  return null;
50
80
  }
51
81
  }
82
+ function readCache(file) {
83
+ try {
84
+ const data = JSON.parse(fs.readFileSync(file, "utf8"));
85
+ if (typeof data?.checkedAt !== "number" || typeof data.latest !== "string")
86
+ return null;
87
+ if (parseVersion(data.latest) === null)
88
+ return null;
89
+ return { checkedAt: data.checkedAt, latest: data.latest };
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ /** Best effort and atomic: a failed write only means the next start fetches again. */
96
+ function writeCache(file, cache) {
97
+ const tmp = `${file}.${process.pid}.tmp`;
98
+ try {
99
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
100
+ fs.writeFileSync(tmp, JSON.stringify(cache), { mode: 0o600 });
101
+ fs.renameSync(tmp, file);
102
+ }
103
+ catch {
104
+ try {
105
+ fs.rmSync(tmp, { force: true });
106
+ }
107
+ catch {
108
+ // Nothing more to clean up.
109
+ }
110
+ }
111
+ }
112
+ /** A release version only: prereleases (`1.2.3-beta.1`) are never offered. */
113
+ function parseReleaseVersion(version) {
114
+ if (/^v?\d+\.\d+\.\d+-/.test(version.trim()))
115
+ return null;
116
+ return parseVersion(version);
117
+ }
52
118
  /** Parse `1.2.3` (optionally `v`-prefixed / suffixed) into numeric parts. */
53
119
  export function parseVersion(version) {
54
120
  const match = VERSION_RE.exec(version.trim());
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AACnD,MAAM,CAAC,MAAM,cAAc,GAAG,8BAA8B,YAAY,SAAS,CAAC;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,YAAY,EAAE,CAAC;AAChE,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,wEAAwE;AACxE,sEAAsE;AACtE,MAAM,UAAU,GAAG,qDAAqD,CAAC;AAiBzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAwB;IAExB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,IAAI,GAAG,CAAC,qBAAqB,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,EAAE;YACtD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,uBAAuB,CAAC;SACvE,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;QACzD,MAAM,SAAS,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,iEAAiE;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAC7B,CAA2B,EAC3B,CAA2B;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The link to polychat's usage dashboard (`/usage`) for the environment this
3
+ * ccc talks to, shown by `/memtree` and `/memtree-view`.
4
+ *
5
+ * Derived from the MemTree base URL, so production, staging and local each
6
+ * link their own dashboard. The page authenticates with polychat's browser
7
+ * session, not the MemTree key, so the line says the browser must be signed in
8
+ * to the same account.
9
+ */
10
+ export declare const USAGE_PATH = "/usage";
11
+ /** Label on the usage link line, in the style of `• MemTree`. */
12
+ export declare const USAGE_LABEL = "\u2022 Usage";
13
+ export declare const USAGE_SIGN_IN_NOTE = "needs your browser signed in to polychat (same account)";
14
+ /** `<base>/usage`, on the browser host for production; undefined if not http(s). */
15
+ export declare function usageDashboardUrl(baseUrl: string): string | undefined;
16
+ //# sourceMappingURL=usage-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-link.d.ts","sourceRoot":"","sources":["../src/usage-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,iEAAiE;AACjE,eAAO,MAAM,WAAW,iBAAY,CAAC;AACrC,eAAO,MAAM,kBAAkB,4DAA4D,CAAC;AAQ5F,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUrE"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The link to polychat's usage dashboard (`/usage`) for the environment this
3
+ * ccc talks to, shown by `/memtree` and `/memtree-view`.
4
+ *
5
+ * Derived from the MemTree base URL, so production, staging and local each
6
+ * link their own dashboard. The page authenticates with polychat's browser
7
+ * session, not the MemTree key, so the line says the browser must be signed in
8
+ * to the same account.
9
+ */
10
+ export const USAGE_PATH = "/usage";
11
+ /** Label on the usage link line, in the style of `• MemTree`. */
12
+ export const USAGE_LABEL = "• Usage";
13
+ export const USAGE_SIGN_IN_NOTE = "needs your browser signed in to polychat (same account)";
14
+ /**
15
+ * Production's API host serves the same app as app.polychat.co, but browsers
16
+ * sign in on app (its session cookie lives there), so the dashboard links it.
17
+ */
18
+ const BROWSER_HOSTS = { "api.polychat.co": "app.polychat.co" };
19
+ /** `<base>/usage`, on the browser host for production; undefined if not http(s). */
20
+ export function usageDashboardUrl(baseUrl) {
21
+ let url;
22
+ try {
23
+ url = new URL(baseUrl);
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ if (url.protocol !== "https:" && url.protocol !== "http:")
29
+ return undefined;
30
+ url.host = BROWSER_HOSTS[url.host] ?? url.host;
31
+ return `${url.origin}${USAGE_PATH}`;
32
+ }
33
+ //# sourceMappingURL=usage-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-link.js","sourceRoot":"","sources":["../src/usage-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,yDAAyD,CAAC;AAE5F;;;GAGG;AACH,MAAM,aAAa,GAA2B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAEvF,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC5E,GAAG,CAAC,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IAC/C,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-infinite",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Wrapper for Claude Code CLI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",