@clauderecallhq/cli 0.12.1 → 0.61.2
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 +37 -17
- package/README.md +316 -106
- package/dist/cli.js +1641 -361
- package/dist/daemon/entrypoint.js +1872 -54
- package/dist/mcp-server.js +930 -0
- package/dist/share/fonts/Inter-Bold.woff +0 -0
- package/dist/share/fonts/Inter-Regular.woff +0 -0
- package/dist/share/fonts/JetBrainsMono-Regular.woff +0 -0
- package/dist/web/assets/_brand-Bw9uSB4O.js +1 -0
- package/dist/web/assets/captureNode-9CVj9vYC.js +2 -0
- package/dist/web/assets/card-a-minimal-ujNERzX7.js +1 -0
- package/dist/web/assets/card-b-terminal-DpJ_tVpg.js +1 -0
- package/dist/web/assets/card-c-gradient-CZXVGuNd.js +1 -0
- package/dist/web/assets/card-d-dashboard-CHKD-PnB.js +1 -0
- package/dist/web/assets/dist-CWaokT35.js +56 -0
- package/dist/web/assets/index-B-HrjaDy.css +1 -0
- package/dist/web/assets/index-BZYcD76T.js +633 -0
- package/dist/web/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
- package/dist/web/assets/patterns-BPeZb9N0.js +1 -0
- package/dist/web/assets/stats-BSwqSiFU.js +1 -0
- package/dist/web/assets/thread-D2AXyhOx.js +1 -0
- package/dist/web/index.html +8 -2
- package/package.json +57 -16
- package/scripts/postinstall.mjs +38 -0
- package/dist/cli.js.map +0 -1
- package/dist/commands/activate.js +0 -69
- package/dist/commands/activate.js.map +0 -1
- package/dist/commands/audit-secrets.js +0 -103
- package/dist/commands/audit-secrets.js.map +0 -1
- package/dist/commands/blame.js +0 -35
- package/dist/commands/blame.js.map +0 -1
- package/dist/commands/config-verification.js +0 -18
- package/dist/commands/config-verification.js.map +0 -1
- package/dist/commands/context.js +0 -144
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/correlate.js +0 -70
- package/dist/commands/correlate.js.map +0 -1
- package/dist/commands/digest.js +0 -78
- package/dist/commands/digest.js.map +0 -1
- package/dist/commands/health.js +0 -62
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/index.js +0 -247
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/install-extension.js +0 -138
- package/dist/commands/install-extension.js.map +0 -1
- package/dist/commands/installs.js +0 -128
- package/dist/commands/installs.js.map +0 -1
- package/dist/commands/license.js +0 -39
- package/dist/commands/license.js.map +0 -1
- package/dist/commands/list.js +0 -47
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/mcp.js +0 -29
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/open.js +0 -28
- package/dist/commands/open.js.map +0 -1
- package/dist/commands/paste.js +0 -154
- package/dist/commands/paste.js.map +0 -1
- package/dist/commands/projects.js +0 -36
- package/dist/commands/projects.js.map +0 -1
- package/dist/commands/search.js +0 -67
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/semantic.js +0 -173
- package/dist/commands/semantic.js.map +0 -1
- package/dist/commands/show.js +0 -121
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/start.js +0 -47
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/stats.js +0 -133
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/status.js +0 -45
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/stop.js +0 -29
- package/dist/commands/stop.js.map +0 -1
- package/dist/commands/thread.js +0 -396
- package/dist/commands/thread.js.map +0 -1
- package/dist/context/formatter.js +0 -103
- package/dist/context/formatter.js.map +0 -1
- package/dist/daemon/auto-tag-config.js +0 -103
- package/dist/daemon/auto-tag-config.js.map +0 -1
- package/dist/daemon/auto-tag-config.test.js +0 -72
- package/dist/daemon/auto-tag-config.test.js.map +0 -1
- package/dist/daemon/auto-title-config.js +0 -70
- package/dist/daemon/auto-title-config.js.map +0 -1
- package/dist/daemon/bulk-title-jobs.js +0 -170
- package/dist/daemon/bulk-title-jobs.js.map +0 -1
- package/dist/daemon/correlator.js +0 -320
- package/dist/daemon/correlator.js.map +0 -1
- package/dist/daemon/discover.js +0 -316
- package/dist/daemon/discover.js.map +0 -1
- package/dist/daemon/editor-detection.js +0 -186
- package/dist/daemon/editor-detection.js.map +0 -1
- package/dist/daemon/entrypoint.js.map +0 -1
- package/dist/daemon/git-correlator.js +0 -256
- package/dist/daemon/git-correlator.js.map +0 -1
- package/dist/daemon/mcp-installer.js +0 -108
- package/dist/daemon/mcp-installer.js.map +0 -1
- package/dist/daemon/onboarding-state.js +0 -140
- package/dist/daemon/onboarding-state.js.map +0 -1
- package/dist/daemon/pidfile.js +0 -57
- package/dist/daemon/pidfile.js.map +0 -1
- package/dist/daemon/ports.js +0 -48
- package/dist/daemon/ports.js.map +0 -1
- package/dist/daemon/scanProgressRegistry.js +0 -62
- package/dist/daemon/scanProgressRegistry.js.map +0 -1
- package/dist/daemon/server.js +0 -2010
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
- package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
- package/dist/daemon/tag-scanner/autopilot.js +0 -131
- package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
- package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
- package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
- package/dist/daemon/tag-scanner/orchestrator.js +0 -88
- package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
- package/dist/daemon/tag-scanner/prompt.js +0 -46
- package/dist/daemon/tag-scanner/prompt.js.map +0 -1
- package/dist/daemon/tag-scanner/prompt.test.js +0 -48
- package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
- package/dist/daemon/tag-scanner/scan-state.js +0 -49
- package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
- package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
- package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
- package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
- package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
- package/dist/daemon/tag-scanner/validator.js +0 -50
- package/dist/daemon/tag-scanner/validator.js.map +0 -1
- package/dist/daemon/tag-scanner/validator.test.js +0 -41
- package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
- package/dist/daemon/terminal-registry.js +0 -443
- package/dist/daemon/terminal-registry.js.map +0 -1
- package/dist/daemon/ui.js +0 -64
- package/dist/daemon/ui.js.map +0 -1
- package/dist/daemon/watcher.js +0 -256
- package/dist/daemon/watcher.js.map +0 -1
- package/dist/db/client.js +0 -22
- package/dist/db/client.js.map +0 -1
- package/dist/db/schema.js +0 -496
- package/dist/db/schema.js.map +0 -1
- package/dist/license/api-base.js +0 -13
- package/dist/license/api-base.js.map +0 -1
- package/dist/license/manager.js +0 -43
- package/dist/license/manager.js.map +0 -1
- package/dist/license/public-key.js +0 -19
- package/dist/license/public-key.js.map +0 -1
- package/dist/license/storage.js +0 -27
- package/dist/license/storage.js.map +0 -1
- package/dist/license/verify.js +0 -23
- package/dist/license/verify.js.map +0 -1
- package/dist/mcp/audit.js +0 -126
- package/dist/mcp/audit.js.map +0 -1
- package/dist/mcp/prompts.js +0 -180
- package/dist/mcp/prompts.js.map +0 -1
- package/dist/mcp/server.js +0 -502
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/thread-tools.js +0 -363
- package/dist/mcp/thread-tools.js.map +0 -1
- package/dist/mcp/write-tools.js +0 -239
- package/dist/mcp/write-tools.js.map +0 -1
- package/dist/parser/jsonl.js +0 -150
- package/dist/parser/jsonl.js.map +0 -1
- package/dist/semantic/chunker.js +0 -47
- package/dist/semantic/chunker.js.map +0 -1
- package/dist/semantic/config.js +0 -74
- package/dist/semantic/config.js.map +0 -1
- package/dist/semantic/embedder.js +0 -54
- package/dist/semantic/embedder.js.map +0 -1
- package/dist/semantic/fusion.js +0 -38
- package/dist/semantic/fusion.js.map +0 -1
- package/dist/semantic/model-download.js +0 -69
- package/dist/semantic/model-download.js.map +0 -1
- package/dist/semantic/pipeline.js +0 -375
- package/dist/semantic/pipeline.js.map +0 -1
- package/dist/semantic/query.js +0 -42
- package/dist/semantic/query.js.map +0 -1
- package/dist/semantic/worker.js +0 -78
- package/dist/semantic/worker.js.map +0 -1
- package/dist/stats/backfill.js +0 -151
- package/dist/stats/backfill.js.map +0 -1
- package/dist/stats/health.js +0 -102
- package/dist/stats/health.js.map +0 -1
- package/dist/stats/query.js +0 -385
- package/dist/stats/query.js.map +0 -1
- package/dist/utils/aliases.js +0 -107
- package/dist/utils/aliases.js.map +0 -1
- package/dist/utils/autoCollections.js +0 -635
- package/dist/utils/autoCollections.js.map +0 -1
- package/dist/utils/autoTitle.js +0 -348
- package/dist/utils/autoTitle.js.map +0 -1
- package/dist/utils/collections.js +0 -446
- package/dist/utils/collections.js.map +0 -1
- package/dist/utils/format.js +0 -46
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/notes.js +0 -270
- package/dist/utils/notes.js.map +0 -1
- package/dist/utils/paths.js +0 -50
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/pricing.js +0 -257
- package/dist/utils/pricing.js.map +0 -1
- package/dist/utils/secret-scanner.js +0 -166
- package/dist/utils/secret-scanner.js.map +0 -1
- package/dist/utils/sessionLabel.js +0 -64
- package/dist/utils/sessionLabel.js.map +0 -1
- package/dist/utils/tags.js +0 -97
- package/dist/utils/tags.js.map +0 -1
- package/dist/utils/thread-context.js +0 -129
- package/dist/utils/thread-context.js.map +0 -1
- package/dist/utils/threadFilter.js +0 -18
- package/dist/utils/threadFilter.js.map +0 -1
- package/dist/utils/threads-titler.js +0 -298
- package/dist/utils/threads-titler.js.map +0 -1
- package/dist/utils/threads.js +0 -383
- package/dist/utils/threads.js.map +0 -1
- package/dist/utils/usage.js +0 -76
- package/dist/utils/usage.js.map +0 -1
- package/dist/verification/compute.js +0 -88
- package/dist/verification/compute.js.map +0 -1
- package/dist/verification/config.js +0 -34
- package/dist/verification/config.js.map +0 -1
- package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
- package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
/**
|
|
6
|
-
* First-run onboarding state (v0.14a).
|
|
7
|
-
*
|
|
8
|
-
* The local web UI fires a 3-step tour on first open to put the
|
|
9
|
-
* context-re-injection moat in front of the user inside the first minute.
|
|
10
|
-
* Completion is persisted here so the tour does not fire again. A "replay
|
|
11
|
-
* onboarding" button in the Command Center resets the state.
|
|
12
|
-
*
|
|
13
|
-
* File: `$RECALL_HOME/onboarding.json` (default `~/.recall/onboarding.json`).
|
|
14
|
-
* Dedicated file — not merged into `config.json` — so it is easy to inspect,
|
|
15
|
-
* reset, or wipe without risking auto-tag configuration.
|
|
16
|
-
*
|
|
17
|
-
* Reads are tolerant: a missing or malformed file yields defaults rather than
|
|
18
|
-
* throwing. The daemon must boot even if a prior version wrote an incompatible
|
|
19
|
-
* shape. `RECALL_HOME` is resolved lazily on every call so tests can redirect
|
|
20
|
-
* the data root per-test without a module-cache dance (matches the approach
|
|
21
|
-
* used by auto-tag-config.ts).
|
|
22
|
-
*
|
|
23
|
-
* No secrets ever live in this file — it stores only booleans and timestamps,
|
|
24
|
-
* so default filesystem permissions are fine (no chmod 0600 needed).
|
|
25
|
-
*/
|
|
26
|
-
function recallHome() {
|
|
27
|
-
return process.env.RECALL_HOME ?? join(homedir(), '.recall');
|
|
28
|
-
}
|
|
29
|
-
function ensureHome() {
|
|
30
|
-
const home = recallHome();
|
|
31
|
-
if (!existsSync(home))
|
|
32
|
-
mkdirSync(home, { recursive: true });
|
|
33
|
-
}
|
|
34
|
-
function stateFile() {
|
|
35
|
-
return join(recallHome(), 'onboarding.json');
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Persisted onboarding state. `version` lets us evolve the shape later
|
|
39
|
-
* without silently misreading old files — if an incompatible version
|
|
40
|
-
* lands, `read` falls back to defaults.
|
|
41
|
-
*/
|
|
42
|
-
export const OnboardingStateSchema = z.object({
|
|
43
|
-
version: z.literal(1).default(1),
|
|
44
|
-
/** True once the user reaches the final step. */
|
|
45
|
-
completed: z.boolean().default(false),
|
|
46
|
-
/** True if the user dismissed via "Skip" / "I'll explore myself". */
|
|
47
|
-
skipped: z.boolean().default(false),
|
|
48
|
-
/** ISO timestamp of the terminal event (complete OR skip). Null until then. */
|
|
49
|
-
finishedAt: z.string().nullable().default(null),
|
|
50
|
-
/** Which step ids the user made it through. Append-only; history-friendly. */
|
|
51
|
-
completedSteps: z.array(z.string()).default([]),
|
|
52
|
-
/**
|
|
53
|
-
* v0.15a.2 — first-run explainer for the Threads view. Flipped to true
|
|
54
|
-
* the first time the user either finishes or skips the Threads intro
|
|
55
|
-
* overlay. The "Replay threads tour" button in the Command Center and
|
|
56
|
-
* the matching Cmd+K command reset this flag back to false.
|
|
57
|
-
*/
|
|
58
|
-
threadsIntroSeen: z.boolean().default(false),
|
|
59
|
-
});
|
|
60
|
-
const DEFAULTS = {
|
|
61
|
-
version: 1,
|
|
62
|
-
completed: false,
|
|
63
|
-
skipped: false,
|
|
64
|
-
finishedAt: null,
|
|
65
|
-
completedSteps: [],
|
|
66
|
-
threadsIntroSeen: false,
|
|
67
|
-
};
|
|
68
|
-
/**
|
|
69
|
-
* Read the current state. A missing or malformed file yields defaults —
|
|
70
|
-
* the web UI treats defaults as "fire the tour".
|
|
71
|
-
*/
|
|
72
|
-
export function readOnboardingState() {
|
|
73
|
-
const path = stateFile();
|
|
74
|
-
if (!existsSync(path))
|
|
75
|
-
return { ...DEFAULTS };
|
|
76
|
-
try {
|
|
77
|
-
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
78
|
-
const parsed = OnboardingStateSchema.safeParse(raw);
|
|
79
|
-
return parsed.success ? parsed.data : { ...DEFAULTS };
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
console.error('[onboarding-state] failed to parse onboarding.json, using defaults:', err);
|
|
83
|
-
return { ...DEFAULTS };
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Merge a patch into the on-disk state and return the merged result.
|
|
88
|
-
* Writes are immutable: we build a new object and never mutate the
|
|
89
|
-
* existing one in place.
|
|
90
|
-
*/
|
|
91
|
-
export function writeOnboardingState(patch) {
|
|
92
|
-
ensureHome();
|
|
93
|
-
const existing = readOnboardingState();
|
|
94
|
-
const merged = OnboardingStateSchema.parse({
|
|
95
|
-
...existing,
|
|
96
|
-
...patch,
|
|
97
|
-
// completedSteps merges additively — never drops history.
|
|
98
|
-
completedSteps: dedupe([
|
|
99
|
-
...(existing.completedSteps ?? []),
|
|
100
|
-
...(patch.completedSteps ?? []),
|
|
101
|
-
]),
|
|
102
|
-
version: 1,
|
|
103
|
-
});
|
|
104
|
-
writeFileSync(stateFile(), JSON.stringify(merged, null, 2));
|
|
105
|
-
return merged;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Reset the flags so the tour fires again. Keeps the completedSteps
|
|
109
|
-
* history intact as a breadcrumb of prior runs (useful for debugging
|
|
110
|
-
* "why does the modal keep showing?" later on).
|
|
111
|
-
*/
|
|
112
|
-
export function resetOnboardingState() {
|
|
113
|
-
ensureHome();
|
|
114
|
-
const existing = readOnboardingState();
|
|
115
|
-
const reset = {
|
|
116
|
-
version: 1,
|
|
117
|
-
completed: false,
|
|
118
|
-
skipped: false,
|
|
119
|
-
finishedAt: null,
|
|
120
|
-
completedSteps: existing.completedSteps,
|
|
121
|
-
// The Threads first-run explainer is an independent flow; resetting the
|
|
122
|
-
// main onboarding tour does not roll it back. Replaying the Threads tour
|
|
123
|
-
// goes through a separate PUT { threadsIntroSeen: false } patch.
|
|
124
|
-
threadsIntroSeen: existing.threadsIntroSeen,
|
|
125
|
-
};
|
|
126
|
-
writeFileSync(stateFile(), JSON.stringify(reset, null, 2));
|
|
127
|
-
return reset;
|
|
128
|
-
}
|
|
129
|
-
function dedupe(xs) {
|
|
130
|
-
const seen = new Set();
|
|
131
|
-
const out = [];
|
|
132
|
-
for (const x of xs) {
|
|
133
|
-
if (seen.has(x))
|
|
134
|
-
continue;
|
|
135
|
-
seen.add(x);
|
|
136
|
-
out.push(x);
|
|
137
|
-
}
|
|
138
|
-
return out;
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=onboarding-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-state.js","sourceRoot":"","sources":["../../src/daemon/onboarding-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,iDAAiD;IACjD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,qEAAqE;IACrE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,+EAA+E;IAC/E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/C;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC7C,CAAC,CAAC;AAIH,MAAM,QAAQ,GAAoB;IAChC,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;QAC9D,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAC;QAC1F,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA+B;IAClE,UAAU,EAAE,CAAC;IACb,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC;QACzC,GAAG,QAAQ;QACX,GAAG,KAAK;QACR,0DAA0D;QAC1D,cAAc,EAAE,MAAM,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC;YAClC,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;SAChC,CAAC;QACF,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IACH,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,UAAU,EAAE,CAAC;IACb,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAoB;QAC7B,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,wEAAwE;QACxE,yEAAyE;QACzE,iEAAiE;QACjE,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;KAC5C,CAAC;IACF,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAI,EAAgB;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAK,CAAC;IAC1B,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/daemon/pidfile.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { RECALL_HOME, ensureRecallHome } from '../utils/paths.js';
|
|
4
|
-
export const PID_FILE = join(RECALL_HOME, 'daemon.pid');
|
|
5
|
-
export const PORT_FILE = join(RECALL_HOME, 'daemon.port');
|
|
6
|
-
export const LOG_FILE = join(RECALL_HOME, 'daemon.log');
|
|
7
|
-
export function writeDaemonInfo(info) {
|
|
8
|
-
ensureRecallHome();
|
|
9
|
-
writeFileSync(PID_FILE, JSON.stringify(info), { encoding: 'utf8' });
|
|
10
|
-
writeFileSync(PORT_FILE, String(info.port), { encoding: 'utf8' });
|
|
11
|
-
}
|
|
12
|
-
export function readDaemonInfo() {
|
|
13
|
-
if (!existsSync(PID_FILE))
|
|
14
|
-
return null;
|
|
15
|
-
try {
|
|
16
|
-
const data = JSON.parse(readFileSync(PID_FILE, 'utf8'));
|
|
17
|
-
if (typeof data.pid !== 'number' || typeof data.port !== 'number')
|
|
18
|
-
return null;
|
|
19
|
-
return data;
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export function clearDaemonInfo() {
|
|
26
|
-
for (const path of [PID_FILE, PORT_FILE]) {
|
|
27
|
-
if (existsSync(path)) {
|
|
28
|
-
try {
|
|
29
|
-
unlinkSync(path);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
/* ignore */
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export function isProcessAlive(pid) {
|
|
38
|
-
try {
|
|
39
|
-
// Signal 0 checks process existence without sending a signal.
|
|
40
|
-
process.kill(pid, 0);
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export function getRunningDaemon() {
|
|
48
|
-
const info = readDaemonInfo();
|
|
49
|
-
if (!info)
|
|
50
|
-
return null;
|
|
51
|
-
if (!isProcessAlive(info.pid)) {
|
|
52
|
-
clearDaemonInfo();
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
return info;
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=pidfile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pidfile.js","sourceRoot":"","sources":["../../src/daemon/pidfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAQxD,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,gBAAgB,EAAE,CAAC;IACnB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAe,CAAC;QACtE,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,eAAe,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/daemon/ports.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { createServer } from 'node:net';
|
|
2
|
-
function tryPort(port) {
|
|
3
|
-
return new Promise((resolve) => {
|
|
4
|
-
const server = createServer();
|
|
5
|
-
server.once('error', () => resolve(false));
|
|
6
|
-
server.once('listening', () => {
|
|
7
|
-
server.close(() => resolve(true));
|
|
8
|
-
});
|
|
9
|
-
server.listen(port, '127.0.0.1');
|
|
10
|
-
});
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Pick a free localhost port from the ephemeral range.
|
|
14
|
-
* We deliberately avoid well-known dev ports (3000, 3001, 4200, 5000, 5173, 8000, 8080, 8888, 9000)
|
|
15
|
-
* to prevent clobbering the user's other local services.
|
|
16
|
-
*/
|
|
17
|
-
export async function pickFreePort() {
|
|
18
|
-
const blocked = new Set([3000, 3001, 4200, 5000, 5173, 8000, 8080, 8888, 9000]);
|
|
19
|
-
// Try a deterministic preferred port first so the port is predictable across restarts.
|
|
20
|
-
const preferred = 51370;
|
|
21
|
-
if (!blocked.has(preferred) && (await tryPort(preferred)))
|
|
22
|
-
return preferred;
|
|
23
|
-
// Then try random ephemeral ports.
|
|
24
|
-
for (let i = 0; i < 50; i++) {
|
|
25
|
-
const candidate = 49152 + Math.floor(Math.random() * (65535 - 49152));
|
|
26
|
-
if (blocked.has(candidate))
|
|
27
|
-
continue;
|
|
28
|
-
if (await tryPort(candidate))
|
|
29
|
-
return candidate;
|
|
30
|
-
}
|
|
31
|
-
// Last resort: ask the OS for any free port.
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
const server = createServer();
|
|
34
|
-
server.once('error', reject);
|
|
35
|
-
server.listen(0, '127.0.0.1', () => {
|
|
36
|
-
const addr = server.address();
|
|
37
|
-
if (addr && typeof addr === 'object') {
|
|
38
|
-
const port = addr.port;
|
|
39
|
-
server.close(() => resolve(port));
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
server.close();
|
|
43
|
-
reject(new Error('could not determine a free port'));
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=ports.js.map
|
package/dist/daemon/ports.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/daemon/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEhF,uFAAuF;IACvF,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5E,mCAAmC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QACrC,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACjD,CAAC;IAED,6CAA6C;IAC7C,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-scan in-memory pub/sub for Claude CLI auto-tag progress.
|
|
3
|
-
*
|
|
4
|
-
* Why a bespoke registry and not the existing scan-state.ts? scan-state drives
|
|
5
|
-
* the API-key-backed scan flow (long-lived records, validator suggestions,
|
|
6
|
-
* apply-selection). The claude-cli path is a single blocking POST today — we
|
|
7
|
-
* only need a transient channel that lives for the duration of one request so
|
|
8
|
-
* the SSE endpoint can stream `{current, total, ...}` events while the
|
|
9
|
-
* subprocess runs. No persistence, no replay, no DB. When the last subscriber
|
|
10
|
-
* leaves, the channel is dropped.
|
|
11
|
-
*
|
|
12
|
-
* Contract deliberately narrow: publish() and subscribe(). Keeps the surface
|
|
13
|
-
* area trivial and side-effect-free so tests can hammer it without mocks.
|
|
14
|
-
*/
|
|
15
|
-
const channels = new Map();
|
|
16
|
-
/** Publish an event to every listener on `scanId`. Listeners that throw are
|
|
17
|
-
* isolated — one bad subscriber must not stop others from receiving. */
|
|
18
|
-
export function publish(scanId, ev) {
|
|
19
|
-
const listeners = channels.get(scanId);
|
|
20
|
-
if (!listeners || listeners.size === 0)
|
|
21
|
-
return;
|
|
22
|
-
for (const l of listeners) {
|
|
23
|
-
try {
|
|
24
|
-
l(ev);
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// Intentionally swallow — a listener exception shouldn't poison the
|
|
28
|
-
// producer (the scan driver) or prevent other subscribers from running.
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/** Subscribe to a scan's progress stream. Returns a one-shot unsubscribe that
|
|
33
|
-
* removes the listener and, once the channel has no listeners left, removes
|
|
34
|
-
* the channel entry so the registry stays empty between runs. */
|
|
35
|
-
export function subscribe(scanId, listener) {
|
|
36
|
-
let listeners = channels.get(scanId);
|
|
37
|
-
if (!listeners) {
|
|
38
|
-
listeners = new Set();
|
|
39
|
-
channels.set(scanId, listeners);
|
|
40
|
-
}
|
|
41
|
-
listeners.add(listener);
|
|
42
|
-
return () => {
|
|
43
|
-
const set = channels.get(scanId);
|
|
44
|
-
if (!set)
|
|
45
|
-
return;
|
|
46
|
-
set.delete(listener);
|
|
47
|
-
if (set.size === 0)
|
|
48
|
-
channels.delete(scanId);
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/** True if any subscriber is currently listening on this scanId. Used by
|
|
52
|
-
* the SSE route to short-circuit when the producer publishes early, and by
|
|
53
|
-
* tests to assert cleanup. */
|
|
54
|
-
export function hasChannel(scanId) {
|
|
55
|
-
const set = channels.get(scanId);
|
|
56
|
-
return !!set && set.size > 0;
|
|
57
|
-
}
|
|
58
|
-
/** Test-only helper. Intentionally NOT re-exported from any module index. */
|
|
59
|
-
export function clearAllForTest() {
|
|
60
|
-
channels.clear();
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=scanProgressRegistry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanProgressRegistry.js","sourceRoot":"","sources":["../../src/daemon/scanProgressRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqBH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqC,CAAC;AAE9D;yEACyE;AACzE,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,EAAqB;IAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC/C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,wEAAwE;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;kEAEkE;AAClE,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAA8B;IACtE,IAAI,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC;AAED;;+BAE+B;AAC/B,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe;IAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|