@enbox/gitd 0.0.1
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/LICENSE +177 -0
- package/README.md +134 -0
- package/dist/esm/ci.js +76 -0
- package/dist/esm/ci.js.map +1 -0
- package/dist/esm/cli/agent.js +86 -0
- package/dist/esm/cli/agent.js.map +1 -0
- package/dist/esm/cli/commands/ci.js +278 -0
- package/dist/esm/cli/commands/ci.js.map +1 -0
- package/dist/esm/cli/commands/clone.js +77 -0
- package/dist/esm/cli/commands/clone.js.map +1 -0
- package/dist/esm/cli/commands/daemon.js +132 -0
- package/dist/esm/cli/commands/daemon.js.map +1 -0
- package/dist/esm/cli/commands/github-api.js +36 -0
- package/dist/esm/cli/commands/github-api.js.map +1 -0
- package/dist/esm/cli/commands/init.js +69 -0
- package/dist/esm/cli/commands/init.js.map +1 -0
- package/dist/esm/cli/commands/issue.js +293 -0
- package/dist/esm/cli/commands/issue.js.map +1 -0
- package/dist/esm/cli/commands/log.js +90 -0
- package/dist/esm/cli/commands/log.js.map +1 -0
- package/dist/esm/cli/commands/migrate.js +444 -0
- package/dist/esm/cli/commands/migrate.js.map +1 -0
- package/dist/esm/cli/commands/notification.js +141 -0
- package/dist/esm/cli/commands/notification.js.map +1 -0
- package/dist/esm/cli/commands/org.js +353 -0
- package/dist/esm/cli/commands/org.js.map +1 -0
- package/dist/esm/cli/commands/patch.js +375 -0
- package/dist/esm/cli/commands/patch.js.map +1 -0
- package/dist/esm/cli/commands/registry.js +501 -0
- package/dist/esm/cli/commands/registry.js.map +1 -0
- package/dist/esm/cli/commands/release.js +197 -0
- package/dist/esm/cli/commands/release.js.map +1 -0
- package/dist/esm/cli/commands/repo.js +148 -0
- package/dist/esm/cli/commands/repo.js.map +1 -0
- package/dist/esm/cli/commands/serve.js +148 -0
- package/dist/esm/cli/commands/serve.js.map +1 -0
- package/dist/esm/cli/commands/setup.js +92 -0
- package/dist/esm/cli/commands/setup.js.map +1 -0
- package/dist/esm/cli/commands/shim.js +75 -0
- package/dist/esm/cli/commands/shim.js.map +1 -0
- package/dist/esm/cli/commands/social.js +206 -0
- package/dist/esm/cli/commands/social.js.map +1 -0
- package/dist/esm/cli/commands/web.js +36 -0
- package/dist/esm/cli/commands/web.js.map +1 -0
- package/dist/esm/cli/commands/wiki.js +185 -0
- package/dist/esm/cli/commands/wiki.js.map +1 -0
- package/dist/esm/cli/flags.js +29 -0
- package/dist/esm/cli/flags.js.map +1 -0
- package/dist/esm/cli/main.js +331 -0
- package/dist/esm/cli/main.js.map +1 -0
- package/dist/esm/cli/repo-context.js +53 -0
- package/dist/esm/cli/repo-context.js.map +1 -0
- package/dist/esm/daemon/adapter.js +18 -0
- package/dist/esm/daemon/adapter.js.map +1 -0
- package/dist/esm/daemon/adapters/github.js +112 -0
- package/dist/esm/daemon/adapters/github.js.map +1 -0
- package/dist/esm/daemon/adapters/go.js +51 -0
- package/dist/esm/daemon/adapters/go.js.map +1 -0
- package/dist/esm/daemon/adapters/index.js +32 -0
- package/dist/esm/daemon/adapters/index.js.map +1 -0
- package/dist/esm/daemon/adapters/npm.js +51 -0
- package/dist/esm/daemon/adapters/npm.js.map +1 -0
- package/dist/esm/daemon/adapters/oci.js +62 -0
- package/dist/esm/daemon/adapters/oci.js.map +1 -0
- package/dist/esm/daemon/index.js +12 -0
- package/dist/esm/daemon/index.js.map +1 -0
- package/dist/esm/daemon/server.js +167 -0
- package/dist/esm/daemon/server.js.map +1 -0
- package/dist/esm/git-remote/credential-helper.js +106 -0
- package/dist/esm/git-remote/credential-helper.js.map +1 -0
- package/dist/esm/git-remote/credential-main.js +109 -0
- package/dist/esm/git-remote/credential-main.js.map +1 -0
- package/dist/esm/git-remote/index.js +10 -0
- package/dist/esm/git-remote/index.js.map +1 -0
- package/dist/esm/git-remote/main.js +78 -0
- package/dist/esm/git-remote/main.js.map +1 -0
- package/dist/esm/git-remote/parse-url.js +60 -0
- package/dist/esm/git-remote/parse-url.js.map +1 -0
- package/dist/esm/git-remote/resolve.js +175 -0
- package/dist/esm/git-remote/resolve.js.map +1 -0
- package/dist/esm/git-remote/service.js +82 -0
- package/dist/esm/git-remote/service.js.map +1 -0
- package/dist/esm/git-server/auth.js +211 -0
- package/dist/esm/git-server/auth.js.map +1 -0
- package/dist/esm/git-server/bundle-restore.js +180 -0
- package/dist/esm/git-server/bundle-restore.js.map +1 -0
- package/dist/esm/git-server/bundle-sync.js +233 -0
- package/dist/esm/git-server/bundle-sync.js.map +1 -0
- package/dist/esm/git-server/did-service.js +73 -0
- package/dist/esm/git-server/did-service.js.map +1 -0
- package/dist/esm/git-server/git-backend.js +186 -0
- package/dist/esm/git-server/git-backend.js.map +1 -0
- package/dist/esm/git-server/http-handler.js +295 -0
- package/dist/esm/git-server/http-handler.js.map +1 -0
- package/dist/esm/git-server/index.js +16 -0
- package/dist/esm/git-server/index.js.map +1 -0
- package/dist/esm/git-server/push-authorizer.js +62 -0
- package/dist/esm/git-server/push-authorizer.js.map +1 -0
- package/dist/esm/git-server/ref-sync.js +132 -0
- package/dist/esm/git-server/ref-sync.js.map +1 -0
- package/dist/esm/git-server/server.js +185 -0
- package/dist/esm/git-server/server.js.map +1 -0
- package/dist/esm/git-server/verify.js +109 -0
- package/dist/esm/git-server/verify.js.map +1 -0
- package/dist/esm/github-shim/helpers.js +273 -0
- package/dist/esm/github-shim/helpers.js.map +1 -0
- package/dist/esm/github-shim/index.js +13 -0
- package/dist/esm/github-shim/index.js.map +1 -0
- package/dist/esm/github-shim/issues.js +318 -0
- package/dist/esm/github-shim/issues.js.map +1 -0
- package/dist/esm/github-shim/pulls.js +423 -0
- package/dist/esm/github-shim/pulls.js.map +1 -0
- package/dist/esm/github-shim/releases.js +154 -0
- package/dist/esm/github-shim/releases.js.map +1 -0
- package/dist/esm/github-shim/repos.js +86 -0
- package/dist/esm/github-shim/repos.js.map +1 -0
- package/dist/esm/github-shim/server.js +351 -0
- package/dist/esm/github-shim/server.js.map +1 -0
- package/dist/esm/github-shim/users.js +61 -0
- package/dist/esm/github-shim/users.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indexer/api.js +132 -0
- package/dist/esm/indexer/api.js.map +1 -0
- package/dist/esm/indexer/crawler.js +256 -0
- package/dist/esm/indexer/crawler.js.map +1 -0
- package/dist/esm/indexer/index.js +9 -0
- package/dist/esm/indexer/index.js.map +1 -0
- package/dist/esm/indexer/main.js +76 -0
- package/dist/esm/indexer/main.js.map +1 -0
- package/dist/esm/indexer/store.js +334 -0
- package/dist/esm/indexer/store.js.map +1 -0
- package/dist/esm/issues.js +133 -0
- package/dist/esm/issues.js.map +1 -0
- package/dist/esm/notifications.js +47 -0
- package/dist/esm/notifications.js.map +1 -0
- package/dist/esm/org.js +90 -0
- package/dist/esm/org.js.map +1 -0
- package/dist/esm/patches.js +136 -0
- package/dist/esm/patches.js.map +1 -0
- package/dist/esm/refs.js +54 -0
- package/dist/esm/refs.js.map +1 -0
- package/dist/esm/registry.js +81 -0
- package/dist/esm/registry.js.map +1 -0
- package/dist/esm/releases.js +78 -0
- package/dist/esm/releases.js.map +1 -0
- package/dist/esm/repo.js +150 -0
- package/dist/esm/repo.js.map +1 -0
- package/dist/esm/resolver/index.js +10 -0
- package/dist/esm/resolver/index.js.map +1 -0
- package/dist/esm/resolver/resolve.js +189 -0
- package/dist/esm/resolver/resolve.js.map +1 -0
- package/dist/esm/resolver/trust-chain.js +155 -0
- package/dist/esm/resolver/trust-chain.js.map +1 -0
- package/dist/esm/resolver/verify.js +186 -0
- package/dist/esm/resolver/verify.js.map +1 -0
- package/dist/esm/shims/go/index.js +9 -0
- package/dist/esm/shims/go/index.js.map +1 -0
- package/dist/esm/shims/go/proxy.js +275 -0
- package/dist/esm/shims/go/proxy.js.map +1 -0
- package/dist/esm/shims/go/server.js +70 -0
- package/dist/esm/shims/go/server.js.map +1 -0
- package/dist/esm/shims/index.js +15 -0
- package/dist/esm/shims/index.js.map +1 -0
- package/dist/esm/shims/npm/index.js +9 -0
- package/dist/esm/shims/npm/index.js.map +1 -0
- package/dist/esm/shims/npm/registry.js +234 -0
- package/dist/esm/shims/npm/registry.js.map +1 -0
- package/dist/esm/shims/npm/server.js +72 -0
- package/dist/esm/shims/npm/server.js.map +1 -0
- package/dist/esm/shims/oci/index.js +9 -0
- package/dist/esm/shims/oci/index.js.map +1 -0
- package/dist/esm/shims/oci/registry.js +276 -0
- package/dist/esm/shims/oci/registry.js.map +1 -0
- package/dist/esm/shims/oci/server.js +82 -0
- package/dist/esm/shims/oci/server.js.map +1 -0
- package/dist/esm/social.js +70 -0
- package/dist/esm/social.js.map +1 -0
- package/dist/esm/web/html.js +123 -0
- package/dist/esm/web/html.js.map +1 -0
- package/dist/esm/web/index.js +7 -0
- package/dist/esm/web/index.js.map +1 -0
- package/dist/esm/web/routes.js +420 -0
- package/dist/esm/web/routes.js.map +1 -0
- package/dist/esm/web/server.js +225 -0
- package/dist/esm/web/server.js.map +1 -0
- package/dist/esm/wiki.js +63 -0
- package/dist/esm/wiki.js.map +1 -0
- package/dist/types/ci.d.ts +203 -0
- package/dist/types/ci.d.ts.map +1 -0
- package/dist/types/cli/agent.d.ts +59 -0
- package/dist/types/cli/agent.d.ts.map +1 -0
- package/dist/types/cli/commands/ci.d.ts +16 -0
- package/dist/types/cli/commands/ci.d.ts.map +1 -0
- package/dist/types/cli/commands/clone.d.ts +13 -0
- package/dist/types/cli/commands/clone.d.ts.map +1 -0
- package/dist/types/cli/commands/daemon.d.ts +29 -0
- package/dist/types/cli/commands/daemon.d.ts.map +1 -0
- package/dist/types/cli/commands/github-api.d.ts +14 -0
- package/dist/types/cli/commands/github-api.d.ts.map +1 -0
- package/dist/types/cli/commands/init.d.ts +11 -0
- package/dist/types/cli/commands/init.d.ts.map +1 -0
- package/dist/types/cli/commands/issue.d.ts +16 -0
- package/dist/types/cli/commands/issue.d.ts.map +1 -0
- package/dist/types/cli/commands/log.d.ts +13 -0
- package/dist/types/cli/commands/log.d.ts.map +1 -0
- package/dist/types/cli/commands/migrate.d.ts +19 -0
- package/dist/types/cli/commands/migrate.d.ts.map +1 -0
- package/dist/types/cli/commands/notification.d.ts +16 -0
- package/dist/types/cli/commands/notification.d.ts.map +1 -0
- package/dist/types/cli/commands/org.d.ts +19 -0
- package/dist/types/cli/commands/org.d.ts.map +1 -0
- package/dist/types/cli/commands/patch.d.ts +17 -0
- package/dist/types/cli/commands/patch.d.ts.map +1 -0
- package/dist/types/cli/commands/registry.d.ts +25 -0
- package/dist/types/cli/commands/registry.d.ts.map +1 -0
- package/dist/types/cli/commands/release.d.ts +13 -0
- package/dist/types/cli/commands/release.d.ts.map +1 -0
- package/dist/types/cli/commands/repo.d.ts +15 -0
- package/dist/types/cli/commands/repo.d.ts.map +1 -0
- package/dist/types/cli/commands/serve.d.ts +22 -0
- package/dist/types/cli/commands/serve.d.ts.map +1 -0
- package/dist/types/cli/commands/setup.d.ts +16 -0
- package/dist/types/cli/commands/setup.d.ts.map +1 -0
- package/dist/types/cli/commands/shim.d.ts +16 -0
- package/dist/types/cli/commands/shim.d.ts.map +1 -0
- package/dist/types/cli/commands/social.d.ts +19 -0
- package/dist/types/cli/commands/social.d.ts.map +1 -0
- package/dist/types/cli/commands/web.d.ts +14 -0
- package/dist/types/cli/commands/web.d.ts.map +1 -0
- package/dist/types/cli/commands/wiki.d.ts +14 -0
- package/dist/types/cli/commands/wiki.d.ts.map +1 -0
- package/dist/types/cli/flags.d.ts +16 -0
- package/dist/types/cli/flags.d.ts.map +1 -0
- package/dist/types/cli/main.d.ts +69 -0
- package/dist/types/cli/main.d.ts.map +1 -0
- package/dist/types/cli/repo-context.d.ts +30 -0
- package/dist/types/cli/repo-context.d.ts.map +1 -0
- package/dist/types/daemon/adapter.d.ts +74 -0
- package/dist/types/daemon/adapter.d.ts.map +1 -0
- package/dist/types/daemon/adapters/github.d.ts +10 -0
- package/dist/types/daemon/adapters/github.d.ts.map +1 -0
- package/dist/types/daemon/adapters/go.d.ts +10 -0
- package/dist/types/daemon/adapters/go.d.ts.map +1 -0
- package/dist/types/daemon/adapters/index.d.ts +22 -0
- package/dist/types/daemon/adapters/index.d.ts.map +1 -0
- package/dist/types/daemon/adapters/npm.d.ts +10 -0
- package/dist/types/daemon/adapters/npm.d.ts.map +1 -0
- package/dist/types/daemon/adapters/oci.d.ts +10 -0
- package/dist/types/daemon/adapters/oci.d.ts.map +1 -0
- package/dist/types/daemon/index.d.ts +14 -0
- package/dist/types/daemon/index.d.ts.map +1 -0
- package/dist/types/daemon/server.d.ts +55 -0
- package/dist/types/daemon/server.d.ts.map +1 -0
- package/dist/types/git-remote/credential-helper.d.ts +49 -0
- package/dist/types/git-remote/credential-helper.d.ts.map +1 -0
- package/dist/types/git-remote/credential-main.d.ts +24 -0
- package/dist/types/git-remote/credential-main.d.ts.map +1 -0
- package/dist/types/git-remote/index.d.ts +10 -0
- package/dist/types/git-remote/index.d.ts.map +1 -0
- package/dist/types/git-remote/main.d.ts +23 -0
- package/dist/types/git-remote/main.d.ts.map +1 -0
- package/dist/types/git-remote/parse-url.d.ts +32 -0
- package/dist/types/git-remote/parse-url.d.ts.map +1 -0
- package/dist/types/git-remote/resolve.d.ts +30 -0
- package/dist/types/git-remote/resolve.d.ts.map +1 -0
- package/dist/types/git-remote/service.d.ts +75 -0
- package/dist/types/git-remote/service.d.ts.map +1 -0
- package/dist/types/git-server/auth.d.ts +129 -0
- package/dist/types/git-server/auth.d.ts.map +1 -0
- package/dist/types/git-server/bundle-restore.d.ts +48 -0
- package/dist/types/git-server/bundle-restore.d.ts.map +1 -0
- package/dist/types/git-server/bundle-sync.d.ts +90 -0
- package/dist/types/git-server/bundle-sync.d.ts.map +1 -0
- package/dist/types/git-server/did-service.d.ts +26 -0
- package/dist/types/git-server/did-service.d.ts.map +1 -0
- package/dist/types/git-server/git-backend.d.ts +84 -0
- package/dist/types/git-server/git-backend.d.ts.map +1 -0
- package/dist/types/git-server/http-handler.d.ts +73 -0
- package/dist/types/git-server/http-handler.d.ts.map +1 -0
- package/dist/types/git-server/index.d.ts +16 -0
- package/dist/types/git-server/index.d.ts.map +1 -0
- package/dist/types/git-server/push-authorizer.d.ts +38 -0
- package/dist/types/git-server/push-authorizer.d.ts.map +1 -0
- package/dist/types/git-server/ref-sync.d.ts +52 -0
- package/dist/types/git-server/ref-sync.d.ts.map +1 -0
- package/dist/types/git-server/server.d.ts +70 -0
- package/dist/types/git-server/server.d.ts.map +1 -0
- package/dist/types/git-server/verify.d.ts +12 -0
- package/dist/types/git-server/verify.d.ts.map +1 -0
- package/dist/types/github-shim/helpers.d.ts +108 -0
- package/dist/types/github-shim/helpers.d.ts.map +1 -0
- package/dist/types/github-shim/index.d.ts +15 -0
- package/dist/types/github-shim/index.d.ts.map +1 -0
- package/dist/types/github-shim/issues.d.ts +24 -0
- package/dist/types/github-shim/issues.d.ts.map +1 -0
- package/dist/types/github-shim/pulls.d.ts +31 -0
- package/dist/types/github-shim/pulls.d.ts.map +1 -0
- package/dist/types/github-shim/releases.d.ts +18 -0
- package/dist/types/github-shim/releases.d.ts.map +1 -0
- package/dist/types/github-shim/repos.d.ts +21 -0
- package/dist/types/github-shim/repos.d.ts.map +1 -0
- package/dist/types/github-shim/server.d.ts +53 -0
- package/dist/types/github-shim/server.d.ts.map +1 -0
- package/dist/types/github-shim/users.d.ts +17 -0
- package/dist/types/github-shim/users.d.ts.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/indexer/api.d.ts +32 -0
- package/dist/types/indexer/api.d.ts.map +1 -0
- package/dist/types/indexer/crawler.d.ts +72 -0
- package/dist/types/indexer/crawler.d.ts.map +1 -0
- package/dist/types/indexer/index.d.ts +12 -0
- package/dist/types/indexer/index.d.ts.map +1 -0
- package/dist/types/indexer/main.d.ts +21 -0
- package/dist/types/indexer/main.d.ts.map +1 -0
- package/dist/types/indexer/store.d.ts +168 -0
- package/dist/types/indexer/store.d.ts.map +1 -0
- package/dist/types/issues.d.ts +395 -0
- package/dist/types/issues.d.ts.map +1 -0
- package/dist/types/notifications.d.ts +93 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/org.d.ts +232 -0
- package/dist/types/org.d.ts.map +1 -0
- package/dist/types/patches.d.ts +410 -0
- package/dist/types/patches.d.ts.map +1 -0
- package/dist/types/refs.d.ts +114 -0
- package/dist/types/refs.d.ts.map +1 -0
- package/dist/types/registry.d.ts +212 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/releases.d.ts +204 -0
- package/dist/types/releases.d.ts.map +1 -0
- package/dist/types/repo.d.ts +450 -0
- package/dist/types/repo.d.ts.map +1 -0
- package/dist/types/resolver/index.d.ts +13 -0
- package/dist/types/resolver/index.d.ts.map +1 -0
- package/dist/types/resolver/resolve.d.ts +80 -0
- package/dist/types/resolver/resolve.d.ts.map +1 -0
- package/dist/types/resolver/trust-chain.d.ts +54 -0
- package/dist/types/resolver/trust-chain.d.ts.map +1 -0
- package/dist/types/resolver/verify.d.ts +62 -0
- package/dist/types/resolver/verify.d.ts.map +1 -0
- package/dist/types/shims/go/index.d.ts +11 -0
- package/dist/types/shims/go/index.d.ts.map +1 -0
- package/dist/types/shims/go/proxy.d.ts +51 -0
- package/dist/types/shims/go/proxy.d.ts.map +1 -0
- package/dist/types/shims/go/server.d.ts +23 -0
- package/dist/types/shims/go/server.d.ts.map +1 -0
- package/dist/types/shims/index.d.ts +18 -0
- package/dist/types/shims/index.d.ts.map +1 -0
- package/dist/types/shims/npm/index.d.ts +11 -0
- package/dist/types/shims/npm/index.d.ts.map +1 -0
- package/dist/types/shims/npm/registry.d.ts +46 -0
- package/dist/types/shims/npm/registry.d.ts.map +1 -0
- package/dist/types/shims/npm/server.d.ts +23 -0
- package/dist/types/shims/npm/server.d.ts.map +1 -0
- package/dist/types/shims/oci/index.d.ts +11 -0
- package/dist/types/shims/oci/index.d.ts.map +1 -0
- package/dist/types/shims/oci/registry.d.ts +56 -0
- package/dist/types/shims/oci/registry.d.ts.map +1 -0
- package/dist/types/shims/oci/server.d.ts +23 -0
- package/dist/types/shims/oci/server.d.ts.map +1 -0
- package/dist/types/social.d.ts +162 -0
- package/dist/types/social.d.ts.map +1 -0
- package/dist/types/web/html.d.ts +23 -0
- package/dist/types/web/html.d.ts.map +1 -0
- package/dist/types/web/index.d.ts +8 -0
- package/dist/types/web/index.d.ts.map +1 -0
- package/dist/types/web/routes.d.ts +21 -0
- package/dist/types/web/routes.d.ts.map +1 -0
- package/dist/types/web/server.d.ts +38 -0
- package/dist/types/web/server.d.ts.map +1 -0
- package/dist/types/wiki.d.ts +143 -0
- package/dist/types/wiki.d.ts.map +1 -0
- package/package.json +108 -0
- package/schemas/ci/check-run.json +23 -0
- package/schemas/ci/check-suite.json +23 -0
- package/schemas/issues/assignment.json +17 -0
- package/schemas/issues/comment.json +14 -0
- package/schemas/issues/issue.json +20 -0
- package/schemas/issues/label.json +17 -0
- package/schemas/issues/reaction.json +14 -0
- package/schemas/issues/status-change.json +14 -0
- package/schemas/notifications/notification.json +20 -0
- package/schemas/org/org-member.json +17 -0
- package/schemas/org/org.json +26 -0
- package/schemas/org/team-member.json +17 -0
- package/schemas/org/team.json +17 -0
- package/schemas/patches/merge-result.json +14 -0
- package/schemas/patches/patch-status-change.json +14 -0
- package/schemas/patches/patch.json +20 -0
- package/schemas/patches/review-comment.json +17 -0
- package/schemas/patches/review.json +14 -0
- package/schemas/patches/revision.json +30 -0
- package/schemas/refs/git-ref.json +32 -0
- package/schemas/registry/attestation.json +23 -0
- package/schemas/registry/package-version.json +23 -0
- package/schemas/registry/package.json +32 -0
- package/schemas/releases/release.json +17 -0
- package/schemas/repo/collaborator.json +17 -0
- package/schemas/repo/repo.json +35 -0
- package/schemas/repo/settings.json +39 -0
- package/schemas/repo/topic.json +14 -0
- package/schemas/repo/webhook.json +26 -0
- package/schemas/social/activity.json +23 -0
- package/schemas/social/follow.json +17 -0
- package/schemas/social/star.json +20 -0
- package/schemas/wiki/wiki-history.json +20 -0
- package/schemas/wiki/wiki-page.json +17 -0
- package/src/ci.ts +118 -0
- package/src/cli/agent.ts +117 -0
- package/src/cli/commands/ci.ts +300 -0
- package/src/cli/commands/clone.ts +78 -0
- package/src/cli/commands/daemon.ts +129 -0
- package/src/cli/commands/github-api.ts +30 -0
- package/src/cli/commands/init.ts +69 -0
- package/src/cli/commands/issue.ts +321 -0
- package/src/cli/commands/log.ts +106 -0
- package/src/cli/commands/migrate.ts +525 -0
- package/src/cli/commands/notification.ts +148 -0
- package/src/cli/commands/org.ts +381 -0
- package/src/cli/commands/patch.ts +413 -0
- package/src/cli/commands/registry.ts +542 -0
- package/src/cli/commands/release.ts +189 -0
- package/src/cli/commands/repo.ts +160 -0
- package/src/cli/commands/serve.ts +153 -0
- package/src/cli/commands/setup.ts +97 -0
- package/src/cli/commands/shim.ts +79 -0
- package/src/cli/commands/social.ts +221 -0
- package/src/cli/commands/web.ts +30 -0
- package/src/cli/commands/wiki.ts +199 -0
- package/src/cli/flags.ts +28 -0
- package/src/cli/main.ts +350 -0
- package/src/cli/repo-context.ts +55 -0
- package/src/daemon/adapter.ts +95 -0
- package/src/daemon/adapters/github.ts +86 -0
- package/src/daemon/adapters/go.ts +47 -0
- package/src/daemon/adapters/index.ts +36 -0
- package/src/daemon/adapters/npm.ts +47 -0
- package/src/daemon/adapters/oci.ts +59 -0
- package/src/daemon/index.ts +16 -0
- package/src/daemon/server.ts +204 -0
- package/src/git-remote/credential-helper.ts +114 -0
- package/src/git-remote/credential-main.ts +118 -0
- package/src/git-remote/index.ts +10 -0
- package/src/git-remote/main.ts +74 -0
- package/src/git-remote/parse-url.ts +81 -0
- package/src/git-remote/resolve.ts +207 -0
- package/src/git-remote/service.ts +126 -0
- package/src/git-server/auth.ts +308 -0
- package/src/git-server/bundle-restore.ts +217 -0
- package/src/git-server/bundle-sync.ts +300 -0
- package/src/git-server/did-service.ts +77 -0
- package/src/git-server/git-backend.ts +222 -0
- package/src/git-server/http-handler.ts +386 -0
- package/src/git-server/index.ts +16 -0
- package/src/git-server/push-authorizer.ts +77 -0
- package/src/git-server/ref-sync.ts +166 -0
- package/src/git-server/server.ts +236 -0
- package/src/git-server/verify.ts +116 -0
- package/src/github-shim/helpers.ts +311 -0
- package/src/github-shim/index.ts +35 -0
- package/src/github-shim/issues.ts +389 -0
- package/src/github-shim/pulls.ts +500 -0
- package/src/github-shim/releases.ts +185 -0
- package/src/github-shim/repos.ts +95 -0
- package/src/github-shim/server.ts +334 -0
- package/src/github-shim/users.ts +63 -0
- package/src/index.ts +26 -0
- package/src/indexer/api.ts +162 -0
- package/src/indexer/crawler.ts +290 -0
- package/src/indexer/index.ts +22 -0
- package/src/indexer/main.ts +83 -0
- package/src/indexer/store.ts +408 -0
- package/src/issues.ts +200 -0
- package/src/notifications.ts +80 -0
- package/src/org.ts +147 -0
- package/src/patches.ts +203 -0
- package/src/refs.ts +94 -0
- package/src/registry.ts +132 -0
- package/src/releases.ts +124 -0
- package/src/repo.ts +234 -0
- package/src/resolver/index.ts +42 -0
- package/src/resolver/resolve.ts +244 -0
- package/src/resolver/trust-chain.ts +217 -0
- package/src/resolver/verify.ts +237 -0
- package/src/shims/go/index.ts +14 -0
- package/src/shims/go/proxy.ts +336 -0
- package/src/shims/go/server.ts +82 -0
- package/src/shims/index.ts +20 -0
- package/src/shims/npm/index.ts +14 -0
- package/src/shims/npm/registry.ts +288 -0
- package/src/shims/npm/server.ts +84 -0
- package/src/shims/oci/index.ts +14 -0
- package/src/shims/oci/registry.ts +334 -0
- package/src/shims/oci/server.ts +94 -0
- package/src/social.ts +116 -0
- package/src/web/html.ts +120 -0
- package/src/web/index.ts +8 -0
- package/src/web/routes.ts +449 -0
- package/src/web/server.ts +256 -0
- package/src/wiki.ts +102 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse DID URLs used with `git-remote-did`.
|
|
3
|
+
*
|
|
4
|
+
* Supported URL forms (all invoke `git-remote-did <remote> <url>`):
|
|
5
|
+
*
|
|
6
|
+
* did::dht:abc123 → DID = did:dht:abc123, repo = undefined
|
|
7
|
+
* did::dht:abc123/my-repo → DID = did:dht:abc123, repo = my-repo
|
|
8
|
+
* did://dht:abc123/my-repo → DID = did:dht:abc123, repo = my-repo
|
|
9
|
+
*
|
|
10
|
+
* The double-colon form (`did::<address>`) is recommended because it avoids
|
|
11
|
+
* URL-parsing ambiguity. Git strips the `did::` prefix and passes
|
|
12
|
+
* `<address>` as the URL argument.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Parser
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Parse a DID remote URL into its components.
|
|
21
|
+
*
|
|
22
|
+
* @param url - The URL argument passed by Git to the remote helper.
|
|
23
|
+
* After stripping the transport prefix:
|
|
24
|
+
* `did::dht:abc123/repo` → Git passes `dht:abc123/repo`
|
|
25
|
+
* `did://dht:abc123/repo` → Git passes `did://dht:abc123/repo`
|
|
26
|
+
*/
|
|
27
|
+
export function parseDidUrl(url) {
|
|
28
|
+
let stripped = url;
|
|
29
|
+
// Strip did:// prefix if present (the `://` form).
|
|
30
|
+
if (stripped.startsWith('did://')) {
|
|
31
|
+
stripped = stripped.slice('did://'.length);
|
|
32
|
+
}
|
|
33
|
+
// At this point, `stripped` is either:
|
|
34
|
+
// "dht:abc123" (DID only)
|
|
35
|
+
// "dht:abc123/my-repo" (DID + repo path)
|
|
36
|
+
// "web:example.com:path/my-repo" (did:web)
|
|
37
|
+
// Split on the first `/` to separate DID from repo path.
|
|
38
|
+
const slashIdx = stripped.indexOf('/');
|
|
39
|
+
let didSuffix;
|
|
40
|
+
let repo;
|
|
41
|
+
if (slashIdx === -1) {
|
|
42
|
+
didSuffix = stripped;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
didSuffix = stripped.slice(0, slashIdx);
|
|
46
|
+
const pathPart = stripped.slice(slashIdx + 1);
|
|
47
|
+
if (pathPart.length > 0) {
|
|
48
|
+
repo = pathPart;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Reconstruct full DID URI.
|
|
52
|
+
const did = `did:${didSuffix}`;
|
|
53
|
+
// Basic validation.
|
|
54
|
+
const parts = did.split(':');
|
|
55
|
+
if (parts.length < 3 || parts[0] !== 'did' || parts[1].length === 0 || parts[2].length === 0) {
|
|
56
|
+
throw new Error(`Invalid DID URL: "${url}" (parsed DID: "${did}")`);
|
|
57
|
+
}
|
|
58
|
+
return { did, repo };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=parse-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-url.js","sourceRoot":"","sources":["../../../src/git-remote/parse-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,QAAQ,GAAG,GAAG,CAAC;IAEnB,mDAAmD;IACnD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,uCAAuC;IACvC,qCAAqC;IACrC,4CAA4C;IAC5C,8CAA8C;IAE9C,yDAAyD;IACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,SAAiB,CAAC;IACtB,IAAI,IAAwB,CAAC;IAE7B,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,GAAG,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,GAAG,GAAG,OAAO,SAAS,EAAE,CAAC;IAE/B,oBAAoB;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DID resolution and git transport endpoint discovery.
|
|
3
|
+
*
|
|
4
|
+
* Resolves a DID document and extracts the git transport endpoint URL.
|
|
5
|
+
* The resolution order is:
|
|
6
|
+
* 1. Service of type `GitTransport` (preferred)
|
|
7
|
+
* 2. Service of type `DecentralizedWebNode` with `/git` suffix appended
|
|
8
|
+
* 3. Failure — no git endpoint found
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { DidDht, DidJwk, DidKey, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Resolver
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/** Shared resolver instance (lazy-initialized). */
|
|
26
|
+
let resolver;
|
|
27
|
+
/** Get or create the DID resolver. */
|
|
28
|
+
function getResolver() {
|
|
29
|
+
if (!resolver) {
|
|
30
|
+
resolver = new UniversalResolver({
|
|
31
|
+
didResolvers: [DidDht, DidJwk, DidWeb, DidKey],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return resolver;
|
|
35
|
+
}
|
|
36
|
+
/** DID resolution timeout in milliseconds. */
|
|
37
|
+
const DID_RESOLUTION_TIMEOUT_MS = 30000;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a DID to a git transport HTTPS endpoint.
|
|
40
|
+
*
|
|
41
|
+
* @param did - Full DID URI (e.g. `did:dht:abc123xyz`)
|
|
42
|
+
* @param repo - Optional repo name to append to the endpoint path
|
|
43
|
+
* @returns The resolved git transport endpoint
|
|
44
|
+
* @throws If resolution fails, times out, or no git-compatible service is found
|
|
45
|
+
*/
|
|
46
|
+
export function resolveGitEndpoint(did, repo) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
var _a;
|
|
49
|
+
const { didDocument, didResolutionMetadata } = yield Promise.race([
|
|
50
|
+
getResolver().resolve(did),
|
|
51
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`DID resolution timed out after ${DID_RESOLUTION_TIMEOUT_MS}ms for ${did}`)), DID_RESOLUTION_TIMEOUT_MS)),
|
|
52
|
+
]);
|
|
53
|
+
if (didResolutionMetadata.error) {
|
|
54
|
+
throw new Error(`DID resolution failed for ${did}: ${didResolutionMetadata.error}`);
|
|
55
|
+
}
|
|
56
|
+
if (!didDocument) {
|
|
57
|
+
throw new Error(`DID resolution returned no document for ${did}`);
|
|
58
|
+
}
|
|
59
|
+
const services = (_a = didDocument.service) !== null && _a !== void 0 ? _a : [];
|
|
60
|
+
// Priority 1: Look for a GitTransport service.
|
|
61
|
+
const gitService = services.find((s) => s.type === 'GitTransport');
|
|
62
|
+
if (gitService) {
|
|
63
|
+
const baseUrl = extractEndpointUrl(gitService);
|
|
64
|
+
return {
|
|
65
|
+
url: buildUrl(baseUrl, did, repo),
|
|
66
|
+
did,
|
|
67
|
+
source: 'GitTransport',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Priority 2: Fall back to DWN endpoint + /git suffix.
|
|
71
|
+
const dwnService = services.find((s) => s.type === 'DecentralizedWebNode');
|
|
72
|
+
if (dwnService) {
|
|
73
|
+
const baseUrl = extractEndpointUrl(dwnService);
|
|
74
|
+
const gitUrl = baseUrl.replace(/\/$/, '') + '/git';
|
|
75
|
+
return {
|
|
76
|
+
url: buildUrl(gitUrl, did, repo),
|
|
77
|
+
did,
|
|
78
|
+
source: 'DecentralizedWebNode',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`No GitTransport or DecentralizedWebNode service found in DID document for ${did}. ` +
|
|
82
|
+
`Services: ${services.map((s) => s.type).join(', ') || '(none)'}`);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Helpers
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
/** Extract a URL string from a service endpoint (handles string and array forms). */
|
|
89
|
+
function extractEndpointUrl(service) {
|
|
90
|
+
const ep = service.serviceEndpoint;
|
|
91
|
+
let url;
|
|
92
|
+
if (typeof ep === 'string') {
|
|
93
|
+
url = ep;
|
|
94
|
+
}
|
|
95
|
+
else if (Array.isArray(ep) && ep.length > 0) {
|
|
96
|
+
const first = ep[0];
|
|
97
|
+
if (typeof first === 'string') {
|
|
98
|
+
url = first;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!url) {
|
|
102
|
+
throw new Error(`Cannot extract URL from service endpoint: ${JSON.stringify(ep)}`);
|
|
103
|
+
}
|
|
104
|
+
assertNotPrivateUrl(url);
|
|
105
|
+
return url;
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// SSRF protection
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
/**
|
|
111
|
+
* Private / loopback IP ranges that must never be contacted via
|
|
112
|
+
* DID-resolved URLs (prevents SSRF attacks).
|
|
113
|
+
*/
|
|
114
|
+
const PRIVATE_IP_PATTERNS = [
|
|
115
|
+
/^127\./, // 127.0.0.0/8 loopback
|
|
116
|
+
/^10\./, // 10.0.0.0/8 private
|
|
117
|
+
/^172\.(1[6-9]|2\d|3[01])\./, // 172.16.0.0/12 private
|
|
118
|
+
/^192\.168\./, // 192.168.0.0/16 private
|
|
119
|
+
/^169\.254\./, // 169.254.0.0/16 link-local
|
|
120
|
+
/^0\./, // 0.0.0.0/8
|
|
121
|
+
];
|
|
122
|
+
const PRIVATE_IPV6_PATTERNS = [
|
|
123
|
+
/^::1$/, // IPv6 loopback
|
|
124
|
+
/^fc/i, // fc00::/7 unique local
|
|
125
|
+
/^fd/i, // fc00::/7 unique local
|
|
126
|
+
/^fe80:/i, // fe80::/10 link-local
|
|
127
|
+
];
|
|
128
|
+
/**
|
|
129
|
+
* Assert that a URL does not resolve to a private/loopback address.
|
|
130
|
+
* @throws If the URL hostname is a private or loopback IP
|
|
131
|
+
*/
|
|
132
|
+
function assertNotPrivateUrl(urlString) {
|
|
133
|
+
let parsed;
|
|
134
|
+
try {
|
|
135
|
+
parsed = new URL(urlString);
|
|
136
|
+
}
|
|
137
|
+
catch (_a) {
|
|
138
|
+
throw new Error(`Invalid URL from DID service endpoint: ${urlString}`);
|
|
139
|
+
}
|
|
140
|
+
const hostname = parsed.hostname;
|
|
141
|
+
// Strip IPv6 brackets if present.
|
|
142
|
+
const bare = hostname.startsWith('[') && hostname.endsWith(']')
|
|
143
|
+
? hostname.slice(1, -1)
|
|
144
|
+
: hostname;
|
|
145
|
+
// Reject localhost by name.
|
|
146
|
+
if (bare === 'localhost' || bare.endsWith('.localhost')) {
|
|
147
|
+
throw new Error(`SSRF blocked: resolved endpoint points to localhost: ${urlString}`);
|
|
148
|
+
}
|
|
149
|
+
// Check IPv4 private ranges.
|
|
150
|
+
for (const pattern of PRIVATE_IP_PATTERNS) {
|
|
151
|
+
if (pattern.test(bare)) {
|
|
152
|
+
throw new Error(`SSRF blocked: resolved endpoint points to private IP: ${urlString}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Check IPv6 private ranges.
|
|
156
|
+
for (const pattern of PRIVATE_IPV6_PATTERNS) {
|
|
157
|
+
if (pattern.test(bare)) {
|
|
158
|
+
throw new Error(`SSRF blocked: resolved endpoint points to private IPv6: ${urlString}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build the full git transport URL: `<base>/<did>[/<repo>]`.
|
|
164
|
+
*
|
|
165
|
+
* The DID is always included in the path since the git HTTP handler uses
|
|
166
|
+
* it for routing and authorization.
|
|
167
|
+
*/
|
|
168
|
+
function buildUrl(base, did, repo) {
|
|
169
|
+
const normalized = base.replace(/\/$/, '');
|
|
170
|
+
if (!repo) {
|
|
171
|
+
return `${normalized}/${did}`;
|
|
172
|
+
}
|
|
173
|
+
return `${normalized}/${did}/${repo}`;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/git-remote/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitTransport DID service type utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for creating and identifying `GitTransport` service entries
|
|
5
|
+
* in DID documents. The `GitTransport` service type advertises a smart HTTP
|
|
6
|
+
* git endpoint that can be used by `git-remote-did` to locate repositories.
|
|
7
|
+
*
|
|
8
|
+
* When a DID document contains a GitTransport service, the git remote helper
|
|
9
|
+
* uses it directly (highest priority). Otherwise it falls back to
|
|
10
|
+
* `DecentralizedWebNode` + `/git` suffix.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { createGitTransportService } from '@enbox/gitd/git-remote/service';
|
|
15
|
+
*
|
|
16
|
+
* const service = createGitTransportService({
|
|
17
|
+
* id : '#git',
|
|
18
|
+
* serviceEndpoint : 'https://git.example.com',
|
|
19
|
+
* });
|
|
20
|
+
* // → { id: '#git', type: 'GitTransport', serviceEndpoint: 'https://git.example.com' }
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Constants
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** The DID service type string for git smart HTTP transport endpoints. */
|
|
29
|
+
export const GIT_TRANSPORT_SERVICE_TYPE = 'GitTransport';
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Factory
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Create a `GitTransport` DID service entry.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Service configuration
|
|
37
|
+
* @returns A well-formed GitTransport service entry ready for inclusion in a
|
|
38
|
+
* DID document's `service` array.
|
|
39
|
+
*/
|
|
40
|
+
export function createGitTransportService(options) {
|
|
41
|
+
const { serviceEndpoint } = options;
|
|
42
|
+
let { id } = options;
|
|
43
|
+
// Normalize the id to include a # prefix if missing.
|
|
44
|
+
if (!id.startsWith('#')) {
|
|
45
|
+
id = `#${id}`;
|
|
46
|
+
}
|
|
47
|
+
// Validate endpoint(s).
|
|
48
|
+
const endpoints = Array.isArray(serviceEndpoint) ? serviceEndpoint : [serviceEndpoint];
|
|
49
|
+
for (const ep of endpoints) {
|
|
50
|
+
if (typeof ep !== 'string' || ep.length === 0) {
|
|
51
|
+
throw new Error(`GitTransport serviceEndpoint must be a non-empty string, got: ${JSON.stringify(ep)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
id,
|
|
56
|
+
type: GIT_TRANSPORT_SERVICE_TYPE,
|
|
57
|
+
serviceEndpoint: Array.isArray(serviceEndpoint) ? serviceEndpoint : serviceEndpoint,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Queries
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* Check whether a DID service entry is a GitTransport service.
|
|
65
|
+
*
|
|
66
|
+
* @param service - A service entry from a DID document
|
|
67
|
+
* @returns `true` if the service type is `GitTransport`
|
|
68
|
+
*/
|
|
69
|
+
export function isGitTransportService(service) {
|
|
70
|
+
return service.type === GIT_TRANSPORT_SERVICE_TYPE;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract all GitTransport service entries from a DID document.
|
|
74
|
+
*
|
|
75
|
+
* @param didDocument - A resolved DID document
|
|
76
|
+
* @returns An array of GitTransport services (may be empty)
|
|
77
|
+
*/
|
|
78
|
+
export function getGitTransportServices(didDocument) {
|
|
79
|
+
var _a;
|
|
80
|
+
return ((_a = didDocument.service) !== null && _a !== void 0 ? _a : []).filter(isGitTransportService);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/git-remote/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,0BAA0B,GAAG,cAAuB,CAAC;AAkClE,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAyC;IAEzC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAErB,qDAAqD;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IAChB,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACvF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,iEAAiE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE;QACF,IAAI,EAAc,0BAA0B;QAC5C,eAAe,EAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;KACrF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAmB;IACvD,OAAO,OAAO,CAAC,IAAI,KAAK,0BAA0B,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAwB;;IAC9D,OAAO,CAAC,MAAA,WAAW,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push authentication for the git transport sidecar.
|
|
3
|
+
*
|
|
4
|
+
* Implements a DID-based authentication scheme for git push operations.
|
|
5
|
+
* The scheme uses signed tokens that prove DID ownership:
|
|
6
|
+
*
|
|
7
|
+
* 1. The client generates a token: `base64url(JSON({ did, repo, exp, nonce }))`
|
|
8
|
+
* 2. The client signs the token with their DID's Ed25519 key
|
|
9
|
+
* 3. The client sends the token + signature as HTTP Basic auth credentials:
|
|
10
|
+
* - username: `did-auth` (fixed; DIDs contain colons so can't be usernames)
|
|
11
|
+
* - password: `<base64url-signature>.<base64url-token>`
|
|
12
|
+
* 4. The server verifies the signature using the DID document's
|
|
13
|
+
* authentication verification method
|
|
14
|
+
*
|
|
15
|
+
* This approach works with git's native credential helper system — no custom
|
|
16
|
+
* transport modifications required.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
21
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
22
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
23
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
24
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
25
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
26
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
import { randomBytes } from 'node:crypto';
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Constants
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Fixed username for HTTP Basic auth.
|
|
35
|
+
* DIDs contain colons which conflict with HTTP Basic auth's username:password
|
|
36
|
+
* separator, so we use a fixed username and embed the DID in the token payload.
|
|
37
|
+
*/
|
|
38
|
+
export const DID_AUTH_USERNAME = 'did-auth';
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Token creation (client-side)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Create a push token payload.
|
|
44
|
+
*
|
|
45
|
+
* @param did - The pusher's DID
|
|
46
|
+
* @param owner - The repository owner's DID
|
|
47
|
+
* @param repo - The repository name
|
|
48
|
+
* @param ttlSeconds - Token lifetime in seconds (default: 300)
|
|
49
|
+
* @returns The token payload
|
|
50
|
+
*/
|
|
51
|
+
export function createPushTokenPayload(did, owner, repo, ttlSeconds = 300) {
|
|
52
|
+
return {
|
|
53
|
+
did,
|
|
54
|
+
owner,
|
|
55
|
+
repo,
|
|
56
|
+
exp: Math.floor(Date.now() / 1000) + ttlSeconds,
|
|
57
|
+
nonce: randomBytes(16).toString('hex'),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Encode a push token payload as a base64url string.
|
|
62
|
+
*
|
|
63
|
+
* @param payload - The token payload
|
|
64
|
+
* @returns base64url-encoded JSON
|
|
65
|
+
*/
|
|
66
|
+
export function encodePushToken(payload) {
|
|
67
|
+
const json = JSON.stringify(payload);
|
|
68
|
+
return Buffer.from(json).toString('base64url');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Decode a base64url push token string back to a payload.
|
|
72
|
+
*
|
|
73
|
+
* @param token - The base64url-encoded token
|
|
74
|
+
* @returns The decoded payload
|
|
75
|
+
* @throws If the token is malformed
|
|
76
|
+
*/
|
|
77
|
+
export function decodePushToken(token) {
|
|
78
|
+
try {
|
|
79
|
+
const json = Buffer.from(token, 'base64url').toString('utf-8');
|
|
80
|
+
const payload = JSON.parse(json);
|
|
81
|
+
if (!payload.did || !payload.owner || !payload.repo || !payload.exp || !payload.nonce) {
|
|
82
|
+
throw new Error('missing required fields');
|
|
83
|
+
}
|
|
84
|
+
return payload;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new Error(`Invalid push token: ${err.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Format a signed push token for use as an HTTP Basic auth password.
|
|
92
|
+
* The format is `<base64url-signature>.<base64url-token>`.
|
|
93
|
+
*
|
|
94
|
+
* @param signed - The signed token
|
|
95
|
+
* @returns The formatted password string
|
|
96
|
+
*/
|
|
97
|
+
export function formatAuthPassword(signed) {
|
|
98
|
+
return `${signed.signature}.${signed.token}`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse an HTTP Basic auth password back into a signed push token.
|
|
102
|
+
*
|
|
103
|
+
* @param password - The password from HTTP Basic auth
|
|
104
|
+
* @returns The parsed signed token
|
|
105
|
+
* @throws If the format is invalid
|
|
106
|
+
*/
|
|
107
|
+
export function parseAuthPassword(password) {
|
|
108
|
+
const dotIndex = password.indexOf('.');
|
|
109
|
+
if (dotIndex === -1) {
|
|
110
|
+
throw new Error('Invalid auth password format: expected <signature>.<token>');
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
signature: password.slice(0, dotIndex),
|
|
114
|
+
token: password.slice(dotIndex + 1),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Push authenticator factory (server-side)
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Create an `authenticatePush` callback for use with `createGitHttpHandler`.
|
|
122
|
+
*
|
|
123
|
+
* Extracts HTTP Basic credentials from the request, verifies the signed token,
|
|
124
|
+
* and optionally checks role-based authorization.
|
|
125
|
+
*
|
|
126
|
+
* @param options - Authenticator configuration
|
|
127
|
+
* @returns An authenticatePush callback
|
|
128
|
+
*/
|
|
129
|
+
export function createPushAuthenticator(options) {
|
|
130
|
+
const { verifySignature, authorizePush, maxTokenAge = 300 } = options;
|
|
131
|
+
// Nonce replay protection: track used nonces with timestamps for TTL eviction.
|
|
132
|
+
const usedNonces = new Map();
|
|
133
|
+
const nonceMaxAge = (maxTokenAge + 60) * 1000; // ms — token TTL + clock skew
|
|
134
|
+
/** Evict expired nonces to prevent unbounded growth. */
|
|
135
|
+
function evictExpiredNonces() {
|
|
136
|
+
const cutoff = Date.now() - nonceMaxAge;
|
|
137
|
+
for (const [nonce, ts] of usedNonces) {
|
|
138
|
+
if (ts < cutoff) {
|
|
139
|
+
usedNonces.delete(nonce);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return (request, ownerDid, repo) => __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
// Extract HTTP Basic auth credentials.
|
|
145
|
+
// Username is fixed to "did-auth" (DIDs contain colons, which conflict
|
|
146
|
+
// with HTTP Basic auth's colon separator). The DID is inside the token.
|
|
147
|
+
const authHeader = request.headers.get('Authorization');
|
|
148
|
+
if (!(authHeader === null || authHeader === void 0 ? void 0 : authHeader.startsWith('Basic '))) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const decoded = Buffer.from(authHeader.slice(6), 'base64').toString('utf-8');
|
|
152
|
+
const colonIdx = decoded.indexOf(':');
|
|
153
|
+
if (colonIdx === -1) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const username = decoded.slice(0, colonIdx);
|
|
157
|
+
const password = decoded.slice(colonIdx + 1);
|
|
158
|
+
// Verify the username is the expected fixed value.
|
|
159
|
+
if (username !== DID_AUTH_USERNAME) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
// Parse the signed token from the password field.
|
|
163
|
+
let signed;
|
|
164
|
+
try {
|
|
165
|
+
signed = parseAuthPassword(password);
|
|
166
|
+
}
|
|
167
|
+
catch (_a) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
// Decode and validate the token payload.
|
|
171
|
+
let payload;
|
|
172
|
+
try {
|
|
173
|
+
payload = decodePushToken(signed.token);
|
|
174
|
+
}
|
|
175
|
+
catch (_b) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Verify the token targets the correct owner and repo.
|
|
179
|
+
if (payload.owner !== ownerDid || payload.repo !== repo) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// Verify the token hasn't expired.
|
|
183
|
+
const now = Math.floor(Date.now() / 1000);
|
|
184
|
+
if (payload.exp < now) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
// Verify the token isn't too far in the future (clock skew protection).
|
|
188
|
+
if (payload.exp > now + maxTokenAge + 60) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
// Verify the Ed25519 signature.
|
|
192
|
+
const tokenBytes = new TextEncoder().encode(signed.token);
|
|
193
|
+
const signatureBytes = new Uint8Array(Buffer.from(signed.signature, 'base64url'));
|
|
194
|
+
const signatureValid = yield verifySignature(payload.did, tokenBytes, signatureBytes);
|
|
195
|
+
if (!signatureValid) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Nonce replay protection — reject already-used nonces.
|
|
199
|
+
evictExpiredNonces();
|
|
200
|
+
if (usedNonces.has(payload.nonce)) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
usedNonces.set(payload.nonce, Date.now());
|
|
204
|
+
// Optional: Check role-based push authorization.
|
|
205
|
+
if (authorizePush) {
|
|
206
|
+
return authorizePush(payload.did, ownerDid, repo);
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/git-server/auth.ts"],"names":[],"mappings":"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"}
|