@hasna/skills 0.1.62 → 0.1.64

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 (541) hide show
  1. package/README.md +38 -12
  2. package/bin/index.js +15743 -21709
  3. package/bin/mcp.js +3866 -11522
  4. package/bin/migrate.js +281 -35
  5. package/bin/server.js +5805 -2682
  6. package/bin/worker.js +5280 -2388
  7. package/dist/cli/commands/publish.d.ts +2 -0
  8. package/dist/cli/commands/registry-reconcile.d.ts +2 -0
  9. package/dist/cli/components/App.d.ts +2 -1
  10. package/dist/cli/components/CategorySelect.d.ts +2 -1
  11. package/dist/cli/components/Header.d.ts +2 -1
  12. package/dist/cli/components/InstallProgress.d.ts +2 -1
  13. package/dist/cli/components/SearchView.d.ts +2 -1
  14. package/dist/cli/components/SkillSelect.d.ts +2 -1
  15. package/dist/index.d.ts +5 -2
  16. package/dist/index.js +5386 -13739
  17. package/dist/lib/agent-sync.d.ts +61 -6
  18. package/dist/lib/auth-store.d.ts +37 -0
  19. package/dist/lib/config.d.ts +51 -0
  20. package/dist/lib/home-adoption.d.ts +91 -0
  21. package/dist/lib/home-census.d.ts +26 -0
  22. package/dist/lib/home-migration.d.ts +60 -0
  23. package/dist/lib/native-storage.d.ts +1 -1
  24. package/dist/lib/portable-skills-files.d.ts +21 -1
  25. package/dist/lib/portable-skills-types.d.ts +46 -0
  26. package/dist/lib/portable-skills.d.ts +35 -6
  27. package/dist/lib/pull.d.ts +97 -0
  28. package/dist/lib/registry-reconcile.d.ts +114 -0
  29. package/dist/lib/registry.d.ts +7 -4
  30. package/dist/lib/remote-client.d.ts +124 -1
  31. package/dist/lib/remote-registry.d.ts +26 -0
  32. package/dist/lib/revision.d.ts +29 -0
  33. package/dist/lib/run-state.d.ts +5 -0
  34. package/dist/lib/skill-bundles.d.ts +54 -0
  35. package/dist/lib/skill-contract.d.ts +35 -0
  36. package/dist/lib/skill-hash.d.ts +77 -0
  37. package/dist/sdk/cancel.d.ts +30 -0
  38. package/dist/sdk/dispatcher.d.ts +40 -0
  39. package/dist/sdk/event-sink.d.ts +2 -0
  40. package/dist/sdk/events.d.ts +79 -0
  41. package/dist/sdk/execution/admission.d.ts +44 -0
  42. package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
  43. package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
  44. package/dist/sdk/execution/image-profile.d.ts +73 -0
  45. package/dist/sdk/execution/index.d.ts +15 -0
  46. package/dist/sdk/execution/receipts.d.ts +44 -0
  47. package/dist/sdk/execution/state-machine.d.ts +38 -0
  48. package/dist/sdk/execution/storage.d.ts +158 -0
  49. package/dist/sdk/execution/types.d.ts +130 -0
  50. package/dist/sdk/executor.d.ts +17 -0
  51. package/dist/sdk/governance-store.d.ts +156 -0
  52. package/dist/sdk/governance.d.ts +92 -0
  53. package/dist/sdk/index.d.ts +26 -0
  54. package/dist/sdk/index.js +49728 -0
  55. package/dist/sdk/offline.d.ts +16 -0
  56. package/dist/sdk/outputs.d.ts +71 -0
  57. package/dist/sdk/registry.d.ts +28 -0
  58. package/dist/sdk/runs.d.ts +229 -0
  59. package/dist/sdk/server.d.ts +35 -0
  60. package/dist/sdk/spend.d.ts +36 -0
  61. package/dist/sdk/storage.d.ts +25 -0
  62. package/dist/server/app.d.ts +42 -0
  63. package/dist/server/artifact-storage.d.ts +102 -0
  64. package/dist/server/auth.d.ts +5 -0
  65. package/dist/server/config.d.ts +50 -0
  66. package/dist/server/database-url.d.ts +42 -0
  67. package/dist/server/handlers.d.ts +3 -0
  68. package/dist/server/index.d.ts +2 -0
  69. package/dist/server/migrate.d.ts +13 -0
  70. package/dist/server/migrations-dir.d.ts +18 -0
  71. package/dist/server/redaction.d.ts +1 -0
  72. package/dist/server/registry.d.ts +5 -0
  73. package/dist/server/rows.d.ts +24 -0
  74. package/dist/server/skills-api.d.ts +170 -0
  75. package/dist/server/sqlite-store.d.ts +131 -0
  76. package/dist/server/store-fixtures.d.ts +25 -0
  77. package/dist/server/store.d.ts +170 -0
  78. package/dist/server/types.d.ts +337 -0
  79. package/dist/server/worker.d.ts +4 -0
  80. package/dist/storage.js +39 -2
  81. package/docs/skill-standard.md +211 -39
  82. package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
  83. package/migrations/postgres/0004_hosted_pins.sql +28 -0
  84. package/migrations/postgres/0005_revision_tombstone_registry.sql +37 -0
  85. package/migrations/postgres/0005_tag_projection.sql +36 -0
  86. package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
  87. package/migrations/sqlite/0004_hosted_pins.sql +21 -0
  88. package/migrations/sqlite/0005_revision_tombstone_registry.sql +18 -0
  89. package/migrations/sqlite/0005_tag_projection.sql +25 -0
  90. package/package.json +12 -8
  91. package/schemas/skill.schema.json +181 -0
  92. package/agent-skills/README.md +0 -41
  93. package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
  94. package/agent-skills/inbox/SKILL.md +0 -25
  95. package/agent-skills/inbox/scripts/inbox +0 -109
  96. package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
  97. package/agent-skills/inbox-monitor/SKILL.md +0 -41
  98. package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
  99. package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
  100. package/agent-skills/merge-pr/SKILL.md +0 -85
  101. package/agent-skills/merge-pr/references/merge-safety.md +0 -82
  102. package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
  103. package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
  104. package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
  105. package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
  106. package/agent-skills/skill-goal-execute/SKILL.md +0 -115
  107. package/agent-skills/skill-login/SKILL.md +0 -109
  108. package/agent-skills/skill-project-create/SKILL.md +0 -91
  109. package/agent-skills/skill-publish/SKILL.md +0 -254
  110. package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
  111. package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
  112. package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
  113. package/skills/_common/auth.ts +0 -45
  114. package/skills/_common/http-client.ts +0 -143
  115. package/skills/_common/index.ts +0 -26
  116. package/skills/_common/install.sh +0 -7
  117. package/skills/_common/installer.ts +0 -72
  118. package/skills/_common/skill-install.ts +0 -37
  119. package/skills/_common/vision.ts +0 -374
  120. package/skills/ad-creative-pack/SKILL.md +0 -55
  121. package/skills/ad-creative-pack/package.json +0 -10
  122. package/skills/analyze-data/CLAUDE.md +0 -16
  123. package/skills/analyze-data/SKILL.md +0 -112
  124. package/skills/analyze-data/package.json +0 -23
  125. package/skills/analyze-data/src/analysis.ts +0 -401
  126. package/skills/analyze-data/src/cli.ts +0 -66
  127. package/skills/analyze-data/src/formatters.ts +0 -235
  128. package/skills/analyze-data/src/index.ts +0 -74
  129. package/skills/analyze-data/src/logger.ts +0 -36
  130. package/skills/analyze-data/src/parsers.ts +0 -57
  131. package/skills/analyze-data/src/stats.ts +0 -151
  132. package/skills/analyze-data/src/types.ts +0 -85
  133. package/skills/analyze-data/tsconfig.json +0 -19
  134. package/skills/api-docs-portal/SKILL.md +0 -84
  135. package/skills/api-docs-portal/package.json +0 -35
  136. package/skills/api-docs-portal/src/index.ts +0 -919
  137. package/skills/api-docs-portal/tsconfig.json +0 -17
  138. package/skills/api-test-suite/CLAUDE.md +0 -19
  139. package/skills/api-test-suite/package.json +0 -27
  140. package/skills/api-test-suite/src/index.ts +0 -381
  141. package/skills/api-test-suite/tsconfig.json +0 -10
  142. package/skills/audio-extract/CLAUDE.md +0 -9
  143. package/skills/audio-extract/SKILL.md +0 -73
  144. package/skills/audio-extract/package.json +0 -23
  145. package/skills/audio-extract/src/index.ts +0 -323
  146. package/skills/audio-extract/tsconfig.json +0 -11
  147. package/skills/bio-sequence-tool/CLAUDE.md +0 -19
  148. package/skills/bio-sequence-tool/package.json +0 -27
  149. package/skills/bio-sequence-tool/src/index.ts +0 -85
  150. package/skills/bio-sequence-tool/tsconfig.json +0 -10
  151. package/skills/blog-article/CLAUDE.md +0 -12
  152. package/skills/blog-article/SKILL.md +0 -55
  153. package/skills/blog-article/package.json +0 -10
  154. package/skills/blog-article/tsconfig.json +0 -10
  155. package/skills/brand-assets/SKILL.md +0 -118
  156. package/skills/brand-assets/package.json +0 -35
  157. package/skills/brand-assets/src/cli.ts +0 -155
  158. package/skills/brand-assets/src/constants.ts +0 -8
  159. package/skills/brand-assets/src/extract.ts +0 -236
  160. package/skills/brand-assets/src/index.ts +0 -668
  161. package/skills/brand-assets/src/types.ts +0 -59
  162. package/skills/brand-assets/tsconfig.json +0 -17
  163. package/skills/brand-kit/SKILL.md +0 -54
  164. package/skills/brand-kit/package.json +0 -10
  165. package/skills/businessactivity/CLAUDE.md +0 -176
  166. package/skills/businessactivity/LICENSE +0 -192
  167. package/skills/businessactivity/README.md +0 -287
  168. package/skills/businessactivity/package.json +0 -25
  169. package/skills/businessactivity/scripts/publish.ts +0 -210
  170. package/skills/businessactivity/src/commands/activity.ts +0 -211
  171. package/skills/businessactivity/src/commands/function.ts +0 -227
  172. package/skills/businessactivity/src/commands/owner.ts +0 -193
  173. package/skills/businessactivity/src/commands/profile.ts +0 -121
  174. package/skills/businessactivity/src/commands/responsibility.ts +0 -264
  175. package/skills/businessactivity/src/commands/team.ts +0 -244
  176. package/skills/businessactivity/src/commands/workflow.ts +0 -359
  177. package/skills/businessactivity/src/index.ts +0 -3
  178. package/skills/businessactivity/src/lib/config.ts +0 -167
  179. package/skills/businessactivity/src/lib/output.ts +0 -76
  180. package/skills/businessactivity/src/lib/paths.ts +0 -79
  181. package/skills/businessactivity/src/lib/storage.ts +0 -95
  182. package/skills/businessactivity/src/types/index.ts +0 -86
  183. package/skills/businessactivity/tsconfig.json +0 -29
  184. package/skills/codefix/LICENSE +0 -192
  185. package/skills/codefix/README.md +0 -232
  186. package/skills/codefix/SKILL.md +0 -94
  187. package/skills/codefix/package.json +0 -21
  188. package/skills/codefix/src/fixers/batch.ts +0 -213
  189. package/skills/codefix/src/fixers/detector.ts +0 -160
  190. package/skills/codefix/src/fixers/index.ts +0 -7
  191. package/skills/codefix/src/fixers/runner.ts +0 -522
  192. package/skills/codefix/src/index-local.ts +0 -431
  193. package/skills/codefix/src/index.ts +0 -4
  194. package/skills/codefix/src/types.ts +0 -211
  195. package/skills/codefix/tsconfig.json +0 -15
  196. package/skills/commitpush/SKILL.md +0 -57
  197. package/skills/commitpush/package.json +0 -33
  198. package/skills/commitpush/src/index.ts +0 -34
  199. package/skills/commitpush/tsconfig.json +0 -17
  200. package/skills/commitpushpr/SKILL.md +0 -55
  201. package/skills/commitpushpr/package.json +0 -33
  202. package/skills/commitpushpr/src/index.ts +0 -34
  203. package/skills/commitpushpr/tsconfig.json +0 -17
  204. package/skills/compress-video/CLAUDE.md +0 -9
  205. package/skills/compress-video/SKILL.md +0 -79
  206. package/skills/compress-video/package.json +0 -23
  207. package/skills/compress-video/src/index.ts +0 -473
  208. package/skills/compress-video/tsconfig.json +0 -11
  209. package/skills/contract-review-report/SKILL.md +0 -52
  210. package/skills/contract-review-report/package.json +0 -10
  211. package/skills/customer-feedback-report/SKILL.md +0 -52
  212. package/skills/customer-feedback-report/package.json +0 -10
  213. package/skills/dashboard-builder/CLAUDE.md +0 -19
  214. package/skills/dashboard-builder/package.json +0 -29
  215. package/skills/dashboard-builder/src/index.ts +0 -150
  216. package/skills/dashboard-builder/tsconfig.json +0 -10
  217. package/skills/data-anonymizer/CLAUDE.md +0 -19
  218. package/skills/data-anonymizer/package.json +0 -27
  219. package/skills/data-anonymizer/src/index.ts +0 -183
  220. package/skills/data-anonymizer/tsconfig.json +0 -10
  221. package/skills/database-explorer/CLAUDE.md +0 -19
  222. package/skills/database-explorer/package.json +0 -29
  223. package/skills/database-explorer/src/index.ts +0 -95
  224. package/skills/database-explorer/tsconfig.json +0 -10
  225. package/skills/diff-viewer/CLAUDE.md +0 -19
  226. package/skills/diff-viewer/package.json +0 -30
  227. package/skills/diff-viewer/src/index.ts +0 -164
  228. package/skills/diff-viewer/tsconfig.json +0 -10
  229. package/skills/doc-read/SKILL.md +0 -45
  230. package/skills/doc-read/package.json +0 -29
  231. package/skills/doc-read/src/index.ts +0 -324
  232. package/skills/doc-read/tsconfig.json +0 -8
  233. package/skills/domainpurchase/LICENSE +0 -192
  234. package/skills/domainpurchase/SKILL.md +0 -29
  235. package/skills/domainpurchase/package.json +0 -30
  236. package/skills/domainpurchase/src/index.ts +0 -3
  237. package/skills/domainpurchase/tsconfig.json +0 -21
  238. package/skills/email-sequence/SKILL.md +0 -53
  239. package/skills/email-sequence/package.json +0 -10
  240. package/skills/experiment-power-calculator/CLAUDE.md +0 -19
  241. package/skills/experiment-power-calculator/package.json +0 -29
  242. package/skills/experiment-power-calculator/src/index.ts +0 -86
  243. package/skills/experiment-power-calculator/tsconfig.json +0 -10
  244. package/skills/extract-frames/CLAUDE.md +0 -19
  245. package/skills/extract-frames/package.json +0 -27
  246. package/skills/extract-frames/src/index.ts +0 -616
  247. package/skills/extract-frames/tsconfig.json +0 -10
  248. package/skills/file-organizer/CLAUDE.md +0 -19
  249. package/skills/file-organizer/package.json +0 -27
  250. package/skills/file-organizer/src/index.ts +0 -91
  251. package/skills/file-organizer/tsconfig.json +0 -10
  252. package/skills/folder-tree/CLAUDE.md +0 -19
  253. package/skills/folder-tree/package.json +0 -29
  254. package/skills/folder-tree/src/index.ts +0 -568
  255. package/skills/folder-tree/tsconfig.json +0 -10
  256. package/skills/form-filler/CLAUDE.md +0 -19
  257. package/skills/form-filler/package.json +0 -29
  258. package/skills/form-filler/src/index.ts +0 -81
  259. package/skills/form-filler/tsconfig.json +0 -10
  260. package/skills/generate-api-client/CLAUDE.md +0 -19
  261. package/skills/generate-api-client/package.json +0 -29
  262. package/skills/generate-api-client/src/generator.ts +0 -47
  263. package/skills/generate-api-client/src/index.ts +0 -92
  264. package/skills/generate-api-client/src/logger.ts +0 -34
  265. package/skills/generate-api-client/src/python-generator.ts +0 -245
  266. package/skills/generate-api-client/src/spec-loader.ts +0 -48
  267. package/skills/generate-api-client/src/type-mappers.ts +0 -79
  268. package/skills/generate-api-client/src/types.ts +0 -76
  269. package/skills/generate-api-client/src/typescript-generator.ts +0 -247
  270. package/skills/generate-api-client/tsconfig.json +0 -10
  271. package/skills/generate-chart/CLAUDE.md +0 -19
  272. package/skills/generate-chart/package.json +0 -27
  273. package/skills/generate-chart/src/index.ts +0 -510
  274. package/skills/generate-chart/tsconfig.json +0 -10
  275. package/skills/generate-dockerfile/CLAUDE.md +0 -19
  276. package/skills/generate-dockerfile/package.json +0 -27
  277. package/skills/generate-dockerfile/src/cli.ts +0 -78
  278. package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
  279. package/skills/generate-dockerfile/src/index.ts +0 -81
  280. package/skills/generate-dockerfile/src/logger.ts +0 -30
  281. package/skills/generate-dockerfile/src/project-detection.ts +0 -68
  282. package/skills/generate-dockerfile/src/support-files.ts +0 -171
  283. package/skills/generate-dockerfile/src/types.ts +0 -29
  284. package/skills/generate-dockerfile/tsconfig.json +0 -10
  285. package/skills/generate-env/CLAUDE.md +0 -19
  286. package/skills/generate-env/package.json +0 -29
  287. package/skills/generate-env/src/cli.ts +0 -85
  288. package/skills/generate-env/src/detection.ts +0 -161
  289. package/skills/generate-env/src/env-data.ts +0 -66
  290. package/skills/generate-env/src/generators.ts +0 -240
  291. package/skills/generate-env/src/index.ts +0 -120
  292. package/skills/generate-env/src/runtime.ts +0 -30
  293. package/skills/generate-env/src/types.ts +0 -32
  294. package/skills/generate-env/tsconfig.json +0 -10
  295. package/skills/generate-favicon/CLAUDE.md +0 -19
  296. package/skills/generate-favicon/package.json +0 -29
  297. package/skills/generate-favicon/src/index.ts +0 -421
  298. package/skills/generate-favicon/tsconfig.json +0 -10
  299. package/skills/generate-qrcode/CLAUDE.md +0 -19
  300. package/skills/generate-qrcode/package.json +0 -30
  301. package/skills/generate-qrcode/src/index.ts +0 -584
  302. package/skills/generate-qrcode/tsconfig.json +0 -10
  303. package/skills/generate-resume/CLAUDE.md +0 -19
  304. package/skills/generate-resume/package.json +0 -27
  305. package/skills/generate-resume/src/cli.ts +0 -157
  306. package/skills/generate-resume/src/index.ts +0 -178
  307. package/skills/generate-resume/src/parsers.ts +0 -95
  308. package/skills/generate-resume/src/renderers.ts +0 -538
  309. package/skills/generate-resume/src/security.ts +0 -39
  310. package/skills/generate-resume/src/types.ts +0 -86
  311. package/skills/generate-resume/tsconfig.json +0 -10
  312. package/skills/generate-sitemap/CLAUDE.md +0 -19
  313. package/skills/generate-sitemap/package.json +0 -27
  314. package/skills/generate-sitemap/src/index.ts +0 -626
  315. package/skills/generate-sitemap/tsconfig.json +0 -10
  316. package/skills/gif-maker/CLAUDE.md +0 -19
  317. package/skills/gif-maker/package.json +0 -30
  318. package/skills/gif-maker/src/index.ts +0 -600
  319. package/skills/gif-maker/tsconfig.json +0 -10
  320. package/skills/hook/LICENSE +0 -192
  321. package/skills/hook/README.md +0 -74
  322. package/skills/hook/SKILL.md +0 -85
  323. package/skills/hook/bunfig.toml +0 -5
  324. package/skills/hook/package.json +0 -28
  325. package/skills/hook/src/commands/create.ts +0 -112
  326. package/skills/hook/src/commands/events.ts +0 -37
  327. package/skills/hook/src/commands/validate.ts +0 -117
  328. package/skills/hook/src/index.ts +0 -118
  329. package/skills/hook/src/templates/root.ts +0 -196
  330. package/skills/hook/src/templates/source.ts +0 -647
  331. package/skills/hook/tsconfig.json +0 -18
  332. package/skills/http-server/CLAUDE.md +0 -19
  333. package/skills/http-server/package.json +0 -29
  334. package/skills/http-server/src/index.ts +0 -51
  335. package/skills/http-server/tsconfig.json +0 -10
  336. package/skills/implementation/LICENSE +0 -192
  337. package/skills/implementation/README.md +0 -53
  338. package/skills/implementation/SKILL.md +0 -57
  339. package/skills/implementation/bunfig.toml +0 -5
  340. package/skills/implementation/package.json +0 -28
  341. package/skills/implementation/src/commands/create.ts +0 -187
  342. package/skills/implementation/src/index.ts +0 -62
  343. package/skills/implementation/tsconfig.json +0 -18
  344. package/skills/implementation-plan/CLAUDE.md +0 -19
  345. package/skills/implementation-plan/package.json +0 -29
  346. package/skills/implementation-plan/src/index.ts +0 -520
  347. package/skills/implementation-plan/tsconfig.json +0 -10
  348. package/skills/implementation-todo/CLAUDE.md +0 -19
  349. package/skills/implementation-todo/package.json +0 -29
  350. package/skills/implementation-todo/src/index.ts +0 -429
  351. package/skills/implementation-todo/tsconfig.json +0 -10
  352. package/skills/invoice/.env.example +0 -3
  353. package/skills/invoice/CLAUDE.md +0 -31
  354. package/skills/invoice/LICENSE +0 -192
  355. package/skills/invoice/README.md +0 -70
  356. package/skills/invoice/package.json +0 -26
  357. package/skills/invoice/src/commands/companies.ts +0 -202
  358. package/skills/invoice/src/commands/config.ts +0 -132
  359. package/skills/invoice/src/commands/generate.ts +0 -177
  360. package/skills/invoice/src/commands/invoices.ts +0 -218
  361. package/skills/invoice/src/index.ts +0 -3
  362. package/skills/invoice/src/lib/api.ts +0 -124
  363. package/skills/invoice/src/lib/storage.ts +0 -171
  364. package/skills/invoice/src/types/index.ts +0 -86
  365. package/skills/invoice/src/utils/logger.ts +0 -33
  366. package/skills/invoice/src/utils/paths.ts +0 -25
  367. package/skills/invoice/tsconfig.json +0 -23
  368. package/skills/invoice-reconciliation/SKILL.md +0 -98
  369. package/skills/invoice-reconciliation/package.json +0 -36
  370. package/skills/invoice-reconciliation/src/index.ts +0 -743
  371. package/skills/invoice-reconciliation/tsconfig.json +0 -17
  372. package/skills/landing-page-pack/SKILL.md +0 -55
  373. package/skills/landing-page-pack/package.json +0 -10
  374. package/skills/latex-table-generator/CLAUDE.md +0 -19
  375. package/skills/latex-table-generator/package.json +0 -29
  376. package/skills/latex-table-generator/src/index.ts +0 -113
  377. package/skills/latex-table-generator/tsconfig.json +0 -10
  378. package/skills/logo-design/SKILL.md +0 -94
  379. package/skills/logo-design/package.json +0 -35
  380. package/skills/logo-design/src/cli.ts +0 -132
  381. package/skills/logo-design/src/constants.ts +0 -5
  382. package/skills/logo-design/src/docs.ts +0 -102
  383. package/skills/logo-design/src/geometry.ts +0 -324
  384. package/skills/logo-design/src/index.ts +0 -212
  385. package/skills/logo-design/src/palette.ts +0 -258
  386. package/skills/logo-design/src/types.ts +0 -50
  387. package/skills/logo-design/tsconfig.json +0 -17
  388. package/skills/lorem-generator/CLAUDE.md +0 -19
  389. package/skills/lorem-generator/package.json +0 -29
  390. package/skills/lorem-generator/src/index.ts +0 -59
  391. package/skills/lorem-generator/tsconfig.json +0 -10
  392. package/skills/managemcp/CLAUDE.md +0 -14
  393. package/skills/managemcp/README.md +0 -24
  394. package/skills/managemcp/package.json +0 -16
  395. package/skills/managemcp/src/index.ts +0 -3
  396. package/skills/managemcp/tsconfig.json +0 -27
  397. package/skills/markdown-validator/CLAUDE.md +0 -19
  398. package/skills/markdown-validator/package.json +0 -29
  399. package/skills/markdown-validator/src/index.ts +0 -92
  400. package/skills/markdown-validator/tsconfig.json +0 -10
  401. package/skills/market-research-report/SKILL.md +0 -51
  402. package/skills/market-research-report/package.json +0 -10
  403. package/skills/meeting-pack/SKILL.md +0 -52
  404. package/skills/meeting-pack/package.json +0 -10
  405. package/skills/merge-pdfs/CLAUDE.md +0 -19
  406. package/skills/merge-pdfs/package.json +0 -31
  407. package/skills/merge-pdfs/src/index.ts +0 -427
  408. package/skills/merge-pdfs/tsconfig.json +0 -10
  409. package/skills/migration-plan-pack/SKILL.md +0 -56
  410. package/skills/migration-plan-pack/package.json +0 -10
  411. package/skills/monitor/SKILL.md +0 -69
  412. package/skills/monitor/package.json +0 -33
  413. package/skills/monitor/src/index.ts +0 -34
  414. package/skills/monitor/tsconfig.json +0 -17
  415. package/skills/one-page-website/SKILL.md +0 -128
  416. package/skills/one-page-website/package.json +0 -34
  417. package/skills/one-page-website/src/design.ts +0 -336
  418. package/skills/one-page-website/src/docs.ts +0 -159
  419. package/skills/one-page-website/src/index.ts +0 -357
  420. package/skills/one-page-website/src/page.ts +0 -340
  421. package/skills/one-page-website/src/styles.ts +0 -508
  422. package/skills/one-page-website/src/types.ts +0 -78
  423. package/skills/one-page-website/tsconfig.json +0 -17
  424. package/skills/pdf-generate/CLAUDE.md +0 -19
  425. package/skills/pdf-generate/SKILL.md +0 -86
  426. package/skills/pdf-generate/package.json +0 -21
  427. package/skills/pdf-generate/src/cli.ts +0 -162
  428. package/skills/pdf-generate/src/html.ts +0 -84
  429. package/skills/pdf-generate/src/index.ts +0 -62
  430. package/skills/pdf-generate/src/markdown.ts +0 -27
  431. package/skills/pdf-generate/src/pdf-writer.ts +0 -78
  432. package/skills/pdf-generate/src/runtime.ts +0 -34
  433. package/skills/pdf-generate/src/security.ts +0 -37
  434. package/skills/pdf-generate/src/templates.ts +0 -311
  435. package/skills/pdf-generate/src/types.ts +0 -28
  436. package/skills/pdf-generate/tsconfig.json +0 -16
  437. package/skills/pdf-to-dataset/SKILL.md +0 -88
  438. package/skills/pdf-to-dataset/package.json +0 -37
  439. package/skills/pdf-to-dataset/src/index.ts +0 -790
  440. package/skills/pdf-to-dataset/tsconfig.json +0 -17
  441. package/skills/pdf-to-markdown/SKILL.md +0 -81
  442. package/skills/pdf-to-markdown/package.json +0 -35
  443. package/skills/pdf-to-markdown/src/index.ts +0 -694
  444. package/skills/pdf-to-markdown/tsconfig.json +0 -17
  445. package/skills/performance-audit-report/SKILL.md +0 -49
  446. package/skills/performance-audit-report/package.json +0 -10
  447. package/skills/pitch-deck/SKILL.md +0 -51
  448. package/skills/pitch-deck/package.json +0 -10
  449. package/skills/product-mockup/SKILL.md +0 -107
  450. package/skills/product-mockup/package.json +0 -32
  451. package/skills/product-mockup/src/cli.ts +0 -150
  452. package/skills/product-mockup/src/design.ts +0 -151
  453. package/skills/product-mockup/src/docs.ts +0 -134
  454. package/skills/product-mockup/src/index.ts +0 -182
  455. package/skills/product-mockup/src/render.ts +0 -407
  456. package/skills/product-mockup/src/types.ts +0 -66
  457. package/skills/product-mockup/tsconfig.json +0 -17
  458. package/skills/proposal-pack/SKILL.md +0 -53
  459. package/skills/proposal-pack/package.json +0 -10
  460. package/skills/read-csv/SKILL.md +0 -62
  461. package/skills/read-csv/package.json +0 -37
  462. package/skills/read-csv/src/index.ts +0 -356
  463. package/skills/read-csv/tsconfig.json +0 -17
  464. package/skills/read-excel/SKILL.md +0 -64
  465. package/skills/read-excel/package.json +0 -36
  466. package/skills/read-excel/src/index.ts +0 -266
  467. package/skills/read-excel/tsconfig.json +0 -17
  468. package/skills/regex-tester/CLAUDE.md +0 -19
  469. package/skills/regex-tester/package.json +0 -27
  470. package/skills/regex-tester/src/index.ts +0 -183
  471. package/skills/regex-tester/tsconfig.json +0 -10
  472. package/skills/repo-onboarding-report/SKILL.md +0 -52
  473. package/skills/repo-onboarding-report/package.json +0 -10
  474. package/skills/scancommitpr/SKILL.md +0 -178
  475. package/skills/scancommitpr/package.json +0 -34
  476. package/skills/scancommitpr/src/index.ts +0 -44
  477. package/skills/scancommitpr/tsconfig.json +0 -13
  478. package/skills/scancommitpush/SKILL.md +0 -174
  479. package/skills/scancommitpush/package.json +0 -32
  480. package/skills/scancommitpush/src/index.ts +0 -44
  481. package/skills/scancommitpush/tsconfig.json +0 -13
  482. package/skills/scientific-figure-check/CLAUDE.md +0 -19
  483. package/skills/scientific-figure-check/package.json +0 -29
  484. package/skills/scientific-figure-check/src/index.ts +0 -83
  485. package/skills/scientific-figure-check/tsconfig.json +0 -10
  486. package/skills/security-audit/CLAUDE.md +0 -19
  487. package/skills/security-audit/package.json +0 -27
  488. package/skills/security-audit/src/index.ts +0 -145
  489. package/skills/security-audit/tsconfig.json +0 -10
  490. package/skills/security-audit-report/SKILL.md +0 -52
  491. package/skills/security-audit-report/package.json +0 -10
  492. package/skills/seo-content-pack/SKILL.md +0 -54
  493. package/skills/seo-content-pack/package.json +0 -10
  494. package/skills/siteanalyze/SKILL.md +0 -25
  495. package/skills/siteanalyze/package.json +0 -27
  496. package/skills/siteanalyze/src/index.ts +0 -592
  497. package/skills/slide-deck-generator/SKILL.md +0 -93
  498. package/skills/slide-deck-generator/package.json +0 -38
  499. package/skills/slide-deck-generator/src/cli.ts +0 -133
  500. package/skills/slide-deck-generator/src/index.ts +0 -148
  501. package/skills/slide-deck-generator/src/model.ts +0 -307
  502. package/skills/slide-deck-generator/src/pptx.ts +0 -143
  503. package/skills/slide-deck-generator/src/render.ts +0 -248
  504. package/skills/slide-deck-generator/src/types.ts +0 -114
  505. package/skills/slide-deck-generator/src/utils.ts +0 -53
  506. package/skills/slide-deck-generator/tsconfig.json +0 -17
  507. package/skills/social-content-calendar/SKILL.md +0 -54
  508. package/skills/social-content-calendar/package.json +0 -10
  509. package/skills/split-pdf/CLAUDE.md +0 -19
  510. package/skills/split-pdf/package.json +0 -30
  511. package/skills/split-pdf/src/index.ts +0 -301
  512. package/skills/split-pdf/tsconfig.json +0 -10
  513. package/skills/statistical-test-selector/CLAUDE.md +0 -19
  514. package/skills/statistical-test-selector/package.json +0 -27
  515. package/skills/statistical-test-selector/src/index.ts +0 -75
  516. package/skills/statistical-test-selector/tsconfig.json +0 -10
  517. package/skills/test-suite-generator/SKILL.md +0 -51
  518. package/skills/test-suite-generator/package.json +0 -10
  519. package/skills/tmux-session/SKILL.md +0 -109
  520. package/skills/tmux-session/package.json +0 -33
  521. package/skills/tmux-session/src/index.ts +0 -34
  522. package/skills/tmux-session/tsconfig.json +0 -17
  523. package/skills/todos-plan/SKILL.md +0 -363
  524. package/skills/todos-plan/agents/openai.yaml +0 -4
  525. package/skills/todos-plan/package.json +0 -9
  526. package/skills/todos-plan/src/index.ts +0 -68
  527. package/skills/tsconfig.base.json +0 -12
  528. package/skills/validate-config/CLAUDE.md +0 -19
  529. package/skills/validate-config/package.json +0 -29
  530. package/skills/validate-config/src/index.ts +0 -56
  531. package/skills/validate-config/tsconfig.json +0 -10
  532. package/skills/video-downloader/CLAUDE.md +0 -19
  533. package/skills/video-downloader/package.json +0 -29
  534. package/skills/video-downloader/src/index.ts +0 -561
  535. package/skills/video-downloader/tsconfig.json +0 -10
  536. package/skills/video-highlight-pack/SKILL.md +0 -54
  537. package/skills/video-highlight-pack/package.json +0 -10
  538. package/skills/watermark/CLAUDE.md +0 -19
  539. package/skills/watermark/package.json +0 -32
  540. package/skills/watermark/src/index.ts +0 -587
  541. package/skills/watermark/tsconfig.json +0 -10
