@hasna/skills 0.1.62 → 0.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -12
- package/bin/index.js +15743 -21709
- package/bin/mcp.js +3866 -11522
- package/bin/migrate.js +281 -35
- package/bin/server.js +5805 -2682
- package/bin/worker.js +5280 -2388
- package/dist/cli/commands/publish.d.ts +2 -0
- package/dist/cli/commands/registry-reconcile.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 +5 -2
- package/dist/index.js +5386 -13739
- package/dist/lib/agent-sync.d.ts +61 -6
- package/dist/lib/auth-store.d.ts +37 -0
- package/dist/lib/config.d.ts +51 -0
- package/dist/lib/home-adoption.d.ts +91 -0
- package/dist/lib/home-census.d.ts +26 -0
- package/dist/lib/home-migration.d.ts +60 -0
- package/dist/lib/native-storage.d.ts +1 -1
- package/dist/lib/portable-skills-files.d.ts +21 -1
- package/dist/lib/portable-skills-types.d.ts +46 -0
- package/dist/lib/portable-skills.d.ts +35 -6
- package/dist/lib/pull.d.ts +97 -0
- package/dist/lib/registry-reconcile.d.ts +114 -0
- package/dist/lib/registry.d.ts +7 -4
- package/dist/lib/remote-client.d.ts +124 -1
- package/dist/lib/remote-registry.d.ts +26 -0
- package/dist/lib/revision.d.ts +29 -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 +49728 -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 +50 -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 +24 -0
- package/dist/server/skills-api.d.ts +170 -0
- package/dist/server/sqlite-store.d.ts +131 -0
- package/dist/server/store-fixtures.d.ts +25 -0
- package/dist/server/store.d.ts +170 -0
- package/dist/server/types.d.ts +337 -0
- package/dist/server/worker.d.ts +4 -0
- package/dist/storage.js +39 -2
- package/docs/skill-standard.md +211 -39
- package/migrations/postgres/0003_run_outputs_governance.sql +83 -0
- package/migrations/postgres/0004_hosted_pins.sql +28 -0
- package/migrations/postgres/0005_revision_tombstone_registry.sql +37 -0
- package/migrations/postgres/0005_tag_projection.sql +36 -0
- package/migrations/sqlite/0003_run_outputs_governance.sql +58 -0
- package/migrations/sqlite/0004_hosted_pins.sql +21 -0
- package/migrations/sqlite/0005_revision_tombstone_registry.sql +18 -0
- package/migrations/sqlite/0005_tag_projection.sql +25 -0
- package/package.json +12 -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,30 @@
|
|
|
1
|
+
import type { ApiPrincipal, ServerArtifact, ServerRunRecord, SkillsProductStore } from "../server/types.js";
|
|
2
|
+
import type { GovernanceStore, LifecycleReceipt } from "./governance-store.js";
|
|
3
|
+
import type { RunObjectStore } from "./outputs.js";
|
|
4
|
+
export interface CancelOutcome {
|
|
5
|
+
run: ServerRunRecord;
|
|
6
|
+
/** The generation the cancellation fenced. */
|
|
7
|
+
fencedGeneration: number;
|
|
8
|
+
/** Artifacts moved to the quarantine prefix (or recorded for quarantine). */
|
|
9
|
+
quarantined: ServerArtifact[];
|
|
10
|
+
receipt: LifecycleReceipt;
|
|
11
|
+
/** True when the run was already terminal and cancellation was a no-op. */
|
|
12
|
+
alreadyTerminal: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface CancelServiceOptions {
|
|
15
|
+
store: SkillsProductStore;
|
|
16
|
+
governanceStore: GovernanceStore;
|
|
17
|
+
storage?: RunObjectStore;
|
|
18
|
+
}
|
|
19
|
+
export interface CancelService {
|
|
20
|
+
cancel(principal: ApiPrincipal, runId: string, requestedBy: string): Promise<CancelOutcome>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the cancel service.
|
|
24
|
+
*
|
|
25
|
+
* Requires a store that implements transitionRun (generation fencing). A store
|
|
26
|
+
* without one cannot cancel safely - an unfenced cancel would let the worker's
|
|
27
|
+
* late write move a cancelled run back to succeeded - so the service refuses
|
|
28
|
+
* with FENCING_UNSUPPORTED rather than pretending.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createCancelService(options: CancelServiceOptions): CancelService;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatcher adapter seam: how admitted runs leave this process.
|
|
3
|
+
*
|
|
4
|
+
* The interface is the contract — submit a run, cancel a run. The ECS adapter
|
|
5
|
+
* is the real implementation (execution/dispatchers/ecs.ts): CAS-claimed
|
|
6
|
+
* attempts, persisted launch intents, deterministic RunTask clientTokens, and
|
|
7
|
+
* lost-response reconciliation. The E2B lane is a typed stub pending the
|
|
8
|
+
* infinity integration.
|
|
9
|
+
*
|
|
10
|
+
* submit() takes the EXECUTION-domain admission (`FrozenAdmission`), whose
|
|
11
|
+
* `runId` (`run_<ts>_<hex>`) is the execution store's own key — NOT the
|
|
12
|
+
* server run record (`ServerRunRecord.id`, a UUID), which the execution store
|
|
13
|
+
* cannot resolve and would silently no-admit. Intended wiring: the
|
|
14
|
+
* POST /api/v1/runs handler creates a server run through `store.createRun`
|
|
15
|
+
* (billing/audit record, UUID id); the execution lane bridges it to this seam
|
|
16
|
+
* through `createSubmitRunService` (idempotent admission), which mints or
|
|
17
|
+
* returns the `FrozenAdmission`; then `dispatcher.submit(admission)` launches
|
|
18
|
+
* it. The bridge is mandatory — passing a server record here is a type error.
|
|
19
|
+
*/
|
|
20
|
+
import type { FrozenAdmission } from "./execution/types.js";
|
|
21
|
+
import { EcsDispatcher, E2bDispatcher } from "./execution/index.js";
|
|
22
|
+
export { EcsDispatcher, E2bDispatcher };
|
|
23
|
+
export type { EcsDispatcherConfig, EcsDispatcherOptions, EcsRunTaskClient, EcsRunTaskInput, EcsRunTaskResult, EcsTaskState, LaunchOutcome } from "./execution/dispatchers/ecs.js";
|
|
24
|
+
/** Outcome of a dispatch attempt. */
|
|
25
|
+
export interface DispatchResult {
|
|
26
|
+
accepted: boolean;
|
|
27
|
+
/** Where the run was dispatched to, when known. */
|
|
28
|
+
target?: string;
|
|
29
|
+
/** Human-readable detail, credential-free. */
|
|
30
|
+
detail?: string;
|
|
31
|
+
}
|
|
32
|
+
/** A dispatcher takes admitted execution runs and puts them in front of an executor. */
|
|
33
|
+
export interface Dispatcher {
|
|
34
|
+
submit(run: FrozenAdmission): Promise<DispatchResult>;
|
|
35
|
+
cancel(runId: string): Promise<DispatchResult>;
|
|
36
|
+
}
|
|
37
|
+
/** Raised by adapters whose launch machinery is not implemented yet. */
|
|
38
|
+
export declare class DispatcherNotImplementedError extends Error {
|
|
39
|
+
constructor(adapter: string, capability: string);
|
|
40
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run lifecycle events through @hasna/events — bounded metadata and stable
|
|
3
|
+
* pointers ONLY.
|
|
4
|
+
*
|
|
5
|
+
* The boundary is structural: buildRunLifecycleEvent starts from an allowlist
|
|
6
|
+
* of fields (run_id, skill, version, status, timestamps, correlation_id,
|
|
7
|
+
* attempt/lease pointers) and validateRunLifecycleEvent refuses anything else
|
|
8
|
+
* before it can be emitted - unknown keys, nested payloads, and any value that
|
|
9
|
+
* matches the credential patterns. Raw logs, artifact payloads, and inputs
|
|
10
|
+
* cannot reach the event bus by construction, and the negative fixture proves
|
|
11
|
+
* the guard fires rather than being asserted by prose.
|
|
12
|
+
*/
|
|
13
|
+
import { type EventEnvelope } from "@hasna/events";
|
|
14
|
+
import type { ServerRunRecord } from "../server/types.js";
|
|
15
|
+
export declare const RUN_LIFECYCLE_EVENT_TYPES: readonly ["skills.run.admitted", "skills.run.started", "skills.run.terminal", "skills.run.cancelled"];
|
|
16
|
+
export type RunLifecycleEventType = (typeof RUN_LIFECYCLE_EVENT_TYPES)[number];
|
|
17
|
+
/**
|
|
18
|
+
* The full allowlist of data fields a run lifecycle event may carry.
|
|
19
|
+
*
|
|
20
|
+
* Every field is either a stable pointer or bounded metadata. Anything not in
|
|
21
|
+
* this list is a payload violation; any value matching the redaction patterns
|
|
22
|
+
* is a secret leak. Both checks run before emission.
|
|
23
|
+
*/
|
|
24
|
+
export declare const RUN_LIFECYCLE_EVENT_FIELDS: readonly ["run_id", "attempt_id", "lease_generation", "correlation_id", "skill", "version", "status", "at"];
|
|
25
|
+
export interface RunLifecycleEventData {
|
|
26
|
+
run_id: string;
|
|
27
|
+
attempt_id: string;
|
|
28
|
+
lease_generation: number;
|
|
29
|
+
correlation_id?: string;
|
|
30
|
+
skill: string;
|
|
31
|
+
version?: string;
|
|
32
|
+
status: string;
|
|
33
|
+
at: string;
|
|
34
|
+
/**
|
|
35
|
+
* @hasna/events constrains event data to Record<string, unknown>. The index
|
|
36
|
+
* signature is required to satisfy it; the RUNTIME allowlist is the guard
|
|
37
|
+
* that actually bounds the payload (see RUN_LIFECYCLE_EVENT_FIELDS and
|
|
38
|
+
* validateRunLifecycleEvent) - this type cannot be the fence, only the
|
|
39
|
+
* shape of the legitimate payload.
|
|
40
|
+
*/
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
/** Build a bounded lifecycle event envelope for a run state. Never carries inputs, logs, or payloads. */
|
|
44
|
+
export declare function buildRunLifecycleEvent(type: RunLifecycleEventType, run: Pick<ServerRunRecord, "id" | "skill" | "status" | "correlationId" | "leaseGeneration" | "createdAt" | "completedAt">, options?: {
|
|
45
|
+
version?: string;
|
|
46
|
+
at?: string;
|
|
47
|
+
source?: string;
|
|
48
|
+
}): EventEnvelope<RunLifecycleEventData>;
|
|
49
|
+
/**
|
|
50
|
+
* Refuse any event payload that is not bounded metadata + stable pointers.
|
|
51
|
+
*
|
|
52
|
+
* Rejects, with EVENT_PAYLOAD_REJECTED:
|
|
53
|
+
* - unknown top-level data keys (an input, a log array, an artifact body);
|
|
54
|
+
* - non-scalar values outside the allowlist;
|
|
55
|
+
* - any value whose text matches the credential patterns.
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateRunLifecycleEvent(event: EventEnvelope<RunLifecycleEventData>): void;
|
|
58
|
+
/** A sink for lifecycle events; swap in a recording sink in tests. */
|
|
59
|
+
export type RunEventSink = (event: EventEnvelope<RunLifecycleEventData>) => Promise<void>;
|
|
60
|
+
export interface RunEventEmitterOptions {
|
|
61
|
+
/** Emission sink. Defaults to @hasna/events' EventsClient over a JsonEventsStore. */
|
|
62
|
+
sink?: RunEventSink;
|
|
63
|
+
versionFor?: (run: Pick<ServerRunRecord, "skill">) => Promise<string | undefined>;
|
|
64
|
+
/** When false (default), a sink failure is reported but never fails the run transition. */
|
|
65
|
+
failOpen?: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface RunEventEmitter {
|
|
68
|
+
emit(type: RunLifecycleEventType, run: ServerRunRecord): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Emit one validated lifecycle event.
|
|
72
|
+
*
|
|
73
|
+
* Validation is mandatory and runs before the sink is touched; a payload that
|
|
74
|
+
* fails validation throws EVEN when failOpen is set - a secret must never be
|
|
75
|
+
* dropped into a fail-open hole. Sink failures (an unreachable events store)
|
|
76
|
+
* are reported via the returned boolean / an optional error and do not fail
|
|
77
|
+
* the run itself, because a run that succeeded is still a run that succeeded.
|
|
78
|
+
*/
|
|
79
|
+
export declare function createRunEventEmitter(options?: RunEventEmitterOptions): RunEventEmitter;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotent admission: the submitRun service.
|
|
3
|
+
*
|
|
4
|
+
* Every input that must not change between attempts is frozen into the
|
|
5
|
+
* admission record under one stable run_id: tenant, skill id + version,
|
|
6
|
+
* canonical bundle digest, runtime-image digest, input digest, and the policy
|
|
7
|
+
* + limits the run executes under. A duplicate submission — same
|
|
8
|
+
* Idempotency-Key, or the same (tenant, skill, version, bundle digest, input
|
|
9
|
+
* digest) tuple — returns the existing run instead of minting a second one.
|
|
10
|
+
*/
|
|
11
|
+
import type { ImageProfileRegistry } from "./image-profile.js";
|
|
12
|
+
import type { RunExecutionStore } from "./storage.js";
|
|
13
|
+
import { type FrozenAdmission, type RunLimits, type RunPolicy, type RuntimeName } from "./types.js";
|
|
14
|
+
export interface SubmitRunInput {
|
|
15
|
+
tenantId: string;
|
|
16
|
+
skillId: string;
|
|
17
|
+
skillVersion: string;
|
|
18
|
+
/** Canonical sha256 of the skill bundle. */
|
|
19
|
+
bundleDigest: string;
|
|
20
|
+
input: unknown;
|
|
21
|
+
idempotencyKey: string;
|
|
22
|
+
runtime: RuntimeName;
|
|
23
|
+
/** system_deps declared by the skill manifest. */
|
|
24
|
+
systemDeps?: string[];
|
|
25
|
+
policy?: Partial<RunPolicy>;
|
|
26
|
+
limits?: Partial<RunLimits>;
|
|
27
|
+
}
|
|
28
|
+
export interface SubmitRunResult {
|
|
29
|
+
run: FrozenAdmission;
|
|
30
|
+
created: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare const DEFAULT_RUN_POLICY: RunPolicy;
|
|
33
|
+
export declare const DEFAULT_RUN_LIMITS: RunLimits;
|
|
34
|
+
export interface SubmitRunService {
|
|
35
|
+
submit(input: SubmitRunInput): Promise<SubmitRunResult>;
|
|
36
|
+
}
|
|
37
|
+
export interface SubmitRunServiceOptions {
|
|
38
|
+
store: RunExecutionStore;
|
|
39
|
+
imageProfiles: ImageProfileRegistry;
|
|
40
|
+
now?: () => Date;
|
|
41
|
+
}
|
|
42
|
+
export declare function createSubmitRunService(options: SubmitRunServiceOptions): SubmitRunService;
|
|
43
|
+
/** Canonical digest of a run input: stable serialization, sha256. */
|
|
44
|
+
export declare function digestInput(input: unknown): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2B-lane dispatcher stub.
|
|
3
|
+
*
|
|
4
|
+
* Implements the sdk `Dispatcher` interface with submit/cancel typed and
|
|
5
|
+
* present, but the launch machinery is NOT built: the latency-sensitive E2B
|
|
6
|
+
* lane is a TODO for the infinity integration (plan P5: "Fargate RunTask
|
|
7
|
+
* first, E2B second"). Every call fails closed with `accepted: false` — a
|
|
8
|
+
* run is never reported as dispatched by a lane that cannot dispatch it.
|
|
9
|
+
*/
|
|
10
|
+
import type { DispatchResult, Dispatcher } from "../../dispatcher.js";
|
|
11
|
+
import type { FrozenAdmission } from "../types.js";
|
|
12
|
+
/** Marker so callers and tests can detect the unimplemented lane by type. */
|
|
13
|
+
export declare const E2B_LANE_STATUS: "e2b-lane-todo-infinity";
|
|
14
|
+
export declare class E2bDispatcher implements Dispatcher {
|
|
15
|
+
submit(_run: FrozenAdmission): Promise<DispatchResult>;
|
|
16
|
+
cancel(_runId: string): Promise<DispatchResult>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ECS dispatcher adapter.
|
|
3
|
+
*
|
|
4
|
+
* Implements the sdk `Dispatcher` interface (submit/cancel) with the launch
|
|
5
|
+
* machinery the interface seam leaves to this module:
|
|
6
|
+
*
|
|
7
|
+
* 1. CAS-claim the next attempt's `attempt_id` + `lease_generation`
|
|
8
|
+
* (stale generation rejected),
|
|
9
|
+
* 2. persist the launch intent (clientToken, startedBy, request digest)
|
|
10
|
+
* BEFORE calling ECS,
|
|
11
|
+
* 3. call RunTask with a deterministic clientToken derived from
|
|
12
|
+
* (run_id, attempt_id) and an immutable request digest,
|
|
13
|
+
* 4. on a lost RunTask response, reconcile the SAME token — list tasks by
|
|
14
|
+
* startedBy, describe them — before any new attempt; a new attempt is
|
|
15
|
+
* forbidden until the previous launch is proven absent or terminal.
|
|
16
|
+
*
|
|
17
|
+
* The AWS SDK is never called from tests: the `EcsRunTaskClient` interface is
|
|
18
|
+
* the seam, `createAwsEcsClient` is the only place the real SDK is imported,
|
|
19
|
+
* and every test injects a mock client.
|
|
20
|
+
*
|
|
21
|
+
* Nothing here names a concrete cluster, task definition, subnet, or account:
|
|
22
|
+
* all infrastructure identifiers come from configuration (R4).
|
|
23
|
+
*/
|
|
24
|
+
import type { DispatchResult, Dispatcher } from "../../dispatcher.js";
|
|
25
|
+
import type { RunExecutionStore } from "../storage.js";
|
|
26
|
+
import type { AttemptRecord, FrozenAdmission } from "../types.js";
|
|
27
|
+
import { type RunStateMachine } from "../state-machine.js";
|
|
28
|
+
import { type ReceiptService } from "../receipts.js";
|
|
29
|
+
/** ClientToken bound: ECS RunTask accepts up to 32 ASCII characters. */
|
|
30
|
+
export declare const CLIENT_TOKEN_BYTES = 16;
|
|
31
|
+
export interface EcsTaskState {
|
|
32
|
+
taskArn: string;
|
|
33
|
+
lastStatus: string;
|
|
34
|
+
/** Set when the task reached a terminal status. */
|
|
35
|
+
stopCode?: string | null;
|
|
36
|
+
exitCode?: number | null;
|
|
37
|
+
}
|
|
38
|
+
export interface EcsRunTaskInput {
|
|
39
|
+
cluster: string;
|
|
40
|
+
taskDefinition: string;
|
|
41
|
+
containerName: string;
|
|
42
|
+
clientToken: string;
|
|
43
|
+
startedBy: string;
|
|
44
|
+
launchType: "FARGATE";
|
|
45
|
+
cpu: string;
|
|
46
|
+
memory: string;
|
|
47
|
+
subnets: string[];
|
|
48
|
+
securityGroups: string[];
|
|
49
|
+
environment: {
|
|
50
|
+
name: string;
|
|
51
|
+
value: string;
|
|
52
|
+
}[];
|
|
53
|
+
}
|
|
54
|
+
export interface EcsRunTaskResult {
|
|
55
|
+
taskArn: string;
|
|
56
|
+
}
|
|
57
|
+
/** The seam every test mocks; the real implementation lives in createAwsEcsClient. */
|
|
58
|
+
export interface EcsRunTaskClient {
|
|
59
|
+
runTask(input: EcsRunTaskInput): Promise<EcsRunTaskResult>;
|
|
60
|
+
/** Task arns launched with a given startedBy token. */
|
|
61
|
+
listTasksByStartedBy(startedBy: string): Promise<string[]>;
|
|
62
|
+
describeTasks(taskArns: string[]): Promise<EcsTaskState[]>;
|
|
63
|
+
stopTask(taskArn: string): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
export interface EcsDispatcherConfig {
|
|
66
|
+
cluster: string;
|
|
67
|
+
taskDefinition: string;
|
|
68
|
+
containerName: string;
|
|
69
|
+
subnets: string[];
|
|
70
|
+
securityGroups: string[];
|
|
71
|
+
region: string;
|
|
72
|
+
}
|
|
73
|
+
export interface EcsDispatcherOptions {
|
|
74
|
+
store: RunExecutionStore;
|
|
75
|
+
stateMachine?: RunStateMachine;
|
|
76
|
+
receipts?: ReceiptService;
|
|
77
|
+
/** Claim identity; defaults to "dispatcher". */
|
|
78
|
+
workerId?: string;
|
|
79
|
+
now?: () => Date;
|
|
80
|
+
}
|
|
81
|
+
export type LaunchOutcome = {
|
|
82
|
+
kind: "launched";
|
|
83
|
+
attemptId: string;
|
|
84
|
+
taskId: string;
|
|
85
|
+
} | {
|
|
86
|
+
kind: "already-launched";
|
|
87
|
+
attemptId: string;
|
|
88
|
+
taskId: string;
|
|
89
|
+
} | {
|
|
90
|
+
kind: "previous-terminal";
|
|
91
|
+
attemptId: string;
|
|
92
|
+
} | {
|
|
93
|
+
kind: "ambiguous";
|
|
94
|
+
attemptId: string;
|
|
95
|
+
} | {
|
|
96
|
+
kind: "launch-failed-absent";
|
|
97
|
+
attemptId: string;
|
|
98
|
+
} | {
|
|
99
|
+
kind: "claim-refused";
|
|
100
|
+
attemptId: string;
|
|
101
|
+
reason: string;
|
|
102
|
+
} | {
|
|
103
|
+
kind: "no-admission";
|
|
104
|
+
} | {
|
|
105
|
+
kind: "run-terminal";
|
|
106
|
+
status: string;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Deterministic ECS clientToken derived from (run_id, attempt_id). Same input
|
|
110
|
+
* always yields the same token, so a retried or reconciled launch is
|
|
111
|
+
* idempotent from ECS's point of view.
|
|
112
|
+
*/
|
|
113
|
+
export declare function clientTokenFor(runId: string, attemptId: string): string;
|
|
114
|
+
/** startedBy token, the durable handle reconciliation lists tasks by. */
|
|
115
|
+
export declare function startedByFor(runId: string, attemptNumber: number): string;
|
|
116
|
+
/** Immutable digest of the frozen request this attempt launches. */
|
|
117
|
+
export declare function requestDigestFor(admission: FrozenAdmission, attemptId: string): string;
|
|
118
|
+
export declare class EcsDispatcher implements Dispatcher {
|
|
119
|
+
private readonly config;
|
|
120
|
+
private readonly client;
|
|
121
|
+
private readonly store;
|
|
122
|
+
private readonly stateMachine;
|
|
123
|
+
private readonly receipts;
|
|
124
|
+
private readonly workerId;
|
|
125
|
+
private readonly now;
|
|
126
|
+
constructor(config: EcsDispatcherConfig, client: EcsRunTaskClient, options: EcsDispatcherOptions);
|
|
127
|
+
/** sdk Dispatcher surface: submit an ADMITTED run (execution domain) to the launch machinery. */
|
|
128
|
+
submit(run: FrozenAdmission): Promise<DispatchResult>;
|
|
129
|
+
/** sdk Dispatcher surface: fence the current generation and stop the task. */
|
|
130
|
+
cancel(runId: string): Promise<DispatchResult>;
|
|
131
|
+
/**
|
|
132
|
+
* Launch the next attempt of a run.
|
|
133
|
+
*
|
|
134
|
+
* A previous attempt whose launch outcome is unknown (launching / ambiguous /
|
|
135
|
+
* launched) is reconciled FIRST. Only when the previous launch is proven
|
|
136
|
+
* absent or terminal is a new attempt minted and claimed.
|
|
137
|
+
*/
|
|
138
|
+
launchAttempt(runId: string): Promise<LaunchOutcome>;
|
|
139
|
+
/** Reconcile an attempt whose launch outcome is unknown. */
|
|
140
|
+
reconcile(admission: FrozenAdmission, attempt: AttemptRecord): Promise<LaunchOutcome>;
|
|
141
|
+
/** Resolve the task arn for the current attempt, reconciling if needed. */
|
|
142
|
+
private resolveTaskArn;
|
|
143
|
+
private runTaskInput;
|
|
144
|
+
private writeCancellationReceipt;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* The one place the real AWS SDK is wired in. Returns a client bound to the
|
|
148
|
+
* configured region; credentials resolve through the standard SDK chain.
|
|
149
|
+
* Tests never construct this — they inject a mock `EcsRunTaskClient`.
|
|
150
|
+
*/
|
|
151
|
+
export declare function createAwsEcsClient(region: string): EcsRunTaskClient;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immutable image profiles.
|
|
3
|
+
*
|
|
4
|
+
* A run's image is the union of (a) a pinned runtime image — bun, node, or
|
|
5
|
+
* python3 at an exact version, carrying the supervisor and NO skills corpus;
|
|
6
|
+
* the bundle is fetched by digest at run time — and (b) an optional prebuilt
|
|
7
|
+
* dependency layer built at publish time when the skill manifest's
|
|
8
|
+
* `system_deps` are allowlisted. Nothing is installed at execution time.
|
|
9
|
+
*
|
|
10
|
+
* Version pins live in code; image digests and the system_deps allowlist are
|
|
11
|
+
* deployment configuration, because a digest names a concrete artifact in a
|
|
12
|
+
* concrete registry. An un-pinned runtime or an unknown system_deps entry
|
|
13
|
+
* fails closed at admission — a launch never carries a guess.
|
|
14
|
+
*/
|
|
15
|
+
import type { FrozenAdmission, RuntimeName } from "./types.js";
|
|
16
|
+
export type { RuntimeName };
|
|
17
|
+
export interface PinnedRuntime {
|
|
18
|
+
runtime: RuntimeName;
|
|
19
|
+
/** Exact pinned runtime version. */
|
|
20
|
+
version: string;
|
|
21
|
+
/** Image digest; null until deployment config supplies one. */
|
|
22
|
+
imageDigest: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface DependencyLayerRule {
|
|
25
|
+
/** Canonical system_deps key: sorted, unique, comma-joined. */
|
|
26
|
+
canonicalKey: string;
|
|
27
|
+
/** Prebuilt layer tag produced at publish time. */
|
|
28
|
+
layerTag: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ImageProfileRegistryConfig {
|
|
31
|
+
runtimes: PinnedRuntime[];
|
|
32
|
+
/** system_deps allowlist: canonical key -> prebuilt layer tag. */
|
|
33
|
+
dependencyLayers: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
export interface ResolvedImageProfile {
|
|
36
|
+
runtime: PinnedRuntime;
|
|
37
|
+
runtimeImageDigest: string;
|
|
38
|
+
dependencyLayerTag: string | null;
|
|
39
|
+
}
|
|
40
|
+
export type ImageProfileResolutionFailure = {
|
|
41
|
+
reason: "UNKNOWN_RUNTIME";
|
|
42
|
+
runtime: string;
|
|
43
|
+
} | {
|
|
44
|
+
reason: "UNPINNED_RUNTIME";
|
|
45
|
+
runtime: RuntimeName;
|
|
46
|
+
} | {
|
|
47
|
+
reason: "UNALLOWED_SYSTEM_DEPS";
|
|
48
|
+
systemDeps: string[];
|
|
49
|
+
};
|
|
50
|
+
export declare class ImageProfileResolutionError extends Error {
|
|
51
|
+
readonly failure: ImageProfileResolutionFailure;
|
|
52
|
+
constructor(failure: ImageProfileResolutionFailure);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Pinned runtime versions. These match what the package itself is built with
|
|
56
|
+
* (bun 1.3.14) plus the node and python lines the corpus's runtime contracts
|
|
57
|
+
* name. Digests are deployment configuration and start null: admission refuses
|
|
58
|
+
* an unpinned launch.
|
|
59
|
+
*/
|
|
60
|
+
export declare const DEFAULT_IMAGE_PROFILES: ImageProfileRegistryConfig;
|
|
61
|
+
export interface ImageProfileRegistry {
|
|
62
|
+
resolve(runtime: RuntimeName, systemDeps: string[]): ResolvedImageProfile;
|
|
63
|
+
}
|
|
64
|
+
export declare function createImageProfileRegistry(config?: ImageProfileRegistryConfig): ImageProfileRegistry;
|
|
65
|
+
/** Canonical system_deps key: sorted, unique, comma-joined. */
|
|
66
|
+
export declare function canonicalSystemDepsKey(systemDeps: string[]): string;
|
|
67
|
+
/** Build an allowlist entry from a manifest's declared system_deps. */
|
|
68
|
+
export declare function dependencyLayerRule(layerTag: string, systemDeps: string[]): DependencyLayerRule;
|
|
69
|
+
/** Resolve + freeze the image half of an admission. */
|
|
70
|
+
export declare function resolveImageProfile(registry: ImageProfileRegistry, input: {
|
|
71
|
+
runtime: RuntimeName;
|
|
72
|
+
systemDeps: string[];
|
|
73
|
+
}): Pick<FrozenAdmission, "runtime" | "runtimeImageDigest" | "dependencyLayerTag">;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud-run execution machinery, exported through the sdk surface.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent admission, the run state machine (admitted → leased → running →
|
|
5
|
+
* terminal), the immutable image-profile registry, per-attempt receipts, and
|
|
6
|
+
* the dispatcher adapters (ECS with atomic-launch reconciliation, E2B stub).
|
|
7
|
+
*/
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export * from "./storage.js";
|
|
10
|
+
export * from "./admission.js";
|
|
11
|
+
export * from "./state-machine.js";
|
|
12
|
+
export * from "./image-profile.js";
|
|
13
|
+
export * from "./receipts.js";
|
|
14
|
+
export * from "./dispatchers/ecs.js";
|
|
15
|
+
export * from "./dispatchers/e2b.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-attempt receipts.
|
|
3
|
+
*
|
|
4
|
+
* Every attempt gets an immutable receipt: run_id, attempt_id,
|
|
5
|
+
* lease_generation, launch token (clientToken + startedBy), task id,
|
|
6
|
+
* timestamps, image + bundle digests, the frozen policy, and — once the
|
|
7
|
+
* attempt reaches a terminal outcome — exit code and artifact/log pointers.
|
|
8
|
+
* Receipts are written through the storage adapter; the terminal receipt
|
|
9
|
+
* finalizes the run row.
|
|
10
|
+
*/
|
|
11
|
+
import type { RunExecutionStore } from "./storage.js";
|
|
12
|
+
import type { AttemptReceipt, AttemptRecord, FrozenAdmission, TerminalRunStatus } from "./types.js";
|
|
13
|
+
export type { AttemptReceipt };
|
|
14
|
+
export interface CreateAttemptReceiptInput {
|
|
15
|
+
admission: FrozenAdmission;
|
|
16
|
+
attempt: AttemptRecord;
|
|
17
|
+
/** ECS task arn, when the launch is confirmed. */
|
|
18
|
+
taskId: string | null;
|
|
19
|
+
launchedAt: string;
|
|
20
|
+
artifactPointers?: string[];
|
|
21
|
+
logPointers?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface FinalizeAttemptReceiptInput {
|
|
24
|
+
runId: string;
|
|
25
|
+
attemptId: string;
|
|
26
|
+
status: TerminalRunStatus;
|
|
27
|
+
exitCode: number | null;
|
|
28
|
+
completedAt: string;
|
|
29
|
+
artifactPointers?: string[];
|
|
30
|
+
logPointers?: string[];
|
|
31
|
+
costCents?: number | null;
|
|
32
|
+
}
|
|
33
|
+
export interface ReceiptService {
|
|
34
|
+
/** Persist the launch-time receipt before (or right after) the launch call. */
|
|
35
|
+
recordLaunch(input: CreateAttemptReceiptInput): Promise<AttemptReceipt>;
|
|
36
|
+
/** Finalize the attempt's receipt; also finalizes the run row. */
|
|
37
|
+
finalize(input: FinalizeAttemptReceiptInput): Promise<{
|
|
38
|
+
receipt: AttemptReceipt | null;
|
|
39
|
+
runId: string;
|
|
40
|
+
status: TerminalRunStatus;
|
|
41
|
+
}>;
|
|
42
|
+
get(runId: string, attemptId: string): Promise<AttemptReceipt | null>;
|
|
43
|
+
}
|
|
44
|
+
export declare function createReceiptService(store: RunExecutionStore): ReceiptService;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run state machine: admitted → leased → running → terminal.
|
|
3
|
+
*
|
|
4
|
+
* Every transition is recorded through the storage adapter. Claims are CAS on
|
|
5
|
+
* the attempt's lease_generation; a stale claim is rejected. Retries keep the
|
|
6
|
+
* run_id and mint a new attempt_id with a fresh lease_generation counter.
|
|
7
|
+
*/
|
|
8
|
+
import type { ClaimAttemptInput, ClaimResult, ExecutionRunStatus, RunExecutionStore } from "./storage.js";
|
|
9
|
+
import type { TerminalRunStatus } from "./types.js";
|
|
10
|
+
export type { ClaimResult };
|
|
11
|
+
/** The only legal edges of the state machine. */
|
|
12
|
+
export declare const LEGAL_TRANSITIONS: Record<ExecutionRunStatus, ExecutionRunStatus[]>;
|
|
13
|
+
export type TransitionFailure = "NO_SUCH_RUN" | "NO_SUCH_ATTEMPT" | "INVALID_TRANSITION" | "ATTEMPT_TERMINAL" | "RUN_TERMINAL" | "RUN_CANCELLED";
|
|
14
|
+
export type TransitionResult = {
|
|
15
|
+
ok: true;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
reason: TransitionFailure;
|
|
19
|
+
};
|
|
20
|
+
export interface RunStateMachine {
|
|
21
|
+
/** CAS-claim an attempt: expectedLeaseGeneration must match. */
|
|
22
|
+
claim(input: ClaimAttemptInput): Promise<ClaimResult>;
|
|
23
|
+
/** admitted → leased (claim recorded as a transition). */
|
|
24
|
+
lease(input: ClaimAttemptInput): Promise<ClaimResult>;
|
|
25
|
+
/** leased → running. */
|
|
26
|
+
start(runId: string, attemptId: string): Promise<TransitionResult>;
|
|
27
|
+
/** running → terminal; finalizes the run row. */
|
|
28
|
+
terminate(input: {
|
|
29
|
+
runId: string;
|
|
30
|
+
attemptId: string;
|
|
31
|
+
status: TerminalRunStatus;
|
|
32
|
+
}): Promise<TransitionResult>;
|
|
33
|
+
/** Cancel a run: fences the current generation and moves it to terminal. */
|
|
34
|
+
cancel(runId: string): Promise<TransitionResult>;
|
|
35
|
+
transition(runId: string, from: ExecutionRunStatus, to: ExecutionRunStatus, attemptId?: string | null): Promise<TransitionResult>;
|
|
36
|
+
getStatus(runId: string): Promise<ExecutionRunStatus | null>;
|
|
37
|
+
}
|
|
38
|
+
export declare function createRunStateMachine(store: RunExecutionStore): RunStateMachine;
|