@crewx/sdk 0.9.0-rc.17 → 0.9.0-rc.171

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 (343) hide show
  1. package/README.md +1 -1
  2. package/dist/account/auth-client.d.ts +61 -0
  3. package/dist/account/auth-json-v2.d.ts +1 -0
  4. package/dist/account/auth-json.d.ts +30 -0
  5. package/dist/account/config.d.ts +37 -0
  6. package/dist/account/env-bootstrap.d.ts +11 -0
  7. package/dist/account/errors.d.ts +24 -0
  8. package/dist/account/index.d.ts +12 -0
  9. package/dist/account/index.js +2 -0
  10. package/dist/account/session-manager.d.ts +47 -0
  11. package/dist/activity-log/builder.d.ts +59 -6
  12. package/dist/agent/agent-list-view.d.ts +19 -0
  13. package/dist/agent-interceptor/chain.d.ts +25 -0
  14. package/dist/agent-interceptor/index.d.ts +6 -0
  15. package/dist/agent-interceptor/model-runner.d.ts +19 -0
  16. package/dist/agent-interceptor/program-runner.d.ts +13 -0
  17. package/dist/agent-interceptor/protocol.d.ts +68 -0
  18. package/dist/agent-interceptor/run-stop.d.ts +3 -0
  19. package/dist/agent-interceptor/schema.d.ts +267 -0
  20. package/dist/agent-interceptor/types.d.ts +88 -0
  21. package/dist/app/app.d.ts +167 -0
  22. package/dist/app/backend-env.d.ts +3 -0
  23. package/dist/app/content-media-types.d.ts +2 -0
  24. package/dist/app/context.d.ts +2 -0
  25. package/dist/app/entry.d.ts +9 -0
  26. package/dist/app/frame.d.ts +55 -0
  27. package/dist/app/index.d.ts +18 -0
  28. package/dist/app/index.js +12 -0
  29. package/dist/app/job-bridge.child.d.ts +1 -0
  30. package/dist/app/job-bridge.d.ts +67 -0
  31. package/dist/app/job-bridge.drain.child.d.ts +1 -0
  32. package/dist/app/job-bridge.example.d.ts +11 -0
  33. package/dist/app/job-contract.d.ts +40 -0
  34. package/dist/app/job-wire.d.ts +149 -0
  35. package/dist/app/protocol.d.ts +9 -0
  36. package/dist/app/runtime.d.ts +23 -0
  37. package/dist/app/schedule-contract.d.ts +59 -0
  38. package/dist/app/tool-mode.d.ts +3 -0
  39. package/dist/app-artifact-policy/check.d.ts +2 -0
  40. package/dist/app-artifact-policy/contract.d.ts +54 -0
  41. package/dist/app-artifact-policy/helper.d.ts +15 -0
  42. package/dist/app-artifact-policy/index.d.ts +3 -0
  43. package/dist/app-artifact-policy/index.js +18 -0
  44. package/dist/app-artifact-policy/paths.d.ts +24 -0
  45. package/dist/app-artifact-policy/scan.d.ts +47 -0
  46. package/dist/boxing/box.types.d.ts +4 -0
  47. package/dist/config/canonicalize-agent-options.d.ts +18 -0
  48. package/dist/config/default-agent-models.d.ts +11 -0
  49. package/dist/config/global-settings.d.ts +33 -0
  50. package/dist/config/migrate-grok-mode.d.ts +6 -0
  51. package/dist/config/model-compat.d.ts +31 -0
  52. package/dist/config/models.generated.d.ts +37 -0
  53. package/dist/config/models.remote.d.ts +1 -0
  54. package/dist/config/overdrive.d.ts +7 -0
  55. package/dist/config/pricing.d.ts +6 -3
  56. package/dist/config/pricing.generated.d.ts +4 -0
  57. package/dist/config/pricing.types.d.ts +4 -0
  58. package/dist/config/timeout.config.d.ts +4 -0
  59. package/dist/config/wi-boards.d.ts +19 -0
  60. package/dist/context-budget/continuity.d.ts +63 -0
  61. package/dist/context-budget/index.d.ts +142 -0
  62. package/dist/conversation/index.d.ts +1 -1
  63. package/dist/conversation/sqlite-provider.d.ts +6 -3
  64. package/dist/conversation/to-template-messages.d.ts +9 -0
  65. package/dist/conversation/types.d.ts +58 -1
  66. package/dist/desktop/command-runner.d.ts +4 -0
  67. package/dist/desktop/default-adapters.d.ts +4 -0
  68. package/dist/desktop/global-install.d.ts +19 -0
  69. package/dist/desktop/index.d.ts +3 -0
  70. package/dist/desktop/index.js +3 -0
  71. package/dist/desktop/install.d.ts +5 -0
  72. package/dist/desktop/lnk.d.ts +22 -0
  73. package/dist/desktop/manifest.d.ts +21 -0
  74. package/dist/desktop/types.d.ts +67 -0
  75. package/dist/desktop/version.d.ts +1 -0
  76. package/dist/desktop/windows-paths.d.ts +21 -0
  77. package/dist/desktop/wrapper.d.ts +18 -0
  78. package/dist/esm/account/index.js +2 -0
  79. package/dist/esm/app/index.js +12 -0
  80. package/dist/esm/app-artifact-policy/index.js +18 -0
  81. package/dist/esm/desktop/index.js +3 -0
  82. package/dist/esm/index.js +1175 -224
  83. package/dist/esm/node/index.js +2 -0
  84. package/dist/esm/plugins/index.js +527 -214
  85. package/dist/esm/process/index.js +1 -0
  86. package/dist/esm/publish/index.js +2 -0
  87. package/dist/esm/repository/index.js +648 -211
  88. package/dist/esm/skills/index.js +2 -0
  89. package/dist/esm/testing/index.js +1 -1
  90. package/dist/events/types.d.ts +28 -0
  91. package/dist/facade/Crewx.d.ts +70 -5
  92. package/dist/facade/task-ticket.d.ts +14 -0
  93. package/dist/highlight/thread-highlight-prompt.d.ts +2 -0
  94. package/dist/highlight/thread-highlighter.d.ts +326 -0
  95. package/dist/index.browser.d.ts +25 -1
  96. package/dist/index.browser.js +6 -2
  97. package/dist/index.d.ts +157 -17
  98. package/dist/index.js +1175 -224
  99. package/dist/internal/console-decoder.d.ts +38 -0
  100. package/dist/internal/windows-spawn.d.ts +10 -0
  101. package/dist/layout/types.d.ts +18 -1
  102. package/dist/lifecycle/process-lease.d.ts +80 -0
  103. package/dist/lifecycle/process-owner.d.ts +20 -0
  104. package/dist/lifecycle/task-heartbeat.d.ts +41 -0
  105. package/dist/lifecycle/task-stop.d.ts +82 -0
  106. package/dist/lifecycle/update-admission.d.ts +45 -0
  107. package/dist/local-server/base-url.d.ts +18 -0
  108. package/dist/local-server/index.d.ts +8 -0
  109. package/dist/local-server/opencode.d.ts +8 -0
  110. package/dist/local-server/probe.d.ts +3 -0
  111. package/dist/local-server/runtime.d.ts +26 -0
  112. package/dist/local-server/types.d.ts +43 -0
  113. package/dist/mcp-app/agent-access.d.ts +26 -0
  114. package/dist/mcp-app/app-handoff.d.ts +109 -0
  115. package/dist/mcp-app/app-icon-read.d.ts +7 -0
  116. package/dist/mcp-app/app-job-bridge.d.ts +30 -0
  117. package/dist/mcp-app/app-job-bridge.example.d.ts +36 -0
  118. package/dist/mcp-app/app-job.d.ts +168 -0
  119. package/dist/mcp-app/app-schedule.d.ts +85 -0
  120. package/dist/mcp-app/apps-context.d.ts +32 -0
  121. package/dist/mcp-app/bundle-provenance.d.ts +3 -0
  122. package/dist/mcp-app/candidate-registration.d.ts +4 -0
  123. package/dist/mcp-app/card-handler.d.ts +7 -0
  124. package/dist/mcp-app/catalog.d.ts +7 -0
  125. package/dist/mcp-app/content-channel.d.ts +86 -0
  126. package/dist/mcp-app/content-declarations.d.ts +31 -0
  127. package/dist/mcp-app/dev-checks.d.ts +31 -0
  128. package/dist/mcp-app/diagnostic-reason.d.ts +3 -0
  129. package/dist/mcp-app/discovery.d.ts +164 -0
  130. package/dist/mcp-app/errors.d.ts +7 -0
  131. package/dist/mcp-app/index.d.ts +45 -0
  132. package/dist/mcp-app/installed-app-ref.d.ts +25 -0
  133. package/dist/mcp-app/model-context.d.ts +29 -0
  134. package/dist/mcp-app/node-app-discovery-fs.d.ts +23 -0
  135. package/dist/mcp-app/product-bundle-assets.d.ts +27 -0
  136. package/dist/mcp-app/product-bundle-loader.d.ts +53 -0
  137. package/dist/mcp-app/projection.d.ts +14 -0
  138. package/dist/mcp-app/prompt-cards.d.ts +28 -0
  139. package/dist/mcp-app/registry.d.ts +28 -0
  140. package/dist/mcp-app/skill-backend.d.ts +141 -0
  141. package/dist/mcp-app/state-set.d.ts +9 -0
  142. package/dist/mcp-app/types.d.ts +490 -0
  143. package/dist/mcp-app/workspace-app-assets.d.ts +42 -0
  144. package/dist/mcp-app/workspace-app-scan-cache.d.ts +27 -0
  145. package/dist/mcp-app/workspace-snapshot.d.ts +76 -0
  146. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  147. package/dist/migrations/0012_blue_turbo.sql +23 -0
  148. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  149. package/dist/migrations/0014_organic_mongu.sql +73 -0
  150. package/dist/migrations/0015_panoramic_gorilla_man.sql +71 -0
  151. package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
  152. package/dist/migrations/0017_project_stage_sdk_migration.sql +29 -0
  153. package/dist/migrations/0018_bored_jackal.sql +33 -0
  154. package/dist/migrations/0019_backfill_task_thread_ids.sql +74 -0
  155. package/dist/migrations/0020_useful_iron_lad.sql +55 -0
  156. package/dist/migrations/0021_dashing_peter_quill.sql +51 -0
  157. package/dist/migrations/0022_wandering_bucky.sql +1 -0
  158. package/dist/migrations/0023_red_payback.sql +1 -0
  159. package/dist/migrations/0024_storage_metadata.sql +262 -0
  160. package/dist/migrations/0025_task_heartbeat.sql +8 -0
  161. package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
  162. package/dist/migrations/0026_mcp_action_source.sql +47 -0
  163. package/dist/migrations/0027_task_stop_scope_cleanup.sql +5 -0
  164. package/dist/migrations/0027_ui_instance_active_unique.sql +2 -0
  165. package/dist/migrations/0029_nice_rhino.sql +1 -0
  166. package/dist/migrations/0031_petite_arclight.sql +6 -0
  167. package/dist/migrations/0032_ui_instance_opened_by.sql +1 -0
  168. package/dist/migrations/0033_thread_creator_boundary_guard.sql +38 -0
  169. package/dist/migrations/0034_keen_fallen_one.sql +36 -0
  170. package/dist/migrations/0035_request_log_daily.sql +11 -0
  171. package/dist/migrations/0036_ui_definition_archive.sql +8 -0
  172. package/dist/migrations/0037_ui_instance_agent_open_request.sql +1 -0
  173. package/dist/migrations/0038_task_rating.sql +3 -0
  174. package/dist/migrations/0039_aspiring_purifiers.sql +9 -0
  175. package/dist/migrations/0040_task_provider_inputs.sql +53 -0
  176. package/dist/migrations/0041_tranquil_vivisector.sql +54 -0
  177. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  178. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  179. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  180. package/dist/migrations/meta/0014_snapshot.json +1975 -0
  181. package/dist/migrations/meta/0015_snapshot.json +2315 -0
  182. package/dist/migrations/meta/0016_snapshot.json +2419 -0
  183. package/dist/migrations/meta/0017_snapshot.json +2419 -0
  184. package/dist/migrations/meta/0018_snapshot.json +2570 -0
  185. package/dist/migrations/meta/0020_snapshot.json +2895 -0
  186. package/dist/migrations/meta/0021_snapshot.json +3031 -0
  187. package/dist/migrations/meta/0022_snapshot.json +3039 -0
  188. package/dist/migrations/meta/0023_snapshot.json +3047 -0
  189. package/dist/migrations/meta/0029_snapshot.json +3206 -0
  190. package/dist/migrations/meta/0031_snapshot.json +3251 -0
  191. package/dist/migrations/meta/0034_snapshot.json +3473 -0
  192. package/dist/migrations/meta/0035_snapshot.json +3547 -0
  193. package/dist/migrations/meta/0036_snapshot.json +3591 -0
  194. package/dist/migrations/meta/0037_snapshot.json +3598 -0
  195. package/dist/migrations/meta/0038_snapshot.json +3626 -0
  196. package/dist/migrations/meta/0039_snapshot.json +3684 -0
  197. package/dist/migrations/meta/0040_snapshot.json +3759 -0
  198. package/dist/migrations/meta/0041_snapshot.json +4156 -0
  199. package/dist/migrations/meta/_journal.json +217 -0
  200. package/dist/node/index.d.ts +1 -0
  201. package/dist/node/index.js +2 -0
  202. package/dist/paths.d.ts +1 -0
  203. package/dist/plugin/types.d.ts +1 -0
  204. package/dist/plugins/index.d.ts +1 -1
  205. package/dist/plugins/index.js +527 -214
  206. package/dist/plugins/sqlite-tracing.d.ts +46 -0
  207. package/dist/process/index.d.ts +2 -0
  208. package/dist/process/index.js +1 -0
  209. package/dist/process/process-control.d.ts +60 -0
  210. package/dist/prompt/tag-names.d.ts +22 -0
  211. package/dist/provider/acp/connection.d.ts +6 -0
  212. package/dist/provider/acp/meta.d.ts +11 -0
  213. package/dist/provider/bridge.d.ts +12 -2
  214. package/dist/provider/classify-task-error.d.ts +2 -0
  215. package/dist/provider/claude-agent-env.d.ts +1 -0
  216. package/dist/provider/cli/adapter.types.d.ts +23 -2
  217. package/dist/provider/cli/adapters/agent-call.util.d.ts +1 -1
  218. package/dist/provider/cli/adapters/cli-knob.util.d.ts +7 -0
  219. package/dist/provider/cli/adapters/codex-item.d.ts +1 -0
  220. package/dist/provider/cli/adapters/event-timestamp.util.d.ts +1 -0
  221. package/dist/provider/cli/adapters/grok.d.ts +2 -0
  222. package/dist/provider/cli/adapters/index.d.ts +5 -0
  223. package/dist/provider/cli/index.d.ts +3 -2
  224. package/dist/provider/cli/meta.d.ts +5 -0
  225. package/dist/provider/cli/protocol-envelope.d.ts +3 -0
  226. package/dist/provider/errors.d.ts +5 -1
  227. package/dist/provider/idle-watchdog.d.ts +19 -0
  228. package/dist/provider/models.d.ts +17 -12
  229. package/dist/provider/order.d.ts +1 -1
  230. package/dist/provider/parse-usage.d.ts +6 -0
  231. package/dist/provider/provider-selection.d.ts +8 -0
  232. package/dist/provider/redact-technical-message.d.ts +1 -0
  233. package/dist/provider/task-error.types.d.ts +17 -0
  234. package/dist/provider-account/accounts.d.ts +15 -0
  235. package/dist/provider-account/index.d.ts +5 -0
  236. package/dist/provider-account/registry.d.ts +30 -0
  237. package/dist/provider-account/types.d.ts +40 -0
  238. package/dist/publish/constants.d.ts +6 -0
  239. package/dist/publish/errors.d.ts +7 -0
  240. package/dist/publish/index.d.ts +55 -0
  241. package/dist/publish/index.js +2 -0
  242. package/dist/publish/manifest.d.ts +47 -0
  243. package/dist/publish/marketplace-api.constants.d.ts +1 -0
  244. package/dist/publish/pack.d.ts +6 -0
  245. package/dist/publish/scan.d.ts +10 -0
  246. package/dist/publish/secrets.d.ts +6 -0
  247. package/dist/publish/upload.d.ts +19 -0
  248. package/dist/remote/execution-profile.d.ts +9 -0
  249. package/dist/remote/index.d.ts +1 -0
  250. package/dist/remote/types.d.ts +28 -0
  251. package/dist/repository/agent-send-history.repository.d.ts +23 -0
  252. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  253. package/dist/repository/base-sqlite-repository.d.ts +1 -0
  254. package/dist/repository/common-code.repository.d.ts +45 -0
  255. package/dist/repository/db.d.ts +12 -1
  256. package/dist/repository/index.d.ts +53 -6
  257. package/dist/repository/index.js +648 -211
  258. package/dist/repository/logs-db.d.ts +12 -0
  259. package/dist/repository/notification.repository.d.ts +58 -0
  260. package/dist/repository/project.repository.d.ts +90 -0
  261. package/dist/repository/public-task-answer.d.ts +24 -0
  262. package/dist/repository/request-log-mover.d.ts +70 -0
  263. package/dist/repository/request-log.repository.d.ts +7 -3
  264. package/dist/repository/sidebar-tab.repository.d.ts +86 -0
  265. package/dist/repository/storage-metadata.repository.d.ts +64 -0
  266. package/dist/repository/task-log-migration.d.ts +74 -0
  267. package/dist/repository/task-log.repository.d.ts +44 -0
  268. package/dist/repository/task-status.d.ts +21 -0
  269. package/dist/repository/task.repository.d.ts +307 -8
  270. package/dist/repository/thread-history.repository.d.ts +193 -0
  271. package/dist/repository/thread-origin-verdict.d.ts +27 -0
  272. package/dist/repository/thread-title.types.d.ts +29 -0
  273. package/dist/repository/thread.repository.d.ts +134 -5
  274. package/dist/repository/usage-backfill.d.ts +62 -0
  275. package/dist/repository/usage-from-logs.d.ts +21 -0
  276. package/dist/repository/workspace.repository.d.ts +3 -0
  277. package/dist/schema/agent-send-history.d.ts +85 -0
  278. package/dist/schema/agent-suggestions.d.ts +199 -0
  279. package/dist/schema/common-codes.d.ts +216 -0
  280. package/dist/schema/index.d.ts +16 -0
  281. package/dist/schema/notifications.d.ts +303 -0
  282. package/dist/schema/projects.d.ts +610 -0
  283. package/dist/schema/request-log-daily.d.ts +151 -0
  284. package/dist/schema/sidebar-tabs.d.ts +466 -0
  285. package/dist/schema/storage-metadata.d.ts +181 -0
  286. package/dist/schema/task-log-events.d.ts +119 -0
  287. package/dist/schema/task-provider-inputs.d.ts +100 -0
  288. package/dist/schema/tasks.d.ts +1058 -1
  289. package/dist/schema/thread-creator-unverified.d.ts +45 -0
  290. package/dist/schema/thread-history.d.ts +734 -0
  291. package/dist/schema/threads.d.ts +59 -0
  292. package/dist/schema/ui-action-receipts.d.ts +358 -0
  293. package/dist/schema/ui-definition-archive.d.ts +63 -0
  294. package/dist/schema/ui-instance-repins.d.ts +222 -0
  295. package/dist/schema/ui-instances.d.ts +324 -0
  296. package/dist/schema/workspaces.d.ts +17 -0
  297. package/dist/skills/index.d.ts +15 -0
  298. package/dist/skills/index.js +2 -0
  299. package/dist/skills/types.d.ts +18 -0
  300. package/dist/task-log/anchor-child-tasks.d.ts +7 -0
  301. package/dist/task-log/delegation-trailer.d.ts +34 -0
  302. package/dist/template/engine.d.ts +2 -2
  303. package/dist/template/helpers/exec.browser.d.ts +4 -3
  304. package/dist/template/helpers/exec.d.ts +4 -3
  305. package/dist/template/helpers/format-conversation.d.ts +1 -0
  306. package/dist/template/types.d.ts +20 -0
  307. package/dist/testing/index.js +1 -1
  308. package/dist/types/index.d.ts +1611 -3
  309. package/dist/types/task-log.types.d.ts +6 -1
  310. package/dist/ui-card/index.d.ts +2 -0
  311. package/dist/ui-card/legacy-card-parser.d.ts +11 -0
  312. package/dist/ui-instance/definition.d.ts +6 -0
  313. package/dist/ui-instance/errors.d.ts +18 -0
  314. package/dist/ui-instance/index.d.ts +11 -0
  315. package/dist/ui-instance/json.d.ts +19 -0
  316. package/dist/ui-instance/lineage.d.ts +24 -0
  317. package/dist/ui-instance/runtime.d.ts +19 -0
  318. package/dist/ui-instance/store.d.ts +213 -0
  319. package/dist/ui-instance/types.d.ts +343 -0
  320. package/dist/ui-plugin/app-icon.d.ts +50 -0
  321. package/dist/ui-plugin/app-manifest.d.ts +64 -0
  322. package/dist/ui-plugin/csp.d.ts +28 -0
  323. package/dist/ui-plugin/index.d.ts +8 -0
  324. package/dist/ui-plugin/limits.d.ts +27 -0
  325. package/dist/ui-plugin/manifest.d.ts +3 -0
  326. package/dist/ui-plugin/types.d.ts +208 -0
  327. package/dist/ui-plugin/validator.d.ts +18 -0
  328. package/dist/utils/crewx-executable.d.ts +76 -0
  329. package/dist/utils/crewx-home.d.ts +1 -0
  330. package/dist/utils/env-defaults.d.ts +3 -0
  331. package/dist/utils/id.d.ts +1 -1
  332. package/dist/utils/local-identity.d.ts +2 -0
  333. package/dist/utils/runner-env.d.ts +3 -0
  334. package/dist/utils/timestamp.d.ts +1 -0
  335. package/dist/utils/workspace.d.ts +1 -0
  336. package/dist/wi/create.d.ts +48 -0
  337. package/dist/wi/select.d.ts +20 -0
  338. package/package.json +63 -3
  339. package/templates/agents/default.yaml +303 -128
  340. package/templates/documents/crewx-manual.md +138 -138
  341. package/templates/documents/crewx-quick-guide.md +8 -7
  342. package/templates/workflows/wi-default-flow.yaml +65 -0
  343. package/templates/workflows/wi-plan-flow.yaml +140 -0
