@aplaytest/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -0
- package/dist/bin.d.ts +11 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +21 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/safety.d.ts +52 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +87 -0
- package/dist/safety.js.map +1 -0
- package/dist/server.d.ts +46 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +100 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +49 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +291 -0
- package/dist/tools.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/zod/v3/helpers/typeAliases.d.cts","../../../node_modules/zod/v3/helpers/util.d.cts","../../../node_modules/zod/v3/ZodError.d.cts","../../../node_modules/zod/v3/locales/en.d.cts","../../../node_modules/zod/v3/errors.d.cts","../../../node_modules/zod/v3/helpers/parseUtil.d.cts","../../../node_modules/zod/v3/helpers/enumUtil.d.cts","../../../node_modules/zod/v3/helpers/errorUtil.d.cts","../../../node_modules/zod/v3/helpers/partialUtil.d.cts","../../../node_modules/zod/v3/standard-schema.d.cts","../../../node_modules/zod/v3/types.d.cts","../../../node_modules/zod/v3/external.d.cts","../../../node_modules/zod/v3/index.d.cts","../../../node_modules/zod/v4/core/json-schema.d.cts","../../../node_modules/zod/v4/core/standard-schema.d.cts","../../../node_modules/zod/v4/core/registries.d.cts","../../../node_modules/zod/v4/core/to-json-schema.d.cts","../../../node_modules/zod/v4/core/util.d.cts","../../../node_modules/zod/v4/core/versions.d.cts","../../../node_modules/zod/v4/core/schemas.d.cts","../../../node_modules/zod/v4/core/checks.d.cts","../../../node_modules/zod/v4/core/errors.d.cts","../../../node_modules/zod/v4/core/core.d.cts","../../../node_modules/zod/v4/core/parse.d.cts","../../../node_modules/zod/v4/core/regexes.d.cts","../../../node_modules/zod/v4/locales/ar.d.cts","../../../node_modules/zod/v4/locales/az.d.cts","../../../node_modules/zod/v4/locales/be.d.cts","../../../node_modules/zod/v4/locales/bg.d.cts","../../../node_modules/zod/v4/locales/ca.d.cts","../../../node_modules/zod/v4/locales/cs.d.cts","../../../node_modules/zod/v4/locales/da.d.cts","../../../node_modules/zod/v4/locales/de.d.cts","../../../node_modules/zod/v4/locales/el.d.cts","../../../node_modules/zod/v4/locales/en.d.cts","../../../node_modules/zod/v4/locales/eo.d.cts","../../../node_modules/zod/v4/locales/es.d.cts","../../../node_modules/zod/v4/locales/fa.d.cts","../../../node_modules/zod/v4/locales/fi.d.cts","../../../node_modules/zod/v4/locales/fr.d.cts","../../../node_modules/zod/v4/locales/fr-CA.d.cts","../../../node_modules/zod/v4/locales/he.d.cts","../../../node_modules/zod/v4/locales/hr.d.cts","../../../node_modules/zod/v4/locales/hu.d.cts","../../../node_modules/zod/v4/locales/hy.d.cts","../../../node_modules/zod/v4/locales/id.d.cts","../../../node_modules/zod/v4/locales/is.d.cts","../../../node_modules/zod/v4/locales/it.d.cts","../../../node_modules/zod/v4/locales/ja.d.cts","../../../node_modules/zod/v4/locales/ka.d.cts","../../../node_modules/zod/v4/locales/kh.d.cts","../../../node_modules/zod/v4/locales/km.d.cts","../../../node_modules/zod/v4/locales/ko.d.cts","../../../node_modules/zod/v4/locales/lt.d.cts","../../../node_modules/zod/v4/locales/mk.d.cts","../../../node_modules/zod/v4/locales/ms.d.cts","../../../node_modules/zod/v4/locales/nl.d.cts","../../../node_modules/zod/v4/locales/no.d.cts","../../../node_modules/zod/v4/locales/ota.d.cts","../../../node_modules/zod/v4/locales/ps.d.cts","../../../node_modules/zod/v4/locales/pl.d.cts","../../../node_modules/zod/v4/locales/pt.d.cts","../../../node_modules/zod/v4/locales/ro.d.cts","../../../node_modules/zod/v4/locales/ru.d.cts","../../../node_modules/zod/v4/locales/sl.d.cts","../../../node_modules/zod/v4/locales/sv.d.cts","../../../node_modules/zod/v4/locales/ta.d.cts","../../../node_modules/zod/v4/locales/th.d.cts","../../../node_modules/zod/v4/locales/tr.d.cts","../../../node_modules/zod/v4/locales/ua.d.cts","../../../node_modules/zod/v4/locales/uk.d.cts","../../../node_modules/zod/v4/locales/ur.d.cts","../../../node_modules/zod/v4/locales/uz.d.cts","../../../node_modules/zod/v4/locales/vi.d.cts","../../../node_modules/zod/v4/locales/zh-CN.d.cts","../../../node_modules/zod/v4/locales/zh-TW.d.cts","../../../node_modules/zod/v4/locales/yo.d.cts","../../../node_modules/zod/v4/locales/index.d.cts","../../../node_modules/zod/v4/core/doc.d.cts","../../../node_modules/zod/v4/core/api.d.cts","../../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../../node_modules/zod/v4/core/index.d.cts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.d.ts","../../../node_modules/zod/v4/classic/errors.d.cts","../../../node_modules/zod/v4/classic/parse.d.cts","../../../node_modules/zod/v4/classic/schemas.d.cts","../../../node_modules/zod/v4/classic/checks.d.cts","../../../node_modules/zod/v4/classic/compat.d.cts","../../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../../node_modules/zod/v4/classic/iso.d.cts","../../../node_modules/zod/v4/classic/coerce.d.cts","../../../node_modules/zod/v4/classic/external.d.cts","../../../node_modules/zod/v4/classic/index.d.cts","../../../node_modules/zod/v4/index.d.cts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/auth/types.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/types.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/shared/transport.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/types.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/shared/responseMessage.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.d.ts","../../../node_modules/json-schema-typed/draft_2020_12.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/validation/types.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/shared/uriTemplate.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.d.ts","../../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.d.ts","../../core/dist/taxonomy/kinds.d.ts","../../core/dist/locator/stability.d.ts","../../core/dist/evidence/types.d.ts","../../core/dist/taxonomy/classify.d.ts","../../core/dist/taxonomy/parse-error.d.ts","../../core/dist/version.d.ts","../../core/dist/evidence/id.d.ts","../../core/dist/evidence/redact.d.ts","../../core/dist/evidence/store.d.ts","../../core/dist/history/types.d.ts","../../core/dist/history/store.d.ts","../../core/dist/history/memory-index.d.ts","../../core/dist/history/url.d.ts","../../core/dist/history/ingest.d.ts","../../core/dist/history/playwright-report.d.ts","../../core/dist/history/ingest-playwright.d.ts","../../../node_modules/zod/index.d.cts","../../core/dist/config/schema.d.ts","../../core/dist/index.d.ts","../../author/dist/mutants.d.ts","../../author/dist/gate.d.ts","../../author/dist/ground.d.ts","../../author/dist/index.d.ts","../../flaky/dist/score.d.ts","../../flaky/dist/features.d.ts","../../flaky/dist/classify.d.ts","../../flaky/dist/analyze.d.ts","../../flaky/dist/quarantine.d.ts","../../flaky/dist/codemod.d.ts","../../flaky/dist/bisect.d.ts","../../flaky/dist/index.d.ts","../../heal/dist/patch.d.ts","../../heal/dist/candidates.d.ts","../../heal/dist/resolve.d.ts","../../heal/dist/validate.d.ts","../../heal/dist/propose.d.ts","../../heal/dist/ledger.d.ts","../../heal/dist/index.d.ts","../../impact/dist/graph.d.ts","../../impact/dist/coverage.d.ts","../../impact/dist/select.d.ts","../../impact/dist/index.d.ts","../src/tools.ts","../src/safety.ts","../src/server.ts","../src/bin.ts","../src/index.ts","../../../node_modules/@types/deep-eql/index.d.ts","../../../node_modules/assertion-error/index.d.ts","../../../node_modules/@types/chai/index.d.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/ssh2/index.d.ts","../../../node_modules/@types/docker-modem/index.d.ts","../../../node_modules/@types/dockerode/index.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/ssh2-streams/index.d.ts"],"fileIdsList":[[145,158,160,163,227,277,294,295],[145,158,161,170,227,277,294,295],[145,158,162,163,167,227,277,294,295],[158,227,277,294,295],[227,277,294,295],[145,158,163,165,166,227,277,294,295],[145,158,159,161,163,167,168,169,227,277,294,295],[158,159,227,277,294,295,309],[74,144,227,277,294,295],[145,157,158,159,161,162,227,277,294,295],[156,157,227,277,294,295],[164,227,277,294,295],[219,220,227,277,294,295],[227,277,291,294,295,297,309,327,328],[227,277,288,294,295,309,327,328,329],[227,274,275,277,294,295],[227,276,277,294,295],[277,294,295],[227,277,282,294,295,312],[227,277,278,283,288,294,295,297,309,320],[227,277,278,279,288,294,295,297],[222,223,224,227,277,294,295],[227,277,280,294,295,321],[227,277,281,282,289,294,295,298],[227,277,282,294,295,309,317],[227,277,283,285,288,294,295,297],[227,276,277,284,294,295],[227,277,285,286,294,295],[227,277,287,288,294,295],[227,276,277,288,294,295],[227,277,288,289,290,294,295,309,320],[227,277,288,289,290,294,295,304,309,312],[227,269,277,285,288,291,294,295,297,309,320],[227,277,288,289,291,292,294,295,297,309,317,320],[227,277,291,293,294,295,309,317,320],[225,226,227,228,229,230,231,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326],[227,277,288,294,295],[227,277,294,295,296,320],[227,277,285,288,294,295,297,309],[227,277,294,295,298],[227,277,294,295,299],[227,276,277,294,295,300],[227,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326],[227,277,294,295,302],[227,277,294,295,303],[227,277,288,294,295,304,305],[227,277,294,295,304,306,321,323],[227,277,289,294,295],[227,277,288,294,295,309,310,312],[227,277,294,295,311,312],[227,277,294,295,309,310],[227,277,294,295,312],[227,277,294,295,313],[227,274,277,294,295,309,314,320],[227,277,288,294,295,315,316],[227,277,294,295,315,316],[227,277,282,294,295,297,309,317],[227,277,294,295,318],[227,277,294,295,297,319],[227,277,291,294,295,303,320],[227,277,282,294,295,321],[227,277,294,295,309,322],[227,277,294,295,296,323],[227,277,294,295,324],[227,269,277,294,295],[227,269,277,288,290,294,295,300,309,312,320,322,323,325],[227,277,294,295,309,326],[227,277,294,295,309,327],[227,277,288,291,293,294,295,297,309,327],[227,241,245,277,294,295,320],[227,241,277,294,295,309,320],[227,236,277,294,295],[227,238,241,277,294,295,317,320],[227,277,294,295,297,317],[227,277,294,295,327],[227,236,277,294,295,327],[227,238,241,277,294,295,297,320],[227,233,234,237,240,277,288,294,295,309,320],[227,241,248,277,294,295],[227,233,239,277,294,295],[227,241,262,263,277,294,295],[227,237,241,277,294,295,312,320,327],[227,262,277,294,295,327],[227,235,236,277,294,295,327],[227,241,277,294,295],[227,235,236,237,238,239,240,241,242,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,263,264,265,266,267,268,277,294,295],[227,241,256,277,294,295],[227,241,248,249,277,294,295],[227,239,241,249,250,277,294,295],[227,240,277,294,295],[227,233,236,241,277,294,295],[227,241,245,249,250,277,294,295],[227,245,277,294,295],[227,239,241,244,277,294,295,320],[227,233,238,241,248,277,294,295],[227,277,294,295,309],[227,236,241,262,277,294,295,325,327],[154,227,277,294,295],[62,63,74,227,277,294,295],[64,65,227,277,294,295],[62,63,64,66,67,72,227,277,294,295],[63,64,227,277,294,295],[72,227,277,294,295],[73,227,277,294,295],[64,227,277,294,295],[62,63,64,67,68,69,70,71,227,277,294,295],[144,227,277,294,295],[144,148,227,277,294,295],[79,139,142,144,146,147,148,149,150,151,152,153,227,277,294,295],[75,77,148,227,277,294,295],[144,146,227,277,294,295],[76,144,147,227,277,294,295],[77,79,81,82,83,84,227,277,294,295],[79,81,83,84,227,277,294,295],[79,81,83,227,277,294,295],[76,79,81,82,84,227,277,294,295],[75,77,78,79,80,81,82,83,84,85,86,139,140,141,142,143,227,277,294,295],[75,77,78,81,227,277,294,295],[77,78,81,227,277,294,295],[81,84,227,277,294,295],[75,76,78,79,80,82,83,84,227,277,294,295],[75,76,77,81,144,227,277,294,295],[81,82,83,84,227,277,294,295],[155,227,277,294,295],[83,227,277,294,295],[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,227,277,294,295],[191,227,277,294,295],[191,192,193,227,277,294,295],[188,227,277,294,295],[174,227,277,294,295],[172,173,227,277,294,295],[182,185,186,227,277,294,295],[182,227,277,294,295],[181,182,227,277,294,295],[181,227,277,294,295],[172,174,227,277,294,295],[172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,227,277,294,295],[190,195,196,197,227,277,294,295],[197,227,277,294,295],[195,196,227,277,294,295],[190,227,277,294,295],[195,196,197,198,199,200,201,227,277,294,295],[203,204,205,206,207,208,227,277,294,295],[206,207,227,277,294,295],[190,203,204,206,227,277,294,295],[203,227,277,294,295],[210,211,212,227,277,294,295],[210,211,227,277,294,295],[215,216,227,277,294,295],[214,215,216,227,277,294,295],[170,171,190,214,215,227,277,294,295],[188,190,194,202,209,213,227,277,290,294,295,299]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"36eb5babc665b890786550d4a8cb20ef7105673a6d5551fbdd7012877bb26942","impliedFormat":1},{"version":"fec412ded391a7239ef58f455278154b62939370309c1fed322293d98c8796a6","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"93c3e73824ad57f98fd23b39335dbdae2db0bd98199b0dc0b9ccc60bf3c5134a","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"0648a8c200b5544e30677f7f7059b1e384d6cab716c82659716457e3f317ebae","impliedFormat":99},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"d8bc0c5487582c6d887c32c92d8b4ffb23310146fcb1d82adf4b15c77f57c4ac","impliedFormat":1},{"version":"8cb31102790372bebfd78dd56d6752913b0f3e2cefbeb08375acd9f5ba737155","impliedFormat":1},{"version":"f17ed72d1b1882ab6dc66d45e699f757d15bba0807af2fc9c3ec98fe367611c1","impliedFormat":99},{"version":"b1067ccb56b38af060dc3299ea7c4c6362cad4f07d0d454325a74808204fc801","impliedFormat":99},{"version":"7bb43a0f0180ad87b0a944ef95be8615d4c1d621a93ae503a8fcdee2027243ef","impliedFormat":99},{"version":"ba678532514244768286bdfdc82b33f072d5de4e9d281a75bcccdba9970788d7","impliedFormat":99},{"version":"0b79f95a79497386c50f38bafbbf59154619e51d7bbe5acf61cd376d3c9d77b9","impliedFormat":99},{"version":"5993793a23b298afd20c2e1cd2bf8468cc7e9415d314d0771e93dd8b2e389d28","impliedFormat":99},{"version":"05267740a5cff4399995b08326a2e250f229e9926f453162192b9b96b853a12b","impliedFormat":99},{"version":"104fae9b53b5eaa040d9ce626e1bf0b3e6e27d269a899a98a4a28358cdcbc155","impliedFormat":99},{"version":"50a6aa665f3a2e769a4d683f9f74cd15164d0947fb957d8016331b170ab8b643","impliedFormat":99},{"version":"6b83491ca98ce7dc82ec0c54f1456705c9ea08f5a39fa8cea17134b28e2a73d7","impliedFormat":99},{"version":"33aa2f336bb0bc598652ddd1ad3095ef7a14e4dbed9cf829fa9357e989fff31a","impliedFormat":99},{"version":"d691e546590145171d00d78b341bd3ca4844c96eb34f870be84058a1cab585c3","impliedFormat":99},{"version":"c9d12ca3f67129b3ed2b81bf54537c970673cedd05ba28fbeba70c1e8aff684b","impliedFormat":99},{"version":"6f0b69f7afb2ff04a4b73fae6b43476c14349a438881c7a8c3d34cbad2c2bf3b","impliedFormat":99},{"version":"e8b1b4448f077d5a459acb418b7122bfb2f48fec26d59b5586778e1b3def2d2c","impliedFormat":99},{"version":"717f3d25205cb7aa457015fff8e21404fd000c53d65ebdbdedb51357c0ebe7e4","impliedFormat":99},{"version":"3a1521b2fd53734414b37c13230f2b50fbb8abb7e5a7e2d0088ae9c5adcedefd","impliedFormat":99},{"version":"f307dd9e98c0dd2eac07116cbff921047ce37ce578ffbdd2ceb24d6944341f58","impliedFormat":99},{"version":"6a07000e612ab26985fd379c93208a064e3ce4e87d109b49104b8f9ed2931268","impliedFormat":99},{"version":"c797dcf68a38d70efcfd0717e1cde4ceebb80c652d2630460f538e51a5e995f6","impliedFormat":99},{"version":"3c3bddc6344d4d31d83571cfbc0a0a43fefe8f2d863f1bf2bb738c12d73a5b96","impliedFormat":99},{"version":"187a77c78a8fb3c12cb0706c78c4986518527593a6fed4a516d1b18fcf283004","impliedFormat":99},{"version":"3c211d80f5b7543fdfa63b0962082b694bae2c00825314a19666af3d4ec60bed","impliedFormat":99},{"version":"6823183be31f0db3e2ed971e7b1c618bb681e5a83533ab026ea4b1a21575fdb4","impliedFormat":99},{"version":"d509894f9ecc0ca841c5f8fd269a4fe82f52323b8e016d07a1c593222905b3ee","impliedFormat":99},{"version":"933d85a3c2a78c17a493a0bd5fbe7065ce01f24c2f785b52792b178deb668210","impliedFormat":99},{"version":"81bdeb68b2554c68839b880d88bcbe2648edb81d8369c3b17ad22209a1ea8fe8","impliedFormat":99},{"version":"6bda8e7bd000605c09dd921fbcda240fee8121ba366c506956fcce546b1b7899","impliedFormat":99},{"version":"f17c6226d5e20284d8fdb567969ab21f08c0f4dd8492c13b952419f79c7ee43d","impliedFormat":99},{"version":"c52515057d9eab723b77cc3fa0cbd4fb1548fe0f5f03dd53f9f1ed871beb108b","impliedFormat":99},{"version":"b508da1c92e3d669855527d2e4dcf2ca266b9e192b3c5df2fa50f03a39159092","impliedFormat":99},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"23b7719fd261ad7f952ba1de0bca96bf9f98e8277715a4e85c411c1aab9d6410","impliedFormat":99},{"version":"f6804919eefe16c55372d52c152cbcf64ead302377193dd825e21bf5bb1a8eb0","impliedFormat":99},{"version":"b97d04bcf2ec75c0c799e2c959dfdd2a3f1608bbc77e39e2992d70bb0ac34b13","impliedFormat":99},{"version":"4f526e0d0eb09cee754a7226eda68c5b39bf1aba20c82585e1550a4d61491928","impliedFormat":99},{"version":"d1d1195a8db8c59d2f24a0a3274572e2ab7c952d70defc330b1288bea89b6acc","impliedFormat":99},{"version":"382432ee6020295e76961fea57e2a15a125f171a56fd03bf4043dc2b30e9c544","impliedFormat":99},{"version":"5da92e27e3af10be13101b6de190045b45d9239b2fa68dc114de693f1bf0ba04","impliedFormat":99},{"version":"d177d03e4578d1efdf3eebc1cf4950b2493b84c8390e41cb486491c3b61d07f3","impliedFormat":99},{"version":"50c1b8c7972a6991d02cee472871e5c658ae16a12bc55e56a633fd767eb6da31","impliedFormat":99},{"version":"d989aed75e5dd2a44c410ea63ffc5520290788bb071c09543b577314feb5dd2f","impliedFormat":99},{"version":"91de5dad2a36f6da57e6ca55ae650a71d8d4e76800700c8a20994cd1b9a0f3be","impliedFormat":99},{"version":"c5b8e480fd5acee9ed17458c39c84db4145afa07c57c3664124cdba425061232","impliedFormat":99},{"version":"a42a1e88e2c57b16efd5f6e607eb2a19e9a5de3fcf0351941969ca1c6c442a1f","impliedFormat":99},{"version":"5205206fc99dece117f783bbc331eb13b941a9029f7f9d9c0a2fd2b9f180cd3c","impliedFormat":99},{"version":"612331a099567e22f40f171c27d5e83682a04b97f8ad5062cfb584f715b5507f","impliedFormat":99},{"version":"20f311c666d0e2d0e3eed6bb641ab877e41db9d41f4d386ec5c59dddb97c5680","impliedFormat":99},{"version":"0ae094bf77a709c91a5ef8645d090b2719aab56bbcc0d99e61a3f2fab26c2b30","impliedFormat":99},{"version":"9f260f4d3aebfc39dee9d23775da1ad5b04e4e9de4b8cbb0ce1f66f4fec6696c","impliedFormat":99},{"version":"bc07a90397006695c34cc7d63ae60a2aacc867fa0477cead7864dcdf22d83b1b","impliedFormat":99},{"version":"b7018ee1dfd105d7f1369e07019843f3ce051bd2fb5231abd93fd157b3041734","impliedFormat":99},{"version":"3a2411d0d17e0eee03cfe2d3a95ccd29844be2b02a2be7d74a9c7a85cb795110","impliedFormat":99},{"version":"c4982be6010d5f63582b325999a75581386617918cc746344f171f5e21981cd3","impliedFormat":99},{"version":"1501edef689f32b9ab954c9e67f7bbfe5de43dc6e96e9ac5d2124d738deee4d3","impliedFormat":99},{"version":"c9efcea091f1f98bd3fb0dafe92a1c845ae7d09fdf53be68d3571b4f9975dfb1","impliedFormat":99},{"version":"8f8f58f505dd9fe6593b08a5e3db93f0c4d58444cb09998b4ceed1237416aa08","impliedFormat":99},{"version":"7be003ead9f25c446b1ad0d8ad906d62771cdc6fa67bf29e19314b266037797b","signature":"74a16bb2ef751515ec205ceb53615274e348ed0aaaa665fd3b8be58787aaec57","impliedFormat":99},{"version":"a1fb0553b247463cc16d1c22e3010edd6dff7dd452bf322139ba92f4ac202a97","signature":"ac8cc7cd1a36cad30f7fc0ec0eaeccdfd925029e112bb5b36ed760e5292d8786","impliedFormat":99},{"version":"b816eb4951f56a64da3006add04d33f5308b74083d85cbdfa9ca55f7d237d57f","signature":"29dc8d773608c18b3f87f898017161a866847afe86f07e4ae0dee885f4e38215","impliedFormat":99},{"version":"69564a890dbe84bde64463741778f085c7f0ce355e2901f9b82890a7811c1138","signature":"fc2e27227469487566e3c31e5abe9cf7bd82a77b280fad4c6c0153bc8b2ef201","impliedFormat":99},{"version":"f403c5bb74456fd19230a5aec5c223fa76b0a06db683947e41f505c4ebe7a954","signature":"ee58c7459d4bb5df41d5a52b408b68d05718f5cbbd35403a067493cb993923e2","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"4371055bb001f40596e2e236b27583e13bf11e75d937962f8947d56519237fb8","impliedFormat":1},{"version":"89189df027e8910200a4b65af1e29a996225cf25975f5c438fbe9361c008fc6b","impliedFormat":1},{"version":"4555baaea5dfc93e0c0ba3fc326b0ba3ad50bb2ab887fa2dff49c7da7bd3bcaa","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"2e23be37a190953f60cdc4a62f89e5dfe4d6c64f38c71564bc0fb63c7810c9a1","impliedFormat":1}],"root":[[214,218]],"options":{"allowUnreachableCode":false,"allowUnusedLabels":false,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noPropertyAccessFromIndexSignature":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":10,"tsBuildInfoFile":"./.tsbuildinfo","useUnknownInCatchVariables":true,"verbatimModuleSyntax":true},"referencedMap":[[161,1],[169,2],[166,3],[160,4],[157,5],[167,6],[170,7],[171,8],[145,9],[163,10],[162,4],[159,4],[168,5],[158,11],[165,12],[221,13],[219,5],[329,14],[330,15],[331,5],[274,16],[275,16],[276,17],[227,18],[277,19],[278,20],[279,21],[222,5],[225,22],[223,5],[224,5],[280,23],[281,24],[282,25],[283,26],[284,27],[285,28],[286,28],[287,29],[288,30],[289,31],[290,32],[228,5],[226,5],[291,33],[292,34],[293,35],[327,36],[294,37],[295,5],[296,38],[297,39],[298,40],[299,41],[300,42],[301,43],[302,44],[303,45],[304,46],[305,46],[306,47],[307,5],[308,48],[309,49],[311,50],[310,51],[312,52],[313,53],[314,54],[315,55],[316,56],[317,57],[318,58],[319,59],[320,60],[321,61],[322,62],[323,63],[324,64],[229,5],[230,5],[231,5],[270,65],[271,5],[272,5],[273,52],[325,66],[326,67],[332,68],[328,69],[220,5],[232,5],[164,5],[60,5],[61,5],[12,5],[11,5],[2,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[3,5],[21,5],[22,5],[4,5],[23,5],[27,5],[24,5],[25,5],[26,5],[28,5],[29,5],[30,5],[5,5],[31,5],[32,5],[33,5],[34,5],[6,5],[38,5],[35,5],[36,5],[37,5],[39,5],[7,5],[40,5],[45,5],[46,5],[41,5],[42,5],[43,5],[44,5],[8,5],[50,5],[47,5],[48,5],[49,5],[51,5],[9,5],[52,5],[53,5],[54,5],[56,5],[55,5],[57,5],[58,5],[10,5],[59,5],[1,5],[248,70],[258,71],[247,70],[268,72],[239,73],[238,74],[267,75],[261,76],[266,77],[241,78],[255,79],[240,80],[264,81],[236,82],[235,75],[265,83],[237,84],[242,85],[243,5],[246,85],[233,5],[269,86],[259,87],[250,88],[251,89],[253,90],[249,91],[252,92],[262,75],[244,93],[245,94],[254,95],[234,96],[257,87],[256,85],[260,5],[263,97],[188,98],[64,99],[66,100],[73,101],[68,5],[69,5],[67,102],[70,103],[62,5],[63,5],[74,104],[65,105],[71,5],[72,106],[149,107],[153,108],[150,108],[146,107],[154,109],[151,110],[155,98],[152,108],[147,111],[148,112],[141,113],[82,114],[84,115],[140,5],[83,116],[144,117],[143,118],[142,119],[75,5],[85,114],[86,5],[77,120],[81,121],[76,5],[78,122],[79,123],[80,5],[156,124],[87,125],[88,125],[89,125],[90,125],[91,125],[92,125],[93,125],[94,125],[95,125],[96,125],[97,125],[98,125],[99,125],[100,125],[102,125],[101,125],[103,125],[104,125],[105,125],[106,125],[107,125],[139,126],[108,125],[109,125],[110,125],[111,125],[112,125],[113,125],[114,125],[115,125],[116,125],[117,125],[118,125],[119,125],[120,125],[122,125],[121,125],[123,125],[124,125],[125,125],[126,125],[127,125],[128,125],[129,125],[130,125],[131,125],[132,125],[133,125],[134,125],[135,125],[138,125],[136,125],[137,125],[192,127],[193,5],[194,128],[191,5],[189,129],[178,130],[179,5],[180,130],[174,131],[187,132],[185,133],[183,134],[186,135],[182,135],[181,136],[184,5],[190,137],[173,5],[175,136],[172,5],[176,5],[177,5],[198,138],[201,139],[197,140],[200,5],[196,141],[202,142],[199,5],[195,141],[204,141],[209,143],[208,144],[203,5],[207,145],[205,146],[206,5],[211,5],[210,5],[213,147],[212,148],[217,149],[218,150],[215,141],[216,151],[214,152]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* stdio entry point. Configure in a client as:
|
|
4
|
+
*
|
|
5
|
+
* { "mcpServers": { "atest": { "command": "npx", "args": ["-y", "@aplaytest/mcp"] } } }
|
|
6
|
+
*
|
|
7
|
+
* Nothing is written to stdout except the protocol itself — a stray log line
|
|
8
|
+
* corrupts the stream and the session dies with no useful error.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=bin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* stdio entry point. Configure in a client as:
|
|
4
|
+
*
|
|
5
|
+
* { "mcpServers": { "atest": { "command": "npx", "args": ["-y", "@aplaytest/mcp"] } } }
|
|
6
|
+
*
|
|
7
|
+
* Nothing is written to stdout except the protocol itself — a stray log line
|
|
8
|
+
* corrupts the stream and the session dies with no useful error.
|
|
9
|
+
*/
|
|
10
|
+
import { startStdioServer } from './server.js';
|
|
11
|
+
import { safetyFromEnv } from './safety.js';
|
|
12
|
+
const cwd = process.env['ATEST_CWD'] ?? process.cwd();
|
|
13
|
+
await startStdioServer({
|
|
14
|
+
context: {
|
|
15
|
+
cwd,
|
|
16
|
+
evidenceDir: process.env['ATEST_EVIDENCE_DIR'] ?? `${cwd}/.atest/evidence`,
|
|
17
|
+
runsDir: process.env['ATEST_RUNS_DIR'] ?? `${cwd}/.atest/runs`,
|
|
18
|
+
},
|
|
19
|
+
safety: safetyFromEnv(),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAEtD,MAAM,gBAAgB,CAAC;IACrB,OAAO,EAAE;QACP,GAAG;QACH,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,GAAG,GAAG,kBAAkB;QAC1E,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,GAAG,cAAc;KAC/D;IACD,MAAM,EAAE,aAAa,EAAE;CACxB,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aplaytest/mcp — a façade over the same engine calls the CLI makes.
|
|
3
|
+
*
|
|
4
|
+
* Read-only by default. Mutating tools need both ATEST_MCP_WRITE=1 and an
|
|
5
|
+
* explicit `confirm: true`, because "the agent changed my files while I was
|
|
6
|
+
* asking it questions" is the failure people rightly fear.
|
|
7
|
+
*/
|
|
8
|
+
export { createServer, startStdioServer } from './server.js';
|
|
9
|
+
export type { ServerOptions } from './server.js';
|
|
10
|
+
export { ALL_TOOLS, listFailures, getFailure, flakyQuery, impact, proposeHealTool } from './tools.js';
|
|
11
|
+
export type { ToolContext, ToolDefinition } from './tools.js';
|
|
12
|
+
export { gate, sanitise, safetyFromEnv, WRITE_TOOLS, DEFAULT_SAFETY, MCP_WRITE_ENV, MCP_WRITE_ENABLED, } from './safety.js';
|
|
13
|
+
export type { SafetyConfig, GateResult } from './safety.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtG,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aplaytest/mcp — a façade over the same engine calls the CLI makes.
|
|
3
|
+
*
|
|
4
|
+
* Read-only by default. Mutating tools need both ATEST_MCP_WRITE=1 and an
|
|
5
|
+
* explicit `confirm: true`, because "the agent changed my files while I was
|
|
6
|
+
* asking it questions" is the failure people rightly fear.
|
|
7
|
+
*/
|
|
8
|
+
export { createServer, startStdioServer } from './server.js';
|
|
9
|
+
export { ALL_TOOLS, listFailures, getFailure, flakyQuery, impact, proposeHealTool } from './tools.js';
|
|
10
|
+
export { gate, sanitise, safetyFromEnv, WRITE_TOOLS, DEFAULT_SAFETY, MCP_WRITE_ENV, MCP_WRITE_ENABLED, } from './safety.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGtG,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
package/dist/safety.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP safety layer.
|
|
3
|
+
*
|
|
4
|
+
* This server runs with the user's filesystem permissions and is driven by a
|
|
5
|
+
* model. Three independent gates, because "the agent applied a patch I never
|
|
6
|
+
* saw" is the failure people rightly fear:
|
|
7
|
+
*
|
|
8
|
+
* 1. READ-ONLY BY DEFAULT. Mutating tools need `ATEST_MCP_WRITE=1`. A fresh
|
|
9
|
+
* install can inspect everything and change nothing.
|
|
10
|
+
* 2. EXPLICIT CONFIRMATION. Every mutating call must also pass
|
|
11
|
+
* `confirm: true`, so a model cannot mutate by accident while exploring.
|
|
12
|
+
* 3. RESPONSE HYGIENE. Size caps and redaction, because evidence bundles
|
|
13
|
+
* from an authenticated suite WILL contain bearer tokens and those must
|
|
14
|
+
* never reach a model.
|
|
15
|
+
*/
|
|
16
|
+
export declare const WRITE_TOOLS: ReadonlySet<string>;
|
|
17
|
+
export interface SafetyConfig {
|
|
18
|
+
readonly writeEnabled: boolean;
|
|
19
|
+
/** Cap per response. Over-cap content is truncated with an explicit marker. */
|
|
20
|
+
readonly maxResponseChars: number;
|
|
21
|
+
readonly redactKeys: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
export declare const DEFAULT_SAFETY: SafetyConfig;
|
|
24
|
+
export declare const MCP_WRITE_ENV = "ATEST_MCP_WRITE";
|
|
25
|
+
export declare const MCP_WRITE_ENABLED = "1";
|
|
26
|
+
/**
|
|
27
|
+
* Read MCP safety from the environment.
|
|
28
|
+
*
|
|
29
|
+
* @param env - Defaults to `process.env`. `ATEST_MCP_WRITE=1` enables writes.
|
|
30
|
+
* @returns A config whose `writeEnabled` is false unless the env explicitly
|
|
31
|
+
* opts in. Size caps and redact keys always come from {@link DEFAULT_SAFETY}.
|
|
32
|
+
*/
|
|
33
|
+
export declare function safetyFromEnv(env?: Readonly<Record<string, string | undefined>>): SafetyConfig;
|
|
34
|
+
export interface GateResult {
|
|
35
|
+
readonly ok: boolean;
|
|
36
|
+
readonly error?: string;
|
|
37
|
+
readonly message?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function gate(toolName: string, input: unknown, config: SafetyConfig): GateResult;
|
|
40
|
+
export interface SanitisedPayload {
|
|
41
|
+
readonly text: string;
|
|
42
|
+
readonly truncated: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Redact, serialise, and cap.
|
|
46
|
+
*
|
|
47
|
+
* Truncation is always MARKED. A silently shortened ARIA snapshot would lead a
|
|
48
|
+
* model to conclude an element is absent when it was merely cut off — which is
|
|
49
|
+
* exactly the wrong answer for a healing tool.
|
|
50
|
+
*/
|
|
51
|
+
export declare function sanitise(value: unknown, config: SafetyConfig): SanitisedPayload;
|
|
52
|
+
//# sourceMappingURL=safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAU1C,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,cAAc,EAAE,YAI5B,CAAC;AAEF,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAAG,YAAY,CAE3G;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAwBvF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,gBAAgB,CAY/E"}
|
package/dist/safety.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP safety layer.
|
|
3
|
+
*
|
|
4
|
+
* This server runs with the user's filesystem permissions and is driven by a
|
|
5
|
+
* model. Three independent gates, because "the agent applied a patch I never
|
|
6
|
+
* saw" is the failure people rightly fear:
|
|
7
|
+
*
|
|
8
|
+
* 1. READ-ONLY BY DEFAULT. Mutating tools need `ATEST_MCP_WRITE=1`. A fresh
|
|
9
|
+
* install can inspect everything and change nothing.
|
|
10
|
+
* 2. EXPLICIT CONFIRMATION. Every mutating call must also pass
|
|
11
|
+
* `confirm: true`, so a model cannot mutate by accident while exploring.
|
|
12
|
+
* 3. RESPONSE HYGIENE. Size caps and redaction, because evidence bundles
|
|
13
|
+
* from an authenticated suite WILL contain bearer tokens and those must
|
|
14
|
+
* never reach a model.
|
|
15
|
+
*/
|
|
16
|
+
import { redact } from '@aplaytest/core';
|
|
17
|
+
export const WRITE_TOOLS = new Set([
|
|
18
|
+
// Reserved names: not registered today. Kept in the gate so a future
|
|
19
|
+
// mutating tool cannot ship without both ATEST_MCP_WRITE and confirm: true.
|
|
20
|
+
'atest_apply_heal',
|
|
21
|
+
'atest_quarantine',
|
|
22
|
+
// The gate restores the spec it mutates, so it leaves no net change — but it
|
|
23
|
+
// DOES rewrite a tracked file for the duration of several Playwright runs.
|
|
24
|
+
// A process killed mid-gate leaves a mutated spec and a .atest-gate-backup
|
|
25
|
+
// beside it, which is a working-tree change whatever the intent was.
|
|
26
|
+
'atest_gate_test',
|
|
27
|
+
]);
|
|
28
|
+
export const DEFAULT_SAFETY = {
|
|
29
|
+
writeEnabled: false,
|
|
30
|
+
maxResponseChars: 120_000,
|
|
31
|
+
redactKeys: ['password', 'token', 'authorization', 'cookie', 'secret', 'api-key'],
|
|
32
|
+
};
|
|
33
|
+
export const MCP_WRITE_ENV = 'ATEST_MCP_WRITE';
|
|
34
|
+
export const MCP_WRITE_ENABLED = '1';
|
|
35
|
+
/**
|
|
36
|
+
* Read MCP safety from the environment.
|
|
37
|
+
*
|
|
38
|
+
* @param env - Defaults to `process.env`. `ATEST_MCP_WRITE=1` enables writes.
|
|
39
|
+
* @returns A config whose `writeEnabled` is false unless the env explicitly
|
|
40
|
+
* opts in. Size caps and redact keys always come from {@link DEFAULT_SAFETY}.
|
|
41
|
+
*/
|
|
42
|
+
export function safetyFromEnv(env = process.env) {
|
|
43
|
+
return { ...DEFAULT_SAFETY, writeEnabled: env[MCP_WRITE_ENV] === MCP_WRITE_ENABLED };
|
|
44
|
+
}
|
|
45
|
+
function hasExplicitConfirm(input) {
|
|
46
|
+
return typeof input === 'object' && input !== null && 'confirm' in input && input.confirm === true;
|
|
47
|
+
}
|
|
48
|
+
export function gate(toolName, input, config) {
|
|
49
|
+
if (!WRITE_TOOLS.has(toolName))
|
|
50
|
+
return { ok: true };
|
|
51
|
+
if (!config.writeEnabled) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
error: 'write_disabled',
|
|
55
|
+
message: `${toolName} modifies the working tree. Set ${MCP_WRITE_ENV}=${MCP_WRITE_ENABLED} to enable mutating ` +
|
|
56
|
+
'tools; this server is read-only by default.',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (!hasExplicitConfirm(input)) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
error: 'confirmation_required',
|
|
63
|
+
message: `${toolName} requires confirm: true. Show the diff to the user and get their ` +
|
|
64
|
+
'agreement before calling again.',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { ok: true };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Redact, serialise, and cap.
|
|
71
|
+
*
|
|
72
|
+
* Truncation is always MARKED. A silently shortened ARIA snapshot would lead a
|
|
73
|
+
* model to conclude an element is absent when it was merely cut off — which is
|
|
74
|
+
* exactly the wrong answer for a healing tool.
|
|
75
|
+
*/
|
|
76
|
+
export function sanitise(value, config) {
|
|
77
|
+
const text = JSON.stringify(redact(value, config.redactKeys), null, 2);
|
|
78
|
+
if (text.length <= config.maxResponseChars)
|
|
79
|
+
return { text, truncated: false };
|
|
80
|
+
return {
|
|
81
|
+
text: `${text.slice(0, config.maxResponseChars)}\n\n… TRUNCATED: response exceeded ` +
|
|
82
|
+
`${config.maxResponseChars} characters. Narrow the query, or read the full record from ` +
|
|
83
|
+
'the resource URI.',
|
|
84
|
+
truncated: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,qEAAqE;IACrE,4EAA4E;IAC5E,kBAAkB;IAClB,kBAAkB;IAClB,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,iBAAiB;CAClB,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,YAAY,EAAE,KAAK;IACnB,gBAAgB,EAAE,OAAO;IACzB,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoD,OAAO,CAAC,GAAG;IAC3F,OAAO,EAAE,GAAG,cAAc,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,iBAAiB,EAAE,CAAC;AACvF,CAAC;AAQD,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,QAAgB,EAAE,KAAc,EAAE,MAAoB;IACzE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAEpD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,gBAAgB;YACvB,OAAO,EACL,GAAG,QAAQ,mCAAmC,aAAa,IAAI,iBAAiB,sBAAsB;gBACtG,6CAA6C;SAChD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EACL,GAAG,QAAQ,mEAAmE;gBAC9E,iCAAiC;SACpC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,MAAoB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvE,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE9E,OAAO;QACL,IAAI,EACF,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,qCAAqC;YAC9E,GAAG,MAAM,CAAC,gBAAgB,8DAA8D;YACxF,mBAAmB;QACrB,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP server.
|
|
3
|
+
*
|
|
4
|
+
* A façade. It adds no capability the CLI does not have; its value is a
|
|
5
|
+
* different interaction mode — an IDE agent exploring a failure
|
|
6
|
+
* conversationally rather than a human typing commands and reading tables.
|
|
7
|
+
*
|
|
8
|
+
* Two consequences follow from "façade, not a second product": no engine logic
|
|
9
|
+
* lives here, and CI never uses it. CI uses the CLI.
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { type ToolContext } from './tools.js';
|
|
13
|
+
import { type SafetyConfig } from './safety.js';
|
|
14
|
+
export interface ServerOptions {
|
|
15
|
+
readonly context: ToolContext;
|
|
16
|
+
readonly safety?: SafetyConfig | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build the MCP server over the same engines the CLI calls.
|
|
20
|
+
*
|
|
21
|
+
* A façade, not a second product: no engine logic lives here. Mutating tools
|
|
22
|
+
* still require `ATEST_MCP_WRITE=1` **and** `confirm: true`.
|
|
23
|
+
*
|
|
24
|
+
* @param options - Tool context (cwd, evidence/runs dirs) and optional safety
|
|
25
|
+
* overrides. Defaults to {@link safetyFromEnv}.
|
|
26
|
+
* @returns An MCP server ready to connect to a transport. Does not start
|
|
27
|
+
* listening — call {@link startStdioServer} for the stdio entry point.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const server = createServer({
|
|
32
|
+
* context: { cwd: process.cwd(), evidenceDir: '.atest/evidence', runsDir: '.atest/runs' },
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function createServer(options: ServerOptions): McpServer;
|
|
37
|
+
/**
|
|
38
|
+
* Connect {@link createServer} to stdio and run until the client disconnects.
|
|
39
|
+
*
|
|
40
|
+
* Nothing except the protocol may be written to stdout — a stray log line
|
|
41
|
+
* corrupts the stream and the session dies with no useful error.
|
|
42
|
+
*
|
|
43
|
+
* @param options - Same as {@link createServer}.
|
|
44
|
+
*/
|
|
45
|
+
export declare function startStdioServer(options: ServerOptions): Promise<void>;
|
|
46
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,CA6D9D;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP server.
|
|
3
|
+
*
|
|
4
|
+
* A façade. It adds no capability the CLI does not have; its value is a
|
|
5
|
+
* different interaction mode — an IDE agent exploring a failure
|
|
6
|
+
* conversationally rather than a human typing commands and reading tables.
|
|
7
|
+
*
|
|
8
|
+
* Two consequences follow from "façade, not a second product": no engine logic
|
|
9
|
+
* lives here, and CI never uses it. CI uses the CLI.
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
13
|
+
import { ATEST_VERSION } from '@aplaytest/core';
|
|
14
|
+
import { ALL_TOOLS } from './tools.js';
|
|
15
|
+
import { gate, sanitise, safetyFromEnv } from './safety.js';
|
|
16
|
+
/**
|
|
17
|
+
* Build the MCP server over the same engines the CLI calls.
|
|
18
|
+
*
|
|
19
|
+
* A façade, not a second product: no engine logic lives here. Mutating tools
|
|
20
|
+
* still require `ATEST_MCP_WRITE=1` **and** `confirm: true`.
|
|
21
|
+
*
|
|
22
|
+
* @param options - Tool context (cwd, evidence/runs dirs) and optional safety
|
|
23
|
+
* overrides. Defaults to {@link safetyFromEnv}.
|
|
24
|
+
* @returns An MCP server ready to connect to a transport. Does not start
|
|
25
|
+
* listening — call {@link startStdioServer} for the stdio entry point.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const server = createServer({
|
|
30
|
+
* context: { cwd: process.cwd(), evidenceDir: '.atest/evidence', runsDir: '.atest/runs' },
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function createServer(options) {
|
|
35
|
+
const safety = options.safety ?? safetyFromEnv();
|
|
36
|
+
const server = new McpServer({
|
|
37
|
+
name: 'atest',
|
|
38
|
+
version: ATEST_VERSION,
|
|
39
|
+
});
|
|
40
|
+
for (const tool of ALL_TOOLS) {
|
|
41
|
+
server.registerTool(tool.name, {
|
|
42
|
+
title: tool.title,
|
|
43
|
+
description: tool.description,
|
|
44
|
+
// The SDK takes the raw shape rather than the ZodObject wrapper.
|
|
45
|
+
inputSchema: tool.schema.shape,
|
|
46
|
+
}, async (rawInput) => {
|
|
47
|
+
const decision = gate(tool.name, rawInput, safety);
|
|
48
|
+
if (!decision.ok) {
|
|
49
|
+
return {
|
|
50
|
+
isError: true,
|
|
51
|
+
content: [{ type: 'text', text: `${decision.error}: ${decision.message}` }],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const parsed = tool.schema.safeParse(rawInput);
|
|
55
|
+
if (!parsed.success) {
|
|
56
|
+
return {
|
|
57
|
+
isError: true,
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `invalid_input: ${parsed.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('; ')}`,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const result = await tool.handler(parsed.data, options.context);
|
|
68
|
+
const { text } = sanitise(result, safety);
|
|
69
|
+
return { content: [{ type: 'text', text }] };
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// A tool failure is reported to the client, never thrown into the
|
|
73
|
+
// transport — a crashed server loses the whole session.
|
|
74
|
+
return {
|
|
75
|
+
isError: true,
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: `tool_failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return server;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Connect {@link createServer} to stdio and run until the client disconnects.
|
|
90
|
+
*
|
|
91
|
+
* Nothing except the protocol may be written to stdout — a stray log line
|
|
92
|
+
* corrupts the stream and the session dies with no useful error.
|
|
93
|
+
*
|
|
94
|
+
* @param options - Same as {@link createServer}.
|
|
95
|
+
*/
|
|
96
|
+
export async function startStdioServer(options) {
|
|
97
|
+
const server = createServer(options);
|
|
98
|
+
await server.connect(new StdioServerTransport());
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP tool surface.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately few. A server with forty tools makes the client agent worse at
|
|
5
|
+
* choosing, and every tool here is a thin envelope over the SAME engine
|
|
6
|
+
* function the CLI calls — if a capability exists in one surface and not the
|
|
7
|
+
* other, that is a bug in an adapter rather than a missing feature.
|
|
8
|
+
*
|
|
9
|
+
* Note what `atest_list_failures` does NOT return: the ARIA snapshot. Handing
|
|
10
|
+
* back full evidence for forty failures would blow the client's context in a
|
|
11
|
+
* single call. The agent picks one failure, then fetches its detail.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
export interface ToolContext {
|
|
15
|
+
readonly cwd: string;
|
|
16
|
+
readonly evidenceDir: string;
|
|
17
|
+
readonly runsDir: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The schema drives the type, never the other way round.
|
|
21
|
+
*
|
|
22
|
+
* Declaring the input shape by hand and asserting `z.ZodType<I>` over it fights
|
|
23
|
+
* `exactOptionalPropertyTypes`: Zod infers `run?: string | undefined` while a
|
|
24
|
+
* hand-written `run?: string` is a different type. Inferring from the schema
|
|
25
|
+
* means the two can never drift.
|
|
26
|
+
*/
|
|
27
|
+
type ToolSchema = z.ZodObject;
|
|
28
|
+
export interface ToolDefinition<S extends ToolSchema = ToolSchema> {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly title: string;
|
|
31
|
+
readonly description: string;
|
|
32
|
+
readonly schema: S;
|
|
33
|
+
handler(input: z.output<S>, context: ToolContext): Promise<unknown>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Full inference at the definition site, erased at the collection site so the
|
|
37
|
+
* registry can hold tools with different input shapes in one array.
|
|
38
|
+
*/
|
|
39
|
+
export declare function defineTool<S extends ToolSchema>(definition: ToolDefinition<S>): ToolDefinition;
|
|
40
|
+
export declare const listFailures: ToolDefinition<ToolSchema>;
|
|
41
|
+
export declare const getFailure: ToolDefinition<ToolSchema>;
|
|
42
|
+
export declare const flakyQuery: ToolDefinition<ToolSchema>;
|
|
43
|
+
export declare const impact: ToolDefinition<ToolSchema>;
|
|
44
|
+
export declare const proposeHealTool: ToolDefinition<ToolSchema>;
|
|
45
|
+
export declare const groundFeature: ToolDefinition<ToolSchema>;
|
|
46
|
+
export declare const gateTest: ToolDefinition<ToolSchema>;
|
|
47
|
+
export declare const ALL_TOOLS: readonly [ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>, ToolDefinition<ToolSchema>];
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC;AAE9B,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAE9F;AAkBD,eAAO,MAAM,YAAY,4BA+BvB,CAAC;AAEH,eAAO,MAAM,UAAU,4BA6CrB,CAAC;AAEH,eAAO,MAAM,UAAU,4BAoCrB,CAAC;AAEH,eAAO,MAAM,MAAM,4BA4CjB,CAAC;AAEH,eAAO,MAAM,eAAe,4BAwC1B,CAAC;AAEH,eAAO,MAAM,aAAa,4BAsBxB,CAAC;AAEH,eAAO,MAAM,QAAQ,4BAyCnB,CAAC;AAEH,eAAO,MAAM,SAAS,+MAQZ,CAAC"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP tool surface.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately few. A server with forty tools makes the client agent worse at
|
|
5
|
+
* choosing, and every tool here is a thin envelope over the SAME engine
|
|
6
|
+
* function the CLI calls — if a capability exists in one surface and not the
|
|
7
|
+
* other, that is a bug in an adapter rather than a missing feature.
|
|
8
|
+
*
|
|
9
|
+
* Note what `atest_list_failures` does NOT return: the ARIA snapshot. Handing
|
|
10
|
+
* back full evidence for forty failures would blow the client's context in a
|
|
11
|
+
* single call. The agent picks one failure, then fetches its detail.
|
|
12
|
+
*/
|
|
13
|
+
import { readFile } from 'node:fs/promises';
|
|
14
|
+
import { join, relative } from 'node:path';
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { falsifiabilityGate, ground } from '@aplaytest/author';
|
|
17
|
+
import { MemoryHistoryStore, formatFailingStep, ingestDirectory, loadRunBundles, } from '@aplaytest/core';
|
|
18
|
+
import { DEFAULT_ANALYZE_CONFIG, analyzeAll } from '@aplaytest/flaky';
|
|
19
|
+
import { DEFAULT_HEAL_OPTIONS, assessBundle, generateCandidates, missingTestIds, proposeHeal, } from '@aplaytest/heal';
|
|
20
|
+
import { DEFAULT_SELECTION_CONFIG, DEFAULT_SPEC_PATTERN, buildCoverage, buildGraph, resolveTsConfig, scanRouteOwnership, selectTests, } from '@aplaytest/impact';
|
|
21
|
+
/**
|
|
22
|
+
* Full inference at the definition site, erased at the collection site so the
|
|
23
|
+
* registry can hold tools with different input shapes in one array.
|
|
24
|
+
*/
|
|
25
|
+
export function defineTool(definition) {
|
|
26
|
+
return definition;
|
|
27
|
+
}
|
|
28
|
+
const DEFAULT_FAILURE_LIMIT = 50;
|
|
29
|
+
const DEFAULT_FAILURE_INCLUDES = ['aria', 'candidates'];
|
|
30
|
+
async function loadBundles(context, run) {
|
|
31
|
+
const { bundles } = await loadRunBundles(context.evidenceDir, run);
|
|
32
|
+
return [...bundles];
|
|
33
|
+
}
|
|
34
|
+
async function findBundle(context, evidenceId) {
|
|
35
|
+
const bundles = await loadBundles(context);
|
|
36
|
+
return bundles.find(bundle => bundle.id === evidenceId);
|
|
37
|
+
}
|
|
38
|
+
export const listFailures = defineTool({
|
|
39
|
+
name: 'atest_list_failures',
|
|
40
|
+
title: 'List captured failures',
|
|
41
|
+
description: 'Summarise failures from a run: kind, intent, location, flake score. Deliberately omits ' +
|
|
42
|
+
'the accessibility tree — call atest_get_failure for one failure once you have chosen it.',
|
|
43
|
+
schema: z.object({
|
|
44
|
+
run: z.string().optional(),
|
|
45
|
+
kind: z.string().optional(),
|
|
46
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
47
|
+
}),
|
|
48
|
+
async handler(input, context) {
|
|
49
|
+
const bundles = await loadBundles(context, input.run);
|
|
50
|
+
const filtered = input.kind === undefined ? bundles : bundles.filter(b => b.failure.kind === input.kind);
|
|
51
|
+
return {
|
|
52
|
+
count: filtered.length,
|
|
53
|
+
failures: filtered.slice(0, input.limit ?? DEFAULT_FAILURE_LIMIT).map(b => ({
|
|
54
|
+
evidenceId: b.id,
|
|
55
|
+
title: b.test.title,
|
|
56
|
+
file: relative(context.cwd, b.test.file),
|
|
57
|
+
line: b.test.line,
|
|
58
|
+
project: b.test.project,
|
|
59
|
+
kind: b.failure.kind,
|
|
60
|
+
intent: formatFailingStep(b.intent.failingStep),
|
|
61
|
+
selector: b.intent.selector,
|
|
62
|
+
healable: assessBundle(b).eligible,
|
|
63
|
+
})),
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
export const getFailure = defineTool({
|
|
68
|
+
name: 'atest_get_failure',
|
|
69
|
+
title: 'Get one failure in detail',
|
|
70
|
+
description: 'Full evidence for a single failure. Defaults to the accessibility tree and ranked heal ' +
|
|
71
|
+
'candidates — the two things that actually explain a locator failure. Screenshots are ' +
|
|
72
|
+
'never inlined; fetch the resource URI deliberately if you need one.',
|
|
73
|
+
schema: z.object({
|
|
74
|
+
evidenceId: z.string(),
|
|
75
|
+
include: z.array(z.enum(['aria', 'candidates', 'network', 'console', 'steps'])).optional(),
|
|
76
|
+
}),
|
|
77
|
+
async handler(input, context) {
|
|
78
|
+
const bundle = await findBundle(context, input.evidenceId);
|
|
79
|
+
if (bundle === undefined)
|
|
80
|
+
return { error: 'not_found', evidenceId: input.evidenceId };
|
|
81
|
+
const include = new Set(input.include ?? DEFAULT_FAILURE_INCLUDES);
|
|
82
|
+
const eligibility = assessBundle(bundle);
|
|
83
|
+
return {
|
|
84
|
+
evidenceId: bundle.id,
|
|
85
|
+
test: bundle.test,
|
|
86
|
+
failure: bundle.failure,
|
|
87
|
+
intent: {
|
|
88
|
+
selector: bundle.intent.selector,
|
|
89
|
+
failingStep: bundle.intent.failingStep,
|
|
90
|
+
...(include.has('steps') ? { steps: bundle.intent.steps } : {}),
|
|
91
|
+
},
|
|
92
|
+
page: {
|
|
93
|
+
url: bundle.page.url,
|
|
94
|
+
testIdsPresent: bundle.page.testIdsPresent,
|
|
95
|
+
...(include.has('aria') ? { ariaSnapshot: bundle.page.ariaSnapshot } : {}),
|
|
96
|
+
},
|
|
97
|
+
heal: {
|
|
98
|
+
eligible: eligibility.eligible,
|
|
99
|
+
reason: eligibility.reason,
|
|
100
|
+
...(include.has('candidates') ? { candidates: generateCandidates(bundle) } : {}),
|
|
101
|
+
},
|
|
102
|
+
...(include.has('network') ? { network: bundle.network } : {}),
|
|
103
|
+
...(include.has('console') ? { console: bundle.console } : {}),
|
|
104
|
+
screenshot:
|
|
105
|
+
// A path the client can open, not a resource URI this server does not
|
|
106
|
+
// register. Screenshots are never inlined — they blow the token budget.
|
|
107
|
+
bundle.visual.screenshotPath,
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
export const flakyQuery = defineTool({
|
|
112
|
+
name: 'atest_flaky_query',
|
|
113
|
+
title: 'Query flake history',
|
|
114
|
+
description: 'Flake scores and root-cause classification from recorded run history. Entirely ' +
|
|
115
|
+
'deterministic — every number came from measuring past runs.',
|
|
116
|
+
schema: z.object({
|
|
117
|
+
testId: z.string().optional(),
|
|
118
|
+
minScore: z.number().min(0).max(1).optional(),
|
|
119
|
+
}),
|
|
120
|
+
async handler(input, context) {
|
|
121
|
+
const store = new MemoryHistoryStore();
|
|
122
|
+
const ingest = await ingestDirectory(store, context.runsDir);
|
|
123
|
+
const report = await analyzeAll(store, DEFAULT_ANALYZE_CONFIG);
|
|
124
|
+
await store.close();
|
|
125
|
+
const verdicts = report.verdicts
|
|
126
|
+
.filter(v => input.testId === undefined || v.testId === input.testId)
|
|
127
|
+
.filter(v => input.minScore === undefined || v.score.score >= input.minScore);
|
|
128
|
+
return {
|
|
129
|
+
runsAnalysed: ingest.runsIngested,
|
|
130
|
+
verdicts: verdicts.map(v => ({
|
|
131
|
+
testId: v.testId,
|
|
132
|
+
title: v.title,
|
|
133
|
+
project: v.project,
|
|
134
|
+
score: v.score.score,
|
|
135
|
+
flaky: v.flaky,
|
|
136
|
+
class: v.classification.class,
|
|
137
|
+
prescription: v.classification.prescription,
|
|
138
|
+
retryHelps: v.classification.retryable,
|
|
139
|
+
evidence: v.classification.evidence,
|
|
140
|
+
})),
|
|
141
|
+
regressions: report.regressions.map(v => v.title),
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
export const impact = defineTool({
|
|
146
|
+
name: 'atest_impact',
|
|
147
|
+
title: 'Which specs a change could affect',
|
|
148
|
+
description: 'Selects specs from an import graph plus recorded route coverage. Every selection comes ' +
|
|
149
|
+
'with the reason that produced it; specs that cannot be attributed are always included.',
|
|
150
|
+
schema: z.object({ changed: z.array(z.string()).min(1) }),
|
|
151
|
+
async handler(input, context) {
|
|
152
|
+
const tsConfigPath = resolveTsConfig(context.cwd);
|
|
153
|
+
const graph = buildGraph({
|
|
154
|
+
tsConfigPath,
|
|
155
|
+
rootDir: context.cwd,
|
|
156
|
+
specPattern: DEFAULT_SPEC_PATTERN,
|
|
157
|
+
});
|
|
158
|
+
const store = new MemoryHistoryStore();
|
|
159
|
+
const ingested = await ingestDirectory(store, context.runsDir);
|
|
160
|
+
const attempts = await store.attempts();
|
|
161
|
+
await store.close();
|
|
162
|
+
const routeInputs = ingested.runsIngested > 0
|
|
163
|
+
? {
|
|
164
|
+
ownership: scanRouteOwnership(tsConfigPath, context.cwd),
|
|
165
|
+
coverage: buildCoverage(attempts.map(a => ({
|
|
166
|
+
file: relative(context.cwd, a.file).split('\\').join('/'),
|
|
167
|
+
routes: [...a.routes],
|
|
168
|
+
}))),
|
|
169
|
+
}
|
|
170
|
+
: undefined;
|
|
171
|
+
const selection = selectTests(graph, input.changed, DEFAULT_SELECTION_CONFIG, routeInputs);
|
|
172
|
+
return {
|
|
173
|
+
mode: selection.mode,
|
|
174
|
+
reason: selection.fullSuiteReason,
|
|
175
|
+
selected: selection.selected,
|
|
176
|
+
totalSpecs: selection.totalSpecs,
|
|
177
|
+
reasons: selection.reasons,
|
|
178
|
+
hasRouteCoverage: routeInputs !== undefined,
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
export const proposeHealTool = defineTool({
|
|
183
|
+
name: 'atest_propose_heal',
|
|
184
|
+
title: 'Propose a selector heal',
|
|
185
|
+
description: 'Computes a patch for a drifted selector and returns it as data. Does NOT write anything ' +
|
|
186
|
+
'and does NOT validate — safe to call while exploring. To apply, run `aplaytest heal --apply` ' +
|
|
187
|
+
'from the CLI after showing the diff to the user.',
|
|
188
|
+
schema: z.object({ evidenceId: z.string(), constantsFile: z.string() }),
|
|
189
|
+
async handler(input, context) {
|
|
190
|
+
const bundle = await findBundle(context, input.evidenceId);
|
|
191
|
+
if (bundle === undefined)
|
|
192
|
+
return { error: 'not_found', evidenceId: input.evidenceId };
|
|
193
|
+
const source = await readFile(join(context.cwd, input.constantsFile), 'utf8').catch(() => null);
|
|
194
|
+
if (source === null)
|
|
195
|
+
return { error: 'cannot_read', file: input.constantsFile };
|
|
196
|
+
const proposal = await proposeHeal(bundle, {
|
|
197
|
+
cwd: context.cwd,
|
|
198
|
+
constantsFile: input.constantsFile,
|
|
199
|
+
constantsText: source,
|
|
200
|
+
specFile: bundle.test.file,
|
|
201
|
+
validationRuns: DEFAULT_HEAL_OPTIONS.validationRuns,
|
|
202
|
+
checkCollateral: false,
|
|
203
|
+
skipValidation: true,
|
|
204
|
+
});
|
|
205
|
+
if (proposal.status !== 'proposed' || proposal.chosen === null || proposal.patch === null) {
|
|
206
|
+
return { status: proposal.status, reason: proposal.reason };
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
status: proposal.patch.status,
|
|
210
|
+
from: missingTestIds(bundle.intent.selector, bundle.page.testIdsPresent)[0] ?? null,
|
|
211
|
+
to: proposal.chosen.value,
|
|
212
|
+
constantsTouched: proposal.patch.touched,
|
|
213
|
+
diffPreview: proposal.patch.after,
|
|
214
|
+
candidates: proposal.candidates,
|
|
215
|
+
validated: false,
|
|
216
|
+
note: 'Not validated. Run `aplaytest heal --apply` to validate by re-running the test.',
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
export const groundFeature = defineTool({
|
|
221
|
+
name: 'atest_ground_feature',
|
|
222
|
+
title: 'What the repo already says about a feature',
|
|
223
|
+
description: 'Retrieves the conventions file, the feature page object API, seeded fixtures and exemplar ' +
|
|
224
|
+
'specs for a feature — the same grounding the author agent receives. Returns SIGNATURES and ' +
|
|
225
|
+
'paths, not file bodies, so it can be called before deciding what to read in full.',
|
|
226
|
+
schema: z.object({ feature: z.string().min(1) }),
|
|
227
|
+
async handler(input, context) {
|
|
228
|
+
const bundle = await ground({ cwd: context.cwd, feature: input.feature });
|
|
229
|
+
return {
|
|
230
|
+
feature: bundle.feature,
|
|
231
|
+
conventionsPath: bundle.conventionsPath,
|
|
232
|
+
pageObjectPath: bundle.pageObjectPath,
|
|
233
|
+
pageObjectApi: bundle.pageObjectApi,
|
|
234
|
+
seededDataPath: bundle.seededDataPath,
|
|
235
|
+
// Paths and reasons only. Inlining two full spec files would spend the
|
|
236
|
+
// caller's context on something it can read deliberately if it wants to.
|
|
237
|
+
exemplars: bundle.exemplars.map(e => ({ path: e.path, reason: e.reason })),
|
|
238
|
+
missing: bundle.missing,
|
|
239
|
+
};
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
export const gateTest = defineTool({
|
|
243
|
+
name: 'atest_gate_test',
|
|
244
|
+
title: 'Does this test actually assert anything?',
|
|
245
|
+
description: 'Runs the falsifiability gate: the test must pass repeatedly AND fail when the API is mutated ' +
|
|
246
|
+
'to return empty or unfiltered data. Answers the question a passing test cannot — whether it ' +
|
|
247
|
+
'would notice if the feature broke. Applies to human-written tests too. Slow (several full ' +
|
|
248
|
+
'Playwright runs) and it temporarily rewrites the spec, so it is gated behind ATEST_MCP_WRITE.',
|
|
249
|
+
schema: z.object({
|
|
250
|
+
specFile: z.string().min(1),
|
|
251
|
+
testTitle: z.string().min(1),
|
|
252
|
+
stabilityRuns: z.number().int().min(1).max(10).optional(),
|
|
253
|
+
apiPattern: z.string().optional(),
|
|
254
|
+
confirm: z.boolean().optional(),
|
|
255
|
+
}),
|
|
256
|
+
async handler(input, context) {
|
|
257
|
+
const result = await falsifiabilityGate({
|
|
258
|
+
cwd: context.cwd,
|
|
259
|
+
specFile: input.specFile,
|
|
260
|
+
testTitle: input.testTitle,
|
|
261
|
+
...(input.stabilityRuns === undefined ? {} : { stabilityRuns: input.stabilityRuns }),
|
|
262
|
+
...(input.apiPattern === undefined ? {} : { apiPattern: input.apiPattern }),
|
|
263
|
+
});
|
|
264
|
+
return {
|
|
265
|
+
passed: result.passed,
|
|
266
|
+
summary: result.summary,
|
|
267
|
+
checks: result.checks,
|
|
268
|
+
mutants: result.mutants.map(m => ({
|
|
269
|
+
name: m.name,
|
|
270
|
+
class: m.class,
|
|
271
|
+
killed: m.killed,
|
|
272
|
+
kills: m.kills,
|
|
273
|
+
})),
|
|
274
|
+
// Stated rather than implied: a caller that sees `passed: false` should
|
|
275
|
+
// fix the test's assertions, not retry the gate.
|
|
276
|
+
guidance: result.passed
|
|
277
|
+
? 'The test fails when the data breaks, so it asserts something real.'
|
|
278
|
+
: 'The test passes even when the API returns nothing. Assert on the data it claims to test.',
|
|
279
|
+
};
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
export const ALL_TOOLS = [
|
|
283
|
+
listFailures,
|
|
284
|
+
getFailure,
|
|
285
|
+
flakyQuery,
|
|
286
|
+
impact,
|
|
287
|
+
proposeHealTool,
|
|
288
|
+
groundFeature,
|
|
289
|
+
gateTest,
|
|
290
|
+
];
|
|
291
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aplaytest/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server: the same engine calls the CLI makes, exposed to IDE agents",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc --build",
|
|
14
|
+
"test": "vitest run"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@aplaytest/core": "^0.1.0",
|
|
18
|
+
"@aplaytest/flaky": "^0.1.0",
|
|
19
|
+
"@aplaytest/heal": "^0.1.0",
|
|
20
|
+
"@aplaytest/impact": "^0.1.0",
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
22
|
+
"zod": "^4.3.6",
|
|
23
|
+
"@aplaytest/author": "^0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"bin": {
|
|
32
|
+
"aplaytest-mcp": "./dist/bin.js"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/ianoflynnautomation/aplaytest.git",
|
|
40
|
+
"directory": "packages/mcp"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/ianoflynnautomation/aplaytest#readme",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/ianoflynnautomation/aplaytest/issues"
|
|
45
|
+
}
|
|
46
|
+
}
|