crewly 1.20.131 → 1.20.133
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/config/constants.ts +49 -0
- package/config/index.ts +2 -0
- package/config/skills/agent/core/find-skill/SKILL.md +58 -0
- package/config/skills/agent/core/find-skill/execute.sh +67 -0
- package/config/skills/agent/core/find-skill/execute.test.sh +69 -0
- package/config/skills/agent/core/generate-pdf/SKILL.md +24 -29
- package/config/skills/agent/core/generate-pdf/execute.sh +22 -78
- package/config/skills/agent/core/generate-pdf/execute.test.sh +45 -0
- package/config/skills/agent/core/install-skill/SKILL.md +67 -0
- package/config/skills/agent/core/install-skill/execute.sh +80 -0
- package/config/skills/agent/core/install-skill/execute.test.sh +74 -0
- package/config/skills/agent/pdf-tools/SKILL.md +103 -0
- package/config/skills/agent/pdf-tools/execute.sh +301 -0
- package/config/skills/agent/pdf-tools/execute.test.sh +218 -0
- package/config/skills/agent/pdf-tools/instructions.md +14 -0
- package/config/skills/agent/pdf-tools/pdf_tools.py +268 -0
- package/config/skills/agent/pdf-tools/skill.json +103 -0
- package/config/skills/agent/pdf-tools/style.css +143 -0
- package/config/skills/agent/transcribe-audio/SKILL.md +42 -5
- package/config/skills/agent/transcribe-audio/execute.sh +44 -11
- package/config/skills/agent/transcribe-audio/execute.test.sh +90 -0
- package/config/skills/agent/transcribe-audio/install-whisper-cpp.sh +126 -0
- package/config/skills/agent/transcribe-audio/install-whisper-cpp.test.sh +69 -0
- package/config/skills/agent/transcribe-audio/skill.json +67 -6
- package/config/skills/marketplace-registry.ts +8 -1
- package/config/skills/registry.json +337 -3
- package/dist/backend/backend/src/constants.d.ts +71 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +96 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +56 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +114 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +73 -55
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +3 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js +185 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts +21 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js +29 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +5 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +115 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +160 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +11 -3
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +16 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.js +78 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +48 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +48 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +71 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +96 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts +101 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.js +392 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/types/marketplace.types.d.ts +219 -0
- package/dist/cli/backend/src/types/marketplace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/marketplace.types.js +6 -0
- package/dist/cli/backend/src/types/marketplace.types.js.map +1 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.js +78 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/package-root.d.ts +15 -0
- package/dist/cli/backend/src/utils/package-root.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/package-root.js +38 -0
- package/dist/cli/backend/src/utils/package-root.js.map +1 -0
- package/dist/cli/cli/src/commands/cloud.d.ts +45 -25
- package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/cloud.js +153 -47
- package/dist/cli/cli/src/commands/cloud.js.map +1 -1
- package/dist/cli/cli/src/commands/install.d.ts +13 -1
- package/dist/cli/cli/src/commands/install.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/install.js +40 -3
- package/dist/cli/cli/src/commands/install.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard-checklist.js +3 -3
- package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -1
- package/dist/cli/cli/src/commands/skills.d.ts +58 -0
- package/dist/cli/cli/src/commands/skills.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/skills.js +132 -0
- package/dist/cli/cli/src/commands/skills.js.map +1 -0
- package/dist/cli/cli/src/index.js +18 -7
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.d.ts +14 -0
- package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.js +24 -3
- package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
- package/dist/cli/cli/src/utils/cloud-submit.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/cloud-submit.js +14 -5
- package/dist/cli/cli/src/utils/cloud-submit.js.map +1 -1
- package/dist/cli/cli/src/utils/package-validator.d.ts +2 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/package-validator.js +16 -0
- package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
- package/dist/cli/config/constants.d.ts +48 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +48 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-5b98bf77.js → index-e6c403b6.js} +265 -265
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill setup runner — performs a skill's `setup` block, idempotently.
|
|
3
|
+
*
|
|
4
|
+
* Every step is checked first and reported "already satisfied" when it is,
|
|
5
|
+
* so running setup twice is cheap and changes nothing the second time. A step
|
|
6
|
+
* that is missing is installed and then checked again; "installed" is only
|
|
7
|
+
* reported when the re-check passes.
|
|
8
|
+
*
|
|
9
|
+
* Safety properties (specs/skill-auto-install.md):
|
|
10
|
+
* - **Never hangs on a password prompt.** Every child gets a closed stdin;
|
|
11
|
+
* apt-get runs only as root or through `sudo -n` (passwordless sudo). With
|
|
12
|
+
* neither, the step fails at once with a message saying what to run by hand.
|
|
13
|
+
* - **Downloads are verified before they are used.** A file is streamed to a
|
|
14
|
+
* temp name next to its destination, its size and sha256 are compared with
|
|
15
|
+
* the manifest, and only then renamed into place. A mismatch deletes the
|
|
16
|
+
* temp file and fails the step.
|
|
17
|
+
* - **One setup per skill at a time.** Concurrent calls in this process share
|
|
18
|
+
* one run; another process (the CLI while the backend installs) waits on a
|
|
19
|
+
* lock file under `$CREWLY_HOME/skill-setup/locks/`. A lock whose pid is
|
|
20
|
+
* gone, or that is older than LOCK_STALE_MS, is reclaimed.
|
|
21
|
+
* - **Everything is logged** to `$CREWLY_HOME/logs/skill-setup/<skill>.log`,
|
|
22
|
+
* including the full output of every install command.
|
|
23
|
+
*
|
|
24
|
+
* @module services/skill-setup/skill-setup-runner.service
|
|
25
|
+
*/
|
|
26
|
+
import type { RunCommand } from '../harness/harness.types.js';
|
|
27
|
+
import { type OsFamily, type SkillSetupManifest, type SkillSetupStep } from './skill-setup-manifest.js';
|
|
28
|
+
/** Final state of one step. */
|
|
29
|
+
export type StepStatus = 'satisfied' | 'installed' | 'missing' | 'failed' | 'skipped';
|
|
30
|
+
/** Progress phases reported while a step runs, plus its final state. */
|
|
31
|
+
export type ProgressPhase = 'checking' | 'installing' | 'downloading' | 'waiting' | StepStatus;
|
|
32
|
+
/** A progress event (also written to the log). */
|
|
33
|
+
export interface SetupProgressEvent {
|
|
34
|
+
skillId: string;
|
|
35
|
+
/** Step id, or `setup` for whole-run events */
|
|
36
|
+
stepId: string;
|
|
37
|
+
phase: ProgressPhase;
|
|
38
|
+
message: string;
|
|
39
|
+
}
|
|
40
|
+
/** Outcome of one step. */
|
|
41
|
+
export interface StepResult {
|
|
42
|
+
id: string;
|
|
43
|
+
type: SkillSetupStep['type'];
|
|
44
|
+
status: StepStatus;
|
|
45
|
+
message: string;
|
|
46
|
+
optional: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Outcome of a setup run. */
|
|
49
|
+
export interface SetupResult {
|
|
50
|
+
skillId: string;
|
|
51
|
+
/** True when every required step is satisfied or installed */
|
|
52
|
+
success: boolean;
|
|
53
|
+
/** True when nothing was installed (checks only) */
|
|
54
|
+
checkOnly: boolean;
|
|
55
|
+
steps: StepResult[];
|
|
56
|
+
/** Log file path (empty for check-only runs, which do not log) */
|
|
57
|
+
logFile: string;
|
|
58
|
+
durationMs: number;
|
|
59
|
+
/** Message of the first required step that failed or is missing */
|
|
60
|
+
error?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Input to {@link SkillSetupRunner.runSetup}. */
|
|
63
|
+
export interface RunSetupInput {
|
|
64
|
+
/** Skill id (used for the lock, log and default venv name) */
|
|
65
|
+
skillId: string;
|
|
66
|
+
/** Absolute skill directory (install scripts are resolved inside it) */
|
|
67
|
+
skillDir: string;
|
|
68
|
+
manifest: SkillSetupManifest;
|
|
69
|
+
/** Only check; never install (no lock, no log) */
|
|
70
|
+
checkOnly?: boolean;
|
|
71
|
+
onProgress?: (event: SetupProgressEvent) => void;
|
|
72
|
+
}
|
|
73
|
+
/** Size and hash of a downloaded file. */
|
|
74
|
+
export interface DownloadResult {
|
|
75
|
+
bytes: number;
|
|
76
|
+
sha256: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Download `url` to `destPath`, hashing as it streams.
|
|
80
|
+
*
|
|
81
|
+
* @param url - Source URL
|
|
82
|
+
* @param destPath - File to write (created/truncated)
|
|
83
|
+
* @param onBytes - Called with the running byte count
|
|
84
|
+
* @param stallTimeoutMs - Abort when no bytes arrive for this long
|
|
85
|
+
* @returns Bytes written and their sha256
|
|
86
|
+
* @throws On HTTP errors, stalls and write errors
|
|
87
|
+
*/
|
|
88
|
+
export type DownloadFile = (url: string, destPath: string, onBytes: (received: number) => void, stallTimeoutMs: number) => Promise<DownloadResult>;
|
|
89
|
+
/** Injectable dependencies. */
|
|
90
|
+
export interface SkillSetupRunnerDeps {
|
|
91
|
+
run?: RunCommand;
|
|
92
|
+
download?: DownloadFile;
|
|
93
|
+
osFamily?: () => OsFamily;
|
|
94
|
+
isRoot?: () => boolean;
|
|
95
|
+
crewlyHome?: () => string;
|
|
96
|
+
homeDir?: () => string;
|
|
97
|
+
env?: NodeJS.ProcessEnv;
|
|
98
|
+
now?: () => number;
|
|
99
|
+
pid?: number;
|
|
100
|
+
isPidAlive?: (pid: number) => boolean;
|
|
101
|
+
/** Free bytes on the filesystem holding `dir`, or null when unknown */
|
|
102
|
+
freeBytes?: (dir: string) => number | null;
|
|
103
|
+
sleep?: (ms: number) => Promise<void>;
|
|
104
|
+
lockPollMs?: number;
|
|
105
|
+
lockWaitMs?: number;
|
|
106
|
+
/** Directories searched for commands after PATH (default: Homebrew + system dirs) */
|
|
107
|
+
extraCommandDirs?: readonly string[];
|
|
108
|
+
/** Where to look for `brew` when it is not on PATH */
|
|
109
|
+
brewCandidates?: readonly string[];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect the OS family.
|
|
113
|
+
*
|
|
114
|
+
* @returns `darwin`, `debian` (Linux with /etc/debian_version) or `linux`
|
|
115
|
+
*/
|
|
116
|
+
export declare function detectOsFamily(): OsFamily;
|
|
117
|
+
/**
|
|
118
|
+
* Whether a pid belongs to a running process.
|
|
119
|
+
*
|
|
120
|
+
* @param pid - Process id
|
|
121
|
+
* @returns True when signal 0 can be delivered (or is refused with EPERM)
|
|
122
|
+
*/
|
|
123
|
+
export declare function isPidAlive(pid: number): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Download with fetch, streaming to disk and hashing on the way.
|
|
126
|
+
*
|
|
127
|
+
* @param url - Source URL (redirects are followed)
|
|
128
|
+
* @param destPath - Destination file
|
|
129
|
+
* @param onBytes - Progress callback (running byte count)
|
|
130
|
+
* @param stallTimeoutMs - Abort after this long without data
|
|
131
|
+
* @returns Bytes and sha256
|
|
132
|
+
* @throws On HTTP errors, stalls and write errors
|
|
133
|
+
*/
|
|
134
|
+
export declare const defaultDownload: DownloadFile;
|
|
135
|
+
/** Error raised when another process holds a skill's setup lock for too long. */
|
|
136
|
+
export declare class SetupLockTimeoutError extends Error {
|
|
137
|
+
readonly skillId: string;
|
|
138
|
+
readonly holderPid: number;
|
|
139
|
+
/**
|
|
140
|
+
* @param skillId - Skill whose lock is held
|
|
141
|
+
* @param holderPid - Pid recorded in the lock file
|
|
142
|
+
*/
|
|
143
|
+
constructor(skillId: string, holderPid: number);
|
|
144
|
+
}
|
|
145
|
+
/** Runs setup manifests. */
|
|
146
|
+
export declare class SkillSetupRunner {
|
|
147
|
+
private readonly run;
|
|
148
|
+
private readonly download;
|
|
149
|
+
private readonly osFamily;
|
|
150
|
+
private readonly isRoot;
|
|
151
|
+
private readonly crewlyHome;
|
|
152
|
+
private readonly homeDir;
|
|
153
|
+
private readonly env;
|
|
154
|
+
private readonly now;
|
|
155
|
+
private readonly pid;
|
|
156
|
+
private readonly pidAlive;
|
|
157
|
+
private readonly freeBytes;
|
|
158
|
+
private readonly sleep;
|
|
159
|
+
private readonly lockPollMs;
|
|
160
|
+
private readonly lockWaitMs;
|
|
161
|
+
private readonly extraCommandDirs;
|
|
162
|
+
private readonly brewCandidates;
|
|
163
|
+
/** Setup runs in flight in this process, by skill id */
|
|
164
|
+
private readonly inflight;
|
|
165
|
+
/**
|
|
166
|
+
* @param deps - Injectable dependencies (all optional)
|
|
167
|
+
*/
|
|
168
|
+
constructor(deps?: SkillSetupRunnerDeps);
|
|
169
|
+
/**
|
|
170
|
+
* Path of a skill's setup log.
|
|
171
|
+
*
|
|
172
|
+
* @param skillId - Skill id
|
|
173
|
+
* @returns `$CREWLY_HOME/logs/skill-setup/<id>.log`
|
|
174
|
+
*/
|
|
175
|
+
logFileFor(skillId: string): string;
|
|
176
|
+
/**
|
|
177
|
+
* Expand `~/` and `$CREWLY_HOME/` in a manifest path.
|
|
178
|
+
*
|
|
179
|
+
* @param p - Manifest path
|
|
180
|
+
* @returns Absolute path
|
|
181
|
+
*/
|
|
182
|
+
expandPath(p: string): string;
|
|
183
|
+
/**
|
|
184
|
+
* Perform (or only check) a setup manifest.
|
|
185
|
+
*
|
|
186
|
+
* Concurrent calls for the same skill in this process share one run.
|
|
187
|
+
*
|
|
188
|
+
* @param input - Skill id, directory, manifest, mode and progress callback
|
|
189
|
+
* @returns Per-step results; never rejects for step failures
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```ts
|
|
193
|
+
* const result = await runner.runSetup({ skillId: 'transcribe-audio', skillDir, manifest });
|
|
194
|
+
* if (!result.success) console.error(result.error, 'see', result.logFile);
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
runSetup(input: RunSetupInput): Promise<SetupResult>;
|
|
198
|
+
/**
|
|
199
|
+
* Run every step (under the lock unless check-only).
|
|
200
|
+
*
|
|
201
|
+
* @param input - Run input
|
|
202
|
+
* @returns The result
|
|
203
|
+
*/
|
|
204
|
+
private execute;
|
|
205
|
+
/**
|
|
206
|
+
* Dispatch one step.
|
|
207
|
+
*
|
|
208
|
+
* @param step - Step
|
|
209
|
+
* @param input - Run input
|
|
210
|
+
* @param emit - Progress emitter
|
|
211
|
+
* @returns Step result
|
|
212
|
+
*/
|
|
213
|
+
private runStep;
|
|
214
|
+
/**
|
|
215
|
+
* Build a step result.
|
|
216
|
+
*
|
|
217
|
+
* @param step - Step
|
|
218
|
+
* @param status - Final status
|
|
219
|
+
* @param message - Message
|
|
220
|
+
* @returns The result
|
|
221
|
+
*/
|
|
222
|
+
private stepResult;
|
|
223
|
+
/**
|
|
224
|
+
* PATH used for checks and installs: `$CREWLY_HOME/bin`, the process PATH,
|
|
225
|
+
* then the usual system and Homebrew dirs (a backend started by launchd or
|
|
226
|
+
* systemd often lacks /opt/homebrew/bin).
|
|
227
|
+
*
|
|
228
|
+
* @returns PATH string
|
|
229
|
+
*/
|
|
230
|
+
private searchPath;
|
|
231
|
+
/**
|
|
232
|
+
* Environment for child processes.
|
|
233
|
+
*
|
|
234
|
+
* @param extra - Additional variables
|
|
235
|
+
* @returns Environment
|
|
236
|
+
*/
|
|
237
|
+
private childEnv;
|
|
238
|
+
/**
|
|
239
|
+
* Run a command, streaming its output into the log.
|
|
240
|
+
*
|
|
241
|
+
* @param logFile - Log file ('' = do not log)
|
|
242
|
+
* @param skillId - Skill id
|
|
243
|
+
* @param stepId - Step id
|
|
244
|
+
* @param command - Executable
|
|
245
|
+
* @param args - Arguments
|
|
246
|
+
* @param timeoutMs - Timeout
|
|
247
|
+
* @param env - Environment
|
|
248
|
+
* @returns Exit code and combined output
|
|
249
|
+
*/
|
|
250
|
+
private exec;
|
|
251
|
+
/**
|
|
252
|
+
* What satisfies a command check, if anything.
|
|
253
|
+
*
|
|
254
|
+
* @param step - Command step
|
|
255
|
+
* @returns A description of the match, or null
|
|
256
|
+
*/
|
|
257
|
+
private commandPresent;
|
|
258
|
+
/**
|
|
259
|
+
* How this process can run apt-get.
|
|
260
|
+
*
|
|
261
|
+
* @param packages - Packages (for the hint)
|
|
262
|
+
* @returns The command + argument prefix, or an error message
|
|
263
|
+
*/
|
|
264
|
+
private aptAccess;
|
|
265
|
+
/**
|
|
266
|
+
* The value handed to install scripts in CREWLY_SUDO: '' (root),
|
|
267
|
+
* 'sudo -n' (passwordless sudo) or 'unavailable'.
|
|
268
|
+
*
|
|
269
|
+
* @returns Sudo mode
|
|
270
|
+
*/
|
|
271
|
+
private sudoMode;
|
|
272
|
+
/**
|
|
273
|
+
* Check, install and re-check a command dependency.
|
|
274
|
+
*
|
|
275
|
+
* @param step - Command step
|
|
276
|
+
* @param input - Run input
|
|
277
|
+
* @param emit - Progress emitter
|
|
278
|
+
* @returns Step result
|
|
279
|
+
*/
|
|
280
|
+
private runCommandStep;
|
|
281
|
+
/**
|
|
282
|
+
* Check, download, verify and place a file.
|
|
283
|
+
*
|
|
284
|
+
* @param step - File step
|
|
285
|
+
* @param input - Run input
|
|
286
|
+
* @param emit - Progress emitter
|
|
287
|
+
* @returns Step result
|
|
288
|
+
*/
|
|
289
|
+
private runFileStep;
|
|
290
|
+
/**
|
|
291
|
+
* Check, create and fill a Python virtualenv.
|
|
292
|
+
*
|
|
293
|
+
* @param step - Python step
|
|
294
|
+
* @param input - Run input
|
|
295
|
+
* @param emit - Progress emitter
|
|
296
|
+
* @returns Step result
|
|
297
|
+
*/
|
|
298
|
+
private runPythonStep;
|
|
299
|
+
/**
|
|
300
|
+
* Take the per-skill lock file, waiting while another live process holds it.
|
|
301
|
+
*
|
|
302
|
+
* @param skillId - Skill id
|
|
303
|
+
* @param onWait - Called once when the lock is busy
|
|
304
|
+
* @returns A release function
|
|
305
|
+
* @throws SetupLockTimeoutError when the holder does not finish in lockWaitMs
|
|
306
|
+
*/
|
|
307
|
+
private acquireLock;
|
|
308
|
+
/**
|
|
309
|
+
* Append a timestamped line to a log file.
|
|
310
|
+
*
|
|
311
|
+
* @param logFile - Log file
|
|
312
|
+
* @param skillId - Skill id
|
|
313
|
+
* @param stepId - Step id
|
|
314
|
+
* @param message - Message
|
|
315
|
+
*/
|
|
316
|
+
private log;
|
|
317
|
+
/**
|
|
318
|
+
* Append text to a log file (best effort).
|
|
319
|
+
*
|
|
320
|
+
* @param logFile - Log file
|
|
321
|
+
* @param text - Text
|
|
322
|
+
*/
|
|
323
|
+
private appendRaw;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Human-readable byte size.
|
|
327
|
+
*
|
|
328
|
+
* @param bytes - Size
|
|
329
|
+
* @returns e.g. "547.4 MB"
|
|
330
|
+
*/
|
|
331
|
+
export declare function formatSize(bytes: number): string;
|
|
332
|
+
/**
|
|
333
|
+
* The process-wide runner (shares in-flight runs across callers).
|
|
334
|
+
*
|
|
335
|
+
* @returns The runner
|
|
336
|
+
*/
|
|
337
|
+
export declare function getSkillSetupRunner(): SkillSetupRunner;
|
|
338
|
+
//# sourceMappingURL=skill-setup-runner.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-setup-runner.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/skill-setup/skill-setup-runner.service.ts"],"names":[],"mappings":"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"}
|