@@ -0,0 +1,22 @@
1
+ import type { CommandRunner } from './types';
2
+ export interface WriteLnkOptions {
3
+ run: CommandRunner;
4
+ env: NodeJS.ProcessEnv;
5
+ shortcutPath: string;
6
+ targetPath: string;
7
+ workingDirectory?: string;
8
+ iconPath?: string;
9
+ }
10
+ export declare function writeLnk(opts: WriteLnkOptions): Promise<void>;
11
+ export interface LnkInfo {
12
+ targetPath: string;
13
+ workingDirectory: string;
14
+ iconLocation: string;
15
+ }
16
+ export interface ReadLnkOptions {
17
+ run: CommandRunner;
18
+ env: NodeJS.ProcessEnv;
19
+ shortcutPath: string;
20
+ }
21
+ export declare function normalizeIconLocation(raw: string): string;
22
+ export declare function readLnkTarget(opts: ReadLnkOptions): Promise<LnkInfo | null>;
@@ -0,0 +1,21 @@
1
+ import type { DesktopSource, ShortcutFsLike } from './types';
2
+ export declare const MANIFEST_SCHEMA_VERSION = 1;
3
+ export interface ShortcutManifest {
4
+ schema: number;
5
+ shortcutPath?: string;
6
+ version?: string;
7
+ iconHash?: string;
8
+ owned: boolean;
9
+ declined: boolean;
10
+ desktopSource?: DesktopSource;
11
+ updatedAt?: string;
12
+ }
13
+ export interface LauncherManifest {
14
+ schema: number;
15
+ binPath?: string;
16
+ updatedAt?: string;
17
+ }
18
+ export declare function readShortcutManifest(fs: ShortcutFsLike, manifestPath: string): ShortcutManifest | null;
19
+ export declare function writeShortcutManifest(fs: ShortcutFsLike, manifestPath: string, data: Omit<ShortcutManifest, 'schema' | 'updatedAt'>): void;
20
+ export declare function readLauncherManifest(fs: ShortcutFsLike, manifestPath: string): LauncherManifest | null;
21
+ export declare function writeLauncherManifest(fs: ShortcutFsLike, manifestPath: string, data: LauncherManifest): void;
@@ -0,0 +1,67 @@
1
+ export type ShortcutState = 'unsupported' | 'not-installed' | 'installed' | 'stale' | 'foreign' | 'superseded' | 'declined';
2
+ export type DesktopSource = 'known-folder' | 'fallback';
3
+ export interface GlobalCrewxInfo {
4
+ installed: boolean;
5
+ version?: string;
6
+ binPath?: string;
7
+ prefix?: string;
8
+ }
9
+ export interface ShortcutStatus {
10
+ supported: boolean;
11
+ state: ShortcutState;
12
+ shortcutPath?: string;
13
+ desktopDir?: string;
14
+ desktopSource?: DesktopSource;
15
+ wrapperPath?: string;
16
+ wrapperSchema?: number;
17
+ globalCrewx: GlobalCrewxInfo | null;
18
+ runningVersion: string;
19
+ errors: string[];
20
+ }
21
+ export interface ShortcutInstallResult extends ShortcutStatus {
22
+ changed: boolean;
23
+ installedGlobal: boolean;
24
+ }
25
+ export type ShortcutProgressPhase = 'detect' | 'global-install' | 'wrapper' | 'lnk';
26
+ export interface ShortcutProgressEvent {
27
+ phase: ShortcutProgressPhase;
28
+ message: string;
29
+ }
30
+ export interface CommandResult {
31
+ code: number;
32
+ stdout: string;
33
+ stderr: string;
34
+ }
35
+ export interface CommandRunOptions {
36
+ env?: NodeJS.ProcessEnv;
37
+ cwd?: string;
38
+ timeoutMs?: number;
39
+ }
40
+ export type CommandRunner = (command: string, args: string[], opts?: CommandRunOptions) => Promise<CommandResult>;
41
+ export interface ShortcutFsLike {
42
+ existsSync(path: string): boolean;
43
+ readFileSync(path: string): string;
44
+ readBinaryFileSync?: (path: string) => Uint8Array;
45
+ writeFileSync(path: string, data: string): void;
46
+ mkdirSync(path: string): void;
47
+ unlinkSync(path: string): void;
48
+ }
49
+ export interface ShortcutEnvOptions {
50
+ platform?: NodeJS.Platform;
51
+ env?: NodeJS.ProcessEnv;
52
+ homedir?: () => string;
53
+ run?: CommandRunner;
54
+ fs?: ShortcutFsLike;
55
+ runningVersion?: string;
56
+ cwd?: string;
57
+ }
58
+ export interface InstallShortcutOptions extends ShortcutEnvOptions {
59
+ force?: boolean;
60
+ onProgress?: (event: ShortcutProgressEvent) => void;
61
+ installRoot?: string;
62
+ }
63
+ export type ShortcutErrorCode = 'NOT_WINDOWS' | 'NO_DESKTOP_DIR' | 'NPM_UNAVAILABLE' | 'NPM_PERMISSION_DENIED' | 'OFFLINE_NO_SOURCE' | 'GLOBAL_INSTALL_FAILED' | 'POWERSHELL_UNAVAILABLE' | 'WRITE_DENIED' | 'FOREIGN_SHORTCUT' | 'NSIS_PRESENT' | 'ICON_UNAVAILABLE';
64
+ export declare class ShortcutError extends Error {
65
+ readonly code: ShortcutErrorCode;
66
+ constructor(code: ShortcutErrorCode, message: string);
67
+ }
@@ -0,0 +1 @@
1
+ export declare const SDK_VERSION: string;
@@ -0,0 +1,21 @@
1
+ import type { CommandRunner, DesktopSource } from './types';
2
+ export declare function crewxHomeDir(homedir: string): string;
3
+ export declare function shortcutManifestPath(homedir: string): string;
4
+ export declare function launcherManifestPath(homedir: string): string;
5
+ export declare function wrapperPath(homedir: string): string;
6
+ export declare function shortcutLnkPath(desktopDir: string): string;
7
+ export declare function samePath(a: string, b: string): boolean;
8
+ export interface ResolveDesktopDirOptions {
9
+ env: NodeJS.ProcessEnv;
10
+ homedir: () => string;
11
+ run: CommandRunner;
12
+ }
13
+ export interface ResolvedDesktopDir {
14
+ dir: string;
15
+ source: DesktopSource;
16
+ }
17
+ export declare function resolveDesktopDir(opts: ResolveDesktopDirOptions): Promise<ResolvedDesktopDir | null>;
18
+ export declare function filterWorkspaceLocalBin(pathValue: string, cwd: string): string;
19
+ export declare function looksLikeNsisInstall(targetPath: string): boolean;
20
+ export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
21
+ export declare function isOlderVersion(a: string, b: string): boolean;
@@ -0,0 +1,18 @@
1
+ import type { ShortcutFsLike } from './types';
2
+ export declare const WRAPPER_SCHEMA_VERSION = 1;
3
+ export interface BuildWrapperScriptOptions {
4
+ bakedBinPath?: string;
5
+ }
6
+ export declare function buildWrapperScript(opts: BuildWrapperScriptOptions): string;
7
+ export interface EnsureWrapperOptions {
8
+ fs: ShortcutFsLike;
9
+ wrapperPath: string;
10
+ launcherManifestPath: string;
11
+ bakedBinPath?: string;
12
+ }
13
+ export interface EnsureWrapperResult {
14
+ wrapperPath: string;
15
+ wrote: boolean;
16
+ schema: number;
17
+ }
18
+ export declare function ensureWrapper(opts: EnsureWrapperOptions): EnsureWrapperResult;
@@ -0,0 +1,2 @@
1
+ import {parse}from'dotenv';import*as Y from'fs';import {readFileSync,existsSync,mkdirSync,writeFileSync,chmodSync,renameSync,unlinkSync}from'fs';import*as C from'path';import {join,dirname}from'path';import*as z from'os';import {randomUUID}from'crypto';var s=class extends Error{code;kind;status;constructor(e,n,r,o){super(o??`Account authentication request failed (${e})`),this.name="AccountAuthError",this.code=e,this.kind=n,this.status=r;}};var l=class extends Error{code="LOGIN_REQUIRED";constructor(){super("Login required \u2014 please log in again"),this.name="LoginRequiredError";}},f=class extends Error{code;constructor(e,n){super(n),this.name="SessionManagerError",this.code=e;}},p=class extends Error{code;constructor(e,n="auth.json is invalid \u2014 please log in again"){super(n),this.name="AuthJsonValidationError",this.code=e;}},i=class extends s{constructor(e){let n=e.startsWith("ACCOUNT_BASE_URL")?"CREWX_ACCOUNT_BASE_URL":e.startsWith("ACCOUNT_ISSUER")?"CREWX_ACCOUNT_ISSUER":e==="ACCOUNT_TARGET_INVALID"?"CREWX_TARGET":e==="ACCOUNT_TARGET_MIXED"?"CREWX_ACCOUNT_BASE_URL/CREWX_MARKETPLACE_URL":e==="MARKETPLACE_DISABLED"?"CREWX_MARKETPLACE_DISABLED":"CREWX_MARKETPLACE_URL",r=e==="ACCOUNT_TARGET_MIXED"?`${n} must not mix loopback and public hosts \u2014 choose one account target`:e==="MARKETPLACE_DISABLED"?`${n} disables Marketplace access`:`${n} is missing or invalid \u2014 configure it and try again`;super(e,"configuration",void 0,r),this.name="AccountConfigurationError";}};var O="CREWX_ACCOUNT_BASE_URL",I="CREWX_ACCOUNT_ISSUER",x="CREWX_MARKETPLACE_URL",L="CREWX_TARGET",X="CREWX_MARKETPLACE_DISABLED",R=Object.freeze({accountBaseUrl:"https://app.sowonai.com",marketplaceUrl:"https://market.sowonai.com"}),k=Object.freeze({accountBaseUrl:"http://127.0.0.1:3030",marketplaceUrl:"http://127.0.0.1:4000"}),D=Object.freeze(["https://app.sowonai.com/auth/v1","https://auth.sowonai.com/auth/v1"]);function P(t,e,n=false){let r=t?.trim();if(!r)throw new i(e);try{let o=new URL(r);if(o.protocol!=="http:"&&o.protocol!=="https:"||o.username.length>0||o.password.length>0||o.hostname.length===0||o.search.length>0||o.hash.length>0||n&&o.pathname!=="/")throw new Error("invalid URL")}catch{throw new i(e)}return r.replace(/\/+$/,"")}function q(t){let e=t?.trim();if(!e)throw new i("ACCOUNT_ISSUER_INVALID");try{let n=new URL(e);if(n.protocol!=="http:"&&n.protocol!=="https:"||n.username.length>0||n.password.length>0||n.hostname.length===0||n.search.length>0||n.hash.length>0)throw new Error("invalid issuer")}catch{throw new i("ACCOUNT_ISSUER_INVALID")}return e}function b(t){let e=t[L];if(e===void 0)return "production";let n=e.trim();if(n==="local"||n==="production")return n;throw new i("ACCOUNT_TARGET_INVALID")}function F(t){let e=t[X]?.trim().toLowerCase();return e==="1"||e==="true"}function V(t){return t==="local"?k:R}function J(t=process.env){let e=b(t),n=t[O];return n!==void 0?P(n,"ACCOUNT_BASE_URL_INVALID",true):V(e).accountBaseUrl}function de(t=process.env){let e=b(t);if(F(t))throw new i("MARKETPLACE_DISABLED");let n=t[x];return n!==void 0?P(n,"MARKETPLACE_URL_INVALID"):V(e).marketplaceUrl}function U(t=process.env){let e=t[I];return e===void 0?D:[q(e)]}function Ae(t=process.env){return U(t)[0]}function W(t,e,n,r=false){if(t===void 0)return e;try{return P(t,n,r)}catch{return t.trim()}}function _e(t){let e=t[I];if(e===void 0)return D;try{return [q(e)]}catch{return [e.trim()]}}function j(t){if(t===null)return false;try{let e=new URL(t).hostname.toLowerCase();return e==="127.0.0.1"||e==="localhost"||e==="[::1]"||e==="::1"}catch{return false}}function ge(t,e){return e!==null&&t===R.accountBaseUrl&&e===R.marketplaceUrl?"production":e!==null&&t===k.accountBaseUrl&&e===k.marketplaceUrl?"local":"custom"}function $(t=process.env){let e,n=true;try{e=b(t);}catch{e="production",n=false;}let r=V(e),o=t[L]!==void 0&&n,c=t[O],T=t[x],u=F(t),d=W(c,r.accountBaseUrl,"ACCOUNT_BASE_URL_INVALID",true),y=u?null:W(T,r.marketplaceUrl,"MARKETPLACE_URL_INVALID");return {accountBaseUrl:d,marketplaceUrl:y,issuers:_e(t),profile:ge(d,y),sources:{accountBaseUrl:c===void 0?o?"profile":"default":"env",marketplaceUrl:u?"disabled":T===void 0?o?"profile":"default":"env",issuer:t[I]===void 0?"default":"env"},mixed:y!==null&&j(d)!==j(y),marketplaceDisabled:u}}function Ee(t=process.env){if($(t).mixed)throw new i("ACCOUNT_TARGET_MIXED")}function M(t,e){return `${t.replace(/\/+$/,"")}/${e.replace(/^\/+/,"")}`}function v(){if(process.env.CREWX_HOME){let t=C.resolve(process.env.CREWX_HOME);try{return Y.realpathSync(t)}catch(e){if(e instanceof Error&&"code"in e&&e.code==="ENOENT")return t;throw e}}return process.platform!=="win32"&&process.env.XDG_CONFIG_HOME?C.join(process.env.XDG_CONFIG_HOME,"crewx"):C.join(z.homedir(),".crewx")}var te="CREWX_TASK_TICKET_SECRET";function ne(t={}){let e=t.workspaceDir??process.env.CREWX_WORKSPACE??process.cwd(),n=t.homeDir??v();return {workspace:join(e,".env"),home:join(n,".env")}}function me(t){try{return new Set(Object.keys(parse(readFileSync(t))))}catch(e){if(e?.code==="ENOENT")return new Set;throw e}}function Te(t){try{return parse(readFileSync(t))}catch(e){if(e?.code==="ENOENT")return {};throw e}}function Ce(t={}){let e=ne(t);for(let n of [e.workspace,e.home]){let r=Te(n);for(let[o,c]of Object.entries(r))o===te||process.env[o]!==void 0||(process.env[o]=c);}}var ie="auth.json",H=2,se=["version","sub","email","access_token","refresh_token","expires_at","updated_at"];function h(t="auth.json is invalid \u2014 please log in again"){throw new p("AUTH_JSON_INVALID",t)}function ve(){throw new p("AUTH_JSON_LEGACY","auth.json uses an unsupported legacy format \u2014 please log in again")}function Ne(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Oe(t){try{return E(t),!0}catch{return false}}function E(t){if(!Ne(t))return h();if(t.version===1)return ve();if(t.version!==H)return h();let e=Object.keys(t);if(e.length!==se.length||e.some(r=>!se.includes(r))||typeof t.sub!="string"||t.sub.length===0||typeof t.email!="string"||t.email.length===0||typeof t.access_token!="string"||t.access_token.length===0||typeof t.refresh_token!="string"||t.refresh_token.length===0)return h();let n=t.expires_at;return typeof n!="number"||!Number.isSafeInteger(n)||n<0||typeof t.updated_at!="string"||t.updated_at.length===0||Number.isNaN(Date.parse(t.updated_at))?h():{version:H,sub:t.sub,email:t.email,access_token:t.access_token,refresh_token:t.refresh_token,expires_at:n,updated_at:t.updated_at}}function ce(t){let e;try{e=JSON.parse(t);}catch{return h()}return E(e)}function ae(t){return t??join(v(),ie)}var A=class{configuredPath;constructor(e={}){this.configuredPath=typeof e=="string"?e:e.filePath;}path(){return ae(this.configuredPath)}read(){let e=this.path();if(!existsSync(e))return null;try{return ce(readFileSync(e,"utf8"))}catch(n){throw n instanceof p?n:new p("AUTH_JSON_INVALID")}}write(e){let n=E(e),r=this.path(),o=dirname(r);mkdirSync(o,{recursive:true,mode:448});let c=`${r}.tmp.${process.pid}.${randomUUID()}`;try{writeFileSync(c,JSON.stringify(n,null,2),{encoding:"utf8",mode:384}),chmodSync(c,384),renameSync(c,r),chmodSync(r,384);}catch{try{existsSync(c)&&unlinkSync(c);}catch{}throw new Error("Could not persist auth.json securely")}}clear(){let e=this.path();try{existsSync(e)&&unlinkSync(e);}catch{throw new Error("Could not clear auth.json")}}};function xe(t){let e=new A({filePath:t}).read();if(!e)throw new l;return e}function Le(t,e){new A({filePath:e}).write(t);}function De(t){new A({filePath:t}).clear();}var pe="/auth/v1/oauth/device/code",he="/auth/v1/oauth/token",le="/auth/v1/oauth/revoke",N="crewx-cli",m="urn:ietf:params:oauth:grant-type:device_code";function a(t){return typeof t=="string"&&t.trim().length>0}function w(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:null}function Pe(t){let e=w(t),n=e?.error??e?.code;if(typeof n=="string")return n.toLowerCase();let r=w(n),o=r?.code??r?.error;return typeof o=="string"?o.toLowerCase():void 0}function be(t){let e=w(t);if(!e||!a(e.device_code)||!a(e.user_code)||!a(e.verification_uri))throw new s("AUTH_RESPONSE_INVALID","protocol");let n=e.expires_in,r=e.interval;if(typeof n!="number"||!Number.isSafeInteger(n)||n<=0)throw new s("AUTH_RESPONSE_INVALID","protocol");if(e.verification_uri_complete!==void 0&&!a(e.verification_uri_complete))throw new s("AUTH_RESPONSE_INVALID","protocol");if(r!==void 0&&(typeof r!="number"||!Number.isSafeInteger(r)||r<0))throw new s("AUTH_RESPONSE_INVALID","protocol");let o={device_code:e.device_code,user_code:e.user_code,verification_uri:e.verification_uri,expires_in:n};return e.verification_uri_complete!==void 0&&(o.verification_uri_complete=e.verification_uri_complete),r!==void 0&&(o.interval=r),o}function Ve(t){let e=w(t),n=w(e?.account),r=e?.expires_in;if(!e||!a(e.access_token)||!a(e.refresh_token)||typeof r!="number"||!Number.isSafeInteger(r)||r<=0||!n||!a(n.sub)||!a(n.email))throw new s("AUTH_RESPONSE_INVALID","protocol");let o={access_token:e.access_token,refresh_token:e.refresh_token,expires_in:r,account:{sub:n.sub,email:n.email}};return typeof e.token_type=="string"&&e.token_type.length>0&&(o.token_type=e.token_type),typeof e.scope=="string"&&e.scope.length>0&&(o.scope=e.scope),o}var S=class{configuredBaseUrl;fetchImpl;timeoutMs;constructor(e={}){let n=typeof e=="string"?{baseUrl:e}:e;this.configuredBaseUrl=n.baseUrl===void 0?void 0:Je(n.baseUrl),this.fetchImpl=n.fetch??n.fetchImpl,this.timeoutMs=n.timeoutMs??1e4;}baseUrl(){return this.configuredBaseUrl!==void 0?this.configuredBaseUrl:J()}signal(e){if(!(e<=0||typeof AbortSignal>"u"||typeof AbortSignal.timeout!="function"))return AbortSignal.timeout(e)}async request(e,n,r,o={}){let c=M(this.baseUrl(),e),T=this.fetchImpl??globalThis.fetch;if(typeof T!="function")throw new s("AUTH_NETWORK_ERROR","network");let u;try{u=await T(c,{...n,signal:n.signal??this.signal(o.timeoutMs??this.timeoutMs)});}catch{throw new s("AUTH_NETWORK_ERROR","network")}if(o.parseBody===false){if(!u.ok)throw ue(u.status,null,r);return}let d=null;try{d=await u.json();}catch{d=null;}if(!u.ok)throw ue(u.status,d,r);return d}async requestDeviceCode(){let e=new URLSearchParams;e.set("client_id",N);let n=await this.request(pe,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:e.toString()});return be(n)}async requestToken(e){Me(e);let n=new URLSearchParams;n.set("grant_type",e.grant_type),n.set("client_id",N),e.grant_type===m?n.set("device_code",e.device_code):n.set("refresh_token",e.refresh_token);let r=await this.request(he,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n.toString()},e);return Ve(r)}async exchangeDeviceCode(e){return this.requestToken({grant_type:m,device_code:e})}async refreshToken(e){return this.requestToken({grant_type:"refresh_token",refresh_token:e})}async deviceCode(){return this.requestDeviceCode()}async getDeviceCode(){return this.requestDeviceCode()}async token(e){return this.requestToken(e)}async getToken(e){return this.requestToken(e)}async refresh(e){return this.refreshToken(e)}async refreshAccessToken(e){return this.refreshToken(e)}async revokeToken(e){if(!a(e))throw new s("AUTH_INPUT_INVALID","protocol");let n=new URLSearchParams;n.set("token",e),n.set("token_type_hint","refresh_token"),n.set("client_id",N),await this.request(le,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n.toString()},void 0,{parseBody:false,timeoutMs:3e3});}async revoke(e){return this.revokeToken(e)}};function Je(t){if(typeof t!="string"||!t.trim())throw new i("ACCOUNT_BASE_URL_INVALID");try{let e=new URL(t.trim());if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username.length>0||e.password.length>0||e.hostname.length===0||e.pathname!=="/"||e.search.length>0||e.hash.length>0)throw new Error("invalid URL")}catch{throw new i("ACCOUNT_BASE_URL_INVALID")}return t.trim().replace(/\/+$/,"")}function Me(t){if(!t||t.grant_type!==m&&t.grant_type!=="refresh_token"||t.grant_type===m&&!a(t.device_code)||t.grant_type==="refresh_token"&&!a(t.refresh_token))throw new s("AUTH_INPUT_INVALID","protocol")}function ue(t,e,n){let r=Pe(e);if(t>=500)return new s("AUTH_SERVER_ERROR","server",t);if(n?.grant_type==="refresh_token"&&(r==="invalid_grant"||t===401))return new s("INVALID_REFRESH_TOKEN","invalid_refresh",t);if(n?.grant_type===m){if(r==="authorization_pending")return new s("AUTHORIZATION_PENDING","pending",t);if(r==="slow_down")return new s("SLOW_DOWN","pending",t);if(r==="access_denied")return new s("ACCESS_DENIED","denied",t);if(r==="expired_token")return new s("EXPIRED_TOKEN","expired",t)}return new s("AUTH_HTTP_ERROR","http",t)}var G=class{client;store;refreshSkewSeconds;now;nowSecondsOverride;refreshPromise=null;constructor(e={},n){let r=He(e)?e:void 0,o=r?{}:e;this.client=r??o.client??o.authClient??new S,this.store=o.store??o.storage??n??new A,this.refreshSkewSeconds=o.refreshSkewSeconds??60,this.now=o.now??(()=>Date.now()),this.nowSecondsOverride=o.nowSeconds;}getSession(){return this.readSession()}isLoggedIn(){return this.readSession()!==null}async getAccessToken(){let e=this.requireSession();return e.expires_at>this.epochSeconds()+this.refreshSkewSeconds?e.access_token:(await this.refreshSession(e)).access_token}async getValidAccessToken(){return this.getAccessToken()}async getToken(){return this.getAccessToken()}async refresh(){return this.refreshSession(this.requireSession())}async loginWithDeviceCode(e){let n=await this.client.exchangeDeviceCode(e);return this.persistTokenResponse(n)}async login(e){return this.loginWithDeviceCode(e)}async setSession(e){return this.persistTokenResponse(e)}clear(){this.store.clear();}async withAccessToken(e){return e(await this.getAccessToken())}readSession(){try{let e=this.store.read();if(e===null)return null;let n=E(e);return fe(n.access_token,n.sub),n}catch(e){throw e instanceof p?new l:e}}requireSession(){let e=this.readSession();if(!e)throw new l;return e}epochSeconds(){return this.nowSecondsOverride?.()??Math.floor(this.now()/1e3)}refreshSession(e){if(this.refreshPromise)return this.refreshPromise;let n;return n=this.performRefresh(e).finally(()=>{this.refreshPromise===n&&(this.refreshPromise=null);}),this.refreshPromise=n,n}async performRefresh(e){try{let n=await this.client.refreshToken(e.refresh_token);return this.persistTokenResponse(n,e.sub)}catch(n){throw Be(n)?(this.store.clear(),new l):n}}persistTokenResponse(e,n){let r=e?.account;if(!e||typeof e.access_token!="string"||e.access_token.length===0||typeof e.refresh_token!="string"||e.refresh_token.length===0||!Number.isSafeInteger(e.expires_in)||e.expires_in<=0||!r||typeof r.sub!="string"||r.sub.length===0||typeof r.email!="string"||r.email.length===0)throw new f("AUTH_RESPONSE_INVALID","Account token response is malformed");if(n!==void 0&&r.sub!==n)throw new f("ACCOUNT_SUB_MISMATCH","Account subject changed during token refresh \u2014 please log in again");fe(e.access_token,r.sub);let o=E({version:2,sub:r.sub,email:r.email,access_token:e.access_token,refresh_token:e.refresh_token,expires_at:this.epochSeconds()+e.expires_in,updated_at:new Date(this.now()).toISOString()});return this.store.write(o),o}};function Be(t){return t instanceof s?t.kind==="invalid_refresh":typeof t=="object"&&t!==null&&(t.kind==="invalid_refresh"||t.code==="INVALID_REFRESH_TOKEN")}function He(t){return typeof t.exchangeDeviceCode=="function"&&typeof t.refreshToken=="function"}function fe(t,e){let n=U(),r=Ke(t);if(!n.includes(r.iss))throw new f("ACCOUNT_ISSUER_MISMATCH","Access token issuer does not match the configured account issuer \u2014 please log in again");if(r.sub!==e)throw new f("ACCOUNT_SUB_MISMATCH","Access token subject does not match the account session \u2014 please log in again")}function Ke(t){if(typeof t!="string")throw K();let e=t.split(".");if(e.length!==3||e.some(n=>!/^[A-Za-z0-9_-]+$/.test(n)))throw K();try{let n=JSON.parse(Buffer.from(e[1],"base64url").toString("utf8"));if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.iss!="string"||n.iss.length===0||typeof n.sub!="string"||n.sub.length===0)throw new Error("missing identity claims");return {iss:n.iss,sub:n.sub}}catch{throw K()}}function K(){return new f("ACCESS_TOKEN_INVALID","Access token identity could not be verified \u2014 please log in again")}
2
+ export{O as ACCOUNT_BASE_URL_ENV,I as ACCOUNT_ISSUER_ENV,L as ACCOUNT_TARGET_ENV,ie as AUTH_JSON_FILENAME,H as AUTH_JSON_VERSION,s as AccountAuthError,i as AccountConfigurationError,S as AuthClient,s as AuthClientError,s as AuthError,A as AuthJsonStore,p as AuthJsonValidationError,te as CREWX_TASK_TICKET_SECRET_ENV,D as DEFAULT_ACCEPTED_ISSUERS,m as DEVICE_CODE_GRANT_TYPE,pe as DEVICE_CODE_PATH,k as LOCAL_TARGET,l as LoginRequiredError,X as MARKETPLACE_DISABLED_ENV,x as MARKETPLACE_URL_ENV,N as OAUTH_CLIENT_ID,R as PRODUCTION_TARGET,le as REVOKE_PATH,G as SessionManager,f as SessionManagerError,he as TOKEN_PATH,M as appendEndpoint,Ee as assertAccountTargetNotMixed,ae as authJsonPath,De as clearAuthJson,Oe as isAuthJsonV2,Ce as loadCrewxEnvFiles,ce as parseAuthJson,xe as readAuthJson,me as readCrewxEnvFileKeys,U as resolveAcceptedAccountIssuers,J as resolveAccountBaseUrl,Ae as resolveAccountIssuer,$ as resolveAccountTarget,ne as resolveCrewxEnvFilePaths,de as resolveMarketplaceUrl,E as validateAuthJson,Le as writeAuthJson};
@@ -0,0 +1,12 @@
1
+ import {format,inspect}from'util';import {readSync}from'fs';import {randomUUID,createHash}from'crypto';import {Socket}from'net';import {Console}from'console';import {Writable}from'stream';var x=["text/plain","application/json"];var H=[5,15,30,60],k=Object.freeze({min:15e3,max:6e5,default:3e5}),En=1,be="schedule:",On="schedule",gn="exit 78",qe=["standby","disabled","draining","degraded"],Sn=["cron","cron_manual","app_enable"],Tn=/^[A-Z][A-Z0-9_]{0,63}$/u;function He(n){return typeof n=="string"&&Tn.test(n)}var Fe=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Rn=["unset","on","off"],In=["available","unavailable"],Ae=64,Pn=128;function Xe(n){return H.includes(n)}function me(n){return Number.isSafeInteger(n)&&n>=k.min&&n<=k.max}function Ge(n){return qe.includes(n)}function Ve(n){if(!wn(n)||Object.keys(n).length!==Fe.length||!Fe.every(o=>Object.hasOwn(n,o))||typeof n.status!="string"||!Rn.includes(n.status)||!Xe(n.everyMinutes)||!Q(n.lastStartedAt,Ae)||!Q(n.lastFinishedAt,Ae)||!Q(n.lastOutcome,Pn)||!Q(n.nextRunAt,Ae)||n.lastErrorCode!==null&&!He(n.lastErrorCode)||typeof n.periodic!="string"||!In.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Ge(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function Q(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function wn(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var j=Object.freeze({min:6e4,max:18e5,default:6e5}),Cn=Object.freeze({min:1e3,max:12e4,default:3e4}),Jn=1,$e="crewx/appJobs",ze=1,_e=["starting","running","stopping","finished"],he=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],Z=["cancelled","timed_out","shutdown"],Ee=["manual","schedule"],Dn=/^[a-z][a-z0-9_]{0,63}$/u,Nn=/^[A-Z][A-Z0-9_]{0,63}$/u,ee=["start","status","cancel"],Oe=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],ge="APP_JOB_RUN_REQUIRED";function Se(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function L(n){return typeof n=="string"&&Nn.test(n)}function B(n){return typeof n=="string"&&Dn.test(n)}function X(n){return ee.includes(n)}function xn(n){return n?.some(({name:e,version:t})=>e===$e&&t===ze)===true}var We=Symbol;We.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var kn=We.metadata,G=Symbol.for("crewx.app.tool-metadata"),l=class extends Error{code;detail;outcome;constructor(e,t=null,o){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Re(o?.outcome);}};function Re(n){return n==="rejected"?"rejected":"failed"}var Te=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:Fn(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new l("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new l("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new l("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!Hn(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,o){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,o){return {...h(o.state)?o.state:{},error:{code:e,detail:t}}}};function jn(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let o=t.metadata;if(!o)throw new TypeError("standard decorator metadata is unavailable");let r=Object.hasOwn(o,G)?o[G]:[];if(r.some(u=>u.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let s=n.content===void 0?void 0:Bn(n.name,n.content),i=n.schedule===void 0?void 0:Un(n);if(i!==void 0&&r.some(u=>u.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:vn(n);if(a!==void 0&&r.some(u=>u.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let p=n.jobAccess===void 0?void 0:Mn(n);o[G]=[...r,{methodName:String(t.name),options:Object.freeze({...n,...s===void 0?{}:{content:s},...i===void 0?{}:{schedule:i},...a===void 0?{}:{job:a},...p===void 0?{}:{jobAccess:p}})}];}}function V(n){let e=n[kn],t=e&&Object.hasOwn(e,G)?e[G]:[],o=new Map(t.map(s=>[s.methodName,s])),r=Object.getOwnPropertyNames(n.prototype).map(s=>o.get(s)).filter(s=>s!==void 0);if(r.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return r}function Ke(n){return V(n).some(({options:e})=>e.schedule!==void 0)}function Ye(n){let e=n.definition,t=V(n),o=new Set;return t.map(({options:r})=>{if(o.has(r.name))throw new TypeError(`duplicate @Tool name: ${r.name}`);return o.add(r.name),{actionId:r.name,...r.dataInputs===void 0?{}:{dataInputs:[...r.dataInputs]},confirmation:r.confirmation??"none",capability:r.capability??"app.read",mutation:r.mutation??true,inputSchema:r.inputSchema,...r.content===void 0?{}:{content:qn(r.content)},...r.schedule===void 0?{}:{schedule:{...r.schedule}},...r.job===void 0?{}:{job:{...r.job}},...r.jobAccess===void 0?{}:{jobAccess:[...r.jobAccess]},resultProjection:r.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:r.description}}})}function Ln(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Ye(n).map(({_meta:o,...r})=>({...r,backend:{type:"skill",command:[...e]},_meta:o}));return {...n.definition,actions:t}}function Bn(n,e){let t=s=>{throw new TypeError(`@Tool ${n}: content ${s}`)},o=(s,i,a)=>{if(!h(a))return t(`${s} must be an object`);for(let p of Object.keys(a))if(p==="mediaType"){if(!x.includes(a[p]))return t(`${s}.mediaType must be one of ${x.join(", ")}`)}else if(p===i){if(typeof a[p]!="boolean")return t(`${s}.${p} must be true or false`)}else return t(`${s} has the unknown key "${p}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${s}.mediaType is required`)};if(!h(e))return t("must be an object");let r={};for(let s of Object.keys(e))if(s==="in")r[s]=o("in","required",e[s]);else if(s==="out")r[s]=o("out","range",e[s]);else return t(`has the unknown key "${s}"; use "in" and/or "out"`);return Object.keys(r).length===0?t('needs "in" and/or "out"'):Object.freeze(r)}function Un(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: schedule ${o}`)},t=n.schedule;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="everyMinutes"&&o!=="timeoutMs")return e(`has the unknown key "${o}"`);return H.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!me(t.timeoutMs)?e(`timeoutMs must be an integer from ${k.min} to ${k.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${H.join(", ")}`)}function vn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: job ${o}`)},t=n.job;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="deadlineMs")return e(`has the unknown key "${o}"`);return t.deadlineMs!==void 0&&!Se(t.deadlineMs)?e(`deadlineMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Mn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${o}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every(X)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function Fn(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function qn(n){let e={};for(let[t,o]of Object.entries(n))e[t]={...o};return e}function Hn(n){return h(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function h(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Xn=/^[A-Za-z0-9._:-]{1,128}$/u,Gn=/[\u0000-\u001f\u007f\u2028\u2029]/u,Vn=512;function Ie(n=process.env){let e=Qe(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,o=n.CREWX_APP_ACTOR_KIND,r=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Xn.test(t)||o!=="user"&&o!=="agent"&&o!=="schedule"||typeof r!="string"||!/^\d{1,16}$/u.test(r))return;let s=Number(r);if(!Number.isSafeInteger(s))return;let i=n.CREWX_THREAD_ID===void 0?null:Qe(n.CREWX_THREAD_ID);if(i!==void 0&&!(o==="schedule"&&(i!==null||!e.startsWith(be))))return Object.freeze({instanceId:e,threadId:i,actor:o,requestId:t,nowMs:s})}function Qe(n){if(!(typeof n!="string"||n.length===0||Gn.test(n)))return new TextEncoder().encode(n).byteLength<=Vn?n:void 0}var $n="dist/tools.json",zn=1,Wn="dist/main.mjs";var Ze=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function Kn(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Ze.some(o=>o===t)||e.has(t))return false;e.add(t);}return true}var ne=2,te=2097152;var U=2*1024*1024,oe=2e4;function Pe(n){return createHash("sha256").update(n).digest("hex")}function re(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var Zn=te+1+U,et=64*1024,nt=10,ie={kind:"invalid"};function tt(n,e){try{let t=[],o=0;for(;;){let i=new Uint8Array(et),a=readSync(n,i,0,i.length,null);if(a===0)break;if(o+=a,o>e)return;t.push(i.subarray(0,a));}let r=new Uint8Array(o),s=0;for(let i of t)r.set(i,s),s+=i.byteLength;return r}catch{return}}function se(n){return ot(tt(n,Zn))}function ot(n){if(n===void 0)return ie;let e=n.indexOf(nt);if(n.byteLength<=te){let o=ut(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(o.ok&&!(e>=0&&D(o.value)&&o.value.schemaVersion===ne))return {kind:"v1",value:o.value}}if(e<=0||e>te)return ie;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return ie}return !D(t)||t.schemaVersion!==ne?ie:{kind:"v2",header:t,body:n.subarray(e+1)}}var rt="actionId,content,input,schemaVersion,state",it="bytes,lines,mediaType,sha256",st="mediaType,range",at=/^[a-f0-9]{64}$/u,dt=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function tn(n,e){let t=p=>({code:p,outcome:"rejected"});if($(n)!==rt||n.schemaVersion!==ne||typeof n.actionId!="string"||!D(n.input)||!D(n.state)||!D(n.content)||$(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let o=n.content,r,s=o.in;if(s===null){if(e.byteLength!==0)return t(e.byteLength>U?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!D(s)||$(s)!==it||!en(s.mediaType)||!nn(s.bytes,U)||!nn(s.lines,oe)||typeof s.sha256!="string"||!at.test(s.sha256)||e.byteLength!==s.bytes)return t(e.byteLength>U?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(Pe(e)!==s.sha256||re(e)!==s.lines)return t("CONTENT_DIGEST_MISMATCH");let p;try{p=dt.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}r={mediaType:s.mediaType,text:p};}let i,a=o.out;if(a!==null){if(!D(a)||$(a)!==st||!en(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let p=a.range;if(p!==null&&!pt(p))return t("CONTENT_SOURCE_UNSUPPORTED");i={mediaType:a.mediaType,...p===null?{}:{range:{startLine:p.startLine,lineCount:p.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...r===void 0?{}:{in:r},...i===void 0?{}:{out:i}}}}function on(n){return Object.hasOwn(n,"code")}function rn(n,e){let t=o=>({code:o,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function ae(n,e){let{content:t,...o}=n,r=e===void 0?o:{...o,content:{bytes:e.body.byteLength,lines:re(e.body),sha256:Pe(e.body),...e.range===void 0?{}:{range:e.range}}},s=new TextEncoder().encode(`${JSON.stringify(r)}
2
+ `);if(e===void 0)return s;let i=new Uint8Array(s.byteLength+e.body.byteLength);return i.set(s,0),i.set(e.body,s.byteLength),i}function sn(n){if(n.body.byteLength>U||re(n.body)>oe)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function ut(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function $(n){return Object.keys(n).sort().join(",")}function D(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function en(n){return typeof n=="string"&&x.includes(n)}function nn(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function pt(n){return D(n)&&$(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=oe}var dn="CREWX_APP_JOB_CHANNEL",T=1,z=4096,Je=1e4,De=5e3,Ne=512,we=Object.freeze({min:3,max:16}),lt=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],K=/^[A-Za-z0-9._:-]{1,128}$/u,ct=64,un=2147483647,W=class{#e="";#n=false;push(e){let t=[],o=e;for(;;){let r=o.indexOf(`
3
+ `);if(r===-1)return this.#n||(this.#e+=o,v(this.#e)>z&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let s=o.slice(0,r);if(o=o.slice(r+1),this.#n){this.#n=false;continue}let i=this.#e+s;this.#e="",t.push(v(i)>z?{kind:"oversized"}:{kind:"line",line:i});}}};function pe(n){let e=JSON.stringify(n);if(v(e)>z)throw new TypeError("App job bridge message is over the line bound");return e}function ft(n){let e=le(n);if(e===void 0||e.v!==T||!pn(e.requestId)||!ln(e.seq))return;let t={v:T,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return _(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!_(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let o=Ce(e.handle);return o===void 0?void 0:{...t,op:"status",handle:o}}case "cancel":{if(!_(e,["v","op","requestId","seq","handle"],[]))return;let o=Ce(e.handle);return o===void 0?void 0:{...t,op:"cancel",handle:o}}default:return}}function xe(n){let e=le(n);if(e===void 0||e.v!==T||!pn(e.requestId)||!ln(e.seq))return;let t={v:T,requestId:e.requestId,seq:e.seq};if(e.ok===false)return _(e,["v","requestId","seq","ok","code"],[])&&Oe.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=de(e.job),r=e.outcome;return o===void 0||r!=="started"&&r!=="attached"?void 0:{...t,ok:true,op:"start",outcome:r,job:o}}case "status":{if(!_(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let o=de(e.job);return o===void 0?void 0:{...t,ok:true,op:"status",job:o}}case "cancel":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=de(e.job);return o===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:o}}default:return}}function yt(n){let e=le(n);if(e===void 0||e.v!==T||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation))return;let t={v:T,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!_(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:o,total:r,resumable:s}=e;return !B(e.phase)||o!==void 0&&!ue(o)||r!==void 0&&!ue(r)||o!==void 0&&r!==void 0&&o>r||s!==void 0&&typeof s!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...o===void 0?{}:{completed:o},...r===void 0?{}:{total:r},...s===void 0?{}:{resumable:s}}}case "failed":return _(e,["v","kind","runId","generation","code","recoverable"],[])&&L(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function ke(n){let e=le(n);if(!(e===void 0||!_(e,["v","kind","runId","generation","reason"],[])||e.v!==T||e.kind!=="stop"||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation)||!Z.includes(e.reason)))return {v:T,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function je(n){let e=ce(n)?n:void 0;if(!(e===void 0||e.v!==T||!_t(e.fd))){if(e.role==="control"){let t=e.operations;return !_(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(X)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !_(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function Le(n){let e=n[dn];if(typeof e!="string"||v(e)>Ne)return;let t;try{t=JSON.parse(e);}catch{return}return je(t)}function At(n){let e=je(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(v(t)>Ne)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function bt(n){return n==="schedule"?"schedule":"manual"}function mt(n){return de(n)}function de(n){let e=ce(n)?n:void 0;if(e===void 0||!_(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=Ce(e.handle),o=e.stopReason,r=e.outcome,s=e.phase,i=e.errorCode,a=e.recoverable;if(!(t===void 0||!_e.includes(e.state)||!(o===null||Z.includes(o))||o!==null&&e.state!=="stopping"||!Ee.includes(e.trigger)||!(r===null||he.includes(r))||!(s===null||B(s))||!(e.completed===null||ue(e.completed))||!(e.total===null||ue(e.total))||typeof e.resumable!="boolean"||!an(e.lastHeartbeatAt)||!cn(e.startedAt)||!an(e.finishedAt)||!(i===null||L(i))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:o,trigger:e.trigger,outcome:r,phase:s,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:i,recoverable:a}}function Ce(n){if(!(!ce(n)||!_(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!K.test(n.runId)||!fe(n.generation)))return {runId:n.runId,generation:n.generation}}function le(n){if(v(n)>z)return;let e;try{e=JSON.parse(n);}catch{return}return ce(e)?e:void 0}function _(n,e,t){let o=new Set([...e,...t]);return Object.keys(n).every(r=>o.has(r))&&e.every(r=>Object.hasOwn(n,r))}function ce(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function pn(n){return typeof n=="string"&&K.test(n)}function ln(n){return Number.isSafeInteger(n)&&n>=1&&n<=un}function fe(n){return Number.isSafeInteger(n)&&n>=1&&n<=un}function _t(n){return Number.isSafeInteger(n)&&n>=we.min&&n<=we.max}function ue(n){return Number.isSafeInteger(n)&&n>=0}function cn(n){return typeof n=="string"&&n.length>0&&n.length<=ct}function an(n){return n===null||cn(n)}function v(n){return new TextEncoder().encode(n).byteLength}var Ot=2147483647,M=class{#e;#n;#p;#y=randomUUID();#A=new W;#r=new Map;#s=new Set;#t;#l=0;#o=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??yn,this.#p=e.replyTimeoutMs??Je;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let o=t.operations,r=ee.filter(i=>e.includes(i)&&o.includes(i));if(r.length===0)return;let s=i=>{if(!r.includes(i))throw new l("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(r),start:async()=>{s("start");let i=await this.#u("start",{});if(i.ok===false)return {kind:"refused",code:i.code};if(i.op!=="start")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:i.outcome,job:i.job}},status:async i=>{s("status");let a=await this.#u("status",i===void 0?{}:{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async i=>{s("cancel");let a=await this.#u("cancel",{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let o={v:T,runId:t.runId,generation:t.generation},r=()=>this.#d,s=i=>{this.#o||this.#c||this.#t===void 0||this.#t.write(pe({...o,...i}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return r()!==null},get stopReason(){return r()},progress:i=>{if(!B(i.phase))throw new TypeError("progress phase must be a lower snake case name");if(i.completed!==void 0&&!fn(i.completed))throw new TypeError("progress completed must be a count");if(i.total!==void 0&&!fn(i.total))throw new TypeError("progress total must be a count");if(i.completed!==void 0&&i.total!==void 0&&i.completed>i.total)throw new TypeError("progress completed cannot exceed total");if(i.resumable!==void 0&&typeof i.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||s({kind:"progress",phase:i.phase,...i.completed===void 0?{}:{completed:i.completed},...i.total===void 0?{}:{total:i.total},...i.resumable===void 0?{}:{resumable:i.resumable}});},heartbeat:()=>{this.#a||s({kind:"heartbeat"});},complete:()=>{s({kind:"completed"}),this.#a=true;},fail:(i,a)=>{if(!L(i))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");s({kind:"failed",code:i,recoverable:a}),this.#a=true;},onStop:i=>{let a=r();return a!==null?(i(a),()=>{}):(this.#s.add(i),()=>{this.#s.delete(i);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=De){if(this.#o)return;this.#c=true;let t=this.#t,o;try{if(t!==void 0){let r;try{r=t.drain();}catch{r=Promise.resolve();}await Promise.race([r.catch(()=>{}),new Promise(s=>{o=setTimeout(s,e);})]);}}finally{clearTimeout(o),this.close();}}#u(e,t){let o=this.#f(),r=this.#l+1;if(r>Ot)throw new l("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#l=r;let s=`${this.#y}.${r}`,i=pe({v:T,op:e,requestId:s,seq:r,...t});return new Promise((a,p)=>{let u=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#p);this.#r.set(r,{op:e,requestId:s,resolve:a,reject:p,timer:u}),o.write(i);})}#f(){if(this.#o)throw new l("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new l("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#b(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#b(e){for(let t of this.#A.push(e)){if(this.#o)return;if(this.#e.role==="run")t.kind==="line"&&this.#_(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#m(t.line);}}#m(e){let t=xe(e),o=t===void 0?void 0:this.#r.get(t.seq);if(t===void 0||o===void 0||o.requestId!==t.requestId||t.ok&&t.op!==o.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(o.timer),this.#r.delete(t.seq),o.resolve(t);}#_(e){let t=this.#e;if(t.role!=="run")return;let o=ke(e);if(!(o===void 0||o.runId!==t.runId||o.generation!==t.generation)&&this.#d===null){this.#d=o.reason;for(let r of [...this.#s])try{r(o.reason);}catch{}}}#i(e){if(this.#o)return;this.#o=true;let t=[...this.#r.values()];this.#r.clear();for(let r of t)clearTimeout(r.timer),r.reject(new l(e,null,{outcome:"failed"}));this.#s.clear();let o=this.#t;this.#t=void 0,o?.close();}};function yn(n){let e=new Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
4
+ `);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function fn(n){return Number.isSafeInteger(n)&&n>=0}var St=1;async function Tt(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),o){return (await mn(n,e,t,void 0,true,void 0,o)).response}async function mn(n,e,t,o,r=true,s,i,a){let p=s!==void 0,u=h(e)?e:void 0,b=u?.input,m=u?.state,d=new n({state:h(m)?m:{},workspaceRoot:t,...i===void 0?{}:{context:i}}),E=h(b)?b:{},c=h(m)?m:d.emptyState(),f={},R=u!==void 0&&Object.hasOwn(u,"schedule"),I;try{let A;if(p){if(u===void 0||R)throw new l("INPUT_INVALID");let O=tn(u,s);if(on(O))throw new l(O.code,null,{outcome:O.outcome});(({actionId:A,input:E,state:c}=O)),f=O.content;}else {let O=R&&u!==void 0?Ve(u.schedule):void 0;if(!u||Object.keys(u).length!==(R?5:4)||!["schemaVersion","actionId","input","state"].every(hn=>Object.hasOwn(u,hn))||u.schemaVersion!==St||typeof u.actionId!="string"||!h(b)||!h(m)||R&&O===void 0)throw new l("INPUT_INVALID");A=u.actionId,E=b,c=m,I=O;}let y=V(n).find(({options:O})=>O.name===A),J=y===void 0?void 0:a?.jobsFor(y.options.jobAccess),P=y===void 0?void 0:a?.runFor(y.options.job!==void 0);if(d=new n({state:c,workspaceRoot:t,...i===void 0?{}:{context:i},...I===void 0?{}:{schedule:I},...J===void 0?{}:{jobs:J},...P===void 0?{}:{jobRun:P}}),await d.validate(A,E,c),!y)throw new l("INPUT_INVALID");if(I!==void 0&&(y.options.content!==void 0||!Ke(n)))throw new l("INPUT_INVALID");let F=d[y.methodName];if(typeof F!="function")throw new l("EXECUTION_FAILED");let N=rn(y.options.content,f);if(N)throw new l(N.code,null,{outcome:N.outcome});if(y.options.job!==void 0&&P===void 0)throw new l(ge,null,{outcome:"rejected"});let Y=Object.freeze({...f.in===void 0?{}:{in:Object.freeze({text:f.in.text})},...f.out===void 0?{}:{out:Object.freeze(f.out.range===void 0?{}:{range:Object.freeze({...f.out.range})})}}),q=()=>F.call(d,E,Y),w=r?await wt(q):await q();if(w!==void 0&&!h(w))throw new l("EXECUTION_FAILED");let C;if(f.out!==void 0){if(C=d.producedContent,C===void 0)throw new l("EXECUTION_FAILED","content.out was requested but setContent was never called");let O=sn(C);if(O)throw new l(O.code,null,{outcome:O.outcome})}else if(d.didSetContent)throw new l("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let Me=d.didRequestSchedule;return {response:{...d.didSetState?{state:d.state}:{},...w===void 0?{}:{result:w},...Me===void 0?{}:{schedule:{enabled:Me.enabled}}},...C===void 0?{}:{answer:C}}}catch(A){let y,J=A,P=A instanceof l?A:void 0;if(P)y={code:P.code,detail:P.detail,outcome:P.outcome};else try{y=d.mapError(A);}catch(C){y={code:"EXECUTION_FAILED",detail:null},J=C;}let F=Jt(y?.code),N=F?y.code:"EXECUTION_FAILED",Y=typeof y?.detail=="string"?y.detail:null,q=F?Re(y.outcome):"failed",w;try{w=d.errorState(N,Y,{input:E,state:c});}catch(C){J=new AggregateError([J,C],"App error handling failed"),w=d.emptyState();}return o?.(N,J,{outcome:q,detail:Y,expected:P!==void 0&&J===P}),{response:{outcome:q,errorCode:N,state:h(w)?w:d.emptyState()}}}}async function Rt(n,e={}){let t=It(e.jobBridge);try{await Pt(n,e,t);}finally{await t?.drain();}}function It(n){if(n===null)return;if(n!==void 0)return new M(n);let e=Le(process.env);return e===void 0?void 0:new M({channel:e})}async function Pt(n,e,t){let o=e.output??process.stdout,r,s;if(e.preloadedInput!==void 0)r=e.preloadedInput.value,s=e.preloadedInput.body;else {let d=se(e.inputFd??0);d.kind==="v1"?r=d.value:d.kind==="v2"&&(r=d.header,s=d.body);}let i=s!==void 0,a=e.context??Ie(),p=false,u=(d,E,c)=>{p=true,e.onFailure?.(d,E,c);},b;try{b=await mn(n,r,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),u,e.consoleManaged!==!0,s,a,t);}catch(d){u("EXECUTION_FAILED",d),b={response:An(e.emptyState)};}Ct(b.response)&&!p&&u(b.response.errorCode,void 0,{outcome:b.response.outcome,detail:null,expected:false});let m;try{let d=(e.sanitize??bn)(b.response);m=i?ae(d,b.answer):`${JSON.stringify(d)}
5
+ `;}catch(d){u("EXECUTION_FAILED",d);let E=An(e.emptyState);try{let c=(e.sanitize??bn)(E);m=i?ae(c):`${JSON.stringify(c)}
6
+ `;}catch(c){u("EXECUTION_FAILED",c),m=i?ae(E):`${JSON.stringify(E)}
7
+ `;}}o.write(m);}async function wt(n){let e=["log","info","debug"],t=new Map;for(let o of e)t.set(o,console[o]),console[o]=(...r)=>process.stderr.write(`${format(...r)}
8
+ `);try{return await n()}finally{for(let o of e)console[o]=t.get(o);}}function An(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function Ct(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function Jt(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function bn(n){return n}var Be={depth:null,maxArrayLength:null,maxStringLength:null},ve=class extends Writable{#e="buffer";#n=[];_write(e,t,o){if(this.#e==="buffer"){this.#n.push(typeof e=="string"?e:Uint8Array.from(e)),o();return}if(this.#e==="discard"){o();return}process.stderr.write(e,o);}flushToStderr(){this.#e="stderr";for(let e of this.#n)process.stderr.write(e);this.#n=[];}discard(){this.#e="discard",this.#n=[];}};async function xt(n,e={}){let t=process.stdout,o=t.write.bind(t),r=new ve,s=new Console({stdout:r,stderr:r,inspectOptions:{...Be}});globalThis.console=s;let i=false,a="-",p="-",u,b=false,m,d;try{let f=jt(e.inputFd??0);a=Lt(f.value),p=ye(process.env.CREWX_APP_REQUEST_ID),u=new Date().toISOString();try{m=await n();}catch(A){b=!0,d=A;}let R=m?.default;if(!b&&R?.devtools?.log===!0?(Object.assign(inspect.defaultOptions,Be),E(u),r.flushToStderr()):r.discard(),b){c("EXECUTION_FAILED",d),Ue(o,e,c);return}try{if(typeof m?.runSkillApp!="function")throw new TypeError("App module does not export runSkillApp");let A={sanitize:e.sanitize,emptyState:e.emptyState??kt(R),preloadedInput:f.body===void 0?{value:f.value}:{value:f.value,body:f.body},onFailure:c,consoleManaged:!0,output:{write:o},jobBridge:e.jobBridge};await m.runSkillApp(R,A);}catch(A){c("EXECUTION_FAILED",A),Ue(o,e,c);}}catch(f){c("EXECUTION_FAILED",f),Ue(o,e,c);}finally{process.exitCode=0;}function E(f){i||(process.stderr.write(`[crewx-app] ${f??new Date().toISOString()} ${ye(a)} req=${p}
9
+ `),i=true);}function c(f,R,I){E();let A=I?.expected===true&&I.detail?` ${ye(I.detail)}`:"";process.stderr.write(`[crewx-app] ${I?.outcome??"failed"} ${ye(f)}${A}
10
+ `),R!==void 0&&I?.expected!==true&&process.stderr.write(`${inspect(R,Be)}
11
+ `);}}function kt(n){if(typeof n=="function")try{let t=new n({workspaceRoot:process.cwd()}).emptyState();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function jt(n){let e=se(n);return e.kind==="v1"?{value:e.value}:e.kind==="v2"?{value:e.header,body:e.body}:{value:void 0}}function Lt(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&typeof n.actionId=="string"?n.actionId:"-"}function ye(n){return typeof n!="string"||n.length===0?"-":n.replace(/[\u0000-\u001f\u007f\u2028\u2029]/gu,"_")}function Ue(n,e,t){let o={code:"EXECUTION_FAILED",detail:null},s={outcome:"failed",errorCode:"EXECUTION_FAILED",state:e.emptyState!==null&&typeof e.emptyState=="object"&&!Array.isArray(e.emptyState)?{...e.emptyState,error:o}:{error:o}},i=s;try{i=(e.sanitize??Bt)(s);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(i)}
12
+ `);}function Bt(n){return n}export{Ne as APP_JOB_BRIDGE_CHANNEL_MAX_BYTES,De as APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS,dn as APP_JOB_BRIDGE_ENV,lt as APP_JOB_BRIDGE_ERROR_CODES,we as APP_JOB_BRIDGE_FD,z as APP_JOB_BRIDGE_MAX_LINE_BYTES,Je as APP_JOB_BRIDGE_REPLY_TIMEOUT_MS,T as APP_JOB_BRIDGE_VERSION,$e as APP_JOB_CAPABILITY,ze as APP_JOB_CAPABILITY_VERSION,j as APP_JOB_DEADLINE_MS,Jn as APP_JOB_MAX_PER_APP,ee as APP_JOB_OPERATIONS,he as APP_JOB_OUTCOMES,Oe as APP_JOB_REFUSAL_CODES,ge as APP_JOB_RUN_REQUIRED,_e as APP_JOB_STATES,Cn as APP_JOB_STOP_GRACE_MS,Z as APP_JOB_STOP_REASONS,Ee as APP_JOB_TRIGGERS,On as APP_SCHEDULE_ACTOR_KIND,gn as APP_SCHEDULE_INERT_COMMAND,be as APP_SCHEDULE_INSTANCE_PREFIX,H as APP_SCHEDULE_INTERVALS_MINUTES,En as APP_SCHEDULE_MAX_PER_APP,qe as APP_SCHEDULE_PERIODIC_REASONS,k as APP_SCHEDULE_TIMEOUT_MS,$n as APP_TOOLS_FILE,zn as APP_TOOLS_SCHEMA_VERSION,Wn as APP_TOOL_ENTRY,l as AppError,M as AppJobBridge,W as AppJobLineReader,Te as CrewXApp,Sn as SCHEDULE_TRIGGERS,Ze as SKILL_BACKEND_ENV_NAMES,jn as Tool,bt as appJobTriggerForActor,At as buildAppJobChannelEnvironment,pe as encodeAppJobLine,Tt as executeAppRequest,Ln as generateManifest,Ye as generateToolDeclarations,V as getToolDeclarations,xn as hasAppJobCapability,L as isAppJobCode,Se as isAppJobDeadlineMs,X as isAppJobOperation,B as isAppJobPhase,He as isAppScheduleCode,Xe as isAppScheduleIntervalMinutes,Ge as isAppSchedulePeriodicReason,me as isAppScheduleTimeoutMs,Kn as isSkillBackendEnv,yn as openInheritedAppJobTransport,je as parseAppJobChannel,xe as parseAppJobControlReply,ft as parseAppJobControlRequest,ke as parseAppJobRunPush,yt as parseAppJobRunReport,mt as parseAppJobView,Ie as readAppContext,Le as readAppJobChannel,xt as runAppEntry,Rt as runSkillApp};