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.
Files changed (186) hide show
  1. package/config/constants.ts +49 -0
  2. package/config/index.ts +2 -0
  3. package/config/skills/agent/core/find-skill/SKILL.md +58 -0
  4. package/config/skills/agent/core/find-skill/execute.sh +67 -0
  5. package/config/skills/agent/core/find-skill/execute.test.sh +69 -0
  6. package/config/skills/agent/core/generate-pdf/SKILL.md +24 -29
  7. package/config/skills/agent/core/generate-pdf/execute.sh +22 -78
  8. package/config/skills/agent/core/generate-pdf/execute.test.sh +45 -0
  9. package/config/skills/agent/core/install-skill/SKILL.md +67 -0
  10. package/config/skills/agent/core/install-skill/execute.sh +80 -0
  11. package/config/skills/agent/core/install-skill/execute.test.sh +74 -0
  12. package/config/skills/agent/pdf-tools/SKILL.md +103 -0
  13. package/config/skills/agent/pdf-tools/execute.sh +301 -0
  14. package/config/skills/agent/pdf-tools/execute.test.sh +218 -0
  15. package/config/skills/agent/pdf-tools/instructions.md +14 -0
  16. package/config/skills/agent/pdf-tools/pdf_tools.py +268 -0
  17. package/config/skills/agent/pdf-tools/skill.json +103 -0
  18. package/config/skills/agent/pdf-tools/style.css +143 -0
  19. package/config/skills/agent/transcribe-audio/SKILL.md +42 -5
  20. package/config/skills/agent/transcribe-audio/execute.sh +44 -11
  21. package/config/skills/agent/transcribe-audio/execute.test.sh +90 -0
  22. package/config/skills/agent/transcribe-audio/install-whisper-cpp.sh +126 -0
  23. package/config/skills/agent/transcribe-audio/install-whisper-cpp.test.sh +69 -0
  24. package/config/skills/agent/transcribe-audio/skill.json +67 -6
  25. package/config/skills/marketplace-registry.ts +8 -1
  26. package/config/skills/registry.json +337 -3
  27. package/dist/backend/backend/src/constants.d.ts +71 -0
  28. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  29. package/dist/backend/backend/src/constants.js +96 -0
  30. package/dist/backend/backend/src/constants.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +56 -0
  32. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -0
  33. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +114 -0
  34. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -0
  35. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +25 -0
  36. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  37. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +73 -55
  38. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  39. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +3 -0
  40. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
  41. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +9 -0
  42. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
  43. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts +49 -0
  44. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts.map +1 -0
  45. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js +185 -0
  46. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js.map +1 -0
  47. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts +21 -0
  48. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts.map +1 -0
  49. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js +29 -0
  50. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js.map +1 -0
  51. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  52. package/dist/backend/backend/src/routes/api.routes.js +5 -0
  53. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  54. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
  55. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
  57. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  58. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
  59. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
  60. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
  61. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
  62. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +115 -0
  63. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +160 -0
  65. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js.map +1 -0
  66. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
  68. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
  70. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +11 -3
  71. package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
  73. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
  75. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
  76. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
  77. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
  79. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
  81. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
  83. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
  84. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
  85. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
  87. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
  88. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
  90. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  91. package/dist/backend/backend/src/types/marketplace.types.d.ts +16 -1
  92. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  93. package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
  94. package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
  95. package/dist/backend/backend/src/utils/inbound-file-hint.utils.js +78 -0
  96. package/dist/backend/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
  97. package/dist/backend/build-info.json +2 -2
  98. package/dist/backend/config/constants.d.ts +48 -0
  99. package/dist/backend/config/constants.d.ts.map +1 -1
  100. package/dist/backend/config/constants.js +48 -0
  101. package/dist/backend/config/constants.js.map +1 -1
  102. package/dist/backend/config/index.d.ts +2 -2
  103. package/dist/backend/config/index.d.ts.map +1 -1
  104. package/dist/backend/config/index.js +2 -2
  105. package/dist/backend/config/index.js.map +1 -1
  106. package/dist/cli/backend/src/constants.d.ts +71 -0
  107. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  108. package/dist/cli/backend/src/constants.js +96 -0
  109. package/dist/cli/backend/src/constants.js.map +1 -1
  110. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
  111. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
  113. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  114. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
  115. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
  116. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
  117. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
  118. package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts +101 -0
  119. package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -0
  120. package/dist/cli/backend/src/services/marketplace/marketplace.service.js +392 -0
  121. package/dist/cli/backend/src/services/marketplace/marketplace.service.js.map +1 -0
  122. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
  123. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
  124. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
  125. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
  126. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
  127. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
  128. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
  129. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
  130. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
  131. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
  132. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
  133. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
  134. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
  136. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  137. package/dist/cli/backend/src/types/marketplace.types.d.ts +219 -0
  138. package/dist/cli/backend/src/types/marketplace.types.d.ts.map +1 -0
  139. package/dist/cli/backend/src/types/marketplace.types.js +6 -0
  140. package/dist/cli/backend/src/types/marketplace.types.js.map +1 -0
  141. package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
  142. package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
  143. package/dist/cli/backend/src/utils/inbound-file-hint.utils.js +78 -0
  144. package/dist/cli/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
  145. package/dist/cli/backend/src/utils/package-root.d.ts +15 -0
  146. package/dist/cli/backend/src/utils/package-root.d.ts.map +1 -0
  147. package/dist/cli/backend/src/utils/package-root.js +38 -0
  148. package/dist/cli/backend/src/utils/package-root.js.map +1 -0
  149. package/dist/cli/cli/src/commands/cloud.d.ts +45 -25
  150. package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -1
  151. package/dist/cli/cli/src/commands/cloud.js +153 -47
  152. package/dist/cli/cli/src/commands/cloud.js.map +1 -1
  153. package/dist/cli/cli/src/commands/install.d.ts +13 -1
  154. package/dist/cli/cli/src/commands/install.d.ts.map +1 -1
  155. package/dist/cli/cli/src/commands/install.js +40 -3
  156. package/dist/cli/cli/src/commands/install.js.map +1 -1
  157. package/dist/cli/cli/src/commands/onboard-checklist.js +3 -3
  158. package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -1
  159. package/dist/cli/cli/src/commands/skills.d.ts +58 -0
  160. package/dist/cli/cli/src/commands/skills.d.ts.map +1 -0
  161. package/dist/cli/cli/src/commands/skills.js +132 -0
  162. package/dist/cli/cli/src/commands/skills.js.map +1 -0
  163. package/dist/cli/cli/src/index.js +18 -7
  164. package/dist/cli/cli/src/index.js.map +1 -1
  165. package/dist/cli/cli/src/utils/archive-creator.d.ts +14 -0
  166. package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
  167. package/dist/cli/cli/src/utils/archive-creator.js +24 -3
  168. package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
  169. package/dist/cli/cli/src/utils/cloud-submit.d.ts.map +1 -1
  170. package/dist/cli/cli/src/utils/cloud-submit.js +14 -5
  171. package/dist/cli/cli/src/utils/cloud-submit.js.map +1 -1
  172. package/dist/cli/cli/src/utils/package-validator.d.ts +2 -0
  173. package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
  174. package/dist/cli/cli/src/utils/package-validator.js +16 -0
  175. package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
  176. package/dist/cli/config/constants.d.ts +48 -0
  177. package/dist/cli/config/constants.d.ts.map +1 -1
  178. package/dist/cli/config/constants.js +48 -0
  179. package/dist/cli/config/constants.js.map +1 -1
  180. package/dist/cli/config/index.d.ts +2 -2
  181. package/dist/cli/config/index.d.ts.map +1 -1
  182. package/dist/cli/config/index.js +2 -2
  183. package/dist/cli/config/index.js.map +1 -1
  184. package/frontend/dist/assets/{index-5b98bf77.js → index-e6c403b6.js} +265 -265
  185. package/frontend/dist/index.html +1 -1
  186. 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAKN,KAAK,QAAQ,EAEb,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,MAAM,2BAA2B,CAAC;AAEnC,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,wEAAwE;AACxE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/F,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,2BAA2B;AAC3B,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC7B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjD;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACnC,cAAc,EAAE,MAAM,KAClB,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,+BAA+B;AAC/B,MAAM,WAAW,oBAAoB;IACpC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,sDAAsD;IACtD,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAQD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAGzC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAiBD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,YAiC7B,CAAC;AAEF,iFAAiF;AACjF,qBAAa,qBAAsB,SAAQ,KAAK;aAM9B,OAAO,EAAE,MAAM;aACf,SAAS,EAAE,MAAM;IANlC;;;OAGG;gBAEc,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM;CAKlC;AAED,4BAA4B;AAC5B,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IAEpE;;OAEG;gBACS,IAAI,GAAE,oBAAyB;IAmB3C;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAInC;;;;;OAKG;IACH,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAM7B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IASpD;;;;;OAKG;YACW,OAAO;IA0DrB;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO;IAef;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAIlB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IASlB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAchB;;;;;;;;;;;OAWG;YACW,IAAI;IAmBlB;;;;;OAKG;YACW,cAAc;IAyB5B;;;;;OAKG;YACW,SAAS;IAcvB;;;;;OAKG;YACW,QAAQ;IAQtB;;;;;;;OAOG;YACW,cAAc;IAiE5B;;;;;;;OAOG;YACW,WAAW;IA2DzB;;;;;;;OAOG;YACW,aAAa;IA+C3B;;;;;;;OAOG;YACW,WAAW;IAgDzB;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAQjB;AAaD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAiBD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAGtD"}