Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container prepare 2026/06/22 17:51:17 Entrypoint initialization Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container place-scripts 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-0-2zf4k 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-1-2zvnd 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-2-cxmqg 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-3-dgs45 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-4-wm6ls 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-5-prl4l 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-6-f9wbl 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-8-ktvdl 2026/06/22 17:51:18 Decoded script /tekton/scripts/script-9-5bndl Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container working-dir-initializer Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-git-clone Cloning into 'source'... git cloning url: https://github.com/greencapitaltrade/fury.git version refs/pull/2049/head:PR-2049@76c643580bb77fa6e0cf7a46fc92094da4a98c8a to dir: source From https://github.com/greencapitaltrade/fury * [new ref] refs/pull/2049/head -> PR-2049 Switched to branch 'PR-2049' HEAD is now at 76c64358 refactor: rename documentStep to executeFlowStep (schema surface) checked out revision: refs/pull/2049/head:PR-2049@76c643580bb77fa6e0cf7a46fc92094da4a98c8a to dir: source Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-git-merge setup git user email jenkins-x@googlegroups.com Using SHAs from PULL_REFS=jarvis/feature-2017:1f08acd679455067108805c9900008a0c976f83c,2049:76c643580bb77fa6e0cf7a46fc92094da4a98c8a:refs/pull/2049/head using base branch jarvis/feature-2017 and base sha 1f08acd679455067108805c9900008a0c976f83c merging sha: 76c643580bb77fa6e0cf7a46fc92094da4a98c8a Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-jx-variables WARNING: no $GIT_SECRET_MOUNT_PATH environment variable set about to run: git clone --no-checkout --filter=blob:none --depth=1 https://github.com/greencapitaltrade/mcu.git /tmp/jx-git-2765886815 in dir /tmp Cloning into '/tmp/jx-git-2765886815'... about to run: git sparse-checkout set --no-cone jx-requirements.yml .jx/gitops/source-config.yaml in dir /tmp/jx-git-2765886815 about to run: git checkout in dir /tmp/jx-git-2765886815 Your branch is up to date with 'origin/main'. export APP_NAME='fury' export BRANCH_NAME='PR-2049' export BUILD_NUMBER='7' export DOCKERFILE_PATH='Dockerfile' export DOCKER_REGISTRY='417755753340.dkr.ecr.ap-south-1.amazonaws.com' export DOCKER_REGISTRY_ORG='greencapitaltrade' export DOMAIN='gc-t.in' about to run: git rev-parse --abbrev-ref HEAD in dir . jarvis/feature-2017 export GIT_BRANCH='jarvis/feature-2017' export JENKINS_X_URL='https://dashboard-jx.gc-t.in/greencapitaltrade/fury/PR-2049/7' export JX_CHART_REPOSITORY='http://jenkins-x-chartmuseum.jx.svc.cluster.local:8080' export KANIKO_FLAGS='--skip-unused-stages --snapshotMode=redo' export MINK_AS='tekton-bot' version file VERSION does not exist export MINK_IMAGE='417755753340.dkr.ecr.ap-south-1.amazonaws.com/greencapitaltrade/fury:0.0.0-PR-2049-7-SNAPSHOT' export NAMESPACE_SUB_DOMAIN='-jx.' export PIPELINE_KIND='pullrequest' export PUSH_CONTAINER_REGISTRY='417755753340.dkr.ecr.ap-south-1.amazonaws.com' export REPO_NAME='fury' export REPO_OWNER='greencapitaltrade' version file VERSION does not exist export VERSION='0.0.0-PR-2049-7-SNAPSHOT' added variables to file: .jx/variables.sh added variables to file: .jx/variables.sh Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-build-npm-install npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead npm warn deprecated keygrip@1.1.0: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. npm warn deprecated @apollo/server-gateway-interface@1.1.1: @apollo/server-gateway-interface v1 is part of Apollo Server v4, which is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v2 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details. npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported npm warn deprecated @apollo/server@4.13.0: Apollo Server v4 is end-of-life since January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v5 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details. > fury@0.0.1 postinstall > npm run build npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown env config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. > fury@0.0.1 build > npm run compile npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown env config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. > fury@0.0.1 compile > npm run generate && tsc npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown env config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. > fury@0.0.1 generate > graphql-codegen --config codegen.yml [STARTED] Parse Configuration [SUCCESS] Parse Configuration [STARTED] Generate outputs [STARTED] Generate to ./src/schema/types.ts [STARTED] Load GraphQL schemas [SUCCESS] Load GraphQL schemas [STARTED] Load GraphQL documents [SUCCESS] Load GraphQL documents [STARTED] Generate [SUCCESS] Generate [SUCCESS] Generate to ./src/schema/types.ts [SUCCESS] Generate outputs added 978 packages in 11s 161 packages are looking for funding run `npm fund` for details npm warn allow-scripts 4 packages have install scripts not yet covered by allowScripts: npm warn allow-scripts @apollo/protobufjs@1.2.7 (postinstall: node scripts/postinstall) npm warn allow-scripts core-js-pure@3.45.1 (postinstall: node -e "try{require('./postinstall')}catch(e){}") npm warn allow-scripts protobufjs@7.5.4 (postinstall: node scripts/postinstall) npm warn allow-scripts unrs-resolver@1.11.1 (postinstall: napi-postinstall unrs-resolver 1.11.1 check) npm warn allow-scripts npm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow. Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-build-run-linting npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. npm warn exec The following package was not found and will be installed: eslint@10.5.0 Oops! Something went wrong! :( ESLint: 10.5.0 TypeError [ERR_IMPORT_ATTRIBUTE_MISSING]: Module "file:///workspace/source/node_modules/@greencapitaltrade/utils/dotfiles/.eslintrc.json?mtime=1782150699269" needs an import attribute of "type: json" at validateAttributes (node:internal/modules/esm/assert:88:15) at defaultLoadSync (node:internal/modules/esm/load:163:3) at #loadAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:805:12) at #loadSync (node:internal/modules/esm/loader:837:53) at ModuleLoader.load (node:internal/modules/esm/loader:786:26) at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:497:31) at #getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:563:36) at afterResolve (node:internal/modules/esm/loader:610:52) at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:616:12) at node:internal/modules/esm/loader:635:32 npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. Get:1 http://deb.debian.org/debian trixie InRelease [140 kB] Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB] Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB] Get:4 http://deb.debian.org/debian trixie/main amd64 Packages [9671 kB] Get:5 http://deb.debian.org/debian trixie-updates/main amd64 Packages [5412 B] Get:6 http://deb.debian.org/debian-security trixie-security/main amd64 Packages [222 kB] Fetched 10.1 MB in 1s (14.8 MB/s) Reading package lists... Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: git-man libbrotli1 libcom-err2 libcurl3t64-gnutls liberror-perl libexpat1 libffi8 libgdbm-compat4t64 libgdbm6t64 libgnutls30t64 libgssapi-krb5-2 libidn2-0 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap2 libnghttp2-14 libnghttp3-9 libngtcp2-16 libngtcp2-crypto-gnutls8 libp11-kit0 libperl5.40 libpsl5t64 librtmp1 libsasl2-2 libsasl2-modules-db libssh2-1t64 libtasn1-6 libunistring5 perl perl-modules-5.40 Suggested packages: gettext-base git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn gdbm-l10n gnutls-bin krb5-doc krb5-user sensible-utils perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libtap-harness-archive-perl Recommended packages: ca-certificates patch less ssh-client krb5-locales libldap-common publicsuffix libsasl2-modules netbase The following NEW packages will be installed: git git-man libbrotli1 libcom-err2 libcurl3t64-gnutls liberror-perl libexpat1 libffi8 libgdbm-compat4t64 libgdbm6t64 libgnutls30t64 libgssapi-krb5-2 libidn2-0 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap2 libnghttp2-14 libnghttp3-9 libngtcp2-16 libngtcp2-crypto-gnutls8 libp11-kit0 libperl5.40 libpsl5t64 librtmp1 libsasl2-2 libsasl2-modules-db libssh2-1t64 libtasn1-6 libunistring5 perl perl-modules-5.40 0 upgraded, 33 newly installed, 0 to remove and 0 not upgraded. Need to get 23.7 MB of archives. After this operation, 119 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian trixie/main amd64 libexpat1 amd64 2.7.1-2 [108 kB] Get:2 http://deb.debian.org/debian trixie/main amd64 perl-modules-5.40 all 5.40.1-6 [3019 kB] Get:3 http://deb.debian.org/debian trixie/main amd64 libgdbm6t64 amd64 1.24-2 [75.2 kB] Get:4 http://deb.debian.org/debian trixie/main amd64 libgdbm-compat4t64 amd64 1.24-2 [50.3 kB] Get:5 http://deb.debian.org/debian trixie/main amd64 libperl5.40 amd64 5.40.1-6 [4341 kB] Get:6 http://deb.debian.org/debian trixie/main amd64 perl amd64 5.40.1-6 [267 kB] Get:7 http://deb.debian.org/debian trixie/main amd64 libbrotli1 amd64 1.1.0-2+b7 [307 kB] Get:8 http://deb.debian.org/debian trixie/main amd64 libunistring5 amd64 1.3-2 [477 kB] Get:9 http://deb.debian.org/debian trixie/main amd64 libidn2-0 amd64 2.3.8-2 [109 kB] Get:10 http://deb.debian.org/debian trixie/main amd64 libffi8 amd64 3.4.8-2 [24.1 kB] Get:11 http://deb.debian.org/debian trixie/main amd64 libp11-kit0 amd64 0.25.5-3 [425 kB] Get:12 http://deb.debian.org/debian trixie/main amd64 libtasn1-6 amd64 4.20.0-2 [49.9 kB] Get:13 http://deb.debian.org/debian-security trixie-security/main amd64 libgnutls30t64 amd64 3.8.9-3+deb13u4 [1469 kB] Get:14 http://deb.debian.org/debian-security trixie-security/main amd64 libkrb5support0 amd64 1.21.3-5+deb13u1 [33.1 kB] Get:15 http://deb.debian.org/debian trixie/main amd64 libcom-err2 amd64 1.47.2-3+b11 [25.0 kB] Get:16 http://deb.debian.org/debian-security trixie-security/main amd64 libk5crypto3 amd64 1.21.3-5+deb13u1 [81.2 kB] Get:17 http://deb.debian.org/debian trixie/main amd64 libkeyutils1 amd64 1.6.3-6 [9456 B] Get:18 http://deb.debian.org/debian-security trixie-security/main amd64 libkrb5-3 amd64 1.21.3-5+deb13u1 [326 kB] Get:19 http://deb.debian.org/debian-security trixie-security/main amd64 libgssapi-krb5-2 amd64 1.21.3-5+deb13u1 [138 kB] Get:20 http://deb.debian.org/debian trixie/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-9 [19.8 kB] Get:21 http://deb.debian.org/debian trixie/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-9 [57.5 kB] Get:22 http://deb.debian.org/debian trixie/main amd64 libldap2 amd64 2.6.10+dfsg-1 [194 kB] Get:23 http://deb.debian.org/debian-security trixie-security/main amd64 libnghttp2-14 amd64 1.64.0-1.1+deb13u1 [76.2 kB] Get:24 http://deb.debian.org/debian trixie/main amd64 libnghttp3-9 amd64 1.8.0-1 [67.7 kB] Get:25 http://deb.debian.org/debian trixie/main amd64 libngtcp2-16 amd64 1.11.0-1+deb13u1 [132 kB] Get:26 http://deb.debian.org/debian trixie/main amd64 libngtcp2-crypto-gnutls8 amd64 1.11.0-1+deb13u1 [29.5 kB] Get:27 http://deb.debian.org/debian trixie/main amd64 libpsl5t64 amd64 0.21.2-1.1+b1 [57.2 kB] Get:28 http://deb.debian.org/debian trixie/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b5 [58.8 kB] Get:29 http://deb.debian.org/debian trixie/main amd64 libssh2-1t64 amd64 1.11.1-1 [245 kB] Get:30 http://deb.debian.org/debian trixie/main amd64 libcurl3t64-gnutls amd64 8.14.1-2+deb13u3 [384 kB] Get:31 http://deb.debian.org/debian trixie/main amd64 liberror-perl all 0.17030-1 [26.9 kB] Get:32 http://deb.debian.org/debian trixie/main amd64 git-man all 1:2.47.3-0+deb13u1 [2205 kB] Get:33 http://deb.debian.org/debian trixie/main amd64 git amd64 1:2.47.3-0+deb13u1 [8862 kB] debconf: unable to initialize frontend: Dialog debconf: (TERM is not set, so the dialog frontend is not usable.) debconf: falling back to frontend: Readline debconf: unable to initialize frontend: Readline debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC entries checked: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.40.1 /usr/local/share/perl/5.40.1 /usr/lib/x86_64-linux-gnu/perl5/5.40 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.40 /usr/share/perl/5.40 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 8, line 33.) debconf: falling back to frontend: Teletype debconf: unable to initialize frontend: Teletype debconf: (This frontend requires a controlling tty.) debconf: falling back to frontend: Noninteractive Fetched 23.7 MB in 0s (264 MB/s) Selecting previously unselected package libexpat1:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 5024 files and directories currently installed.) Preparing to unpack .../00-libexpat1_2.7.1-2_amd64.deb ... Unpacking libexpat1:amd64 (2.7.1-2) ... Selecting previously unselected package perl-modules-5.40. Preparing to unpack .../01-perl-modules-5.40_5.40.1-6_all.deb ... Unpacking perl-modules-5.40 (5.40.1-6) ... Selecting previously unselected package libgdbm6t64:amd64. Preparing to unpack .../02-libgdbm6t64_1.24-2_amd64.deb ... Unpacking libgdbm6t64:amd64 (1.24-2) ... Selecting previously unselected package libgdbm-compat4t64:amd64. Preparing to unpack .../03-libgdbm-compat4t64_1.24-2_amd64.deb ... Unpacking libgdbm-compat4t64:amd64 (1.24-2) ... Selecting previously unselected package libperl5.40:amd64. Preparing to unpack .../04-libperl5.40_5.40.1-6_amd64.deb ... Unpacking libperl5.40:amd64 (5.40.1-6) ... Selecting previously unselected package perl. Preparing to unpack .../05-perl_5.40.1-6_amd64.deb ... Unpacking perl (5.40.1-6) ... Selecting previously unselected package libbrotli1:amd64. Preparing to unpack .../06-libbrotli1_1.1.0-2+b7_amd64.deb ... Unpacking libbrotli1:amd64 (1.1.0-2+b7) ... Selecting previously unselected package libunistring5:amd64. Preparing to unpack .../07-libunistring5_1.3-2_amd64.deb ... Unpacking libunistring5:amd64 (1.3-2) ... Selecting previously unselected package libidn2-0:amd64. Preparing to unpack .../08-libidn2-0_2.3.8-2_amd64.deb ... Unpacking libidn2-0:amd64 (2.3.8-2) ... Selecting previously unselected package libffi8:amd64. Preparing to unpack .../09-libffi8_3.4.8-2_amd64.deb ... Unpacking libffi8:amd64 (3.4.8-2) ... Selecting previously unselected package libp11-kit0:amd64. Preparing to unpack .../10-libp11-kit0_0.25.5-3_amd64.deb ... Unpacking libp11-kit0:amd64 (0.25.5-3) ... Selecting previously unselected package libtasn1-6:amd64. Preparing to unpack .../11-libtasn1-6_4.20.0-2_amd64.deb ... Unpacking libtasn1-6:amd64 (4.20.0-2) ... Selecting previously unselected package libgnutls30t64:amd64. Preparing to unpack .../12-libgnutls30t64_3.8.9-3+deb13u4_amd64.deb ... Unpacking libgnutls30t64:amd64 (3.8.9-3+deb13u4) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../13-libkrb5support0_1.21.3-5+deb13u1_amd64.deb ... Unpacking libkrb5support0:amd64 (1.21.3-5+deb13u1) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../14-libcom-err2_1.47.2-3+b11_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.2-3+b11) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../15-libk5crypto3_1.21.3-5+deb13u1_amd64.deb ... Unpacking libk5crypto3:amd64 (1.21.3-5+deb13u1) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../16-libkeyutils1_1.6.3-6_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-6) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../17-libkrb5-3_1.21.3-5+deb13u1_amd64.deb ... Unpacking libkrb5-3:amd64 (1.21.3-5+deb13u1) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../18-libgssapi-krb5-2_1.21.3-5+deb13u1_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.21.3-5+deb13u1) ... Selecting previously unselected package libsasl2-modules-db:amd64. Preparing to unpack .../19-libsasl2-modules-db_2.1.28+dfsg1-9_amd64.deb ... Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ... Selecting previously unselected package libsasl2-2:amd64. Preparing to unpack .../20-libsasl2-2_2.1.28+dfsg1-9_amd64.deb ... Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-9) ... Selecting previously unselected package libldap2:amd64. Preparing to unpack .../21-libldap2_2.6.10+dfsg-1_amd64.deb ... Unpacking libldap2:amd64 (2.6.10+dfsg-1) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../22-libnghttp2-14_1.64.0-1.1+deb13u1_amd64.deb ... Unpacking libnghttp2-14:amd64 (1.64.0-1.1+deb13u1) ... Selecting previously unselected package libnghttp3-9:amd64. Preparing to unpack .../23-libnghttp3-9_1.8.0-1_amd64.deb ... Unpacking libnghttp3-9:amd64 (1.8.0-1) ... Selecting previously unselected package libngtcp2-16:amd64. Preparing to unpack .../24-libngtcp2-16_1.11.0-1+deb13u1_amd64.deb ... Unpacking libngtcp2-16:amd64 (1.11.0-1+deb13u1) ... Selecting previously unselected package libngtcp2-crypto-gnutls8:amd64. Preparing to unpack .../25-libngtcp2-crypto-gnutls8_1.11.0-1+deb13u1_amd64.deb ... Unpacking libngtcp2-crypto-gnutls8:amd64 (1.11.0-1+deb13u1) ... Selecting previously unselected package libpsl5t64:amd64. Preparing to unpack .../26-libpsl5t64_0.21.2-1.1+b1_amd64.deb ... Unpacking libpsl5t64:amd64 (0.21.2-1.1+b1) ... Selecting previously unselected package librtmp1:amd64. Preparing to unpack .../27-librtmp1_2.4+20151223.gitfa8646d.1-2+b5_amd64.deb ... Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ... Selecting previously unselected package libssh2-1t64:amd64. Preparing to unpack .../28-libssh2-1t64_1.11.1-1_amd64.deb ... Unpacking libssh2-1t64:amd64 (1.11.1-1) ... Selecting previously unselected package libcurl3t64-gnutls:amd64. Preparing to unpack .../29-libcurl3t64-gnutls_8.14.1-2+deb13u3_amd64.deb ... Unpacking libcurl3t64-gnutls:amd64 (8.14.1-2+deb13u3) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../30-liberror-perl_0.17030-1_all.deb ... Unpacking liberror-perl (0.17030-1) ... Selecting previously unselected package git-man. Preparing to unpack .../31-git-man_1%3a2.47.3-0+deb13u1_all.deb ... Unpacking git-man (1:2.47.3-0+deb13u1) ... Selecting previously unselected package git. Preparing to unpack .../32-git_1%3a2.47.3-0+deb13u1_amd64.deb ... Unpacking git (1:2.47.3-0+deb13u1) ... Setting up libexpat1:amd64 (2.7.1-2) ... Setting up libkeyutils1:amd64 (1.6.3-6) ... Setting up libgdbm6t64:amd64 (1.24-2) ... Setting up libgdbm-compat4t64:amd64 (1.24-2) ... Setting up libbrotli1:amd64 (1.1.0-2+b7) ... Setting up libnghttp2-14:amd64 (1.64.0-1.1+deb13u1) ... Setting up libcom-err2:amd64 (1.47.2-3+b11) ... Setting up libkrb5support0:amd64 (1.21.3-5+deb13u1) ... Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ... Setting up libunistring5:amd64 (1.3-2) ... Setting up libk5crypto3:amd64 (1.21.3-5+deb13u1) ... Setting up libsasl2-2:amd64 (2.1.28+dfsg1-9) ... Setting up libnghttp3-9:amd64 (1.8.0-1) ... Setting up libffi8:amd64 (3.4.8-2) ... Setting up perl-modules-5.40 (5.40.1-6) ... Setting up libtasn1-6:amd64 (4.20.0-2) ... Setting up git-man (1:2.47.3-0+deb13u1) ... Setting up libngtcp2-16:amd64 (1.11.0-1+deb13u1) ... Setting up libkrb5-3:amd64 (1.21.3-5+deb13u1) ... Setting up libssh2-1t64:amd64 (1.11.1-1) ... Setting up libldap2:amd64 (2.6.10+dfsg-1) ... Setting up libidn2-0:amd64 (2.3.8-2) ... Setting up libperl5.40:amd64 (5.40.1-6) ... Setting up perl (5.40.1-6) ... Setting up libp11-kit0:amd64 (0.25.5-3) ... Setting up libgssapi-krb5-2:amd64 (1.21.3-5+deb13u1) ... Setting up libgnutls30t64:amd64 (3.8.9-3+deb13u4) ... Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ... Setting up liberror-perl (0.17030-1) ... Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ... Setting up libngtcp2-crypto-gnutls8:amd64 (1.11.0-1+deb13u1) ... Setting up libcurl3t64-gnutls:amd64 (8.14.1-2+deb13u3) ... Setting up git (1:2.47.3-0+deb13u1) ... Processing triggers for libc-bin (2.41-12+deb13u3) ... npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. @commitlint/cli@19.8.1 - Lint your commit messages [input] reads from stdin if --edit, --env, --from and --to are omitted Options: -c, --color toggle colored output [boolean] [default: true] -g, --config path to the config file; result code 9 if config is missing [string] --print-config print resolved config [string] [choices: "", "text", "json"] -d, --cwd directory to execute in [string] [default: (Working Directory)] -e, --edit read last commit message from the specified file or fallbacks to ./.git/COMMIT_EDITMSG [string] -E, --env check message in the file at path given by environment variable value [string] -x, --extends array of shareable configurations to extend [array] -H, --help-url help url in error message [string] -f, --from lower end of the commit range to lint; applies if edit=false [string] --from-last-tag uses the last tag as the lower end of the commit range to lint; applies if edit=false and from is not set [boolean] --git-log-args additional git log arguments as space separated string, example '--first-parent --cherry-pick' [string] -l, --last just analyze the last commit; applies if edit=false [boolean] -o, --format output format of the results [string] -p, --parser-preset configuration preset to use for conventional-commits-parser [string] -q, --quiet toggle console output [boolean] [default: false] -t, --to upper end of the commit range to lint; applies if edit=false [string] -V, --verbose enable verbose output for reports without problems [boolean] -s, --strict enable strict mode; result code 2 for warnings, 3 for errors [boolean] --options path to a JSON file or Common.js module containing CLI options -v, --version display version information [boolean] -h, --help Show help [boolean] Unknown argument: merges Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-build-lint-errors Showing logs for build greencapitaltrade/fury/pr-2049 #7 stage from-build-pack and container step-build-npm-e2e npm warn config optional Use `--omit=optional` to exclude optional dependencies, or npm warn config `--include=optional` to include them. npm warn config npm warn config Default value does install optional deps unless otherwise omitted. npm warn Unknown user config "unsafe-perm". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. > fury@0.0.1 e2e > jest --passWithNoTests (node:69) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) PASS src/__tests__/payment-coins.test.ts (node:63) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) FAIL src/__tests__/execute-flow-step.e2e.test.ts ● feature-2017: executeFlowStep — schema surface › feature-2017: old document* mutations are marked @deprecated expect(received).toMatch(expected) Expected pattern: /documentCreditReportPut\([^)]*\):[^\n]*\n\s*@deprecated/m Received string: "scalar Date scalar JSON· type Image { original_url: String styles: String position: Int alt: String }· type BaseTaxon { id: Int! name: String! permalink: String! icon: Image }· type Taxon { name: String! id: Int! permalink: String! icon: Image breadcrumb: [BaseTaxon] siblings: [BaseTaxon] products( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] updated_at: String! }· type ProductVariant { id: Int! slug: String options: JSON price: String! compare_at_price: String images: [Image] updated_at: String! }· type Master { slug: String id: Int! images: [Image] emi: Float price: Float! compare_at_price: Float updated_at: String! }· type StockLocation { city: String state_name: String phone: String address1: String address2: String }· type Brand { id: Int! slug: String! name: String! updated_at: String! is_brand: Boolean! products( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] image: Image }· type Vendor { id: Int! slug: String! name: String! updated_at: String! stock_locations: [StockLocation] is_brand: Boolean! deals_in( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] image: Image }· type PropertyCategory { id: Int! name: String! position: Int! }· type ProductProperty { id: Int! value: String! filter_param: String! name: String! description: String! property_category: PropertyCategory }· type Product { id: Int! slug: String! name: String! vendor: Brand sellers: [Vendor] price: String! display_price: String! compare_at_price: String image: Image options: JSON description: String! variants: [ProductVariant] option_types: [String] primary_variant: Master! product_properties: [ProductProperty] models: [Product] parent: Product updated_at: String! images: [Image] }· type BaseProduct { id: Int! slug: String! name: String! vendor: Vendor vendors: [Vendor] price: String! display_price: String! compare_at_price: String image: Image options: JSON }· type LineItem { id: Int! quantity: Int! product: BaseProduct! price: String! total: String! }· type Country { id: Int! name: String! }· type State { id: Int! name: String! country: Country! }· type Address { id: Int! firstname: String lastname: String address1: String address2: String city: String! zipcode: String! phone: String! alternativePhone: String! company: String state: State! country: Country label: String }· type Promotion { id: Int! name: String coupon: String promoDiscount: String removable: Boolean }· type Cart { id: String! state: String! totalPrice: Float discount: Float finalPrice: Float line_items: [LineItem] address: Address promotions: [Promotion] }· type Banner { image: String key: String link: String }· type Operator { id: Int! name: String! category: String sort_order: Float picture_id: Int }· type Service { id: Int name: String code: String enabled: Boolean sort_order: Float picture_id: Int operators: [Operator] }· type Point { unlocked: Float locked: Float total: Float }· type RedeemRate { redeem_per: Int redeem_value: Int conversion_type: String }· type RedeemCoinsResult { success: Boolean! coins_redeemed: Int rupee_value: Float code: String }· input RedeemCoinsInput { entity_id: Int! entity_type: String! coins: Int! }· type IncreaseLimit { method: String config: JSON }· type ExternsionPlan { id: Int! percentage: Float price: Float days: Float }· type Billing { balance: Float bill: Float limit: Float endsAt: Float lastPayBy: Float extensionPlans: [ExternsionPlan] increaseLimit: IncreaseLimit }· type EmiSetting { rate: Float duration: Float min_requirement: Float }· type Param { service_number: String }· type TransactionHistorySubField { key: String params: Param }· type EmiDetail { amount: Float billable_at: String emi_seq: Float count: Float }· type paymentOperator { name: String picture_id: Int }· type SwapEnabledUntil { enabled_until: Int! }· type TransactionHistory { uuid: String amount: Float billable_at: Float category: String comments: TransactionHistorySubField description: TransactionHistorySubField emi_details: EmiDetail entity_id: String entity_type: String fee: Float is_emi_disabled: Boolean operator: paymentOperator status: String }· type UuidReturnType { giftcard: JSON shopping: JSON }· type PostType { id: Int name: String title: String content: String type: String image: String }· type Close { day: Float time: String }· type Open { day: Float time: String } type Period { close: Close open: Open }· type Hour { open_now: Boolean periods: [Period] weekday_text: [String] }· type Store { id: Int mcid: String post_id: Int name: String phone: String cft: String area: String city: String address: String lat: Float lng: Float type: String cuisine: String ac: Boolean alcohol: Boolean bakes: Boolean veg: Boolean takeaway: Boolean wifi: Boolean language: Float rating: Float website: String google_place_id: String google_place_photos: String postId: Int hours: Hour post: Post }· type StoreName { id: Int name: String title: String content: String type: String image: String mp_store: Store }· type Order { orders: [Cart] }· type StateAddress { id: Int name: String }· type AadharCaptcha { image: String sessionId: String }· type Reference { type: String address: String name: String knows: Boolean is_important: Boolean }· type Place { place: String }· type Company { name: String }· type CouponResponse { id: Int description: String code: String amount: Float percent: String expiry: Float }· type Promotiontype { coupons: [CouponResponse] }· type ReferrerType { id: Int name: String user_id: Int knows: String address: String }· type UtilityType { dispute: JSON number: String }· type GiftCardType { number: String pin: String validity: String }· type TransactionStatusType { uuid: String amount: Float billable_at: Float category: String comments: TransactionHistorySubField description: TransactionHistorySubField emi_details: EmiDetail entity_id: String entity_type: String fee: Float is_emi_disabled: Boolean operator: paymentOperator status: String giftcard: GiftCardType shopping: JSON utility: UtilityType }· type ServiceEntityType { amount: Float operator: Operator number: Float id: Int convenience_fee: Float }· type Me { aadhaar_captcha: AadharCaptcha points: Point redeemRate( entity_type: String! category: String! source: String! ): RedeemRate referrerCount: Float billing: Billing cart: Cart emi_settings: [EmiSetting] transaction_history( month: Float year: Float page: Float ): [TransactionHistory] transaction( entity_type: String entity_id: String uuid: String ): TransactionStatusType uuid(uuid: String): TransactionStatusType orders(id: Int, page: Float): Order addresses: [Address] newAddress: [StateAddress] references: [Reference] place: [Place] company: [Company] referrer: [ReferrerType] referrers: JSON recent_services(serviceCode: String, limit: Float): RecentServiceReturnType service(entity_id: Int, entity_type: String): ServiceEntityType gold_balance: String processing_fee: [ProcessingFee] }· type RechargeType { amount: Float operator: Operator number: Float id: Int }· type OutletType { outletId: Int storeName: String }· type RecentServiceReturnType { recharges: RechargeType outlet: OutletType }· type RoundingType { round_direction: String decimal_places: Float }· type GoldPriceType { current_price: Float applicable_tax: String rate_id: ID weight_rounding: RoundingType amount_rounding: RoundingType expires_at: Float }· type Gold { buy_price: GoldPriceType sell_price: GoldPriceType }· type Query { repayments: JSON taxons( featured: Boolean page: Int per_page: Int city: String state_id: Int ): [Taxon] taxon(slug: String, city: String, state_id: Int): Taxon product(slug: String, city: String, state_id: Int): Product products( page: Int per_page: Int filters: JSON city: String state_id: Int ): [Product] brand(slug: String, city: String): Brand brands( page: Int per_page: Int city: String state_id: Int filters: JSON ): [Brand] vendor(slug: String, city: String, state_id: Int): Vendor vendors( page: Int per_page: Int city: String state_id: Int filters: JSON ): [Vendor] banners: [Banner] services: [Service] gold: Gold recent_services(serviceCode: String, limit: Float): RecentServiceReturnType service(serviceCode: String): Service email_verify(code: String): String file(id: Int): Boolean # this is done for backward compatibility postss(count: Float, perPage: Float, page: Float): [PostType] stores( type: String city: String area: String perPage: Float page: Float ): [Store] storeName(name: String): StoreName me: Me promotions: Promotiontype· vehicles: [RiderProduct] clients(category_id: Int!): [RiderProduct] rentals(category_id: Int!): [RiderProduct] employee: Employee partner: Partner rider(id: Int!): Rider riders( page: Int search: String tl_id: Int sort_by: String sort_order: String ): Riders teams(location_id: Int, include_members: Boolean): [AssetTeam] team(id: Int!): AssetTeam· \"\"\" Resolve the user's default team — drives Flash's `/` → `/:team_id/` redirect. Honours `res.users.default_team_id` (admin override) and falls back to managed/member resolution. `null` when the user has zero team access. \"\"\" defaultTeam(companyId: Int): AssetTeam my_vehicles: Vehicles swapstations(lat: Float!, lng: Float!): SwapStations warehouses(lat: Float!, lng: Float!): [Warehouse] transaction_history(id: Int, page: Int): RiderTransactionHistory team_leads: TeamLeads· # Geofence queries geofences(active: Boolean, asset_id: Int): [AssetGeofence] geofence(id: ID!): AssetGeofence deviceGeofences(device_id: Int!): [AssetGeofence] checkGeofenceViolations( device_id: Int! latitude: Float! longitude: Float! ): [AssetGeofence] iotDevices(active: Boolean): [AssetIoTDevice] iotDevice(id: ID!): AssetIoTDevice assetIotTypes(companyId: Int): [AssetIoTType]· # IoT Control queries (read-only, execution via mutations) deviceControls(device_id: Int!): [IoTControl] assetControls(asset_id: Int!): AssetControls controlStatus(control_id: ID!): IoTControlStatus controlHistory(device_id: Int!, hours: Int, limit: Int): [IoTActionLog] }· # From here this will be for backward compatibility type AppState { banners: [Banner] services: [Service] points: Point referrerCount: Float billing: Billing cart: Cart }· type Document { email_verify(code: String): String aadhaar_captcha: AadharCaptcha references: [Reference] place: [Place] company: [Company] polling: UserJourney }· type Payment { emi_settings: EmiSetting transaction_history: TransactionHistory uuid(uuid: String): TransactionStatusType }· type Post { recent(count: Float, perPage: Float, page: Float): [PostType] stores( type: String city: String area: String perPage: Float page: Float ): [Store] storeName(name: String): StoreName }· type Shopping { categories(page: Float): [BaseTaxon] featured_categories: [Taxon] category(slug: String, page: Float): Taxon product(slug: String): Product ordersCompleted(id: Int, page: Float): Order cart: Cart addresses: [Address] addressesNew: [StateAddress] }· extend type Query { state: AppState documents: Document payments: Payment posts: Post shopping: Shopping previewAgreement: PreviewAgreement emandateStatus: EmandateStatusResponse # LSP onboarding: the org's loan products, proxied from Ironman and # org-scoped. Named `loanProducts` because `products` is the e-commerce # catalog (a different domain entirely). Ironman returns snake_case fields, # so Fury maps them to camelCase on the GraphQL surface. loanProducts: [LoanProduct!]!· # LSP journey status: current flow for the user's active application, # proxied from Destiny and mapped from snake_case to camelCase. applicationFlow: ApplicationFlow!· # Asset Control Tower assetControlTower(member_id: Int): AssetControlTower· # Asset Management Queries assets( asset_type: String view: String limit: Int offset: Int search: String companyId: Int # team_id wins over the x-gct-team-id header when both are present. # Needed for Flash's SSR path: React Server Components don't see the # browser URL, so the path-segment-based header isn't set on the # initial render, and Fury would otherwise fall back to every team # the user can see. Passing it as a real GraphQL variable means the # SSR + client requests are byte-identical, Apollo caches per team, # and switching teams refetches reliably. teamId: Int ): [Asset!]! asset(id: Int!, companyId: Int): Asset assetDashboardSummary(companyId: Int): DashboardSummary assetCompanyFeatures(companyId: Int): AssetCompanyFeatures assetMenu: [AssetMenuItem!]! assetModules: [AssetCompanyModules!]! assetFieldOptions: AssetFieldOptions!· # Member Management memberRiders( member_id: Int! page: Int per_page: Int include_idle: Boolean include_due: Boolean ): MemberRiders memberAssets( member_id: Int! page: Int per_page: Int include_idle: Boolean ): MemberAssets· # Petty Cash Management pettyCash(id: ID!): PettyCash pettyCashList( member_id: Int team_id: Int state: PettyCashState expense_type: PettyCashExpenseType from_date: String to_date: String page: Int per_page: Int ): PettyCashList· # Team Configuration teamConfiguration(team_id: Int!): TeamConfiguration teamConfigurations( percolate_roles: Boolean petty_cash_enabled: Boolean ): [TeamConfiguration!]· # Asset Roles assetRoles(can_approve_petty_cash: Boolean): [AssetRole!]· # Asset Location History assetLocationHistory( assetId: Int! start_time: String end_time: String iot_device_ids: [String] limit: Int ): AssetLocationHistoryResponse· # Business Operations Queries assetAlertConfigurations( asset_id: Int alert_type: AlertType companyId: Int ): [AlertConfiguration!]! # Real alert events recorded against an asset (from asset.iot.alert in # Bifrost). Distinct from assetAlertConfigurations which describes # *thresholds*; this returns individual occurrences with timestamp, # severity, message, and ack status. assetAlerts( asset_id: Int! limit: Int offset: Int companyId: Int ): [AssetAlert!]! geofenceAreas( asset_id: Int enabled: Boolean # Optional team filter. NULL/omitted returns the union of # company-wide zones + zones scoped to any team the user can see. # Setting it narrows to zones with that exact team_id. team_id: Int companyId: Int ): [AssetGeofence!]! deviceCommands( device_id: Int! status: CommandStatus limit: Int offset: Int companyId: Int ): [AssetCommand!]! businessModelConfigs( model_type: BusinessModelType companyId: Int ): [BusinessModelConfig!]! maintenanceTriggers( asset_id: Int trigger_type: TriggerType enabled: Boolean limit: Int offset: Int companyId: Int ): [MaintenanceTrigger!]! scheduledMaintenance( asset_id: Int status: MaintenanceStatus limit: Int offset: Int companyId: Int ): [ScheduledMaintenance!]!· # Asset Report Queries assetReports( report_type: String start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetReport!]!· assetReportMetrics( start_date: String end_date: String asset_ids: [Int] companyId: Int ): AssetReportMetrics!· assetItemReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetItemReport!]!· assetDriverReports( driver_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetDriverReport!]!· assetExpenseReports( category: String start_date: String end_date: String asset_ids: [Int] companyId: Int ): [AssetExpenseReport!]!· assetAlertReports( alert_type: String severity: String start_date: String end_date: String asset_ids: [Int] companyId: Int ): [AssetAlertReport!]!· assetMaintenanceReports( asset_ids: [Int] maintenance_type: String status: String limit: Int offset: Int companyId: Int ): [AssetMaintenanceReport!]!· # Traccar-style per-event reports assetTripReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetTripReport!]!· assetStopReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetStopReport!]!· assetEventReports( asset_ids: [Int] start_date: String end_date: String event_types: [String] limit: Int offset: Int companyId: Int ): [AssetEventReport!]!· # ============================================ # ASSET OPERATIONS QUERIES # ============================================· # Asset Locations assetLocations( location_type: AssetLocationType search: String active: Boolean limit: Int offset: Int companyId: Int ): [AssetLocationFull!]!· assetLocation(id: Int!, companyId: Int): AssetLocationFull· # Asset Trips assetTrips( asset_id: Int driver_id: Int state: AssetTripState start_location_id: Int end_location_id: Int date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetTrip!]!· assetTrip(id: Int!, companyId: Int): AssetTrip· # Delivery Challans assetDeliveryChallans( asset_id: Int driver_id: Int trip_id: Int state: AssetChallanState origin_location_id: Int destination_location_id: Int date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetDeliveryChallan!]!· assetDeliveryChallan(id: Int!, companyId: Int): AssetDeliveryChallan· # Gatepasses assetGatepasses( asset_id: Int driver_id: Int gate_id: Int state: AssetGatepassState pass_type: AssetGatepassType date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetGatepass!]!· assetGatepass(id: Int!, companyId: Int): AssetGatepass· # Gates assetGates(location_id: Int, active: Boolean, companyId: Int): [AssetGate!]!· # Traffic Violations assetTrafficViolations( asset_id: Int driver_id: Int state: AssetViolationState violation_type: String date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetTrafficViolation!]!· assetTrafficViolation(id: Int!, companyId: Int): AssetTrafficViolation· # Asset Operations Dashboard assetOpsDashboard(companyId: Int): AssetOpsDashboardSummary!· # Asset Type Queries assetTypes: [AssetType!]! assetType(id: Int!): AssetType }· input DeviceCreateDatainput { token: String }· input EmailInput { email: String }· input EmailVerifyInput { serverToken: String }· input InstalledAppInput { apps: [JSON] }· input PersonalDataInput { income_type: String! fathers_name: String! education: String! company_type: String! company_name: String! work_experience: Float! residence: String! income_range: Float! marital_status: String! kids: String! }· input PanInput { value: String check: Boolean! }· input AadhaarOtpInput { aadhaar: String }· input AadhaarXmlInput { sessionId: String otp: String }· input ReferencesInput { name: String! phones: [String]! emails: [String]! photo: String! knows: String! }· input CreditReportCreateInput { dateOfBirth: Date! gender: String! flatno: String! city: String! state: String! pincode: String! }· input PurposePaymentInput { purpose: String amount: Float }· input AgreementInput { signType: String }· input EmandateCreateInput { amount: Int! mandateType: String! vpa: String accountNumber: String ifsc: String name: String }· type AadhaarOtp { sessionId: String referenceId: String code: String }· type PaymentOrder { uuid: String url: String code: String }· type ProcessingFee { id: Int price: Float popular: Boolean cashbackAmount: Float }· type Error { code: String }· type UserJourney { status: String product: String status_data: JSON screen: String url: String code: String }· type Application { id: Int status: String product_id: Int }· input PaymentConvenienceFeeInput { entity_type: String outlet_id: Int amount: Float }· input PaymentEmiProcessingFeeInput { amount: Float }· input PaymentInput { amount: Float password: String entity_id: Int entity_type: String comment: String emi_duration: Float order_id: String coins_to_redeem: Int }· input paymentUuidUpdateInput { emi_duration: Float uuid: String }· input paymentRaiseDisputeInput { entityType: String entityId: String entityID: String }· type PaymentConvenienceFeeReturnType { convenienceFee: Float code: String }· type PaymentEmiProcessingFeeReturnType { emi_processing_fee: Float code: String }· type PaymentType { uuid: String id: Int billing: Billing url: String code: String }· type PaymentRaiseDisputeType { status: String reference_id: Int msg: String }· type GiftCard { id: Int amount: Float code: String }· type Pincode { id: Int pincode: String state_id: Int city: String }· type UserResetPasswordCreateReturnData { pan_required: Boolean }· type Coupon { cart: Cart coupon: String message: String }· input GiftCardCreateInput { amount: Float operator_id: Int }· input repaymentCreateInput { extension_plan_entry_id: Int amount: Float }· input SessionCreateDataInput { phone: String email: String password: String rememberMe: Boolean }· input SessionPutDataInput { phone: String otp: String rememberMe: Boolean }· input SessionDeleteInput { token: String }· input PartnerVerifiedUserInput { phone: String! email: String! }· type PartnerVerifiedUserResponse { token: String code: String }· input SetPasswordInput { password: String confirmPassword: String }· input ResetPasswordCreateInput { password: String confirmPassword: String }· input ResetPasswordPutInput { emailOtp: String mobileOtp: String pan: String }· input AddtoCartInput { variant_id: Int }· input BuyNowInput { variant_id: Int quantity: Float }· input UpdateQuantityInput { line_item_id: Int quantity: Float }· input SetAddressInput { address_id: Int }· input PincodeInput { pincode: String }· input CouponInput { coupon: String }· input AddressInput { firstname: String lastname: String address1: String address2: String city: String zipcode: String phone: String alternative_phone: String company: String state_id: Int }· type repaymentCreateReturnData { uuid: String url: String }· input ServiceCreateInput { amount: Float operator_id: Int serviceCode: String special: Boolean service_number: String }· input GoldInput { amount: Float weight: Float rate_id: ID transaction_type: String current_price: Float applicable_tax: Float }· type ServiceCreateReturn { id: Int amount: Float }· type SessionPutReturnType { code: String token: String status: String product: String status_data: JSON screen: String url: String }· type SessionCreateResponse { success: Boolean! messageKey: String! status: String token: String waitTime: Int }· type GoldCreateType { id: Int status: String }· type AgreementDetail { url: String code: String }· type PreviewAgreement { html: String code: String }· type EmandateResult { id: ID digioMandateId: String status: String url: String code: String }· # executeFlowStep — unified loan origination step execution (greencapitaltrade/fury#2017) enum FlowStepType { KYC BANK_STATEMENT CREDIT_CHECK AGREEMENT EMANDATE }· enum FlowStepKind { DIGILOCKER AADHAAR_OTP AADHAAR_XML PAN PAN_AADHAAR_LINK PERSONAL BUREAU DIGIO AA }· enum StepErrorCode { VALIDATION_FAILED INVALID_TYPE_KIND STEP_NOT_PERMITTED PROVIDER_DECLINED RATE_LIMITED IN_PROGRESS }· type StepFieldError { field: String code: StepErrorCode! message: String! }· type StepError { code: StepErrorCode! message: String! retryable: Boolean! details: [StepFieldError!] }· type DigilockerDocument { type: String! required: Boolean! }· type DigilockerKyc { gatewayUrl: String! kycRequestId: String! documents: [DigilockerDocument!] code: String }· union FlowStepResult = | UserJourney | AadhaarOtp | DigilockerKyc | AgreementDetail | EmandateResult | StepError· type EmandateStatusResponse { digioMandateId: String status: String active: Boolean umrn: String authType: String code: String }· # A loan product owned by Ironman (GET /v1/products), org-scoped. The LSP # passes the chosen `id` as product_id to applicationCreate. type LoanProduct { id: ID! name: String! code: String organizationId: Int active: Boolean createdAt: String updatedAt: String }· # A single step inside an application's flow. type ApplicationFlowStep { nodeId: String! stepType: String! status: String! attempts: Int! startedAt: String completedAt: String result: JSON }· # The current flow state for a user's active application. type ApplicationFlow { flowId: Int! steps: [ApplicationFlowStep!]! active: [String!]! completed: Int! total: Int! }· type VerifyEmailResult { success: Boolean! message: String }· type RiderProduct { id: Int! name: String! price: Float! defaultCode: String! categoryId: Int! description: String! }· type Employee { id: Int! name: String avatar_128: String avatar1920: String isTl: Boolean is_tl: Boolean role: String wallet: Float dueAmount: Float due_amount: Float credit: Float credit_limit: Float vehicle: String }· type Partner { id: Int! name: String email: String mobile: String # Financial - for rider dues credit: Float credit_limit: Float # Company company_id: Int # Role derived from Odoo groups role: String # Asset Team team: AssetTeam # Display avatar_128: String \"\"\" Alias of `avatar_128` for the team-member shape used in Flash. Null when the upstream `asset.team` API doesn't include partner images (gated by `asset_rider_management` today). \"\"\" avatar: String \"\"\" `\"active\"` / `\"inactive\"` — derived from `res.partner.active`. Null when the upstream API doesn't include the flag. \"\"\" status: String }· type AssetTeam { id: ID! name: String manager: Partner location: TeamLocation member_count: Int parent_team_id: Int members: [Partner] child_teams: [AssetTeam] }· type TeamLocation { id: Int! name: String }· type AssetIoTDevice { id: ID! name: String! device_id: String! device_type: String iot_type_code: String iot_type_name: String device_category: String primary: Boolean active: Boolean status: String connection_status: String last_communication: String asset_id: Int asset_name: String last_latitude: Float last_longitude: Float last_update: String geofences: [AssetGeofence] }· # ─── Asset Type Management ─────────────────────────────────────────· type AssetType { id: Int! name: String! code: String icon: String sequence: Int active: Boolean color: Int description: String assetCount: Int }· input CreateAssetTypeInput { name: String! code: String icon: String sequence: Int color: Int description: String }· input UpdateAssetTypeInput { name: String code: String icon: String sequence: Int active: Boolean color: Int description: String }· type AssetIoTTypeFeatures { gps: Boolean acceleration: Boolean ble: Boolean fuel: Boolean can: Boolean sos: Boolean buzzer: Boolean theft_alarm: Boolean immobilize: Boolean wheel_lock: Boolean remote_control: Boolean gsm: Boolean }· type AssetIoTCommandParamOption { label: String! value: String! }· type AssetIoTCommandParam { name: String! type: String! label: String! default: String min: Float max: Float options: [AssetIoTCommandParamOption] }· type AssetIoTCommand { id: String! name: String! description: String parameters: [AssetIoTCommandParam] warning: String }· type AssetIoTType { id: ID! name: String! code: String! description: String device_category: String manufacturer: String data_format: String default_reporting_interval: Int primary_metric_field: String device_count: Int active: Boolean features: AssetIoTTypeFeatures commands: [AssetIoTCommand] }· type TeamManager { id: Int! name: String }· type Rider { id: Int! work_contact_id: Int! name: String! phone: String! email: String! equipment_ids: [Int] credit: Float due_amount: Float! days_since_due: Int! wallet: Float avatar_128: String vehicle: String credit_limit: Float contract: String }· type RiderList { id: Int! work_contact_id: Int! credit: Float due_amount: Float! days_since_due: Int! wallet: Float phone: String! name: String! avatar_128: String vehicle: String # TL information (only for Super TLs) tl_id: Int tl_name: String }· type Riders { riders: [RiderList]! pages: Int! total: Int! }· type RiderTransactionHistoryItem { id: Int! date: Int! amount: [Float]! quantity: [Float]! name: [String]! }· type RiderTransactionHistory { transactions: [RiderTransactionHistoryItem]! pages: Int! }· type TeamLead { id: Int name: String! count: Int! }· type TeamLeads { team_leads: [TeamLead]! }· type Vehicle { employee_id: Int! assign_date: String serial_no: String! }· type Vehicles { vehicles: [Vehicle]! pages: Int! }· type SwapStation { name: String! lat: Float! lng: Float! distance: Float }· type SwapStations { stations: [SwapStation]! }· type Warehouse { id: Int! name: String! street: String street2: String city: String pincode: String partner_latitude: Float! partner_longitude: Float! avatar_128: String equipment_count: Float! distance: Float! }· type Warehouses { warehouses: [Warehouse]! }· input BankAccount { name: String! ifsc: String! number: String! }· input RiderInput { id: Int! pan: String! aadhaar: String! otp: String! referenceId: String! bank: BankAccount }· type AssetGeofence { id: ID! name: String! description: String geofence_type: GeofenceType! # Circular geofence fields center_latitude: Float center_longitude: Float radius_meters: Float # Rectangular geofence fields north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # Polygon geofence fields polygon_coordinates: [[Float]] # Rules and configuration rule_type: GeofenceRule! speed_limit_kmh: Float active: Boolean! start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Day restrictions monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority! send_email_alerts: Boolean send_sms_alerts: Boolean # IoT device assignment iot_devices: [AssetIoTDevice] apply_to_all_devices: Boolean # Asset assignment — the Many2many the zone applies to. Use this # for \"X assets covered\" counts and the per-zone asset-picker UX; # zones can target multiple assets at once. Empty array when the # zone isn't bound to any specific asset. asset_ids: [Int!] asset_count: Int # Optional team scope. NULL = company-wide zone (every user in the # tenant sees it). Set = belongs to that team's curated library. # `team_name` is a denormalised display convenience so list views # don't have to round-trip through AssetTeam. team_id: Int team_name: String # Statistics total_entries: Int total_exits: Int total_violations: Int last_violation: String }· enum GeofenceType { circular rectangular polygon }· enum GeofenceRule { entry exit both restricted speed_limit }· enum AlertPriority { low medium high critical }· input GeofenceInput { name: String! description: String geofence_type: GeofenceType! # For circular center_latitude: Float center_longitude: Float radius_meters: Float # For rectangular north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # For polygon polygon_coordinates: [[Float]] # Rules rule_type: GeofenceRule! speed_limit_kmh: Float active: Boolean start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Days monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority send_email_alerts: Boolean send_sms_alerts: Boolean # IoT devices device_ids: [Int] apply_to_all_devices: Boolean # Multi-asset assignment — replaces the whole list on update. # Pass an empty array to unassign the zone from all assets. asset_ids: [Int] # Optional team scope. NULL = company-wide. The team must belong # to the same company as the geofence (Bifrost enforces this with # an @api.constrains). team_id: Int }· # Partial-update input for updateGeofenceArea. Same fields as # GeofenceInput but every one is optional, so a client that only wants # to toggle `active` or push a new asset_ids list doesn't have to # resend name + geofence_type + rule_type. (Originally landed via # fury#1955; the type definition was lost in a subsequent merge while # the mutation's `data: GeofenceUpdateInput!` reference survived. # Restored here.) input GeofenceUpdateInput { name: String description: String geofence_type: GeofenceType # For circular center_latitude: Float center_longitude: Float radius_meters: Float # For rectangular north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # For polygon polygon_coordinates: [[Float]] # Rules rule_type: GeofenceRule speed_limit_kmh: Float active: Boolean start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Days monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority send_email_alerts: Boolean send_sms_alerts: Boolean # IoT devices device_ids: [Int] apply_to_all_devices: Boolean # Multi-asset assignment — replaces the whole list on update. # Pass an empty array to unassign the zone from all assets. asset_ids: [Int] # Optional team scope. NULL = company-wide. team_id: Int }· # IoT Control Types enum ControlType { switch relay fet pwm servo analog digital custom }· enum ControlState { unknown on off error busy }· enum ActionType { enable disable set_value query_status reset configure custom }· enum TriggerType { manual scheduled alert condition api system }· type IoTControl { id: ID! name: String! control_type: ControlType! device: AssetIoTDevice! current_state: ControlState target_state: ControlState current_value: Float target_value: Float min_value: Float max_value: Float enabled: Boolean requires_confirmation: Boolean critical: Boolean description: String last_action_date: String success_rate: Float ready: Boolean next_available: String }· type IoTControlStatus { control_id: ID! name: String! type: ControlType! state: ControlState! value: Float ready: Boolean enabled: Boolean success_rate: Float last_action: String next_available: String requires_confirmation: Boolean critical: Boolean }· type IoTActionLog { id: ID! display_name: String! control: IoTControl device: AssetIoTDevice action_type: ActionType! parameters: JSON result: JSON success: Boolean action_date: String! response_date: String execution_time: Float acknowledgment_received: Boolean acknowledgment_date: String trigger_type: TriggerType! trigger_source: String user: User error_message: String status: String }· type ControlExecutionResult { success: Boolean! control_id: ID device_id: ID action_type: ActionType result: JSON requires_confirmation: Boolean message: String control_name: String }· type AssetControls { asset_id: ID! devices: [DeviceControls!]! }· type DeviceControls { device_name: String! device_id: String! controls: [IoTControl!]! }· input ControlExecutionInput { action_type: ActionType parameters: JSON confirmed: Boolean value: Float }· input PettyCashInput { member_id: Int! date: String! amount: Float! expense_type: PettyCashExpenseType! description: String! receipt_number: String asset_id: Int }· input TeamConfigurationInput { percolate_roles: Boolean percolated_role_ids: [Int!] petty_cash_enabled: Boolean petty_cash_allowed_role_ids: [Int!] petty_cash_limits: JSON petty_cash_approval_required: Boolean petty_cash_approver_ids: [Int!] }· # Asset Control Tower Types type AssetControlTower { id: ID! company_id: Int! total_vehicles: Int! active_vehicles: Int! idle_vehicles: Int! overdue_riders: Int! maintenance_due: Int! documents_expiring: Int! pending_assignments: Int! total_revenue_today: Float! total_expenses_today: Float! alerts_count: Int! kpi_data: JSON last_updated: String! }· # Member Management Types type MemberRider { id: ID! name: String! employee_code: String asset_id: Int vehicle_serial: String idle: Boolean! idle_duration_minutes: Int rental_due_date: String days_until_due: Int outstanding_amount: Float last_payment_date: String status: String! }· type MemberAsset { id: ID! serial_no: String! make: String model: String registration_number: String driver_id: Int driver_name: String idle: Boolean! idle_duration_minutes: Int last_movement_time: String location: AssetMapLocation fuel_level: Float maintenance_due_date: String documents_expiring: Int }· type AssetMapLocation { latitude: Float! longitude: Float! address: String timestamp: String! }· # Petty Cash Types type PettyCash { id: ID! reference: String! member_id: Int! member_name: String! team_id: Int team_name: String date: String! amount: Float! expense_type: PettyCashExpenseType! description: String! receipt_number: String asset_id: Int vehicle_serial: String state: PettyCashState! approved_by: String approved_date: String rejection_reason: String reimbursed_by: String reimbursement_date: String attachments_count: Int over_limit: Boolean daily_total: Float monthly_total: Float }· enum PettyCashExpenseType { fuel parking toll maintenance meals accommodation office_supplies vehicle_cleaning emergency other }· enum PettyCashState { draft submitted approved rejected reimbursed cancelled }· type PettyCashSummary { total_amount: Float! pending_approvals: Int! approved_amount: Float! rejected_count: Int! monthly_limit: Float monthly_spent: Float! by_type: JSON }· # Team Configuration Types type TeamConfiguration { id: ID! team_id: Int! team_name: String! percolate_roles: Boolean! percolated_roles: [AssetRole!] petty_cash_enabled: Boolean! petty_cash_allowed_roles: [AssetRole!] petty_cash_limits: JSON petty_cash_approval_required: Boolean! petty_cash_approvers: [String!] }· type AssetRole { id: ID! name: String! code: String! permissions: [String!] can_approve_petty_cash: Boolean can_manage_teams: Boolean can_view_control_tower: Boolean }· # Pagination Types type MemberRiders { riders: [MemberRider!]! total: Int! idle_count: Int! due_count: Int! page: Int! pages: Int! }· type MemberAssets { vehicles: [MemberAsset!]! total: Int! idle_count: Int! maintenance_due_count: Int! page: Int! pages: Int! }· type PettyCashList { items: [PettyCash!]! total: Int! summary: PettyCashSummary! page: Int! pages: Int! }· type Mutation { enableSwap(selfie: String!): SwapEnabledUntil makePayment(amount: Float!, rider_id: Int): PaymentOrder makePaymentForPlan( asset_id: Int! client_id: Int! plan_id: Int! ): PaymentOrder aadhaarOtp(aadhaar: String!): AadhaarOtp assignVehicle(id: Int!, companyId: Int): JSON unassignVehicle(id: Int!, companyId: Int): JSON· # Geofence mutations live further down as the *GeofenceArea trio # (with non-null returns). An older unsuffixed set used to live # here with no resolver wiring — every call silently returned null. # They were removed to avoid the misleading surface. assignDevicesToGeofence( geofence_id: ID! device_ids: [Int]! companyId: Int ): AssetGeofence checkDeviceInGeofence( device_id: Int! latitude: Float! longitude: Float! companyId: Int ): Boolean· # IoT Control mutations (fleet_management_manager+ role required) executeControl( control_id: ID! data: ControlExecutionInput! companyId: Int ): ControlExecutionResult enableControl( control_id: ID! confirmed: Boolean companyId: Int ): ControlExecutionResult disableControl( control_id: ID! confirmed: Boolean companyId: Int ): ControlExecutionResult setControlValue( control_id: ID! value: Float! companyId: Int ): ControlExecutionResult queryControlStatus(control_id: ID!, companyId: Int): IoTControlStatus· # Petty Cash mutations createPettyCash(data: PettyCashInput!): PettyCash updatePettyCash(id: ID!, data: PettyCashInput!): PettyCash submitPettyCash(id: ID!): PettyCash approvePettyCash(id: ID!): PettyCash rejectPettyCash(id: ID!, reason: String!): PettyCash reimbursePettyCash(id: ID!, reference: String): PettyCash cancelPettyCash(id: ID!): PettyCash· # Team Configuration mutations updateTeamConfiguration( team_id: Int! data: TeamConfigurationInput! ): TeamConfiguration applyTeamRolePercolation(team_id: Int!): Boolean enablePettyCashForTeam(team_id: Int!, role_ids: [Int!]!): TeamConfiguration· # Team management mutations createTeam(name: String!): AssetTeam addTeamMember( team_id: Int! name: String! email: String! phone: String role: String! ): Partner updateTeamMember( id: Int! name: String email: String phone: String role: String ): Partner removeTeamMember(id: Int!, team_id: Int!): DeleteResponse!· CreateDevice(data: DeviceCreateDatainput): JSON applicationCreate(product_id: Int!): Application applicationProductSet(product_id: Int!): Application documentInstalledApps(data: InstalledAppInput): JSON documentEmail(data: EmailInput): UserJourney documentVerifyGmail(data: EmailVerifyInput): UserJourney documentPersonal(data: PersonalDataInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentPanCreate(data: PanInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentAadhaarOtp(data: AadhaarOtpInput): AadhaarOtp @deprecated(reason: \"use executeFlowStep(type, kind)\") documentAadhaarXml(data: AadhaarXmlInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentReferences(data: ReferencesInput): UserJourney documentCreditReportCreate(data: CreditReportCreateInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentCreditReportPut: UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentPurposePayment(data: PurposePaymentInput): PaymentOrder documentAgreement(data: AgreementInput): AgreementDetail @deprecated(reason: \"use executeFlowStep(type, kind)\") emandateCreate(data: EmandateCreateInput!): EmandateResult @deprecated(reason: \"use executeFlowStep(type, kind)\") executeFlowStep( applicationId: ID! type: FlowStepType! kind: FlowStepKind! data: JSON ): FlowStepResult! verifyEmail(token: String!): VerifyEmailResult referrers: JSON paymentConvenienceFee( data: PaymentConvenienceFeeInput ): PaymentConvenienceFeeReturnType paymentEmiProcessingFee( data: PaymentEmiProcessingFeeInput ): PaymentEmiProcessingFeeReturnType payment(data: PaymentInput): PaymentType redeemCoins(data: RedeemCoinsInput!): RedeemCoinsResult paymentUuidUpdate(data: paymentUuidUpdateInput): PaymentType paymentRaiseDispute(data: paymentRaiseDisputeInput): PaymentRaiseDisputeType giftcardCreate(data: GiftCardCreateInput): Boolean repaymentCreate(data: repaymentCreateInput): repaymentCreateReturnData sessionCreate(data: SessionCreateDataInput): Boolean sessionCreateV2(data: SessionCreateDataInput): SessionCreateResponse sessionPut(data: SessionPutDataInput): SessionPutReturnType sessionDelete(data: SessionDeleteInput): JSON partnerVerifiedUser( data: PartnerVerifiedUserInput! ): PartnerVerifiedUserResponse UserSetPassword(data: SetPasswordInput): UserJourney UserResetPasswordCreate( data: ResetPasswordCreateInput ): UserResetPasswordCreateReturnData UserResetPasswordPut(data: ResetPasswordPutInput): JSON addToCart(data: AddtoCartInput): Cart updateQuantity(data: UpdateQuantityInput): Cart setAddress(data: SetAddressInput): Cart searchPincode(data: PincodeInput): Pincode address(data: AddressInput): Address applyCoupon(data: CouponInput): Coupon removeCoupon: Coupon buyNow(data: BuyNowInput): Cart serviceCreate(data: ServiceCreateInput): ServiceCreateReturn gold(data: GoldInput): GoldCreateType cod: JSON· # Asset Management Mutations updateAsset( id: Int! license_plate: String model_id: Int vin_sn: String color: String driver_id: Int companyId: Int ): Asset!· # IoT Device Commands # Commands target a specific IoT device, not an asset: a composable asset # can carry several devices, so the caller names the exact device. executeDeviceCommand( device_id: Int! command_type: CommandType! parameters: JSON companyId: Int ): DeviceCommand!· # Mint a BLE capability token authorising the holder's app key to talk to # the asset's IoT device over Bluetooth (lock/unlock/etc). The app supplies # its ECDSA P-256 public key (base64 of the raw 64-byte X||Y, no 0x04 # prefix) and a permission bitmap; the server signs and returns the wire # token. perms bits: 1=lock, 2=unlock, 4=status_read, 8=config_read, # 16=config_write, 32=ota, 64=reset. mintBleToken( asset_id: Int! app_pubkey_b64: String! requested_perms: Int! pin_verifier_b64: String pin_required_perms: Int app_id: String validity_seconds: Int companyId: Int ): BleToken!· # IoT Device Management Mutations createIotDevice( asset_id: Int! device_id: String! name: String! iot_type_id: Int! companyId: Int ): AssetIoTDevice! updateIotDevice( id: Int! name: String iot_type_id: Int active: Boolean companyId: Int ): AssetIoTDevice! archiveIotDevice(id: Int!, companyId: Int): DeleteResponse!· # Business Operations Mutations createAlertConfiguration( asset_id: Int! alert_type: AlertType! threshold_value: Float! enabled: Boolean notification_emails: [String!] companyId: Int ): AlertConfiguration! updateAlertConfiguration( id: ID! asset_id: Int alert_type: AlertType threshold_value: Float enabled: Boolean notification_emails: [String!] companyId: Int ): AlertConfiguration! deleteAlertConfiguration(id: ID!, companyId: Int): Boolean!· createGeofenceArea(data: GeofenceInput!, companyId: Int): AssetGeofence! updateGeofenceArea( id: ID! data: GeofenceInput! companyId: Int ): AssetGeofence! deleteGeofenceArea(id: ID!, companyId: Int): Boolean!· cancelDeviceCommand(id: Int!, companyId: Int): AssetCommand!· createBusinessModelConfig( model_type: BusinessModelType! name: String! description: String base_rate: Float commission_percentage: Float parameters: JSON companyId: Int ): BusinessModelConfig! updateBusinessModelConfig( id: ID! model_type: BusinessModelType name: String description: String base_rate: Float commission_percentage: Float parameters: JSON active: Boolean companyId: Int ): BusinessModelConfig!· createMaintenanceTrigger( asset_id: Int! trigger_type: TriggerType! condition_value: Float! maintenance_type: String! description: String enabled: Boolean companyId: Int ): MaintenanceTrigger! updateMaintenanceTrigger( id: ID! asset_id: Int trigger_type: TriggerType condition_value: Float maintenance_type: String description: String enabled: Boolean companyId: Int ): MaintenanceTrigger! deleteMaintenanceTrigger(id: ID!, companyId: Int): Boolean!· scheduleMaintenanceFromTrigger( trigger_id: ID! scheduled_date: String! estimated_cost: Float notes: String companyId: Int ): ScheduledMaintenance!· # Asset Creation createAsset(input: CreateAssetInput!, companyId: Int): CreateAssetResponse!· # ============================================ # ASSET OPERATIONS MUTATIONS # ============================================· # Asset Locations createAssetLocation( input: CreateAssetLocationInput! companyId: Int ): AssetLocationFull! updateAssetLocation( id: Int! input: UpdateAssetLocationInput! companyId: Int ): AssetLocationFull! deleteAssetLocation(id: Int!, companyId: Int): DeleteResponse!· # Asset Trips createAssetTrip(input: CreateAssetTripInput!, companyId: Int): AssetTrip! updateAssetTrip( id: Int! input: UpdateAssetTripInput! companyId: Int ): AssetTrip! startAssetTrip( id: Int! start_odometer: Float start_latitude: Float start_longitude: Float companyId: Int ): AssetTrip! completeAssetTrip( id: Int! end_odometer: Float end_latitude: Float end_longitude: Float fuel_consumed: Float companyId: Int ): AssetTrip! cancelAssetTrip(id: Int!, reason: String, companyId: Int): AssetTrip!· # Delivery Challans createAssetDeliveryChallan( input: CreateAssetDeliveryChallanInput! companyId: Int ): AssetDeliveryChallan! updateAssetDeliveryChallan( id: Int! input: UpdateAssetDeliveryChallanInput! companyId: Int ): AssetDeliveryChallan! confirmAssetDeliveryChallan(id: Int!, companyId: Int): AssetDeliveryChallan! startTransitAssetDeliveryChallan( id: Int! companyId: Int ): AssetDeliveryChallan! capturePOD(input: CapturePODInput!, companyId: Int): AssetDeliveryChallan! cancelAssetDeliveryChallan( id: Int! reason: String companyId: Int ): AssetDeliveryChallan!· # Gatepasses createAssetGatepass( input: CreateAssetGatepassInput! companyId: Int ): AssetGatepass! approveAssetGatepass( id: Int! remarks: String companyId: Int ): AssetGatepass! denyAssetGatepass(id: Int!, reason: String!, companyId: Int): AssetGatepass! useAssetGatepass( id: Int! entry_or_exit: String! remarks: String companyId: Int ): AssetGatepass! cancelAssetGatepass(id: Int!, reason: String, companyId: Int): AssetGatepass!· # Traffic Violations createAssetTrafficViolation( input: CreateAssetTrafficViolationInput! companyId: Int ): AssetTrafficViolation! payAssetTrafficViolation( id: Int! paid_amount: Float! payment_reference: String deduct_from_wallet: Boolean companyId: Int ): AssetTrafficViolation! waiveAssetTrafficViolation( id: Int! waive_reason: String! companyId: Int ): AssetTrafficViolation!· # ============================================ # ASSET TYPE MUTATIONS # ============================================· createAssetType(input: CreateAssetTypeInput!): AssetType! updateAssetType(id: Int!, input: UpdateAssetTypeInput!): AssetType! deleteAssetType(id: Int!): Boolean! }· # Asset Location and Command Types type AssetCommandResponse { success: Boolean! command_id: String! message: String! method: String! execution_time_ms: Int! }· type AssetLocationPoint { id: Int! asset_id: Int device_id: String! latitude: Float! longitude: Float! altitude: Float speed: Float bearing: Float accuracy: Float timestamp: String! address: String fuel_level: Float engine_status: String ignition_status: String }· type IoTDeviceLocationHistory { device_id: String! device_name: String device_category: String points: [AssetLocationPoint!]! count: Int! }· type AssetLocationHistoryResponse { success: Boolean! count: Int! devices: [IoTDeviceLocationHistory!]! }· # Asset Management Types for API Integration· type Asset { id: ID! \"Human-readable display name\" name: String registration: String license_plate: String vin_sn: String asset_type: String state: String driver_name: String vehicle_model: String \"Base64-encoded icon from asset model (for map markers)\" model_icon: String \"IoT-derived operational state: moving | idle | stopped | offline\" status: String location: AssetLocation fuel_level: Float speed: Float bearing: Float odometer: Float last_update: String iot_devices: [AssetIoTDevice!] tags: [String!] ownership: AssetOwnership team: AssetTeam created_at: String updated_at: String }· type AssetLocation { latitude: Float longitude: Float address: String area: String timestamp: String bearing: Float }· type AssetOwnership { primary_owner: String ownership_type: String has_financial_claims: Boolean }· type DeleteResponse { success: Boolean! message: String }· type AssetMenuItem { id: String! name: String! url: String icon: String sequence: Int! parent_id: String children: [AssetMenuItem] }· type AssetModulePermissions { can_view: Boolean can_create: Boolean can_edit: Boolean can_delete: Boolean can_approve: Boolean }· type AssetModule { id: String! name: String! icon: String sequence: Int! parent_id: String enabled: Boolean! permissions: AssetModulePermissions! }· type AssetCompanyModules { id: Int! name: String! logo: String default: Boolean! modules: [AssetModule!]! }· type AssetCompanyFeatures { enabled_features: [String!]! feature_details: [AssetFeatureDetail!] total_enabled: Int }· type AssetFeatureDetail { code: String! name: String! description: String }· # User type for referencing users in various contexts type User { id: ID! name: String email: String username: String }· # Business Operations Types for Asset Management type DashboardSummary { assets: AssetSummary! enabled_features: [String!]! }· type AssetSummary { total: Int! active: Int! low_fuel: Int! financed: Int! }· type AssetFieldOptions { fuel_types: [FieldOption!]! vehicle_statuses: [FieldOption!]! transmission_types: [FieldOption!]! vehicle_types: [FieldOption!]! }· type FieldOption { value: String! label: String! icon: String color: String }· type AlertConfiguration { id: ID! asset_id: Int! alert_type: AlertType! threshold_value: Float! enabled: Boolean! notification_emails: [String!] created_at: String! updated_at: String! }· # Individual alert event recorded against an asset (asset.iot.alert in # Bifrost). The alert_type set is wider than the AlertType enum (which # only covers configurable thresholds), so it is exposed as String. type AssetAlert { id: ID! asset_id: Int! asset_name: String alert_type: String! severity: String! message: String! status: String! timestamp: String! }· enum AlertType { speed geofence acceleration idle fuel }· type AssetCommand { id: ID! asset_id: Int! command_type: CommandType! status: CommandStatus! parameters: JSON scheduled_at: String executed_at: String response: JSON created_by: User }· # Result of executeDeviceCommand — mirrors the Bifrost device-execute payload. type DeviceCommand { id: ID! command_code: String! status: CommandStatus! execution_time: String }· # Result of mintBleToken — mirrors the Bifrost ble-token mint payload # (/api/asset/ble-token/mint). type BleToken { # Base64 of the signed wire token to hand to the BLE device. token_b64: String! # Server-allocated token id. token_id: String! issued_at: String! valid_until: String! expires_in_sec: Int! # Granted permission bitmap (may be a subset of requested_perms). perms: Int! pin_required_perms: Int! }· enum CommandType { engine_cutoff engine_restore location_request geofence_check status_query }· enum CommandStatus { pending executing completed failed cancelled }· type BusinessModelConfig { id: ID! model_type: BusinessModelType! name: String! description: String base_rate: Float commission_percentage: Float parameters: JSON active: Boolean! }· enum BusinessModelType { rental lease per_order profit_sharing commission_based }· type MaintenanceTrigger { id: ID! asset_id: Int! trigger_type: TriggerType! condition_value: Float! maintenance_type: String! description: String enabled: Boolean! last_triggered: String }· type ScheduledMaintenance { id: ID! asset_id: Int! maintenance_type: String! scheduled_date: String! status: MaintenanceStatus! estimated_cost: Float actual_cost: Float notes: String }· enum MaintenanceStatus { scheduled in_progress completed cancelled overdue }· # Asset Creation Input Types input CreateAssetInput { # Basic Asset Information license_plate: String! chassis_number: String engine_number: String· # Asset Model and Brand model_id: Int model_name: String brand_name: String vehicle_type: String· # Driver Assignment driver_id: Int· # Purchase Information purchase_date: String purchase_price: Float· # Fuel Information fuel_type: String fuel_capacity: Float· # Physical Properties color: String year: Int odometer: Float· # Additional Information notes: String tags: [String] }· type CreateAssetResponse { success: Boolean! message: String! asset: Asset error: String }· # Asset Report Types type AssetReport { id: ID! title: String! description: String report_type: String! data: JSON generated_at: String! generated_by: String parameters: JSON }· type AssetReportMetrics { total_vehicles: Int! active_vehicles: Int! total_distance: Float! fuel_consumed: Float! avg_fuel_efficiency: Float! total_alerts: Int! maintenance_due: Int! expenses_total: Float! }· type AssetItemReport { asset_id: Int! license_plate: String! total_distance: Float! fuel_consumed: Float! fuel_efficiency: Float! alerts_count: Int! last_maintenance: String next_maintenance_due: String total_expenses: Float! location_updates: Int! }· type AssetDriverReport { driver_id: Int! driver_name: String! total_distance: Float! total_trips: Int! avg_speed: Float! alerts_count: Int! fuel_efficiency: Float! safety_score: Float! }· type AssetExpenseReport { category: String! total_amount: Float! transaction_count: Int! avg_amount: Float! percentage: Float! }· type AssetAlertReport { alert_type: String! count: Int! severity: String! resolved_count: Int! pending_count: Int! }· type AssetMaintenanceReport { asset_id: Int! license_plate: String! maintenance_type: String! last_service: String next_due: String cost: Float! status: String! }· # Traccar-style per-event report types· type AssetTripReport { id: ID! asset_id: Int! license_plate: String! driver_name: String state: String start_time: String end_time: String duration_minutes: Float! distance_km: Float! start_latitude: Float start_longitude: Float end_latitude: Float end_longitude: Float fuel_consumed: Float! }· type AssetStopReport { id: ID! asset_id: Int! license_plate: String! start_time: String end_time: String duration_minutes: Float! latitude: Float! longitude: Float! address: String engine_on: Boolean! }· type AssetEventReport { id: ID! asset_id: Int license_plate: String event_type: String! severity: String! timestamp: String message: String! latitude: Float longitude: Float }· # ============================================ # ASSET OPERATIONS TYPES # Trips, Locations, Challans, Gatepasses, Violations # ============================================· # Asset Location (Hubs, Warehouses, Depots) type AssetLocationFull { id: ID! name: String! code: String location_type: AssetLocationType! address: String city: String state: String pincode: String latitude: Float longitude: Float geofence_id: Int contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String active: Boolean! notes: String created_at: String updated_at: String }· enum AssetLocationType { hub warehouse depot customer other }· # Asset Trip type AssetTrip { id: ID! name: String! asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetTripState! trip_type: String start_location_id: Int start_location: AssetLocationFull end_location_id: Int end_location: AssetLocationFull planned_start_time: String planned_end_time: String actual_start_time: String actual_end_time: String start_odometer: Float end_odometer: Float distance_km: Float duration_minutes: Int start_latitude: Float start_longitude: Float end_latitude: Float end_longitude: Float fuel_consumed: Float notes: String challans: [AssetDeliveryChallan] created_at: String updated_at: String }· enum AssetTripState { draft planned assigned active completed cancelled }· # Asset Delivery Challan (LR/Consignment Notes) type AssetDeliveryChallan { id: ID! name: String! trip_id: Int trip: AssetTrip asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetChallanState! origin_location_id: Int origin_location: AssetLocationFull destination_location_id: Int destination_location: AssetLocationFull consignor_id: Int consignor_name: String consignee_id: Int consignee_name: String goods_description: String total_packages: Int total_weight: Float declared_value: Float freight_amount: Float loading_charges: Float unloading_charges: Float other_charges: Float total_amount: Float payment_mode: String payment_status: String scheduled_delivery_date: String actual_delivery_date: String pod_image: String pod_signature: String pod_received_by: String pod_remarks: String notes: String charges: [AssetChallanCharge] created_at: String updated_at: String }· enum AssetChallanState { draft confirmed in_transit delivered cancelled }· type AssetChallanCharge { id: ID! challan_id: Int! charge_type: String! description: String amount: Float! }· # Asset Gatepass type AssetGatepass { id: ID! name: String! gate_id: Int gate: AssetGate asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetGatepassState! pass_type: AssetGatepassType! purpose: String expected_entry_time: String expected_exit_time: String actual_entry_time: String actual_exit_time: String approved_by_id: Int approved_by_name: String approval_time: String entry_remarks: String exit_remarks: String notes: String valid_from: String valid_until: String created_at: String updated_at: String }· enum AssetGatepassState { pending approved denied used expired cancelled }· enum AssetGatepassType { entry exit both }· type AssetGate { id: ID! name: String! code: String location_id: Int location: AssetLocationFull gate_type: String active: Boolean! }· # Asset Traffic Violation type AssetTrafficViolation { id: ID! name: String! asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetViolationState! violation_type: String! challan_number: String violation_date: String! violation_location: String fine_amount: Float! penalty_points: Int due_date: String paid_date: String paid_amount: Float payment_reference: String waived_by_id: Int waived_by_name: String waive_reason: String deduct_from_wallet: Boolean wallet_deduction_id: Int evidence_url: String notes: String created_at: String updated_at: String }· enum AssetViolationState { pending paid waived }· # Asset Operations Dashboard Summary type AssetOpsDashboardSummary { trips: AssetTripsSummary! challans: AssetChallansSummary! gatepasses: AssetGatepassesSummary! violations: AssetViolationsSummary! }· type AssetTripsSummary { total: Int! active: Int! completed_today: Int! planned: Int! }· type AssetChallansSummary { total: Int! in_transit: Int! delivered_today: Int! pending_pod: Int! }· type AssetGatepassesSummary { total: Int! pending_approval: Int! approved_today: Int! used_today: Int! }· type AssetViolationsSummary { total: Int! pending: Int! overdue: Int! total_pending_amount: Float! }· # Input types for Asset Operations input CreateAssetTripInput { asset_id: Int! driver_id: Int trip_type: String start_location_id: Int end_location_id: Int planned_start_time: String planned_end_time: String notes: String }· input UpdateAssetTripInput { driver_id: Int state: AssetTripState start_location_id: Int end_location_id: Int planned_start_time: String planned_end_time: String actual_start_time: String actual_end_time: String start_odometer: Float end_odometer: Float notes: String }· input CreateAssetDeliveryChallanInput { trip_id: Int asset_id: Int! driver_id: Int origin_location_id: Int destination_location_id: Int consignor_id: Int consignee_id: Int goods_description: String total_packages: Int total_weight: Float declared_value: Float freight_amount: Float loading_charges: Float unloading_charges: Float other_charges: Float payment_mode: String scheduled_delivery_date: String notes: String }· input UpdateAssetDeliveryChallanInput { state: AssetChallanState driver_id: Int destination_location_id: Int total_packages: Int total_weight: Float declared_value: Float freight_amount: Float scheduled_delivery_date: String notes: String }· input CapturePODInput { challan_id: Int! pod_image: String pod_signature: String pod_received_by: String! pod_remarks: String actual_delivery_date: String }· input CreateAssetGatepassInput { gate_id: Int asset_id: Int! driver_id: Int pass_type: AssetGatepassType! purpose: String expected_entry_time: String expected_exit_time: String valid_from: String valid_until: String notes: String }· input CreateAssetTrafficViolationInput { asset_id: Int! driver_id: Int violation_type: String! challan_number: String violation_date: String! violation_location: String fine_amount: Float! penalty_points: Int due_date: String evidence_url: String notes: String }· input CreateAssetLocationInput { name: String! code: String location_type: AssetLocationType! address: String city: String state: String pincode: String latitude: Float longitude: Float contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String notes: String }· input UpdateAssetLocationInput { name: String code: String location_type: AssetLocationType address: String city: String state: String pincode: String latitude: Float longitude: Float contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String active: Boolean notes: String } " 146 | 'm', 147 | ); > 148 | expect(s).toMatch(fieldPattern); | ^ 149 | }); 150 | }); 151 | }); at src/__tests__/execute-flow-step.e2e.test.ts:148:17 at Array.forEach () at Object. (src/__tests__/execute-flow-step.e2e.test.ts:143:7) (node:62) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. (Use `node --trace-warnings ...` to show where the warning was created) PASS src/__tests__/fleet-resolvers.test.ts ● Console console.log ====== GET ASSET TEAMS ====== { companyId: 4 } at src/schema/asset/resolvers/teams.ts:62:15 PASS src/__tests__/application-flow.test.ts PASS src/__tests__/geofence-mutation-shape.test.ts PASS src/__tests__/geofence-team-id.test.ts PASS src/__tests__/execute-device-command.test.ts ● Console console.error Error executing device command: Error: Device not found at unwrapApi (/workspace/source/src/__tests__/execute-device-command.test.ts:16:32) at Object.executeDeviceCommand (/workspace/source/src/__tests__/execute-device-command.test.ts:36:14) at processTicksAndRejections (node:internal/process/task_queues:104:5) at /workspace/source/src/schema/asset/resolvers/commands.ts:69:22 77 | return result; 78 | } catch (error) { > 79 | console.error('Error executing device command:', error); | ^ 80 | throw new Error( 81 | `Failed to execute device command: ${error instanceof Error ? error.message : 'Unknown error'}`, 82 | ); at src/schema/asset/resolvers/commands.ts:79:15 at Object. (src/__tests__/execute-device-command.test.ts:128:5) PASS src/__tests__/application-product-set.test.ts PASS src/__tests__/asset-type-description-normalization.test.ts ● Console console.debug Redis (ioredis) or Redis instrumentation not installed - skipping Redis instrumentation at Object. (node_modules/@greencapitaltrade/utils/build/src/tracing.js:43:13) console.debug PostgreSQL (pg) or PostgreSQL instrumentation not installed - skipping PostgreSQL instrumentation at Object. (node_modules/@greencapitaltrade/utils/build/src/tracing.js:59:13) console.debug MongoDB packages not found - skipping MongoDB instrumentation at Object. (node_modules/@greencapitaltrade/utils/build/src/tracing.js:91:17) console.debug Kafka (kafkajs) or Kafka instrumentation not installed - skipping Kafka instrumentation at Object. (node_modules/@greencapitaltrade/utils/build/src/tracing.js:108:13) PASS src/__tests__/token-refresh-middleware.test.ts PASS src/__tests__/loan-products.test.ts PASS src/__tests__/mint-ble-token.test.ts ● Console console.error Error minting BLE token: Error: perms uses reserved bits at unwrapApi (/workspace/source/src/__tests__/mint-ble-token.test.ts:13:32) at Object.mintBleToken (/workspace/source/src/__tests__/mint-ble-token.test.ts:35:14) at processTicksAndRejections (node:internal/process/task_queues:104:5) at /workspace/source/src/schema/asset/resolvers/ble.ts:36:22 48 | return result; 49 | } catch (error) { > 50 | console.error('Error minting BLE token:', error); | ^ 51 | throw new Error( 52 | `Failed to mint BLE token: ${error instanceof Error ? error.message : 'Unknown error'}`, 53 | ); at src/schema/asset/resolvers/ble.ts:50:15 at Object. (src/__tests__/mint-ble-token.test.ts:106:5) PASS src/__tests__/step-registry.test.ts PASS src/__tests__/application-create.test.ts PASS src/__tests__/fleet-api-company-id.test.ts PASS src/__tests__/asset-contracts-removed.test.ts PASS src/__tests__/bifrost-auth-header.test.ts PASS src/__tests__/session-device-default.test.ts PASS src/__tests__/partner-type-status-avatar.test.ts PASS src/__tests__/current-org-middleware.test.ts PASS src/__tests__/geofence-asset-ids.test.ts Summary of all failing tests FAIL src/__tests__/execute-flow-step.e2e.test.ts ● feature-2017: executeFlowStep — schema surface › feature-2017: old document* mutations are marked @deprecated expect(received).toMatch(expected) Expected pattern: /documentCreditReportPut\([^)]*\):[^\n]*\n\s*@deprecated/m Received string: "scalar Date scalar JSON· type Image { original_url: String styles: String position: Int alt: String }· type BaseTaxon { id: Int! name: String! permalink: String! icon: Image }· type Taxon { name: String! id: Int! permalink: String! icon: Image breadcrumb: [BaseTaxon] siblings: [BaseTaxon] products( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] updated_at: String! }· type ProductVariant { id: Int! slug: String options: JSON price: String! compare_at_price: String images: [Image] updated_at: String! }· type Master { slug: String id: Int! images: [Image] emi: Float price: Float! compare_at_price: Float updated_at: String! }· type StockLocation { city: String state_name: String phone: String address1: String address2: String }· type Brand { id: Int! slug: String! name: String! updated_at: String! is_brand: Boolean! products( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] image: Image }· type Vendor { id: Int! slug: String! name: String! updated_at: String! stock_locations: [StockLocation] is_brand: Boolean! deals_in( per_page: Int page: Int filters: JSON city: String state_id: Int ): [Product] image: Image }· type PropertyCategory { id: Int! name: String! position: Int! }· type ProductProperty { id: Int! value: String! filter_param: String! name: String! description: String! property_category: PropertyCategory }· type Product { id: Int! slug: String! name: String! vendor: Brand sellers: [Vendor] price: String! display_price: String! compare_at_price: String image: Image options: JSON description: String! variants: [ProductVariant] option_types: [String] primary_variant: Master! product_properties: [ProductProperty] models: [Product] parent: Product updated_at: String! images: [Image] }· type BaseProduct { id: Int! slug: String! name: String! vendor: Vendor vendors: [Vendor] price: String! display_price: String! compare_at_price: String image: Image options: JSON }· type LineItem { id: Int! quantity: Int! product: BaseProduct! price: String! total: String! }· type Country { id: Int! name: String! }· type State { id: Int! name: String! country: Country! }· type Address { id: Int! firstname: String lastname: String address1: String address2: String city: String! zipcode: String! phone: String! alternativePhone: String! company: String state: State! country: Country label: String }· type Promotion { id: Int! name: String coupon: String promoDiscount: String removable: Boolean }· type Cart { id: String! state: String! totalPrice: Float discount: Float finalPrice: Float line_items: [LineItem] address: Address promotions: [Promotion] }· type Banner { image: String key: String link: String }· type Operator { id: Int! name: String! category: String sort_order: Float picture_id: Int }· type Service { id: Int name: String code: String enabled: Boolean sort_order: Float picture_id: Int operators: [Operator] }· type Point { unlocked: Float locked: Float total: Float }· type RedeemRate { redeem_per: Int redeem_value: Int conversion_type: String }· type RedeemCoinsResult { success: Boolean! coins_redeemed: Int rupee_value: Float code: String }· input RedeemCoinsInput { entity_id: Int! entity_type: String! coins: Int! }· type IncreaseLimit { method: String config: JSON }· type ExternsionPlan { id: Int! percentage: Float price: Float days: Float }· type Billing { balance: Float bill: Float limit: Float endsAt: Float lastPayBy: Float extensionPlans: [ExternsionPlan] increaseLimit: IncreaseLimit }· type EmiSetting { rate: Float duration: Float min_requirement: Float }· type Param { service_number: String }· type TransactionHistorySubField { key: String params: Param }· type EmiDetail { amount: Float billable_at: String emi_seq: Float count: Float }· type paymentOperator { name: String picture_id: Int }· type SwapEnabledUntil { enabled_until: Int! }· type TransactionHistory { uuid: String amount: Float billable_at: Float category: String comments: TransactionHistorySubField description: TransactionHistorySubField emi_details: EmiDetail entity_id: String entity_type: String fee: Float is_emi_disabled: Boolean operator: paymentOperator status: String }· type UuidReturnType { giftcard: JSON shopping: JSON }· type PostType { id: Int name: String title: String content: String type: String image: String }· type Close { day: Float time: String }· type Open { day: Float time: String } type Period { close: Close open: Open }· type Hour { open_now: Boolean periods: [Period] weekday_text: [String] }· type Store { id: Int mcid: String post_id: Int name: String phone: String cft: String area: String city: String address: String lat: Float lng: Float type: String cuisine: String ac: Boolean alcohol: Boolean bakes: Boolean veg: Boolean takeaway: Boolean wifi: Boolean language: Float rating: Float website: String google_place_id: String google_place_photos: String postId: Int hours: Hour post: Post }· type StoreName { id: Int name: String title: String content: String type: String image: String mp_store: Store }· type Order { orders: [Cart] }· type StateAddress { id: Int name: String }· type AadharCaptcha { image: String sessionId: String }· type Reference { type: String address: String name: String knows: Boolean is_important: Boolean }· type Place { place: String }· type Company { name: String }· type CouponResponse { id: Int description: String code: String amount: Float percent: String expiry: Float }· type Promotiontype { coupons: [CouponResponse] }· type ReferrerType { id: Int name: String user_id: Int knows: String address: String }· type UtilityType { dispute: JSON number: String }· type GiftCardType { number: String pin: String validity: String }· type TransactionStatusType { uuid: String amount: Float billable_at: Float category: String comments: TransactionHistorySubField description: TransactionHistorySubField emi_details: EmiDetail entity_id: String entity_type: String fee: Float is_emi_disabled: Boolean operator: paymentOperator status: String giftcard: GiftCardType shopping: JSON utility: UtilityType }· type ServiceEntityType { amount: Float operator: Operator number: Float id: Int convenience_fee: Float }· type Me { aadhaar_captcha: AadharCaptcha points: Point redeemRate( entity_type: String! category: String! source: String! ): RedeemRate referrerCount: Float billing: Billing cart: Cart emi_settings: [EmiSetting] transaction_history( month: Float year: Float page: Float ): [TransactionHistory] transaction( entity_type: String entity_id: String uuid: String ): TransactionStatusType uuid(uuid: String): TransactionStatusType orders(id: Int, page: Float): Order addresses: [Address] newAddress: [StateAddress] references: [Reference] place: [Place] company: [Company] referrer: [ReferrerType] referrers: JSON recent_services(serviceCode: String, limit: Float): RecentServiceReturnType service(entity_id: Int, entity_type: String): ServiceEntityType gold_balance: String processing_fee: [ProcessingFee] }· type RechargeType { amount: Float operator: Operator number: Float id: Int }· type OutletType { outletId: Int storeName: String }· type RecentServiceReturnType { recharges: RechargeType outlet: OutletType }· type RoundingType { round_direction: String decimal_places: Float }· type GoldPriceType { current_price: Float applicable_tax: String rate_id: ID weight_rounding: RoundingType amount_rounding: RoundingType expires_at: Float }· type Gold { buy_price: GoldPriceType sell_price: GoldPriceType }· type Query { repayments: JSON taxons( featured: Boolean page: Int per_page: Int city: String state_id: Int ): [Taxon] taxon(slug: String, city: String, state_id: Int): Taxon product(slug: String, city: String, state_id: Int): Product products( page: Int per_page: Int filters: JSON city: String state_id: Int ): [Product] brand(slug: String, city: String): Brand brands( page: Int per_page: Int city: String state_id: Int filters: JSON ): [Brand] vendor(slug: String, city: String, state_id: Int): Vendor vendors( page: Int per_page: Int city: String state_id: Int filters: JSON ): [Vendor] banners: [Banner] services: [Service] gold: Gold recent_services(serviceCode: String, limit: Float): RecentServiceReturnType service(serviceCode: String): Service email_verify(code: String): String file(id: Int): Boolean # this is done for backward compatibility postss(count: Float, perPage: Float, page: Float): [PostType] stores( type: String city: String area: String perPage: Float page: Float ): [Store] storeName(name: String): StoreName me: Me promotions: Promotiontype· vehicles: [RiderProduct] clients(category_id: Int!): [RiderProduct] rentals(category_id: Int!): [RiderProduct] employee: Employee partner: Partner rider(id: Int!): Rider riders( page: Int search: String tl_id: Int sort_by: String sort_order: String ): Riders teams(location_id: Int, include_members: Boolean): [AssetTeam] team(id: Int!): AssetTeam· \"\"\" Resolve the user's default team — drives Flash's `/` → `/:team_id/` redirect. Honours `res.users.default_team_id` (admin override) and falls back to managed/member resolution. `null` when the user has zero team access. \"\"\" defaultTeam(companyId: Int): AssetTeam my_vehicles: Vehicles swapstations(lat: Float!, lng: Float!): SwapStations warehouses(lat: Float!, lng: Float!): [Warehouse] transaction_history(id: Int, page: Int): RiderTransactionHistory team_leads: TeamLeads· # Geofence queries geofences(active: Boolean, asset_id: Int): [AssetGeofence] geofence(id: ID!): AssetGeofence deviceGeofences(device_id: Int!): [AssetGeofence] checkGeofenceViolations( device_id: Int! latitude: Float! longitude: Float! ): [AssetGeofence] iotDevices(active: Boolean): [AssetIoTDevice] iotDevice(id: ID!): AssetIoTDevice assetIotTypes(companyId: Int): [AssetIoTType]· # IoT Control queries (read-only, execution via mutations) deviceControls(device_id: Int!): [IoTControl] assetControls(asset_id: Int!): AssetControls controlStatus(control_id: ID!): IoTControlStatus controlHistory(device_id: Int!, hours: Int, limit: Int): [IoTActionLog] }· # From here this will be for backward compatibility type AppState { banners: [Banner] services: [Service] points: Point referrerCount: Float billing: Billing cart: Cart }· type Document { email_verify(code: String): String aadhaar_captcha: AadharCaptcha references: [Reference] place: [Place] company: [Company] polling: UserJourney }· type Payment { emi_settings: EmiSetting transaction_history: TransactionHistory uuid(uuid: String): TransactionStatusType }· type Post { recent(count: Float, perPage: Float, page: Float): [PostType] stores( type: String city: String area: String perPage: Float page: Float ): [Store] storeName(name: String): StoreName }· type Shopping { categories(page: Float): [BaseTaxon] featured_categories: [Taxon] category(slug: String, page: Float): Taxon product(slug: String): Product ordersCompleted(id: Int, page: Float): Order cart: Cart addresses: [Address] addressesNew: [StateAddress] }· extend type Query { state: AppState documents: Document payments: Payment posts: Post shopping: Shopping previewAgreement: PreviewAgreement emandateStatus: EmandateStatusResponse # LSP onboarding: the org's loan products, proxied from Ironman and # org-scoped. Named `loanProducts` because `products` is the e-commerce # catalog (a different domain entirely). Ironman returns snake_case fields, # so Fury maps them to camelCase on the GraphQL surface. loanProducts: [LoanProduct!]!· # LSP journey status: current flow for the user's active application, # proxied from Destiny and mapped from snake_case to camelCase. applicationFlow: ApplicationFlow!· # Asset Control Tower assetControlTower(member_id: Int): AssetControlTower· # Asset Management Queries assets( asset_type: String view: String limit: Int offset: Int search: String companyId: Int # team_id wins over the x-gct-team-id header when both are present. # Needed for Flash's SSR path: React Server Components don't see the # browser URL, so the path-segment-based header isn't set on the # initial render, and Fury would otherwise fall back to every team # the user can see. Passing it as a real GraphQL variable means the # SSR + client requests are byte-identical, Apollo caches per team, # and switching teams refetches reliably. teamId: Int ): [Asset!]! asset(id: Int!, companyId: Int): Asset assetDashboardSummary(companyId: Int): DashboardSummary assetCompanyFeatures(companyId: Int): AssetCompanyFeatures assetMenu: [AssetMenuItem!]! assetModules: [AssetCompanyModules!]! assetFieldOptions: AssetFieldOptions!· # Member Management memberRiders( member_id: Int! page: Int per_page: Int include_idle: Boolean include_due: Boolean ): MemberRiders memberAssets( member_id: Int! page: Int per_page: Int include_idle: Boolean ): MemberAssets· # Petty Cash Management pettyCash(id: ID!): PettyCash pettyCashList( member_id: Int team_id: Int state: PettyCashState expense_type: PettyCashExpenseType from_date: String to_date: String page: Int per_page: Int ): PettyCashList· # Team Configuration teamConfiguration(team_id: Int!): TeamConfiguration teamConfigurations( percolate_roles: Boolean petty_cash_enabled: Boolean ): [TeamConfiguration!]· # Asset Roles assetRoles(can_approve_petty_cash: Boolean): [AssetRole!]· # Asset Location History assetLocationHistory( assetId: Int! start_time: String end_time: String iot_device_ids: [String] limit: Int ): AssetLocationHistoryResponse· # Business Operations Queries assetAlertConfigurations( asset_id: Int alert_type: AlertType companyId: Int ): [AlertConfiguration!]! # Real alert events recorded against an asset (from asset.iot.alert in # Bifrost). Distinct from assetAlertConfigurations which describes # *thresholds*; this returns individual occurrences with timestamp, # severity, message, and ack status. assetAlerts( asset_id: Int! limit: Int offset: Int companyId: Int ): [AssetAlert!]! geofenceAreas( asset_id: Int enabled: Boolean # Optional team filter. NULL/omitted returns the union of # company-wide zones + zones scoped to any team the user can see. # Setting it narrows to zones with that exact team_id. team_id: Int companyId: Int ): [AssetGeofence!]! deviceCommands( device_id: Int! status: CommandStatus limit: Int offset: Int companyId: Int ): [AssetCommand!]! businessModelConfigs( model_type: BusinessModelType companyId: Int ): [BusinessModelConfig!]! maintenanceTriggers( asset_id: Int trigger_type: TriggerType enabled: Boolean limit: Int offset: Int companyId: Int ): [MaintenanceTrigger!]! scheduledMaintenance( asset_id: Int status: MaintenanceStatus limit: Int offset: Int companyId: Int ): [ScheduledMaintenance!]!· # Asset Report Queries assetReports( report_type: String start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetReport!]!· assetReportMetrics( start_date: String end_date: String asset_ids: [Int] companyId: Int ): AssetReportMetrics!· assetItemReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetItemReport!]!· assetDriverReports( driver_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetDriverReport!]!· assetExpenseReports( category: String start_date: String end_date: String asset_ids: [Int] companyId: Int ): [AssetExpenseReport!]!· assetAlertReports( alert_type: String severity: String start_date: String end_date: String asset_ids: [Int] companyId: Int ): [AssetAlertReport!]!· assetMaintenanceReports( asset_ids: [Int] maintenance_type: String status: String limit: Int offset: Int companyId: Int ): [AssetMaintenanceReport!]!· # Traccar-style per-event reports assetTripReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetTripReport!]!· assetStopReports( asset_ids: [Int] start_date: String end_date: String limit: Int offset: Int companyId: Int ): [AssetStopReport!]!· assetEventReports( asset_ids: [Int] start_date: String end_date: String event_types: [String] limit: Int offset: Int companyId: Int ): [AssetEventReport!]!· # ============================================ # ASSET OPERATIONS QUERIES # ============================================· # Asset Locations assetLocations( location_type: AssetLocationType search: String active: Boolean limit: Int offset: Int companyId: Int ): [AssetLocationFull!]!· assetLocation(id: Int!, companyId: Int): AssetLocationFull· # Asset Trips assetTrips( asset_id: Int driver_id: Int state: AssetTripState start_location_id: Int end_location_id: Int date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetTrip!]!· assetTrip(id: Int!, companyId: Int): AssetTrip· # Delivery Challans assetDeliveryChallans( asset_id: Int driver_id: Int trip_id: Int state: AssetChallanState origin_location_id: Int destination_location_id: Int date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetDeliveryChallan!]!· assetDeliveryChallan(id: Int!, companyId: Int): AssetDeliveryChallan· # Gatepasses assetGatepasses( asset_id: Int driver_id: Int gate_id: Int state: AssetGatepassState pass_type: AssetGatepassType date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetGatepass!]!· assetGatepass(id: Int!, companyId: Int): AssetGatepass· # Gates assetGates(location_id: Int, active: Boolean, companyId: Int): [AssetGate!]!· # Traffic Violations assetTrafficViolations( asset_id: Int driver_id: Int state: AssetViolationState violation_type: String date_from: String date_to: String limit: Int offset: Int companyId: Int ): [AssetTrafficViolation!]!· assetTrafficViolation(id: Int!, companyId: Int): AssetTrafficViolation· # Asset Operations Dashboard assetOpsDashboard(companyId: Int): AssetOpsDashboardSummary!· # Asset Type Queries assetTypes: [AssetType!]! assetType(id: Int!): AssetType }· input DeviceCreateDatainput { token: String }· input EmailInput { email: String }· input EmailVerifyInput { serverToken: String }· input InstalledAppInput { apps: [JSON] }· input PersonalDataInput { income_type: String! fathers_name: String! education: String! company_type: String! company_name: String! work_experience: Float! residence: String! income_range: Float! marital_status: String! kids: String! }· input PanInput { value: String check: Boolean! }· input AadhaarOtpInput { aadhaar: String }· input AadhaarXmlInput { sessionId: String otp: String }· input ReferencesInput { name: String! phones: [String]! emails: [String]! photo: String! knows: String! }· input CreditReportCreateInput { dateOfBirth: Date! gender: String! flatno: String! city: String! state: String! pincode: String! }· input PurposePaymentInput { purpose: String amount: Float }· input AgreementInput { signType: String }· input EmandateCreateInput { amount: Int! mandateType: String! vpa: String accountNumber: String ifsc: String name: String }· type AadhaarOtp { sessionId: String referenceId: String code: String }· type PaymentOrder { uuid: String url: String code: String }· type ProcessingFee { id: Int price: Float popular: Boolean cashbackAmount: Float }· type Error { code: String }· type UserJourney { status: String product: String status_data: JSON screen: String url: String code: String }· type Application { id: Int status: String product_id: Int }· input PaymentConvenienceFeeInput { entity_type: String outlet_id: Int amount: Float }· input PaymentEmiProcessingFeeInput { amount: Float }· input PaymentInput { amount: Float password: String entity_id: Int entity_type: String comment: String emi_duration: Float order_id: String coins_to_redeem: Int }· input paymentUuidUpdateInput { emi_duration: Float uuid: String }· input paymentRaiseDisputeInput { entityType: String entityId: String entityID: String }· type PaymentConvenienceFeeReturnType { convenienceFee: Float code: String }· type PaymentEmiProcessingFeeReturnType { emi_processing_fee: Float code: String }· type PaymentType { uuid: String id: Int billing: Billing url: String code: String }· type PaymentRaiseDisputeType { status: String reference_id: Int msg: String }· type GiftCard { id: Int amount: Float code: String }· type Pincode { id: Int pincode: String state_id: Int city: String }· type UserResetPasswordCreateReturnData { pan_required: Boolean }· type Coupon { cart: Cart coupon: String message: String }· input GiftCardCreateInput { amount: Float operator_id: Int }· input repaymentCreateInput { extension_plan_entry_id: Int amount: Float }· input SessionCreateDataInput { phone: String email: String password: String rememberMe: Boolean }· input SessionPutDataInput { phone: String otp: String rememberMe: Boolean }· input SessionDeleteInput { token: String }· input PartnerVerifiedUserInput { phone: String! email: String! }· type PartnerVerifiedUserResponse { token: String code: String }· input SetPasswordInput { password: String confirmPassword: String }· input ResetPasswordCreateInput { password: String confirmPassword: String }· input ResetPasswordPutInput { emailOtp: String mobileOtp: String pan: String }· input AddtoCartInput { variant_id: Int }· input BuyNowInput { variant_id: Int quantity: Float }· input UpdateQuantityInput { line_item_id: Int quantity: Float }· input SetAddressInput { address_id: Int }· input PincodeInput { pincode: String }· input CouponInput { coupon: String }· input AddressInput { firstname: String lastname: String address1: String address2: String city: String zipcode: String phone: String alternative_phone: String company: String state_id: Int }· type repaymentCreateReturnData { uuid: String url: String }· input ServiceCreateInput { amount: Float operator_id: Int serviceCode: String special: Boolean service_number: String }· input GoldInput { amount: Float weight: Float rate_id: ID transaction_type: String current_price: Float applicable_tax: Float }· type ServiceCreateReturn { id: Int amount: Float }· type SessionPutReturnType { code: String token: String status: String product: String status_data: JSON screen: String url: String }· type SessionCreateResponse { success: Boolean! messageKey: String! status: String token: String waitTime: Int }· type GoldCreateType { id: Int status: String }· type AgreementDetail { url: String code: String }· type PreviewAgreement { html: String code: String }· type EmandateResult { id: ID digioMandateId: String status: String url: String code: String }· # executeFlowStep — unified loan origination step execution (greencapitaltrade/fury#2017) enum FlowStepType { KYC BANK_STATEMENT CREDIT_CHECK AGREEMENT EMANDATE }· enum FlowStepKind { DIGILOCKER AADHAAR_OTP AADHAAR_XML PAN PAN_AADHAAR_LINK PERSONAL BUREAU DIGIO AA }· enum StepErrorCode { VALIDATION_FAILED INVALID_TYPE_KIND STEP_NOT_PERMITTED PROVIDER_DECLINED RATE_LIMITED IN_PROGRESS }· type StepFieldError { field: String code: StepErrorCode! message: String! }· type StepError { code: StepErrorCode! message: String! retryable: Boolean! details: [StepFieldError!] }· type DigilockerDocument { type: String! required: Boolean! }· type DigilockerKyc { gatewayUrl: String! kycRequestId: String! documents: [DigilockerDocument!] code: String }· union FlowStepResult = | UserJourney | AadhaarOtp | DigilockerKyc | AgreementDetail | EmandateResult | StepError· type EmandateStatusResponse { digioMandateId: String status: String active: Boolean umrn: String authType: String code: String }· # A loan product owned by Ironman (GET /v1/products), org-scoped. The LSP # passes the chosen `id` as product_id to applicationCreate. type LoanProduct { id: ID! name: String! code: String organizationId: Int active: Boolean createdAt: String updatedAt: String }· # A single step inside an application's flow. type ApplicationFlowStep { nodeId: String! stepType: String! status: String! attempts: Int! startedAt: String completedAt: String result: JSON }· # The current flow state for a user's active application. type ApplicationFlow { flowId: Int! steps: [ApplicationFlowStep!]! active: [String!]! completed: Int! total: Int! }· type VerifyEmailResult { success: Boolean! message: String }· type RiderProduct { id: Int! name: String! price: Float! defaultCode: String! categoryId: Int! description: String! }· type Employee { id: Int! name: String avatar_128: String avatar1920: String isTl: Boolean is_tl: Boolean role: String wallet: Float dueAmount: Float due_amount: Float credit: Float credit_limit: Float vehicle: String }· type Partner { id: Int! name: String email: String mobile: String # Financial - for rider dues credit: Float credit_limit: Float # Company company_id: Int # Role derived from Odoo groups role: String # Asset Team team: AssetTeam # Display avatar_128: String \"\"\" Alias of `avatar_128` for the team-member shape used in Flash. Null when the upstream `asset.team` API doesn't include partner images (gated by `asset_rider_management` today). \"\"\" avatar: String \"\"\" `\"active\"` / `\"inactive\"` — derived from `res.partner.active`. Null when the upstream API doesn't include the flag. \"\"\" status: String }· type AssetTeam { id: ID! name: String manager: Partner location: TeamLocation member_count: Int parent_team_id: Int members: [Partner] child_teams: [AssetTeam] }· type TeamLocation { id: Int! name: String }· type AssetIoTDevice { id: ID! name: String! device_id: String! device_type: String iot_type_code: String iot_type_name: String device_category: String primary: Boolean active: Boolean status: String connection_status: String last_communication: String asset_id: Int asset_name: String last_latitude: Float last_longitude: Float last_update: String geofences: [AssetGeofence] }· # ─── Asset Type Management ─────────────────────────────────────────· type AssetType { id: Int! name: String! code: String icon: String sequence: Int active: Boolean color: Int description: String assetCount: Int }· input CreateAssetTypeInput { name: String! code: String icon: String sequence: Int color: Int description: String }· input UpdateAssetTypeInput { name: String code: String icon: String sequence: Int active: Boolean color: Int description: String }· type AssetIoTTypeFeatures { gps: Boolean acceleration: Boolean ble: Boolean fuel: Boolean can: Boolean sos: Boolean buzzer: Boolean theft_alarm: Boolean immobilize: Boolean wheel_lock: Boolean remote_control: Boolean gsm: Boolean }· type AssetIoTCommandParamOption { label: String! value: String! }· type AssetIoTCommandParam { name: String! type: String! label: String! default: String min: Float max: Float options: [AssetIoTCommandParamOption] }· type AssetIoTCommand { id: String! name: String! description: String parameters: [AssetIoTCommandParam] warning: String }· type AssetIoTType { id: ID! name: String! code: String! description: String device_category: String manufacturer: String data_format: String default_reporting_interval: Int primary_metric_field: String device_count: Int active: Boolean features: AssetIoTTypeFeatures commands: [AssetIoTCommand] }· type TeamManager { id: Int! name: String }· type Rider { id: Int! work_contact_id: Int! name: String! phone: String! email: String! equipment_ids: [Int] credit: Float due_amount: Float! days_since_due: Int! wallet: Float avatar_128: String vehicle: String credit_limit: Float contract: String }· type RiderList { id: Int! work_contact_id: Int! credit: Float due_amount: Float! days_since_due: Int! wallet: Float phone: String! name: String! avatar_128: String vehicle: String # TL information (only for Super TLs) tl_id: Int tl_name: String }· type Riders { riders: [RiderList]! pages: Int! total: Int! }· type RiderTransactionHistoryItem { id: Int! date: Int! amount: [Float]! quantity: [Float]! name: [String]! }· type RiderTransactionHistory { transactions: [RiderTransactionHistoryItem]! pages: Int! }· type TeamLead { id: Int name: String! count: Int! }· type TeamLeads { team_leads: [TeamLead]! }· type Vehicle { employee_id: Int! assign_date: String serial_no: String! }· type Vehicles { vehicles: [Vehicle]! pages: Int! }· type SwapStation { name: String! lat: Float! lng: Float! distance: Float }· type SwapStations { stations: [SwapStation]! }· type Warehouse { id: Int! name: String! street: String street2: String city: String pincode: String partner_latitude: Float! partner_longitude: Float! avatar_128: String equipment_count: Float! distance: Float! }· type Warehouses { warehouses: [Warehouse]! }· input BankAccount { name: String! ifsc: String! number: String! }· input RiderInput { id: Int! pan: String! aadhaar: String! otp: String! referenceId: String! bank: BankAccount }· type AssetGeofence { id: ID! name: String! description: String geofence_type: GeofenceType! # Circular geofence fields center_latitude: Float center_longitude: Float radius_meters: Float # Rectangular geofence fields north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # Polygon geofence fields polygon_coordinates: [[Float]] # Rules and configuration rule_type: GeofenceRule! speed_limit_kmh: Float active: Boolean! start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Day restrictions monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority! send_email_alerts: Boolean send_sms_alerts: Boolean # IoT device assignment iot_devices: [AssetIoTDevice] apply_to_all_devices: Boolean # Asset assignment — the Many2many the zone applies to. Use this # for \"X assets covered\" counts and the per-zone asset-picker UX; # zones can target multiple assets at once. Empty array when the # zone isn't bound to any specific asset. asset_ids: [Int!] asset_count: Int # Optional team scope. NULL = company-wide zone (every user in the # tenant sees it). Set = belongs to that team's curated library. # `team_name` is a denormalised display convenience so list views # don't have to round-trip through AssetTeam. team_id: Int team_name: String # Statistics total_entries: Int total_exits: Int total_violations: Int last_violation: String }· enum GeofenceType { circular rectangular polygon }· enum GeofenceRule { entry exit both restricted speed_limit }· enum AlertPriority { low medium high critical }· input GeofenceInput { name: String! description: String geofence_type: GeofenceType! # For circular center_latitude: Float center_longitude: Float radius_meters: Float # For rectangular north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # For polygon polygon_coordinates: [[Float]] # Rules rule_type: GeofenceRule! speed_limit_kmh: Float active: Boolean start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Days monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority send_email_alerts: Boolean send_sms_alerts: Boolean # IoT devices device_ids: [Int] apply_to_all_devices: Boolean # Multi-asset assignment — replaces the whole list on update. # Pass an empty array to unassign the zone from all assets. asset_ids: [Int] # Optional team scope. NULL = company-wide. The team must belong # to the same company as the geofence (Bifrost enforces this with # an @api.constrains). team_id: Int }· # Partial-update input for updateGeofenceArea. Same fields as # GeofenceInput but every one is optional, so a client that only wants # to toggle `active` or push a new asset_ids list doesn't have to # resend name + geofence_type + rule_type. (Originally landed via # fury#1955; the type definition was lost in a subsequent merge while # the mutation's `data: GeofenceUpdateInput!` reference survived. # Restored here.) input GeofenceUpdateInput { name: String description: String geofence_type: GeofenceType # For circular center_latitude: Float center_longitude: Float radius_meters: Float # For rectangular north_latitude: Float south_latitude: Float east_longitude: Float west_longitude: Float # For polygon polygon_coordinates: [[Float]] # Rules rule_type: GeofenceRule speed_limit_kmh: Float active: Boolean start_date: String end_date: String # Time restrictions time_restriction: Boolean start_time: Float end_time: Float # Days monday: Boolean tuesday: Boolean wednesday: Boolean thursday: Boolean friday: Boolean saturday: Boolean sunday: Boolean # Alerts alert_priority: AlertPriority send_email_alerts: Boolean send_sms_alerts: Boolean # IoT devices device_ids: [Int] apply_to_all_devices: Boolean # Multi-asset assignment — replaces the whole list on update. # Pass an empty array to unassign the zone from all assets. asset_ids: [Int] # Optional team scope. NULL = company-wide. team_id: Int }· # IoT Control Types enum ControlType { switch relay fet pwm servo analog digital custom }· enum ControlState { unknown on off error busy }· enum ActionType { enable disable set_value query_status reset configure custom }· enum TriggerType { manual scheduled alert condition api system }· type IoTControl { id: ID! name: String! control_type: ControlType! device: AssetIoTDevice! current_state: ControlState target_state: ControlState current_value: Float target_value: Float min_value: Float max_value: Float enabled: Boolean requires_confirmation: Boolean critical: Boolean description: String last_action_date: String success_rate: Float ready: Boolean next_available: String }· type IoTControlStatus { control_id: ID! name: String! type: ControlType! state: ControlState! value: Float ready: Boolean enabled: Boolean success_rate: Float last_action: String next_available: String requires_confirmation: Boolean critical: Boolean }· type IoTActionLog { id: ID! display_name: String! control: IoTControl device: AssetIoTDevice action_type: ActionType! parameters: JSON result: JSON success: Boolean action_date: String! response_date: String execution_time: Float acknowledgment_received: Boolean acknowledgment_date: String trigger_type: TriggerType! trigger_source: String user: User error_message: String status: String }· type ControlExecutionResult { success: Boolean! control_id: ID device_id: ID action_type: ActionType result: JSON requires_confirmation: Boolean message: String control_name: String }· type AssetControls { asset_id: ID! devices: [DeviceControls!]! }· type DeviceControls { device_name: String! device_id: String! controls: [IoTControl!]! }· input ControlExecutionInput { action_type: ActionType parameters: JSON confirmed: Boolean value: Float }· input PettyCashInput { member_id: Int! date: String! amount: Float! expense_type: PettyCashExpenseType! description: String! receipt_number: String asset_id: Int }· input TeamConfigurationInput { percolate_roles: Boolean percolated_role_ids: [Int!] petty_cash_enabled: Boolean petty_cash_allowed_role_ids: [Int!] petty_cash_limits: JSON petty_cash_approval_required: Boolean petty_cash_approver_ids: [Int!] }· # Asset Control Tower Types type AssetControlTower { id: ID! company_id: Int! total_vehicles: Int! active_vehicles: Int! idle_vehicles: Int! overdue_riders: Int! maintenance_due: Int! documents_expiring: Int! pending_assignments: Int! total_revenue_today: Float! total_expenses_today: Float! alerts_count: Int! kpi_data: JSON last_updated: String! }· # Member Management Types type MemberRider { id: ID! name: String! employee_code: String asset_id: Int vehicle_serial: String idle: Boolean! idle_duration_minutes: Int rental_due_date: String days_until_due: Int outstanding_amount: Float last_payment_date: String status: String! }· type MemberAsset { id: ID! serial_no: String! make: String model: String registration_number: String driver_id: Int driver_name: String idle: Boolean! idle_duration_minutes: Int last_movement_time: String location: AssetMapLocation fuel_level: Float maintenance_due_date: String documents_expiring: Int }· type AssetMapLocation { latitude: Float! longitude: Float! address: String timestamp: String! }· # Petty Cash Types type PettyCash { id: ID! reference: String! member_id: Int! member_name: String! team_id: Int team_name: String date: String! amount: Float! expense_type: PettyCashExpenseType! description: String! receipt_number: String asset_id: Int vehicle_serial: String state: PettyCashState! approved_by: String approved_date: String rejection_reason: String reimbursed_by: String reimbursement_date: String attachments_count: Int over_limit: Boolean daily_total: Float monthly_total: Float }· enum PettyCashExpenseType { fuel parking toll maintenance meals accommodation office_supplies vehicle_cleaning emergency other }· enum PettyCashState { draft submitted approved rejected reimbursed cancelled }· type PettyCashSummary { total_amount: Float! pending_approvals: Int! approved_amount: Float! rejected_count: Int! monthly_limit: Float monthly_spent: Float! by_type: JSON }· # Team Configuration Types type TeamConfiguration { id: ID! team_id: Int! team_name: String! percolate_roles: Boolean! percolated_roles: [AssetRole!] petty_cash_enabled: Boolean! petty_cash_allowed_roles: [AssetRole!] petty_cash_limits: JSON petty_cash_approval_required: Boolean! petty_cash_approvers: [String!] }· type AssetRole { id: ID! name: String! code: String! permissions: [String!] can_approve_petty_cash: Boolean can_manage_teams: Boolean can_view_control_tower: Boolean }· # Pagination Types type MemberRiders { riders: [MemberRider!]! total: Int! idle_count: Int! due_count: Int! page: Int! pages: Int! }· type MemberAssets { vehicles: [MemberAsset!]! total: Int! idle_count: Int! maintenance_due_count: Int! page: Int! pages: Int! }· type PettyCashList { items: [PettyCash!]! total: Int! summary: PettyCashSummary! page: Int! pages: Int! }· type Mutation { enableSwap(selfie: String!): SwapEnabledUntil makePayment(amount: Float!, rider_id: Int): PaymentOrder makePaymentForPlan( asset_id: Int! client_id: Int! plan_id: Int! ): PaymentOrder aadhaarOtp(aadhaar: String!): AadhaarOtp assignVehicle(id: Int!, companyId: Int): JSON unassignVehicle(id: Int!, companyId: Int): JSON· # Geofence mutations live further down as the *GeofenceArea trio # (with non-null returns). An older unsuffixed set used to live # here with no resolver wiring — every call silently returned null. # They were removed to avoid the misleading surface. assignDevicesToGeofence( geofence_id: ID! device_ids: [Int]! companyId: Int ): AssetGeofence checkDeviceInGeofence( device_id: Int! latitude: Float! longitude: Float! companyId: Int ): Boolean· # IoT Control mutations (fleet_management_manager+ role required) executeControl( control_id: ID! data: ControlExecutionInput! companyId: Int ): ControlExecutionResult enableControl( control_id: ID! confirmed: Boolean companyId: Int ): ControlExecutionResult disableControl( control_id: ID! confirmed: Boolean companyId: Int ): ControlExecutionResult setControlValue( control_id: ID! value: Float! companyId: Int ): ControlExecutionResult queryControlStatus(control_id: ID!, companyId: Int): IoTControlStatus· # Petty Cash mutations createPettyCash(data: PettyCashInput!): PettyCash updatePettyCash(id: ID!, data: PettyCashInput!): PettyCash submitPettyCash(id: ID!): PettyCash approvePettyCash(id: ID!): PettyCash rejectPettyCash(id: ID!, reason: String!): PettyCash reimbursePettyCash(id: ID!, reference: String): PettyCash cancelPettyCash(id: ID!): PettyCash· # Team Configuration mutations updateTeamConfiguration( team_id: Int! data: TeamConfigurationInput! ): TeamConfiguration applyTeamRolePercolation(team_id: Int!): Boolean enablePettyCashForTeam(team_id: Int!, role_ids: [Int!]!): TeamConfiguration· # Team management mutations createTeam(name: String!): AssetTeam addTeamMember( team_id: Int! name: String! email: String! phone: String role: String! ): Partner updateTeamMember( id: Int! name: String email: String phone: String role: String ): Partner removeTeamMember(id: Int!, team_id: Int!): DeleteResponse!· CreateDevice(data: DeviceCreateDatainput): JSON applicationCreate(product_id: Int!): Application applicationProductSet(product_id: Int!): Application documentInstalledApps(data: InstalledAppInput): JSON documentEmail(data: EmailInput): UserJourney documentVerifyGmail(data: EmailVerifyInput): UserJourney documentPersonal(data: PersonalDataInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentPanCreate(data: PanInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentAadhaarOtp(data: AadhaarOtpInput): AadhaarOtp @deprecated(reason: \"use executeFlowStep(type, kind)\") documentAadhaarXml(data: AadhaarXmlInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentReferences(data: ReferencesInput): UserJourney documentCreditReportCreate(data: CreditReportCreateInput): UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentCreditReportPut: UserJourney @deprecated(reason: \"use executeFlowStep(type, kind)\") documentPurposePayment(data: PurposePaymentInput): PaymentOrder documentAgreement(data: AgreementInput): AgreementDetail @deprecated(reason: \"use executeFlowStep(type, kind)\") emandateCreate(data: EmandateCreateInput!): EmandateResult @deprecated(reason: \"use executeFlowStep(type, kind)\") executeFlowStep( applicationId: ID! type: FlowStepType! kind: FlowStepKind! data: JSON ): FlowStepResult! verifyEmail(token: String!): VerifyEmailResult referrers: JSON paymentConvenienceFee( data: PaymentConvenienceFeeInput ): PaymentConvenienceFeeReturnType paymentEmiProcessingFee( data: PaymentEmiProcessingFeeInput ): PaymentEmiProcessingFeeReturnType payment(data: PaymentInput): PaymentType redeemCoins(data: RedeemCoinsInput!): RedeemCoinsResult paymentUuidUpdate(data: paymentUuidUpdateInput): PaymentType paymentRaiseDispute(data: paymentRaiseDisputeInput): PaymentRaiseDisputeType giftcardCreate(data: GiftCardCreateInput): Boolean repaymentCreate(data: repaymentCreateInput): repaymentCreateReturnData sessionCreate(data: SessionCreateDataInput): Boolean sessionCreateV2(data: SessionCreateDataInput): SessionCreateResponse sessionPut(data: SessionPutDataInput): SessionPutReturnType sessionDelete(data: SessionDeleteInput): JSON partnerVerifiedUser( data: PartnerVerifiedUserInput! ): PartnerVerifiedUserResponse UserSetPassword(data: SetPasswordInput): UserJourney UserResetPasswordCreate( data: ResetPasswordCreateInput ): UserResetPasswordCreateReturnData UserResetPasswordPut(data: ResetPasswordPutInput): JSON addToCart(data: AddtoCartInput): Cart updateQuantity(data: UpdateQuantityInput): Cart setAddress(data: SetAddressInput): Cart searchPincode(data: PincodeInput): Pincode address(data: AddressInput): Address applyCoupon(data: CouponInput): Coupon removeCoupon: Coupon buyNow(data: BuyNowInput): Cart serviceCreate(data: ServiceCreateInput): ServiceCreateReturn gold(data: GoldInput): GoldCreateType cod: JSON· # Asset Management Mutations updateAsset( id: Int! license_plate: String model_id: Int vin_sn: String color: String driver_id: Int companyId: Int ): Asset!· # IoT Device Commands # Commands target a specific IoT device, not an asset: a composable asset # can carry several devices, so the caller names the exact device. executeDeviceCommand( device_id: Int! command_type: CommandType! parameters: JSON companyId: Int ): DeviceCommand!· # Mint a BLE capability token authorising the holder's app key to talk to # the asset's IoT device over Bluetooth (lock/unlock/etc). The app supplies # its ECDSA P-256 public key (base64 of the raw 64-byte X||Y, no 0x04 # prefix) and a permission bitmap; the server signs and returns the wire # token. perms bits: 1=lock, 2=unlock, 4=status_read, 8=config_read, # 16=config_write, 32=ota, 64=reset. mintBleToken( asset_id: Int! app_pubkey_b64: String! requested_perms: Int! pin_verifier_b64: String pin_required_perms: Int app_id: String validity_seconds: Int companyId: Int ): BleToken!· # IoT Device Management Mutations createIotDevice( asset_id: Int! device_id: String! name: String! iot_type_id: Int! companyId: Int ): AssetIoTDevice! updateIotDevice( id: Int! name: String iot_type_id: Int active: Boolean companyId: Int ): AssetIoTDevice! archiveIotDevice(id: Int!, companyId: Int): DeleteResponse!· # Business Operations Mutations createAlertConfiguration( asset_id: Int! alert_type: AlertType! threshold_value: Float! enabled: Boolean notification_emails: [String!] companyId: Int ): AlertConfiguration! updateAlertConfiguration( id: ID! asset_id: Int alert_type: AlertType threshold_value: Float enabled: Boolean notification_emails: [String!] companyId: Int ): AlertConfiguration! deleteAlertConfiguration(id: ID!, companyId: Int): Boolean!· createGeofenceArea(data: GeofenceInput!, companyId: Int): AssetGeofence! updateGeofenceArea( id: ID! data: GeofenceInput! companyId: Int ): AssetGeofence! deleteGeofenceArea(id: ID!, companyId: Int): Boolean!· cancelDeviceCommand(id: Int!, companyId: Int): AssetCommand!· createBusinessModelConfig( model_type: BusinessModelType! name: String! description: String base_rate: Float commission_percentage: Float parameters: JSON companyId: Int ): BusinessModelConfig! updateBusinessModelConfig( id: ID! model_type: BusinessModelType name: String description: String base_rate: Float commission_percentage: Float parameters: JSON active: Boolean companyId: Int ): BusinessModelConfig!· createMaintenanceTrigger( asset_id: Int! trigger_type: TriggerType! condition_value: Float! maintenance_type: String! description: String enabled: Boolean companyId: Int ): MaintenanceTrigger! updateMaintenanceTrigger( id: ID! asset_id: Int trigger_type: TriggerType condition_value: Float maintenance_type: String description: String enabled: Boolean companyId: Int ): MaintenanceTrigger! deleteMaintenanceTrigger(id: ID!, companyId: Int): Boolean!· scheduleMaintenanceFromTrigger( trigger_id: ID! scheduled_date: String! estimated_cost: Float notes: String companyId: Int ): ScheduledMaintenance!· # Asset Creation createAsset(input: CreateAssetInput!, companyId: Int): CreateAssetResponse!· # ============================================ # ASSET OPERATIONS MUTATIONS # ============================================· # Asset Locations createAssetLocation( input: CreateAssetLocationInput! companyId: Int ): AssetLocationFull! updateAssetLocation( id: Int! input: UpdateAssetLocationInput! companyId: Int ): AssetLocationFull! deleteAssetLocation(id: Int!, companyId: Int): DeleteResponse!· # Asset Trips createAssetTrip(input: CreateAssetTripInput!, companyId: Int): AssetTrip! updateAssetTrip( id: Int! input: UpdateAssetTripInput! companyId: Int ): AssetTrip! startAssetTrip( id: Int! start_odometer: Float start_latitude: Float start_longitude: Float companyId: Int ): AssetTrip! completeAssetTrip( id: Int! end_odometer: Float end_latitude: Float end_longitude: Float fuel_consumed: Float companyId: Int ): AssetTrip! cancelAssetTrip(id: Int!, reason: String, companyId: Int): AssetTrip!· # Delivery Challans createAssetDeliveryChallan( input: CreateAssetDeliveryChallanInput! companyId: Int ): AssetDeliveryChallan! updateAssetDeliveryChallan( id: Int! input: UpdateAssetDeliveryChallanInput! companyId: Int ): AssetDeliveryChallan! confirmAssetDeliveryChallan(id: Int!, companyId: Int): AssetDeliveryChallan! startTransitAssetDeliveryChallan( id: Int! companyId: Int ): AssetDeliveryChallan! capturePOD(input: CapturePODInput!, companyId: Int): AssetDeliveryChallan! cancelAssetDeliveryChallan( id: Int! reason: String companyId: Int ): AssetDeliveryChallan!· # Gatepasses createAssetGatepass( input: CreateAssetGatepassInput! companyId: Int ): AssetGatepass! approveAssetGatepass( id: Int! remarks: String companyId: Int ): AssetGatepass! denyAssetGatepass(id: Int!, reason: String!, companyId: Int): AssetGatepass! useAssetGatepass( id: Int! entry_or_exit: String! remarks: String companyId: Int ): AssetGatepass! cancelAssetGatepass(id: Int!, reason: String, companyId: Int): AssetGatepass!· # Traffic Violations createAssetTrafficViolation( input: CreateAssetTrafficViolationInput! companyId: Int ): AssetTrafficViolation! payAssetTrafficViolation( id: Int! paid_amount: Float! payment_reference: String deduct_from_wallet: Boolean companyId: Int ): AssetTrafficViolation! waiveAssetTrafficViolation( id: Int! waive_reason: String! companyId: Int ): AssetTrafficViolation!· # ============================================ # ASSET TYPE MUTATIONS # ============================================· createAssetType(input: CreateAssetTypeInput!): AssetType! updateAssetType(id: Int!, input: UpdateAssetTypeInput!): AssetType! deleteAssetType(id: Int!): Boolean! }· # Asset Location and Command Types type AssetCommandResponse { success: Boolean! command_id: String! message: String! method: String! execution_time_ms: Int! }· type AssetLocationPoint { id: Int! asset_id: Int device_id: String! latitude: Float! longitude: Float! altitude: Float speed: Float bearing: Float accuracy: Float timestamp: String! address: String fuel_level: Float engine_status: String ignition_status: String }· type IoTDeviceLocationHistory { device_id: String! device_name: String device_category: String points: [AssetLocationPoint!]! count: Int! }· type AssetLocationHistoryResponse { success: Boolean! count: Int! devices: [IoTDeviceLocationHistory!]! }· # Asset Management Types for API Integration· type Asset { id: ID! \"Human-readable display name\" name: String registration: String license_plate: String vin_sn: String asset_type: String state: String driver_name: String vehicle_model: String \"Base64-encoded icon from asset model (for map markers)\" model_icon: String \"IoT-derived operational state: moving | idle | stopped | offline\" status: String location: AssetLocation fuel_level: Float speed: Float bearing: Float odometer: Float last_update: String iot_devices: [AssetIoTDevice!] tags: [String!] ownership: AssetOwnership team: AssetTeam created_at: String updated_at: String }· type AssetLocation { latitude: Float longitude: Float address: String area: String timestamp: String bearing: Float }· type AssetOwnership { primary_owner: String ownership_type: String has_financial_claims: Boolean }· type DeleteResponse { success: Boolean! message: String }· type AssetMenuItem { id: String! name: String! url: String icon: String sequence: Int! parent_id: String children: [AssetMenuItem] }· type AssetModulePermissions { can_view: Boolean can_create: Boolean can_edit: Boolean can_delete: Boolean can_approve: Boolean }· type AssetModule { id: String! name: String! icon: String sequence: Int! parent_id: String enabled: Boolean! permissions: AssetModulePermissions! }· type AssetCompanyModules { id: Int! name: String! logo: String default: Boolean! modules: [AssetModule!]! }· type AssetCompanyFeatures { enabled_features: [String!]! feature_details: [AssetFeatureDetail!] total_enabled: Int }· type AssetFeatureDetail { code: String! name: String! description: String }· # User type for referencing users in various contexts type User { id: ID! name: String email: String username: String }· # Business Operations Types for Asset Management type DashboardSummary { assets: AssetSummary! enabled_features: [String!]! }· type AssetSummary { total: Int! active: Int! low_fuel: Int! financed: Int! }· type AssetFieldOptions { fuel_types: [FieldOption!]! vehicle_statuses: [FieldOption!]! transmission_types: [FieldOption!]! vehicle_types: [FieldOption!]! }· type FieldOption { value: String! label: String! icon: String color: String }· type AlertConfiguration { id: ID! asset_id: Int! alert_type: AlertType! threshold_value: Float! enabled: Boolean! notification_emails: [String!] created_at: String! updated_at: String! }· # Individual alert event recorded against an asset (asset.iot.alert in # Bifrost). The alert_type set is wider than the AlertType enum (which # only covers configurable thresholds), so it is exposed as String. type AssetAlert { id: ID! asset_id: Int! asset_name: String alert_type: String! severity: String! message: String! status: String! timestamp: String! }· enum AlertType { speed geofence acceleration idle fuel }· type AssetCommand { id: ID! asset_id: Int! command_type: CommandType! status: CommandStatus! parameters: JSON scheduled_at: String executed_at: String response: JSON created_by: User }· # Result of executeDeviceCommand — mirrors the Bifrost device-execute payload. type DeviceCommand { id: ID! command_code: String! status: CommandStatus! execution_time: String }· # Result of mintBleToken — mirrors the Bifrost ble-token mint payload # (/api/asset/ble-token/mint). type BleToken { # Base64 of the signed wire token to hand to the BLE device. token_b64: String! # Server-allocated token id. token_id: String! issued_at: String! valid_until: String! expires_in_sec: Int! # Granted permission bitmap (may be a subset of requested_perms). perms: Int! pin_required_perms: Int! }· enum CommandType { engine_cutoff engine_restore location_request geofence_check status_query }· enum CommandStatus { pending executing completed failed cancelled }· type BusinessModelConfig { id: ID! model_type: BusinessModelType! name: String! description: String base_rate: Float commission_percentage: Float parameters: JSON active: Boolean! }· enum BusinessModelType { rental lease per_order profit_sharing commission_based }· type MaintenanceTrigger { id: ID! asset_id: Int! trigger_type: TriggerType! condition_value: Float! maintenance_type: String! description: String enabled: Boolean! last_triggered: String }· type ScheduledMaintenance { id: ID! asset_id: Int! maintenance_type: String! scheduled_date: String! status: MaintenanceStatus! estimated_cost: Float actual_cost: Float notes: String }· enum MaintenanceStatus { scheduled in_progress completed cancelled overdue }· # Asset Creation Input Types input CreateAssetInput { # Basic Asset Information license_plate: String! chassis_number: String engine_number: String· # Asset Model and Brand model_id: Int model_name: String brand_name: String vehicle_type: String· # Driver Assignment driver_id: Int· # Purchase Information purchase_date: String purchase_price: Float· # Fuel Information fuel_type: String fuel_capacity: Float· # Physical Properties color: String year: Int odometer: Float· # Additional Information notes: String tags: [String] }· type CreateAssetResponse { success: Boolean! message: String! asset: Asset error: String }· # Asset Report Types type AssetReport { id: ID! title: String! description: String report_type: String! data: JSON generated_at: String! generated_by: String parameters: JSON }· type AssetReportMetrics { total_vehicles: Int! active_vehicles: Int! total_distance: Float! fuel_consumed: Float! avg_fuel_efficiency: Float! total_alerts: Int! maintenance_due: Int! expenses_total: Float! }· type AssetItemReport { asset_id: Int! license_plate: String! total_distance: Float! fuel_consumed: Float! fuel_efficiency: Float! alerts_count: Int! last_maintenance: String next_maintenance_due: String total_expenses: Float! location_updates: Int! }· type AssetDriverReport { driver_id: Int! driver_name: String! total_distance: Float! total_trips: Int! avg_speed: Float! alerts_count: Int! fuel_efficiency: Float! safety_score: Float! }· type AssetExpenseReport { category: String! total_amount: Float! transaction_count: Int! avg_amount: Float! percentage: Float! }· type AssetAlertReport { alert_type: String! count: Int! severity: String! resolved_count: Int! pending_count: Int! }· type AssetMaintenanceReport { asset_id: Int! license_plate: String! maintenance_type: String! last_service: String next_due: String cost: Float! status: String! }· # Traccar-style per-event report types· type AssetTripReport { id: ID! asset_id: Int! license_plate: String! driver_name: String state: String start_time: String end_time: String duration_minutes: Float! distance_km: Float! start_latitude: Float start_longitude: Float end_latitude: Float end_longitude: Float fuel_consumed: Float! }· type AssetStopReport { id: ID! asset_id: Int! license_plate: String! start_time: String end_time: String duration_minutes: Float! latitude: Float! longitude: Float! address: String engine_on: Boolean! }· type AssetEventReport { id: ID! asset_id: Int license_plate: String event_type: String! severity: String! timestamp: String message: String! latitude: Float longitude: Float }· # ============================================ # ASSET OPERATIONS TYPES # Trips, Locations, Challans, Gatepasses, Violations # ============================================· # Asset Location (Hubs, Warehouses, Depots) type AssetLocationFull { id: ID! name: String! code: String location_type: AssetLocationType! address: String city: String state: String pincode: String latitude: Float longitude: Float geofence_id: Int contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String active: Boolean! notes: String created_at: String updated_at: String }· enum AssetLocationType { hub warehouse depot customer other }· # Asset Trip type AssetTrip { id: ID! name: String! asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetTripState! trip_type: String start_location_id: Int start_location: AssetLocationFull end_location_id: Int end_location: AssetLocationFull planned_start_time: String planned_end_time: String actual_start_time: String actual_end_time: String start_odometer: Float end_odometer: Float distance_km: Float duration_minutes: Int start_latitude: Float start_longitude: Float end_latitude: Float end_longitude: Float fuel_consumed: Float notes: String challans: [AssetDeliveryChallan] created_at: String updated_at: String }· enum AssetTripState { draft planned assigned active completed cancelled }· # Asset Delivery Challan (LR/Consignment Notes) type AssetDeliveryChallan { id: ID! name: String! trip_id: Int trip: AssetTrip asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetChallanState! origin_location_id: Int origin_location: AssetLocationFull destination_location_id: Int destination_location: AssetLocationFull consignor_id: Int consignor_name: String consignee_id: Int consignee_name: String goods_description: String total_packages: Int total_weight: Float declared_value: Float freight_amount: Float loading_charges: Float unloading_charges: Float other_charges: Float total_amount: Float payment_mode: String payment_status: String scheduled_delivery_date: String actual_delivery_date: String pod_image: String pod_signature: String pod_received_by: String pod_remarks: String notes: String charges: [AssetChallanCharge] created_at: String updated_at: String }· enum AssetChallanState { draft confirmed in_transit delivered cancelled }· type AssetChallanCharge { id: ID! challan_id: Int! charge_type: String! description: String amount: Float! }· # Asset Gatepass type AssetGatepass { id: ID! name: String! gate_id: Int gate: AssetGate asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetGatepassState! pass_type: AssetGatepassType! purpose: String expected_entry_time: String expected_exit_time: String actual_entry_time: String actual_exit_time: String approved_by_id: Int approved_by_name: String approval_time: String entry_remarks: String exit_remarks: String notes: String valid_from: String valid_until: String created_at: String updated_at: String }· enum AssetGatepassState { pending approved denied used expired cancelled }· enum AssetGatepassType { entry exit both }· type AssetGate { id: ID! name: String! code: String location_id: Int location: AssetLocationFull gate_type: String active: Boolean! }· # Asset Traffic Violation type AssetTrafficViolation { id: ID! name: String! asset_id: Int! asset: Asset driver_id: Int driver_name: String state: AssetViolationState! violation_type: String! challan_number: String violation_date: String! violation_location: String fine_amount: Float! penalty_points: Int due_date: String paid_date: String paid_amount: Float payment_reference: String waived_by_id: Int waived_by_name: String waive_reason: String deduct_from_wallet: Boolean wallet_deduction_id: Int evidence_url: String notes: String created_at: String updated_at: String }· enum AssetViolationState { pending paid waived }· # Asset Operations Dashboard Summary type AssetOpsDashboardSummary { trips: AssetTripsSummary! challans: AssetChallansSummary! gatepasses: AssetGatepassesSummary! violations: AssetViolationsSummary! }· type AssetTripsSummary { total: Int! active: Int! completed_today: Int! planned: Int! }· type AssetChallansSummary { total: Int! in_transit: Int! delivered_today: Int! pending_pod: Int! }· type AssetGatepassesSummary { total: Int! pending_approval: Int! approved_today: Int! used_today: Int! }· type AssetViolationsSummary { total: Int! pending: Int! overdue: Int! total_pending_amount: Float! }· # Input types for Asset Operations input CreateAssetTripInput { asset_id: Int! driver_id: Int trip_type: String start_location_id: Int end_location_id: Int planned_start_time: String planned_end_time: String notes: String }· input UpdateAssetTripInput { driver_id: Int state: AssetTripState start_location_id: Int end_location_id: Int planned_start_time: String planned_end_time: String actual_start_time: String actual_end_time: String start_odometer: Float end_odometer: Float notes: String }· input CreateAssetDeliveryChallanInput { trip_id: Int asset_id: Int! driver_id: Int origin_location_id: Int destination_location_id: Int consignor_id: Int consignee_id: Int goods_description: String total_packages: Int total_weight: Float declared_value: Float freight_amount: Float loading_charges: Float unloading_charges: Float other_charges: Float payment_mode: String scheduled_delivery_date: String notes: String }· input UpdateAssetDeliveryChallanInput { state: AssetChallanState driver_id: Int destination_location_id: Int total_packages: Int total_weight: Float declared_value: Float freight_amount: Float scheduled_delivery_date: String notes: String }· input CapturePODInput { challan_id: Int! pod_image: String pod_signature: String pod_received_by: String! pod_remarks: String actual_delivery_date: String }· input CreateAssetGatepassInput { gate_id: Int asset_id: Int! driver_id: Int pass_type: AssetGatepassType! purpose: String expected_entry_time: String expected_exit_time: String valid_from: String valid_until: String notes: String }· input CreateAssetTrafficViolationInput { asset_id: Int! driver_id: Int violation_type: String! challan_number: String violation_date: String! violation_location: String fine_amount: Float! penalty_points: Int due_date: String evidence_url: String notes: String }· input CreateAssetLocationInput { name: String! code: String location_type: AssetLocationType! address: String city: String state: String pincode: String latitude: Float longitude: Float contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String notes: String }· input UpdateAssetLocationInput { name: String code: String location_type: AssetLocationType address: String city: String state: String pincode: String latitude: Float longitude: Float contact_person: String contact_phone: String contact_email: String operating_hours_start: String operating_hours_end: String active: Boolean notes: String } " 146 | 'm', 147 | ); > 148 | expect(s).toMatch(fieldPattern); | ^ 149 | }); 150 | }); 151 | }); at src/__tests__/execute-flow-step.e2e.test.ts:148:17 at Array.forEach () at Object. (src/__tests__/execute-flow-step.e2e.test.ts:143:7) Test Suites: 1 failed, 20 passed, 21 total Tests: 1 failed, 8 skipped, 152 passed, 161 total Snapshots: 0 total Time: 4.997 s Ran all test suites.  Pipeline failed on stage 'from-build-pack' : container 'step-build-npm-e2e'. The execution of the pipeline has stopped.