@hasna/skills 0.1.61 → 0.1.63

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 (523) hide show
  1. package/README.md +10 -6
  2. package/bin/index.js +14271 -21602
  3. package/bin/mcp.js +3527 -11449
  4. package/bin/migrate.js +53 -3
  5. package/bin/server.js +5140 -2675
  6. package/bin/worker.js +4542 -2129
  7. package/dist/cli/commands/publish.d.ts +2 -0
  8. package/dist/cli/components/App.d.ts +2 -1
  9. package/dist/cli/components/CategorySelect.d.ts +2 -1
  10. package/dist/cli/components/Header.d.ts +2 -1
  11. package/dist/cli/components/InstallProgress.d.ts +2 -1
  12. package/dist/cli/components/SearchView.d.ts +2 -1
  13. package/dist/cli/components/SkillSelect.d.ts +2 -1
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.js +5094 -13755
  16. package/dist/lib/agent-sync.d.ts +38 -3
  17. package/dist/lib/home-adoption.d.ts +91 -0
  18. package/dist/lib/home-census.d.ts +22 -0
  19. package/dist/lib/home-migration.d.ts +61 -0
  20. package/dist/lib/portable-skills-files.d.ts +21 -1
  21. package/dist/lib/portable-skills-types.d.ts +46 -0
  22. package/dist/lib/pull.d.ts +66 -0
  23. package/dist/lib/remote-client.d.ts +6 -0
  24. package/dist/lib/run-state.d.ts +5 -0
  25. package/dist/lib/skill-bundles.d.ts +54 -0
  26. package/dist/lib/skill-contract.d.ts +35 -0
  27. package/dist/lib/skill-hash.d.ts +77 -0
  28. package/dist/sdk/cancel.d.ts +30 -0
  29. package/dist/sdk/dispatcher.d.ts +40 -0
  30. package/dist/sdk/event-sink.d.ts +2 -0
  31. package/dist/sdk/events.d.ts +79 -0
  32. package/dist/sdk/execution/admission.d.ts +44 -0
  33. package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
  34. package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
  35. package/dist/sdk/execution/image-profile.d.ts +73 -0
  36. package/dist/sdk/execution/index.d.ts +15 -0
  37. package/dist/sdk/execution/receipts.d.ts +44 -0
  38. package/dist/sdk/execution/state-machine.d.ts +38 -0
  39. package/dist/sdk/execution/storage.d.ts +158 -0
  40. package/dist/sdk/execution/types.d.ts +130 -0
  41. package/dist/sdk/executor.d.ts +17 -0
  42. package/dist/sdk/governance-store.d.ts +156 -0
  43. package/dist/sdk/governance.d.ts +92 -0
  44. package/dist/sdk/index.d.ts +26 -0
  45. package/dist/sdk/index.js +48730 -0
  46. package/dist/sdk/offline.d.ts +16 -0
  47. package/dist/sdk/outputs.d.ts +71 -0
  48. package/dist/sdk/registry.d.ts +28 -0
  49. package/dist/sdk/runs.d.ts +229 -0
  50. package/dist/sdk/server.d.ts +35 -0
  51. package/dist/sdk/spend.d.ts +36 -0
  52. package/dist/sdk/storage.d.ts +25 -0
  53. package/dist/server/app.d.ts +42 -0
  54. package/dist/server/artifact-storage.d.ts +102 -0
  55. package/dist/server/auth.d.ts +5 -0
  56. package/dist/server/config.d.ts +40 -0
  57. package/dist/server/database-url.d.ts +42 -0
  58. package/dist/server/handlers.d.ts +3 -0
  59. package/dist/server/index.d.ts +2 -0
  60. package/dist/server/migrate.d.ts +13 -0
  61. package/dist/server/migrations-dir.d.ts +18 -0
  62. package/dist/server/redaction.d.ts +1 -0
  63. package/dist/server/registry.d.ts +5 -0
  64. package/dist/server/rows.d.ts +23 -0
  65. package/dist/server/skills-api.d.ts +68 -0
  66. package/dist/server/sqlite-store.d.ts +114 -0
  67. package/dist/server/store-fixtures.d.ts +25 -0
  68. package/dist/server/store.d.ts +144 -0
  69. package/dist/server/types.d.ts +242 -0
  70. package/dist/server/worker.d.ts +4 -0
  71. package/dist/storage.js +32 -0
  72. package/docs/skill-standard.md +211 -39
  73. package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
  74. package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
  75. package/package.json +11 -8
  76. package/schemas/skill.schema.json +181 -0
  77. package/agent-skills/README.md +0 -41
  78. package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
  79. package/agent-skills/inbox/SKILL.md +0 -25
  80. package/agent-skills/inbox/scripts/inbox +0 -109
  81. package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
  82. package/agent-skills/inbox-monitor/SKILL.md +0 -41
  83. package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
  84. package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
  85. package/agent-skills/merge-pr/SKILL.md +0 -85
  86. package/agent-skills/merge-pr/references/merge-safety.md +0 -82
  87. package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
  88. package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
  89. package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
  90. package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
  91. package/agent-skills/skill-goal-execute/SKILL.md +0 -115
  92. package/agent-skills/skill-login/SKILL.md +0 -109
  93. package/agent-skills/skill-project-create/SKILL.md +0 -91
  94. package/agent-skills/skill-publish/SKILL.md +0 -207
  95. package/skills/_common/auth.ts +0 -45
  96. package/skills/_common/http-client.ts +0 -143
  97. package/skills/_common/index.ts +0 -26
  98. package/skills/_common/install.sh +0 -7
  99. package/skills/_common/installer.ts +0 -72
  100. package/skills/_common/skill-install.ts +0 -37
  101. package/skills/_common/vision.ts +0 -374
  102. package/skills/ad-creative-pack/SKILL.md +0 -55
  103. package/skills/ad-creative-pack/package.json +0 -10
  104. package/skills/analyze-data/CLAUDE.md +0 -16
  105. package/skills/analyze-data/SKILL.md +0 -112
  106. package/skills/analyze-data/package.json +0 -23
  107. package/skills/analyze-data/src/analysis.ts +0 -401
  108. package/skills/analyze-data/src/cli.ts +0 -66
  109. package/skills/analyze-data/src/formatters.ts +0 -235
  110. package/skills/analyze-data/src/index.ts +0 -74
  111. package/skills/analyze-data/src/logger.ts +0 -36
  112. package/skills/analyze-data/src/parsers.ts +0 -57
  113. package/skills/analyze-data/src/stats.ts +0 -151
  114. package/skills/analyze-data/src/types.ts +0 -85
  115. package/skills/analyze-data/tsconfig.json +0 -19
  116. package/skills/api-docs-portal/SKILL.md +0 -84
  117. package/skills/api-docs-portal/package.json +0 -35
  118. package/skills/api-docs-portal/src/index.ts +0 -919
  119. package/skills/api-docs-portal/tsconfig.json +0 -17
  120. package/skills/api-test-suite/CLAUDE.md +0 -19
  121. package/skills/api-test-suite/package.json +0 -27
  122. package/skills/api-test-suite/src/index.ts +0 -381
  123. package/skills/api-test-suite/tsconfig.json +0 -10
  124. package/skills/audio-extract/CLAUDE.md +0 -9
  125. package/skills/audio-extract/SKILL.md +0 -73
  126. package/skills/audio-extract/package.json +0 -23
  127. package/skills/audio-extract/src/index.ts +0 -323
  128. package/skills/audio-extract/tsconfig.json +0 -11
  129. package/skills/bio-sequence-tool/CLAUDE.md +0 -19
  130. package/skills/bio-sequence-tool/package.json +0 -27
  131. package/skills/bio-sequence-tool/src/index.ts +0 -85
  132. package/skills/bio-sequence-tool/tsconfig.json +0 -10
  133. package/skills/blog-article/CLAUDE.md +0 -12
  134. package/skills/blog-article/SKILL.md +0 -55
  135. package/skills/blog-article/package.json +0 -10
  136. package/skills/blog-article/tsconfig.json +0 -10
  137. package/skills/brand-assets/SKILL.md +0 -118
  138. package/skills/brand-assets/package.json +0 -35
  139. package/skills/brand-assets/src/cli.ts +0 -155
  140. package/skills/brand-assets/src/constants.ts +0 -8
  141. package/skills/brand-assets/src/extract.ts +0 -236
  142. package/skills/brand-assets/src/index.ts +0 -668
  143. package/skills/brand-assets/src/types.ts +0 -59
  144. package/skills/brand-assets/tsconfig.json +0 -17
  145. package/skills/brand-kit/SKILL.md +0 -54
  146. package/skills/brand-kit/package.json +0 -10
  147. package/skills/businessactivity/CLAUDE.md +0 -176
  148. package/skills/businessactivity/LICENSE +0 -192
  149. package/skills/businessactivity/README.md +0 -287
  150. package/skills/businessactivity/package.json +0 -25
  151. package/skills/businessactivity/scripts/publish.ts +0 -210
  152. package/skills/businessactivity/src/commands/activity.ts +0 -211
  153. package/skills/businessactivity/src/commands/function.ts +0 -227
  154. package/skills/businessactivity/src/commands/owner.ts +0 -193
  155. package/skills/businessactivity/src/commands/profile.ts +0 -121
  156. package/skills/businessactivity/src/commands/responsibility.ts +0 -264
  157. package/skills/businessactivity/src/commands/team.ts +0 -244
  158. package/skills/businessactivity/src/commands/workflow.ts +0 -359
  159. package/skills/businessactivity/src/index.ts +0 -3
  160. package/skills/businessactivity/src/lib/config.ts +0 -167
  161. package/skills/businessactivity/src/lib/output.ts +0 -76
  162. package/skills/businessactivity/src/lib/paths.ts +0 -79
  163. package/skills/businessactivity/src/lib/storage.ts +0 -95
  164. package/skills/businessactivity/src/types/index.ts +0 -86
  165. package/skills/businessactivity/tsconfig.json +0 -29
  166. package/skills/codefix/LICENSE +0 -192
  167. package/skills/codefix/README.md +0 -232
  168. package/skills/codefix/SKILL.md +0 -94
  169. package/skills/codefix/package.json +0 -21
  170. package/skills/codefix/src/fixers/batch.ts +0 -213
  171. package/skills/codefix/src/fixers/detector.ts +0 -160
  172. package/skills/codefix/src/fixers/index.ts +0 -7
  173. package/skills/codefix/src/fixers/runner.ts +0 -522
  174. package/skills/codefix/src/index-local.ts +0 -431
  175. package/skills/codefix/src/index.ts +0 -4
  176. package/skills/codefix/src/types.ts +0 -211
  177. package/skills/codefix/tsconfig.json +0 -15
  178. package/skills/commitpush/SKILL.md +0 -57
  179. package/skills/commitpush/package.json +0 -33
  180. package/skills/commitpush/src/index.ts +0 -34
  181. package/skills/commitpush/tsconfig.json +0 -17
  182. package/skills/commitpushpr/SKILL.md +0 -55
  183. package/skills/commitpushpr/package.json +0 -33
  184. package/skills/commitpushpr/src/index.ts +0 -34
  185. package/skills/commitpushpr/tsconfig.json +0 -17
  186. package/skills/compress-video/CLAUDE.md +0 -9
  187. package/skills/compress-video/SKILL.md +0 -79
  188. package/skills/compress-video/package.json +0 -23
  189. package/skills/compress-video/src/index.ts +0 -473
  190. package/skills/compress-video/tsconfig.json +0 -11
  191. package/skills/contract-review-report/SKILL.md +0 -52
  192. package/skills/contract-review-report/package.json +0 -10
  193. package/skills/customer-feedback-report/SKILL.md +0 -52
  194. package/skills/customer-feedback-report/package.json +0 -10
  195. package/skills/dashboard-builder/CLAUDE.md +0 -19
  196. package/skills/dashboard-builder/package.json +0 -29
  197. package/skills/dashboard-builder/src/index.ts +0 -150
  198. package/skills/dashboard-builder/tsconfig.json +0 -10
  199. package/skills/data-anonymizer/CLAUDE.md +0 -19
  200. package/skills/data-anonymizer/package.json +0 -27
  201. package/skills/data-anonymizer/src/index.ts +0 -183
  202. package/skills/data-anonymizer/tsconfig.json +0 -10
  203. package/skills/database-explorer/CLAUDE.md +0 -19
  204. package/skills/database-explorer/package.json +0 -29
  205. package/skills/database-explorer/src/index.ts +0 -95
  206. package/skills/database-explorer/tsconfig.json +0 -10
  207. package/skills/diff-viewer/CLAUDE.md +0 -19
  208. package/skills/diff-viewer/package.json +0 -30
  209. package/skills/diff-viewer/src/index.ts +0 -164
  210. package/skills/diff-viewer/tsconfig.json +0 -10
  211. package/skills/doc-read/SKILL.md +0 -45
  212. package/skills/doc-read/package.json +0 -29
  213. package/skills/doc-read/src/index.ts +0 -324
  214. package/skills/doc-read/tsconfig.json +0 -8
  215. package/skills/domainpurchase/LICENSE +0 -192
  216. package/skills/domainpurchase/SKILL.md +0 -29
  217. package/skills/domainpurchase/package.json +0 -30
  218. package/skills/domainpurchase/src/index.ts +0 -3
  219. package/skills/domainpurchase/tsconfig.json +0 -21
  220. package/skills/email-sequence/SKILL.md +0 -53
  221. package/skills/email-sequence/package.json +0 -10
  222. package/skills/experiment-power-calculator/CLAUDE.md +0 -19
  223. package/skills/experiment-power-calculator/package.json +0 -29
  224. package/skills/experiment-power-calculator/src/index.ts +0 -86
  225. package/skills/experiment-power-calculator/tsconfig.json +0 -10
  226. package/skills/extract-frames/CLAUDE.md +0 -19
  227. package/skills/extract-frames/package.json +0 -27
  228. package/skills/extract-frames/src/index.ts +0 -616
  229. package/skills/extract-frames/tsconfig.json +0 -10
  230. package/skills/file-organizer/CLAUDE.md +0 -19
  231. package/skills/file-organizer/package.json +0 -27
  232. package/skills/file-organizer/src/index.ts +0 -91
  233. package/skills/file-organizer/tsconfig.json +0 -10
  234. package/skills/folder-tree/CLAUDE.md +0 -19
  235. package/skills/folder-tree/package.json +0 -29
  236. package/skills/folder-tree/src/index.ts +0 -568
  237. package/skills/folder-tree/tsconfig.json +0 -10
  238. package/skills/form-filler/CLAUDE.md +0 -19
  239. package/skills/form-filler/package.json +0 -29
  240. package/skills/form-filler/src/index.ts +0 -81
  241. package/skills/form-filler/tsconfig.json +0 -10
  242. package/skills/generate-api-client/CLAUDE.md +0 -19
  243. package/skills/generate-api-client/package.json +0 -29
  244. package/skills/generate-api-client/src/generator.ts +0 -47
  245. package/skills/generate-api-client/src/index.ts +0 -92
  246. package/skills/generate-api-client/src/logger.ts +0 -34
  247. package/skills/generate-api-client/src/python-generator.ts +0 -245
  248. package/skills/generate-api-client/src/spec-loader.ts +0 -48
  249. package/skills/generate-api-client/src/type-mappers.ts +0 -79
  250. package/skills/generate-api-client/src/types.ts +0 -76
  251. package/skills/generate-api-client/src/typescript-generator.ts +0 -247
  252. package/skills/generate-api-client/tsconfig.json +0 -10
  253. package/skills/generate-chart/CLAUDE.md +0 -19
  254. package/skills/generate-chart/package.json +0 -27
  255. package/skills/generate-chart/src/index.ts +0 -510
  256. package/skills/generate-chart/tsconfig.json +0 -10
  257. package/skills/generate-dockerfile/CLAUDE.md +0 -19
  258. package/skills/generate-dockerfile/package.json +0 -27
  259. package/skills/generate-dockerfile/src/cli.ts +0 -78
  260. package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
  261. package/skills/generate-dockerfile/src/index.ts +0 -81
  262. package/skills/generate-dockerfile/src/logger.ts +0 -30
  263. package/skills/generate-dockerfile/src/project-detection.ts +0 -68
  264. package/skills/generate-dockerfile/src/support-files.ts +0 -171
  265. package/skills/generate-dockerfile/src/types.ts +0 -29
  266. package/skills/generate-dockerfile/tsconfig.json +0 -10
  267. package/skills/generate-env/CLAUDE.md +0 -19
  268. package/skills/generate-env/package.json +0 -29
  269. package/skills/generate-env/src/cli.ts +0 -85
  270. package/skills/generate-env/src/detection.ts +0 -161
  271. package/skills/generate-env/src/env-data.ts +0 -66
  272. package/skills/generate-env/src/generators.ts +0 -240
  273. package/skills/generate-env/src/index.ts +0 -120
  274. package/skills/generate-env/src/runtime.ts +0 -30
  275. package/skills/generate-env/src/types.ts +0 -32
  276. package/skills/generate-env/tsconfig.json +0 -10
  277. package/skills/generate-favicon/CLAUDE.md +0 -19
  278. package/skills/generate-favicon/package.json +0 -29
  279. package/skills/generate-favicon/src/index.ts +0 -421
  280. package/skills/generate-favicon/tsconfig.json +0 -10
  281. package/skills/generate-qrcode/CLAUDE.md +0 -19
  282. package/skills/generate-qrcode/package.json +0 -30
  283. package/skills/generate-qrcode/src/index.ts +0 -584
  284. package/skills/generate-qrcode/tsconfig.json +0 -10
  285. package/skills/generate-resume/CLAUDE.md +0 -19
  286. package/skills/generate-resume/package.json +0 -27
  287. package/skills/generate-resume/src/cli.ts +0 -157
  288. package/skills/generate-resume/src/index.ts +0 -178
  289. package/skills/generate-resume/src/parsers.ts +0 -95
  290. package/skills/generate-resume/src/renderers.ts +0 -538
  291. package/skills/generate-resume/src/security.ts +0 -39
  292. package/skills/generate-resume/src/types.ts +0 -86
  293. package/skills/generate-resume/tsconfig.json +0 -10
  294. package/skills/generate-sitemap/CLAUDE.md +0 -19
  295. package/skills/generate-sitemap/package.json +0 -27
  296. package/skills/generate-sitemap/src/index.ts +0 -626
  297. package/skills/generate-sitemap/tsconfig.json +0 -10
  298. package/skills/gif-maker/CLAUDE.md +0 -19
  299. package/skills/gif-maker/package.json +0 -30
  300. package/skills/gif-maker/src/index.ts +0 -600
  301. package/skills/gif-maker/tsconfig.json +0 -10
  302. package/skills/hook/LICENSE +0 -192
  303. package/skills/hook/README.md +0 -74
  304. package/skills/hook/SKILL.md +0 -85
  305. package/skills/hook/bunfig.toml +0 -5
  306. package/skills/hook/package.json +0 -28
  307. package/skills/hook/src/commands/create.ts +0 -112
  308. package/skills/hook/src/commands/events.ts +0 -37
  309. package/skills/hook/src/commands/validate.ts +0 -117
  310. package/skills/hook/src/index.ts +0 -118
  311. package/skills/hook/src/templates/root.ts +0 -196
  312. package/skills/hook/src/templates/source.ts +0 -647
  313. package/skills/hook/tsconfig.json +0 -18
  314. package/skills/http-server/CLAUDE.md +0 -19
  315. package/skills/http-server/package.json +0 -29
  316. package/skills/http-server/src/index.ts +0 -51
  317. package/skills/http-server/tsconfig.json +0 -10
  318. package/skills/implementation/LICENSE +0 -192
  319. package/skills/implementation/README.md +0 -53
  320. package/skills/implementation/SKILL.md +0 -57
  321. package/skills/implementation/bunfig.toml +0 -5
  322. package/skills/implementation/package.json +0 -28
  323. package/skills/implementation/src/commands/create.ts +0 -187
  324. package/skills/implementation/src/index.ts +0 -62
  325. package/skills/implementation/tsconfig.json +0 -18
  326. package/skills/implementation-plan/CLAUDE.md +0 -19
  327. package/skills/implementation-plan/package.json +0 -29
  328. package/skills/implementation-plan/src/index.ts +0 -520
  329. package/skills/implementation-plan/tsconfig.json +0 -10
  330. package/skills/implementation-todo/CLAUDE.md +0 -19
  331. package/skills/implementation-todo/package.json +0 -29
  332. package/skills/implementation-todo/src/index.ts +0 -429
  333. package/skills/implementation-todo/tsconfig.json +0 -10
  334. package/skills/invoice/.env.example +0 -3
  335. package/skills/invoice/CLAUDE.md +0 -31
  336. package/skills/invoice/LICENSE +0 -192
  337. package/skills/invoice/README.md +0 -70
  338. package/skills/invoice/package.json +0 -26
  339. package/skills/invoice/src/commands/companies.ts +0 -202
  340. package/skills/invoice/src/commands/config.ts +0 -132
  341. package/skills/invoice/src/commands/generate.ts +0 -177
  342. package/skills/invoice/src/commands/invoices.ts +0 -218
  343. package/skills/invoice/src/index.ts +0 -3
  344. package/skills/invoice/src/lib/api.ts +0 -124
  345. package/skills/invoice/src/lib/storage.ts +0 -171
  346. package/skills/invoice/src/types/index.ts +0 -86
  347. package/skills/invoice/src/utils/logger.ts +0 -33
  348. package/skills/invoice/src/utils/paths.ts +0 -25
  349. package/skills/invoice/tsconfig.json +0 -23
  350. package/skills/invoice-reconciliation/SKILL.md +0 -98
  351. package/skills/invoice-reconciliation/package.json +0 -36
  352. package/skills/invoice-reconciliation/src/index.ts +0 -743
  353. package/skills/invoice-reconciliation/tsconfig.json +0 -17
  354. package/skills/landing-page-pack/SKILL.md +0 -55
  355. package/skills/landing-page-pack/package.json +0 -10
  356. package/skills/latex-table-generator/CLAUDE.md +0 -19
  357. package/skills/latex-table-generator/package.json +0 -29
  358. package/skills/latex-table-generator/src/index.ts +0 -113
  359. package/skills/latex-table-generator/tsconfig.json +0 -10
  360. package/skills/logo-design/SKILL.md +0 -94
  361. package/skills/logo-design/package.json +0 -35
  362. package/skills/logo-design/src/cli.ts +0 -132
  363. package/skills/logo-design/src/constants.ts +0 -5
  364. package/skills/logo-design/src/docs.ts +0 -102
  365. package/skills/logo-design/src/geometry.ts +0 -324
  366. package/skills/logo-design/src/index.ts +0 -212
  367. package/skills/logo-design/src/palette.ts +0 -258
  368. package/skills/logo-design/src/types.ts +0 -50
  369. package/skills/logo-design/tsconfig.json +0 -17
  370. package/skills/lorem-generator/CLAUDE.md +0 -19
  371. package/skills/lorem-generator/package.json +0 -29
  372. package/skills/lorem-generator/src/index.ts +0 -59
  373. package/skills/lorem-generator/tsconfig.json +0 -10
  374. package/skills/managemcp/CLAUDE.md +0 -14
  375. package/skills/managemcp/README.md +0 -24
  376. package/skills/managemcp/package.json +0 -16
  377. package/skills/managemcp/src/index.ts +0 -3
  378. package/skills/managemcp/tsconfig.json +0 -27
  379. package/skills/markdown-validator/CLAUDE.md +0 -19
  380. package/skills/markdown-validator/package.json +0 -29
  381. package/skills/markdown-validator/src/index.ts +0 -92
  382. package/skills/markdown-validator/tsconfig.json +0 -10
  383. package/skills/market-research-report/SKILL.md +0 -51
  384. package/skills/market-research-report/package.json +0 -10
  385. package/skills/meeting-pack/SKILL.md +0 -52
  386. package/skills/meeting-pack/package.json +0 -10
  387. package/skills/merge-pdfs/CLAUDE.md +0 -19
  388. package/skills/merge-pdfs/package.json +0 -31
  389. package/skills/merge-pdfs/src/index.ts +0 -427
  390. package/skills/merge-pdfs/tsconfig.json +0 -10
  391. package/skills/migration-plan-pack/SKILL.md +0 -56
  392. package/skills/migration-plan-pack/package.json +0 -10
  393. package/skills/monitor/SKILL.md +0 -69
  394. package/skills/monitor/package.json +0 -33
  395. package/skills/monitor/src/index.ts +0 -34
  396. package/skills/monitor/tsconfig.json +0 -17
  397. package/skills/one-page-website/SKILL.md +0 -128
  398. package/skills/one-page-website/package.json +0 -34
  399. package/skills/one-page-website/src/design.ts +0 -336
  400. package/skills/one-page-website/src/docs.ts +0 -159
  401. package/skills/one-page-website/src/index.ts +0 -357
  402. package/skills/one-page-website/src/page.ts +0 -340
  403. package/skills/one-page-website/src/styles.ts +0 -508
  404. package/skills/one-page-website/src/types.ts +0 -78
  405. package/skills/one-page-website/tsconfig.json +0 -17
  406. package/skills/pdf-generate/CLAUDE.md +0 -19
  407. package/skills/pdf-generate/SKILL.md +0 -86
  408. package/skills/pdf-generate/package.json +0 -21
  409. package/skills/pdf-generate/src/cli.ts +0 -162
  410. package/skills/pdf-generate/src/html.ts +0 -84
  411. package/skills/pdf-generate/src/index.ts +0 -62
  412. package/skills/pdf-generate/src/markdown.ts +0 -27
  413. package/skills/pdf-generate/src/pdf-writer.ts +0 -78
  414. package/skills/pdf-generate/src/runtime.ts +0 -34
  415. package/skills/pdf-generate/src/security.ts +0 -37
  416. package/skills/pdf-generate/src/templates.ts +0 -311
  417. package/skills/pdf-generate/src/types.ts +0 -28
  418. package/skills/pdf-generate/tsconfig.json +0 -16
  419. package/skills/pdf-to-dataset/SKILL.md +0 -88
  420. package/skills/pdf-to-dataset/package.json +0 -37
  421. package/skills/pdf-to-dataset/src/index.ts +0 -790
  422. package/skills/pdf-to-dataset/tsconfig.json +0 -17
  423. package/skills/pdf-to-markdown/SKILL.md +0 -81
  424. package/skills/pdf-to-markdown/package.json +0 -35
  425. package/skills/pdf-to-markdown/src/index.ts +0 -694
  426. package/skills/pdf-to-markdown/tsconfig.json +0 -17
  427. package/skills/performance-audit-report/SKILL.md +0 -49
  428. package/skills/performance-audit-report/package.json +0 -10
  429. package/skills/pitch-deck/SKILL.md +0 -51
  430. package/skills/pitch-deck/package.json +0 -10
  431. package/skills/product-mockup/SKILL.md +0 -107
  432. package/skills/product-mockup/package.json +0 -32
  433. package/skills/product-mockup/src/cli.ts +0 -150
  434. package/skills/product-mockup/src/design.ts +0 -151
  435. package/skills/product-mockup/src/docs.ts +0 -134
  436. package/skills/product-mockup/src/index.ts +0 -182
  437. package/skills/product-mockup/src/render.ts +0 -407
  438. package/skills/product-mockup/src/types.ts +0 -66
  439. package/skills/product-mockup/tsconfig.json +0 -17
  440. package/skills/proposal-pack/SKILL.md +0 -53
  441. package/skills/proposal-pack/package.json +0 -10
  442. package/skills/read-csv/SKILL.md +0 -62
  443. package/skills/read-csv/package.json +0 -37
  444. package/skills/read-csv/src/index.ts +0 -356
  445. package/skills/read-csv/tsconfig.json +0 -17
  446. package/skills/read-excel/SKILL.md +0 -64
  447. package/skills/read-excel/package.json +0 -36
  448. package/skills/read-excel/src/index.ts +0 -266
  449. package/skills/read-excel/tsconfig.json +0 -17
  450. package/skills/regex-tester/CLAUDE.md +0 -19
  451. package/skills/regex-tester/package.json +0 -27
  452. package/skills/regex-tester/src/index.ts +0 -183
  453. package/skills/regex-tester/tsconfig.json +0 -10
  454. package/skills/repo-onboarding-report/SKILL.md +0 -52
  455. package/skills/repo-onboarding-report/package.json +0 -10
  456. package/skills/scancommitpr/SKILL.md +0 -178
  457. package/skills/scancommitpr/package.json +0 -34
  458. package/skills/scancommitpr/src/index.ts +0 -44
  459. package/skills/scancommitpr/tsconfig.json +0 -13
  460. package/skills/scancommitpush/SKILL.md +0 -174
  461. package/skills/scancommitpush/package.json +0 -32
  462. package/skills/scancommitpush/src/index.ts +0 -44
  463. package/skills/scancommitpush/tsconfig.json +0 -13
  464. package/skills/scientific-figure-check/CLAUDE.md +0 -19
  465. package/skills/scientific-figure-check/package.json +0 -29
  466. package/skills/scientific-figure-check/src/index.ts +0 -83
  467. package/skills/scientific-figure-check/tsconfig.json +0 -10
  468. package/skills/security-audit/CLAUDE.md +0 -19
  469. package/skills/security-audit/package.json +0 -27
  470. package/skills/security-audit/src/index.ts +0 -145
  471. package/skills/security-audit/tsconfig.json +0 -10
  472. package/skills/security-audit-report/SKILL.md +0 -52
  473. package/skills/security-audit-report/package.json +0 -10
  474. package/skills/seo-content-pack/SKILL.md +0 -54
  475. package/skills/seo-content-pack/package.json +0 -10
  476. package/skills/siteanalyze/SKILL.md +0 -25
  477. package/skills/siteanalyze/package.json +0 -27
  478. package/skills/siteanalyze/src/index.ts +0 -592
  479. package/skills/slide-deck-generator/SKILL.md +0 -93
  480. package/skills/slide-deck-generator/package.json +0 -38
  481. package/skills/slide-deck-generator/src/cli.ts +0 -133
  482. package/skills/slide-deck-generator/src/index.ts +0 -148
  483. package/skills/slide-deck-generator/src/model.ts +0 -307
  484. package/skills/slide-deck-generator/src/pptx.ts +0 -143
  485. package/skills/slide-deck-generator/src/render.ts +0 -248
  486. package/skills/slide-deck-generator/src/types.ts +0 -114
  487. package/skills/slide-deck-generator/src/utils.ts +0 -53
  488. package/skills/slide-deck-generator/tsconfig.json +0 -17
  489. package/skills/social-content-calendar/SKILL.md +0 -54
  490. package/skills/social-content-calendar/package.json +0 -10
  491. package/skills/split-pdf/CLAUDE.md +0 -19
  492. package/skills/split-pdf/package.json +0 -30
  493. package/skills/split-pdf/src/index.ts +0 -301
  494. package/skills/split-pdf/tsconfig.json +0 -10
  495. package/skills/statistical-test-selector/CLAUDE.md +0 -19
  496. package/skills/statistical-test-selector/package.json +0 -27
  497. package/skills/statistical-test-selector/src/index.ts +0 -75
  498. package/skills/statistical-test-selector/tsconfig.json +0 -10
  499. package/skills/test-suite-generator/SKILL.md +0 -51
  500. package/skills/test-suite-generator/package.json +0 -10
  501. package/skills/tmux-session/SKILL.md +0 -109
  502. package/skills/tmux-session/package.json +0 -33
  503. package/skills/tmux-session/src/index.ts +0 -34
  504. package/skills/tmux-session/tsconfig.json +0 -17
  505. package/skills/todos-plan/SKILL.md +0 -363
  506. package/skills/todos-plan/agents/openai.yaml +0 -4
  507. package/skills/todos-plan/package.json +0 -9
  508. package/skills/todos-plan/src/index.ts +0 -68
  509. package/skills/tsconfig.base.json +0 -12
  510. package/skills/validate-config/CLAUDE.md +0 -19
  511. package/skills/validate-config/package.json +0 -29
  512. package/skills/validate-config/src/index.ts +0 -56
  513. package/skills/validate-config/tsconfig.json +0 -10
  514. package/skills/video-downloader/CLAUDE.md +0 -19
  515. package/skills/video-downloader/package.json +0 -29
  516. package/skills/video-downloader/src/index.ts +0 -561
  517. package/skills/video-downloader/tsconfig.json +0 -10
  518. package/skills/video-highlight-pack/SKILL.md +0 -54
  519. package/skills/video-highlight-pack/package.json +0 -10
  520. package/skills/watermark/CLAUDE.md +0 -19
  521. package/skills/watermark/package.json +0 -32
  522. package/skills/watermark/src/index.ts +0 -587
  523. 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,40 @@
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. Read from
13
+ * HASNA_SKILLS_SIGNING_KEY; never logged or printed.
14
+ */
15
+ bundleSigningKey?: string;
16
+ requestBodyLimitBytes: number;
17
+ /**
18
+ * Cap for a skill bundle upload, separate from requestBodyLimitBytes on purpose.
19
+ *
20
+ * requestBodyLimitBytes is 1 MB and guards JSON request bodies, where a megabyte of
21
+ * JSON is already pathological. A real skill with a references/ folder goes past that
22
+ * routinely, so publishing needed either a raised general cap - which would also have
23
+ * raised the ceiling on every JSON endpoint, quietly - or its own. This is the "its
24
+ * own": POST /api/v1/skills is the only route that reads it, it is checked before the
25
+ * body is buffered, and the JSON cap is untouched.
26
+ */
27
+ skillBundleLimitBytes: number;
28
+ publicBaseUrl: string;
29
+ nodeEnv: string;
30
+ /**
31
+ * Allow starting on a store that declares itself non-durable.
32
+ *
33
+ * Off by default, because "started fine, lost everything on restart" is the failure
34
+ * this whole change exists to remove. Tests and throwaway demos that genuinely want
35
+ * an in-process store set HASNA_SKILLS_ALLOW_EPHEMERAL_STORE=1 and own the
36
+ * consequence; nobody gets there by forgetting to configure a database.
37
+ */
38
+ allowEphemeralStore: boolean;
39
+ }
40
+ export declare function resolveServerConfig(env?: Record<string, string | undefined>): SkillsServerConfig;