@mesh-tech/mesh-cli 0.1.1 → 0.12.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/assets/intent/agents-fence.md +10 -0
- package/assets/intent/intent-claude-gate.mjs +255 -0
- package/assets/log-shipper.mjs +94 -0
- package/bin/mesh.mjs +80 -0
- package/dist/bin/mesh.d.ts +7 -9
- package/dist/bin/mesh.d.ts.map +1 -1
- package/dist/bin/mesh.js +20826 -37
- package/dist/bin/mesh.js.map +7 -1
- package/dist/build-info.json +4 -0
- package/dist/src/commands/agent-api-client.d.ts +79 -0
- package/dist/src/commands/agent-api-client.d.ts.map +1 -0
- package/dist/src/commands/agent-api-client.js +170 -0
- package/dist/src/commands/agent-api-client.js.map +1 -0
- package/dist/src/commands/artifacts.d.ts +13 -0
- package/dist/src/commands/artifacts.d.ts.map +1 -0
- package/dist/src/commands/artifacts.js +140 -0
- package/dist/src/commands/artifacts.js.map +1 -0
- package/dist/src/commands/cluster.d.ts +45 -0
- package/dist/src/commands/cluster.d.ts.map +1 -0
- package/dist/src/commands/cluster.js +259 -0
- package/dist/src/commands/cluster.js.map +1 -0
- package/dist/src/commands/conversations.d.ts +61 -0
- package/dist/src/commands/conversations.d.ts.map +1 -0
- package/dist/src/commands/conversations.js +239 -0
- package/dist/src/commands/conversations.js.map +1 -0
- package/dist/src/commands/create-app.d.ts +26 -3
- package/dist/src/commands/create-app.d.ts.map +1 -1
- package/dist/src/commands/create-app.js +465 -107
- package/dist/src/commands/create-app.js.map +1 -1
- package/dist/src/commands/deploy.d.ts +19 -0
- package/dist/src/commands/deploy.d.ts.map +1 -1
- package/dist/src/commands/deploy.js +83 -142
- package/dist/src/commands/deploy.js.map +1 -1
- package/dist/src/commands/dev-doctor.d.ts +137 -0
- package/dist/src/commands/dev-doctor.d.ts.map +1 -0
- package/dist/src/commands/dev-doctor.js +671 -0
- package/dist/src/commands/dev-doctor.js.map +1 -0
- package/dist/src/commands/dev-launch.d.ts +59 -0
- package/dist/src/commands/dev-launch.d.ts.map +1 -0
- package/dist/src/commands/dev-launch.js +118 -0
- package/dist/src/commands/dev-launch.js.map +1 -0
- package/dist/src/commands/dev-token-server.d.ts +32 -0
- package/dist/src/commands/dev-token-server.d.ts.map +1 -0
- package/dist/src/commands/dev-token-server.js +68 -0
- package/dist/src/commands/dev-token-server.js.map +1 -0
- package/dist/src/commands/dev.d.ts +289 -2
- package/dist/src/commands/dev.d.ts.map +1 -1
- package/dist/src/commands/dev.js +2501 -574
- package/dist/src/commands/dev.js.map +1 -1
- package/dist/src/commands/docs.d.ts +3 -0
- package/dist/src/commands/docs.d.ts.map +1 -0
- package/dist/src/commands/docs.js +262 -0
- package/dist/src/commands/docs.js.map +1 -0
- package/dist/src/commands/hub/index.d.ts +99 -0
- package/dist/src/commands/hub/index.d.ts.map +1 -0
- package/dist/src/commands/hub/index.js +452 -0
- package/dist/src/commands/hub/index.js.map +1 -0
- package/dist/src/commands/init.d.ts +65 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +370 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/install-shim.d.ts +21 -0
- package/dist/src/commands/install-shim.d.ts.map +1 -0
- package/dist/src/commands/install-shim.js +132 -0
- package/dist/src/commands/install-shim.js.map +1 -0
- package/dist/src/commands/local/auth-provision.d.ts +71 -0
- package/dist/src/commands/local/auth-provision.d.ts.map +1 -0
- package/dist/src/commands/local/auth-provision.js +286 -0
- package/dist/src/commands/local/auth-provision.js.map +1 -0
- package/dist/src/commands/local/dev-local.d.ts +97 -0
- package/dist/src/commands/local/dev-local.d.ts.map +1 -0
- package/dist/src/commands/local/dev-local.js +306 -0
- package/dist/src/commands/local/dev-local.js.map +1 -0
- package/dist/src/commands/local/docker-runner.d.ts +37 -0
- package/dist/src/commands/local/docker-runner.d.ts.map +1 -0
- package/dist/src/commands/local/docker-runner.js +104 -0
- package/dist/src/commands/local/docker-runner.js.map +1 -0
- package/dist/src/commands/local/helpers.d.ts +22 -0
- package/dist/src/commands/local/helpers.d.ts.map +1 -0
- package/dist/src/commands/local/helpers.js +46 -0
- package/dist/src/commands/local/helpers.js.map +1 -0
- package/dist/src/commands/local/hub-local.d.ts +51 -0
- package/dist/src/commands/local/hub-local.d.ts.map +1 -0
- package/dist/src/commands/local/hub-local.js +197 -0
- package/dist/src/commands/local/hub-local.js.map +1 -0
- package/dist/src/commands/local/index.d.ts +23 -0
- package/dist/src/commands/local/index.d.ts.map +1 -0
- package/dist/src/commands/local/index.js +386 -0
- package/dist/src/commands/local/index.js.map +1 -0
- package/dist/src/commands/local/mocks.d.ts +361 -0
- package/dist/src/commands/local/mocks.d.ts.map +1 -0
- package/dist/src/commands/local/mocks.js +756 -0
- package/dist/src/commands/local/mocks.js.map +1 -0
- package/dist/src/commands/local/seed-zitadel.d.ts +151 -0
- package/dist/src/commands/local/seed-zitadel.d.ts.map +1 -0
- package/dist/src/commands/local/seed-zitadel.js +408 -0
- package/dist/src/commands/local/seed-zitadel.js.map +1 -0
- package/dist/src/commands/local/seed.d.ts +106 -0
- package/dist/src/commands/local/seed.d.ts.map +1 -0
- package/dist/src/commands/local/seed.js +252 -0
- package/dist/src/commands/local/seed.js.map +1 -0
- package/dist/src/commands/local/stack.d.ts +173 -0
- package/dist/src/commands/local/stack.d.ts.map +1 -0
- package/dist/src/commands/local/stack.js +499 -0
- package/dist/src/commands/local/stack.js.map +1 -0
- package/dist/src/commands/login.d.ts +256 -12
- package/dist/src/commands/login.d.ts.map +1 -1
- package/dist/src/commands/login.js +978 -50
- package/dist/src/commands/login.js.map +1 -1
- package/dist/src/commands/peer-addressing.d.ts +51 -0
- package/dist/src/commands/peer-addressing.d.ts.map +1 -0
- package/dist/src/commands/peer-addressing.js +64 -0
- package/dist/src/commands/peer-addressing.js.map +1 -0
- package/dist/src/commands/port-ownership.d.ts +69 -0
- package/dist/src/commands/port-ownership.d.ts.map +1 -0
- package/dist/src/commands/port-ownership.js +161 -0
- package/dist/src/commands/port-ownership.js.map +1 -0
- package/dist/src/commands/registry-publish.d.ts +3 -0
- package/dist/src/commands/registry-publish.d.ts.map +1 -0
- package/dist/src/commands/registry-publish.js +161 -0
- package/dist/src/commands/registry-publish.js.map +1 -0
- package/dist/src/commands/registry.d.ts +146 -2
- package/dist/src/commands/registry.d.ts.map +1 -1
- package/dist/src/commands/registry.js +541 -85
- package/dist/src/commands/registry.js.map +1 -1
- package/dist/src/commands/secrets/index.d.ts.map +1 -1
- package/dist/src/commands/secrets/index.js +15 -1
- package/dist/src/commands/secrets/index.js.map +1 -1
- package/dist/src/commands/secrets/migrate-config.d.ts +24 -0
- package/dist/src/commands/secrets/migrate-config.d.ts.map +1 -0
- package/dist/src/commands/secrets/migrate-config.js +277 -0
- package/dist/src/commands/secrets/migrate-config.js.map +1 -0
- package/dist/src/commands/secrets/set.d.ts +1 -0
- package/dist/src/commands/secrets/set.d.ts.map +1 -1
- package/dist/src/commands/secrets/set.js +96 -2
- package/dist/src/commands/secrets/set.js.map +1 -1
- package/dist/src/commands/skills.d.ts +34 -0
- package/dist/src/commands/skills.d.ts.map +1 -0
- package/dist/src/commands/skills.js +207 -0
- package/dist/src/commands/skills.js.map +1 -0
- package/dist/src/commands/stack.d.ts.map +1 -1
- package/dist/src/commands/stack.js +361 -23
- package/dist/src/commands/stack.js.map +1 -1
- package/dist/src/commands/temporal.d.ts +15 -0
- package/dist/src/commands/temporal.d.ts.map +1 -0
- package/dist/src/commands/temporal.js +781 -0
- package/dist/src/commands/temporal.js.map +1 -0
- package/dist/src/commands/tenant.d.ts +56 -0
- package/dist/src/commands/tenant.d.ts.map +1 -0
- package/dist/src/commands/tenant.js +233 -0
- package/dist/src/commands/tenant.js.map +1 -0
- package/dist/src/commands/tunnel/index.d.ts +49 -3
- package/dist/src/commands/tunnel/index.d.ts.map +1 -1
- package/dist/src/commands/tunnel/index.js +331 -8
- package/dist/src/commands/tunnel/index.js.map +1 -1
- package/dist/src/commands/vcs/clone.d.ts +3 -0
- package/dist/src/commands/vcs/clone.d.ts.map +1 -0
- package/dist/src/commands/vcs/clone.js +20 -0
- package/dist/src/commands/vcs/clone.js.map +1 -0
- package/dist/src/commands/vcs/common.d.ts +21 -0
- package/dist/src/commands/vcs/common.d.ts.map +1 -0
- package/dist/src/commands/vcs/common.js +62 -0
- package/dist/src/commands/vcs/common.js.map +1 -0
- package/dist/src/commands/vcs/drafts.d.ts +13 -0
- package/dist/src/commands/vcs/drafts.d.ts.map +1 -0
- package/dist/src/commands/vcs/drafts.js +45 -0
- package/dist/src/commands/vcs/drafts.js.map +1 -0
- package/dist/src/commands/vcs/get.d.ts +8 -0
- package/dist/src/commands/vcs/get.d.ts.map +1 -0
- package/dist/src/commands/vcs/get.js +61 -0
- package/dist/src/commands/vcs/get.js.map +1 -0
- package/dist/src/commands/vcs/index.d.ts +3 -0
- package/dist/src/commands/vcs/index.d.ts.map +1 -0
- package/dist/src/commands/vcs/index.js +58 -0
- package/dist/src/commands/vcs/index.js.map +1 -0
- package/dist/src/commands/vcs/propose.d.ts +23 -0
- package/dist/src/commands/vcs/propose.d.ts.map +1 -0
- package/dist/src/commands/vcs/propose.js +94 -0
- package/dist/src/commands/vcs/propose.js.map +1 -0
- package/dist/src/commands/vcs/review.d.ts +15 -0
- package/dist/src/commands/vcs/review.d.ts.map +1 -0
- package/dist/src/commands/vcs/review.js +35 -0
- package/dist/src/commands/vcs/review.js.map +1 -0
- package/dist/src/commands/vcs-enrich.d.ts +15 -0
- package/dist/src/commands/vcs-enrich.d.ts.map +1 -0
- package/dist/src/commands/vcs-enrich.js +28 -0
- package/dist/src/commands/vcs-enrich.js.map +1 -0
- package/dist/src/commands/vpn/index.d.ts +24 -0
- package/dist/src/commands/vpn/index.d.ts.map +1 -0
- package/dist/src/commands/vpn/index.js +543 -0
- package/dist/src/commands/vpn/index.js.map +1 -0
- package/dist/src/commands/vpn/tunnel.d.ts +11 -0
- package/dist/src/commands/vpn/tunnel.d.ts.map +1 -0
- package/dist/src/commands/vpn/tunnel.js +188 -0
- package/dist/src/commands/vpn/tunnel.js.map +1 -0
- package/dist/src/commands/workflow.d.ts +24 -0
- package/dist/src/commands/workflow.d.ts.map +1 -0
- package/dist/src/commands/workflow.js +577 -0
- package/dist/src/commands/workflow.js.map +1 -0
- package/dist/src/docs/assemble.d.ts +217 -0
- package/dist/src/docs/assemble.d.ts.map +1 -0
- package/dist/src/docs/assemble.js +739 -0
- package/dist/src/docs/assemble.js.map +1 -0
- package/dist/src/docs/cli-reference.d.ts +93 -0
- package/dist/src/docs/cli-reference.d.ts.map +1 -0
- package/dist/src/docs/cli-reference.js +256 -0
- package/dist/src/docs/cli-reference.js.map +1 -0
- package/dist/src/docs/discover.d.ts +60 -0
- package/dist/src/docs/discover.d.ts.map +1 -0
- package/dist/src/docs/discover.js +233 -0
- package/dist/src/docs/discover.js.map +1 -0
- package/dist/src/docs/portal.d.ts +79 -0
- package/dist/src/docs/portal.d.ts.map +1 -0
- package/dist/src/docs/portal.js +242 -0
- package/dist/src/docs/portal.js.map +1 -0
- package/dist/src/docs/registry-docs.d.ts +43 -0
- package/dist/src/docs/registry-docs.d.ts.map +1 -0
- package/dist/src/docs/registry-docs.js +138 -0
- package/dist/src/docs/registry-docs.js.map +1 -0
- package/dist/src/docs/schema.d.ts +48 -0
- package/dist/src/docs/schema.d.ts.map +1 -0
- package/dist/src/docs/schema.js +96 -0
- package/dist/src/docs/schema.js.map +1 -0
- package/dist/src/docs/serve.d.ts +27 -0
- package/dist/src/docs/serve.d.ts.map +1 -0
- package/dist/src/docs/serve.js +102 -0
- package/dist/src/docs/serve.js.map +1 -0
- package/dist/src/docs/start.d.ts +80 -0
- package/dist/src/docs/start.d.ts.map +1 -0
- package/dist/src/docs/start.js +313 -0
- package/dist/src/docs/start.js.map +1 -0
- package/dist/src/eval/agent-eval.d.mts +14 -0
- package/dist/src/eval/agent-eval.d.mts.map +1 -0
- package/dist/src/eval/agent-eval.mjs +273 -0
- package/dist/src/eval/agent-eval.mjs.map +1 -0
- package/dist/src/index.js +624 -7
- package/dist/src/index.js.map +7 -1
- package/dist/src/program.d.ts +26 -0
- package/dist/src/program.d.ts.map +1 -0
- package/dist/src/program.js +76 -0
- package/dist/src/program.js.map +1 -0
- package/dist/src/utils/auth-preflight.d.ts +159 -0
- package/dist/src/utils/auth-preflight.d.ts.map +1 -0
- package/dist/src/utils/auth-preflight.js +298 -0
- package/dist/src/utils/auth-preflight.js.map +1 -0
- package/dist/src/utils/aws-auth.d.ts +181 -0
- package/dist/src/utils/aws-auth.d.ts.map +1 -0
- package/dist/src/utils/aws-auth.js +527 -0
- package/dist/src/utils/aws-auth.js.map +1 -0
- package/dist/src/utils/bastion.d.ts +1 -1
- package/dist/src/utils/bastion.d.ts.map +1 -1
- package/dist/src/utils/bastion.js +29 -8
- package/dist/src/utils/bastion.js.map +1 -1
- package/dist/src/utils/build-info.d.ts +33 -0
- package/dist/src/utils/build-info.d.ts.map +1 -0
- package/dist/src/utils/build-info.js +102 -0
- package/dist/src/utils/build-info.js.map +1 -0
- package/dist/src/utils/capture-history.d.ts +62 -0
- package/dist/src/utils/capture-history.d.ts.map +1 -0
- package/dist/src/utils/capture-history.js +94 -0
- package/dist/src/utils/capture-history.js.map +1 -0
- package/dist/src/utils/deploy-preflight.d.ts +52 -0
- package/dist/src/utils/deploy-preflight.d.ts.map +1 -0
- package/dist/src/utils/deploy-preflight.js +183 -0
- package/dist/src/utils/deploy-preflight.js.map +1 -0
- package/dist/src/utils/errors.d.ts +75 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +106 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/first-party-contexts.d.ts +40 -0
- package/dist/src/utils/first-party-contexts.d.ts.map +1 -0
- package/dist/src/utils/first-party-contexts.js +53 -0
- package/dist/src/utils/first-party-contexts.js.map +1 -0
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +2 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/kubeconfig.d.ts +62 -0
- package/dist/src/utils/kubeconfig.d.ts.map +1 -0
- package/dist/src/utils/kubeconfig.js +118 -0
- package/dist/src/utils/kubeconfig.js.map +1 -0
- package/dist/src/utils/log.d.ts +27 -1
- package/dist/src/utils/log.d.ts.map +1 -1
- package/dist/src/utils/log.js +59 -5
- package/dist/src/utils/log.js.map +1 -1
- package/dist/src/utils/pid.d.ts +47 -0
- package/dist/src/utils/pid.d.ts.map +1 -0
- package/dist/src/utils/pid.js +83 -0
- package/dist/src/utils/pid.js.map +1 -0
- package/dist/src/utils/pulumi-run.d.ts +23 -0
- package/dist/src/utils/pulumi-run.d.ts.map +1 -0
- package/dist/src/utils/pulumi-run.js +112 -0
- package/dist/src/utils/pulumi-run.js.map +1 -0
- package/dist/src/utils/pulumi.d.ts +15 -0
- package/dist/src/utils/pulumi.d.ts.map +1 -1
- package/dist/src/utils/pulumi.js +35 -0
- package/dist/src/utils/pulumi.js.map +1 -1
- package/dist/src/utils/reachability.d.ts +29 -0
- package/dist/src/utils/reachability.d.ts.map +1 -0
- package/dist/src/utils/reachability.js +81 -0
- package/dist/src/utils/reachability.js.map +1 -0
- package/dist/src/utils/recover-conversation.d.ts +154 -0
- package/dist/src/utils/recover-conversation.d.ts.map +1 -0
- package/dist/src/utils/recover-conversation.js +314 -0
- package/dist/src/utils/recover-conversation.js.map +1 -0
- package/dist/src/utils/registry-broker.d.ts +148 -0
- package/dist/src/utils/registry-broker.d.ts.map +1 -0
- package/dist/src/utils/registry-broker.js +180 -0
- package/dist/src/utils/registry-broker.js.map +1 -0
- package/dist/src/utils/socks-forward.d.ts +40 -0
- package/dist/src/utils/socks-forward.d.ts.map +1 -0
- package/dist/src/utils/socks-forward.js +97 -0
- package/dist/src/utils/socks-forward.js.map +1 -0
- package/dist/src/utils/stack-flag.d.ts +23 -0
- package/dist/src/utils/stack-flag.d.ts.map +1 -0
- package/dist/src/utils/stack-flag.js +41 -0
- package/dist/src/utils/stack-flag.js.map +1 -0
- package/dist/src/utils/tailscale-targets.d.ts +52 -0
- package/dist/src/utils/tailscale-targets.d.ts.map +1 -0
- package/dist/src/utils/tailscale-targets.js +93 -0
- package/dist/src/utils/tailscale-targets.js.map +1 -0
- package/dist/src/utils/tailscale.d.ts +277 -0
- package/dist/src/utils/tailscale.d.ts.map +1 -0
- package/dist/src/utils/tailscale.js +1007 -0
- package/dist/src/utils/tailscale.js.map +1 -0
- package/dist/src/utils/temporal-auth.d.ts +43 -0
- package/dist/src/utils/temporal-auth.d.ts.map +1 -0
- package/dist/src/utils/temporal-auth.js +176 -0
- package/dist/src/utils/temporal-auth.js.map +1 -0
- package/dist/src/utils/temporal-codec.d.ts +101 -0
- package/dist/src/utils/temporal-codec.d.ts.map +1 -0
- package/dist/src/utils/temporal-codec.js +319 -0
- package/dist/src/utils/temporal-codec.js.map +1 -0
- package/dist/src/utils/tunnel-ownership.d.ts +130 -0
- package/dist/src/utils/tunnel-ownership.d.ts.map +1 -0
- package/dist/src/utils/tunnel-ownership.js +274 -0
- package/dist/src/utils/tunnel-ownership.js.map +1 -0
- package/dist/src/utils/vpn-join.d.ts +32 -0
- package/dist/src/utils/vpn-join.d.ts.map +1 -0
- package/dist/src/utils/vpn-join.js +62 -0
- package/dist/src/utils/vpn-join.js.map +1 -0
- package/dist/src/utils/vpn.d.ts +62 -0
- package/dist/src/utils/vpn.d.ts.map +1 -0
- package/dist/src/utils/vpn.js +183 -0
- package/dist/src/utils/vpn.js.map +1 -0
- package/dist/src/utils/workflow-fingerprint.d.ts +49 -0
- package/dist/src/utils/workflow-fingerprint.d.ts.map +1 -0
- package/dist/src/utils/workflow-fingerprint.js +135 -0
- package/dist/src/utils/workflow-fingerprint.js.map +1 -0
- package/dist/src/utils/worktree-identity.d.ts +86 -0
- package/dist/src/utils/worktree-identity.d.ts.map +1 -0
- package/dist/src/utils/worktree-identity.js +164 -0
- package/dist/src/utils/worktree-identity.js.map +1 -0
- package/fragments/agents/AGENTS.md.hbs +92 -0
- package/fragments/agents/CLAUDE.md.hbs +8 -0
- package/fragments/base/Pulumi.dev.yaml.hbs +10 -0
- package/fragments/base/Pulumi.yaml.hbs +9 -0
- package/fragments/base/index.ts.hbs +107 -0
- package/fragments/base/package.json.hbs +22 -0
- package/{templates/api-web-db/api → fragments/base}/tsconfig.json +3 -4
- package/fragments/bucket/api/src/storage.ts.hbs +81 -0
- package/fragments/database/api/src/db.ts.hbs +23 -0
- package/fragments/database/prisma/schema.prisma.hbs +18 -0
- package/{templates/api-web-db → fragments/service}/api/.dockerignore +2 -0
- package/fragments/service/api/package.json.hbs +40 -0
- package/fragments/service/api/src/index.ts.hbs +58 -0
- package/{templates/api-web-db → fragments/service/api}/tsconfig.json +5 -3
- package/fragments/temporal/worker/.dockerignore +4 -0
- package/fragments/temporal/worker/Dockerfile +15 -0
- package/{templates/temporal-api-worker → fragments/temporal}/worker/package.json.hbs +3 -2
- package/fragments/temporal/worker/src/activities.ts.hbs +14 -0
- package/fragments/temporal/worker/src/worker.ts.hbs +27 -0
- package/fragments/temporal/worker/src/workflows.ts.hbs +24 -0
- package/fragments/temporal/worker/tsconfig.json +13 -0
- package/package.json +36 -22
- package/skills/core/SKILL.md +365 -0
- package/skills/pull-remote-agent-context/SKILL.md +194 -0
- package/stack/docker-compose.hub.yml +134 -0
- package/stack/docker-compose.yml +447 -0
- package/stack/hub/Dockerfile.api +18 -0
- package/stack/hub/Dockerfile.auth +10 -0
- package/stack/hub/Dockerfile.ui +10 -0
- package/stack/init/01-databases.sql +12 -0
- package/stack/observability/blackbox.yml +20 -0
- package/stack/observability/otel-collector.yaml +73 -0
- package/stack/observability/prometheus.yml +36 -0
- package/stack/observability/tempo.yaml +25 -0
- package/stack/temporal/local.yaml +44 -0
- package/templates/api-auth/AGENTS.md.hbs +16 -0
- package/templates/api-auth/Pulumi.dev.yaml.hbs +8 -0
- package/templates/api-auth/Pulumi.yaml.hbs +8 -0
- package/templates/api-auth/README.md.hbs +67 -0
- package/templates/api-auth/api/package.json.hbs +28 -0
- package/templates/api-auth/api/src/index.ts.hbs +96 -0
- package/templates/api-auth/api/src/schema.ts.hbs +35 -0
- package/templates/api-auth/api/src/seed-authz.ts.hbs +48 -0
- package/templates/api-auth/api/src/spicedb-http-provider.ts.hbs +89 -0
- package/templates/api-auth/index.ts.hbs +65 -0
- package/templates/api-auth/package.json.hbs +20 -0
- package/templates/api-auth/skills/develop/SKILL.md.hbs +32 -0
- package/templates/api-role-gating/AGENTS.md.hbs +20 -0
- package/templates/api-role-gating/Pulumi.dev.yaml.hbs +8 -0
- package/templates/api-role-gating/Pulumi.yaml.hbs +8 -0
- package/templates/api-role-gating/README.md.hbs +64 -0
- package/templates/api-role-gating/api/Dockerfile +17 -0
- package/templates/api-role-gating/api/package.json.hbs +28 -0
- package/templates/api-role-gating/api/src/authn.ts.hbs +29 -0
- package/templates/api-role-gating/api/src/authz.ts.hbs +12 -0
- package/templates/api-role-gating/api/src/main.ts.hbs +58 -0
- package/templates/api-role-gating/api/src/schema.ts.hbs +22 -0
- package/templates/api-role-gating/api/tsconfig.json +13 -0
- package/templates/api-role-gating/index.ts.hbs +107 -0
- package/templates/api-role-gating/package.json.hbs +21 -0
- package/templates/api-role-gating/skills/develop/SKILL.md.hbs +60 -0
- package/templates/api-role-gating/tsconfig.json +10 -0
- package/templates/apps-repo/README.md.hbs +24 -0
- package/templates/apps-repo/gitignore +41 -0
- package/templates/apps-repo/npmrc.hbs +7 -0
- package/templates/apps-repo/package.json.hbs +15 -0
- package/templates/apps-repo/pnpm-workspace.yaml +3 -0
- package/templates/apps-repo/tsconfig.json +18 -0
- package/templates/external-service/AGENTS.md.hbs +20 -0
- package/templates/external-service/Pulumi.dev.yaml.hbs +8 -0
- package/templates/external-service/Pulumi.yaml.hbs +8 -0
- package/templates/external-service/README.md.hbs +56 -0
- package/templates/external-service/api/Dockerfile +15 -0
- package/templates/external-service/api/package.json.hbs +25 -0
- package/templates/external-service/api/src/index.ts.hbs +81 -0
- package/templates/external-service/index.ts.hbs +82 -0
- package/templates/external-service/mocks/vendorpay/package.json.hbs +9 -0
- package/templates/external-service/mocks/vendorpay/server.mjs.hbs +61 -0
- package/templates/external-service/package.json.hbs +34 -0
- package/templates/external-service/skills/develop/SKILL.md.hbs +55 -0
- package/templates/external-service/tsconfig.json +10 -0
- package/templates/platform-repo/AGENTS.md.hbs +18 -0
- package/templates/platform-repo/README.md.hbs +38 -0
- package/templates/platform-repo/core/Pulumi.yaml.hbs +12 -0
- package/templates/platform-repo/core/Pulumi.{{tenant}}-{{env}}.yaml.hbs +57 -0
- package/templates/platform-repo/core/index.ts +62 -0
- package/templates/platform-repo/core/package.json.hbs +22 -0
- package/templates/platform-repo/core/tsconfig.json +8 -0
- package/templates/platform-repo/package.json.hbs +15 -0
- package/templates/platform-repo/platform/Pulumi.yaml.hbs +12 -0
- package/templates/platform-repo/platform/Pulumi.{{tenant}}-{{env}}.yaml.hbs +59 -0
- package/templates/platform-repo/platform/index.ts +95 -0
- package/templates/platform-repo/platform/package.json.hbs +26 -0
- package/templates/platform-repo/platform/tsconfig.json +8 -0
- package/templates/platform-repo/pnpm-workspace.yaml +3 -0
- package/templates/workflow/AGENTS.md.hbs +15 -0
- package/templates/workflow/Pulumi.dev.yaml.hbs +8 -0
- package/templates/workflow/Pulumi.yaml.hbs +8 -0
- package/templates/workflow/README.md.hbs +45 -0
- package/templates/workflow/api/.dockerignore +4 -0
- package/templates/workflow/api/Dockerfile +15 -0
- package/templates/{temporal-api-worker → workflow}/api/package.json.hbs +8 -6
- package/templates/workflow/api/src/index.ts.hbs +130 -0
- package/templates/workflow/api/tsconfig.json +14 -0
- package/templates/workflow/index.ts.hbs +67 -0
- package/templates/workflow/package.json.hbs +20 -0
- package/templates/workflow/skills/develop/SKILL.md.hbs +32 -0
- package/templates/workflow/tsconfig.json +10 -0
- package/templates/workflow/worker/.dockerignore +4 -0
- package/templates/workflow/worker/Dockerfile +13 -0
- package/templates/workflow/worker/package.json.hbs +25 -0
- package/templates/workflow/worker/src/worker.ts.hbs +24 -0
- package/templates/workflow/worker/tsconfig.json +14 -0
- package/dist/src/commands/devbox.d.ts +0 -22
- package/dist/src/commands/devbox.d.ts.map +0 -1
- package/dist/src/commands/devbox.js +0 -463
- package/dist/src/commands/devbox.js.map +0 -1
- package/templates/api-web-db/api/Dockerfile +0 -16
- package/templates/api-web-db/api/package.json.hbs +0 -21
- package/templates/api-web-db/api/src/index.ts.hbs +0 -123
- package/templates/api-web-db/package.json.hbs +0 -27
- package/templates/api-web-db/sst.config.ts.hbs +0 -151
- package/templates/api-web-db/web/.dockerignore +0 -3
- package/templates/api-web-db/web/Dockerfile +0 -17
- package/templates/api-web-db/web/app/lib/db.server.ts +0 -36
- package/templates/api-web-db/web/app/root.tsx +0 -29
- package/templates/api-web-db/web/app/routes/home.tsx.hbs +0 -114
- package/templates/api-web-db/web/app/routes.ts +0 -3
- package/templates/api-web-db/web/package.json.hbs +0 -30
- package/templates/api-web-db/web/prisma/schema.prisma +0 -25
- package/templates/api-web-db/web/prisma.config.ts +0 -18
- package/templates/api-web-db/web/react-router.config.ts +0 -5
- package/templates/api-web-db/web/tsconfig.json +0 -19
- package/templates/api-web-db/web/vite.config.ts +0 -9
- package/templates/temporal-api-worker/README.md.hbs +0 -133
- package/templates/temporal-api-worker/api/src/index.ts.hbs +0 -145
- package/templates/temporal-api-worker/package.json.hbs +0 -29
- package/templates/temporal-api-worker/sst.config.ts.hbs +0 -161
- package/templates/temporal-api-worker/worker/Dockerfile +0 -11
- package/templates/temporal-api-worker/worker/src/bundle-workflows.ts +0 -38
- package/templates/temporal-api-worker/worker/src/worker.ts.hbs +0 -93
- /package/templates/{temporal-api-worker → api-auth}/api/.dockerignore +0 -0
- /package/templates/{temporal-api-worker → api-auth}/api/Dockerfile +0 -0
- /package/templates/{temporal-api-worker → api-auth}/api/tsconfig.json +0 -0
- /package/templates/{temporal-api-worker → api-auth}/tsconfig.json +0 -0
- /package/templates/{temporal-api-worker/worker → api-role-gating/api}/.dockerignore +0 -0
- /package/templates/{temporal-api-worker/worker → external-service/api}/tsconfig.json +0 -0
- /package/templates/{temporal-api-worker → workflow}/api/src/encryption-codec.ts +0 -0
- /package/templates/{temporal-api-worker → workflow}/worker/src/activities.ts.hbs +0 -0
- /package/templates/{temporal-api-worker → workflow}/worker/src/encryption-codec.ts +0 -0
- /package/templates/{temporal-api-worker → workflow}/worker/src/workflows.ts.hbs +0 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reconstruct an agent conversation's transcript from decoded Temporal history.
|
|
3
|
+
*
|
|
4
|
+
* An agent conversation is a Temporal `agentWorkflow`. Its durable history holds
|
|
5
|
+
* everything needed to replay the human/agent exchange even when the worker can
|
|
6
|
+
* no longer run the workflow (code drift):
|
|
7
|
+
*
|
|
8
|
+
* - `WorkflowExecutionSignaled` with signal name `submit_user_message` →
|
|
9
|
+
* one HUMAN turn. Its input payload is `SubmitUserMessageParams`
|
|
10
|
+
* (agent-sdk `agent-core/workflows/signals.ts`): `{ model, messages,
|
|
11
|
+
* streamId, ... }` where `messages` is a Vercel-AI `ModelMessage[]`; the
|
|
12
|
+
* user text lives in the `user`-role message(s).
|
|
13
|
+
* - `callLLM` `ActivityTaskCompleted` → one ASSISTANT turn. Its result is
|
|
14
|
+
* `LLMResult` (agent-sdk `agent-core/types.ts`): `{ messages, usage?,
|
|
15
|
+
* telemetry? }` where `messages` is the model's output `ModelMessage[]` —
|
|
16
|
+
* `assistant`-role text parts plus any `tool-call` parts.
|
|
17
|
+
*
|
|
18
|
+
* This module is the PURE reconstruction core: it takes events whose payloads
|
|
19
|
+
* have ALREADY been decrypted into plain objects and returns ordered turns. The
|
|
20
|
+
* Temporal fetch + decrypt wiring lives in `commands/temporal.ts`.
|
|
21
|
+
*
|
|
22
|
+
* Everything here is best-effort and defensive: payload shapes vary across
|
|
23
|
+
* agent-sdk versions, so every field access is guarded and a turn that can't be
|
|
24
|
+
* parsed becomes a placeholder rather than throwing — the whole point is to
|
|
25
|
+
* recover *something* from an otherwise-unreplayable history.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Classify a raw Temporal history into the ordered `DecodedEvent[]` that
|
|
29
|
+
* `reconstructTranscript` consumes.
|
|
30
|
+
*
|
|
31
|
+
* `ActivityTaskCompleted` events carry only a `scheduledEventId`, not the
|
|
32
|
+
* activity's type name — so to tell which completions came from `callLLM` we
|
|
33
|
+
* build a map of `ActivityTaskScheduled.eventId → activityType.name` as we walk
|
|
34
|
+
* the history in event order, then look each completion's `scheduledEventId` up
|
|
35
|
+
* in it. Only `callLLM` completions become `callLLMResult` (assistant) events;
|
|
36
|
+
* completions of other activities (e.g. `routeTools`) are dropped.
|
|
37
|
+
* `submit_user_message` signals become `userSignal` (human) events.
|
|
38
|
+
*
|
|
39
|
+
* Pure aside from the injected `decodePayload` (which performs the decrypt):
|
|
40
|
+
* never throws, and preserves history order.
|
|
41
|
+
*/
|
|
42
|
+
export async function classifyHistoryEvents(rawEvents, decodePayload) {
|
|
43
|
+
// scheduledEventId → activity type name, so we can tell which
|
|
44
|
+
// ActivityTaskCompleted events came from `callLLM`.
|
|
45
|
+
const activityTypeByScheduledId = new Map();
|
|
46
|
+
const events = [];
|
|
47
|
+
for (const event of rawEvents) {
|
|
48
|
+
const eventId = String(event.eventId);
|
|
49
|
+
const scheduled = event.activityTaskScheduledEventAttributes;
|
|
50
|
+
if (scheduled) {
|
|
51
|
+
const name = scheduled.activityType?.name;
|
|
52
|
+
if (name)
|
|
53
|
+
activityTypeByScheduledId.set(eventId, name);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const signal = event.workflowExecutionSignaledEventAttributes;
|
|
57
|
+
if (signal?.signalName === "submit_user_message") {
|
|
58
|
+
events.push({
|
|
59
|
+
eventId,
|
|
60
|
+
kind: "userSignal",
|
|
61
|
+
payload: await decodePayload(signal.input?.payloads),
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const completed = event.activityTaskCompletedEventAttributes;
|
|
66
|
+
if (completed) {
|
|
67
|
+
const scheduledId = String(completed.scheduledEventId);
|
|
68
|
+
if (activityTypeByScheduledId.get(scheduledId) === "callLLM") {
|
|
69
|
+
events.push({
|
|
70
|
+
eventId,
|
|
71
|
+
kind: "callLLMResult",
|
|
72
|
+
payload: await decodePayload(completed.result?.payloads),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return events;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract the highest-fidelity STRUCTURED transcript for a store-ready snapshot
|
|
81
|
+
* backfill — the complete `ModelMessage[]` with tool-call/tool-result parts
|
|
82
|
+
* intact (as opposed to `reconstructTranscript`'s flattened text turns).
|
|
83
|
+
*
|
|
84
|
+
* The source is the `callLLM` activity's SCHEDULED input, `callLLMArgs`
|
|
85
|
+
* (`{ model, messages }`), whose `messages` is the FULL accumulated conversation
|
|
86
|
+
* (user + assistant-with-tool-calls + tool-result messages) up to — but not
|
|
87
|
+
* including — that turn's assistant output. We take the LAST `callLLM`
|
|
88
|
+
* scheduled input (the most-accumulated one) and append the LAST `callLLM`
|
|
89
|
+
* completion's output messages (`LLMResult.messages`, the final assistant turn):
|
|
90
|
+
*
|
|
91
|
+
* [...lastScheduledInput.messages, ...lastCompletion.messages]
|
|
92
|
+
*
|
|
93
|
+
* Completions are matched to `callLLM` via `scheduledEventId` (same mapping as
|
|
94
|
+
* `classifyHistoryEvents`).
|
|
95
|
+
*
|
|
96
|
+
* Best-effort and never throws:
|
|
97
|
+
* - no `callLLM` scheduled input (0 assistant turns) → `[]`;
|
|
98
|
+
* - a scheduled input but no completion (last turn interrupted) → just the
|
|
99
|
+
* input messages.
|
|
100
|
+
*
|
|
101
|
+
* Pure aside from the injected `decodePayload` (which performs the decrypt).
|
|
102
|
+
*/
|
|
103
|
+
export async function extractSnapshotMessages(rawEvents, decodePayload) {
|
|
104
|
+
// Track the last `callLLM` scheduled input's payload group and its eventId, so
|
|
105
|
+
// we can (a) decode the most-accumulated messages and (b) match its
|
|
106
|
+
// completion by scheduledEventId.
|
|
107
|
+
let lastCallLLMScheduledId;
|
|
108
|
+
let lastCallLLMInputPayloads;
|
|
109
|
+
// Map every scheduled activity's eventId → type name so completions resolve.
|
|
110
|
+
const activityTypeByScheduledId = new Map();
|
|
111
|
+
// Track the last `callLLM` completion result payloads, keyed by matching the
|
|
112
|
+
// scheduledEventId back to a `callLLM`.
|
|
113
|
+
let lastCallLLMResultPayloads;
|
|
114
|
+
for (const event of rawEvents) {
|
|
115
|
+
const eventId = String(event.eventId);
|
|
116
|
+
const scheduled = event.activityTaskScheduledEventAttributes;
|
|
117
|
+
if (scheduled) {
|
|
118
|
+
const name = scheduled.activityType?.name;
|
|
119
|
+
if (name)
|
|
120
|
+
activityTypeByScheduledId.set(eventId, name);
|
|
121
|
+
if (name === "callLLM") {
|
|
122
|
+
lastCallLLMScheduledId = eventId;
|
|
123
|
+
lastCallLLMInputPayloads = scheduled.input?.payloads;
|
|
124
|
+
// Reset the result: a completion only "belongs" to this newly-scheduled
|
|
125
|
+
// callLLM if it arrives AFTER this point. Without the reset, a mid-turn
|
|
126
|
+
// interrupted last turn (scheduled, never completed) would keep a STALE
|
|
127
|
+
// earlier completion and duplicate that assistant message (it's already
|
|
128
|
+
// inside this turn's accumulated input). Matches the documented contract:
|
|
129
|
+
// scheduled-input-but-no-completion → just the input messages.
|
|
130
|
+
lastCallLLMResultPayloads = undefined;
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const completed = event.activityTaskCompletedEventAttributes;
|
|
135
|
+
if (completed) {
|
|
136
|
+
const scheduledId = String(completed.scheduledEventId);
|
|
137
|
+
if (activityTypeByScheduledId.get(scheduledId) === "callLLM") {
|
|
138
|
+
lastCallLLMResultPayloads = completed.result?.payloads;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (lastCallLLMScheduledId === undefined)
|
|
143
|
+
return [];
|
|
144
|
+
const inputArgs = await decodePayload(lastCallLLMInputPayloads);
|
|
145
|
+
const inputMessages = messagesFrom(inputArgs);
|
|
146
|
+
const result = await decodePayload(lastCallLLMResultPayloads);
|
|
147
|
+
const resultMessages = messagesFrom(result);
|
|
148
|
+
return [...inputMessages, ...resultMessages];
|
|
149
|
+
}
|
|
150
|
+
/** Pull a `.messages` array off a decoded `{ messages }` payload, else `[]`. */
|
|
151
|
+
function messagesFrom(payload) {
|
|
152
|
+
if (isRecord(payload) && Array.isArray(payload.messages)) {
|
|
153
|
+
return payload.messages;
|
|
154
|
+
}
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
// ── Extraction helpers (all defensive) ───────────────────────────────────────
|
|
158
|
+
/** Pull display text out of a ModelMessage `content` (string, or parts array). */
|
|
159
|
+
function extractText(content) {
|
|
160
|
+
if (typeof content === "string")
|
|
161
|
+
return content;
|
|
162
|
+
if (Array.isArray(content)) {
|
|
163
|
+
return content
|
|
164
|
+
.filter((p) => !!p && typeof p === "object" && p.type === "text")
|
|
165
|
+
.map((p) => (typeof p.text === "string" ? p.text : ""))
|
|
166
|
+
.join("");
|
|
167
|
+
}
|
|
168
|
+
return "";
|
|
169
|
+
}
|
|
170
|
+
/** Compact a tool-call's args to a single truncated JSON line. */
|
|
171
|
+
function summarizeArgs(args) {
|
|
172
|
+
try {
|
|
173
|
+
const str = JSON.stringify(args ?? {});
|
|
174
|
+
return str.length > 100 ? str.substring(0, 97) + "..." : str;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return "...";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Format a `tool-call` content part as `name(compactArgs)`. */
|
|
181
|
+
function formatToolCall(part) {
|
|
182
|
+
const name = typeof part.toolName === "string" ? part.toolName : "?";
|
|
183
|
+
// AI SDK v5 uses `input`; older payloads use `args`. Accept either.
|
|
184
|
+
const args = "input" in part ? part.input : part.args;
|
|
185
|
+
return `${name}(${summarizeArgs(args)})`;
|
|
186
|
+
}
|
|
187
|
+
function isRecord(v) {
|
|
188
|
+
return !!v && typeof v === "object";
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Extract the human text from a `submit_user_message` signal payload. Returns
|
|
192
|
+
* `null` when nothing recognizable is found (caller emits a placeholder).
|
|
193
|
+
*/
|
|
194
|
+
function extractUserText(payload) {
|
|
195
|
+
if (!isRecord(payload))
|
|
196
|
+
return null;
|
|
197
|
+
const messages = payload.messages;
|
|
198
|
+
if (Array.isArray(messages)) {
|
|
199
|
+
const parts = [];
|
|
200
|
+
for (const m of messages) {
|
|
201
|
+
if (isRecord(m) && m.role === "user") {
|
|
202
|
+
const t = extractText(m.content);
|
|
203
|
+
if (t)
|
|
204
|
+
parts.push(t);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (parts.length > 0)
|
|
208
|
+
return parts.join("\n");
|
|
209
|
+
}
|
|
210
|
+
// Defensive fallbacks for shape drift — try common single-field carriers.
|
|
211
|
+
for (const field of ["content", "text", "message"]) {
|
|
212
|
+
const v = payload[field];
|
|
213
|
+
if (typeof v === "string" && v)
|
|
214
|
+
return v;
|
|
215
|
+
const t = extractText(v);
|
|
216
|
+
if (t)
|
|
217
|
+
return t;
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Extract the assistant text + tool calls from a `callLLM` result payload.
|
|
223
|
+
* Returns `null` only when nothing at all could be parsed (no text AND no tool
|
|
224
|
+
* calls) — a tool-only turn (empty text, non-empty toolCalls) is valid.
|
|
225
|
+
*/
|
|
226
|
+
function extractAssistantTurn(payload) {
|
|
227
|
+
if (!isRecord(payload))
|
|
228
|
+
return null;
|
|
229
|
+
const messages = payload.messages;
|
|
230
|
+
if (!Array.isArray(messages)) {
|
|
231
|
+
// Defensive fallback: some shapes may carry text directly.
|
|
232
|
+
const t = extractText(payload.content) || extractText(payload.text);
|
|
233
|
+
return t ? { text: t, toolCalls: [] } : null;
|
|
234
|
+
}
|
|
235
|
+
let text = "";
|
|
236
|
+
const toolCalls = [];
|
|
237
|
+
for (const m of messages) {
|
|
238
|
+
if (!isRecord(m) || m.role !== "assistant")
|
|
239
|
+
continue;
|
|
240
|
+
text += extractText(m.content);
|
|
241
|
+
if (Array.isArray(m.content)) {
|
|
242
|
+
for (const p of m.content) {
|
|
243
|
+
if (isRecord(p) && p.type === "tool-call") {
|
|
244
|
+
toolCalls.push(formatToolCall(p));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (!text && toolCalls.length === 0)
|
|
250
|
+
return null;
|
|
251
|
+
return { text, toolCalls };
|
|
252
|
+
}
|
|
253
|
+
// ── Reconstruction ───────────────────────────────────────────────────────────
|
|
254
|
+
/**
|
|
255
|
+
* Reconstruct ordered conversation turns from decoded history events.
|
|
256
|
+
*
|
|
257
|
+
* Pure: no I/O, never throws. `other` events are skipped; unparseable
|
|
258
|
+
* user/assistant events become placeholder turns so the recovery is complete
|
|
259
|
+
* end-to-end even when individual payloads are corrupt.
|
|
260
|
+
*/
|
|
261
|
+
export function reconstructTranscript(events) {
|
|
262
|
+
const turns = [];
|
|
263
|
+
for (const event of events) {
|
|
264
|
+
if (event.kind === "userSignal") {
|
|
265
|
+
const text = extractUserText(event.payload);
|
|
266
|
+
turns.push(text !== null
|
|
267
|
+
? { role: "user", text, eventId: event.eventId }
|
|
268
|
+
: { role: "user", text: placeholder(event.eventId), eventId: event.eventId });
|
|
269
|
+
}
|
|
270
|
+
else if (event.kind === "callLLMResult") {
|
|
271
|
+
const turn = extractAssistantTurn(event.payload);
|
|
272
|
+
if (turn) {
|
|
273
|
+
turns.push({
|
|
274
|
+
role: "assistant",
|
|
275
|
+
text: turn.text,
|
|
276
|
+
eventId: event.eventId,
|
|
277
|
+
...(turn.toolCalls.length > 0 ? { toolCalls: turn.toolCalls } : {}),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
turns.push({
|
|
282
|
+
role: "assistant",
|
|
283
|
+
text: placeholder(event.eventId),
|
|
284
|
+
eventId: event.eventId,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// `other` → skipped
|
|
289
|
+
}
|
|
290
|
+
return turns;
|
|
291
|
+
}
|
|
292
|
+
function placeholder(eventId) {
|
|
293
|
+
return `_[unparseable turn: ${eventId}]_`;
|
|
294
|
+
}
|
|
295
|
+
// ── Rendering ─────────────────────────────────────────────────────────────────
|
|
296
|
+
/** Render turns as a readable markdown transcript. */
|
|
297
|
+
export function renderTranscriptMarkdown(turns) {
|
|
298
|
+
const blocks = [];
|
|
299
|
+
for (const turn of turns) {
|
|
300
|
+
const heading = turn.role === "user" ? "## User" : "## Assistant";
|
|
301
|
+
const lines = [heading, ""];
|
|
302
|
+
if (turn.text)
|
|
303
|
+
lines.push(turn.text);
|
|
304
|
+
if (turn.toolCalls && turn.toolCalls.length > 0) {
|
|
305
|
+
if (turn.text)
|
|
306
|
+
lines.push("");
|
|
307
|
+
for (const tc of turn.toolCalls)
|
|
308
|
+
lines.push(`→ tool: ${tc}`);
|
|
309
|
+
}
|
|
310
|
+
blocks.push(lines.join("\n"));
|
|
311
|
+
}
|
|
312
|
+
return blocks.join("\n\n") + "\n";
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=recover-conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-conversation.js","sourceRoot":"","sources":["../../../src/utils/recover-conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client for the Zitadel-gated registry-auth broker.
|
|
3
|
+
*
|
|
4
|
+
* This is the path that lets a brand-new Trabian developer install
|
|
5
|
+
* `@mesh-tech/*` with **no AWS account, no AWS CLI and no ~/.aws/config**: the
|
|
6
|
+
* broker verifies the Zitadel id token `mesh login` already cached, checks the
|
|
7
|
+
* caller's role, and returns a CodeArtifact token minted with the BROKER's AWS
|
|
8
|
+
* identity. No AWS credential of any kind reaches the laptop.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is pure or dependency-injected so the fallback behaviour —
|
|
11
|
+
* which is what decides whether a broker hiccup breaks an install — is
|
|
12
|
+
* unit-testable without a network.
|
|
13
|
+
*/
|
|
14
|
+
type CtxConfig = {
|
|
15
|
+
issuer?: string;
|
|
16
|
+
registryBroker?: string;
|
|
17
|
+
} | null;
|
|
18
|
+
/**
|
|
19
|
+
* Pick a context for a `mesh registry login` invoked with none.
|
|
20
|
+
*
|
|
21
|
+
* A context-less call used to skip the broker outright, which quietly sent
|
|
22
|
+
* anyone following a remediation that omits the context straight back to the
|
|
23
|
+
* AWS chain — the exact routing this feature removes. So: if exactly one cached
|
|
24
|
+
* context publishes a `registryBroker`, use it. Zero or several is genuinely
|
|
25
|
+
* ambiguous and the caller must say which.
|
|
26
|
+
*
|
|
27
|
+
* Deliberately narrow. Guessing among several contexts would post the user's id
|
|
28
|
+
* token to a broker they did not name.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveDefaultBrokerContext(configs?: Record<string, {
|
|
31
|
+
registryBroker?: string;
|
|
32
|
+
}>, credentials?: Record<string, unknown>): {
|
|
33
|
+
context: string;
|
|
34
|
+
} | {
|
|
35
|
+
reason: "none" | "ambiguous";
|
|
36
|
+
candidates: string[];
|
|
37
|
+
};
|
|
38
|
+
/** A successful grant from `POST /token`. */
|
|
39
|
+
export interface RegistryGrant {
|
|
40
|
+
/** npm scope the endpoint is bound to, e.g. "@mesh-tech". */
|
|
41
|
+
scope: string;
|
|
42
|
+
/** Registry endpoint URL (npm format). */
|
|
43
|
+
endpoint: string;
|
|
44
|
+
/** CodeArtifact bearer for the `//<host>:_authToken=` npmrc line. */
|
|
45
|
+
authorizationToken: string;
|
|
46
|
+
/** ISO 8601 expiry, for reporting. */
|
|
47
|
+
expiresAt?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Why a broker attempt didn't produce a grant. */
|
|
50
|
+
export type RegistryBrokerFailure =
|
|
51
|
+
/** No broker URL for this context — the platform predates the broker. */
|
|
52
|
+
{
|
|
53
|
+
kind: "no-broker";
|
|
54
|
+
}
|
|
55
|
+
/** No cached Zitadel session — the user needs `mesh login <context>`. */
|
|
56
|
+
| {
|
|
57
|
+
kind: "no-session";
|
|
58
|
+
}
|
|
59
|
+
/** The broker rejected the token (expired/wrong audience). */
|
|
60
|
+
| {
|
|
61
|
+
kind: "unauthenticated";
|
|
62
|
+
}
|
|
63
|
+
/** A valid Mesh account that has not been granted registry access. */
|
|
64
|
+
| {
|
|
65
|
+
kind: "not-authorized";
|
|
66
|
+
email?: string;
|
|
67
|
+
requiredRoles?: string[];
|
|
68
|
+
requestUrl?: string;
|
|
69
|
+
}
|
|
70
|
+
/** Broker unreachable, 5xx, or a malformed body. */
|
|
71
|
+
| {
|
|
72
|
+
kind: "unavailable";
|
|
73
|
+
detail: string;
|
|
74
|
+
};
|
|
75
|
+
export type RegistryBrokerResult = {
|
|
76
|
+
ok: true;
|
|
77
|
+
grant: RegistryGrant;
|
|
78
|
+
} | {
|
|
79
|
+
ok: false;
|
|
80
|
+
failure: RegistryBrokerFailure;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Resolve the broker URL, preferring the platform-published value from
|
|
84
|
+
* discovery (`ContextConfig.registryBroker`) and falling back to DNS-convention
|
|
85
|
+
* derivation for platforms not yet redeployed with the payload field.
|
|
86
|
+
*
|
|
87
|
+
* Mirrors `resolveVpnJoinBroker` deliberately — one convention for
|
|
88
|
+
* platform-published service URLs, not two.
|
|
89
|
+
*/
|
|
90
|
+
export declare function resolveRegistryBroker(context: string, getCfg?: (c: string) => CtxConfig): string | null;
|
|
91
|
+
/**
|
|
92
|
+
* Timeout for a broker whose URL the platform actually published. It exists;
|
|
93
|
+
* wait for it.
|
|
94
|
+
*/
|
|
95
|
+
export declare const PUBLISHED_BROKER_TIMEOUT_MS = 15000;
|
|
96
|
+
/**
|
|
97
|
+
* Timeout for a broker URL we merely *derived* by DNS convention. For every
|
|
98
|
+
* platform that has not deployed the broker — which today is all of them — that
|
|
99
|
+
* host does not exist, and this wait sits in front of the AWS fallback on the
|
|
100
|
+
* `mesh login` path too. Fail fast on a guess; be patient with a fact.
|
|
101
|
+
*/
|
|
102
|
+
export declare const DERIVED_BROKER_TIMEOUT_MS = 4000;
|
|
103
|
+
/**
|
|
104
|
+
* Resolve the broker URL *and* say where it came from, so the caller can pick a
|
|
105
|
+
* timeout that matches how much confidence the URL deserves.
|
|
106
|
+
*/
|
|
107
|
+
export declare function resolveRegistryBrokerSource(context: string, getCfg?: (c: string) => CtxConfig): {
|
|
108
|
+
url: string | null;
|
|
109
|
+
source: "published" | "derived";
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* FALLBACK ONLY. Derive by convention — issuer host `identity.<env>.<domain>`
|
|
113
|
+
* → `registry-auth.<env>.<domain>`. Prefer `resolveRegistryBroker`, which reads
|
|
114
|
+
* the platform-published URL first.
|
|
115
|
+
*/
|
|
116
|
+
export declare function deriveRegistryBroker(context: string, getCfg?: (c: string) => CtxConfig): string | null;
|
|
117
|
+
export interface FetchGrantDeps {
|
|
118
|
+
getValidToken: (context: string) => Promise<string | null>;
|
|
119
|
+
fetchFn?: typeof fetch;
|
|
120
|
+
/** Abort the broker call after this long. Keeps a wedged broker from hanging an install. */
|
|
121
|
+
timeoutMs?: number;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Classify a broker response into a grant or a typed failure.
|
|
125
|
+
*
|
|
126
|
+
* Split out from the fetch so every status code's meaning is pinned by a test.
|
|
127
|
+
* The distinction that matters: **401 means re-login, 403 means request
|
|
128
|
+
* access** — collapsing them (as a boolean-returning client would) is what
|
|
129
|
+
* sends a developer to re-run `mesh login` forever when the real answer is
|
|
130
|
+
* "ask an admin for the role".
|
|
131
|
+
*/
|
|
132
|
+
export declare function classifyBrokerResponse(res: {
|
|
133
|
+
status: number;
|
|
134
|
+
json: () => Promise<unknown>;
|
|
135
|
+
}): Promise<RegistryBrokerResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Exchange the cached Zitadel id token for a CodeArtifact read grant.
|
|
138
|
+
*
|
|
139
|
+
* `interactive: false` on the token lookup — this runs inside
|
|
140
|
+
* `mesh registry login`, which has its own AWS fallback chain, so an expired
|
|
141
|
+
* session must return `no-session` rather than stalling a headless run in a
|
|
142
|
+
* device-code poll.
|
|
143
|
+
*/
|
|
144
|
+
export declare function fetchRegistryGrant(context: string, brokerUrl: string, deps: FetchGrantDeps): Promise<RegistryBrokerResult>;
|
|
145
|
+
/** Convenience for production callers that use the real login.ts token source. */
|
|
146
|
+
export declare function realGrantDeps(): FetchGrantDeps;
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=registry-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-broker.d.ts","sourceRoot":"","sources":["../../../src/utils/registry-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,KAAK,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAA2B,EAC9E,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAwB,GAC1D;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAM9E;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,MAAM,qBAAqB;AAC/B,yEAAyE;AACvE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,yEAAyE;GACvE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE;AACxB,8DAA8D;GAC5D;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE;AAC7B,sEAAsE;GACpE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AAC3F,oDAAoD;GAClD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAElD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAA4B,GAClD,MAAM,GAAG,IAAI,CAEf;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAA4B,GAClD;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAIzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAA4B,GAClD,MAAM,GAAG,IAAI,CAWf;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiDhC;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAED,kFAAkF;AAClF,wBAAgB,aAAa,IAAI,cAAc,CAE9C"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client for the Zitadel-gated registry-auth broker.
|
|
3
|
+
*
|
|
4
|
+
* This is the path that lets a brand-new Trabian developer install
|
|
5
|
+
* `@mesh-tech/*` with **no AWS account, no AWS CLI and no ~/.aws/config**: the
|
|
6
|
+
* broker verifies the Zitadel id token `mesh login` already cached, checks the
|
|
7
|
+
* caller's role, and returns a CodeArtifact token minted with the BROKER's AWS
|
|
8
|
+
* identity. No AWS credential of any kind reaches the laptop.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is pure or dependency-injected so the fallback behaviour —
|
|
11
|
+
* which is what decides whether a broker hiccup breaks an install — is
|
|
12
|
+
* unit-testable without a network.
|
|
13
|
+
*/
|
|
14
|
+
import { getContextConfig, getValidToken, readAllCredentials, readAllContextConfigs } from "../commands/login.js";
|
|
15
|
+
/**
|
|
16
|
+
* Pick a context for a `mesh registry login` invoked with none.
|
|
17
|
+
*
|
|
18
|
+
* A context-less call used to skip the broker outright, which quietly sent
|
|
19
|
+
* anyone following a remediation that omits the context straight back to the
|
|
20
|
+
* AWS chain — the exact routing this feature removes. So: if exactly one cached
|
|
21
|
+
* context publishes a `registryBroker`, use it. Zero or several is genuinely
|
|
22
|
+
* ambiguous and the caller must say which.
|
|
23
|
+
*
|
|
24
|
+
* Deliberately narrow. Guessing among several contexts would post the user's id
|
|
25
|
+
* token to a broker they did not name.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveDefaultBrokerContext(configs = readAllContextConfigs(), credentials = readAllCredentials()) {
|
|
28
|
+
const candidates = Object.entries(configs)
|
|
29
|
+
.filter(([name, cfg]) => Boolean(cfg?.registryBroker) && name in credentials)
|
|
30
|
+
.map(([name]) => name);
|
|
31
|
+
if (candidates.length === 1)
|
|
32
|
+
return { context: candidates[0] };
|
|
33
|
+
return { reason: candidates.length === 0 ? "none" : "ambiguous", candidates };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the broker URL, preferring the platform-published value from
|
|
37
|
+
* discovery (`ContextConfig.registryBroker`) and falling back to DNS-convention
|
|
38
|
+
* derivation for platforms not yet redeployed with the payload field.
|
|
39
|
+
*
|
|
40
|
+
* Mirrors `resolveVpnJoinBroker` deliberately — one convention for
|
|
41
|
+
* platform-published service URLs, not two.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveRegistryBroker(context, getCfg = getContextConfig) {
|
|
44
|
+
return resolveRegistryBrokerSource(context, getCfg).url;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Timeout for a broker whose URL the platform actually published. It exists;
|
|
48
|
+
* wait for it.
|
|
49
|
+
*/
|
|
50
|
+
export const PUBLISHED_BROKER_TIMEOUT_MS = 15_000;
|
|
51
|
+
/**
|
|
52
|
+
* Timeout for a broker URL we merely *derived* by DNS convention. For every
|
|
53
|
+
* platform that has not deployed the broker — which today is all of them — that
|
|
54
|
+
* host does not exist, and this wait sits in front of the AWS fallback on the
|
|
55
|
+
* `mesh login` path too. Fail fast on a guess; be patient with a fact.
|
|
56
|
+
*/
|
|
57
|
+
export const DERIVED_BROKER_TIMEOUT_MS = 4_000;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the broker URL *and* say where it came from, so the caller can pick a
|
|
60
|
+
* timeout that matches how much confidence the URL deserves.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveRegistryBrokerSource(context, getCfg = getContextConfig) {
|
|
63
|
+
const cfg = getCfg(context);
|
|
64
|
+
if (cfg?.registryBroker)
|
|
65
|
+
return { url: cfg.registryBroker, source: "published" };
|
|
66
|
+
return { url: deriveRegistryBroker(context, getCfg), source: "derived" };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* FALLBACK ONLY. Derive by convention — issuer host `identity.<env>.<domain>`
|
|
70
|
+
* → `registry-auth.<env>.<domain>`. Prefer `resolveRegistryBroker`, which reads
|
|
71
|
+
* the platform-published URL first.
|
|
72
|
+
*/
|
|
73
|
+
export function deriveRegistryBroker(context, getCfg = getContextConfig) {
|
|
74
|
+
const cfg = getCfg(context);
|
|
75
|
+
if (!cfg?.issuer)
|
|
76
|
+
return null;
|
|
77
|
+
try {
|
|
78
|
+
const u = new URL(cfg.issuer);
|
|
79
|
+
const parts = u.hostname.split(".");
|
|
80
|
+
parts[0] = "registry-auth";
|
|
81
|
+
return `https://${parts.join(".")}`;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Classify a broker response into a grant or a typed failure.
|
|
89
|
+
*
|
|
90
|
+
* Split out from the fetch so every status code's meaning is pinned by a test.
|
|
91
|
+
* The distinction that matters: **401 means re-login, 403 means request
|
|
92
|
+
* access** — collapsing them (as a boolean-returning client would) is what
|
|
93
|
+
* sends a developer to re-run `mesh login` forever when the real answer is
|
|
94
|
+
* "ask an admin for the role".
|
|
95
|
+
*/
|
|
96
|
+
export async function classifyBrokerResponse(res) {
|
|
97
|
+
if (res.status === 401)
|
|
98
|
+
return { ok: false, failure: { kind: "unauthenticated" } };
|
|
99
|
+
if (res.status === 403) {
|
|
100
|
+
const body = (await res.json().catch(() => ({})));
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
failure: {
|
|
104
|
+
kind: "not-authorized",
|
|
105
|
+
email: typeof body.email === "string" ? body.email : undefined,
|
|
106
|
+
requiredRoles: Array.isArray(body.requiredRoles)
|
|
107
|
+
? body.requiredRoles.filter((r) => typeof r === "string")
|
|
108
|
+
: undefined,
|
|
109
|
+
requestUrl: typeof body.requestUrl === "string" ? body.requestUrl : undefined,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (res.status !== 200) {
|
|
114
|
+
return { ok: false, failure: { kind: "unavailable", detail: `broker returned ${res.status}` } };
|
|
115
|
+
}
|
|
116
|
+
let body;
|
|
117
|
+
try {
|
|
118
|
+
body = (await res.json());
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
failure: { kind: "unavailable", detail: `malformed broker response: ${err.message}` },
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const { endpoint, authorizationToken, scope, expiresAt } = body;
|
|
127
|
+
if (typeof endpoint !== "string" || !endpoint || typeof authorizationToken !== "string" || !authorizationToken) {
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
failure: { kind: "unavailable", detail: "broker response missing endpoint or authorizationToken" },
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
ok: true,
|
|
135
|
+
grant: {
|
|
136
|
+
scope: typeof scope === "string" && scope ? scope : "@mesh-tech",
|
|
137
|
+
endpoint,
|
|
138
|
+
authorizationToken,
|
|
139
|
+
expiresAt: typeof expiresAt === "string" ? expiresAt : undefined,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Exchange the cached Zitadel id token for a CodeArtifact read grant.
|
|
145
|
+
*
|
|
146
|
+
* `interactive: false` on the token lookup — this runs inside
|
|
147
|
+
* `mesh registry login`, which has its own AWS fallback chain, so an expired
|
|
148
|
+
* session must return `no-session` rather than stalling a headless run in a
|
|
149
|
+
* device-code poll.
|
|
150
|
+
*/
|
|
151
|
+
export async function fetchRegistryGrant(context, brokerUrl, deps) {
|
|
152
|
+
const token = await deps.getValidToken(context);
|
|
153
|
+
if (!token)
|
|
154
|
+
return { ok: false, failure: { kind: "no-session" } };
|
|
155
|
+
const doFetch = deps.fetchFn ?? fetch;
|
|
156
|
+
const controller = new AbortController();
|
|
157
|
+
const timer = setTimeout(() => controller.abort(), deps.timeoutMs ?? PUBLISHED_BROKER_TIMEOUT_MS);
|
|
158
|
+
try {
|
|
159
|
+
const res = await doFetch(`${brokerUrl.replace(/\/+$/, "")}/token`, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: { authorization: `Bearer ${token}` },
|
|
162
|
+
signal: controller.signal,
|
|
163
|
+
});
|
|
164
|
+
return await classifyBrokerResponse(res);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return {
|
|
168
|
+
ok: false,
|
|
169
|
+
failure: { kind: "unavailable", detail: err.message },
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
clearTimeout(timer);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Convenience for production callers that use the real login.ts token source. */
|
|
177
|
+
export function realGrantDeps() {
|
|
178
|
+
return { getValidToken: (c) => getValidToken(c) };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=registry-broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-broker.js","sourceRoot":"","sources":["../../../src/utils/registry-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAIlH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAuD,qBAAqB,EAAE,EAC9E,cAAuC,kBAAkB,EAAE;IAE3D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,IAAI,IAAI,WAAW,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAE,EAAE,CAAC;IAChE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;AAChF,CAAC;AA+BD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAe,EACf,SAAmC,gBAAgB;IAEnD,OAAO,2BAA2B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAElD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,SAAmC,gBAAgB;IAEnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,GAAG,EAAE,cAAc;QAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjF,OAAO,EAAE,GAAG,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,SAAmC,gBAAgB;IAEnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;QAC3B,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAG5C;IACC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAEnF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QAC7E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE;gBACP,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC9D,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;oBAC9C,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;oBACtE,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;aAC9E;SACF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,8BAA+B,GAAa,CAAC,OAAO,EAAE,EAAE;SACjG,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAChE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,IAAI,OAAO,kBAAkB,KAAK,QAAQ,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/G,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,wDAAwD,EAAE;SACnG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE;YACL,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;YAChE,QAAQ;YACR,kBAAkB;YAClB,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACjE;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,SAAiB,EACjB,IAAoB;IAEpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;IAElE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,2BAA2B,CAAC,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,OAAO,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAE;SACjE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC"}
|