@@ -0,0 +1,16 @@
1
+ export interface OfflineGateOptions {
2
+ /** The configured API origin; present means "this client is hosted". */
3
+ apiUrl?: string;
4
+ /** True when the skill is present in the verified local cache. */
5
+ isCached: (skill: string) => boolean | Promise<boolean>;
6
+ /** True when the skill's contract requires network. */
7
+ isNetworkRequired?: (skill: string) => boolean | Promise<boolean>;
8
+ }
9
+ export interface OfflineGate {
10
+ /**
11
+ * Decide whether a run may execute locally. Throws GovernanceError with the
12
+ * exact code (REMOTE_REQUIRED | SKILL_UNAVAILABLE_OFFLINE) when it may not.
13
+ */
14
+ assertCanRunLocal(skill: string): Promise<void>;
15
+ }
16
+ export declare function createOfflineGate(options: OfflineGateOptions): OfflineGate;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Outputs governance: default-private visibility, pre-persistence redaction,
3
+ * hard size limits, finite TTLs, and immutable deletion receipts.
4
+ *
5
+ * The writer is the one gate every artifact passes at write time: visibility is
6
+ * stamped from the governance default, redaction runs BEFORE the bytes are
7
+ * stored, the per-output and per-run-total caps are checked before the row is
8
+ * written, and expiresAt is computed from the configured TTL. The expiry sweep
9
+ * is the retention half: artifacts whose expiresAt is in the past are deleted
10
+ * (row + object) and every deletion lands one append-only receipt.
11
+ */
12
+ import type { ArtifactBody, ObjectStore } from "./storage.js";
13
+ import type { GovernanceStore, LifecycleReceipt } from "./governance-store.js";
14
+ import { type OutputGovernanceConfig } from "./governance.js";
15
+ import type { ServerArtifact, ServerRunRecord, SkillsProductStore } from "../server/types.js";
16
+ /**
17
+ * The object half of the artifact lifecycle: the storage seam's read/write
18
+ * surface plus the two operations governance needs and the base seam does not
19
+ * declare - object deletion (expiry sweep) and the quarantine move
20
+ * (cancellation). ArtifactStorage implements all of them; a db-only embedder
21
+ * omits the optional ones and rows-only governance still works.
22
+ */
23
+ export interface RunObjectStore extends ObjectStore {
24
+ deleteObject?(artifact: ServerArtifact): Promise<void>;
25
+ moveToQuarantine?(artifact: ServerArtifact): Promise<string | null>;
26
+ quarantineKeyFor(tenantId: string, runId: string, artifactId: string): string;
27
+ }
28
+ export interface GovernedArtifactWriter {
29
+ write(run: ServerRunRecord, meta: Omit<ServerArtifact, "createdAt" | "storageKind" | "storageKey" | "bodyText">, body: ArtifactBody): Promise<ServerArtifact>;
30
+ }
31
+ export interface OutputGovernanceOptions {
32
+ store: SkillsProductStore;
33
+ governanceStore: GovernanceStore;
34
+ storage?: RunObjectStore;
35
+ config?: OutputGovernanceConfig;
36
+ /** Explicit override of the default visibility for this writer. */
37
+ visibility?: "private" | "public";
38
+ }
39
+ /**
40
+ * Apply the configured redaction patterns to run output before it is stored.
41
+ *
42
+ * The hook is pure and exported so the same patterns can guard logs and run
43
+ * records that never pass through the artifact writer.
44
+ */
45
+ export declare function redactRunOutput(value: unknown, patterns?: RegExp[]): string;
46
+ /** Expiry timestamp for an artifact written now under the given TTL. Absent only when the TTL is undefined. */
47
+ export declare function expiresAtFor(createdAt: string, ttlSeconds: number | undefined): string | undefined;
48
+ /**
49
+ * The write-time gate. Every enforcement happens before the row exists:
50
+ *
51
+ * 1. redact the body text (before storage),
52
+ * 2. refuse an output above the per-output cap,
53
+ * 3. refuse a run whose accumulated outputs would exceed the per-run cap,
54
+ * 4. stamp visibility (private by default) and expiresAt (createdAt + TTL),
55
+ * 5. materialize (db column or S3 object) and persist.
56
+ */
57
+ export declare function createGovernedArtifactWriter(options: OutputGovernanceOptions): GovernedArtifactWriter;
58
+ /**
59
+ * The retention sweep: delete every artifact whose expiresAt is in the past.
60
+ *
61
+ * Row deletion and object deletion both happen; the object is removed first so
62
+ * an object with no row cannot outlive the row (a row with no object is only a
63
+ * metadata entry, the safe direction). One append-only receipt records what was
64
+ * deleted, when, and on whose request. Receipts have no update or delete path.
65
+ */
66
+ export declare function expireArtifacts(options: {
67
+ governanceStore: GovernanceStore;
68
+ storage?: RunObjectStore;
69
+ requestedBy: string;
70
+ now?: string;
71
+ }): Promise<LifecycleReceipt[]>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Registry + version service seam.
3
+ *
4
+ * The registry half wraps the shipped server registry (src/server/registry.ts): the
5
+ * merged catalog, slug resolution, and SKILL.md docs. The version service is the seam
6
+ * for skills_registry versioning — the `version` column a published record carries, and
7
+ * the contract sibling work (hasna.skill.v1, skill-hash) builds on.
8
+ */
9
+ import type { SkillMeta } from "../lib/registry-types.js";
10
+ import { getServerSkill, getServerSkillMd, isValidSkillSlug, listServerSkills } from "../server/registry.js";
11
+ import type { ServerSkillRecord } from "../server/types.js";
12
+ /** The registry an embedder resolves skills against. */
13
+ export interface RegistryService {
14
+ list(): SkillMeta[];
15
+ get(slug: string): SkillMeta | null;
16
+ getSkillMd(slug: string): string | null;
17
+ isValidSlug(slug: string): boolean;
18
+ }
19
+ /** Current implementation: the bundled registry served by the shipped server. */
20
+ export declare const bundledRegistry: RegistryService;
21
+ /** Resolves the effective version of a published skill record. */
22
+ export interface RegistryVersionService {
23
+ resolveVersion(record: Pick<ServerSkillRecord, "version">): string | undefined;
24
+ }
25
+ /** Current implementation: the version column carried by the published record. */
26
+ export declare const currentVersionService: RegistryVersionService;
27
+ export { getServerSkill, getServerSkillMd, isValidSkillSlug, listServerSkills };
28
+ export type { SkillMeta };
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Run protocol + atomic run services seam.
3
+ *
4
+ * The protocol declares the wire contract for skill runs: the lifecycle states
5
+ * (admitted / leased / running / terminal), run_id, attempt_id, and lease_generation.
6
+ * The zod schemas validate both admission and terminal payloads against
7
+ * contractVersion 1 — the same version the shipped server emits on /api/v1/runs.
8
+ *
9
+ * The run services half is the atomic engine: admission, claim/lease, and transition.
10
+ * The current implementation wraps the store's own atomic transitions (Postgres
11
+ * `FOR UPDATE SKIP LOCKED`, SQLite `BEGIN IMMEDIATE` plus a conditional claim) — no
12
+ * business logic is duplicated here.
13
+ */
14
+ import { z } from "zod";
15
+ import { REMOTE_SKILL_RUN_CONTRACT_VERSION, normalizeRemoteSkillRunContract, type RemoteSkillRunContract } from "../lib/remote-run-contract.js";
16
+ import type { ApiPrincipal, CreateRunInput, ServerRunRecord, ServerRunStatus, SkillsProductStore } from "../server/types.js";
17
+ import type { OfflineGate } from "./offline.js";
18
+ import type { RunEventEmitter } from "./events.js";
19
+ import type { SpendService } from "./spend.js";
20
+ import type { RunQuota } from "./governance.js";
21
+ /** Wire version shared by every run payload this SDK produces or consumes. */
22
+ export declare const RUN_PROTOCOL_VERSION: 1;
23
+ /** Lifecycle states of the run protocol (admitted → leased → running → terminal). */
24
+ export declare const RUN_PROTOCOL_STATES: readonly ["admitted", "leased", "running", "terminal"];
25
+ export type RunProtocolState = (typeof RUN_PROTOCOL_STATES)[number];
26
+ /** Stable run identifier (`run_id`). */
27
+ export type RunId = string;
28
+ /** Attempt identifier (`attempt_id`). */
29
+ export type AttemptId = string;
30
+ /** Fencing token for a claim (`lease_generation`). */
31
+ export type LeaseGeneration = number;
32
+ /** Admission: a run is accepted into the queue. */
33
+ export declare const runAdmissionSchema: z.ZodObject<{
34
+ contractVersion: z.ZodLiteral<1>;
35
+ runId: z.ZodString;
36
+ attemptId: z.ZodString;
37
+ leaseGeneration: z.ZodNumber;
38
+ skill: z.ZodString;
39
+ status: z.ZodLiteral<"admitted">;
40
+ createdAt: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ createdAt: string;
43
+ status: "admitted";
44
+ skill: string;
45
+ contractVersion: 1;
46
+ runId: string;
47
+ leaseGeneration: number;
48
+ attemptId: string;
49
+ }, {
50
+ createdAt: string;
51
+ status: "admitted";
52
+ skill: string;
53
+ contractVersion: 1;
54
+ runId: string;
55
+ leaseGeneration: number;
56
+ attemptId: string;
57
+ }>;
58
+ export type RunAdmission = z.infer<typeof runAdmissionSchema>;
59
+ /** Lease: a worker has claimed the run. */
60
+ export declare const runLeaseSchema: z.ZodObject<{
61
+ contractVersion: z.ZodLiteral<1>;
62
+ runId: z.ZodString;
63
+ attemptId: z.ZodString;
64
+ leaseGeneration: z.ZodNumber;
65
+ workerId: z.ZodString;
66
+ status: z.ZodLiteral<"leased">;
67
+ }, "strip", z.ZodTypeAny, {
68
+ status: "leased";
69
+ contractVersion: 1;
70
+ runId: string;
71
+ leaseGeneration: number;
72
+ attemptId: string;
73
+ workerId: string;
74
+ }, {
75
+ status: "leased";
76
+ contractVersion: 1;
77
+ runId: string;
78
+ leaseGeneration: number;
79
+ attemptId: string;
80
+ workerId: string;
81
+ }>;
82
+ export type RunLease = z.infer<typeof runLeaseSchema>;
83
+ /** Terminal: the run reached a final state. */
84
+ export declare const runTerminalSchema: z.ZodObject<{
85
+ contractVersion: z.ZodLiteral<1>;
86
+ runId: z.ZodString;
87
+ attemptId: z.ZodString;
88
+ leaseGeneration: z.ZodNumber;
89
+ skill: z.ZodString;
90
+ status: z.ZodEnum<["succeeded", "failed", "cancelled", "expired"]>;
91
+ completedAt: z.ZodString;
92
+ }, "strip", z.ZodTypeAny, {
93
+ status: "failed" | "succeeded" | "cancelled" | "expired";
94
+ skill: string;
95
+ completedAt: string;
96
+ contractVersion: 1;
97
+ runId: string;
98
+ leaseGeneration: number;
99
+ attemptId: string;
100
+ }, {
101
+ status: "failed" | "succeeded" | "cancelled" | "expired";
102
+ skill: string;
103
+ completedAt: string;
104
+ contractVersion: 1;
105
+ runId: string;
106
+ leaseGeneration: number;
107
+ attemptId: string;
108
+ }>;
109
+ export type RunTerminal = z.infer<typeof runTerminalSchema>;
110
+ /** Any single protocol message, discriminated by `status`. */
111
+ export declare const runProtocolSchema: z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
112
+ contractVersion: z.ZodLiteral<1>;
113
+ runId: z.ZodString;
114
+ attemptId: z.ZodString;
115
+ leaseGeneration: z.ZodNumber;
116
+ skill: z.ZodString;
117
+ status: z.ZodLiteral<"admitted">;
118
+ createdAt: z.ZodString;
119
+ }, "strip", z.ZodTypeAny, {
120
+ createdAt: string;
121
+ status: "admitted";
122
+ skill: string;
123
+ contractVersion: 1;
124
+ runId: string;
125
+ leaseGeneration: number;
126
+ attemptId: string;
127
+ }, {
128
+ createdAt: string;
129
+ status: "admitted";
130
+ skill: string;
131
+ contractVersion: 1;
132
+ runId: string;
133
+ leaseGeneration: number;
134
+ attemptId: string;
135
+ }>, z.ZodObject<{
136
+ contractVersion: z.ZodLiteral<1>;
137
+ runId: z.ZodString;
138
+ attemptId: z.ZodString;
139
+ leaseGeneration: z.ZodNumber;
140
+ workerId: z.ZodString;
141
+ status: z.ZodLiteral<"leased">;
142
+ }, "strip", z.ZodTypeAny, {
143
+ status: "leased";
144
+ contractVersion: 1;
145
+ runId: string;
146
+ leaseGeneration: number;
147
+ attemptId: string;
148
+ workerId: string;
149
+ }, {
150
+ status: "leased";
151
+ contractVersion: 1;
152
+ runId: string;
153
+ leaseGeneration: number;
154
+ attemptId: string;
155
+ workerId: string;
156
+ }>, z.ZodObject<{
157
+ contractVersion: z.ZodLiteral<1>;
158
+ runId: z.ZodString;
159
+ attemptId: z.ZodString;
160
+ leaseGeneration: z.ZodNumber;
161
+ skill: z.ZodString;
162
+ status: z.ZodEnum<["succeeded", "failed", "cancelled", "expired"]>;
163
+ completedAt: z.ZodString;
164
+ }, "strip", z.ZodTypeAny, {
165
+ status: "failed" | "succeeded" | "cancelled" | "expired";
166
+ skill: string;
167
+ completedAt: string;
168
+ contractVersion: 1;
169
+ runId: string;
170
+ leaseGeneration: number;
171
+ attemptId: string;
172
+ }, {
173
+ status: "failed" | "succeeded" | "cancelled" | "expired";
174
+ skill: string;
175
+ completedAt: string;
176
+ contractVersion: 1;
177
+ runId: string;
178
+ leaseGeneration: number;
179
+ attemptId: string;
180
+ }>]>;
181
+ export type RunProtocolMessage = z.infer<typeof runProtocolSchema>;
182
+ /** Map the store's status vocabulary onto the protocol lifecycle. */
183
+ export declare function protocolStateOf(status: ServerRunStatus): RunProtocolState;
184
+ /** The current engine is single-attempt: the attempt id is the run id. */
185
+ export declare function attemptIdOf(run: Pick<ServerRunRecord, "id">): AttemptId;
186
+ /** The current engine keeps the generation the claim actually stamped. */
187
+ export declare function leaseGenerationOf(run: Pick<ServerRunRecord, "leaseGeneration">): LeaseGeneration;
188
+ /** One atomic status transition on a run. */
189
+ export type RunTransition = Partial<Pick<ServerRunRecord, "status" | "outputType" | "outputPreview" | "errorCode" | "errorMessage" | "startedAt" | "completedAt">>;
190
+ /** Atomic run services: admission, lease/claim, transition, and read. */
191
+ export interface RunService {
192
+ admit(input: CreateRunInput): Promise<ServerRunRecord>;
193
+ leaseNext(workerId: string): Promise<ServerRunRecord | null>;
194
+ transition(runId: string, patch: RunTransition): Promise<ServerRunRecord | null>;
195
+ get(principal: ApiPrincipal, runId: string): Promise<ServerRunRecord | null>;
196
+ }
197
+ export interface RunServiceOptions {
198
+ store: SkillsProductStore;
199
+ /**
200
+ * Optional governance wiring. When present, admit() runs the full admission
201
+ * chain before a run enters the queue: the offline gate first (fail closed),
202
+ * then the spend ceilings (RUN_BUDGET_EXHAUSTED on refusal), then the run is
203
+ * created, reserved against, and announced. Absent, admit() is exactly what
204
+ * it always was - the embedder opts in to the controls.
205
+ */
206
+ governance?: RunServiceGovernance;
207
+ }
208
+ export interface RunServiceGovernance {
209
+ offline?: OfflineGate;
210
+ spend?: SpendService;
211
+ events?: RunEventEmitter;
212
+ /** Resource envelope this run requests, checked against the org ceilings. */
213
+ quota?: RunQuota;
214
+ /** Estimated cost in cents, reserved before dispatch. */
215
+ estimatedCents?: number;
216
+ }
217
+ /** Current implementation: the store's own atomic transitions, plus the optional admission chain. */
218
+ export declare function createRunService({ store, governance }: RunServiceOptions): RunService;
219
+ /**
220
+ * Settle a terminal run: reconcile its credit reservation against the actual
221
+ * cost and emit the terminal lifecycle event. The reservation is released
222
+ * (actual 0) or charged (actual > 0); unused reservations never linger.
223
+ */
224
+ export declare function settleRun(store: SkillsProductStore, options: {
225
+ spend?: SpendService;
226
+ events?: RunEventEmitter;
227
+ }, run: ServerRunRecord, actualCents?: number): Promise<void>;
228
+ export { REMOTE_SKILL_RUN_CONTRACT_VERSION, normalizeRemoteSkillRunContract };
229
+ export type { RemoteSkillRunContract };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Server seam: router + handler types, and thin server factories over the shipped HTTP
3
+ * API implementation (src/server/app.ts).
4
+ *
5
+ * The routing logic itself is untouched: createSkillsFetchHandler() owns the /api/v1
6
+ * dispatcher and every durability guard. This module is the contract an embedder (the
7
+ * SaaS control plane) builds against, and it re-exports the implementation.
8
+ */
9
+ import { assertDurableStore, assertDurableTarget, createSkillsFetchHandler, skillsServeLimits, startSkillsServer, type SkillsServerOptions } from "../server/app.js";
10
+ import { resolveServerConfig, type SkillsServerConfig } from "../server/config.js";
11
+ import type { ApiPrincipal } from "../server/types.js";
12
+ /** A request handler: the unit the HTTP layer executes. */
13
+ export type SkillsRequestHandler = (request: Request) => Promise<Response>;
14
+ /** One additional route, matched exactly on method + pathname before the base handler. */
15
+ export interface SkillsRoute {
16
+ method: string;
17
+ pathname: string;
18
+ handler: SkillsRequestHandler;
19
+ }
20
+ /**
21
+ * Build the shipped API server as a plain fetch handler.
22
+ *
23
+ * Thin wrapper over createSkillsFetchHandler() — same store, same guards, same routes.
24
+ */
25
+ export declare function createServer(options?: SkillsServerOptions): Promise<SkillsRequestHandler>;
26
+ /**
27
+ * Register additional routes in front of a base handler.
28
+ *
29
+ * Consulted before the base handler on exact method + pathname match; anything else
30
+ * falls through to the shipped dispatcher. This is composition, not a rewrite of the
31
+ * router.
32
+ */
33
+ export declare function registerRoutes(base: SkillsRequestHandler, routes: SkillsRoute[]): SkillsRequestHandler;
34
+ export { assertDurableStore, assertDurableTarget, createSkillsFetchHandler, skillsServeLimits, startSkillsServer, resolveServerConfig, };
35
+ export type { ApiPrincipal, SkillsServerConfig, SkillsServerOptions };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Spend governance: credit reservations and org ceilings, enforced at admission.
3
+ *
4
+ * The flow: admit() checks every ceiling BEFORE a run enters the queue
5
+ * (per-run resource envelope, org concurrency, org monthly total) and refuses
6
+ * with RUN_BUDGET_EXHAUSTED when one is exhausted - the exact error the
7
+ * negative fixture asserts. reserve() then sets aside the estimate, keyed to
8
+ * the run, before dispatch. reconcile() runs once at terminal state: the
9
+ * actual cost is charged (status "charged") or, when nothing was used, the
10
+ * reservation is released ("released") - the unused half never lingers.
11
+ *
12
+ * All numbers are cents; a ceiling is a finite integer, never an open-ended
13
+ * budget.
14
+ */
15
+ import type { ApiPrincipal } from "../server/types.js";
16
+ import { type RunQuota, type SpendCeilings } from "./governance.js";
17
+ import type { CreditReservation, GovernanceStore } from "./governance-store.js";
18
+ export interface SpendAdmissionInput {
19
+ principal: ApiPrincipal;
20
+ slug: string;
21
+ quota?: RunQuota;
22
+ estimatedCents?: number;
23
+ now?: Date;
24
+ }
25
+ export interface SpendService {
26
+ /** Enforce the org's ceilings; throw RUN_BUDGET_EXHAUSTED with the exact ceiling named. */
27
+ admit(input: SpendAdmissionInput): Promise<void>;
28
+ /** Reserve credits for a run before dispatch. Returns the reservation id. */
29
+ reserve(tenantId: string, runId: string, estimatedCents: number): Promise<CreditReservation>;
30
+ /** Reconcile at terminal state: charge the actual cost, or release the unused reservation. */
31
+ reconcile(tenantId: string, runId: string, actualCents: number): Promise<CreditReservation | null>;
32
+ }
33
+ export declare function createSpendService(options: {
34
+ governanceStore: GovernanceStore;
35
+ ceilings?: SpendCeilings;
36
+ }): SpendService;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Storage + object-store seam.
3
+ *
4
+ * The relational half is the store interface (SkillsProductStore) and the shipped
5
+ * backends: Postgres via a postgres:// URL, SQLite via a path or file URL (the
6
+ * zero-config default), and the explicitly-named in-memory store. The object-store half
7
+ * is where artifact and bundle bytes live: the database column or S3, selected by
8
+ * ArtifactStorage's bucket option.
9
+ */
10
+ import { ArtifactStorage, type ArtifactBody, type ArtifactStorageOptions } from "../server/artifact-storage.js";
11
+ import { resolveDatabaseTarget, type DatabaseTarget } from "../server/database-url.js";
12
+ import { SqliteSkillsStore, type SqliteStoreOptions } from "../server/sqlite-store.js";
13
+ import { MemorySkillsStore, PostgresSkillsStore, createStore, type StoreOptions } from "../server/store.js";
14
+ import type { BlobStorageKind, ServerArtifact, ServerRunRecord, ServerSkillBundle, SkillsProductStore, StoreBackendInfo } from "../server/types.js";
15
+ export type { ArtifactBody, ArtifactStorageOptions, BlobStorageKind, DatabaseTarget, ServerArtifact, ServerRunRecord, ServerSkillBundle, SkillsProductStore, SqliteStoreOptions, StoreBackendInfo, StoreOptions, };
16
+ /** Object-store seam: where run artifacts and skill bundles live. */
17
+ export interface ObjectStore {
18
+ readonly usesS3: boolean;
19
+ materialize(run: ServerRunRecord, artifact: Omit<ServerArtifact, "createdAt" | "storageKind" | "storageKey" | "bodyText">, body: ArtifactBody): Promise<Omit<ServerArtifact, "createdAt">>;
20
+ readText(artifact: ServerArtifact): Promise<string | null>;
21
+ deleteBundle(orgId: string, sha256: string): Promise<void>;
22
+ }
23
+ /** Compile-time proof the shipped implementation satisfies the seam. */
24
+ export declare const artifactStorageSeam: new (options?: ArtifactStorageOptions) => ObjectStore;
25
+ export { ArtifactStorage, MemorySkillsStore, PostgresSkillsStore, SqliteSkillsStore, createStore, resolveDatabaseTarget, };
@@ -0,0 +1,42 @@
1
+ import { type SkillsServerConfig } from "./config.js";
2
+ import { type MemorySkillsStore } from "./store.js";
3
+ import { type SkillsProductStore } from "./types.js";
4
+ export interface SkillsServerOptions {
5
+ config?: Partial<SkillsServerConfig>;
6
+ store?: SkillsProductStore;
7
+ }
8
+ /**
9
+ * Refuse to serve traffic from storage that will not survive a restart.
10
+ *
11
+ * /health answering `ok: true` from a process backed by a Map is worse than a crash: it
12
+ * satisfies every load balancer, container orchestrator, and smoke test we have, right
13
+ * up until the process restarts and every run, log, and artifact is gone. Failing at
14
+ * startup puts the problem where an operator will see it.
15
+ *
16
+ * A store that declares no backend is assumed durable - see StoreBackendInfo. This
17
+ * guard's job is to make our own defaults safe, not to audit somebody else's store.
18
+ */
19
+ export declare function assertDurableStore(store: SkillsProductStore, config: Pick<SkillsServerConfig, "allowEphemeralStore">): void;
20
+ /** The same refusal, expressed against a resolved target so it can run before anything opens. */
21
+ export declare function assertDurableTarget(target: {
22
+ durable: boolean;
23
+ label: string;
24
+ }, config: Pick<SkillsServerConfig, "allowEphemeralStore">): void;
25
+ export declare function createSkillsFetchHandler(options?: SkillsServerOptions): Promise<(request: Request) => Promise<Response>>;
26
+ export declare function startSkillsServer(options?: SkillsServerOptions): Promise<Bun.Server<undefined>>;
27
+ /**
28
+ * Socket-level body ceiling, derived from the same setting the publish route enforces.
29
+ *
30
+ * Without this the configured bundle limit was only ever advisory: Bun.serve defaults to
31
+ * 128 MB, a chunked request sends no Content-Length for the early check to read, and
32
+ * `request.formData()` materialises the whole body before any per-part check can run. So
33
+ * a 25 MB configured cap admitted 128 MB of buffered request per connection. This refuses
34
+ * it at the socket, before any of that is allocated.
35
+ *
36
+ * Exported so an embedder calling Bun.serve() with our fetch handler gets the same
37
+ * ceiling instead of silently inheriting the default.
38
+ */
39
+ export declare function skillsServeLimits(config: Pick<SkillsServerConfig, "skillBundleLimitBytes" | "requestBodyLimitBytes">): {
40
+ maxRequestBodySize: number;
41
+ };
42
+ export type { MemorySkillsStore };
@@ -0,0 +1,102 @@
1
+ import { type OwnedBytes } from "../lib/skill-bundle.js";
2
+ import type { BlobStorageKind, ServerArtifact, ServerRunRecord, ServerSkillBundle } from "./types.js";
3
+ export interface ArtifactBody {
4
+ relativePath: string;
5
+ bodyText: string;
6
+ contentType: string;
7
+ }
8
+ export interface ArtifactStorageOptions {
9
+ bucket?: string;
10
+ prefix?: string;
11
+ region?: string;
12
+ }
13
+ export declare class ArtifactStorage {
14
+ private bucket?;
15
+ private prefix;
16
+ private s3?;
17
+ constructor(options?: ArtifactStorageOptions);
18
+ get usesS3(): boolean;
19
+ /**
20
+ * Object key for a run artifact: `<prefix>/<tenantId>/<runId>/<relativePath>`.
21
+ * The tenant segment is structural, never optional - a bucket policy or a
22
+ * lifecycle rule can key on it, and two tenants can never share a key even
23
+ * when a run id were ever reused. `relativePath` is caller-supplied, so it is
24
+ * sanitised: leading slashes and `..` segments are removed, and anything that
25
+ * survives the sanitisation is what lands in the key.
26
+ */
27
+ objectKeyFor(tenantId: string, runId: string, relativePath: string): string;
28
+ /**
29
+ * Object key for a quarantined partial artifact: a sibling namespace under the
30
+ * same prefix, so one bucket policy covers both and the quarantine is visible
31
+ * in the object listing without any metadata join. Deliberately keyed by
32
+ * artifact id, not by the original relative path: the point of the move is
33
+ * that the artifact's original location no longer resolves.
34
+ */
35
+ quarantineKeyFor(tenantId: string, runId: string, artifactId: string): string;
36
+ materialize(run: ServerRunRecord, artifact: Omit<ServerArtifact, "createdAt" | "storageKind" | "storageKey" | "bodyText">, body: ArtifactBody): Promise<Omit<ServerArtifact, "createdAt">>;
37
+ readText(artifact: ServerArtifact): Promise<string | null>;
38
+ /**
39
+ * Place a skill bundle's bytes, returning where they went.
40
+ *
41
+ * Deliberately a second method on the same class rather than a second class: an
42
+ * operator configures one bucket and one prefix, and a bundle that silently went
43
+ * somewhere else than the run artifacts would be the kind of thing discovered during a
44
+ * restore. The key is content-addressed - the digest is the whole name - so unlike
45
+ * keyFor() there is no caller-supplied path component to sanitise, only a digest to
46
+ * refuse if it is not one.
47
+ *
48
+ * Binary throughout. `materialize()` above takes `bodyText: string` because a run
49
+ * artifact is a document; a skill bundle is a gzipped tar and there is no point in the
50
+ * pipeline where turning it into a string would be lossless.
51
+ */
52
+ putBundle(orgId: string, sha256: string, bytes: OwnedBytes, contentType?: string): Promise<{
53
+ storageKind: BlobStorageKind;
54
+ storageKey?: string;
55
+ bytes?: OwnedBytes;
56
+ }>;
57
+ /**
58
+ * Read a bundle back.
59
+ *
60
+ * Returns null when the bytes cannot be produced - an S3-backed row on a server with no
61
+ * bucket configured, or a row whose blob column is empty. Null is distinguishable from
62
+ * an empty bundle by the caller, which knows the recorded byteSize.
63
+ */
64
+ readBundle(bundle: ServerSkillBundle): Promise<OwnedBytes | null>;
65
+ /**
66
+ * Remove a bundle's object, if it had one.
67
+ *
68
+ * The store collects the *row* when nothing references a digest any more, but a row is
69
+ * only half of an S3-backed bundle. Without this the object stayed in the bucket after
70
+ * the user deleted the skill - unreachable, because the key lived in the row that is
71
+ * now gone, and therefore also uncollectable. That is a retention problem, not a leak
72
+ * you can clean up later.
73
+ *
74
+ * A no-op when nothing is configured, which is why the caller can invoke it
75
+ * unconditionally.
76
+ */
77
+ deleteBundle(orgId: string, sha256: string): Promise<void>;
78
+ /**
79
+ * Remove an artifact object, if it had one.
80
+ *
81
+ * The counterpart of deleteBundle for run artifacts: the row deletion is the
82
+ * governance store's job, but an S3-backed artifact is only gone when the
83
+ * object is gone. A no-op when nothing is configured, which is why the caller
84
+ * can invoke it unconditionally.
85
+ */
86
+ deleteObject(artifact: ServerArtifact): Promise<void>;
87
+ /**
88
+ * Move an artifact's object into the quarantine namespace.
89
+ *
90
+ * Cancellation quarantines partial artifacts before the run is marked
91
+ * cancelled, so a cancelled run's half-written outputs are neither served
92
+ * nor silently deleted: they sit under `.../quarantine/<tenant>/<run>/<id>`
93
+ * and are recorded in a quarantine receipt.
94
+ *
95
+ * Returns the new key, or null for a database-backed artifact (its body has
96
+ * no object to move; the row is marked by the receipt alone). A no-op for
97
+ * an artifact that has no storage key at all.
98
+ */
99
+ moveToQuarantine(artifact: ServerArtifact): Promise<string | null>;
100
+ private keyFor;
101
+ private bundleKeyFor;
102
+ }
@@ -0,0 +1,5 @@
1
+ import type { ApiPrincipal, SkillsProductStore } from "./types.js";
2
+ export declare function hashApiKey(token: string): string;
3
+ export declare function bearerToken(request: Request): string | null;
4
+ export declare function authenticateRequest(store: SkillsProductStore, request: Request): Promise<ApiPrincipal | null>;
5
+ export declare function publicPrincipal(partial?: Partial<ApiPrincipal>): ApiPrincipal;
@@ -0,0 +1,50 @@
1
+ export interface SkillsServerConfig {
2
+ host: string;
3
+ port: number;
4
+ databaseUrl?: string;
5
+ bootstrapApiKey?: string;
6
+ artifactBucket?: string;
7
+ artifactPrefix: string;
8
+ inlineWorker: boolean;
9
+ /**
10
+ * HMAC key for signing served skill bundles. When set, the bundle endpoint adds
11
+ * X-Skill-Bundle-Signature so clients holding the same key can verify that the bytes
12
+ * they pulled are the bytes this server decided to serve. Never logged or printed.
13
+ *
14
+ * Canonical env name: HASNA_SKILLS_API_SIGNING_KEY — the name the production deploy
15
+ * mounts (infra-live hasna-app module, infra/apps/skills/prod/main.tf). The legacy
16
+ * HASNA_SKILLS_SIGNING_KEY is retained as a backwards-compatible alias; the canonical
17
+ * name wins when both are set. Decision record: todos ee1904ca, plan 8022d27f.
18
+ */
19
+ bundleSigningKey?: string;
20
+ requestBodyLimitBytes: number;
21
+ /**
22
+ * Cap for a skill bundle upload, separate from requestBodyLimitBytes on purpose.
23
+ *
24
+ * requestBodyLimitBytes is 1 MB and guards JSON request bodies, where a megabyte of
25
+ * JSON is already pathological. A real skill with a references/ folder goes past that
26
+ * routinely, so publishing needed either a raised general cap - which would also have
27
+ * raised the ceiling on every JSON endpoint, quietly - or its own. This is the "its
28
+ * own": POST /api/v1/skills is the only route that reads it, it is checked before the
29
+ * body is buffered, and the JSON cap is untouched.
30
+ */
31
+ skillBundleLimitBytes: number;
32
+ /**
33
+ * How long a deleted skill answers 410 with a tombstone marker before it is purged
34
+ * (todos d061fcda). Within the window a client's pull can reconcile (remove its local
35
+ * copy); after it, the row and its bundle are gone and the slug is an ordinary 404.
36
+ */
37
+ tombstoneWindowMs: number;
38
+ publicBaseUrl: string;
39
+ nodeEnv: string;
40
+ /**
41
+ * Allow starting on a store that declares itself non-durable.
42
+ *
43
+ * Off by default, because "started fine, lost everything on restart" is the failure
44
+ * this whole change exists to remove. Tests and throwaway demos that genuinely want
45
+ * an in-process store set HASNA_SKILLS_ALLOW_EPHEMERAL_STORE=1 and own the
46
+ * consequence; nobody gets there by forgetting to configure a database.
47
+ */
48
+ allowEphemeralStore: boolean;
49
+ }
50
+ export declare function resolveServerConfig(env?: Record<string, string | undefined>): SkillsServerConfig;