@hasna/skills 0.1.62 → 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.
- package/README.md +10 -6
- package/bin/index.js +14271 -21602
- package/bin/mcp.js +3527 -11449
- package/bin/migrate.js +53 -3
- package/bin/server.js +5140 -2675
- package/bin/worker.js +4542 -2129
- package/dist/cli/commands/publish.d.ts +2 -0
- package/dist/cli/components/App.d.ts +2 -1
- package/dist/cli/components/CategorySelect.d.ts +2 -1
- package/dist/cli/components/Header.d.ts +2 -1
- package/dist/cli/components/InstallProgress.d.ts +2 -1
- package/dist/cli/components/SearchView.d.ts +2 -1
- package/dist/cli/components/SkillSelect.d.ts +2 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5094 -13755
- package/dist/lib/agent-sync.d.ts +38 -3
- package/dist/lib/home-adoption.d.ts +91 -0
- package/dist/lib/home-census.d.ts +22 -0
- package/dist/lib/home-migration.d.ts +61 -0
- package/dist/lib/portable-skills-files.d.ts +21 -1
- package/dist/lib/portable-skills-types.d.ts +46 -0
- package/dist/lib/pull.d.ts +66 -0
- package/dist/lib/remote-client.d.ts +6 -0
- package/dist/lib/run-state.d.ts +5 -0
- package/dist/lib/skill-bundles.d.ts +54 -0
- package/dist/lib/skill-contract.d.ts +35 -0
- package/dist/lib/skill-hash.d.ts +77 -0
- package/dist/sdk/cancel.d.ts +30 -0
- package/dist/sdk/dispatcher.d.ts +40 -0
- package/dist/sdk/event-sink.d.ts +2 -0
- package/dist/sdk/events.d.ts +79 -0
- package/dist/sdk/execution/admission.d.ts +44 -0
- package/dist/sdk/execution/dispatchers/e2b.d.ts +17 -0
- package/dist/sdk/execution/dispatchers/ecs.d.ts +151 -0
- package/dist/sdk/execution/image-profile.d.ts +73 -0
- package/dist/sdk/execution/index.d.ts +15 -0
- package/dist/sdk/execution/receipts.d.ts +44 -0
- package/dist/sdk/execution/state-machine.d.ts +38 -0
- package/dist/sdk/execution/storage.d.ts +158 -0
- package/dist/sdk/execution/types.d.ts +130 -0
- package/dist/sdk/executor.d.ts +17 -0
- package/dist/sdk/governance-store.d.ts +156 -0
- package/dist/sdk/governance.d.ts +92 -0
- package/dist/sdk/index.d.ts +26 -0
- package/dist/sdk/index.js +48730 -0
- package/dist/sdk/offline.d.ts +16 -0
- package/dist/sdk/outputs.d.ts +71 -0
- package/dist/sdk/registry.d.ts +28 -0
- package/dist/sdk/runs.d.ts +229 -0
- package/dist/sdk/server.d.ts +35 -0
- package/dist/sdk/spend.d.ts +36 -0
- package/dist/sdk/storage.d.ts +25 -0
- package/dist/server/app.d.ts +42 -0
- package/dist/server/artifact-storage.d.ts +102 -0
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/config.d.ts +40 -0
- package/dist/server/database-url.d.ts +42 -0
- package/dist/server/handlers.d.ts +3 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/migrate.d.ts +13 -0
- package/dist/server/migrations-dir.d.ts +18 -0
- package/dist/server/redaction.d.ts +1 -0
- package/dist/server/registry.d.ts +5 -0
- package/dist/server/rows.d.ts +23 -0
- package/dist/server/skills-api.d.ts +68 -0
- package/dist/server/sqlite-store.d.ts +114 -0
- package/dist/server/store-fixtures.d.ts +25 -0
- package/dist/server/store.d.ts +144 -0
- package/dist/server/types.d.ts +242 -0
- package/dist/server/worker.d.ts +4 -0
- package/dist/storage.js +32 -0
- package/docs/skill-standard.md +211 -39
- package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
- package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
- package/package.json +11 -8
- package/schemas/skill.schema.json +181 -0
- package/agent-skills/README.md +0 -41
- package/agent-skills/fleet-package-rollout/SKILL.md +0 -169
- package/agent-skills/inbox/SKILL.md +0 -25
- package/agent-skills/inbox/scripts/inbox +0 -109
- package/agent-skills/inbox/tests/test_registered_sender_id.sh +0 -92
- package/agent-skills/inbox-monitor/SKILL.md +0 -41
- package/agent-skills/inbox-monitor/scripts/inbox_monitor.sh +0 -91
- package/agent-skills/inbox-monitor/scripts/test_inbox_monitor.sh +0 -71
- package/agent-skills/merge-pr/SKILL.md +0 -85
- package/agent-skills/merge-pr/references/merge-safety.md +0 -82
- package/agent-skills/merge-pr/scripts/merge_pr_guard.py +0 -694
- package/agent-skills/merge-pr/scripts/test_merge_pr_guard.py +0 -647
- package/agent-skills/merge-pr/tests/fixtures/multi-commit-synthesized.json +0 -28
- package/agent-skills/merge-pr/tests/fixtures/trailer-free-provider.json +0 -28
- package/agent-skills/skill-goal-execute/SKILL.md +0 -115
- package/agent-skills/skill-login/SKILL.md +0 -109
- package/agent-skills/skill-project-create/SKILL.md +0 -91
- package/agent-skills/skill-publish/SKILL.md +0 -254
- package/agent-skills/skill-publish/scripts/capture_registry.js +0 -47
- package/agent-skills/skill-publish/scripts/publish_with_git_head.sh +0 -143
- package/agent-skills/skill-publish/scripts/test_publish_with_git_head.sh +0 -231
- package/skills/_common/auth.ts +0 -45
- package/skills/_common/http-client.ts +0 -143
- package/skills/_common/index.ts +0 -26
- package/skills/_common/install.sh +0 -7
- package/skills/_common/installer.ts +0 -72
- package/skills/_common/skill-install.ts +0 -37
- package/skills/_common/vision.ts +0 -374
- package/skills/ad-creative-pack/SKILL.md +0 -55
- package/skills/ad-creative-pack/package.json +0 -10
- package/skills/analyze-data/CLAUDE.md +0 -16
- package/skills/analyze-data/SKILL.md +0 -112
- package/skills/analyze-data/package.json +0 -23
- package/skills/analyze-data/src/analysis.ts +0 -401
- package/skills/analyze-data/src/cli.ts +0 -66
- package/skills/analyze-data/src/formatters.ts +0 -235
- package/skills/analyze-data/src/index.ts +0 -74
- package/skills/analyze-data/src/logger.ts +0 -36
- package/skills/analyze-data/src/parsers.ts +0 -57
- package/skills/analyze-data/src/stats.ts +0 -151
- package/skills/analyze-data/src/types.ts +0 -85
- package/skills/analyze-data/tsconfig.json +0 -19
- package/skills/api-docs-portal/SKILL.md +0 -84
- package/skills/api-docs-portal/package.json +0 -35
- package/skills/api-docs-portal/src/index.ts +0 -919
- package/skills/api-docs-portal/tsconfig.json +0 -17
- package/skills/api-test-suite/CLAUDE.md +0 -19
- package/skills/api-test-suite/package.json +0 -27
- package/skills/api-test-suite/src/index.ts +0 -381
- package/skills/api-test-suite/tsconfig.json +0 -10
- package/skills/audio-extract/CLAUDE.md +0 -9
- package/skills/audio-extract/SKILL.md +0 -73
- package/skills/audio-extract/package.json +0 -23
- package/skills/audio-extract/src/index.ts +0 -323
- package/skills/audio-extract/tsconfig.json +0 -11
- package/skills/bio-sequence-tool/CLAUDE.md +0 -19
- package/skills/bio-sequence-tool/package.json +0 -27
- package/skills/bio-sequence-tool/src/index.ts +0 -85
- package/skills/bio-sequence-tool/tsconfig.json +0 -10
- package/skills/blog-article/CLAUDE.md +0 -12
- package/skills/blog-article/SKILL.md +0 -55
- package/skills/blog-article/package.json +0 -10
- package/skills/blog-article/tsconfig.json +0 -10
- package/skills/brand-assets/SKILL.md +0 -118
- package/skills/brand-assets/package.json +0 -35
- package/skills/brand-assets/src/cli.ts +0 -155
- package/skills/brand-assets/src/constants.ts +0 -8
- package/skills/brand-assets/src/extract.ts +0 -236
- package/skills/brand-assets/src/index.ts +0 -668
- package/skills/brand-assets/src/types.ts +0 -59
- package/skills/brand-assets/tsconfig.json +0 -17
- package/skills/brand-kit/SKILL.md +0 -54
- package/skills/brand-kit/package.json +0 -10
- package/skills/businessactivity/CLAUDE.md +0 -176
- package/skills/businessactivity/LICENSE +0 -192
- package/skills/businessactivity/README.md +0 -287
- package/skills/businessactivity/package.json +0 -25
- package/skills/businessactivity/scripts/publish.ts +0 -210
- package/skills/businessactivity/src/commands/activity.ts +0 -211
- package/skills/businessactivity/src/commands/function.ts +0 -227
- package/skills/businessactivity/src/commands/owner.ts +0 -193
- package/skills/businessactivity/src/commands/profile.ts +0 -121
- package/skills/businessactivity/src/commands/responsibility.ts +0 -264
- package/skills/businessactivity/src/commands/team.ts +0 -244
- package/skills/businessactivity/src/commands/workflow.ts +0 -359
- package/skills/businessactivity/src/index.ts +0 -3
- package/skills/businessactivity/src/lib/config.ts +0 -167
- package/skills/businessactivity/src/lib/output.ts +0 -76
- package/skills/businessactivity/src/lib/paths.ts +0 -79
- package/skills/businessactivity/src/lib/storage.ts +0 -95
- package/skills/businessactivity/src/types/index.ts +0 -86
- package/skills/businessactivity/tsconfig.json +0 -29
- package/skills/codefix/LICENSE +0 -192
- package/skills/codefix/README.md +0 -232
- package/skills/codefix/SKILL.md +0 -94
- package/skills/codefix/package.json +0 -21
- package/skills/codefix/src/fixers/batch.ts +0 -213
- package/skills/codefix/src/fixers/detector.ts +0 -160
- package/skills/codefix/src/fixers/index.ts +0 -7
- package/skills/codefix/src/fixers/runner.ts +0 -522
- package/skills/codefix/src/index-local.ts +0 -431
- package/skills/codefix/src/index.ts +0 -4
- package/skills/codefix/src/types.ts +0 -211
- package/skills/codefix/tsconfig.json +0 -15
- package/skills/commitpush/SKILL.md +0 -57
- package/skills/commitpush/package.json +0 -33
- package/skills/commitpush/src/index.ts +0 -34
- package/skills/commitpush/tsconfig.json +0 -17
- package/skills/commitpushpr/SKILL.md +0 -55
- package/skills/commitpushpr/package.json +0 -33
- package/skills/commitpushpr/src/index.ts +0 -34
- package/skills/commitpushpr/tsconfig.json +0 -17
- package/skills/compress-video/CLAUDE.md +0 -9
- package/skills/compress-video/SKILL.md +0 -79
- package/skills/compress-video/package.json +0 -23
- package/skills/compress-video/src/index.ts +0 -473
- package/skills/compress-video/tsconfig.json +0 -11
- package/skills/contract-review-report/SKILL.md +0 -52
- package/skills/contract-review-report/package.json +0 -10
- package/skills/customer-feedback-report/SKILL.md +0 -52
- package/skills/customer-feedback-report/package.json +0 -10
- package/skills/dashboard-builder/CLAUDE.md +0 -19
- package/skills/dashboard-builder/package.json +0 -29
- package/skills/dashboard-builder/src/index.ts +0 -150
- package/skills/dashboard-builder/tsconfig.json +0 -10
- package/skills/data-anonymizer/CLAUDE.md +0 -19
- package/skills/data-anonymizer/package.json +0 -27
- package/skills/data-anonymizer/src/index.ts +0 -183
- package/skills/data-anonymizer/tsconfig.json +0 -10
- package/skills/database-explorer/CLAUDE.md +0 -19
- package/skills/database-explorer/package.json +0 -29
- package/skills/database-explorer/src/index.ts +0 -95
- package/skills/database-explorer/tsconfig.json +0 -10
- package/skills/diff-viewer/CLAUDE.md +0 -19
- package/skills/diff-viewer/package.json +0 -30
- package/skills/diff-viewer/src/index.ts +0 -164
- package/skills/diff-viewer/tsconfig.json +0 -10
- package/skills/doc-read/SKILL.md +0 -45
- package/skills/doc-read/package.json +0 -29
- package/skills/doc-read/src/index.ts +0 -324
- package/skills/doc-read/tsconfig.json +0 -8
- package/skills/domainpurchase/LICENSE +0 -192
- package/skills/domainpurchase/SKILL.md +0 -29
- package/skills/domainpurchase/package.json +0 -30
- package/skills/domainpurchase/src/index.ts +0 -3
- package/skills/domainpurchase/tsconfig.json +0 -21
- package/skills/email-sequence/SKILL.md +0 -53
- package/skills/email-sequence/package.json +0 -10
- package/skills/experiment-power-calculator/CLAUDE.md +0 -19
- package/skills/experiment-power-calculator/package.json +0 -29
- package/skills/experiment-power-calculator/src/index.ts +0 -86
- package/skills/experiment-power-calculator/tsconfig.json +0 -10
- package/skills/extract-frames/CLAUDE.md +0 -19
- package/skills/extract-frames/package.json +0 -27
- package/skills/extract-frames/src/index.ts +0 -616
- package/skills/extract-frames/tsconfig.json +0 -10
- package/skills/file-organizer/CLAUDE.md +0 -19
- package/skills/file-organizer/package.json +0 -27
- package/skills/file-organizer/src/index.ts +0 -91
- package/skills/file-organizer/tsconfig.json +0 -10
- package/skills/folder-tree/CLAUDE.md +0 -19
- package/skills/folder-tree/package.json +0 -29
- package/skills/folder-tree/src/index.ts +0 -568
- package/skills/folder-tree/tsconfig.json +0 -10
- package/skills/form-filler/CLAUDE.md +0 -19
- package/skills/form-filler/package.json +0 -29
- package/skills/form-filler/src/index.ts +0 -81
- package/skills/form-filler/tsconfig.json +0 -10
- package/skills/generate-api-client/CLAUDE.md +0 -19
- package/skills/generate-api-client/package.json +0 -29
- package/skills/generate-api-client/src/generator.ts +0 -47
- package/skills/generate-api-client/src/index.ts +0 -92
- package/skills/generate-api-client/src/logger.ts +0 -34
- package/skills/generate-api-client/src/python-generator.ts +0 -245
- package/skills/generate-api-client/src/spec-loader.ts +0 -48
- package/skills/generate-api-client/src/type-mappers.ts +0 -79
- package/skills/generate-api-client/src/types.ts +0 -76
- package/skills/generate-api-client/src/typescript-generator.ts +0 -247
- package/skills/generate-api-client/tsconfig.json +0 -10
- package/skills/generate-chart/CLAUDE.md +0 -19
- package/skills/generate-chart/package.json +0 -27
- package/skills/generate-chart/src/index.ts +0 -510
- package/skills/generate-chart/tsconfig.json +0 -10
- package/skills/generate-dockerfile/CLAUDE.md +0 -19
- package/skills/generate-dockerfile/package.json +0 -27
- package/skills/generate-dockerfile/src/cli.ts +0 -78
- package/skills/generate-dockerfile/src/dockerfile-templates.ts +0 -392
- package/skills/generate-dockerfile/src/index.ts +0 -81
- package/skills/generate-dockerfile/src/logger.ts +0 -30
- package/skills/generate-dockerfile/src/project-detection.ts +0 -68
- package/skills/generate-dockerfile/src/support-files.ts +0 -171
- package/skills/generate-dockerfile/src/types.ts +0 -29
- package/skills/generate-dockerfile/tsconfig.json +0 -10
- package/skills/generate-env/CLAUDE.md +0 -19
- package/skills/generate-env/package.json +0 -29
- package/skills/generate-env/src/cli.ts +0 -85
- package/skills/generate-env/src/detection.ts +0 -161
- package/skills/generate-env/src/env-data.ts +0 -66
- package/skills/generate-env/src/generators.ts +0 -240
- package/skills/generate-env/src/index.ts +0 -120
- package/skills/generate-env/src/runtime.ts +0 -30
- package/skills/generate-env/src/types.ts +0 -32
- package/skills/generate-env/tsconfig.json +0 -10
- package/skills/generate-favicon/CLAUDE.md +0 -19
- package/skills/generate-favicon/package.json +0 -29
- package/skills/generate-favicon/src/index.ts +0 -421
- package/skills/generate-favicon/tsconfig.json +0 -10
- package/skills/generate-qrcode/CLAUDE.md +0 -19
- package/skills/generate-qrcode/package.json +0 -30
- package/skills/generate-qrcode/src/index.ts +0 -584
- package/skills/generate-qrcode/tsconfig.json +0 -10
- package/skills/generate-resume/CLAUDE.md +0 -19
- package/skills/generate-resume/package.json +0 -27
- package/skills/generate-resume/src/cli.ts +0 -157
- package/skills/generate-resume/src/index.ts +0 -178
- package/skills/generate-resume/src/parsers.ts +0 -95
- package/skills/generate-resume/src/renderers.ts +0 -538
- package/skills/generate-resume/src/security.ts +0 -39
- package/skills/generate-resume/src/types.ts +0 -86
- package/skills/generate-resume/tsconfig.json +0 -10
- package/skills/generate-sitemap/CLAUDE.md +0 -19
- package/skills/generate-sitemap/package.json +0 -27
- package/skills/generate-sitemap/src/index.ts +0 -626
- package/skills/generate-sitemap/tsconfig.json +0 -10
- package/skills/gif-maker/CLAUDE.md +0 -19
- package/skills/gif-maker/package.json +0 -30
- package/skills/gif-maker/src/index.ts +0 -600
- package/skills/gif-maker/tsconfig.json +0 -10
- package/skills/hook/LICENSE +0 -192
- package/skills/hook/README.md +0 -74
- package/skills/hook/SKILL.md +0 -85
- package/skills/hook/bunfig.toml +0 -5
- package/skills/hook/package.json +0 -28
- package/skills/hook/src/commands/create.ts +0 -112
- package/skills/hook/src/commands/events.ts +0 -37
- package/skills/hook/src/commands/validate.ts +0 -117
- package/skills/hook/src/index.ts +0 -118
- package/skills/hook/src/templates/root.ts +0 -196
- package/skills/hook/src/templates/source.ts +0 -647
- package/skills/hook/tsconfig.json +0 -18
- package/skills/http-server/CLAUDE.md +0 -19
- package/skills/http-server/package.json +0 -29
- package/skills/http-server/src/index.ts +0 -51
- package/skills/http-server/tsconfig.json +0 -10
- package/skills/implementation/LICENSE +0 -192
- package/skills/implementation/README.md +0 -53
- package/skills/implementation/SKILL.md +0 -57
- package/skills/implementation/bunfig.toml +0 -5
- package/skills/implementation/package.json +0 -28
- package/skills/implementation/src/commands/create.ts +0 -187
- package/skills/implementation/src/index.ts +0 -62
- package/skills/implementation/tsconfig.json +0 -18
- package/skills/implementation-plan/CLAUDE.md +0 -19
- package/skills/implementation-plan/package.json +0 -29
- package/skills/implementation-plan/src/index.ts +0 -520
- package/skills/implementation-plan/tsconfig.json +0 -10
- package/skills/implementation-todo/CLAUDE.md +0 -19
- package/skills/implementation-todo/package.json +0 -29
- package/skills/implementation-todo/src/index.ts +0 -429
- package/skills/implementation-todo/tsconfig.json +0 -10
- package/skills/invoice/.env.example +0 -3
- package/skills/invoice/CLAUDE.md +0 -31
- package/skills/invoice/LICENSE +0 -192
- package/skills/invoice/README.md +0 -70
- package/skills/invoice/package.json +0 -26
- package/skills/invoice/src/commands/companies.ts +0 -202
- package/skills/invoice/src/commands/config.ts +0 -132
- package/skills/invoice/src/commands/generate.ts +0 -177
- package/skills/invoice/src/commands/invoices.ts +0 -218
- package/skills/invoice/src/index.ts +0 -3
- package/skills/invoice/src/lib/api.ts +0 -124
- package/skills/invoice/src/lib/storage.ts +0 -171
- package/skills/invoice/src/types/index.ts +0 -86
- package/skills/invoice/src/utils/logger.ts +0 -33
- package/skills/invoice/src/utils/paths.ts +0 -25
- package/skills/invoice/tsconfig.json +0 -23
- package/skills/invoice-reconciliation/SKILL.md +0 -98
- package/skills/invoice-reconciliation/package.json +0 -36
- package/skills/invoice-reconciliation/src/index.ts +0 -743
- package/skills/invoice-reconciliation/tsconfig.json +0 -17
- package/skills/landing-page-pack/SKILL.md +0 -55
- package/skills/landing-page-pack/package.json +0 -10
- package/skills/latex-table-generator/CLAUDE.md +0 -19
- package/skills/latex-table-generator/package.json +0 -29
- package/skills/latex-table-generator/src/index.ts +0 -113
- package/skills/latex-table-generator/tsconfig.json +0 -10
- package/skills/logo-design/SKILL.md +0 -94
- package/skills/logo-design/package.json +0 -35
- package/skills/logo-design/src/cli.ts +0 -132
- package/skills/logo-design/src/constants.ts +0 -5
- package/skills/logo-design/src/docs.ts +0 -102
- package/skills/logo-design/src/geometry.ts +0 -324
- package/skills/logo-design/src/index.ts +0 -212
- package/skills/logo-design/src/palette.ts +0 -258
- package/skills/logo-design/src/types.ts +0 -50
- package/skills/logo-design/tsconfig.json +0 -17
- package/skills/lorem-generator/CLAUDE.md +0 -19
- package/skills/lorem-generator/package.json +0 -29
- package/skills/lorem-generator/src/index.ts +0 -59
- package/skills/lorem-generator/tsconfig.json +0 -10
- package/skills/managemcp/CLAUDE.md +0 -14
- package/skills/managemcp/README.md +0 -24
- package/skills/managemcp/package.json +0 -16
- package/skills/managemcp/src/index.ts +0 -3
- package/skills/managemcp/tsconfig.json +0 -27
- package/skills/markdown-validator/CLAUDE.md +0 -19
- package/skills/markdown-validator/package.json +0 -29
- package/skills/markdown-validator/src/index.ts +0 -92
- package/skills/markdown-validator/tsconfig.json +0 -10
- package/skills/market-research-report/SKILL.md +0 -51
- package/skills/market-research-report/package.json +0 -10
- package/skills/meeting-pack/SKILL.md +0 -52
- package/skills/meeting-pack/package.json +0 -10
- package/skills/merge-pdfs/CLAUDE.md +0 -19
- package/skills/merge-pdfs/package.json +0 -31
- package/skills/merge-pdfs/src/index.ts +0 -427
- package/skills/merge-pdfs/tsconfig.json +0 -10
- package/skills/migration-plan-pack/SKILL.md +0 -56
- package/skills/migration-plan-pack/package.json +0 -10
- package/skills/monitor/SKILL.md +0 -69
- package/skills/monitor/package.json +0 -33
- package/skills/monitor/src/index.ts +0 -34
- package/skills/monitor/tsconfig.json +0 -17
- package/skills/one-page-website/SKILL.md +0 -128
- package/skills/one-page-website/package.json +0 -34
- package/skills/one-page-website/src/design.ts +0 -336
- package/skills/one-page-website/src/docs.ts +0 -159
- package/skills/one-page-website/src/index.ts +0 -357
- package/skills/one-page-website/src/page.ts +0 -340
- package/skills/one-page-website/src/styles.ts +0 -508
- package/skills/one-page-website/src/types.ts +0 -78
- package/skills/one-page-website/tsconfig.json +0 -17
- package/skills/pdf-generate/CLAUDE.md +0 -19
- package/skills/pdf-generate/SKILL.md +0 -86
- package/skills/pdf-generate/package.json +0 -21
- package/skills/pdf-generate/src/cli.ts +0 -162
- package/skills/pdf-generate/src/html.ts +0 -84
- package/skills/pdf-generate/src/index.ts +0 -62
- package/skills/pdf-generate/src/markdown.ts +0 -27
- package/skills/pdf-generate/src/pdf-writer.ts +0 -78
- package/skills/pdf-generate/src/runtime.ts +0 -34
- package/skills/pdf-generate/src/security.ts +0 -37
- package/skills/pdf-generate/src/templates.ts +0 -311
- package/skills/pdf-generate/src/types.ts +0 -28
- package/skills/pdf-generate/tsconfig.json +0 -16
- package/skills/pdf-to-dataset/SKILL.md +0 -88
- package/skills/pdf-to-dataset/package.json +0 -37
- package/skills/pdf-to-dataset/src/index.ts +0 -790
- package/skills/pdf-to-dataset/tsconfig.json +0 -17
- package/skills/pdf-to-markdown/SKILL.md +0 -81
- package/skills/pdf-to-markdown/package.json +0 -35
- package/skills/pdf-to-markdown/src/index.ts +0 -694
- package/skills/pdf-to-markdown/tsconfig.json +0 -17
- package/skills/performance-audit-report/SKILL.md +0 -49
- package/skills/performance-audit-report/package.json +0 -10
- package/skills/pitch-deck/SKILL.md +0 -51
- package/skills/pitch-deck/package.json +0 -10
- package/skills/product-mockup/SKILL.md +0 -107
- package/skills/product-mockup/package.json +0 -32
- package/skills/product-mockup/src/cli.ts +0 -150
- package/skills/product-mockup/src/design.ts +0 -151
- package/skills/product-mockup/src/docs.ts +0 -134
- package/skills/product-mockup/src/index.ts +0 -182
- package/skills/product-mockup/src/render.ts +0 -407
- package/skills/product-mockup/src/types.ts +0 -66
- package/skills/product-mockup/tsconfig.json +0 -17
- package/skills/proposal-pack/SKILL.md +0 -53
- package/skills/proposal-pack/package.json +0 -10
- package/skills/read-csv/SKILL.md +0 -62
- package/skills/read-csv/package.json +0 -37
- package/skills/read-csv/src/index.ts +0 -356
- package/skills/read-csv/tsconfig.json +0 -17
- package/skills/read-excel/SKILL.md +0 -64
- package/skills/read-excel/package.json +0 -36
- package/skills/read-excel/src/index.ts +0 -266
- package/skills/read-excel/tsconfig.json +0 -17
- package/skills/regex-tester/CLAUDE.md +0 -19
- package/skills/regex-tester/package.json +0 -27
- package/skills/regex-tester/src/index.ts +0 -183
- package/skills/regex-tester/tsconfig.json +0 -10
- package/skills/repo-onboarding-report/SKILL.md +0 -52
- package/skills/repo-onboarding-report/package.json +0 -10
- package/skills/scancommitpr/SKILL.md +0 -178
- package/skills/scancommitpr/package.json +0 -34
- package/skills/scancommitpr/src/index.ts +0 -44
- package/skills/scancommitpr/tsconfig.json +0 -13
- package/skills/scancommitpush/SKILL.md +0 -174
- package/skills/scancommitpush/package.json +0 -32
- package/skills/scancommitpush/src/index.ts +0 -44
- package/skills/scancommitpush/tsconfig.json +0 -13
- package/skills/scientific-figure-check/CLAUDE.md +0 -19
- package/skills/scientific-figure-check/package.json +0 -29
- package/skills/scientific-figure-check/src/index.ts +0 -83
- package/skills/scientific-figure-check/tsconfig.json +0 -10
- package/skills/security-audit/CLAUDE.md +0 -19
- package/skills/security-audit/package.json +0 -27
- package/skills/security-audit/src/index.ts +0 -145
- package/skills/security-audit/tsconfig.json +0 -10
- package/skills/security-audit-report/SKILL.md +0 -52
- package/skills/security-audit-report/package.json +0 -10
- package/skills/seo-content-pack/SKILL.md +0 -54
- package/skills/seo-content-pack/package.json +0 -10
- package/skills/siteanalyze/SKILL.md +0 -25
- package/skills/siteanalyze/package.json +0 -27
- package/skills/siteanalyze/src/index.ts +0 -592
- package/skills/slide-deck-generator/SKILL.md +0 -93
- package/skills/slide-deck-generator/package.json +0 -38
- package/skills/slide-deck-generator/src/cli.ts +0 -133
- package/skills/slide-deck-generator/src/index.ts +0 -148
- package/skills/slide-deck-generator/src/model.ts +0 -307
- package/skills/slide-deck-generator/src/pptx.ts +0 -143
- package/skills/slide-deck-generator/src/render.ts +0 -248
- package/skills/slide-deck-generator/src/types.ts +0 -114
- package/skills/slide-deck-generator/src/utils.ts +0 -53
- package/skills/slide-deck-generator/tsconfig.json +0 -17
- package/skills/social-content-calendar/SKILL.md +0 -54
- package/skills/social-content-calendar/package.json +0 -10
- package/skills/split-pdf/CLAUDE.md +0 -19
- package/skills/split-pdf/package.json +0 -30
- package/skills/split-pdf/src/index.ts +0 -301
- package/skills/split-pdf/tsconfig.json +0 -10
- package/skills/statistical-test-selector/CLAUDE.md +0 -19
- package/skills/statistical-test-selector/package.json +0 -27
- package/skills/statistical-test-selector/src/index.ts +0 -75
- package/skills/statistical-test-selector/tsconfig.json +0 -10
- package/skills/test-suite-generator/SKILL.md +0 -51
- package/skills/test-suite-generator/package.json +0 -10
- package/skills/tmux-session/SKILL.md +0 -109
- package/skills/tmux-session/package.json +0 -33
- package/skills/tmux-session/src/index.ts +0 -34
- package/skills/tmux-session/tsconfig.json +0 -17
- package/skills/todos-plan/SKILL.md +0 -363
- package/skills/todos-plan/agents/openai.yaml +0 -4
- package/skills/todos-plan/package.json +0 -9
- package/skills/todos-plan/src/index.ts +0 -68
- package/skills/tsconfig.base.json +0 -12
- package/skills/validate-config/CLAUDE.md +0 -19
- package/skills/validate-config/package.json +0 -29
- package/skills/validate-config/src/index.ts +0 -56
- package/skills/validate-config/tsconfig.json +0 -10
- package/skills/video-downloader/CLAUDE.md +0 -19
- package/skills/video-downloader/package.json +0 -29
- package/skills/video-downloader/src/index.ts +0 -561
- package/skills/video-downloader/tsconfig.json +0 -10
- package/skills/video-highlight-pack/SKILL.md +0 -54
- package/skills/video-highlight-pack/package.json +0 -10
- package/skills/watermark/CLAUDE.md +0 -19
- package/skills/watermark/package.json +0 -32
- package/skills/watermark/src/index.ts +0 -587
- 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;
|