centy 0.0.5 → 0.0.9
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/README.md +299 -0
- package/bin/run.js +14 -2
- package/dist/commands/install/daemon.d.ts +12 -0
- package/dist/commands/install/daemon.d.ts.map +1 -0
- package/dist/commands/install/daemon.js +41 -0
- package/dist/commands/install/daemon.js.map +1 -0
- package/dist/commands/shutdown.d.ts.map +1 -1
- package/dist/commands/shutdown.js +5 -0
- package/dist/commands/shutdown.js.map +1 -1
- package/dist/commands/start.d.ts +13 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +79 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/hooks/prerun.js +1 -1
- package/dist/hooks/prerun.js.map +1 -1
- package/dist/lib/install-daemon/checksum.d.ts +2 -0
- package/dist/lib/install-daemon/checksum.d.ts.map +1 -0
- package/dist/lib/install-daemon/checksum.js +31 -0
- package/dist/lib/install-daemon/checksum.js.map +1 -0
- package/dist/lib/install-daemon/download.d.ts +8 -0
- package/dist/lib/install-daemon/download.d.ts.map +1 -0
- package/dist/lib/install-daemon/download.js +40 -0
- package/dist/lib/install-daemon/download.js.map +1 -0
- package/dist/lib/install-daemon/errors.d.ts +23 -0
- package/dist/lib/install-daemon/errors.d.ts.map +1 -0
- package/dist/lib/install-daemon/errors.js +42 -0
- package/dist/lib/install-daemon/errors.js.map +1 -0
- package/dist/lib/install-daemon/extract.d.ts +2 -0
- package/dist/lib/install-daemon/extract.d.ts.map +1 -0
- package/dist/lib/install-daemon/extract.js +38 -0
- package/dist/lib/install-daemon/extract.js.map +1 -0
- package/dist/lib/install-daemon/github-api.d.ts +9 -0
- package/dist/lib/install-daemon/github-api.d.ts.map +1 -0
- package/dist/lib/install-daemon/github-api.js +60 -0
- package/dist/lib/install-daemon/github-api.js.map +1 -0
- package/dist/lib/install-daemon/index.d.ts +3 -0
- package/dist/lib/install-daemon/index.d.ts.map +1 -0
- package/dist/lib/install-daemon/index.js +2 -0
- package/dist/lib/install-daemon/index.js.map +1 -0
- package/dist/lib/install-daemon/install-daemon.d.ts +3 -0
- package/dist/lib/install-daemon/install-daemon.d.ts.map +1 -0
- package/dist/lib/install-daemon/install-daemon.js +100 -0
- package/dist/lib/install-daemon/install-daemon.js.map +1 -0
- package/dist/lib/install-daemon/platform.d.ts +3 -0
- package/dist/lib/install-daemon/platform.d.ts.map +1 -0
- package/dist/lib/install-daemon/platform.js +24 -0
- package/dist/lib/install-daemon/platform.js.map +1 -0
- package/dist/lib/install-daemon/types.d.ts +34 -0
- package/dist/lib/install-daemon/types.d.ts.map +1 -0
- package/dist/lib/install-daemon/types.js +7 -0
- package/dist/lib/install-daemon/types.js.map +1 -0
- package/dist/lib/start/daemon-binary-exists.d.ts +2 -0
- package/dist/lib/start/daemon-binary-exists.d.ts.map +1 -0
- package/dist/lib/start/daemon-binary-exists.js +10 -0
- package/dist/lib/start/daemon-binary-exists.js.map +1 -0
- package/dist/lib/start/find-daemon-binary.d.ts +2 -0
- package/dist/lib/start/find-daemon-binary.d.ts.map +1 -0
- package/dist/lib/start/find-daemon-binary.js +31 -0
- package/dist/lib/start/find-daemon-binary.js.map +1 -0
- package/dist/lib/start/wait-for-daemon.d.ts +7 -0
- package/dist/lib/start/wait-for-daemon.d.ts.map +1 -0
- package/dist/lib/start/wait-for-daemon.js +20 -0
- package/dist/lib/start/wait-for-daemon.js.map +1 -0
- package/dist/tui/App.d.ts +6 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +64 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/domain/DaemonPanel.d.ts +2 -0
- package/dist/tui/components/domain/DaemonPanel.d.ts.map +1 -0
- package/dist/tui/components/domain/DaemonPanel.js +35 -0
- package/dist/tui/components/domain/DaemonPanel.js.map +1 -0
- package/dist/tui/components/domain/IssueList.d.ts +2 -0
- package/dist/tui/components/domain/IssueList.d.ts.map +1 -0
- package/dist/tui/components/domain/IssueList.js +52 -0
- package/dist/tui/components/domain/IssueList.js.map +1 -0
- package/dist/tui/components/domain/ProjectList.d.ts +2 -0
- package/dist/tui/components/domain/ProjectList.d.ts.map +1 -0
- package/dist/tui/components/domain/ProjectList.js +54 -0
- package/dist/tui/components/domain/ProjectList.js.map +1 -0
- package/dist/tui/components/layout/Header.d.ts +7 -0
- package/dist/tui/components/layout/Header.d.ts.map +1 -0
- package/dist/tui/components/layout/Header.js +7 -0
- package/dist/tui/components/layout/Header.js.map +1 -0
- package/dist/tui/components/layout/MainPanel.d.ts +8 -0
- package/dist/tui/components/layout/MainPanel.d.ts.map +1 -0
- package/dist/tui/components/layout/MainPanel.js +5 -0
- package/dist/tui/components/layout/MainPanel.js.map +1 -0
- package/dist/tui/components/layout/Sidebar.d.ts +9 -0
- package/dist/tui/components/layout/Sidebar.d.ts.map +1 -0
- package/dist/tui/components/layout/Sidebar.js +11 -0
- package/dist/tui/components/layout/Sidebar.js.map +1 -0
- package/dist/tui/components/layout/StatusBar.d.ts +11 -0
- package/dist/tui/components/layout/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/layout/StatusBar.js +8 -0
- package/dist/tui/components/layout/StatusBar.js.map +1 -0
- package/dist/tui/hooks/useDaemonActions.d.ts +12 -0
- package/dist/tui/hooks/useDaemonActions.d.ts.map +1 -0
- package/dist/tui/hooks/useDaemonActions.js +77 -0
- package/dist/tui/hooks/useDaemonActions.js.map +1 -0
- package/dist/tui/hooks/useDaemonConnection.d.ts +5 -0
- package/dist/tui/hooks/useDaemonConnection.d.ts.map +1 -0
- package/dist/tui/hooks/useDaemonConnection.js +24 -0
- package/dist/tui/hooks/useDaemonConnection.js.map +1 -0
- package/dist/tui/hooks/useDaemonInfo.d.ts +10 -0
- package/dist/tui/hooks/useDaemonInfo.d.ts.map +1 -0
- package/dist/tui/hooks/useDaemonInfo.js +26 -0
- package/dist/tui/hooks/useDaemonInfo.js.map +1 -0
- package/dist/tui/hooks/useIssues.d.ts +8 -0
- package/dist/tui/hooks/useIssues.d.ts.map +1 -0
- package/dist/tui/hooks/useIssues.js +36 -0
- package/dist/tui/hooks/useIssues.js.map +1 -0
- package/dist/tui/hooks/useNavigation.d.ts +11 -0
- package/dist/tui/hooks/useNavigation.d.ts.map +1 -0
- package/dist/tui/hooks/useNavigation.js +24 -0
- package/dist/tui/hooks/useNavigation.js.map +1 -0
- package/dist/tui/hooks/useProjects.d.ts +8 -0
- package/dist/tui/hooks/useProjects.d.ts.map +1 -0
- package/dist/tui/hooks/useProjects.js +36 -0
- package/dist/tui/hooks/useProjects.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +39 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/services/daemon-service.d.ts +28 -0
- package/dist/tui/services/daemon-service.d.ts.map +1 -0
- package/dist/tui/services/daemon-service.js +107 -0
- package/dist/tui/services/daemon-service.js.map +1 -0
- package/dist/tui/state/app-state.d.ts +78 -0
- package/dist/tui/state/app-state.d.ts.map +1 -0
- package/dist/tui/state/app-state.js +93 -0
- package/dist/tui/state/app-state.js.map +1 -0
- package/dist/tui/types/views.d.ts +11 -0
- package/dist/tui/types/views.d.ts.map +1 -0
- package/dist/tui/types/views.js +25 -0
- package/dist/tui/types/views.js.map +1 -0
- package/oclif.manifest.json +83 -1
- package/package.json +10 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* eslint-disable single-export/single-export */
|
|
2
|
+
/**
|
|
3
|
+
* Custom error classes for install-daemon module
|
|
4
|
+
* Multiple exports allowed for related error class hierarchy
|
|
5
|
+
*/
|
|
6
|
+
export class InstallDaemonError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'InstallDaemonError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class PlatformNotSupportedError extends InstallDaemonError {
|
|
13
|
+
constructor(platform, arch) {
|
|
14
|
+
super(`Unsupported platform: ${platform} ${arch}`);
|
|
15
|
+
this.name = 'PlatformNotSupportedError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ChecksumNotFoundError extends InstallDaemonError {
|
|
19
|
+
constructor(fileName) {
|
|
20
|
+
super(`No checksum found for ${fileName}`);
|
|
21
|
+
this.name = 'ChecksumNotFoundError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class DownloadError extends InstallDaemonError {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'DownloadError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class ReleaseNotFoundError extends InstallDaemonError {
|
|
31
|
+
constructor(version) {
|
|
32
|
+
super(`Release ${version} not found`);
|
|
33
|
+
this.name = 'ReleaseNotFoundError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class GithubApiError extends InstallDaemonError {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = 'GithubApiError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/errors.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD;;;GAGG;AAEH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,kBAAkB;IAC/D,YAAY,QAAgB,EAAE,IAAY;QACxC,KAAK,CAAC,yBAAyB,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IAC3D,YAAY,QAAgB;QAC1B,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,kBAAkB;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,WAAW,OAAO,YAAY,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/extract.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,GAAG,KAAK,GACvB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { extract as tarExtract } from 'tar';
|
|
4
|
+
const DAEMON_BINARY_NAME = 'centy-daemon';
|
|
5
|
+
export async function extractArchive(archivePath, destDir, format) {
|
|
6
|
+
if (format === 'tar.gz') {
|
|
7
|
+
return extractTarGz(archivePath, destDir);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
return extractZip(archivePath, destDir);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function extractTarGz(archivePath, destDir) {
|
|
14
|
+
await tarExtract({
|
|
15
|
+
file: archivePath,
|
|
16
|
+
cwd: destDir,
|
|
17
|
+
filter: path => path.includes(DAEMON_BINARY_NAME),
|
|
18
|
+
});
|
|
19
|
+
return join(destDir, DAEMON_BINARY_NAME);
|
|
20
|
+
}
|
|
21
|
+
async function extractZip(archivePath, destDir) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const proc = spawn('powershell', [
|
|
24
|
+
'-Command',
|
|
25
|
+
`Expand-Archive -Path "${archivePath}" -DestinationPath "${destDir}" -Force`,
|
|
26
|
+
]);
|
|
27
|
+
proc.on('close', code => {
|
|
28
|
+
if (code === 0) {
|
|
29
|
+
resolve(join(destDir, `${DAEMON_BINARY_NAME}.exe`));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
reject(new Error(`Failed to extract zip: exit code ${code}`));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
proc.on('error', reject);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,KAAK,CAAA;AAE3C,MAAM,kBAAkB,GAAG,cAAc,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,OAAe,EACf,MAAwB;IAExB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,WAAmB,EACnB,OAAe;IAEf,MAAM,UAAU,CAAC;QACf,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAClD,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,WAAmB,EACnB,OAAe;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE;YAC/B,UAAU;YACV,yBAAyB,WAAW,uBAAuB,OAAO,UAAU;SAC7E,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,kBAAkB,MAAM,CAAC,CAAC,CAAA;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GithubRelease } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetch the latest release from GitHub
|
|
4
|
+
* Falls back to most recent pre-release if no stable release exists
|
|
5
|
+
* Multiple exports allowed for related GitHub API operations
|
|
6
|
+
*/
|
|
7
|
+
export declare function fetchLatestRelease(): Promise<GithubRelease>;
|
|
8
|
+
export declare function fetchRelease(version: string): Promise<GithubRelease>;
|
|
9
|
+
//# sourceMappingURL=github-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/github-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAS/C;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CAqCjE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB1E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { GithubApiError, ReleaseNotFoundError } from './errors.js';
|
|
2
|
+
// eslint-disable-next-line default/no-hardcoded-urls -- Fallback for standard GitHub API
|
|
3
|
+
const DEFAULT_GITHUB_API = 'https://api.github.com';
|
|
4
|
+
const GITHUB_API_BASE = process.env.GITHUB_API_URL ?? DEFAULT_GITHUB_API;
|
|
5
|
+
const REPO_OWNER = 'centy-io';
|
|
6
|
+
const REPO_NAME = 'centy-daemon';
|
|
7
|
+
/**
|
|
8
|
+
* Fetch the latest release from GitHub
|
|
9
|
+
* Falls back to most recent pre-release if no stable release exists
|
|
10
|
+
* Multiple exports allowed for related GitHub API operations
|
|
11
|
+
*/
|
|
12
|
+
export async function fetchLatestRelease() {
|
|
13
|
+
// Try stable release first
|
|
14
|
+
const latestUrl = `${GITHUB_API_BASE}/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest`;
|
|
15
|
+
const latestResponse = await fetch(latestUrl, {
|
|
16
|
+
headers: {
|
|
17
|
+
Accept: 'application/vnd.github+json',
|
|
18
|
+
'User-Agent': 'centy-cli',
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
if (latestResponse.ok) {
|
|
22
|
+
return latestResponse.json();
|
|
23
|
+
}
|
|
24
|
+
// Fall back to most recent release (including pre-releases)
|
|
25
|
+
if (latestResponse.status === 404) {
|
|
26
|
+
const allReleasesUrl = `${GITHUB_API_BASE}/repos/${REPO_OWNER}/${REPO_NAME}/releases?per_page=1`;
|
|
27
|
+
const allResponse = await fetch(allReleasesUrl, {
|
|
28
|
+
headers: {
|
|
29
|
+
Accept: 'application/vnd.github+json',
|
|
30
|
+
'User-Agent': 'centy-cli',
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
if (allResponse.ok) {
|
|
34
|
+
const releases = (await allResponse.json());
|
|
35
|
+
if (releases.length > 0) {
|
|
36
|
+
return releases[0];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
throw new GithubApiError('No releases found for centy-daemon');
|
|
40
|
+
}
|
|
41
|
+
throw new GithubApiError(`Failed to fetch latest release: ${latestResponse.status} ${latestResponse.statusText}`);
|
|
42
|
+
}
|
|
43
|
+
export async function fetchRelease(version) {
|
|
44
|
+
const tag = version.startsWith('v') ? version : `v${version}`;
|
|
45
|
+
const url = `${GITHUB_API_BASE}/repos/${REPO_OWNER}/${REPO_NAME}/releases/tags/${tag}`;
|
|
46
|
+
const response = await fetch(url, {
|
|
47
|
+
headers: {
|
|
48
|
+
Accept: 'application/vnd.github+json',
|
|
49
|
+
'User-Agent': 'centy-cli',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
if (response.status === 404) {
|
|
54
|
+
throw new ReleaseNotFoundError(tag);
|
|
55
|
+
}
|
|
56
|
+
throw new GithubApiError(`Failed to fetch release ${tag}: ${response.status} ${response.statusText}`);
|
|
57
|
+
}
|
|
58
|
+
return response.json();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=github-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/github-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElE,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AACnD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAA;AACxE,MAAM,UAAU,GAAG,UAAU,CAAA;AAC7B,MAAM,SAAS,GAAG,cAAc,CAAA;AAEhC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,2BAA2B;IAC3B,MAAM,SAAS,GAAG,GAAG,eAAe,UAAU,UAAU,IAAI,SAAS,kBAAkB,CAAA;IACvF,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QAC5C,OAAO,EAAE;YACP,MAAM,EAAE,6BAA6B;YACrC,YAAY,EAAE,WAAW;SAC1B;KACF,CAAC,CAAA;IAEF,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO,cAAc,CAAC,IAAI,EAA4B,CAAA;IACxD,CAAC;IAED,4DAA4D;IAC5D,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,GAAG,eAAe,UAAU,UAAU,IAAI,SAAS,sBAAsB,CAAA;QAChG,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YAC9C,OAAO,EAAE;gBACP,MAAM,EAAE,6BAA6B;gBACrC,YAAY,EAAE,WAAW;aAC1B;SACF,CAAC,CAAA;QAEF,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAoB,CAAA;YAC9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,cAAc,CAAC,oCAAoC,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,IAAI,cAAc,CACtB,mCAAmC,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE,CACxF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAA;IAC7D,MAAM,GAAG,GAAG,GAAG,eAAe,UAAU,UAAU,IAAI,SAAS,kBAAkB,GAAG,EAAE,CAAA;IACtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,MAAM,EAAE,6BAA6B;YACrC,YAAY,EAAE,WAAW;SAC1B;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,IAAI,cAAc,CACtB,2BAA2B,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5E,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-daemon.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/install-daemon.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,YAAY,CAAA;AAyDnB,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA4E9B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, chmod, rm, rename } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { fetchLatestRelease, fetchRelease } from './github-api.js';
|
|
6
|
+
import { downloadAsset, downloadChecksums } from './download.js';
|
|
7
|
+
import { extractArchive } from './extract.js';
|
|
8
|
+
import { verifyChecksum } from './checksum.js';
|
|
9
|
+
import { getPlatformTarget } from './platform.js';
|
|
10
|
+
const INSTALL_DIR = join(homedir(), '.centy', 'bin');
|
|
11
|
+
const DAEMON_BINARY_NAME = 'centy-daemon';
|
|
12
|
+
async function downloadAndVerifyAsset(release, platformTarget, assetName, archivePath, skipChecksum, log, warn) {
|
|
13
|
+
log(`Downloading ${assetName}...`);
|
|
14
|
+
const asset = release.assets.find(a => a.name === assetName);
|
|
15
|
+
if (!asset) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
await downloadAsset(asset.browser_download_url, archivePath);
|
|
19
|
+
if (!skipChecksum) {
|
|
20
|
+
log('Verifying checksum...');
|
|
21
|
+
const checksums = await downloadChecksums(release);
|
|
22
|
+
const valid = await verifyChecksum(archivePath, assetName, checksums);
|
|
23
|
+
if (!valid) {
|
|
24
|
+
await rm(archivePath, { force: true });
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
log('Checksum verified');
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
warn('Skipping checksum verification');
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
async function finalizeInstallation(extractedPath, binaryName) {
|
|
35
|
+
const finalPath = join(INSTALL_DIR, binaryName);
|
|
36
|
+
if (extractedPath !== finalPath) {
|
|
37
|
+
if (existsSync(finalPath)) {
|
|
38
|
+
await rm(finalPath, { force: true });
|
|
39
|
+
}
|
|
40
|
+
await rename(extractedPath, finalPath);
|
|
41
|
+
}
|
|
42
|
+
if (process.platform !== 'win32') {
|
|
43
|
+
await chmod(finalPath, 0o755);
|
|
44
|
+
}
|
|
45
|
+
return finalPath;
|
|
46
|
+
}
|
|
47
|
+
export async function installDaemon(options) {
|
|
48
|
+
const opts = options ?? {};
|
|
49
|
+
const log = opts.log ?? console.log;
|
|
50
|
+
const warn = opts.warn ?? console.warn;
|
|
51
|
+
try {
|
|
52
|
+
const platformTarget = getPlatformTarget();
|
|
53
|
+
log(`Detected platform: ${platformTarget.target}`);
|
|
54
|
+
const binaryName = platformTarget.platform === 'win32'
|
|
55
|
+
? `${DAEMON_BINARY_NAME}.exe`
|
|
56
|
+
: DAEMON_BINARY_NAME;
|
|
57
|
+
const binaryPath = join(INSTALL_DIR, binaryName);
|
|
58
|
+
if (!opts.force && existsSync(binaryPath)) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: `Daemon already installed at ${binaryPath}. Use --force to reinstall.`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
log('Fetching release information...');
|
|
65
|
+
const release = opts.version
|
|
66
|
+
? await fetchRelease(opts.version)
|
|
67
|
+
: await fetchLatestRelease();
|
|
68
|
+
const version = release.tag_name.replace(/^v/, '');
|
|
69
|
+
log(`Installing version ${version}`);
|
|
70
|
+
const assetName = `centy-daemon-${release.tag_name}-${platformTarget.target}.${platformTarget.extension}`;
|
|
71
|
+
await mkdir(INSTALL_DIR, { recursive: true });
|
|
72
|
+
const archivePath = join(INSTALL_DIR, assetName);
|
|
73
|
+
const downloadSuccess = await downloadAndVerifyAsset(release, platformTarget, assetName, archivePath, opts.skipChecksum ?? false, log, warn);
|
|
74
|
+
if (!downloadSuccess) {
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
error: opts.skipChecksum
|
|
78
|
+
? `No binary found for platform ${platformTarget.target} in release ${version}`
|
|
79
|
+
: 'Checksum verification failed',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
log('Extracting...');
|
|
83
|
+
const extractedPath = await extractArchive(archivePath, INSTALL_DIR, platformTarget.extension);
|
|
84
|
+
const finalPath = await finalizeInstallation(extractedPath, binaryName);
|
|
85
|
+
await rm(archivePath, { force: true });
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
version,
|
|
89
|
+
installPath: finalPath,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
error: msg,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=install-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-daemon.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/install-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,YAAY,CAAA;AAWxE,wBAAgB,iBAAiB,IAAI,cAAc,CAiBlD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PlatformNotSupportedError } from './errors.js';
|
|
2
|
+
const TARGET_MAP = {
|
|
3
|
+
'linux-x64': 'x86_64-unknown-linux-gnu',
|
|
4
|
+
'linux-arm64': 'aarch64-unknown-linux-gnu',
|
|
5
|
+
'darwin-x64': 'x86_64-apple-darwin',
|
|
6
|
+
'darwin-arm64': 'aarch64-apple-darwin',
|
|
7
|
+
'win32-x64': 'x86_64-pc-windows-msvc',
|
|
8
|
+
};
|
|
9
|
+
export function getPlatformTarget() {
|
|
10
|
+
const platform = process.platform;
|
|
11
|
+
const arch = process.arch;
|
|
12
|
+
const key = `${platform}-${arch}`;
|
|
13
|
+
const target = TARGET_MAP[key];
|
|
14
|
+
if (!target) {
|
|
15
|
+
throw new PlatformNotSupportedError(platform, arch);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
platform,
|
|
19
|
+
arch,
|
|
20
|
+
target,
|
|
21
|
+
extension: platform === 'win32' ? 'zip' : 'tar.gz',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,UAAU,GAA2B;IACzC,WAAW,EAAE,0BAA0B;IACvC,aAAa,EAAE,2BAA2B;IAC1C,YAAY,EAAE,qBAAqB;IACnC,cAAc,EAAE,sBAAsB;IACtC,WAAW,EAAE,wBAAwB;CACtC,CAAA;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAoB,CAAA;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAoB,CAAA;IAEzC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACrD,CAAC;IAED,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;KACnD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for install-daemon module
|
|
3
|
+
* Multiple exports allowed for type definitions
|
|
4
|
+
*/
|
|
5
|
+
export interface InstallDaemonOptions {
|
|
6
|
+
version?: string;
|
|
7
|
+
force?: boolean;
|
|
8
|
+
skipChecksum?: boolean;
|
|
9
|
+
log?: (msg: string) => void;
|
|
10
|
+
warn?: (msg: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface InstallDaemonResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
version?: string;
|
|
15
|
+
installPath?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface GithubRelease {
|
|
19
|
+
tag_name: string;
|
|
20
|
+
assets: GithubAsset[];
|
|
21
|
+
}
|
|
22
|
+
export interface GithubAsset {
|
|
23
|
+
name: string;
|
|
24
|
+
browser_download_url: string;
|
|
25
|
+
}
|
|
26
|
+
export type Platform = 'linux' | 'darwin' | 'win32';
|
|
27
|
+
export type Architecture = 'x64' | 'arm64';
|
|
28
|
+
export interface PlatformTarget {
|
|
29
|
+
platform: Platform;
|
|
30
|
+
arch: Architecture;
|
|
31
|
+
target: string;
|
|
32
|
+
extension: 'tar.gz' | 'zip';
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/install-daemon/types.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;AACnD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAA;IAClB,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/install-daemon/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-binary-exists.d.ts","sourceRoot":"","sources":["../../../src/lib/start/daemon-binary-exists.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMxD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
const DAEMON_BINARY_NAME = 'centy-daemon';
|
|
3
|
+
export function daemonBinaryExists(path) {
|
|
4
|
+
// PATH lookup case - assume binary is accessible
|
|
5
|
+
if (path === DAEMON_BINARY_NAME) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
return existsSync(path);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=daemon-binary-exists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-binary-exists.js","sourceRoot":"","sources":["../../../src/lib/start/daemon-binary-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,kBAAkB,GAAG,cAAc,CAAA;AAEzC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,iDAAiD;IACjD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-daemon-binary.d.ts","sourceRoot":"","sources":["../../../src/lib/start/find-daemon-binary.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,IAAI,MAAM,CAsCzC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
const DAEMON_BINARY_NAME = 'centy-daemon';
|
|
6
|
+
export function findDaemonBinary() {
|
|
7
|
+
// 1. Check CENTY_DAEMON_PATH environment variable
|
|
8
|
+
const envPath = process.env['CENTY_DAEMON_PATH'];
|
|
9
|
+
if (envPath !== undefined && existsSync(envPath)) {
|
|
10
|
+
return envPath;
|
|
11
|
+
}
|
|
12
|
+
// 2. Check ~/.centy/bin/ (installed via centy install daemon)
|
|
13
|
+
const userInstallPath = join(homedir(), '.centy', 'bin', DAEMON_BINARY_NAME);
|
|
14
|
+
if (existsSync(userInstallPath)) {
|
|
15
|
+
return userInstallPath;
|
|
16
|
+
}
|
|
17
|
+
// 3. Check same directory as CLI binary
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const sameDirPath = join(__dirname, '..', '..', '..', DAEMON_BINARY_NAME);
|
|
20
|
+
if (existsSync(sameDirPath)) {
|
|
21
|
+
return sameDirPath;
|
|
22
|
+
}
|
|
23
|
+
// 4. Check development path (sibling repo)
|
|
24
|
+
const devPath = join(__dirname, '..', '..', '..', '..', 'centy-daemon', 'target', 'release', DAEMON_BINARY_NAME);
|
|
25
|
+
if (existsSync(devPath)) {
|
|
26
|
+
return devPath;
|
|
27
|
+
}
|
|
28
|
+
// 5. Fallback to PATH lookup (will be resolved by spawn)
|
|
29
|
+
return DAEMON_BINARY_NAME;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=find-daemon-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-daemon-binary.js","sourceRoot":"","sources":["../../../src/lib/start/find-daemon-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,MAAM,kBAAkB,GAAG,cAAc,CAAA;AAEzC,MAAM,UAAU,gBAAgB;IAC9B,kDAAkD;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAChD,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,8DAA8D;IAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAA;IAC5E,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACzE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,CAClB,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,QAAQ,EACR,SAAS,EACT,kBAAkB,CACnB,CAAA;IACD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,yDAAyD;IACzD,OAAO,kBAAkB,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-daemon.d.ts","sourceRoot":"","sources":["../../../src/lib/start/wait-for-daemon.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB3E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { checkDaemonConnection } from '../../daemon/check-daemon-connection.js';
|
|
2
|
+
const DEFAULT_MAX_ATTEMPTS = 5;
|
|
3
|
+
const DEFAULT_DELAY_MS = 500;
|
|
4
|
+
export async function waitForDaemon(options) {
|
|
5
|
+
const maxAttempts = options !== undefined && options.maxAttempts !== undefined
|
|
6
|
+
? options.maxAttempts
|
|
7
|
+
: DEFAULT_MAX_ATTEMPTS;
|
|
8
|
+
const delayMs = options !== undefined && options.delayMs !== undefined
|
|
9
|
+
? options.delayMs
|
|
10
|
+
: DEFAULT_DELAY_MS;
|
|
11
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
12
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
13
|
+
const status = await checkDaemonConnection();
|
|
14
|
+
if (status.connected) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=wait-for-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-daemon.js","sourceRoot":"","sources":["../../../src/lib/start/wait-for-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAE/E,MAAM,oBAAoB,GAAG,CAAC,CAAA;AAC9B,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAO5B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,MAAM,WAAW,GACf,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QACxD,CAAC,CAAC,OAAO,CAAC,WAAW;QACrB,CAAC,CAAC,oBAAoB,CAAA;IAC1B,MAAM,OAAO,GACX,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QACpD,CAAC,CAAC,OAAO,CAAC,OAAO;QACjB,CAAC,CAAC,gBAAgB,CAAA;IAEtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAA;QAC5C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAeA,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,6BA0DvC"}
|
package/dist/tui/App.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useKeyboard } from '@opentui/react';
|
|
3
|
+
import { Header } from './components/layout/Header.js';
|
|
4
|
+
import { Sidebar } from './components/layout/Sidebar.js';
|
|
5
|
+
import { StatusBar } from './components/layout/StatusBar.js';
|
|
6
|
+
import { ProjectList } from './components/domain/ProjectList.js';
|
|
7
|
+
import { IssueList } from './components/domain/IssueList.js';
|
|
8
|
+
import { DaemonPanel } from './components/domain/DaemonPanel.js';
|
|
9
|
+
import { MainPanel } from './components/layout/MainPanel.js';
|
|
10
|
+
import { useNavigation } from './hooks/useNavigation.js';
|
|
11
|
+
import { useDaemonConnection } from './hooks/useDaemonConnection.js';
|
|
12
|
+
import { useAppState } from './state/app-state.js';
|
|
13
|
+
import { SIDEBAR_VIEWS } from './types/views.js';
|
|
14
|
+
export function App({ onExit }) {
|
|
15
|
+
const { connected } = useDaemonConnection();
|
|
16
|
+
const { currentView, sidebarIndex, navigate, selectSidebarItem } = useNavigation();
|
|
17
|
+
const { state } = useAppState();
|
|
18
|
+
// Global keyboard shortcuts
|
|
19
|
+
useKeyboard((event) => {
|
|
20
|
+
// Quit
|
|
21
|
+
if (event.name === 'q') {
|
|
22
|
+
onExit();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Navigate sidebar with Tab or number keys
|
|
26
|
+
if (event.name === 'tab') {
|
|
27
|
+
const nextIndex = (sidebarIndex + 1) % SIDEBAR_VIEWS.length;
|
|
28
|
+
selectSidebarItem(nextIndex);
|
|
29
|
+
navigate(SIDEBAR_VIEWS[nextIndex]);
|
|
30
|
+
}
|
|
31
|
+
// Number keys for quick navigation
|
|
32
|
+
const numKey = parseInt(event.name);
|
|
33
|
+
if (numKey >= 1 && numKey <= SIDEBAR_VIEWS.length) {
|
|
34
|
+
selectSidebarItem(numKey - 1);
|
|
35
|
+
navigate(SIDEBAR_VIEWS[numKey - 1]);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const shortcuts = [
|
|
39
|
+
{ key: 'j/k', label: 'navigate' },
|
|
40
|
+
{ key: 'Enter', label: 'select' },
|
|
41
|
+
{ key: 'Tab', label: 'switch view' },
|
|
42
|
+
{ key: 'q', label: 'quit' },
|
|
43
|
+
];
|
|
44
|
+
return (_jsxs("box", { flexDirection: "column", width: "100%", height: "100%", children: [_jsx(Header, { title: "Centy", daemonConnected: connected }), _jsxs("box", { flexGrow: 1, flexDirection: "row", children: [_jsx(Sidebar, { currentView: currentView, selectedIndex: sidebarIndex, onNavigate: navigate }), renderView(currentView)] }), _jsx(StatusBar, { shortcuts: shortcuts, error: state.error })] }));
|
|
45
|
+
}
|
|
46
|
+
function renderView(view) {
|
|
47
|
+
switch (view) {
|
|
48
|
+
case 'projects':
|
|
49
|
+
return _jsx(ProjectList, {});
|
|
50
|
+
case 'issues':
|
|
51
|
+
return _jsx(IssueList, {});
|
|
52
|
+
case 'docs':
|
|
53
|
+
return (_jsx(MainPanel, { title: "Docs", children: _jsx("text", { fg: "gray", children: "Docs view coming soon..." }) }));
|
|
54
|
+
case 'assets':
|
|
55
|
+
return (_jsx(MainPanel, { title: "Assets", children: _jsx("text", { fg: "gray", children: "Assets view coming soon..." }) }));
|
|
56
|
+
case 'config':
|
|
57
|
+
return (_jsx(MainPanel, { title: "Config", children: _jsx("text", { fg: "gray", children: "Config view coming soon..." }) }));
|
|
58
|
+
case 'daemon':
|
|
59
|
+
return _jsx(DaemonPanel, {});
|
|
60
|
+
default:
|
|
61
|
+
return _jsx(ProjectList, {});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DaemonPanel.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/domain/DaemonPanel.tsx"],"names":[],"mappings":"AA6FA,wBAAgB,WAAW,8BAgC1B"}
|