@xgent-ai/skills 0.1.0 → 0.3.0
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 -2
- package/bin/xgent-skills.js +515 -4
- package/package.json +7 -3
- package/skills/dev-plan/SKILL.md +113 -93
- package/skills/dev-plan/references/architecture-quality.md +141 -0
- package/skills/dev-plan/references/execution-workflow.md +78 -0
- package/skills/dev-plan/references/plan-skeleton.md +238 -78
- package/skills/dev-plan/scripts/check_progress.sh +158 -0
- package/skills/elintp/SKILL.md +129 -0
- package/skills/grafton-view-dev/SKILL.md +195 -0
- package/skills/grafton-view-dev/references/bindings.md +120 -0
- package/skills/grafton-view-dev/references/components.md +168 -0
- package/skills/grafton-view-dev/references/recipes.md +208 -0
- package/skills/grafton-view-dev/references/schema.md +86 -0
- package/skills/grafton-view-dev/references/stores.md +310 -0
- package/skills/pardon/SKILL.md +30 -0
- package/skills/portal-app-exchange/SKILL.md +106 -0
- package/skills/portal-backend-app/SKILL.md +56 -0
- package/skills/portal-backend-app/references/gate-and-tokens.md +93 -0
- package/skills/portal-backend-app/references/wiring-and-conventions.md +71 -0
- package/skills/portal-dev-setup/SKILL.md +519 -0
- package/skills/portal-dev-setup/puller.env.example +74 -0
- package/skills/portal-dev-setup/references/troubleshooting.md +167 -0
- package/skills/portal-dev-setup/scripts/onebox.sh +966 -0
- package/skills/portal-external-app/SKILL.md +273 -0
- package/skills/portal-external-app/references/contract-doc-template.md +96 -0
- package/skills/portal-external-app/references/health-contract.md +80 -0
- package/skills/portal-external-app/references/integration-contract.md +130 -0
- package/skills/portal-external-app/references/quota-and-seats.md +213 -0
- package/skills/portal-external-app/references/registration-and-onebox.md +259 -0
- package/skills/portal-external-app/scripts/health-verdict.ts +22 -0
- package/skills/portal-external-app/scripts/verify-health.ts +27 -0
- package/skills/portal-logging/SKILL.md +139 -0
- package/skills/portal-logging/references/collectors.md +285 -0
- package/skills/portal-logging/references/contract.md +95 -0
- package/skills/portal-logging/scripts/smoke-ingest.sh +72 -0
- package/skills/portal-micro-app/SKILL.md +83 -0
- package/skills/portal-micro-app/references/manifest-and-acl.md +79 -0
- package/skills/portal-micro-app/references/open-api-and-extensions.md +86 -0
- package/skills/portal-micro-app/references/sdk-reference.md +208 -0
- package/skills/prd/SKILL.md +212 -0
- package/skills/prd/references/prd-skeleton.md +244 -0
- package/skills/prd/references/spms-mapping.md +148 -0
- package/skills/react/SKILL.md +103 -0
- package/skills/react/references/component-patterns.md +275 -0
- package/skills/react/references/data-fetching.md +255 -0
- package/skills/react/references/effect-patterns.md +407 -0
- package/skills/react/references/js-performance.md +432 -0
- package/skills/react/references/rendering-performance.md +351 -0
- package/skills/react/references/rerender-optimization.md +578 -0
- package/skills/rust/SKILL.md +103 -0
- package/skills/rust/references/chapter_01.md +564 -0
- package/skills/rust/references/chapter_02.md +117 -0
- package/skills/rust/references/chapter_03.md +209 -0
- package/skills/rust/references/chapter_04.md +183 -0
- package/skills/rust/references/chapter_05.md +390 -0
- package/skills/rust/references/chapter_06.md +142 -0
- package/skills/rust/references/chapter_07.md +226 -0
- package/skills/rust/references/chapter_08.md +257 -0
- package/skills/rust/references/chapter_09.md +261 -0
- package/skills/rust/references/chapter_10.md +554 -0
- package/skills/story-points/SKILL.md +219 -0
- package/skills/story-points/references/factors.md +367 -0
- package/skills/summarize/SKILL.md +79 -0
- package/skills/swarm/SKILL.md +263 -0
- package/skills/swarm/evals/evals.json +55 -0
- package/skills/swarm/references/agent-types.md +260 -0
- package/skills/swarm/references/teams/code-audit.md +81 -0
- package/skills/swarm/references/teams/debug-race.md +70 -0
- package/skills/swarm/references/teams/feature-dev.md +71 -0
- package/skills/swarm/references/teams/product.md +114 -0
- package/skills/swarm/references/teams/refactor-migration.md +73 -0
- package/skills/swarm/references/teams/research-debate.md +73 -0
- package/skills/test-plan/SKILL.md +136 -0
- package/skills/test-plan/references/case-taxonomy.md +141 -0
- package/skills/working-with-mbx/SKILL.md +343 -0
- package/skills/working-with-mbx/references/acknowledgements.md +37 -0
- package/skills/working-with-mbx/references/benchmarks.md +140 -0
- package/skills/working-with-mbx/references/cache-results.md +153 -0
- package/skills/working-with-mbx/references/cache-server.md +151 -0
- package/skills/working-with-mbx/references/cli/adopt.md +29 -0
- package/skills/working-with-mbx/references/cli/cache/dir.md +24 -0
- package/skills/working-with-mbx/references/cli/cache/export.md +31 -0
- package/skills/working-with-mbx/references/cli/cache/import.md +27 -0
- package/skills/working-with-mbx/references/cli/cache/largest.md +26 -0
- package/skills/working-with-mbx/references/cli/cache/projects.md +23 -0
- package/skills/working-with-mbx/references/cli/cache/remove.md +30 -0
- package/skills/working-with-mbx/references/cli/cache/stats.md +24 -0
- package/skills/working-with-mbx/references/cli/cache/trace.md +27 -0
- package/skills/working-with-mbx/references/cli/cache/verify.md +23 -0
- package/skills/working-with-mbx/references/cli/cache.md +35 -0
- package/skills/working-with-mbx/references/cli/clean.md +27 -0
- package/skills/working-with-mbx/references/cli/completion.md +27 -0
- package/skills/working-with-mbx/references/cli/doctor.md +24 -0
- package/skills/working-with-mbx/references/cli/exec.md +28 -0
- package/skills/working-with-mbx/references/cli/explain.md +29 -0
- package/skills/working-with-mbx/references/cli/gc.md +28 -0
- package/skills/working-with-mbx/references/cli/prefetch.md +27 -0
- package/skills/working-with-mbx/references/cli/setup.md +28 -0
- package/skills/working-with-mbx/references/cli/stats.md +24 -0
- package/skills/working-with-mbx/references/cli/tui.md +24 -0
- package/skills/working-with-mbx/references/cli.md +58 -0
- package/skills/working-with-mbx/references/compared.md +67 -0
- package/skills/working-with-mbx/references/configuration.md +724 -0
- package/skills/working-with-mbx/references/cookbook/fork-prs.md +82 -0
- package/skills/working-with-mbx/references/cookbook/local-development.md +127 -0
- package/skills/working-with-mbx/references/cookbook/migrate.md +67 -0
- package/skills/working-with-mbx/references/dashboard.md +89 -0
- package/skills/working-with-mbx/references/faq.md +75 -0
- package/skills/working-with-mbx/references/getting-started.md +147 -0
- package/skills/working-with-mbx/references/github-action.md +254 -0
- package/skills/working-with-mbx/references/guide.md +59 -0
- package/skills/working-with-mbx/references/how-it-works.md +86 -0
- package/skills/working-with-mbx/references/incremental.md +78 -0
- package/skills/working-with-mbx/references/index.md +57 -0
- package/skills/working-with-mbx/references/installation.md +101 -0
- package/skills/working-with-mbx/references/limits.md +182 -0
- package/skills/working-with-mbx/references/linkers.md +75 -0
- package/skills/working-with-mbx/references/managed-targets.md +197 -0
- package/skills/working-with-mbx/references/protocol-compatibility.md +103 -0
- package/skills/working-with-mbx/references/remote-cache.md +190 -0
- package/skills/working-with-mbx/references/scheduling.md +65 -0
- package/skills/working-with-mbx/references/setup.md +157 -0
- package/skills/working-with-mbx/references/stability.md +43 -0
- package/skills/working-with-mbx/references/standalone-builds.md +102 -0
- package/skills/working-with-mbx/references/stats.md +49 -0
- package/skills/working-with-mbx/references/troubleshooting.md +136 -0
- package/skills/working-with-mbx/references/tui.md +163 -0
- package/skills/working-with-mbx/update-docs.sh +49 -0
- package/skills/working-with-mise/SKILL.md +297 -0
- package/skills/working-with-mise/references/cli/activate-html.md +90 -0
- package/skills/working-with-mise/references/cli/alias-html.md +30 -0
- package/skills/working-with-mise/references/cli/backends-html.md +40 -0
- package/skills/working-with-mise/references/cli/bin-paths-html.md +37 -0
- package/skills/working-with-mise/references/cli/bootstrap-html.md +109 -0
- package/skills/working-with-mise/references/cli/cache-html.md +40 -0
- package/skills/working-with-mise/references/cli/completion-html.md +76 -0
- package/skills/working-with-mise/references/cli/config-html.md +44 -0
- package/skills/working-with-mise/references/cli/daemons-html.md +48 -0
- package/skills/working-with-mise/references/cli/deactivate-html.md +47 -0
- package/skills/working-with-mise/references/cli/deps-html.md +89 -0
- package/skills/working-with-mise/references/cli/doctor-html.md +46 -0
- package/skills/working-with-mise/references/cli/dotfiles-html.md +57 -0
- package/skills/working-with-mise/references/cli/edit-html.md +48 -0
- package/skills/working-with-mise/references/cli/en-html.md +62 -0
- package/skills/working-with-mise/references/cli/env-html.md +57 -0
- package/skills/working-with-mise/references/cli/exec-html.md +79 -0
- package/skills/working-with-mise/references/cli/exec.md +79 -0
- package/skills/working-with-mise/references/cli/fmt-html.md +44 -0
- package/skills/working-with-mise/references/cli/generate-html.md +43 -0
- package/skills/working-with-mise/references/cli/implode-html.md +35 -0
- package/skills/working-with-mise/references/cli/install-html.md +83 -0
- package/skills/working-with-mise/references/cli/install-into-html.md +47 -0
- package/skills/working-with-mise/references/cli/latest-html.md +62 -0
- package/skills/working-with-mise/references/cli/link-html.md +57 -0
- package/skills/working-with-mise/references/cli/lock-html.md +114 -0
- package/skills/working-with-mise/references/cli/ls-html.md +95 -0
- package/skills/working-with-mise/references/cli/ls-remote-html.md +61 -0
- package/skills/working-with-mise/references/cli/mcp-html.md +57 -0
- package/skills/working-with-mise/references/cli/oci-html.md +41 -0
- package/skills/working-with-mise/references/cli/outdated-html.md +79 -0
- package/skills/working-with-mise/references/cli/packslip-html.md +38 -0
- package/skills/working-with-mise/references/cli/patrons-html.md +45 -0
- package/skills/working-with-mise/references/cli/plugins-html.md +46 -0
- package/skills/working-with-mise/references/cli/prune-html.md +56 -0
- package/skills/working-with-mise/references/cli/registry-html.md +59 -0
- package/skills/working-with-mise/references/cli/reshim-html.md +46 -0
- package/skills/working-with-mise/references/cli/run-html.md +152 -0
- package/skills/working-with-mise/references/cli/search-html.md +69 -0
- package/skills/working-with-mise/references/cli/self-update-html.md +42 -0
- package/skills/working-with-mise/references/cli/set-html.md +116 -0
- package/skills/working-with-mise/references/cli/settings-html.md +78 -0
- package/skills/working-with-mise/references/cli/shell-alias-html.md +39 -0
- package/skills/working-with-mise/references/cli/shell-html.md +53 -0
- package/skills/working-with-mise/references/cli/skills-html.md +39 -0
- package/skills/working-with-mise/references/cli/sponsors-html.md +31 -0
- package/skills/working-with-mise/references/cli/ssh-html.md +45 -0
- package/skills/working-with-mise/references/cli/sync-html.md +37 -0
- package/skills/working-with-mise/references/cli/tasks-html.md +61 -0
- package/skills/working-with-mise/references/cli/test-tool-html.md +49 -0
- package/skills/working-with-mise/references/cli/token-html.md +37 -0
- package/skills/working-with-mise/references/cli/tool-alias-html.md +41 -0
- package/skills/working-with-mise/references/cli/tool-html.md +55 -0
- package/skills/working-with-mise/references/cli/tool-stub-html.md +60 -0
- package/skills/working-with-mise/references/cli/trust-html.md +63 -0
- package/skills/working-with-mise/references/cli/uninstall-html.md +62 -0
- package/skills/working-with-mise/references/cli/unset-html.md +59 -0
- package/skills/working-with-mise/references/cli/untrust-html.md +35 -0
- package/skills/working-with-mise/references/cli/unuse-html.md +74 -0
- package/skills/working-with-mise/references/cli/upgrade-html.md +133 -0
- package/skills/working-with-mise/references/cli/use-html.md +130 -0
- package/skills/working-with-mise/references/cli/use.md +130 -0
- package/skills/working-with-mise/references/cli/version-html.md +46 -0
- package/skills/working-with-mise/references/cli/watch-html.md +465 -0
- package/skills/working-with-mise/references/cli/where-html.md +53 -0
- package/skills/working-with-mise/references/cli/which-html.md +55 -0
- package/skills/working-with-mise/references/configuration/environments-html.md +171 -0
- package/skills/working-with-mise/references/configuration/project-diagnostics-html.md +93 -0
- package/skills/working-with-mise/references/configuration/settings-html.md +3062 -0
- package/skills/working-with-mise/references/configuration/vars-html.md +167 -0
- package/skills/working-with-mise/references/dev-tools/aliases-html.md +97 -0
- package/skills/working-with-mise/references/dev-tools/backend_architecture-html.md +198 -0
- package/skills/working-with-mise/references/dev-tools/backends/aqua-html.md +274 -0
- package/skills/working-with-mise/references/dev-tools/backends/aqua.md +274 -0
- package/skills/working-with-mise/references/dev-tools/backends/asdf-html.md +98 -0
- package/skills/working-with-mise/references/dev-tools/backends/asdf.md +98 -0
- package/skills/working-with-mise/references/dev-tools/backends/cargo-html.md +240 -0
- package/skills/working-with-mise/references/dev-tools/backends/cargo.md +240 -0
- package/skills/working-with-mise/references/dev-tools/backends/conda-html.md +125 -0
- package/skills/working-with-mise/references/dev-tools/backends/dotnet-html.md +142 -0
- package/skills/working-with-mise/references/dev-tools/backends/forgejo-html.md +533 -0
- package/skills/working-with-mise/references/dev-tools/backends/gem-html.md +77 -0
- package/skills/working-with-mise/references/dev-tools/backends/gem.md +77 -0
- package/skills/working-with-mise/references/dev-tools/backends/github-html.md +622 -0
- package/skills/working-with-mise/references/dev-tools/backends/github.md +622 -0
- package/skills/working-with-mise/references/dev-tools/backends/gitlab-html.md +546 -0
- package/skills/working-with-mise/references/dev-tools/backends/go-html.md +115 -0
- package/skills/working-with-mise/references/dev-tools/backends/go.md +115 -0
- package/skills/working-with-mise/references/dev-tools/backends/http-html.md +644 -0
- package/skills/working-with-mise/references/dev-tools/backends/http.md +644 -0
- package/skills/working-with-mise/references/dev-tools/backends/npm-html.md +436 -0
- package/skills/working-with-mise/references/dev-tools/backends/npm.md +436 -0
- package/skills/working-with-mise/references/dev-tools/backends/packslip-html.md +310 -0
- package/skills/working-with-mise/references/dev-tools/backends/pipx-html.md +329 -0
- package/skills/working-with-mise/references/dev-tools/backends/pipx.md +329 -0
- package/skills/working-with-mise/references/dev-tools/backends/pkgx-html.md +73 -0
- package/skills/working-with-mise/references/dev-tools/backends/pypi-html.md +331 -0
- package/skills/working-with-mise/references/dev-tools/backends/s3-html.md +346 -0
- package/skills/working-with-mise/references/dev-tools/backends/spm-html.md +201 -0
- package/skills/working-with-mise/references/dev-tools/backends/ubi-html.md +232 -0
- package/skills/working-with-mise/references/dev-tools/backends/vfox-html.md +173 -0
- package/skills/working-with-mise/references/dev-tools/backends/vfox.md +173 -0
- package/skills/working-with-mise/references/dev-tools/backends.md +32 -0
- package/skills/working-with-mise/references/dev-tools/comparison-to-asdf-html.md +112 -0
- package/skills/working-with-mise/references/dev-tools/deps-html.md +390 -0
- package/skills/working-with-mise/references/dev-tools/github-tokens-html.md +390 -0
- package/skills/working-with-mise/references/dev-tools/index-html.md +420 -0
- package/skills/working-with-mise/references/dev-tools/mise-lock-html.md +660 -0
- package/skills/working-with-mise/references/dev-tools/mise-oci-html.md +418 -0
- package/skills/working-with-mise/references/dev-tools/packslip-resources-html.md +203 -0
- package/skills/working-with-mise/references/dev-tools/packslip-verification-html.md +178 -0
- package/skills/working-with-mise/references/dev-tools/shims-html.md +397 -0
- package/skills/working-with-mise/references/dev-tools/tool-stubs-html.md +416 -0
- package/skills/working-with-mise/references/guides/getting-started.md +268 -0
- package/skills/working-with-mise/references/index.md +37 -0
- package/skills/working-with-mise/update-docs.sh +111 -0
- package/skills/xgent-app-release/SKILL.md +438 -0
- package/skills/xgent-app-release/references/build-and-package.md +65 -0
- package/skills/xgent-app-release/references/publish-api.md +315 -0
- package/skills/xgent-app-release/references/troubleshooting.md +108 -0
- package/skills/xgent-app-release/scripts/npm-token.mjs +94 -0
- package/skills/xgent-app-release/scripts/preflight.mjs +340 -0
- package/skills/xgent-app-release/scripts/registry-config.mjs +88 -0
- package/skills/xgent-image-push/SKILL.md +239 -0
- package/skills/xgent-image-push/registry.env.example +51 -0
- package/skills/xgent-image-push/scripts/push-image.sh +576 -0
- package/skills/xgent-init/SKILL.md +96 -0
- package/skills/xgent-init/references/external-app-CLAUDE.template.md +249 -0
- package/skills/xgent-init/references/external-app-DESIGN.template.md +317 -0
- package/skills/xgent-init/references/external-app-PRODUCT.template.md +87 -0
- package/skills/xgent-init/references/fill-guide.md +78 -0
- package/skills/xgent-init/scripts/check-docs.mjs +304 -0
- package/vendor/impeccable/LICENSE +191 -0
- package/vendor/impeccable/NOTICE.md +11 -0
- package/vendor/impeccable/VERSION.json +28 -0
- package/vendor/impeccable/bundle/blobs/00023f9e7f2e27604fde978b56510a8f837b76eeadd93221d11adcf4c98f1a10 +88 -0
- package/vendor/impeccable/bundle/blobs/00f053b877a92a9847d69eec2403e40c757152f30a5ca807c5033c58d7c297f1 +33 -0
- package/vendor/impeccable/bundle/blobs/012f548547fae48ebdd22a3c3af8a01032641fddd530e3783bd73b7358ab2c49 +80 -0
- package/vendor/impeccable/bundle/blobs/015725eeca94f52bffd2132d4cb49bc3eb1ee76e6ac7378c065e629d59f56613 +84 -0
- package/vendor/impeccable/bundle/blobs/03b30331c176a248a3b3bd17abdff1a1fd658f09ffb2a412b36ae9627dd3f33b +105 -0
- package/vendor/impeccable/bundle/blobs/041535231366047a0beeb5daa64ea9c23d5a566580f7dafdb8c0623cb4a7e76b +24 -0
- package/vendor/impeccable/bundle/blobs/04af9f2d6883fe76f9539d310d9c369052822a24886d2c330ab1e3fe5981c8a1 +24 -0
- package/vendor/impeccable/bundle/blobs/058f81f256134841875fd3183e06b37a023de0c877fd2b9eecd97011640791fe +46 -0
- package/vendor/impeccable/bundle/blobs/05aa836a190f4ff62e5d4619738bdb891d83d85e35d81c2e6e322d1dc084d802 +80 -0
- package/vendor/impeccable/bundle/blobs/05e86f37d7fa381c5e8a04b6212490a27904d3be3e9384862a0764d3daba6d78 +54 -0
- package/vendor/impeccable/bundle/blobs/0617b37a905f0486c1ab4e91a287c8ef8292e253095c340f452d591206272f73 +104 -0
- package/vendor/impeccable/bundle/blobs/074575671f24cf4298d06f0019f76e94f62e9a6ed205fce05b8e507341e64266 +111 -0
- package/vendor/impeccable/bundle/blobs/076a31941acbaa81013c8c511e146ed4138128eb5e9895dae3e9a27a25ac4f04 +13 -0
- package/vendor/impeccable/bundle/blobs/08812a8618de7bd2f63a51298e9c2558031237e8efba280062ccb636101e25e1 +80 -0
- package/vendor/impeccable/bundle/blobs/08a2980eae0bfea1f00229899defc28ec92c7ecb875bf5fb02e4ba80dad6c394 +806 -0
- package/vendor/impeccable/bundle/blobs/08d78eb31c561256f83baa0afa742a660f1467aa2c81be2f60c2b7f9c770d66e +54 -0
- package/vendor/impeccable/bundle/blobs/098a891028ce59c212b747d3c70468dd750aff7053a703d1336045ed31e0da7c +70 -0
- package/vendor/impeccable/bundle/blobs/0a151a54959a15eb32fa338890d5d64ac48a9d54d2d5442c3c7708a4c27c1858 +104 -0
- package/vendor/impeccable/bundle/blobs/0bb4085f6dda702846e0e56bd4f797aa1b046ab48eca02644448e368f3820f88 +104 -0
- package/vendor/impeccable/bundle/blobs/0bc7d7971b3edf2acd0580e847458dc6d84129d90715b452799ace3bed815c7c +84 -0
- package/vendor/impeccable/bundle/blobs/0bf6f08bf34d24cd88a78d544add9e4d71478bcf939926cde32f4e164882c775 +105 -0
- package/vendor/impeccable/bundle/blobs/0dbbef70048cc3ae44e6710ff09992ce14ad049ce8ed519b0ff8a1ddb4633f4e +111 -0
- package/vendor/impeccable/bundle/blobs/0e081d496eba4bd77aca81723d59120c10177a71c9551a60ab923c356fb3cf38 +104 -0
- package/vendor/impeccable/bundle/blobs/0e1819750e5448311a051d35ab6d0be0830418f78ca872ef10469fafebb27d4f +46 -0
- package/vendor/impeccable/bundle/blobs/0e18ac33b7e6a247b658fcaf926d9eac028399597dbaba366f1d2f2b884a383b +325 -0
- package/vendor/impeccable/bundle/blobs/0f83648f6b425225290305bced51eacebacf9bf9bc05e21cdbad46863fbc89ce +24 -0
- package/vendor/impeccable/bundle/blobs/115e1c3f1b58b5129910ed925dbf65d61d5ac4c2036618847555ce40098aae97 +145 -0
- package/vendor/impeccable/bundle/blobs/11f75834c26ecd8a5b0afdf696e838953b235dc4835b7293bbc6b1bc27dd3106 +84 -0
- package/vendor/impeccable/bundle/blobs/12c1afcd15e86d840b89a78c6d17ce6d1b5609bac713d59271c6ab5932975dac +111 -0
- package/vendor/impeccable/bundle/blobs/12d2a8043ae8668ad29c32bfa92995849fc49cb016e6ebd4f7e59539d96e7b03 +46 -0
- package/vendor/impeccable/bundle/blobs/12fefe52d80d25014e5f7e2f9b278275a675653d3d99ae8f0ecf344cdb9abbe6 +111 -0
- package/vendor/impeccable/bundle/blobs/13bd27aa8573e6d45d8bbf9f3fc991e4719d28a7e8f709009a4a5a49a227fff3 +37 -0
- package/vendor/impeccable/bundle/blobs/1484a7ae206ab4f0e6262b21afe0f6307a629ed27d28fb7de69536a6800a4883 +37 -0
- package/vendor/impeccable/bundle/blobs/15b4837dccb27d7382e2f134ef050b244c4488b1906e0308f288112183cc09ac +145 -0
- package/vendor/impeccable/bundle/blobs/1640c70b984a43e729d72d046109f87243ae84ecd64d2600a007d140558123cc +80 -0
- package/vendor/impeccable/bundle/blobs/1652d639d91889a08bda7f351456c43ee30e5677aa4866a90f375e1e4be15deb +80 -0
- package/vendor/impeccable/bundle/blobs/16d99e9fe8e75d69042bc4fda12e93daa7e10f9fa6c00b12b0f0580b119a4cfd +105 -0
- package/vendor/impeccable/bundle/blobs/171777f8a8596d2ffdb43f4b935a7c6c12859ace233967f868a566390a59708e +325 -0
- package/vendor/impeccable/bundle/blobs/173dd66abe65633910dcb04a51f40d6ff2a793f87088f022a02fc4cad24dd133 +94 -0
- package/vendor/impeccable/bundle/blobs/17c583cf8ad41266ea1e787b666b9d91fe13469d3d0f6af57c08e0146f9b17ac +58 -0
- package/vendor/impeccable/bundle/blobs/181e814c1b9317098b2300c1b02ad0d137b6d82bd1e7e8cc64de4d00b4c50c25 +111 -0
- package/vendor/impeccable/bundle/blobs/190a4e642ca362d7499f3c3ab123e21f18f75457d11f072b545a183f296e6495 +99 -0
- package/vendor/impeccable/bundle/blobs/1971edc3784273bd8da7b1980779c6159471e857992faa6637178109cb130503 +806 -0
- package/vendor/impeccable/bundle/blobs/199d5d3db1197e053a2eb9c3cb927d44cbaaaeb57745c1ada3fd775ba50d9291 +104 -0
- package/vendor/impeccable/bundle/blobs/19c5bfce570a0e2bddd4d9c788936ff9070c90299363c4853ba77bfd37306e20 +416 -0
- package/vendor/impeccable/bundle/blobs/1a9180cec754f8afd354e7cb759750247e97c5bd26d3242ad4c45e315069e8c0 +37 -0
- package/vendor/impeccable/bundle/blobs/1c804990fd8ac23a4b19c42972b5ae591d17f620d0006f0f32927c8db5d5bf50 +145 -0
- package/vendor/impeccable/bundle/blobs/1d72b494f46a60e6c9c06e89bab79789dd85e11f62fb4286a03abf26d352dc1f +80 -0
- package/vendor/impeccable/bundle/blobs/21bc91f6e07691e82b7bba99f9e1d956f9d7a6810dcdc18d231fe73b53a13b23 +37 -0
- package/vendor/impeccable/bundle/blobs/238e1967d933ca5739db708f7ad9f72ca8b34bc4c9b9e1c07b0a06dcf9d00681 +806 -0
- package/vendor/impeccable/bundle/blobs/244e5b7bca6d22a51b4e22104a52a36e477056b03d257b56d1d4e319cd6167a8 +80 -0
- package/vendor/impeccable/bundle/blobs/249f0437a52ab3eb4bc4d4a9f38e085334c0fbb7795e88dd419e32b5f58c924d +42 -0
- package/vendor/impeccable/bundle/blobs/27c4b6c90ad12a186136f9ece9cb1830d4a6e36b11382ab334efc4543f8082de +145 -0
- package/vendor/impeccable/bundle/blobs/29f741b71e75fd39c65ca6df4b01b5f6c4f3c4c7adf23b47a3220ce2c0251f24 +104 -0
- package/vendor/impeccable/bundle/blobs/2b21f0142ee88a11dbe2593362f5a910718a61062e3a64e7ff936ef1e74fd394 +46 -0
- package/vendor/impeccable/bundle/blobs/2b58041cd82d819d12762b10becb95f8253c661bf6a9de40f61fc01c1204b743 +806 -0
- package/vendor/impeccable/bundle/blobs/2b5b2fbf5f658f34ea1997fb1aeebe01604d05187f75c6a4f1f55a5bc78520a4 +104 -0
- package/vendor/impeccable/bundle/blobs/2c2ed6286bd74adef4f24ef442e2e1bc0780d44bc060aa2a4c03a03988dbafd5 +325 -0
- package/vendor/impeccable/bundle/blobs/2d7086992c07df1fc734cdf9c420c4bd8ad409ab7909e07c8b486c303d420732 +83 -0
- package/vendor/impeccable/bundle/blobs/2e4846117a2fcdc1e4bc9570a5333da839649cb8ccdac6a30a87591ca05b4bb0 +54 -0
- package/vendor/impeccable/bundle/blobs/2f02f96f889e0c8e0e90806af1ef17e0c162a6cc402068f434d3f7608d9deda3 +54 -0
- package/vendor/impeccable/bundle/blobs/2fd096823e4a93f19edd421a69e10f90ebb630a014c673d1802a927c6f47b7d2 +111 -0
- package/vendor/impeccable/bundle/blobs/2feb3768125ba6469c92a50d516727e6d42f44579165ddfd33409948e2a3803d +27 -0
- package/vendor/impeccable/bundle/blobs/30e006fdee873bac23edaeadce0371161625e021e3cf442dff4b05bb82297ba1 +24 -0
- package/vendor/impeccable/bundle/blobs/31b90048c0b540daec46762a10c2b6b6434737a89af005054d8b848d829d003b +69 -0
- package/vendor/impeccable/bundle/blobs/33b6b32c0c3c0c4a2b22bd2275176b1c88a006dd94592a854f629911a0b21cdc +111 -0
- package/vendor/impeccable/bundle/blobs/3565d038a2eeab88a8b18ff52e6630008ab30f867f9df922a38ce8980440b2e3 +80 -0
- package/vendor/impeccable/bundle/blobs/356cfa0ebf61589cf5d52691d101a69d69256062fe1d11d71d95d41a78289cbd +111 -0
- package/vendor/impeccable/bundle/blobs/3673248740bcdd1122ccc610093ba2fe52f3943a61ce0b7170b74dc49e5b6098 +416 -0
- package/vendor/impeccable/bundle/blobs/37080ea5e5b381adb7eae7a427231b0ad0dee0f0916fc1d6b673b7101a5b425b +42 -0
- package/vendor/impeccable/bundle/blobs/3753448bca49da76dd8b12d5a8b4264414673f26e49028d37616faa8beb210b7 +127 -0
- package/vendor/impeccable/bundle/blobs/37565671b09d983ea1ad83a9e9190bc37255d93c68445958c6facecc7e0f7c4f +33 -0
- package/vendor/impeccable/bundle/blobs/37aeddc0f2031fa89d72519ae2e7542c267872f81786fb8288fca0a49118be11 +27 -0
- package/vendor/impeccable/bundle/blobs/37c9a2122efa64dc8789eb47d196150b0bc635e0ba95042fd381ff157002ed50 +111 -0
- package/vendor/impeccable/bundle/blobs/381ff89aa76e82a0d98456ec31cb117555ae045539fba47c45056daa50f611ca +46 -0
- package/vendor/impeccable/bundle/blobs/3895765e9434400dfc1b30e364be002cf499c1718fb2431e65b907c14ae2cb27 +86 -0
- package/vendor/impeccable/bundle/blobs/38c2e839e130008b6da814ab9c16f3fcbbedfdf721a9638eebd31a9e65341a7a +84 -0
- package/vendor/impeccable/bundle/blobs/38d4d404030c6ea935d3223db1eeb22c45d04a94f41f98e02a43cdc5af7ff2e3 +24 -0
- package/vendor/impeccable/bundle/blobs/3970c8e24615610b0246585e49146f6762d5082b3c8fddc08a00940d6e72d394 +80 -0
- package/vendor/impeccable/bundle/blobs/39ac044f2e45a9e7eed8eb68fe91d32938160eb7f8fa93d2afc42fc80a0c3c10 +54 -0
- package/vendor/impeccable/bundle/blobs/39d9600489073e227e4f4d55c451ce4252a6632ed7ae37923efbbcbc91f16d07 +206 -0
- package/vendor/impeccable/bundle/blobs/3aa908c18db91d5f31d6bba6402eab6afc4e0b75137f841a86bd012386e0d8e2 +145 -0
- package/vendor/impeccable/bundle/blobs/3af7c46309f748ff3845f16455a431ec0e9e807e5e3a965e96e9ee75a1198eb8 +95 -0
- package/vendor/impeccable/bundle/blobs/3ba92d4aa840ec1b6c2fda224339489d6dd65eedf43bb45836af02584d1faa88 +42 -0
- package/vendor/impeccable/bundle/blobs/3bcf81b938a0f0309e9ed6616f4bd18d82f07e2801411ee4cce51220d417eb95 +80 -0
- package/vendor/impeccable/bundle/blobs/3bf5d8661351831dbb2195e3b677fea1f128ca319c0589d538b66d9c9d7dddbc +111 -0
- package/vendor/impeccable/bundle/blobs/3dd45e1c32db3d3163a96ef198954905807b25cb9a1d206a7d77986f21d27652 +39 -0
- package/vendor/impeccable/bundle/blobs/3e3b6fdc6afbc2c2a734d08d6a18b393b7139c56f28f91f82e13e5555b98018a +84 -0
- package/vendor/impeccable/bundle/blobs/3f2c351303b74e217907006fb9c55ada2ef596e9710c13d631e20506d17b9ee8 +325 -0
- package/vendor/impeccable/bundle/blobs/402373ef95962ecb81dd3d7cf70ecb3bd3e22a2bd2aabb4c0d76f7f4f9447870 +105 -0
- package/vendor/impeccable/bundle/blobs/402656ca6df17bad1cd55ede0a966a7bb5b187cf4f89c517851f9efe7f14c0fd +87 -0
- package/vendor/impeccable/bundle/blobs/40c87038b5f75147a5952a96237acf312a327bf70c1bcd8e0a5f064625ae9668 +51 -0
- package/vendor/impeccable/bundle/blobs/420d82fe41884b7aa8c28750520146d8160c91396ac332a96b2d82a90b017fb2 +80 -0
- package/vendor/impeccable/bundle/blobs/420e2fdee2b7f555d9a37ce348cf62610ddd98f96b1a0a511796ba600881588c +111 -0
- package/vendor/impeccable/bundle/blobs/424b2e75cb204e2dca7db4a40dfe5a81f78dc0fc58ac4790e8b7bbf2f330bba4 +37 -0
- package/vendor/impeccable/bundle/blobs/424ff273e7ab283d6695d127bb502675627193f5b752d7b43b7524bcfc42f43f +84 -0
- package/vendor/impeccable/bundle/blobs/426c7f5437dd3c23a4cfaef6964dc7f1e038480f92238499b85f3ce7e4472bf4 +111 -0
- package/vendor/impeccable/bundle/blobs/42a71df98075f66e6eb396b69ef3d6b1c3db46d1c1d24b4edc9d15f53d193ecb +111 -0
- package/vendor/impeccable/bundle/blobs/433a79eee3ce4c99e79a7aebe3a6d8ec9ff70216772e0c2ff9dce3a01d672963 +46 -0
- package/vendor/impeccable/bundle/blobs/43852ca5917de66704f73f9019d15482bb1efd92f2eefaeeeae23610b4c0c6a0 +38 -0
- package/vendor/impeccable/bundle/blobs/442749aed338f51c1a3ccfb182c6ade9b74b90590b67984062ac94a5b100e914 +80 -0
- package/vendor/impeccable/bundle/blobs/44a91b3f0810f43829d8584e912812444d15614e4b57ca8070aee7ab899f7c1e +46 -0
- package/vendor/impeccable/bundle/blobs/46250caaec1bd69619a5b28a73cb3c845b319d029b0af9228aaa7001e7e0104a +37 -0
- package/vendor/impeccable/bundle/blobs/464c0c2b33d278375aec66caf95518f5e7ccd0aad1bea3f9dd553ed47815daa1 +325 -0
- package/vendor/impeccable/bundle/blobs/47b3461f6f76db80fdc49fc7542552d65fed24edc8d30d903cb76aefbad0ed05 +84 -0
- package/vendor/impeccable/bundle/blobs/47edbdfaf27073c47033d1ac7dfee881be49e2dcbda7671d1157300481dde6da +1 -0
- package/vendor/impeccable/bundle/blobs/4879f38b23d0a251a63cbb0327e660296194cd2e71eb4da3236c6ebfe5807746 +33 -0
- package/vendor/impeccable/bundle/blobs/48bb7c3b738f57fa4f3f714d7e3e919879036f3e751135a9acc1c5ede1850ea6 +54 -0
- package/vendor/impeccable/bundle/blobs/494d6fcb4701c437597c2ed16a9595af92f3d9ad53c944c96a2fb563bd766af5 +99 -0
- package/vendor/impeccable/bundle/blobs/49a7b37b98fb6e3ef68154174677ff4b9f1715efcffdbf6b30c3535b3e4e302c +54 -0
- package/vendor/impeccable/bundle/blobs/4a7d8695741e2cd354baada215b06798c050aa7a8e1ca6814f0e395e054d1ab1 +145 -0
- package/vendor/impeccable/bundle/blobs/4a8a45a46b79948a64b484edf389aa0b00fc80de855470cbabe3c7c71268f345 +828 -0
- package/vendor/impeccable/bundle/blobs/4acfb9e38f6e09f7484e36fc19704d69eab159436ee9329168be74c493042f22 +111 -0
- package/vendor/impeccable/bundle/blobs/4ad7c5d5821f85c2311ff91746d9b9cf272dbe0a9a5b61687f77681f5a13f812 +69 -0
- package/vendor/impeccable/bundle/blobs/4b0e2eea17f297daa06b17578131775be099ef43addf91007f4b7e295454f64f +105 -0
- package/vendor/impeccable/bundle/blobs/4bceaf3346b6f5100b5a54deaae49a38b975dd134df2836675848f06ff1e7e11 +806 -0
- package/vendor/impeccable/bundle/blobs/4ce929b8cafd37247ea4c148bbe39a9afe15908d1abf4a8248c5122275d16499 +85 -0
- package/vendor/impeccable/bundle/blobs/4df48b7a86d525ad12e7889a1fd16b06ed4b25a9470c359c7193a6d82649262f +54 -0
- package/vendor/impeccable/bundle/blobs/4fb6d2fcc8afaf827a7377ddd604725264fd83be871e2d35062e9d1939144404 +25 -0
- package/vendor/impeccable/bundle/blobs/51e2f8963377f142ebdc9864e0ecc5aa1e5b7d344ed72d0e9d748d2d3d8c71b3 +46 -0
- package/vendor/impeccable/bundle/blobs/521391d55814fdef6cd648ed62154a14d77b324004a0fc2d06c0a4e97857eab2 +806 -0
- package/vendor/impeccable/bundle/blobs/52e861ac390a62c4473ae0cf87ff18dd6d721afa6557910492dd8ed28bd9970d +84 -0
- package/vendor/impeccable/bundle/blobs/532d6387db6f5da1a59dc7d29ce4d8ba6ca044626c367dc16e1cb8b981eb2d9a +104 -0
- package/vendor/impeccable/bundle/blobs/54cb270e8826380caefc8c40642a5d973f27df46bfdb762d822541a0c72a9877 +145 -0
- package/vendor/impeccable/bundle/blobs/54e71283cbd5646021fcd8eaa28d85852ec5288109c306aca9db9e2e4832338e +69 -0
- package/vendor/impeccable/bundle/blobs/5515d5210fbe2ef64e611ef2827a7204b7cea2f9df059f3ea499931f45065d93 +104 -0
- package/vendor/impeccable/bundle/blobs/55e95137b3f9198c1d4dfc425366b82f1ef5f77d602682b2edf91f2ce9296289 +24 -0
- package/vendor/impeccable/bundle/blobs/56500b1f9d2fcec8324d7f448d813048b5831a46d3feeb1055bd3eb17ec3660f +70 -0
- package/vendor/impeccable/bundle/blobs/571526fd5c60a586ff65bdb3f8333f26c36ae227f5f5ece826f4a43b4d4aee0f +325 -0
- package/vendor/impeccable/bundle/blobs/5738bcf9ac21dbb2113fd0c5cc7e4bbfc8174778916ab5843644332b3dbbc36e +46 -0
- package/vendor/impeccable/bundle/blobs/57402ef6fd9d0745f8c60d778f77da83a8b16edf751fa1013598a0f6e5f0f541 +136 -0
- package/vendor/impeccable/bundle/blobs/57e28934208e3eac653ab59c5c6a5e4eace44906d8ac86472988242d777ca5a1 +54 -0
- package/vendor/impeccable/bundle/blobs/581409ace104a81744b7d08f5398a2c207cf76d9e50751f807b4382eaf66454f +46 -0
- package/vendor/impeccable/bundle/blobs/598bfed550954471ba4d257d46b4d608cd82e4cdbf36d07bf93c5f4a563f7727 +89 -0
- package/vendor/impeccable/bundle/blobs/599afc25c1d6d083e4d4e60e1617ab05f6c5ecd52be75473f3788063219aa174 +31 -0
- package/vendor/impeccable/bundle/blobs/5b30a06646ad5e453d6b5ed1b8d446f69fca3cd13b8aeda28f0d0b2cbe8f62d1 +111 -0
- package/vendor/impeccable/bundle/blobs/5b5dcf7029376ee6fbcf13e5975eb828dd1dbf41736c1bd5017dcda8173b1ebc +325 -0
- package/vendor/impeccable/bundle/blobs/5be952da521a2d5fb799c834d14ce5388284374bc23c5efcec737a05aa65d878 +84 -0
- package/vendor/impeccable/bundle/blobs/5c036648951d555e73be63161e5c9edcba146d8e9f64b1604ffdea765cde5d9d +131 -0
- package/vendor/impeccable/bundle/blobs/5c4cd151c97dae824a039211d7ccfba4c572b76d8f079c6186ba1dd5dae7732b +54 -0
- package/vendor/impeccable/bundle/blobs/5ce02fc8f353d7f659535fb80e453963dc047a07c4396adf098fe010b479e7c0 +84 -0
- package/vendor/impeccable/bundle/blobs/5ce0631eacaae6d9fbb23ade26a774a20142cb40d3a8d5608a3fb9dbc4116b60 +806 -0
- package/vendor/impeccable/bundle/blobs/5db17cd013c10dca0012bc18aee7276280941579aa50757682e9ce60c4f7a006 +104 -0
- package/vendor/impeccable/bundle/blobs/5e3616ac45568f239fda3a4764f7d3bf3473b8b5eefd91e402dd9208a4b851d1 +24 -0
- package/vendor/impeccable/bundle/blobs/5f24c5a97b4ffcabc7c432b064cfdd04c7a2ad52f52e765be648dc0aadab8f38 +38 -0
- package/vendor/impeccable/bundle/blobs/5fae7f8a2fc3ddd49ad0a413446dc44daedef5b6b7de5eb935bd2fbfad646d58 +92 -0
- package/vendor/impeccable/bundle/blobs/61c72fdde649bf7f2e0668e48f9d222666c81672100b5f2265940e7aa13c8767 +111 -0
- package/vendor/impeccable/bundle/blobs/633903ba7cb38ed502448a66691fbf655805786a2f06be67043f12294ad08e86 +37 -0
- package/vendor/impeccable/bundle/blobs/64802d14087fc96b38ef3881fef8098b36068d07f3b942031637b18eef3dd2af +84 -0
- package/vendor/impeccable/bundle/blobs/64807d8f43267f4ed879e997834bbf793bd4605ba1dc65f4b545324b660a7063 +80 -0
- package/vendor/impeccable/bundle/blobs/68bc52a604731ca024610051fc763f4d78a53eb2a45d35b40a8c0383043baa63 +86 -0
- package/vendor/impeccable/bundle/blobs/68c5636a7858dd0b5137a9229c15e25fdc2ee40a0f8a4e9d809f78e809256262 +327 -0
- package/vendor/impeccable/bundle/blobs/696c15f96d49a03091b71a408151a3297521f7a8231b98ca9b1103667a0b5f89 +80 -0
- package/vendor/impeccable/bundle/blobs/6989120346e87907d59cc6d4708dd9dee29227ad583fbefee28935395b68ce34 +24 -0
- package/vendor/impeccable/bundle/blobs/69be9bb887f4d8ba4ead24928f9b97d122c796e731652fc0c08f195ab8ec2815 +105 -0
- package/vendor/impeccable/bundle/blobs/6abbf5979db5cb1d7965bf5f91d589e984843069c587f4d1e63aab135bbace0f +37 -0
- package/vendor/impeccable/bundle/blobs/6acc0bf221a4ddc6e5c6438348920b2ca2393b29c4314dbde2cdc23f2b1a9639 +58 -0
- package/vendor/impeccable/bundle/blobs/6bc62a59f6fef0b749927c8d10e9849ab2411199d86d70772a86f8e83ac309f5 +29 -0
- package/vendor/impeccable/bundle/blobs/6bdbc3f745ceee15e10b050f109ce42bbeb53ab3c3b5239257de1d596654dee7 +94 -0
- package/vendor/impeccable/bundle/blobs/6c382f8283756e8a693d832b750f7e4cbff1ca5bdcc3825b2b4ef4da9f21876a +94 -0
- package/vendor/impeccable/bundle/blobs/6c9ce3e27ec4520ead001da3aad2a2ebba481c4e5cd22873db8890259ee579fe +95 -0
- package/vendor/impeccable/bundle/blobs/6d368b679a0ed1815812815de65863b5840d419589dfbda06224c01149240287 +258 -0
- package/vendor/impeccable/bundle/blobs/6d47503587ad6da17ac529f44a96123bbb96a9c91a7a9350b7690fc467561a5d +46 -0
- package/vendor/impeccable/bundle/blobs/6e20041e209e8705d14aa9c4fb8cca3f0d743791de633785e5b46e2dd1ff1a6b +24 -0
- package/vendor/impeccable/bundle/blobs/6e7e3b7c4cf331cdb43f4546c164acd6c45a267ce3289dcfa87e13202d98c747 +104 -0
- package/vendor/impeccable/bundle/blobs/6f1d52863482fa0f6fff877f0cc8f6dd0b4230d28050b0d267e082776e61a332 +37 -0
- package/vendor/impeccable/bundle/blobs/706c68612a7c6b899a0abf0b407eca7cabcd371deae60f830aa38aa86947694e +84 -0
- package/vendor/impeccable/bundle/blobs/713cac92a71ef45e8b700180d881f830096cfe2b0615e79b276ccc4a12c051e0 +80 -0
- package/vendor/impeccable/bundle/blobs/733504a70ed20bcfca9c26c353f7b88f8491d24f3f2fe124dc1e73b28eefa296 +145 -0
- package/vendor/impeccable/bundle/blobs/73549b5536699c915156339976192fb38534bb43158cf9262ff5b89090388c64 +806 -0
- package/vendor/impeccable/bundle/blobs/73bd60faec1d8360753595f1ee9e970b44933448202767d7b0e87c275d399396 +6 -0
- package/vendor/impeccable/bundle/blobs/745b1f74877f6b3445da48af65dc45c66c3daa7738cb9a928aaa900889c2a204 +104 -0
- package/vendor/impeccable/bundle/blobs/74e20b26c29242bbebf79760315f7f0788e001566695618cfc70805484c6f92a +111 -0
- package/vendor/impeccable/bundle/blobs/759bab1d8adc071fdde2efcf6e2157aa4026f3c2b4f3c342a8070bf328011616 +214 -0
- package/vendor/impeccable/bundle/blobs/7848f40e224cf520bd8554943c9816a1ff8c97b1db57af0844e3b1ebb223d91f +416 -0
- package/vendor/impeccable/bundle/blobs/78ac93689928a580c2f90242cbaa96dda3fa4e55ff1f1d00e412b2a62ad85232 +145 -0
- package/vendor/impeccable/bundle/blobs/78c236dadb7e70337dc9dfa67e65fc15b7abed137ad320c16410ddfa7aec34f9 +131 -0
- package/vendor/impeccable/bundle/blobs/79114c6bf78b5a1838fe19bf033f3be85b232560eebf190ff8586aaec34ea170 +105 -0
- package/vendor/impeccable/bundle/blobs/79f85e381d1d6fdc8d39f54e1c8753fccf19b4ba3abb9827b6a7cc61eb376d1f +416 -0
- package/vendor/impeccable/bundle/blobs/7ad26830c7399a118cdbd4465a5426bc1919015aba99fd15959dc6deb8edc8d6 +80 -0
- package/vendor/impeccable/bundle/blobs/7af0a8665057c83b39bca2c8c7427ef2343734f70d4128c377113a6726a1e3b1 +12990 -0
- package/vendor/impeccable/bundle/blobs/7fd1617d5a86b7a1a0bf9d6e291b334ac41a3efce31031eeaef11de7cd7e75b4 +325 -0
- package/vendor/impeccable/bundle/blobs/800cf1c0392b24de7c0a1c6ea6778ecb433dec71c49a150bce96a98477527b2f +1 -0
- package/vendor/impeccable/bundle/blobs/808291e15746c9a64d9ede3ad3f06664b0a72970aa95052e064a96f1bfbed361 +54 -0
- package/vendor/impeccable/bundle/blobs/81666fc7f783b4e3514db6554e713dc0479bd9cdedb06e93d15f8b579aae869a +105 -0
- package/vendor/impeccable/bundle/blobs/824b994782a1fe68a244bbdff7218a2e0854655d90cc0fb5ade7ef9259ba6305 +46 -0
- package/vendor/impeccable/bundle/blobs/82a5e564563333aabb7ab4d2f8c26c785dfe2c2416ac6e9f30cba31440676194 +46 -0
- package/vendor/impeccable/bundle/blobs/835f19a0a3812f3652dd6979a2ce5597f654fd01f26e1b420b92d5f42b997ce4 +121 -0
- package/vendor/impeccable/bundle/blobs/84a06415956986cb215139b3efda7b3c7a5bb6f502a3b3d9300f0744a970e620 +99 -0
- package/vendor/impeccable/bundle/blobs/84df879a0332a56ece4bff1922ecf4f50635951b3c67e67eb46f31bc5d30fa9a +111 -0
- package/vendor/impeccable/bundle/blobs/85b9c2d051de94ee9129c58be111946f73035ca62bbd2a3936f4fa48768fe5cf +145 -0
- package/vendor/impeccable/bundle/blobs/869fa5390b84bfd00d072f5280a9002ea3e3936edf5985241be641a87f03ff7b +41 -0
- package/vendor/impeccable/bundle/blobs/86d10faab62da852aa1f4304157871545c853da708b6fe61c80aefb552c1f300 +84 -0
- package/vendor/impeccable/bundle/blobs/87b3db688c7963898bda8096f7868fed05ec5a0a80d14298e8b906b70cdf9c42 +416 -0
- package/vendor/impeccable/bundle/blobs/88749ebbe9bc87250765a07c2b959508262bd0e276ad60baa53e6e48c3579143 +806 -0
- package/vendor/impeccable/bundle/blobs/896da399bafcffb0623bdd81bb18709d6eab25c9d5917e739c8798f31ff0d076 +46 -0
- package/vendor/impeccable/bundle/blobs/89eb0206a0d9308c6c6a7cc01bc4fd8812d2bd34bb9a831988c5d86fac2c60de +42 -0
- package/vendor/impeccable/bundle/blobs/8a1c872773996dfa1c1eb765ac7ed8e8d41f99d4f12f090b4725b694e85eaa62 +336 -0
- package/vendor/impeccable/bundle/blobs/8a2d316593a631579bbb2f3fcb90d4488f85e97f69698dd2dd4fb50766f537d3 +325 -0
- package/vendor/impeccable/bundle/blobs/8b23562ccc3e41609ce6e67fdad6cc57b6c961964c329eff6975a1b4c5471c0d +111 -0
- package/vendor/impeccable/bundle/blobs/8c06daf096984cf71cf4133ea284dd6eaf503208da828816836ea41dfb69a234 +80 -0
- package/vendor/impeccable/bundle/blobs/8c34f78d71ac02c99303c7e0ca9ef30341aa9ecdeb75804dcba7e36a127914c1 +84 -0
- package/vendor/impeccable/bundle/blobs/8e7bb79db7331b93f99de314dd5599de8587ec0b6c25e26cf1efab25c0777fcb +86 -0
- package/vendor/impeccable/bundle/blobs/8eb39a13e3d3650d4261f8fb06e91d6c0b888ca12ddbd3a5610cd8f0b05ad176 +69 -0
- package/vendor/impeccable/bundle/blobs/8eb466778023fccea641654d662157b123eeb360f4a0875bf6fbe3d93680851c +24 -0
- package/vendor/impeccable/bundle/blobs/8f0867db7c6f6a54348a0d951f198a1bd852cd12505d821e6e1ac6bd42e7fcea +87 -0
- package/vendor/impeccable/bundle/blobs/8f651cb1f8cde0acc5cc511b77fddd98558a527f54974698a1650b0fd7e849a7 +43 -0
- package/vendor/impeccable/bundle/blobs/8ff60b8b5369d364f732f8de10479a39294e65341b3e0b6497b21de5c8e34b2d +806 -0
- package/vendor/impeccable/bundle/blobs/904859c8160b02330b04db23a8eeeb4ef55bcaa10f5208b8d73a1718334633e7 +84 -0
- package/vendor/impeccable/bundle/blobs/910461b1c1f8216155165955c860a884a1e2f557cb38f21ef512ea90ef6503c2 +136 -0
- package/vendor/impeccable/bundle/blobs/9205e222bc6565b37fb504ceec93233c2d2a456802b69d16e6b1c44723907c4c +5 -0
- package/vendor/impeccable/bundle/blobs/93eda27117930692a20f668f1cb0a80b7e14ab865998faba567cd721116081d4 +84 -0
- package/vendor/impeccable/bundle/blobs/943b0d7c9ce4f6802d8440a07b2ad3c61cbd1cc00ab63962bab7eea9ca584d20 +46 -0
- package/vendor/impeccable/bundle/blobs/948326fab89f0d5c07355a06b9b9c30d08bba2e3a673a0151ebbf5a39dff7b9a +40 -0
- package/vendor/impeccable/bundle/blobs/94b4ce6299fea93d9f256b2d25705961a76bc5ea940c56db4145686ebc99df1b +89 -0
- package/vendor/impeccable/bundle/blobs/95b07450ad1ea0b7adc369587b06e52404945bbaa5d87f7491fac7ffd0e6e2ae +11 -0
- package/vendor/impeccable/bundle/blobs/960cb922bc934adbf9192e9428ff6bec1f382038166f02a785939c93b7391067 +139 -0
- package/vendor/impeccable/bundle/blobs/96e2e6bd4fcf9a2c6da65fb029f96d9176308fae2efd9d8653d3b8d838960e07 +44 -0
- package/vendor/impeccable/bundle/blobs/96e508039c719c0815701c36b8418b18baee1967f915fa29b23b84861ae8ea94 +127 -0
- package/vendor/impeccable/bundle/blobs/98afc4c6da252e90c6b783079b6f157bf94a13dd4351392e881edd2a100edf6a +105 -0
- package/vendor/impeccable/bundle/blobs/9a2c08ee2516d2ee87129e7ebe6a0895f9990c9852d1f6fa7e70be9a6a88a659 +234 -0
- package/vendor/impeccable/bundle/blobs/9b2fc50c5062073d097140cde85602bba181e325ec6b9eea1bd3da74582acb9d +46 -0
- package/vendor/impeccable/bundle/blobs/9b85b85443aec09918befb83208c72f475457db8261a8fc5e83ef7eec474c869 +145 -0
- package/vendor/impeccable/bundle/blobs/9deb14303b421b5a9232755b5b9f317716f33e1e211557a98a00a9c409775c4d +145 -0
- package/vendor/impeccable/bundle/blobs/9e161532dc6731581d7a5f35bda5a2865e5248df7aff90e6dfc9221409893e35 +54 -0
- package/vendor/impeccable/bundle/blobs/9eb03b319ce7a2b281bc85ed1b0a437eb05ab2f765fc267354f9f9e6cbfadc25 +806 -0
- package/vendor/impeccable/bundle/blobs/9f1151faffbaadba0ddf5c09a4b2a82c9a12c900a2c1a9dac9863ba9ba0f420e +54 -0
- package/vendor/impeccable/bundle/blobs/a1a56df5fd51be403ca85a2f8054bb6f2bfeee443556c7798c2482e412fb6a09 +54 -0
- package/vendor/impeccable/bundle/blobs/a1dbde501ffabb50f30f28f2de6755b5e91b3d4028292c5a3abd3358106eb457 +37 -0
- package/vendor/impeccable/bundle/blobs/a1e4febca3455787d7c753fe177a150dccde6e742957de400b0307247802d200 +145 -0
- package/vendor/impeccable/bundle/blobs/a423108e7e31a54564e2e0794186394f842625fd9f7d7ce6e6615362511503a2 +93 -0
- package/vendor/impeccable/bundle/blobs/a4cfd2330c8cca94b62986679b3f9e3bb9ada0cb30c2c63c5d19c6039f5a45ae +104 -0
- package/vendor/impeccable/bundle/blobs/a5371492582dbeb69b24a1a2947b256a2da8a4d55917af709bbab6e452d9d23c +145 -0
- package/vendor/impeccable/bundle/blobs/a55f016c046cb6a27c55bd7f346375aeb506a755c4fbca19a5f92dbd42309c23 +59 -0
- package/vendor/impeccable/bundle/blobs/a7045711a1f0dd2cd5bd98e57ff615f638d7e29738bdd618cf15e83fea5993b9 +325 -0
- package/vendor/impeccable/bundle/blobs/a7f036f4217933db8a96cf2f0ba251b15f388839d62bcf95720ce0b7152dd185 +806 -0
- package/vendor/impeccable/bundle/blobs/a8547c8565979894f0c07f92a96ac2a38e681a31fbf155ffeefc7566e185d9c2 +39 -0
- package/vendor/impeccable/bundle/blobs/a8f4056a85706c0c8f80ec48e9b437e198464100aa42786f9252051f4b931c19 +111 -0
- package/vendor/impeccable/bundle/blobs/a9515f6f084d8f51c378eb3cdc6db1f12e06dba2d32fc61b7ee7950fa2586f2e +24 -0
- package/vendor/impeccable/bundle/blobs/a9856cb40da6519b1334bcfc75a4fbe83bef39ca86ee6f3effcb2a96794c627c +127 -0
- package/vendor/impeccable/bundle/blobs/a98b397cedeeaa1da57f3395b3d9b6c1fc477f4247fb9dc13e4da3da588283ff +54 -0
- package/vendor/impeccable/bundle/blobs/a9d2203acd45ca33a13d5c68b02b23ed512425ac15f0e8438318ed124b43729d +61 -0
- package/vendor/impeccable/bundle/blobs/ac695dd89d5f1261004cfa966526f5d5e913c92fa0640d4d71cb42493effad08 +131 -0
- package/vendor/impeccable/bundle/blobs/ad389ab12800738b0e5c97618278b7a824654b25990166ec9f389caa5c3386ca +37 -0
- package/vendor/impeccable/bundle/blobs/add1bee76f897f989166a5b9ad1b38d9173248e29d668d5c885ae9a0eff73861 +105 -0
- package/vendor/impeccable/bundle/blobs/af34b8af89edb10e228c0482754423f48238fce816eceb8703b8781c130da54e +24 -0
- package/vendor/impeccable/bundle/blobs/b0e1a0721a1e47675a8750cfb608138743dd9fa9c047146e5cc8f82b9041be7a +806 -0
- package/vendor/impeccable/bundle/blobs/b14dc725606717be881a058bb691c0af1860cc8ad98d48e5a4789fe1a7de5458 +806 -0
- package/vendor/impeccable/bundle/blobs/b161198874e4e77599bc31691e78790be14bacc2eb03be168c8a7543ece9fbe1 +145 -0
- package/vendor/impeccable/bundle/blobs/b29e10f4506af2277739ad2373bc91c9fff41dbe76c9907f45152b4178cc6b6c +105 -0
- package/vendor/impeccable/bundle/blobs/b2d71ff0df7ed49e06dfc4acfce3d3f7eb48afa68be04763ee8c08354df50a07 +97 -0
- package/vendor/impeccable/bundle/blobs/b2f60e0154bf0e687badc46d8c8420e2118a9a6e21162050722be779dc02cb6d +111 -0
- package/vendor/impeccable/bundle/blobs/b314a0c5bd844f6471ea3031aeb9299674d972fbdd1615d99d16478de437d26d +84 -0
- package/vendor/impeccable/bundle/blobs/b31ff29c7a1ea979c6d039f7e8d17007410697ab49536690dca109f0af3f20f8 +336 -0
- package/vendor/impeccable/bundle/blobs/b3782f2d9215eb0f5df4fe3c0e0bec07cef011e1836d4d0e45ef02bc48d3adde +24 -0
- package/vendor/impeccable/bundle/blobs/b4def5b57733b6ba233570bd5691a536901f8b15479fc0111a2cde56224d0e1a +325 -0
- package/vendor/impeccable/bundle/blobs/b5f4fbb4a044c3f5ec14adc847222488f00fccabbf79ecd0b21084c8d319d616 +105 -0
- package/vendor/impeccable/bundle/blobs/b6022a8c7200e96b0b55c2ff599a01d64123a2f5fe01557d4ca5192a6e0f0b0c +145 -0
- package/vendor/impeccable/bundle/blobs/b6a2ef031313d3848ab2928875298550836f0f9ff7bdf5772e918c5c610ea448 +806 -0
- package/vendor/impeccable/bundle/blobs/b6dfd3df9a371e7d179d365cc1d72c11d4ed91b6507c0e1dbec0843419542f66 +84 -0
- package/vendor/impeccable/bundle/blobs/b7fcd2b03539d1029c8774fa806e6f4c677448e9e97e15f69b066022536c5491 +80 -0
- package/vendor/impeccable/bundle/blobs/b824bb76a657d3edd65e89807dcb21a3679eab39292423066e11368b35afba79 +325 -0
- package/vendor/impeccable/bundle/blobs/b8d49a3cab3428d9f351502e9c2c5802cef187e0d2af626ef3e1cd1837fd06bf +105 -0
- package/vendor/impeccable/bundle/blobs/bad9250670c18d89722563fd747bae4c4bec64d1db0ee09d12d4fea04fe271b8 +84 -0
- package/vendor/impeccable/bundle/blobs/bb069b43c09109d7031b0374e31955749fec657b252d39782f11e8985aca2b51 +131 -0
- package/vendor/impeccable/bundle/blobs/bb36665889124a0b6e15f16045265737449c3bdcf2712cdb08af3cfa01563e2b +14 -0
- package/vendor/impeccable/bundle/blobs/bb59a1f78f3d2aa78e4b024fe203117155f50946a9e4bbe65c1b3b3abdcee356 +104 -0
- package/vendor/impeccable/bundle/blobs/bb9d4bb369216e892eea25adeaefc5a3e09bb4abd31e3475b79e47b3aee2a6af +806 -0
- package/vendor/impeccable/bundle/blobs/bc5f71f1129d0f2c310d913d07c8dc609a1d25644121bd78c308f42d52a0b9e9 +86 -0
- package/vendor/impeccable/bundle/blobs/bc7a5128cfed46148396c08798b6b9429406fbe477e84e331a36ee2840b6b776 +111 -0
- package/vendor/impeccable/bundle/blobs/bcc05ea92faebb5c74037a9d4263a5ce9a56f5ab07c8ab3c59ee704d8cade745 +24 -0
- package/vendor/impeccable/bundle/blobs/bdf9a59beea111ac6f98f5624854feb5a5a1d60b1989edbbfabf3dc6f357a7e6 +105 -0
- package/vendor/impeccable/bundle/blobs/bdfd2a879ca65e437481eac5309f2283da225121630935d89ed902cfdf470c8e +105 -0
- package/vendor/impeccable/bundle/blobs/bea6ebfda78c51b9cf372097a1d77431d0f6bcd96eadec13a2ac95afbb87fb6d +104 -0
- package/vendor/impeccable/bundle/blobs/bead87679caad7c537dd7c04c3bb78be56ac7eec279ad6aad7322f48ff2df2d9 +312 -0
- package/vendor/impeccable/bundle/blobs/bf3b8883f8550744e08754af82a78939ab8b1237e5fad6f38d819e2f17e8a389 +104 -0
- package/vendor/impeccable/bundle/blobs/bf92a4a51b29de9661c5fa82f3d79244718a67d385ef661990f0c4a5b367e843 +104 -0
- package/vendor/impeccable/bundle/blobs/bfc51972fbf387566dc9e29c8b1af479a66ab401fdbce659fae9e6a5a9d85316 +69 -0
- package/vendor/impeccable/bundle/blobs/c02feba25a961a72647ad317aba2d65baeeed53c4cdcc072f25bb37f4d867d43 +84 -0
- package/vendor/impeccable/bundle/blobs/c1cb6877ca99a0c1b38ba0c7d59f32702d3022f6821d8045f7133f7c40b6362f +242 -0
- package/vendor/impeccable/bundle/blobs/c1f3766091019b6f9183bc1d11b1e0fe03d44c168dc05a682c55df32f904dcfd +33 -0
- package/vendor/impeccable/bundle/blobs/c327bf17f2af186f87164dee5fb5468746a9b137f0b604365d531ac9387f3712 +325 -0
- package/vendor/impeccable/bundle/blobs/c36f6aac0ddf52eabbb21df09fd3310540dca6b09e7a4017d18e94c06c469405 +46 -0
- package/vendor/impeccable/bundle/blobs/c3ad2a5fa570876af6645c48d246c664859e19f253d2dc9e0ead34e785d5b40a +84 -0
- package/vendor/impeccable/bundle/blobs/c6a0ec6c28ae55fe539f0f41a507b1638495afd285d6eb15c00245fc8cc7e7fe +42 -0
- package/vendor/impeccable/bundle/blobs/c6f15d20d8d8748c4c475ff70cdb0ee426f2e6c9e7eab6169311f4dffd279ea1 +54 -0
- package/vendor/impeccable/bundle/blobs/c83d6a13fdfb58835c845f61aed3fc6dca17b5569d33387ced840bc13424f354 +84 -0
- package/vendor/impeccable/bundle/blobs/c9284892cb1f21aaeaf93fdf2e9e7a679d05e0baa8ddf309a79a9790d262ad38 +806 -0
- package/vendor/impeccable/bundle/blobs/cb8caddbb3919e5bf7f252143b519fb16db28a244642d937b186cb89962d9201 +828 -0
- package/vendor/impeccable/bundle/blobs/cbd8bd68fa00935dd0f179adb169252629cf7ee443ea9dc7db77e7ef2cf77446 +4 -0
- package/vendor/impeccable/bundle/blobs/cf3ae16765e7b5bc333ef76e24ab37f080e3d62e931c4986158e3cbcda6b9f7a +46 -0
- package/vendor/impeccable/bundle/blobs/d07e3131cdf3e392e59eaa3e2f59fcb0799d9494df4adfee12a21067fb8365ce +37 -0
- package/vendor/impeccable/bundle/blobs/d1366aa4802b364893c2a14b16fe95c3b7fab79f9f69eb272fd1538f7cb1ce2c +105 -0
- package/vendor/impeccable/bundle/blobs/d15a2914d93e07a4956acd5c8b8211af17380f527acd10d8acf4f4920badaaaf +89 -0
- package/vendor/impeccable/bundle/blobs/d1faa55eb956033d28e9f27fd2bc2a9f62c5da0f0abd6534819cc0a04db54d9d +37 -0
- package/vendor/impeccable/bundle/blobs/d1fbd55074abb2251bdaa03749d34acc42c38e46e47549f18f5848df57d43c42 +86 -0
- package/vendor/impeccable/bundle/blobs/d2455359baf5f9e75360c7094e28a16937c8674619e07d58f30d2b5abfd31e53 +105 -0
- package/vendor/impeccable/bundle/blobs/d658c48ffbe0031e8e3b318996cad6ceafe29e40aa50d5bb25e4bf1d6839dc7c +89 -0
- package/vendor/impeccable/bundle/blobs/d6a1fa1689642a6db9027493747d7ed54f9e0cae660472022c0a0a8dfdead3f4 +54 -0
- package/vendor/impeccable/bundle/blobs/d7211a816aa8ca1111701930f7cdab82b4c8caa94c9a37522c1d7945209b01c2 +84 -0
- package/vendor/impeccable/bundle/blobs/d87879329982d608866e4babd31c61438ec34c68483e529761fbf420203eeebd +104 -0
- package/vendor/impeccable/bundle/blobs/daa2a8ecd874f9f940dfd72aaa329318b06bb9be25515be85fea84c871b637a6 +145 -0
- package/vendor/impeccable/bundle/blobs/dcf7340da023e64144af5768b8bf44ecf45b1bfdec12d3b1c9e6618f17f8c60a +131 -0
- package/vendor/impeccable/bundle/blobs/dde1b74aeab3d90320e134f0ed0422bef99917dcab4c1749aa1720a2c94f725f +37 -0
- package/vendor/impeccable/bundle/blobs/de1b7404f4cdfd7b515196afb17b74b1980f0bc88cb8681ae93a76ca48ec7bdb +167 -0
- package/vendor/impeccable/bundle/blobs/df0eb9e9a484fc7b8a0f3e50573a7d7f81e0f17598ac30d9f3fe5a6c6aa5fefa +37 -0
- package/vendor/impeccable/bundle/blobs/df23e9ee5b689a05ed88f42e9a36aaffa2e6e28b1d56e2832acaa1d3603fd363 +105 -0
- package/vendor/impeccable/bundle/blobs/df4f14df1daaad1606b682995f649da19a85debf264092447b3b7ddb8b4bc1ce +147 -0
- package/vendor/impeccable/bundle/blobs/dfd6f341b156bc604e7556b27cba437d5870fbc82d4c673d0127cf18151b2226 +99 -0
- package/vendor/impeccable/bundle/blobs/e02ba7f4417e84b3bd5ec65287c4a14cf163ca3ac6f8ee37d8f709d0c8b0b6d2 +84 -0
- package/vendor/impeccable/bundle/blobs/e21af575fcc0f1df54ae422bea4dfa1e5211422606908919f6a86e19e0d5c20c +89 -0
- package/vendor/impeccable/bundle/blobs/e26ddd48211aae08fe6debf2a7a4308aa081ed224668cde528e451888db0e3e3 +325 -0
- package/vendor/impeccable/bundle/blobs/e2e275495354eeccb7e59af7d74e2ff1f371839bd6aaec1266428760995fb24c +104 -0
- package/vendor/impeccable/bundle/blobs/e2f98c4136d0ab70ec32fcdef58edb20ed8ec4f6cc067e0dae952b22cfd6a471 +24 -0
- package/vendor/impeccable/bundle/blobs/e3c331cc21d9a216e25e08628610ea99c97e150893c3d26e5c0cecc532f26d7b +24 -0
- package/vendor/impeccable/bundle/blobs/e44ca51f24c4736f9aee6024182b0409aa12ec94812b7ec94745e0999ed06a70 +29 -0
- package/vendor/impeccable/bundle/blobs/e49d2b0110c55751da3c965b4ae4d294aa676c961a09f8efbbbf22c1ec7c4fa0 +24 -0
- package/vendor/impeccable/bundle/blobs/e68467ba99684d8c975a8a2725145d29db41d70659c7544ea54cc6632660cea3 +127 -0
- package/vendor/impeccable/bundle/blobs/e71524578eb2bda3b8d2da3d8b8371239a2179c5fa866f9f7e48bcac45a8cd6f +84 -0
- package/vendor/impeccable/bundle/blobs/e71d6b97680084a7ccec01844e658cbd2042aec00da0c91bec62a240ad7dcf6a +145 -0
- package/vendor/impeccable/bundle/blobs/e7dd10af2c3c18c60dc20734d55ff870c323a10dadd337600f7bb980fc6b53c8 +327 -0
- package/vendor/impeccable/bundle/blobs/e802e4f7bdc89050a9c0f2ca506e1d493a2316e6e810c0336c57aa073717ef3e +50 -0
- package/vendor/impeccable/bundle/blobs/e8ee6c08e94b80324173d89d6f4cdc5b4829ea6858b3a11fc186588a490cada4 +46 -0
- package/vendor/impeccable/bundle/blobs/e9da72a13eb3411d6bbb316953022f62abc4434f505e5345907b216eda9f793b +39 -0
- package/vendor/impeccable/bundle/blobs/ea8432c90c30ecb0426662a681ead5c0941113079704e1a766cda09e85b15b4f +111 -0
- package/vendor/impeccable/bundle/blobs/eaa50e8cd95e00a94a257db2bff4eafd820696ba75a08a384a00517c3402924e +325 -0
- package/vendor/impeccable/bundle/blobs/eb3213b9c9f4d6b2f153e7b457f13aa131bcf633695229dad4eac39a920bdf38 +46 -0
- package/vendor/impeccable/bundle/blobs/ec58806f16fc7ba29bccef08f2e158cd00be077ce05d45e943a59bd26dc6dc55 +312 -0
- package/vendor/impeccable/bundle/blobs/ec6338b20047099601e4bac8b2efcd597f800d5e437259f6c15d23090400621b +325 -0
- package/vendor/impeccable/bundle/blobs/edddeb3fad88adec9a055b1bf9d5c75418cbe97a13b1a7f6765e73249e482563 +144 -0
- package/vendor/impeccable/bundle/blobs/ee0a15fcfc244b76b896a2650a17b35e444d4311166b69a3cfa32d11f8f44851 +30 -0
- package/vendor/impeccable/bundle/blobs/ee6d6d127c1c2ab3526d529a8e3698be2185b5e346ac617f37501de2c0698b97 +99 -0
- package/vendor/impeccable/bundle/blobs/ef0b8eca20e1321cf7216fd0bda41ce54b0cca197cfd1b075eb51f3436f59059 +24 -0
- package/vendor/impeccable/bundle/blobs/ef2dde00030580ed2765cbf7be9b2ea4a6f64cb915b804fd6f6abcf38051c7b9 +234 -0
- package/vendor/impeccable/bundle/blobs/f0c4d0615c7d520dfc2536c01cc7f1f3aab9b60ddc399ba01289fe62edb12370 +24 -0
- package/vendor/impeccable/bundle/blobs/f1601095679d7d8cf6fef6845598c70d8734190709c1404fa0026e28fef2faaa +325 -0
- package/vendor/impeccable/bundle/blobs/f173ff03f989f162cee815feb2d8ca72daf00019c48694d89db16d52171a79c0 +24 -0
- package/vendor/impeccable/bundle/blobs/f424dafa190533cd32c0bc3e4131d0c472d58e16bb191eab14f0ae73c2cea917 +37 -0
- package/vendor/impeccable/bundle/blobs/f597742c8e5562263d3bce725cb55e920d8c2c60223f41a632d523ca30cdd12b +111 -0
- package/vendor/impeccable/bundle/blobs/f672ef8251a3ed4051a053d30819664951b17540b2899acd27d20e500c234abc +258 -0
- package/vendor/impeccable/bundle/blobs/f7916d0113da7a19d4e03c113d5563d181457e44f1646ecab9191cfee5ae776d +89 -0
- package/vendor/impeccable/bundle/blobs/f7a9e3f30fe07b0d98351730e9895d50bba96dd42fe91c0d9b9a76ef62e53322 +80 -0
- package/vendor/impeccable/bundle/blobs/f7b854effc55c8f07e40a415e0d6b5c333f4042fbc849fac73d52619c8d053a1 +54 -0
- package/vendor/impeccable/bundle/blobs/f964506c0fae87b3c2c1db7016ddc9be9ef970bbcf5548d684b997b5d5991586 +33 -0
- package/vendor/impeccable/bundle/blobs/f97a6891c80bbbc728edefcf4b638d1a823b38f3cb16ecd0fbb717734cc5c0c8 +46 -0
- package/vendor/impeccable/bundle/blobs/f9cbbad0cc08fb9bd69d4d3046067c6cf820b89cdaf7af8c81c671fb0a62b6ae +54 -0
- package/vendor/impeccable/bundle/blobs/fce6688138d2ceb1e3d2cde5231f54b1d8dc8748b4c95a7919aa83b6f924cf96 +127 -0
- package/vendor/impeccable/bundle/blobs/fd5579dbae1fc2495b7dddde48df9673acebd27953bbb56d506d3b470375c9e9 +37 -0
- package/vendor/impeccable/bundle/blobs/fe91fcf28638f95577af481a50edaf339d6c9a3ad3b9fa477bc81c116b8bc392 +139 -0
- package/vendor/impeccable/bundle/blobs/ff0ab1361f52d70d3ff0d23090d78794a75afdfa2f8c1cee5491dee69215faaa +105 -0
- package/vendor/impeccable/bundle/blobs/ff882c59c9aced92338aa194cc99a521ea2f083fd22eef3b1c1225e06bc72f66 +86 -0
- package/vendor/impeccable/bundle/manifest.json +1139 -0
- package/skills/dev-plan/evals/evals.json +0 -72
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: portal-external-app
|
|
3
|
+
description: '接入「外部镜像服务类应用」——服务端代码不在本 repo、以 Docker 镜像交付的 App(知识库/多模态解析/异步任务网关这类)。凡任务涉及为外部服务写对接契约或 app.manifest.json、register-app/provisioning 注册布线、/svc 路由与健康检查、外部服务的服务账号与 scope、一盒(one-box)本地联调、或评审外部团队的交付物时,务必先用本 skill——即使用户只说"把 XX 服务接进来"。Use when integrating an externally-built docker-delivered service app into the portal: manifest, register-app, provisioning, /svc wiring, one-box debugging, or reviewing an external team''s delivery.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# portal-external-app · 外部镜像服务类应用接入
|
|
7
|
+
|
|
8
|
+
外部镜像 App = 服务端在别的 repo(任意语言/栈)、独立镜像交付、**常驻**(不走按需缩零)。鉴权与业务 API 遵循门户运行时契约;**`/health` 支持平铺 JSON 与 Envelope,检测规则与平台运行时一致**。本文件是判断与流程;具体契约按需读 `references/`(为本 skill 提炼的自包含参考,可整目录拷到外部团队 repo;权威源是门户仓库 `docs/`,冲突以门户仓库为准)。
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
> **路径约定(先读这条,能省一次白找)**:本 skill 里出现的 `apps/…` `packages/…` `docs/…`
|
|
12
|
+
> `deploy/…` 这类路径**都在门户仓**。在 App 自己的 repo 里它们**不存在** —— 它们标注的是
|
|
13
|
+
> 「门户侧要做什么」或某段内容的出处,**不是让你去打开的文件**。找不到不是配置错误:
|
|
14
|
+
> 别去创建、别去全局搜、别把它当缺失依赖报出来。你需要的一切都在本 skill 的
|
|
15
|
+
> `references/`(自包含)。若你正在门户仓里工作,那这些路径就是可以直接打开的真实文件。
|
|
16
|
+
>
|
|
17
|
+
> ⚠️ 一个例外:`/apps/<key>/`(带前导斜杠)是**线上 URL 路径**——微应用产物的挂载点,
|
|
18
|
+
> 与仓内的 `apps/<key>-app/` 目录无关,别混。
|
|
19
|
+
|
|
20
|
+
## 按任务读参考
|
|
21
|
+
|
|
22
|
+
| 任务 | 读 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| 实现/评审资源服务器(四道闸、health、env、认证面划界、配置面) | [references/integration-contract.md](references/integration-contract.md) |
|
|
25
|
+
| 实现 `/health`、出仓迁移、发布镜像或健康检查失败(必读) | [references/health-contract.md](references/health-contract.md):两种正确实现、实际判据、发布前检查命令 |
|
|
26
|
+
| 写 manifest、注册布线、一盒联调、排查 | [references/registration-and-onebox.md](references/registration-and-onebox.md) |
|
|
27
|
+
| 为外部服务写/审对接契约文档 | [references/contract-doc-template.md](references/contract-doc-template.md) |
|
|
28
|
+
| 有「每租户最多几个 X」的配额诉求(选模型、数值谁配、已用怎么来) | [references/quota-and-seats.md](references/quota-and-seats.md) |
|
|
29
|
+
|
|
30
|
+
## 先判形态(决定后面走哪条线)
|
|
31
|
+
|
|
32
|
+
- 有用户前端?→ `type:"micro"`(前端 dist 同源托管 `/apps/<key>/`,前端开发见 portal-micro-app skill);无前端 → **`type:"service"`**(无头:不露卡、不可打开,仅作被调用方,控制台可治理)。
|
|
33
|
+
- 谁调它?→ 自己前端(用户态 TDT)/ 其他 App 后端(令牌交换,见 portal-app-exchange skill)/ 其他服务无用户直调(服务账号 `client_credentials`)。三种来路授权姿势不同(integration-contract.md §3 的表)。
|
|
34
|
+
- ⚠️ 第三种里,如果调你的是**租户自己的**程序(采集器、脚本、CI),租户管理员可以在门户
|
|
35
|
+
`/admin/service-accounts` **自助**开凭证,不用找平台管理员代建。**但它只能勾到你 manifest
|
|
36
|
+
`scopes` 里的 scope** —— 只写在 `serviceScopes` / `privilegedServiceScopes` 里的那条,
|
|
37
|
+
租户永远勾不到(症状:功能上线了、租户面却没有任何可选项)。判断口径与两条路的差别见
|
|
38
|
+
[integration-contract.md §3.1](references/integration-contract.md)。
|
|
39
|
+
- 它自带认证体系(API-Key/节点 Token/gRPC)?→ 按 integration-contract.md §6 划界:门户面必走 TDT 四道闸;自有节点面保持原认证但**不得**进 `/svc`(`/svc` 只转发 HTTP :8080)。
|
|
40
|
+
|
|
41
|
+
## 交付物评审 checklist(收外部团队东西时逐项验)
|
|
42
|
+
|
|
43
|
+
1. 镜像:监听 8080、网络别名 `<listingKey>-server`、amd64+arm64、**不烘焙 .env**、`docker save` tar + sha256 或私有 registry;
|
|
44
|
+
2. `app.manifest.json`(外部团队 repo 里的单一事实源);
|
|
45
|
+
3. env 契约表:**镜像实际读取的变量名**(镜像自有前缀与门户契约别名的映射必须写清;有的镜像不读裸 `PORT`);
|
|
46
|
+
4. **迁移入口**:迁移文件在镜像里、二进制上有一个迁移 argv(见下节)。「迁移脚本留在自己 repo 里」= 不合格;
|
|
47
|
+
5. 运维口径:是否需每租户 bootstrap(需要则 `tenants.id` 必须 = 门户租户 UUID);**`/health` 必须通过 [健康契约验收](references/health-contract.md)**,按平台同一判据验证正常与依赖故障;信封响应不能只检查 HTTP 200;
|
|
48
|
+
6. **有没有重复造平台已有的能力**:自己存文件 / 自己发通知 / 自己记审计 / 自己排定时任务 / 自己算配额 —— 逐项对照下面两张表,命中就要求改走平台面;
|
|
49
|
+
7. **租户自助凭证**:这个服务有没有「租户拿自己的程序直接调你」的场景(日志/指标摄取、批量导入、CI 回写)?有就检查那条 scope 在不在 manifest 的 **`scopes`** 里 —— 不在的话租户面开不出凭证,只能退回「找平台管理员代建」(见 [integration-contract.md §3.1](references/integration-contract.md));
|
|
50
|
+
8. **配额诉求**:有没有「每租户能建多少」这类上限?有就走平台套餐(见 [references/quota-and-seats.md](references/quota-and-seats.md)),**不接受对方自建**;
|
|
51
|
+
角色本身该由对方在自己的 `app.manifest.json` 里声明 `seatRoles`;`serviceScopes` 里出现 `seats.read` 仍是当场打回的信号,但对方可以在 `privilegedServiceScopes` 里**申请**它(带 reason,进「发布审核」逐条确认批准后授予);
|
|
52
|
+
9. 对接契约文档:按 [references/contract-doc-template.md](references/contract-doc-template.md) 的结构与精度。**没有这份文档的接入不算完成**——新服务(如任务网关)要先补。
|
|
53
|
+
|
|
54
|
+
## 资源服务器硬契约(外部实现最常炸的四处)
|
|
55
|
+
|
|
56
|
+
1. **自省信封解包**:门户响应必须先检查 `ok === true` 且 `data` 为对象,再校验 `data`;失败信封或缺 data 返回 503,不能回退到顶层。只有合法 `active:false` 才表示凭证失效。TDT 的 exp 必填;无过期长期 key 才可省略 exp。主体/凭证类型矩阵、ACL 范围与缓存预算见 integration-contract.md §3;
|
|
57
|
+
2. **`/health` 按响应形状判定**:HTTP 非 2xx 不通过;2xx 响应顶层有 `ok` 时,必须 `ok === true && data.db === true`;没有顶层 `ok` 时按 2xx 判健康。平铺 `{"service":"my-app","db":"ok"}` 与信封 `{"ok":true,"data":{"db":true}}` 都支持,不按内建/外部 App 区分。平铺依赖故障须用 HTTP 503 表达;不要给字符串状态直接套 `ok(...)`。完整示例与同源检查脚本见 [health-contract.md](references/health-contract.md)。
|
|
58
|
+
3. **门户三变量 all-or-nothing**:自省地址 + SA clientId + secret 全缺→鉴权停用 503;缺一→启动 fail-fast 打印缺失项。
|
|
59
|
+
4. **平台级跨租户闸**:如有跨租户路由,只认服务端自省返回的 `claims.isPlatformAdmin === true`。它由 Portal 按用户实时计算、不在 JWT 里;`role` / `bypass` 只属于当前租户,服务态恒为 `false`,不接受前端自报或 Cookie 转发。
|
|
60
|
+
|
|
61
|
+
完整契约(四道闸、三种令牌来路、审计、划界)见 [references/integration-contract.md](references/integration-contract.md)。
|
|
62
|
+
|
|
63
|
+
## 注册布线(细节见 registration-and-onebox.md)
|
|
64
|
+
|
|
65
|
+
- **dev / 一盒**:`bun run register-app <manifest>`(幂等,生产拒跑)= upsert listing + 直写服务账号 + 写发起方 App Secret + 写 `/svc` 白名单 map。⚠️ `exchangeInitiatorSecret` 的哈希在**首个租户**安装时还没有任何实例可布——先安装 App,**再重跑一次** register-app,否则发起交换 401(之后装的租户会随安装自动补布,见 registration-and-onebox.md §2.2)。日志里 `wired into N …` 的 N 是「**改了**几个实例」,0 也可能是「本来就对」——判据是比哈希,见 registration-and-onebox.md §2.2。
|
|
66
|
+
- ⚠️ **发布 ≠ 租户能看见**:租户市场对 `tenant_listing_grants` 是 fail-closed。**dev 的 `register-app` 会自动授予当时已存在的租户**(非 service 型,输出里有 `租户可用应用:` 一行);**生产不自动**(提案批准 / 控制台导入都不授予——语义是平台管理员显式勾选)。症状是「控制台显示已上架、租户市场里却根本看不到」——去 平台 › 租户管理 › 租户 › 「可用应用」勾上保存(registration-and-onebox.md §2.1)。
|
|
67
|
+
- **生产(标准路径)**:清单事实源在**对方仓的 `app.manifest.json`**,经
|
|
68
|
+
**发布提案**到达:平台管理员在 控制台 › 应用市场 › 接入新应用 按 key 签发 `xrel_` 令牌
|
|
69
|
+
(无行先建 draft 占位),对方 `publish --manifest … --dist … --image …` ⇒ 首次必进
|
|
70
|
+
「发布审核」队列 ⇒ 批准 = `registerFromManifest` 一次建全(listing 上架 + SA + /svc +
|
|
71
|
+
已装租户对齐),SA secret 明文一次性回显给审批人。**不要**再把外部 App 登记进
|
|
72
|
+
`LISTING_DEFS` —— 那会成为把对方清单静默改回去的第二事实源(verify-split「清单零残留」
|
|
73
|
+
棘轮看守)。门户保留的平台侧事实只有:部署行、Caddyfile 内联行、`EXCHANGE_WIRING`,
|
|
74
|
+
以及作为**种子**的 `SA_DEFS` 与内置 scope 常量 / `USAGE_METRICS` ——「审批而非发版」后,
|
|
75
|
+
特权服务态 scope 经对方 manifest 的 `privilegedServiceScopes` 申请、审批即授予(SA_DEFS
|
|
76
|
+
不再是唯一授予点,union top-up 也不会回滚审批授予);用量指标经 manifest `usageMetrics`
|
|
77
|
+
声明(治理档);控制台应用配置的 scope 校验运行时按 listing 声明放行(不卡编译期枚举)。
|
|
78
|
+
- **后续版本**:对方 CI 自助(`xgent-app-release` skill)——无治理变更自动通过,
|
|
79
|
+
治理变更进「发布审核」等平台批准。
|
|
80
|
+
- **scope 三规则**:平台基础 scope ∪ 自己命名空间(含连字符→下划线变体)∪ 已声明 `exchangeTargets` 的目标命名空间;越界 `VALIDATION_FAILED`。
|
|
81
|
+
- **secret 一致红线**:平台落库的服务账号 secret 与镜像 env 里的必须一致;漂移症状是自省 401 或「跨应用授权缺失」(实为 `SECRET_INVALID`),排查先 sha256 比对两侧。
|
|
82
|
+
|
|
83
|
+
## 数据库迁移:平台在部署时替你跑
|
|
84
|
+
|
|
85
|
+
划分决定一切细则:**schema 是平台级的**(随一次部署发生一次),**数据行是租户级的**(随安装发生)。
|
|
86
|
+
所以 DDL 属于部署步骤 —— 不属于容器启动,也不属于逐租户安装。
|
|
87
|
+
|
|
88
|
+
外部团队声明 `deployDescriptor.migrateArgs`(平台管理员填),控制器在**换容器之前**用
|
|
89
|
+
**同镜像 + 同 env** 跑一次性容器(`--rm`;pm2 / compose / K8s 三个 flavor 都实现了):
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
job(deploy|redeploy)
|
|
93
|
+
├─ ① migrateArgs 非空 → <entrypoint> <migrateArgs>;失败 ⇒ 任务红 + 旧容器继续服务
|
|
94
|
+
├─ ② ensureServiceUp ← 到这一步才换容器
|
|
95
|
+
├─ ③ waitHealthy(180s) └─ ④ openRoute
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**为什么不是「启动时自迁移」**:失败会变成崩溃循环(要 `docker logs` 才知道为什么),
|
|
99
|
+
还要挤 180 秒健康窗口。放在换容器前,失败时旧版仍在服务,且是面板上一个有名字、
|
|
100
|
+
带对方 stderr 的步骤。
|
|
101
|
+
|
|
102
|
+
**为什么必须在镜像里**:迁移要在**库所在的地方**跑,而跨越边界的产物只有镜像;对方 CI
|
|
103
|
+
连不到(也不该连到)门户的库。且镜像 = 那一版代码,它要求的 schema 与它同源同版本 ——
|
|
104
|
+
分开走就会漂。**门户永远不执行由 App 投递进来的脚本**(宿主机侧的 `migrateScript` 只对
|
|
105
|
+
仓内 built-in 开放,`descriptorToService()` 对 config App 钉死为 `null`)。
|
|
106
|
+
|
|
107
|
+
要求外部团队做到四条:迁移打进镜像 + 一个迁移 argv(如 `--role migrate`)· `pg_advisory_lock`
|
|
108
|
+
包住 · **失败非零退出**别自愈 · **expand-contract**(迁移跑在换容器前,那一刻旧版本还在服务)。
|
|
109
|
+
|
|
110
|
+
⚠️ **`migrateArgs` 只有门户部署了对应版本才生效**。反过来的顺序(先填字段、门户没更新)
|
|
111
|
+
会被 jsonb 原样存下、**无人读、不报错** —— 与被删掉的 `migrate`/`provision`/`bootstrap`
|
|
112
|
+
三个死布尔同病。次序固定:门户先部署 → 对方出镜像 → 才填字段。
|
|
113
|
+
|
|
114
|
+
⚠️ **每租户 bootstrap 目前没有出口**:`bootstrapScript` 对 descriptor App 恒为 `null`,
|
|
115
|
+
门户不会替外部服务建租户行。若对方的表 FK 自己的 `tenants`,接入时必须显式定方案
|
|
116
|
+
(对方开 provisioning 端点 / 首次使用自建 / 门户加钩子),否则症状可能是**静默写 0 行**
|
|
117
|
+
(`INSERT … WHERE EXISTS (SELECT 1 FROM tenants …)` 这种写法不会报错)。
|
|
118
|
+
|
|
119
|
+
## 改动启动必需 env 的键名,必须发版前知会门户
|
|
120
|
+
|
|
121
|
+
`descriptor.env` / `envFile` 是**平台管理员治理字段**,manifest 永远带不进值(提交即拒),
|
|
122
|
+
`requiredEnv` 只交键名。**键名集合的变化属治理档**:写进 manifest 的 `requiredEnv` 一变
|
|
123
|
+
(新增/改名/删除),提案就转入「发布审核」,管理员批准前先看到新键名 —— 这是把
|
|
124
|
+
「知会门户」变成流程内动作的那道门。**CR-3 之后它还是一道真闸**:批准前门户拿这张清单比对
|
|
125
|
+
`descriptor.env ∪ envFile` 的键集合(只看键在不在,不读值),缺了就拒绝生效
|
|
126
|
+
(`REQUIRED_ENV_MISSING`,提案留 pending);审批屏逐键标状态,非密钥可当场填。改名要写成
|
|
127
|
+
`{ key, renamedFrom }` 一条,门户会把旧键在 `descriptor.env` 里的值搬过去(**envFile 里的搬不了**,
|
|
128
|
+
门户不写那个文件,那一条会判「缺」并提示运维改名)。仍有一件它管不到:对方
|
|
129
|
+
**不写进 `requiredEnv`** 的静默改名依旧无门可拦 —— 症状是服务
|
|
130
|
+
换版后 `refusing to start`,而发布方那侧只看到成功。2026-08-19 知识库把 `XGENT_OPENAI_*`
|
|
131
|
+
整族改成 `XGENT_EMBED_*` 就是这么崩了几小时的;只改其中一个 key 更坏 —— 服务起得来,
|
|
132
|
+
但 base URL/model/**dims** 静默回落默认值。所以收交付物时仍要求:改必需 env 必须**同步改
|
|
133
|
+
manifest 的 `requiredEnv`**(改名走 `renamedFrom`),并把「本版新增/改名的必需 env」列进 checklist。发布面本身
|
|
134
|
+
(令牌、tag 不可变、`--wait` / `--wait-review` / `status`)见 `xgent-app-release` skill。
|
|
135
|
+
|
|
136
|
+
### 值从哪来:三档键名约定(照这张表命名,绝大多数键零手填)
|
|
137
|
+
|
|
138
|
+
| 档 | 键 | 值从哪来 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| **平台注入** | `PORT` · `<PREFIX>_SERVER_PORT` · `PORTAL_INTROSPECT_URL` · `API_BASE_URL` · `PORTAL_BASE_URL` · `<PREFIX>_SA_CLIENT_ID` · `<PREFIX>_SA_CLIENT_SECRET` | 平台换版时自己算并注入,没有人手填 |
|
|
141
|
+
| **自动供给** | 库连接串 · Redis 地址 | 批准时平台按登记的服务代建库 / 取地址并注入 |
|
|
142
|
+
| **自定** | 其余一切 | 平台管理员手填:非密钥进 `descriptor.env`,密钥进主机 `envFile` |
|
|
143
|
+
|
|
144
|
+
`<PREFIX>` = `listingKey` 全大写、连字符换下划线。`PORTAL_BASE_URL` 是门户**公开源**(也是调
|
|
145
|
+
别的 App `/svc/<key>` 的基址),`API_BASE_URL` 是内部 portal-api,**不代理 `/svc`**。
|
|
146
|
+
|
|
147
|
+
**服务怎么绑到键**:键名按约定命名(`<PREFIX>_DATABASE_URL` / `REDIS_CONN_STRING`),再声明要哪条服务 ——
|
|
148
|
+
|
|
149
|
+
```jsonc
|
|
150
|
+
"requiredServices": [{ "kind": "postgres", "name": "main" }]
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
⚠️ `requiredServices` 的每一条**只收 `name` / `kind` / `note`**,多一个字段整份清单直接拒收。
|
|
154
|
+
只写 `requiredEnv` 的约定名也认(用该类型的缺省服务)。**键名不按约定来(`ZO_META_POSTGRES_DSN`
|
|
155
|
+
这种上游定死的名字)也能发**,只是平台管理员要在审批屏上逐个点一下「从平台服务取值」,
|
|
156
|
+
每次发版多等一轮。收交付物时把这一条当作可读性问题看:不是错,是白等。
|
|
157
|
+
|
|
158
|
+
⚠️ 服务账号密钥**不再要求进 envFile**:门户保管并在换版时注入容器,明文只在批准那次一次性
|
|
159
|
+
回显(留给对方本地联调)。收交付物时别再问对方「密钥写进 envFile 了吗」。
|
|
160
|
+
另外,平台级能力(如日志写入)会直接出现在对方的服务令牌里,**不需要在 manifest 里申请**。
|
|
161
|
+
|
|
162
|
+
## 收交付物时一并核对「跑在哪、要什么服务」两节
|
|
163
|
+
|
|
164
|
+
manifest 还有两节**同形的审批前置闸**(与 `requiredEnv` 同一挂载点、同一失败语义):
|
|
165
|
+
|
|
166
|
+
- `deployRequirements`(`{ region?, size?, gpu?, network? }`)—— 这个 App 的后端需要什么样的
|
|
167
|
+
机器。批准那一刻按本环境的资源池逐维匹配,不满足就拒绝生效;通过时把落点固定到命中的
|
|
168
|
+
那台。**需要 `deployDescriptor`**,且只收**名字与档位** —— 网段 / IP / URL 提交即拒。
|
|
169
|
+
- `requiredServices`(`[{ name, kind, note?, envKey? }]`)—— 运行需要哪些外部服务。批准时比对
|
|
170
|
+
本环境**已登记**的「已具备服务」(控制台 › 平台设置 › App 清单目录),未登记或缺条目就
|
|
171
|
+
拒绝生效。门户**不据此开通**任何服务,只核对登记表。
|
|
172
|
+
|
|
173
|
+
收交付物时按这两节问三个问题:**它要跑在哪个网络里**(对方写的名字与本环境登记的名字对不
|
|
174
|
+
对得上)、**它连的那些基础服务本环境有没有并且登记了没有**、以及**远端主机上没有门户的
|
|
175
|
+
compose 网络** —— 一份在一盒里能跑的 descriptor,`env` 里写着 `postgres:5432` 时搬到远端
|
|
176
|
+
落点上是连不通的,那正是 `requiredServices` 要把「本环境有什么」摆到审批人眼前的原因。
|
|
177
|
+
|
|
178
|
+
被拒时对方只会收到一句泛化的「当前环境不满足…,提案已转入待审核队列」(池、网段、机器名
|
|
179
|
+
一个字都不出门户控制台)—— 所以**差在哪要由门户侧的人告诉他们**,别让对方对着一句话猜。
|
|
180
|
+
|
|
181
|
+
## 无前端服务的租户管理员配置
|
|
182
|
+
|
|
183
|
+
外部团队实现 `GET/PUT /v1/settings`(TDT 四道闸);**门户侧要按 App 补三件**(不是零改码):`<key>-token` 铸造端点 + `<key>-config-api.ts` + `AppForm` 配置 Section——参照 files / llm-gateway,步骤见 portal-backend-app skill。接入新服务时把这三件列入门户侧工作量(omni-parser 至今欠着)。
|
|
184
|
+
|
|
185
|
+
## 先看平台有没有,别自建一套
|
|
186
|
+
|
|
187
|
+
外部服务最常见的浪费是把**平台已经有的公共能力**又实现一遍:自己存文件、自己发通知、
|
|
188
|
+
自己记审计、自己排定时任务。除了白干,还会让租户在两个地方看同一件事、让平台的治理面
|
|
189
|
+
(审计/用量/权限)出现盲区。**动手写之前先在这两张表里找。**
|
|
190
|
+
|
|
191
|
+
### A. 门户基座能力 —— 用你自己的 TDT 直接调 `/api/v1/*`
|
|
192
|
+
|
|
193
|
+
`PLATFORM_BASE_SCOPES` 里的 scope **任何 App 都能在清单里直接声明**,不需要跨应用授权、
|
|
194
|
+
不需要令牌交换。
|
|
195
|
+
|
|
196
|
+
| 你想做的 | scope | 端点 |
|
|
197
|
+
| --- | --- | --- |
|
|
198
|
+
| 当前用户是谁 | `userinfo.read` | `GET /api/v1/userinfo` |
|
|
199
|
+
| 选人 / 读通讯录 | `directory.read`(邮箱是 PII,要**另加** `directory.email.read`) | `GET /api/v1/directory/users` |
|
|
200
|
+
| **站内消息 / 通知** | `notification.send`(只发给自己)· `notification.send.others`(发给别的成员) | `POST /api/v1/notifications`;服务态用 `/api/v1/notifications/service` |
|
|
201
|
+
| 收件箱 | `inbox.read` | — |
|
|
202
|
+
| **统一审计** | `audit.write` | `POST /api/v1/audit` |
|
|
203
|
+
| **定时任务** | `scheduler.read` / `scheduler.write` | `/api/v1/scheduler/tasks` |
|
|
204
|
+
| 结构化内容 / CMS | `content.read` / `content.write` | `/api/v1/content/{type}` |
|
|
205
|
+
| **用量计量** | `usage.report`(只收 namespace 前缀 == 你 azp 的 metricKey) | `POST /api/v1/usage/report` |
|
|
206
|
+
| 席位配额 | `seats.read`(SERVICE_ONLY,经 manifest `privilegedServiceScopes` 申请、审批授予,见下节) | `POST /api/v1/seats/quota` |
|
|
207
|
+
| 币种与汇率 | `currency.read` | `GET /api/v1/currency` |
|
|
208
|
+
| 判权限(PID) | — | `POST /api/v1/acl/check` |
|
|
209
|
+
| 用户级设置 | `settings.read` / `settings.write` | `/api/v1/settings/me` |
|
|
210
|
+
| Dashboard 卡片 | `widget.write` | 见 portal-micro-app skill |
|
|
211
|
+
|
|
212
|
+
### B. App 型公共服务 —— 走 `/svc/<key>` + 令牌交换
|
|
213
|
+
|
|
214
|
+
这些是**独立 App**,不是基座端点:要在清单里声明 `exchangeTargets`,用交换来的
|
|
215
|
+
`aud=<目标>` 令牌调(机制与排错见 portal-app-exchange skill)。
|
|
216
|
+
|
|
217
|
+
| 服务 | listingKey | scope 命名空间 |
|
|
218
|
+
| --- | --- | --- |
|
|
219
|
+
| **文件存储**(用户空间 + 应用空间、直传、预览、缩略图) | `files` | `files.read` / `files.write` / `files.share` |
|
|
220
|
+
| 多模态解析(OCR / 文档结构化) | `omni-parser` | `omni_parser.read` / `omni_parser.parse` |
|
|
221
|
+
| 大模型网关(OpenAI 兼容 `/v1`) | `llm-gateway` | `llm_gateway.read` / `llm_gateway.write` |
|
|
222
|
+
|
|
223
|
+
⚠️ **连字符 listingKey ↔ 下划线 scope**:`omni-parser` 的 scope 是 `omni_parser.*`,
|
|
224
|
+
`llm-gateway` 的是 `llm_gateway.*`。两个命名空间,写混了是 `VALIDATION_FAILED`。
|
|
225
|
+
|
|
226
|
+
**文件这条尤其别自己来**:字节一律落 files,别自己挂卷、别自己接 S3 —— 否则租户的配额、
|
|
227
|
+
审计、预览、清理全都绕过了平台。落进去用哪种姿态,按**这份字节归谁**二选一:
|
|
228
|
+
|
|
229
|
+
| 这份字节归谁 | 姿态 | 落在哪 | 用户在文件管理里 |
|
|
230
|
+
| --- | --- | --- | --- |
|
|
231
|
+
| **归 App**:系统产物、用户删不得、随 App 生命周期消失 | 服务账号 `client_credentials`(无用户上下文) | 你自己的**应用空间**(不传 spaceId,懒创建) | 默认只有租户管理员看得到 |
|
|
232
|
+
| **归用户**:用户主动另存、他看得见删得掉、算他的空间 | 令牌交换换出的 `aud=files` **用户态**令牌 | 用户选的**个人/团队空间**(带 spaceId) | 就在他自己的空间里 |
|
|
233
|
+
|
|
234
|
+
⚠️ **别因为「要写」就默认必须服务态**:用户态持有 `files.write` 完全合法 —— `exchangeTargets`
|
|
235
|
+
背书的是整个命名空间,平台不再按读写另行裁量。凡是「用户在你的界面里点一下、另存到我的
|
|
236
|
+
空间」这类功能**只能**用用户态:服务态写进去的是应用空间,用户在文件管理里根本看不见自己
|
|
237
|
+
刚存的东西。用户态写也不丢归因 —— 交换出的令牌带 `azp=<你的 key>`,files 侧照样落
|
|
238
|
+
`viaApp` 溯源,按来源 App 聚合展示。
|
|
239
|
+
|
|
240
|
+
### 已经立过的红线(同一条道理,都是「平台有、别自建」)
|
|
241
|
+
|
|
242
|
+
- **审计**:不自建审计表/页,推 `POST /api/v1/audit`,租户在「设置 › 审计」一处看全。
|
|
243
|
+
- **通讯录**:不做「同步通讯录」到自己库,按需用选人组件挑。
|
|
244
|
+
- **配额/套餐**:见下一节。**计费**:平台级 Credit 服务,同样不自建。
|
|
245
|
+
- **租户级配置**:放门户的 App 配置页(AppForm Section),不是 App 内的设置页。
|
|
246
|
+
- **AI 功能**:终端用户面**不出现模型选择器**,服务端按场景解析模型。
|
|
247
|
+
|
|
248
|
+
## 有配额需求?用平台的套餐管理,不许自建
|
|
249
|
+
|
|
250
|
+
**红线:外部服务不自建配额/套餐/计费。** 配额的唯一事实源是平台的套餐矩阵;对方在自己库里存
|
|
251
|
+
一份「本租户上限」,第一次调档就会与门户对不上,而且**没有任何东西会告诉你它们分叉了**。
|
|
252
|
+
|
|
253
|
+
- 两个模型**二选一**,都只有 **backed listing** 可声明:`seatBased`(计门户成员用不用得了这个
|
|
254
|
+
App,门户在 TDT 签发时收口,App 侧零代码)/ `seatRoles`(App 自管账号或资源,门户只发数、
|
|
255
|
+
App 自己在建号路径上收口)。
|
|
256
|
+
- **role 由对方在 `app.manifest.json` 里声明**(不需要门户改代码);**各套餐的数值进不了
|
|
257
|
+
manifest,也进不了 `LISTING_DEFS`**,只有平台管理员在控制台能写 —— 应用侧一条写路径都没有。
|
|
258
|
+
这是有意的:数值是商务面,改它等于改可售卖档位。
|
|
259
|
+
- 对接面只有一个:`POST /api/v1/seats/quota`(服务态令牌 + `seats.read`)。**`available === null`
|
|
260
|
+
⇒ 该租户 unlimited,放行、不要收口** —— 把 null 当 0 是这个契约最容易踩的一处。
|
|
261
|
+
- ⚠️ `seats.read` 是 `SERVICE_ONLY_SCOPES`:对方 manifest 里出现 `serviceScopes: ["seats.read"]`
|
|
262
|
+
**会被拒收**,评审时这是**当场打回的信号**,不是配置失误。正确路径是
|
|
263
|
+
`privilegedServiceScopes: [{ "scope": "seats.read", "reason": "…" }]` —— 这是**申请**不是授予:
|
|
264
|
+
必进「发布审核」,审批人逐条勾选确认后 SA 才拿到(reason 原文展示给审批人)。
|
|
265
|
+
- **配额 ≠ 用量**,别混:配额答「还能不能再建一个」,用量答「这段时间用了多少」,后者走
|
|
266
|
+
`usageReporter` + `usage.report`。计费方向另有平台级 Credit 服务,同样不自建。
|
|
267
|
+
|
|
268
|
+
真要落一版(选模型、写 manifest、配数值、上报已用、存量租户、三态处理、判定某个数该不该进
|
|
269
|
+
套餐表)⇒ 读 [references/quota-and-seats.md](references/quota-and-seats.md)。
|
|
270
|
+
|
|
271
|
+
## 一盒联调与冒烟
|
|
272
|
+
|
|
273
|
+
外部团队不用克隆本 repo:平台给两个门户镜像 + `deploy/` 目录,对方出 manifest + `compose.env` + 自己的镜像。步骤、冒烟命令与排查速查表见 [references/registration-and-onebox.md](references/registration-and-onebox.md) §4–§6。
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# 对接契约文档模板(外部服务 → 平台)
|
|
2
|
+
|
|
3
|
+
> 泛化自已交付的知识库契约(`docs/knowledge-app-contract.md`,**门户仓文件,App 自己的 repo 里没有**;本模板已自包含,不必去找)。每个外部服务接入前都要按此结构交一份契约文档,且**与已实现代码 1:1 对齐**(理想状态:有回归测试保证路由表与代码同步)。没有这份文档的接入不算完成。
|
|
4
|
+
|
|
5
|
+
按节填写,方括号处替换:
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
# `<listingKey>` App — Platform Contract (resource server → portal)
|
|
9
|
+
|
|
10
|
+
## 1. Listing 元数据
|
|
11
|
+
| 字段 | 值 |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| listingKey / aud | `<key>`(覆盖变量名如 `<KEY>_AUDIENCE`) |
|
|
14
|
+
| version | `x.y.z` |
|
|
15
|
+
| type | micro / service |
|
|
16
|
+
| scopes | `<key>.read`, `<key>.write`, …(+ `audit.write` 如写审计) |
|
|
17
|
+
| dependencies | 如 `["files"]`(说明是装机拓扑占位还是运行时真调用) |
|
|
18
|
+
| exchangeTargets | 本服务作为交换发起方要读的目标(无则空) |
|
|
19
|
+
| embedUrl | micro 填 `/apps/<key>/`;service 留空 |
|
|
20
|
+
|
|
21
|
+
(micro 附 navItems JSON。)
|
|
22
|
+
|
|
23
|
+
## 2. 运行时契约(已实现)
|
|
24
|
+
- 自省端点、Basic 凭证;校验 ok:true 和 data 对象后解析,失败信封不回退;正缓存默认 30 秒/最高 55 秒、调用者隔离、singleflight 与故障 503;
|
|
25
|
+
- kind 与 credential_type 的矩阵、未知类型拒绝;TDT 必填真实 exp,无过期长期 key 可缺省,缓存命中仍判到期;
|
|
26
|
+
- 自省的 `isPlatformAdmin` 是 Portal 按用户实时计算的全局身份,不在 JWT 里;服务态恒为 false;
|
|
27
|
+
- 四道闸各自的失败码(401 INVALID_TOKEN / 403 INSUFFICIENT_SCOPE / FORBIDDEN / INSUFFICIENT_PERMISSION);
|
|
28
|
+
- 如有跨租户路由:逐条标明 `isPlatformAdmin === true` 服务端闸,说明不用当前 `role` / `bypass` 或前端自报代替;
|
|
29
|
+
- 服务态 TDT 的处理(scope-only;哪些用户拥有的写操作拒绝服务态);
|
|
30
|
+
- 租户隔离与限流参数。
|
|
31
|
+
|
|
32
|
+
## 3. 路由 → scope → PID 表(核心,逐条列)
|
|
33
|
+
| Route | method | scope | PID | 额外门 |
|
|
34
|
+
| --- | --- | --- | --- | --- |
|
|
35
|
+
| `/v1/...` | POST | `<key>.read` | `<key>:page:xxx` | |
|
|
36
|
+
| `/v1/...` | POST | `<key>.write` | `<key>:action:xxx` | require admin / require user ctx |
|
|
37
|
+
| `/health` 等 | GET | — | — | public |
|
|
38
|
+
(新增路由的缺省门策略要写明——fail-safe 默认落最严的写门,绝不无门。)
|
|
39
|
+
|
|
40
|
+
## 4. ACL Manifest JSON(如声明 ACL;纯 scope 鉴权则写明 aclManifest: null)
|
|
41
|
+
(完整 JSON:pages/actions/roleTemplates;DataScope 与 relations 的校验和执行方式,不支持的受限授予必须拒绝,不能扩大为 all。)
|
|
42
|
+
|
|
43
|
+
## 5. Env 契约(镜像不含 .env)
|
|
44
|
+
| var | required | default/example | 说明 |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
(**列镜像实际读取的变量名**;有门户契约别名的写清映射;端口变量覆盖顺序、是否读裸 PORT;
|
|
47
|
+
门户三变量 all-or-nothing + fail-fast 行为。必填项**同步声明进 manifest 的 `requiredEnv`**
|
|
48
|
+
——键集合一变发布提案会转入人工审核,平台在批准前就看到,且**缺值时批准会被拒绝**;改名写成
|
|
49
|
+
`{ key, renamedFrom }`。不声明的静默改名无门可拦,症状是换版后 refusing to start 而发布侧只看到成功。)
|
|
50
|
+
|
|
51
|
+
## 6. 平台侧 checklist(对方的工作量)
|
|
52
|
+
(listing/ACL 登记、服务账号创建并回传凭证 —— ⚠️ 只指**你的服务端**那把;租户拿自己的程序
|
|
53
|
+
调你用的那把由租户管理员在 `/admin/service-accounts` 自助开,不是平台工作量,前提是那条 scope
|
|
54
|
+
在 manifest 的 `scopes` 里(integration-contract.md §3.1)、/svc 白名单、交换 grant、
|
|
55
|
+
(micro)dist 托管与 CORS/CSP、(有配置面)<key>-token + config Section。标出阻塞项。)
|
|
56
|
+
|
|
57
|
+
## 7. 运维命令
|
|
58
|
+
- DB 迁移:**镜像内的迁移 argv**(填进 `deployDescriptor.migrateArgs`)+ 幂等/建议锁/退出码保证;
|
|
59
|
+
- 每租户 bootstrap:需要则给出精确 SQL/命令(tenants.id 必须 = 门户租户 UUID),不需要则明说;
|
|
60
|
+
- 判活/就绪:匿名 GET /health,平铺 JSON 或 Envelope 均可;给出正常与故障响应,并按 health-contract.md 的平台判据说明结果(信封需要 ok:true + data.db:true,非信封依赖故障用 503);另有 /healthz 时说明它只检查存活;
|
|
61
|
+
- 镜像交付方式(docker save + sha256 / 私有 registry)与架构(amd64+arm64)。
|
|
62
|
+
|
|
63
|
+
## 6b. 你用了平台的哪些公共能力(逐项声明「用」还是「自建」)
|
|
64
|
+
- 文件存储 / 站内通知 / 统一审计 / 定时任务 / 用量上报 / 结构化内容 / 选人(通讯录);
|
|
65
|
+
- 任何一项填「自建」都要写明理由 —— 默认答案是用平台的(基座能力走 `/api/v1/*`,
|
|
66
|
+
文件/解析/大模型这类 App 型服务走 `/svc/<key>` + 令牌交换)。
|
|
67
|
+
|
|
68
|
+
## 7b. 配额(若有「每租户上限」诉求)
|
|
69
|
+
- 模型:`seatBased`(门户成员席位,门户在 TDT 签发时收口)或 `seatRoles: [...]`(你自管账号,你自己收口)——二选一;
|
|
70
|
+
- 若 seatRoles:列出角色 key,并说明你在哪条建号/建资源路径上调 `POST /api/v1/seats/quota` 收口,
|
|
71
|
+
以及 `available=null`(unlimited)时放行的处理;
|
|
72
|
+
- 角色 key 由**你在 `app.manifest.json` 里声明**(`"seatRoles": ["service"]`,需 backed listing);
|
|
73
|
+
各套餐的数值不进 manifest、由平台管理员在控制台配 —— 在这里**提议**一组(free/pro/ultra),并列出你会上报的 gauge 指标名;
|
|
74
|
+
- **不要**在自己库里存租户上限;`seats.read` **不要**写进 `serviceScopes`(SERVICE_ONLY,会被拒收)——
|
|
75
|
+
要用 `privilegedServiceScopes: [{ "scope": "seats.read", "reason": "…" }]` **申请**,经「发布审核」逐条确认批准后授予。
|
|
76
|
+
- 机制全貌(三态处理、兜底值、存量租户、已用上报)见 [quota-and-seats.md](quota-and-seats.md)。
|
|
77
|
+
|
|
78
|
+
## 8. 自测(无 UI 时的 curl 验收)
|
|
79
|
+
(缺/错 token → 401/403;正确 aud+scope → 200 信封。)
|
|
80
|
+
(/health 单独验收:附 scripts/verify-health.ts 对待发布镜像直连及 /svc/<key>/health 的 ready 结果;新增/修改时在隔离环境验证依赖故障的 not-ready,恢复后再验 ready。不得只贴 HTTP 200。)
|
|
81
|
+
|
|
82
|
+
## 9. 信任边界(如有)
|
|
83
|
+
(自有认证面清单:API-Key/节点 Token/admin 会话/gRPC 端口——哪些绝不从 /svc 暴露;
|
|
84
|
+
MCP/stdio 之类免鉴权面的使用限制;破玻璃通道的启用条件。)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
审阅要点(平台方收到契约时逐项验):
|
|
88
|
+
|
|
89
|
+
- §3 路由表是否覆盖**全部** `/v1` 业务路由,公开路由是否只有健康/指标;
|
|
90
|
+
- 如有跨租户路由,是否只认自省 `isPlatformAdmin`,并有普通租户 admin 的负控制测试;
|
|
91
|
+
- §5 是否写清镜像实读变量名(对照 compose/K8s 注入排一遍);
|
|
92
|
+
- §6b 是否有「自建」项而没有理由 —— 自己存文件 / 自己发通知 / 自己记审计是最常见的三处;
|
|
93
|
+
- §7b 若有配额诉求:模型是否二选一说清、role key 是否已在 manifest 的 `seatRoles` 里声明、`seats.read` 是否走了 `privilegedServiceScopes` 申请(写进 `serviceScopes` 是打回信号)、gauge 指标是否已在 manifest `usageMetrics` 里声明、`available=null` 是否按放行处理;
|
|
94
|
+
- §7 两问是否有显式答案:迁移 argv(**必须在镜像里**,不接受「脚本在我们 repo」)、每租户 bootstrap(目前门户无钩子,要显式定方案);
|
|
95
|
+
- §7/§8 的健康接口是否符合 [health-contract.md](health-contract.md) 的平台判据,并有检查结果;平铺与 Envelope 均可,禁止把合法 ok:true + data.db:true 误判为错误包装;
|
|
96
|
+
- §9 自有认证面是否与 `/svc` 隔离。
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# App `/health`:与平台一致的判定与发布前检查
|
|
2
|
+
|
|
3
|
+
**平铺 JSON 与 Envelope 都支持,外部 App 与内建 App 使用相同判据。** 已有健康接口不需要仅为切换包装格式而修改。匿名 `GET /health`,或 `deployDescriptor.healthPath` 指定的路径,应能直接报告服务是否就绪。
|
|
4
|
+
|
|
5
|
+
## 1. 平台实际怎样判断
|
|
6
|
+
|
|
7
|
+
按下面的顺序判断,部署控制器、平台信息页、`health:deployed` 巡检及本 skill 的检查脚本保持一致:
|
|
8
|
+
|
|
9
|
+
1. HTTP 非 **2xx**:不健康。
|
|
10
|
+
2. HTTP 2xx,JSON 对象顶层含 `ok`:仅当 **`ok === true && data.db === true`** 才健康;缺失字段、`false`、字符串 `"ok"` / `"true"` 都不能代替布尔 `true`。
|
|
11
|
+
3. HTTP 2xx,响应没有顶层 `ok`:健康。平台沿用 HTTP 状态判定,不检查平铺字段。
|
|
12
|
+
|
|
13
|
+
`service`、`redis`、`time` 不参与平台判定;服务名带不带 `-server` 不影响结果。非 JSON / 空响应的 2xx 也沿用第 3 条兼容规则。这是现有检测行为;新接口建议返回有诊断信息的 JSON,不要据此把登录页或无依赖检查的端点当就绪接口。
|
|
14
|
+
|
|
15
|
+
| HTTP / 响应 | 平台结论 |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| 200 + `{"service":"wish-list","db":"ok","redis":"ok","time":"…"}` | 健康:平铺响应 |
|
|
18
|
+
| 200 + `{"service":"payhub","db":"ok","redis":"disabled","time":"…"}` | 健康:平铺响应 |
|
|
19
|
+
| 200 + `{"ok":true,"data":{"service":"pagebuilder-server","db":true,"redis":true}}` | 健康:合法 Envelope |
|
|
20
|
+
| 200 + `{"ok":true,"data":{"db":"ok"}}` | 不健康:信封内 db 必须是布尔 true |
|
|
21
|
+
| 200 + `{"ok":true,"db":true}` | 不健康:缺 data.db |
|
|
22
|
+
| 200 + `{"ok":false}` 或 `{"ok":true,"data":{"db":false}}` | 不健康 |
|
|
23
|
+
| 503 + 任意响应 | 不健康:HTTP 优先 |
|
|
24
|
+
| 200 + `{"db":"down"}` | **仍会判健康**:平铺依赖故障应返回 503,不能只改正文 |
|
|
25
|
+
|
|
26
|
+
必要依赖(包括 Redis)故障时建议统一返回 **503**。特别是 Envelope 的 `data.redis:false` 不会单独让平台判失败,必须通过 HTTP 状态报告必要 Redis 故障。健康响应不要包含密钥、连接串或原始异常。
|
|
27
|
+
|
|
28
|
+
## 2. 两种正确实现范例(Bun / Elysia)
|
|
29
|
+
|
|
30
|
+
以下使用 App 已有的 `db` / `sql` / `redis`;只有确实未使用 Redis 时,`redis` 才为 `null`。连接的查询/命令超时应短于平台单次探测的 5 秒(例如 3 秒)。选择一种响应写法即可。
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
app.get('/health', async ({ set }) => {
|
|
34
|
+
const [dbUp, redisUp] = await Promise.all([
|
|
35
|
+
db.execute(sql`select 1`).then(() => true, () => false),
|
|
36
|
+
redis === null
|
|
37
|
+
? Promise.resolve(true)
|
|
38
|
+
: redis.ping().then((reply) => reply === 'PONG', () => false),
|
|
39
|
+
]);
|
|
40
|
+
set.status = dbUp && redisUp ? 200 : 503;
|
|
41
|
+
|
|
42
|
+
// 写法 A:平铺。依赖故障由上面的 503 表达。
|
|
43
|
+
return {
|
|
44
|
+
service: 'my-app',
|
|
45
|
+
db: dbUp ? 'ok' : 'down',
|
|
46
|
+
redis: redis === null ? 'disabled' : redisUp ? 'ok' : 'down',
|
|
47
|
+
time: new Date().toISOString(),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// 写法 B:用下面的 return 替换上面的 return,允许使用等价的 ok({...})。
|
|
51
|
+
// return { ok: true, data: { service: 'my-app', db: dbUp, redis: redisUp, time: new Date().toISOString() } };
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
采用 A 时,响应中间件应保留平铺结构;若改为 B,`data.db` 必须同步改为布尔值。不能只给字符串状态套 `ok(...)`,那会得到 `data.db:"ok"`,被平台判失败。
|
|
56
|
+
|
|
57
|
+
## 3. 发布前检查
|
|
58
|
+
|
|
59
|
+
本 skill 自带 [scripts/verify-health.ts](../scripts/verify-health.ts),只依赖 Bun;旁边的 `health-verdict.ts` 与门户运行时同源,导出 skill 时会校验一致性。在 App repo 根目录执行;`SKILL_DIR` 表示本 skill 的 `SKILL.md` 所在目录(本文件的上一级),按实际加载位置填写。URL 和 `HEALTH_APP` 按实际替换:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
SKILL_DIR="<本 skill 的 SKILL.md 所在目录>"
|
|
63
|
+
HEALTH_APP=my-app
|
|
64
|
+
|
|
65
|
+
# 待发布镜像的直连路径。
|
|
66
|
+
bun "$SKILL_DIR/scripts/verify-health.ts" http://127.0.0.1:8080/health "$HEALTH_APP"
|
|
67
|
+
|
|
68
|
+
# 接入一盒后的代理路径。
|
|
69
|
+
bun "$SKILL_DIR/scripts/verify-health.ts" "http://localhost/svc/$HEALTH_APP/health" "$HEALTH_APP"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
默认 `ready` 模式,平台会判健康才退出 **0**;失败退出 **1**,参数错误退出 **2**。`listingKey` 仅用于输出标签,不额外校验响应中的 service。脚本的请求、JSON 解析和判定与平台一致,不另加 Content-Type、字段类型或命名规则;因此这是就绪检查,不是 JSON schema 验证器。
|
|
73
|
+
|
|
74
|
+
新增/修改健康接口时,在隔离测试环境制造依赖故障后执行(不要断开生产共享依赖):
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
bun "$SKILL_DIR/scripts/verify-health.ts" http://127.0.0.1:8080/health "$HEALTH_APP" not-ready
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`not-ready` 要求收到平台会判失败的响应,例如 503 或 `data.db:false`;连接失败仍退出 1,不能替代故障响应的验证。恢复依赖后重跑 `ready`。Docker healthy / `curl -f` 只看 HTTP 时,无法覆盖信封的 db 判据。
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# 外部镜像服务类应用 · 集成契约
|
|
2
|
+
|
|
3
|
+
> 提炼自门户仓库 `docs/SSO与App开发指引.md` §7/§15 与已接入案例(知识库 / omni-parser,2026-08)(门户仓文件,App 自己的 repo 里没有;本文件已自包含,不必去找)。冲突时以门户仓库为准。
|
|
4
|
+
|
|
5
|
+
## 1. 形态与分界
|
|
6
|
+
|
|
7
|
+
外部镜像 App = 服务端在自己的 repo(任意语言/栈)、独立 Docker 镜像交付。鉴权、统一 :8080 与 `/svc/<key>` 路由遵循门户契约;**`/health` 支持平铺 JSON 与 Envelope,使用平台同一判据**。注册与部署方式如下:
|
|
8
|
+
|
|
9
|
+
| | 内建 App | 外部镜像 App |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 镜像 | 全部长在同一 runtime 镜像 | 独立镜像(`docker save` tar / 私有 registry,不发公共 dockerhub) |
|
|
12
|
+
| 部署 | deploy-controller 按需拉起/缩零 | **常驻**(controller 不编排外部镜像):独立 Deployment / compose profile,无状态可多副本 |
|
|
13
|
+
| 注册 | seed / bootstrap 内建 | `app.manifest.json` + register-app(dev)/ provisioning 登记(生产) |
|
|
14
|
+
|
|
15
|
+
**App 类型**:有用户前端 → `micro`(前端 dist 由平台同源托管到 `/apps/<key>/`);无前端 → **`service`**(headless:应用市场/应用中心不露卡、不可打开,仅作被调用方;平台控制台清单管理仍可治理,可作依赖被补装)。
|
|
16
|
+
|
|
17
|
+
## 2. 交付物(外部团队 → 平台)
|
|
18
|
+
|
|
19
|
+
1. **后端镜像**:容器内监听 **8080**(可由 env 覆盖,编排统一注 8080);服务名/网络别名 **`<listingKey>-server`**(通用反代规则按此 DNS 命中);多架构 **amd64 + arm64**(生产集群 amd64);**不烘焙 `.env`/密钥**。⚠️ 只需要认这一个**容器口**;发布到宿主机的哪个口(`deployDescriptor.hostPort`)归平台按环境分配,别在镜像或 manifest 里把它当常量依赖(详见 registration-and-onebox.md)。
|
|
20
|
+
2. **`app.manifest.json`**(见 registration-and-onebox.md)。
|
|
21
|
+
3. **env 契约表**:逐个列镜像**实际读取**的变量名。⚠️ 镜像内部若用自有前缀(知识库读 `XGENT_PG_DSN`,门户契约别名 `KNOWLEDGE_DATABASE_URL`;且**不读裸 `PORT`**),必须写清映射,编排按镜像认的名字注入。
|
|
22
|
+
4. **运维口径**(没有默认答案,必须显式声明):
|
|
23
|
+
- **迁移 argv**:迁移文件**必须在镜像里**,二进制上给一个迁移入口(如 `--role migrate`),
|
|
24
|
+
由 `deployDescriptor.migrateArgs` 在**换容器前**以一次性容器执行。
|
|
25
|
+
要求:幂等 · `pg_advisory_lock` 包住 · 失败非零退出 · expand-contract 前向兼容。
|
|
26
|
+
~~外部命令(`scripts/migrate.sh up` 式)~~ 已作废 —— 脚本留在对方 repo 里门户拿不到,
|
|
27
|
+
对方 CI 也连不到门户的库;「启动自迁」同样不再推荐(失败变崩溃循环 + 挤健康窗口);
|
|
28
|
+
- 是否需**每租户 bootstrap**:业务表 FK 自己的 `tenants` 表就需要——首次写入前 `INSERT INTO tenants (id, slug) VALUES ('<门户租户UUID>','<slug>') ON CONFLICT DO NOTHING`,`id` **必须等于门户租户 UUID**(自铸 uuid 会在首写触发外键冲突);`tenant_id` 只是普通列则无需;
|
|
29
|
+
- `/health` 判活口径(§4)。
|
|
30
|
+
5. **对接契约文档**:按 contract-doc-template.md 的结构写(路由→scope→PID 表、env、运维命令、信任边界)。
|
|
31
|
+
|
|
32
|
+
## 3. 运行时鉴权(四道闸)
|
|
33
|
+
|
|
34
|
+
每个受保护请求:取 `Authorization: Bearer <TDT 或端点已接纳的长期凭证>` → 调门户自省并校验声明 → 四道闸。Bun/TypeScript 使用公共服务端 SDK;其他语言实现下述相同契约。
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
POST {PORTAL_INTROSPECT_URL} # 如 http://portal-api:3000/api/tokens/introspect
|
|
38
|
+
Authorization: Basic base64(<saClientId>:<saSecret>)
|
|
39
|
+
body: { "token": "<Bearer 凭证>" }
|
|
40
|
+
→ 200 { "ok": true, "data": {
|
|
41
|
+
"active", "kind": "user"|"service", "principal_id", "credential_type", "credential_id", "aud", "listingKey", "azp",
|
|
42
|
+
"tenant_id", "user_id", "scopes": [], "role", "isPlatformAdmin", "bypass", "groups",
|
|
43
|
+
"permissions": [{ "pid", "scope", "relations"? }]|null, "aclStamp", "exp"? } }
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
1. **身份**:端点显式允许 user/service;用户态检查 `(claims.listingKey ?? claims.aud) === 你的 listingKey`,否则 401 `INVALID_TOKEN`。服务态 aud 是来源 SA clientId、azp 是来源 App,按端点用途校验,不能把来源当目标;
|
|
47
|
+
2. **scope** ∈ `claims.scopes`,否则 403 `INSUFFICIENT_SCOPE`;
|
|
48
|
+
3. 用户结构性管理操作看 `claims.role === "admin"`;服务身份不能携带用户角色进入此闸;
|
|
49
|
+
4. 用户细粒度操作校验 PID,并执行命中授予的 `scope`(own/team/all)与 `relations`。字段必须保留、校验并在业务查询中收口;不支持受限范围时拒绝该授予,不能升级成 all。纯服务端点按 scope、来源及业务绑定授权。
|
|
50
|
+
|
|
51
|
+
如端点是**平台级跨租户**读/写,在上述四道闸外另加 `claims.isPlatformAdmin === true`。该值由 Portal 在每次自省时按 `user_id` 检查其是否为平台租户 active admin,与当前 `tenant_id` / `role` / `bypass` 独立;它是自省派生信息,**不在 TDT JWT claims 里**。不能用当前租户 admin、平台租户 ID 比较或前端头推导全局身份。
|
|
52
|
+
|
|
53
|
+
硬形状(外部实现最常炸的四处):
|
|
54
|
+
|
|
55
|
+
- **信封与故障**:门户响应先检查 `ok === true` 且 `data` 为对象,再校验声明;`ok:false`、缺/null data、坏 JSON、非法声明、自省 HTTP 401/403/5xx 或超时均返回资源端 503。不能从失败信封回退到顶层;合法 `active:false` 或真实到期才是 401。若实现兼容裸声明,只能在根本不存在 ok 字段时走独立完整校验分支。
|
|
56
|
+
- **主体与凭证类型**:service 允许 tdt/service_access_key,user 允许 tdt/user_access_key;未知类型、互串类型返回 503。缺省 kind 仅兼容完整合法用户声明,不能推断服务身份。principal_id 是主体 UUID,user 时须与 user_id 一致;service 无 user_id/role/groups/permissions,bypass/isPlatformAdmin 为 false。用户长期 key 只在明确迁移的机器入口启用,并逐请求核验 credentialId 对应的本地业务绑定;普通 REST 默认只接纳 tdt/service_access_key。
|
|
57
|
+
- **到期与缓存**:TDT 的 exp 必须存在且非 null;无过期长期 key 可省略(兼容旧 null)。exp 是非负安全整数 Unix 秒;0 为已到期,负数/非数值为 503。正缓存默认 30 秒、最高 55 秒,从自省请求开始计时,加门户配置最多 5 秒总撤权预算 60 秒;受真实 exp 截断,命中仍检查 exp,不滑动续期或伪造到期。键隔离完整自省地址、调用者配置及 bearer 哈希;同上下文并发合并,不缓存 inactive/故障,缓存依赖故障时直查门户,门户也故障则 503。
|
|
58
|
+
- **全局身份字段**:`active:true` 始终带布尔 `isPlatformAdmin`,服务态恒为 `false`。虽然 Portal 在自省时实时计算,下游缓存会让身份变更最多延后 60s 生效;更敏感的操作应缩短缓存或直查。
|
|
59
|
+
- **门户三变量 all-or-nothing**:自省地址 + SA clientId + SA secret **全缺** → 门户鉴权停用、受门路由 503;**缺一不全** → 启动 fail-fast 打印缺失变量。避免半配置静默放行。
|
|
60
|
+
- **租户隔离**按 `claims.tenant_id`(永不信任请求体);限流自建 `(aud, tenant)` 每分钟窗口(参考默认 600/min)。
|
|
61
|
+
|
|
62
|
+
**三种令牌来路 × 授权姿势**:
|
|
63
|
+
|
|
64
|
+
| 来路 | kind | user_id | 授权依据 |
|
|
65
|
+
| --- | --- | --- | --- |
|
|
66
|
+
| 自己前端(宿主注入 / callService) | user | 有 | scope + PID/ACL |
|
|
67
|
+
| 其他 App 令牌交换(如 files→omni-parser) | user | 有 | 同上;scope=发起方 TDT ∩ 你声明的 scopes;`azp`=发起方(出处归因) |
|
|
68
|
+
| 服务账号 client_credentials(服务直调) | service | **无** | **只按 scope**(permissions 空、bypass=false、isPlatformAdmin=false,勿走 PID 门;用户拥有的写操作应拒绝) |
|
|
69
|
+
|
|
70
|
+
### 3.1 服务账号从哪来:平台代建 vs 租户自助
|
|
71
|
+
|
|
72
|
+
有**两条**路会产出打给你的 `client_credentials` 凭证,两条铸出来的令牌形状一样(`kind:"service"`、
|
|
73
|
+
`user_id:null`、`azp` = 某个 listingKey、`tenant_id` 钉死),你的闸**一个字都不用改**。区别只在谁建、
|
|
74
|
+
建给谁:
|
|
75
|
+
|
|
76
|
+
| | 平台代建(`SA_DEFS` / manifest `serviceScopes`) | 租户自助(租户管理员,控制台路径 `/admin/service-accounts`) |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| 建的人 | 平台管理员 / 你的 manifest 声明 | **租户自己的管理员**,不经平台 |
|
|
79
|
+
| 典型用途 | 你的服务端调门户(files/notification/audit/seats…) | 该租户的采集器、脚本、CI **调你** |
|
|
80
|
+
| 租户范围 | 由平台决定(可 `all`) | **恒 allowlist=[他自己那一个租户]**,请求体里出现别的租户 id 直接 `VALIDATION_FAILED` |
|
|
81
|
+
| `azp` | manifest 里的 `serviceScopes.ownerAppKey` | = 租户选的那个已装 App 的 listingKey(**用户填不了、也不用填**) |
|
|
82
|
+
| 可选 scope | `serviceScopes` / `privilegedServiceScopes`(可含 SERVICE_ONLY,走审批) | **只有 `scopes`(用户态那份清单)里、属于你自己命名空间的那些**;平台基础 scope 与 SERVICE_ONLY 一律不可选 |
|
|
83
|
+
|
|
84
|
+
**⚠️ 对你的唯一要求,就在最后一行**:租户自助的 scope 池取的是**该租户安装你时那份 `apps.scopes`
|
|
85
|
+
快照**(= manifest 的 `scopes`),不是 `serviceScopes`。所以——
|
|
86
|
+
|
|
87
|
+
> 一条只写在 `serviceScopes` / `privilegedServiceScopes` 里的 scope,**租户自助永远勾不到**。
|
|
88
|
+
> 想让租户自己开凭证来调你的某条路(典型:日志/指标摄取),那条 scope 必须出现在 manifest 的
|
|
89
|
+
> **`scopes`** 里。
|
|
90
|
+
|
|
91
|
+
这不矛盾:`scopes` 是「这个 App 在这个租户能做的事」的清单,用户态与租户自助的服务态都从它派生;
|
|
92
|
+
`serviceScopes` 是「**你的服务端**代表自己去调**别人**」的那一份,不属于租户可自助的范围。
|
|
93
|
+
|
|
94
|
+
其余几条租户自助的行为,都是你已经在依赖的机制,列出来是为了让你知道不必另做:
|
|
95
|
+
|
|
96
|
+
- **卸载即失效**:`ownerAppKey` 的装机门跑在**签发时刻**,租户把你卸了之后新令牌立刻
|
|
97
|
+
`APP_NOT_INSTALLED`;同时门户会连坐停用该租户自助建的、绑在你身上的那些服务账号,把**已签出**
|
|
98
|
+
的令牌一并断掉(服务态令牌只认 SA 版本号,不停用会一直活到 TTL 到期)。**停用**是可逆动作,
|
|
99
|
+
不连坐 —— 签发门以 `APP_DISABLED` 挡住新令牌,敞口只有已签出那批的剩余 TTL。
|
|
100
|
+
- **scope 收窄即时生效**:租户在应用配置里把你的某条 scope 去掉之后,那些自助钥匙**下一次
|
|
101
|
+
签发**就不再带它(不需要租户去改凭证、也不需要你做任何事)。所以你侧永远以令牌里实际带的
|
|
102
|
+
scope 为准,别缓存「这把 clientId 有哪些 scope」。
|
|
103
|
+
- **密钥只显示一次**,可轮换/吊销;轮换即刻作废在途令牌。
|
|
104
|
+
- **审计**落在该租户自己的审计日志里(创建/轮换/吊销/删除/每一次签发)。
|
|
105
|
+
- 每租户有个数上限(默认 10)。
|
|
106
|
+
|
|
107
|
+
## 4. 健康检查
|
|
108
|
+
|
|
109
|
+
- **实现、出仓或发布镜像前必读 [health-contract.md](health-contract.md)**:有完整正确实现、错误示例与可执行验收命令。
|
|
110
|
+
- `GET /health`(匿名就绪接口)支持平铺 `{"service":"my-app","db":"ok","redis":"disabled"}` 与信封 `{"ok":true,"data":{"db":true}}`。HTTP 非 2xx 不通过;2xx 顶层含 `ok` 时必须 `ok === true && data.db === true`;否则按 HTTP 状态判健康,不校验平铺字段。必要依赖故障建议返回 503,尤其平铺响应不能仅把 db 改为 `"down"` 仍返回 200。
|
|
111
|
+
- 可另设 `GET /healthz`(存活,`{"status":"ok"}`),不能用它代替就绪检查。发布前用 skill 的同源脚本验证;Envelope 的 `data.db` 必须是布尔 true,不能混用平铺示例的字符串。
|
|
112
|
+
|
|
113
|
+
## 5. 响应信封与审计
|
|
114
|
+
|
|
115
|
+
- **业务接口**响应统一 `{ ok, data | error }`,业务失败 HTTP 仍 200;4xx/5xx 只留传输/认证/路由层(401 缺/坏令牌、403 scope/权限、429 限流)。**`/health` 的形状与故障状态按 §4 实现;允许信封,也允许保留平铺响应,不应被中间件意外改成 `data.db:"ok"`。**
|
|
116
|
+
- 审计:不自建审计页,关键操作用当次用户 TDT `POST {API_BASE_URL}/api/v1/audit`(需声明 `audit.write` scope),best-effort。
|
|
117
|
+
|
|
118
|
+
## 6. 自有认证面与 Portal 认证面的划界
|
|
119
|
+
|
|
120
|
+
服务自带认证体系(API-Key、节点 Token、自有 admin 会话、gRPC 端口等)时:
|
|
121
|
+
|
|
122
|
+
- 凡经 `/svc/<key>` 暴露给门户侧的 HTTP 面,一律 TDT 四道闸——不得让门户侧调用方复用你的自有认证。
|
|
123
|
+
- 自有节点/外部客户端面保持原认证,但**不得**从 `/svc` 暴露;`/svc` 只转发 HTTP :8080,gRPC 等额外端口在网关契约之外,需单独规划暴露并写进交付契约。
|
|
124
|
+
- 平台/其他 App 调你:有用户上下文走令牌交换、无用户上下文走服务账号 client_credentials(scope 落你的命名空间)——不是给平台发你体系内的 API-Key。吊销、审计、租户策略都收口在门户。
|
|
125
|
+
- 若有 MCP/stdio 之类**免鉴权信任面**:只限本地可信进程,发货镜像不得暴露(知识库的 `--role mcp` 规则)。
|
|
126
|
+
|
|
127
|
+
## 7. 无前端服务的租户管理员配置
|
|
128
|
+
|
|
129
|
+
- 外部团队实现 `GET/PUT /v1/settings`(四道闸;读/写门槛按 scope),存租户级覆盖,运行时 `内置默认 → 租户覆盖 → 单次请求参数` 叠加。
|
|
130
|
+
- 门户侧需按 App 补三件(平台方工作量,不是零改码):`<key>-token` admin-TDT 铸造端点 + 前端 config-api + 应用配置页 Section。浏览器直连你的 `/svc/<key>/v1/settings`,门户不经手敏感配置。
|