@things-factory/ai-client-base 10.1.25 → 10.1.26

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.
Files changed (37) hide show
  1. package/dist-server/service/assistant/index.d.ts +1 -0
  2. package/dist-server/service/assistant/index.js +1 -0
  3. package/dist-server/service/assistant/index.js.map +1 -1
  4. package/dist-server/service/assistant/registry-assistant.d.ts +10 -10
  5. package/dist-server/service/assistant/registry-assistant.js +11 -9
  6. package/dist-server/service/assistant/registry-assistant.js.map +1 -1
  7. package/dist-server/service/assistant/tool-scope.d.ts +25 -0
  8. package/dist-server/service/assistant/tool-scope.js +71 -0
  9. package/dist-server/service/assistant/tool-scope.js.map +1 -0
  10. package/dist-server/service/index.d.ts +1 -0
  11. package/dist-server/service/index.js +1 -0
  12. package/dist-server/service/index.js.map +1 -1
  13. package/dist-server/service/testing/tool-call-context.d.ts +10 -0
  14. package/dist-server/service/testing/tool-call-context.js +13 -0
  15. package/dist-server/service/testing/tool-call-context.js.map +1 -0
  16. package/dist-server/service/tool-registry/index.d.ts +3 -3
  17. package/dist-server/service/tool-registry/index.js +2 -1
  18. package/dist-server/service/tool-registry/index.js.map +1 -1
  19. package/dist-server/service/tool-registry/registry.d.ts +16 -0
  20. package/dist-server/service/tool-registry/registry.js +36 -0
  21. package/dist-server/service/tool-registry/registry.js.map +1 -1
  22. package/dist-server/service/tool-registry/types.d.ts +48 -0
  23. package/dist-server/service/tool-registry/types.js.map +1 -1
  24. package/dist-server/tsconfig.tsbuildinfo +1 -0
  25. package/docs/grounded-analysis-contract.md +1 -1
  26. package/package.json +2 -2
  27. package/server/service/analysis-contract.test.ts +0 -1
  28. package/server/service/assistant/index.ts +1 -0
  29. package/server/service/assistant/registry-assistant.test.ts +131 -4
  30. package/server/service/assistant/registry-assistant.ts +29 -24
  31. package/server/service/assistant/tool-scope.ts +86 -0
  32. package/server/service/index.ts +1 -0
  33. package/server/service/testing/tool-call-context.ts +28 -0
  34. package/server/service/tool-registry/index.ts +7 -3
  35. package/server/service/tool-registry/registry.test.ts +50 -1
  36. package/server/service/tool-registry/registry.ts +47 -0
  37. package/server/service/tool-registry/types.ts +53 -3
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/service/tool-registry/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uEAAuE;AACvE,kEAAkE;AAClE,iFAAiF;AACjF,mEAAmE;AACnE,wDAAwD","sourcesContent":["/**\n * Tool Registry — board-ai 의 LLM tool 노출 plugin point.\n *\n * 동기:\n * 기존엔 board-ai 가 자기 도메인 (board edit) tool 들만 hardcoded 정의했고, styling\n * 영역만 STYLING_TOOLS registry 로 분리되어 있었다. 외부 도메인 패키지 (board-import,\n * fmsim 등) 가 자기 tool 을 LLM 에 노출하려면 board-ai 자체를 fork/수정해야 했다.\n *\n * 본 registry 는 외부 패키지가 server bootstrap 시 자기 tool category 를 등록하면\n * assistant.ts 의 buildBoardEditTools / dispatch / isWriteTool 등이 자동으로 통합\n * 하도록 한다. styling-tools 의 single-source-of-truth 패턴을 일반화한 형태.\n *\n * 설계 원칙:\n * - **카테고리별 builder 시그니처 다양성을 통합**: read 는 (args, ctx) → any,\n * write 는 (args, components) → SceneEditOp[], action 은 (args) → SceneActionOp.\n * 하나의 ToolSpec 에 모든 시그니처를 union 으로 담지 않고, 카테고리에 맞는\n * builder 만 채우면 되도록 카테고리별 sub-interface 분리.\n * - **kind 필드로 자가 분류**: registry 가 isReadTool / isWriteTool 자동 도출.\n * hardcoded set 동기화 누락 위험 제거.\n * - **점진 마이그레이션**: 기존 STYLING_TOOLS 가 본 registry 의 첫 사용자.\n * 점진적으로 다른 hardcoded tool 들 (addComponent / alignComponents 등) 도\n * 같은 registry 로 흡수 가능. 한 단계씩 byte-단위 동등성 단위 테스트 보장.\n */\n// 본 registry 는 LLM tool 노출 plugin point 에 한정되므로 도메인 type (SceneEditOp,\n// SceneActionOp 등) 은 알지 않는다. builder return 은 unknown 으로 두고, 카테고리\n// dispatcher (board-ai 의 toolCallToSceneEditOp / toolCallToSceneActionOp 등) 가 자기\n// 도메인 type 으로 좁힌다. 사용자가 ToolSpec<TWrite, TAction> generic 까지 정밀화하면\n// 좋겠지만, 11~50 개 spec 마다 type 인자 전파가 부담이라 unknown 으로 합의.\n\n// ── 카테고리별 builder 시그니처 ──────────────────────────────────────\n\n/**\n * Read tool — server 측 즉시 실행, 결과를 LLM 에 회신. board model 변경 X.\n * 예: getSelection / findComponents / importSession (query)\n */\nexport type ReadToolBuilder = (\n args: any,\n context: ReadToolContext\n) => any | Promise<any>\n\nexport interface ReadToolContext {\n /** 현재 board model — 일부 read tool 이 사용 (getSelection 등). */\n board?: any\n /** 현재 선택된 refids. */\n selectedRefids?: number[]\n /** 호출자 도메인 / 사용자 / 트랜잭션. registry 외부에서 주입. */\n state?: any\n /** 이외 주입은 카테고리별로 자유. tool 등록자가 type 좁힐 수 있도록 unknown 으로 보존. */\n [k: string]: any\n}\n\n/**\n * Write tool — domain edit op 발생. host 가 patch 적용 후 영속화.\n * 예: board-ai 의 addComponent / setFill / modifyBoard.\n *\n * builder 의 return type 은 unknown 으로 둔다 — 도메인별 dispatcher (예: board-ai 의\n * toolCallToSceneEditOp) 가 자기 EditOp[] 로 cast. ops/errors wrapper 형태도 동일 의미.\n */\nexport type WriteToolBuilder = (\n args: any,\n context: WriteToolContext\n) => any[] | { ops: any[]; errors?: string[] } | null\n\nexport interface WriteToolContext {\n components?: ReadonlyArray<any>\n [k: string]: any\n}\n\n/**\n * Action tool — ephemeral scene 조작 (select / center / fit / sceneMode).\n * board model 변경 X, undo 영향 X. host 가 별도 channel 로 적용.\n *\n * return type 은 unknown — 도메인별 dispatcher (예: board-ai 의 toolCallToSceneActionOp)\n * 가 자기 SceneActionOp 으로 cast.\n */\nexport type ActionToolBuilder = (args: any) => any | null\n\n/**\n * External-call tool — 외부 service / mutation / RPC 호출. 직접 board model 영향 X\n * (별도 entity 변경은 가능). 결과는 LLM 에 회신.\n *\n * board-import 의 importBoardAsync / materializeImportSession 같이 board-ai 외부\n * 도메인을 호출하는 tool 의 카테고리.\n */\nexport type ExternalToolBuilder = (\n args: any,\n context: ExternalToolContext\n) => any | Promise<any>\n\nexport interface ExternalToolContext {\n state?: any\n [k: string]: any\n}\n\n// ── ToolSpec — 카테고리별 변형 ──────────────────────────────────────\n\n/**\n * 모든 ToolSpec 공통 메타데이터.\n */\nexport interface ToolSpecBase {\n /** AIToolCall.name 매칭. 전 카테고리 통틀어 unique. */\n name: string\n /** 기능 설명 (영문 위주). LLM 의 tool description 으로 사용. */\n description: string\n /**\n * 선택 — 정책 / 테마 가이드 단문. tool description 끝에 자동 부착.\n * styling-tools 의 themeNote 와 동일 의미. 기타 카테고리도 사용 가능.\n */\n themeNote?: string\n /** JSON Schema for parameters — LLM tool schema 에 그대로 노출. */\n schema: any\n}\n\nexport interface ReadToolSpec extends ToolSpecBase {\n kind: 'read'\n builder: ReadToolBuilder\n}\n\nexport interface WriteToolSpec extends ToolSpecBase {\n kind: 'write'\n builder: WriteToolBuilder\n}\n\nexport interface ActionToolSpec extends ToolSpecBase {\n kind: 'action'\n builder: ActionToolBuilder\n}\n\nexport interface ExternalToolSpec extends ToolSpecBase {\n kind: 'external'\n builder: ExternalToolBuilder\n}\n\nexport type ToolSpec = ReadToolSpec | WriteToolSpec | ActionToolSpec | ExternalToolSpec\n\n// ── 카테고리 (등록 단위) ─────────────────────────────────────────────\n\n/**\n * 한 도메인 / 패키지가 등록하는 tool 묶음.\n * 카테고리 이름은 식별자 (debug log / 분쟁 시 origin 추적). unique.\n */\nexport interface ToolCategory {\n /** 등록 식별자. 예: 'styling', 'board-import', 'fmsim'. */\n name: string\n /** 이 카테고리에 속한 tool spec 들. */\n specs: ToolSpec[]\n /** 선택 — 디버깅용 짧은 설명. */\n description?: string\n /**\n * 이 카테고리 도구를 **어떻게 써야 하는지**에 대한 규율 — 노출된 대화의 시스템 프롬프트에 실린다.\n *\n * 왜 필요한가: 도구 목록(이름·설명·스키마)만 보내면 모델은 \"무엇이 있는지\" 는 알지만 \"언제 반드시\n * 불러야 하는지\" 는 모른다. 실제로 그 공백에서 사고가 났다 — 조치 요청에 `proposeAction` 을 부르지\n * 않고 \"제안해 두었습니다\" 라고만 답해, 사용자에게는 없는 버튼을 누르라고 안내했다.\n *\n * 규율은 도구를 등록한 쪽이 소유한다. 호스트(board-ai)는 도메인을 모르는 채 **노출된 카테고리의\n * 규율만 모아 붙인다** — 도메인 지식이 호스트 프롬프트로 새지 않는다.\n *\n * ── 왜 필수인가 (2026-09-09) ──────────────────────────────────────────────\n * 선택 필드였다. 그래서 위에 적힌 사고를 아는 사람만 채웠고, 세 제품이 각자 도구를 붙이기\n * 시작한 지금 **채운 넷과 안 채운 하나**가 있었다.\n *\n * 안 채운 쪽은 조용하다 — 등록은 성공하고 부팅도 성공하고, 모델이 도구를 덜 부르거나 지어낸\n * 뒤에 사람이 화면을 보고 안다. **두 개를 기억해야 성립하는 규칙은 다음 새 카테고리까지만\n * 간다.** 그래서 기억이 아니라 등록이 거절한다(§`registerToolCategory`).\n *\n * 빈 문자열도 거절한다. 「없음」을 「적었다」로 위장하는 값이 통과하면 이 강제가 형식이 된다.\n */\n guidance: string\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/service/tool-registry/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uEAAuE;AACvE,kEAAkE;AAClE,iFAAiF;AACjF,mEAAmE;AACnE,wDAAwD","sourcesContent":["/**\n * Tool Registry — board-ai 의 LLM tool 노출 plugin point.\n *\n * 동기:\n * 기존엔 board-ai 가 자기 도메인 (board edit) tool 들만 hardcoded 정의했고, styling\n * 영역만 STYLING_TOOLS registry 로 분리되어 있었다. 외부 도메인 패키지 (board-import,\n * fmsim 등) 가 자기 tool 을 LLM 에 노출하려면 board-ai 자체를 fork/수정해야 했다.\n *\n * 본 registry 는 외부 패키지가 server bootstrap 시 자기 tool category 를 등록하면\n * assistant.ts 의 buildBoardEditTools / dispatch / isWriteTool 등이 자동으로 통합\n * 하도록 한다. styling-tools 의 single-source-of-truth 패턴을 일반화한 형태.\n *\n * 설계 원칙:\n * - **카테고리별 builder 시그니처 다양성을 통합**: read 는 (args, ctx) → any,\n * write 는 (args, components) → SceneEditOp[], action 은 (args) → SceneActionOp.\n * 하나의 ToolSpec 에 모든 시그니처를 union 으로 담지 않고, 카테고리에 맞는\n * builder 만 채우면 되도록 카테고리별 sub-interface 분리.\n * - **kind 필드로 자가 분류**: registry 가 isReadTool / isWriteTool 자동 도출.\n * hardcoded set 동기화 누락 위험 제거.\n * - **점진 마이그레이션**: 기존 STYLING_TOOLS 가 본 registry 의 첫 사용자.\n * 점진적으로 다른 hardcoded tool 들 (addComponent / alignComponents 등) 도\n * 같은 registry 로 흡수 가능. 한 단계씩 byte-단위 동등성 단위 테스트 보장.\n */\n// 본 registry 는 LLM tool 노출 plugin point 에 한정되므로 도메인 type (SceneEditOp,\n// SceneActionOp 등) 은 알지 않는다. builder return 은 unknown 으로 두고, 카테고리\n// dispatcher (board-ai 의 toolCallToSceneEditOp / toolCallToSceneActionOp 등) 가 자기\n// 도메인 type 으로 좁힌다. 사용자가 ToolSpec<TWrite, TAction> generic 까지 정밀화하면\n// 좋겠지만, 11~50 개 spec 마다 type 인자 전파가 부담이라 unknown 으로 합의.\n\n// ── ToolCallContext — what the neutral conversation door hands a registered tool (A3) ──\n\n/**\n * What `registryAssistantChat` — the door apps use (`assistantChat`, ADR-0061 decision 0) — hands a\n * registered tool when it runs.\n *\n * `state` and `host` sit side by side. The twin's space tools read `ctx.state.host` while this door\n * passed `ctx.host`, so they never saw the space; the two are never merged into one object.\n *\n * The board product's door (board-ai) passes its own shape and is not part of this contract.\n */\nexport interface ToolCallContext {\n /** The request state the server built — domain, user, tx. The only basis for authorization. */\n state: any\n /**\n * The client's `AssistantMode.hostContext`, passed through as is. **Untrusted** — a tool that reads\n * an id from it checks that the id belongs to the caller's tenant. `{}` when none was sent.\n */\n host: Record<string, any>\n /** The conversation's mode. Filled once modes are registered on the server (A2); absent until then. */\n mode?: ToolCallMode\n}\n\nexport interface ToolCallMode {\n kind: string\n target?: string\n}\n\n// ── 카테고리별 builder 시그니처 ──────────────────────────────────────\n\n/**\n * Read tool — server 측 즉시 실행, 결과를 LLM 에 회신. board model 변경 X.\n * 예: getSelection / findComponents / importSession (query)\n */\nexport type ReadToolBuilder = (\n args: any,\n context: ReadToolContext\n) => any | Promise<any>\n\nexport interface ReadToolContext {\n /** 현재 board model — 일부 read tool 이 사용 (getSelection 등). */\n board?: any\n /** 현재 선택된 refids. */\n selectedRefids?: number[]\n /** 호출자 도메인 / 사용자 / 트랜잭션. registry 외부에서 주입. */\n state?: any\n /** 이외 주입은 카테고리별로 자유. tool 등록자가 type 좁힐 수 있도록 unknown 으로 보존. */\n [k: string]: any\n}\n/**\n * Write tool — domain edit op 발생. host 가 patch 적용 후 영속화.\n * 예: board-ai 의 addComponent / setFill / modifyBoard.\n *\n * builder 의 return type 은 unknown 으로 둔다 — 도메인별 dispatcher (예: board-ai 의\n * toolCallToSceneEditOp) 가 자기 EditOp[] 로 cast. ops/errors wrapper 형태도 동일 의미.\n */\nexport type WriteToolBuilder = (\n args: any,\n context: WriteToolContext\n) => any[] | { ops: any[]; errors?: string[] } | null\n\nexport interface WriteToolContext {\n components?: ReadonlyArray<any>\n [k: string]: any\n}\n/**\n * Action tool — ephemeral scene 조작 (select / center / fit / sceneMode).\n * board model 변경 X, undo 영향 X. host 가 별도 channel 로 적용.\n *\n * return type 은 unknown — 도메인별 dispatcher (예: board-ai 의 toolCallToSceneActionOp)\n * 가 자기 SceneActionOp 으로 cast.\n */\nexport type ActionToolBuilder = (args: any) => any | null\n\n/**\n * External-call tool — 외부 service / mutation / RPC 호출. 직접 board model 영향 X\n * (별도 entity 변경은 가능). 결과는 LLM 에 회신.\n *\n * board-import 의 importBoardAsync / materializeImportSession 같이 board-ai 외부\n * 도메인을 호출하는 tool 의 카테고리.\n */\nexport type ExternalToolBuilder = (\n args: any,\n context: ExternalToolContext\n) => any | Promise<any>\n\nexport interface ExternalToolContext {\n state?: any\n [k: string]: any\n}\n// ── ToolSpec — 카테고리별 변형 ──────────────────────────────────────\n\n/**\n * The privilege a tool requires — the same `category`/`privilege` the tool's GraphQL door declares\n * (`@privilege(category, privilege, owner?, super?)`), so the fields mirror `PrivilegeObject`.\n *\n * A tool is not a new door; it is another way into a door that already exists. A tool that creates\n * a Board goes through the privilege that creating a Board already needs. Minting an AI-only\n * privilege name would put two doors on one effect, and one of them would end up looser.\n */\nexport interface ToolPrivilege {\n category: string\n privilege: string\n /** Domain owners pass without the privilege — mirror the door's `domainOwnerGranted`. */\n owner?: boolean\n /** Super users pass without the privilege — mirror the door's `superUserGranted`. */\n super?: boolean\n}\n\n/**\n * 모든 ToolSpec 공통 메타데이터.\n */\nexport interface ToolSpecBase {\n /** AIToolCall.name 매칭. 전 카테고리 통틀어 unique. */\n name: string\n /** 기능 설명 (영문 위주). LLM 의 tool description 으로 사용. */\n description: string\n /**\n * 선택 — 정책 / 테마 가이드 단문. tool description 끝에 자동 부착.\n * styling-tools 의 themeNote 와 동일 의미. 기타 카테고리도 사용 가능.\n */\n themeNote?: string\n /** JSON Schema for parameters — LLM tool schema 에 그대로 노출. */\n schema: any\n /**\n * The privilege a caller needs before this tool is offered or run. See `ToolPrivilege`.\n *\n * Expected for `write`, `action` and `external` — registration records a\n * `tool-privilege-undeclared` warning for one without it (A1 stage one). A `read` tool without it is\n * offered on domain membership alone, and its builder must check what it reads.\n */\n privilege?: ToolPrivilege\n}\n\nexport interface ReadToolSpec extends ToolSpecBase {\n kind: 'read'\n builder: ReadToolBuilder\n}\n\nexport interface WriteToolSpec extends ToolSpecBase {\n kind: 'write'\n builder: WriteToolBuilder\n}\n\nexport interface ActionToolSpec extends ToolSpecBase {\n kind: 'action'\n builder: ActionToolBuilder\n}\n\nexport interface ExternalToolSpec extends ToolSpecBase {\n kind: 'external'\n builder: ExternalToolBuilder\n}\n\nexport type ToolSpec = ReadToolSpec | WriteToolSpec | ActionToolSpec | ExternalToolSpec\n\n// ── 카테고리 (등록 단위) ─────────────────────────────────────────────\n\n/**\n * 한 도메인 / 패키지가 등록하는 tool 묶음.\n * 카테고리 이름은 식별자 (debug log / 분쟁 시 origin 추적). unique.\n */\nexport interface ToolCategory {\n /** 등록 식별자. 예: 'styling', 'board-import', 'fmsim'. */\n name: string\n /** 이 카테고리에 속한 tool spec 들. */\n specs: ToolSpec[]\n /** 선택 — 디버깅용 짧은 설명. */\n description?: string\n /**\n * 이 카테고리 도구를 **어떻게 써야 하는지**에 대한 규율 — 노출된 대화의 시스템 프롬프트에 실린다.\n *\n * 왜 필요한가: 도구 목록(이름·설명·스키마)만 보내면 모델은 \"무엇이 있는지\" 는 알지만 \"언제 반드시\n * 불러야 하는지\" 는 모른다. 실제로 그 공백에서 사고가 났다 — 조치 요청에 `proposeAction` 을 부르지\n * 않고 \"제안해 두었습니다\" 라고만 답해, 사용자에게는 없는 버튼을 누르라고 안내했다.\n *\n * 규율은 도구를 등록한 쪽이 소유한다. 호스트(board-ai)는 도메인을 모르는 채 **노출된 카테고리의\n * 규율만 모아 붙인다** — 도메인 지식이 호스트 프롬프트로 새지 않는다.\n *\n * ── 왜 필수인가 (2026-09-09) ──────────────────────────────────────────────\n * 선택 필드였다. 그래서 위에 적힌 사고를 아는 사람만 채웠고, 세 제품이 각자 도구를 붙이기\n * 시작한 지금 **채운 넷과 안 채운 하나**가 있었다.\n *\n * 안 채운 쪽은 조용하다 — 등록은 성공하고 부팅도 성공하고, 모델이 도구를 덜 부르거나 지어낸\n * 뒤에 사람이 화면을 보고 안다. **두 개를 기억해야 성립하는 규칙은 다음 새 카테고리까지만\n * 간다.** 그래서 기억이 아니라 등록이 거절한다(§`registerToolCategory`).\n *\n * 빈 문자열도 거절한다. 「없음」을 「적었다」로 위장하는 값이 통과하면 이 강제가 형식이 된다.\n */\n guidance: string\n}\n"]}
@@ -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.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.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.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../server/service/types.ts","../../env/dist/dependency-graph.d.ts","../../env/dist/dependency-order.d.ts","../../env/dist/scene-modules.d.ts","../../env/dist/operato-modules.d.ts","../../env/dist/config.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/triple-beam/index.d.ts","../../../node_modules/logform/index.d.ts","../../../node_modules/winston-transport/index.d.ts","../../../node_modules/winston/lib/winston/config/index.d.ts","../../../node_modules/winston/lib/winston/transports/index.d.ts","../../../node_modules/winston/index.d.ts","../../../node_modules/winston-daily-rotate-file/index.d.ts","../../env/dist/logger.d.ts","../../env/dist/module-manifest.d.ts","../../env/dist/module-loader.d.ts","../../env/dist/app-root-path.d.ts","../../env/dist/app-package.d.ts","../../env/dist/index.d.ts","../server/service/factory.ts","../../../node_modules/@anthropic-ai/sdk/_shims/manual-types.d.ts","../../../node_modules/@anthropic-ai/sdk/_shims/auto/types.d.ts","../../../node_modules/@anthropic-ai/sdk/streaming.d.ts","../../../node_modules/@anthropic-ai/sdk/error.d.ts","../../../node_modules/@anthropic-ai/sdk/_shims/multipartbody.d.ts","../../../node_modules/@anthropic-ai/sdk/uploads.d.ts","../../../node_modules/@anthropic-ai/sdk/core.d.ts","../../../node_modules/@anthropic-ai/sdk/_shims/index.d.ts","../../../node_modules/@anthropic-ai/sdk/pagination.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/shared.d.ts","../../../node_modules/@anthropic-ai/sdk/resource.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/beta/models.d.ts","../../../node_modules/@anthropic-ai/sdk/internal/decoders/line.d.ts","../../../node_modules/@anthropic-ai/sdk/internal/decoders/jsonl.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/messages/batches.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/messages/index.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/messages.d.ts","../../../node_modules/@anthropic-ai/sdk/lib/messagestream.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/messages/messages.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/beta/messages/batches.d.ts","../../../node_modules/@anthropic-ai/sdk/lib/betamessagestream.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/beta/messages/messages.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/beta/beta.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/completions.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/models.d.ts","../../../node_modules/@anthropic-ai/sdk/resources/index.d.ts","../../../node_modules/@anthropic-ai/sdk/index.d.ts","../server/service/utils/parse-json.ts","../server/service/providers/anthropic.ts","../../../node_modules/@google/generative-ai/dist/generative-ai.d.ts","../server/service/providers/gemini.ts","../../../node_modules/openai/_shims/manual-types.d.ts","../../../node_modules/openai/_shims/auto/types.d.ts","../../../node_modules/openai/streaming.d.ts","../../../node_modules/openai/error.d.ts","../../../node_modules/openai/_shims/multipartbody.d.ts","../../../node_modules/openai/uploads.d.ts","../../../node_modules/openai/core.d.ts","../../../node_modules/openai/_shims/index.d.ts","../../../node_modules/openai/pagination.d.ts","../../../node_modules/openai/resource.d.ts","../../../node_modules/openai/resources/shared.d.ts","../../../node_modules/openai/resources/completions.d.ts","../../../node_modules/openai/resources/chat/completions/messages.d.ts","../../../node_modules/openai/resources/chat/completions/completions.d.ts","../../../node_modules/openai/resources/chat/chat.d.ts","../../../node_modules/openai/resources/chat/completions/index.d.ts","../../../node_modules/openai/resources/chat/index.d.ts","../../../node_modules/openai/resources/audio/speech.d.ts","../../../node_modules/openai/resources/audio/transcriptions.d.ts","../../../node_modules/openai/resources/audio/translations.d.ts","../../../node_modules/openai/resources/audio/audio.d.ts","../../../node_modules/openai/resources/batches.d.ts","../../../node_modules/openai/resources/beta/threads/messages.d.ts","../../../node_modules/openai/resources/beta/threads/runs/steps.d.ts","../../../node_modules/openai/resources/beta/threads/runs/runs.d.ts","../../../node_modules/openai/lib/eventstream.d.ts","../../../node_modules/openai/lib/assistantstream.d.ts","../../../node_modules/openai/resources/beta/threads/threads.d.ts","../../../node_modules/openai/resources/beta/assistants.d.ts","../../../node_modules/openai/resources/chat/completions.d.ts","../../../node_modules/openai/lib/abstractchatcompletionrunner.d.ts","../../../node_modules/openai/lib/chatcompletionstream.d.ts","../../../node_modules/openai/lib/responsesparser.d.ts","../../../node_modules/openai/resources/responses/input-items.d.ts","../../../node_modules/openai/lib/responses/eventtypes.d.ts","../../../node_modules/openai/lib/responses/responsestream.d.ts","../../../node_modules/openai/resources/responses/responses.d.ts","../../../node_modules/openai/lib/parser.d.ts","../../../node_modules/openai/lib/chatcompletionstreamingrunner.d.ts","../../../node_modules/openai/lib/jsonschema.d.ts","../../../node_modules/openai/lib/runnablefunction.d.ts","../../../node_modules/openai/lib/chatcompletionrunner.d.ts","../../../node_modules/openai/resources/beta/chat/completions.d.ts","../../../node_modules/openai/resources/beta/chat/chat.d.ts","../../../node_modules/openai/resources/beta/realtime/sessions.d.ts","../../../node_modules/openai/resources/beta/realtime/transcription-sessions.d.ts","../../../node_modules/openai/resources/beta/realtime/realtime.d.ts","../../../node_modules/openai/resources/beta/beta.d.ts","../../../node_modules/openai/resources/containers/files/content.d.ts","../../../node_modules/openai/resources/containers/files/files.d.ts","../../../node_modules/openai/resources/containers/containers.d.ts","../../../node_modules/openai/resources/embeddings.d.ts","../../../node_modules/openai/resources/graders/grader-models.d.ts","../../../node_modules/openai/resources/evals/runs/output-items.d.ts","../../../node_modules/openai/resources/evals/runs/runs.d.ts","../../../node_modules/openai/resources/evals/evals.d.ts","../../../node_modules/openai/resources/files.d.ts","../../../node_modules/openai/resources/fine-tuning/methods.d.ts","../../../node_modules/openai/resources/fine-tuning/alpha/graders.d.ts","../../../node_modules/openai/resources/fine-tuning/alpha/alpha.d.ts","../../../node_modules/openai/resources/fine-tuning/checkpoints/permissions.d.ts","../../../node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.d.ts","../../../node_modules/openai/resources/fine-tuning/jobs/checkpoints.d.ts","../../../node_modules/openai/resources/fine-tuning/jobs/jobs.d.ts","../../../node_modules/openai/resources/fine-tuning/fine-tuning.d.ts","../../../node_modules/openai/resources/graders/graders.d.ts","../../../node_modules/openai/resources/images.d.ts","../../../node_modules/openai/resources/models.d.ts","../../../node_modules/openai/resources/moderations.d.ts","../../../node_modules/openai/resources/uploads/parts.d.ts","../../../node_modules/openai/resources/uploads/uploads.d.ts","../../../node_modules/openai/resources/vector-stores/files.d.ts","../../../node_modules/openai/resources/vector-stores/file-batches.d.ts","../../../node_modules/openai/resources/vector-stores/vector-stores.d.ts","../../../node_modules/openai/resources/index.d.ts","../../../node_modules/openai/index.d.ts","../server/service/providers/openai.ts","../server/service/providers/index.ts","../server/service/utils/grounding.ts","../server/service/utils/transient.ts","../server/service/utils/index.ts","../server/service/tool-registry/types.ts","../server/service/tool-registry/registry.ts","../server/service/tool-registry/index.ts","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../server/service/agentic-loop/agentic-loop.ts","../server/service/agentic-loop/index.ts","../server/service/assistant/abort-notice.ts","../server/service/assistant/summarize.ts","../server/service/assistant/tool-scope.ts","../server/service/assistant/registry-gate.ts","../server/service/assistant/assistant-chat.ts","../server/service/assistant/registry-assistant.ts","../server/service/assistant/index.ts","../server/service/analysis-contract.ts","../server/service/testing/tool-call-context.ts","../server/service/index.ts","../server/index.ts","../../../node_modules/@jest/expect-utils/build/index.d.ts","../../../node_modules/chalk/index.d.ts","../../../node_modules/@sinclair/typebox/typebox.d.ts","../../../node_modules/@jest/schemas/build/index.d.ts","../../../node_modules/pretty-format/build/index.d.ts","../../../node_modules/jest-diff/build/index.d.ts","../../../node_modules/jest-matcher-utils/build/index.d.ts","../../../node_modules/expect/build/index.d.ts","../../../node_modules/@types/jest/index.d.ts"],"fileIdsList":[[72,122,139,140],[72,122,139,140,187,188,193],[72,122,139,140,189,190,192,194],[72,122,139,140,193],[72,122,139,140,190,192,193,194,195,205,209,210,211,212],[72,122,139,140,194,199],[72,122,139,140,190,193,194,208],[72,122,139,140,190,193,194,203],[72,122,139,140,197,198,208],[72,122,139,140,193,195,197,200,208,209],[72,122,139,140,189,193,197,205,206,207,208,209],[72,122,139,140,193,195,197],[72,122,139,140,189,193,197,205,210],[72,122,139,140,196,205,209,210,211],[72,122,139,140,202],[72,122,139,140,193,195,196,197,200,205],[72,122,139,140,201,205],[72,122,139,140,189,193,197,201,204,205],[72,122,139,140,194],[72,122,139,140,191,193,194],[72,122,139,140,319],[72,122,139,140,302],[72,122,139,140,321,324],[72,119,120,122,139,140],[72,121,122,139,140],[122,139,140],[72,122,127,139,140,157],[72,122,123,128,133,139,140,142,154,165],[72,122,123,124,133,139,140,142],[67,68,69,72,122,139,140],[72,122,125,139,140,166],[72,122,126,127,134,139,140,143],[72,122,127,139,140,154,162],[72,122,128,130,133,139,140,142],[72,121,122,129,139,140],[72,122,130,131,139,140],[72,122,132,133,139,140],[72,121,122,133,139,140],[72,122,133,134,135,139,140,154,165],[72,122,133,134,135,139,140,149,154,157],[72,114,122,130,133,136,139,140,142,154,165],[72,122,133,134,136,137,139,140,142,154,162,165],[72,122,136,138,139,140,154,162,165],[70,71,72,73,74,75,76,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[72,122,133,139,140],[72,122,139,140,141,165],[72,122,130,133,139,140,142,154],[72,122,139,140,143],[72,122,139,140,144],[72,121,122,139,140,145],[72,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171],[72,122,139,140,147],[72,122,139,140,148],[72,122,133,139,140,149,150],[72,122,139,140,149,151,166,168],[72,122,134,139,140],[72,122,133,139,140,154,155,157],[72,122,139,140,156,157],[72,122,139,140,154,155],[72,122,139,140,157],[72,122,139,140,158],[72,119,122,139,140,154,159,165],[72,122,133,139,140,160,161],[72,122,139,140,160,161],[72,122,127,139,140,142,154,162],[72,122,139,140,163],[72,122,139,140,142,164],[72,122,136,139,140,148,165],[72,122,127,139,140,166],[72,122,139,140,154,167],[72,122,139,140,141,168],[72,122,139,140,169],[72,114,122,139,140],[72,114,122,133,135,139,140,145,154,157,165,167,168,170],[72,122,139,140,154,171],[72,122,139,140,317,323],[72,122,139,140,321],[72,122,139,140,318,322],[72,122,139,140,173],[72,122,139,140,218,219,224],[72,122,139,140,220,221,223,225],[72,122,139,140,224],[72,122,139,140,221,223,224,225,226,229,231,232,238,239,254,265,268,269,273,274,282,283,284,285,286,288,291,292],[72,122,139,140,224,229,243,247,256,258,259,260,293],[72,122,139,140,224,225,240,241,242,243,245,246],[72,122,139,140,247,248,255,258,293],[72,122,139,140,224,225,231,248,260,293],[72,122,139,140,225,247,248,249,255,258,293],[72,122,139,140,221],[72,122,139,140,228,247,254,260],[72,122,139,140,254],[72,122,139,140,224,243,250,252,254,293],[72,122,139,140,247,254,255],[72,122,139,140,256,257,259],[72,122,139,140,293],[72,122,139,140,227,235,236,237],[72,122,139,140,224,225,227],[72,122,139,140,220,224,227,236,238],[72,122,139,140,224,227,236,238],[72,122,139,140,224,226,227,228,239],[72,122,139,140,224,226,227,228,240,241,242,244,245],[72,122,139,140,227,245,246,261,264],[72,122,139,140,227,260],[72,122,139,140,224,227,247,248,249,255,256,258,259],[72,122,139,140,227,228,262,263,264],[72,122,139,140,224,227],[72,122,139,140,224,226,227,228,246],[72,122,139,140,220,224,226,227,228,240,241,242,244,245,246],[72,122,139,140,224,226,227,228,241],[72,122,139,140,220,224,227,228,240,242,244,245,246],[72,122,139,140,227,228,231],[72,122,139,140,231],[72,122,139,140,220,224,226,227,228,229,230,231],[72,122,139,140,230,231],[72,122,139,140,224,226,227,231],[72,122,139,140,232,233],[72,122,139,140,220,224,227,229,231],[72,122,139,140,224,226,227,267],[72,122,139,140,224,226,227,266],[72,122,139,140,224,226,227,228,254,270,272],[72,122,139,140,224,226,227,272],[72,122,139,140,224,226,227,228,254,271],[72,122,139,140,224,225,226,227],[72,122,139,140,227,276],[72,122,139,140,224,227,270],[72,122,139,140,227,278],[72,122,139,140,224,226,227],[72,122,139,140,227,275,277,279,281],[72,122,139,140,224,226,227,275,280],[72,122,139,140,227,270],[72,122,139,140,227,254],[72,122,139,140,228,229,234,238,239,254,265,268,269,273,274,282,283,284,285,286,288,291],[72,122,139,140,224,226,227,254],[72,122,139,140,220,224,226,227,228,250,251,253,254],[72,122,139,140,224,227,274,287],[72,122,139,140,224,226,227,289,291],[72,122,139,140,224,226,227,291],[72,122,139,140,224,226,227,228,289,290],[72,122,139,140,225],[72,122,139,140,222,224,225],[72,122,139,140,320],[72,86,90,122,139,140,165],[72,86,122,139,140,154,165],[72,81,122,139,140],[72,83,86,122,139,140,162,165],[72,122,139,140,142,162],[72,122,139,140,172],[72,81,122,139,140,172],[72,83,86,122,139,140,142,165],[72,78,79,82,85,122,133,139,140,154,165],[72,86,93,122,139,140],[72,78,84,122,139,140],[72,86,107,108,122,139,140],[72,82,86,122,139,140,157,165,172],[72,107,122,139,140,172],[72,80,81,122,139,140,172],[72,86,122,139,140],[72,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,122,139,140],[72,86,101,122,139,140],[72,86,93,94,122,139,140],[72,84,86,94,95,122,139,140],[72,85,122,139,140],[72,78,81,86,122,139,140],[72,86,90,94,95,122,139,140],[72,90,122,139,140],[72,84,86,89,122,139,140,165],[72,78,83,86,93,122,139,140],[72,122,139,140,154],[72,81,86,107,122,139,140,170,172],[72,122,139,140,175,177],[72,122,139,140,154,172,174],[72,122,139,140,154,172,174,175,176,177],[72,122,136,139,140,172,175],[60,72,122,139,140,315],[60,61,72,122,139,140,298,303],[60,72,122,139,140,304],[60,72,122,139,140],[60,72,122,139,140,298,305],[60,72,122,139,140,298,305,306],[60,72,122,139,140,306,307,308,309,310,311],[60,61,72,122,139,140,298,299,307,308,310],[60,72,122,139,140,301],[60,72,122,139,140,299,301],[60,61,72,122,139,140,185],[60,61,72,122,139,140,186,295,298,301,305,312,313,314],[60,61,72,122,139,140,186,213,214],[60,61,72,122,139,140,186,214,216],[60,72,122,139,140,215,217,294],[60,61,72,122,139,140,186,214,293],[60,72,122,139,140,299],[60,72,122,139,140,299,300],[60,72,122,139,140,214,296,297],[62,63,64,65,66,72,122,139,140,180,181,182,183,184],[72,122,139,140,178,179],[72,122,139,140,181]],"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":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"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":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b50ad4682f959060d41592c42bf370aef89ecc99c238c73a3d3faa77d0ca37b5","signature":"030914ded3a9617a51cb181406c351abae4a492acff77a18d8079c7f5b5b74fd"},"61da60198d58f00210a34b39a0625a136ae63d7cf42500e764b91b2e5e2dbdcb","4c11afc0bcf5ad4cb8351103476e6e8076ad11f563ae65a94a14b94d158d046a","2ffaa1f7886d57fe801bd41337521c661ee17d657d1004e504d5422f62cfd23c","738433a0f2e73b2ba4ebbcaa6487030e0b8aa64e65813a160e1b845e20338d9c","972608570a8b1d91ef22149c069a5c29d75d00b4131e2697ea6d42302d3548b9",{"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":"913be43dad2a40e500104700aa26cfb5c51a976114bedf19624de43fdae7474f","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":"208a6a0bfb227bdf8fb964799d0a206c75cf03ccd72e63bf5495c9331354c6d6","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":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"1bc5991c91bf4be8b59db501ed284a34945d95abe9b7451d02ea001f7c5621a9","impliedFormat":1},{"version":"d8b8a5a6bf623239d5374ad4a7ff6f3b195ab5ee61293f59f1957e90d2a22809","impliedFormat":1},{"version":"35d283eca7dc0a0c7b099f5fbbf0678b87f3d837572cd5e539ba297ad9837e68","impliedFormat":1},{"version":"1c8384a195a2d931cf6e2b8f656acf558ca649a3f74922d86b95889f49a7f7c5","impliedFormat":1},{"version":"cd11655f57a3558dfcee05a6e78c026f9dfd30535eaf124439c5e88a5617359b","impliedFormat":1},{"version":"83a328cba2f47fc5a948eac394ae2ef2a5a0d26dd366ab373d2c2178bbdcd36c","impliedFormat":1},"2aafbaf6ace811133c4858f9184a6597866fbccb89eb6f1b9c4247e87d0bbfed","a113891e4f35eb4f1938fe7fcd813ce6440d020c0e183dbbdf289a6aad7a0407","5b44eaa08688d8e16c633bb23e213a6830de959c9a1f807794357253f0e5fd8e","9e795af82140c310a86279c6f0079d8de3b4db03b4d9476267aa8703a9b7d7a7","46a0b34e1264c4d25ca6646ff0e6cfaa7275ea1ae5a6bc23d4dfd84edf2f2b2e","20d8746a5f897d9ca7eea2dd41e19cdf831ce893c3eb829380332de6109059e2",{"version":"e402028070cdf507828b2fba4cddd8d57d13c1b1338e2ef23b3b9b09094e75bf","signature":"c3a944d44c5dc20264755fa6f42ddeba7f19a90b7a514764a079a46e828ee07c"},{"version":"8727e08f3b0b9929db5f1a9e9233c1ce84f3ded0728ea04e34870fdf35c92460","impliedFormat":1},{"version":"1dab12d45a7ab2b167b489150cc7d10043d97eadc4255bfee8d9e07697073c61","impliedFormat":1},{"version":"611c4448eee5289fb486356d96a8049ce8e10e58885608b1d218ab6000c489b3","impliedFormat":1},{"version":"a75156a8eb6c4c6c121762a96d1fc267096b5512412ece181a64baa78731c84a","impliedFormat":1},{"version":"d47961927fe421b16a444286485165f10f18c2ef7b2b32a599c6f22106cd223b","impliedFormat":1},{"version":"341672ca9475e1625c105a6a99f46e8b4f14dff977e53a828deef7b5e932638f","impliedFormat":1},{"version":"2132cb866b781415f9280c4a3365bab64f8e0a8b6b021cfab868268d0dff759c","impliedFormat":1},{"version":"deb4709b6d78208fa7db5c0ac1180664019321c24a3e2f11e9f2832ebdc0ed6b","impliedFormat":1},{"version":"eeee0bc128bde085ac31373f3a008d5b7b2c82a049dea721bc1cd915a94b7113","impliedFormat":1},{"version":"c2f4c022fd9ba0d424d9a25e34748aab8417b71a655ab65e528a3b00ed90ce6d","impliedFormat":1},{"version":"aa8f345d88a8fd01726038a744b7dc266c0953398b30d6ed9695ded3078d5997","impliedFormat":1},{"version":"6bd040af264aa1b76c3310590ce5e573cf198e80c4ce183b8ddd4ad9a3dfec03","impliedFormat":1},{"version":"edb59d3aa737af65d2ff7245697b5dd6754259739c05bddd830aae1bee5ab0ef","impliedFormat":1},{"version":"023afdc65ad8fe7d208604b5d5a04fb33ed9516ff4e457fdfc61c4f8a722fff8","impliedFormat":1},{"version":"2c87df699eae2e001afc54e6c2d9007a98f4aaca6caf754c43cc0b9464166352","impliedFormat":1},{"version":"e4757f15b8155598e377107e0c3df152ec82cc6ec8f87e239e6c89c08ad76e64","impliedFormat":1},{"version":"396f711944c156303065235a5f4219569bf3468d0aa594c82fb9f4b163e9eb62","impliedFormat":1},{"version":"b2646b3299c70436ae2fc39b31760f2b3a22bbabefc8316f0f0c9fc0efaa2a84","impliedFormat":1},{"version":"9da022af34638c5e3d480c4e6f9682d2336967f30e44fcaf7eecb9a01aa9095b","impliedFormat":1},{"version":"85dc0f6eb89e455c7505dc48d8a9422c2259f1d144b14f2238e791453355f5b5","impliedFormat":1},{"version":"6876f5f48d28f1256420752c057d08b4b3ae5f024930475e9bf8aeffb009cd30","impliedFormat":1},{"version":"0cf5b4d36b8d013bd7c1b1302f34d904c12cd2f3c07bb51d0c7042c0ea83fa60","impliedFormat":1},{"version":"55138ffd46c24194af1fc2d298faee0f5f42a71e5687919b962a20962815fa2b","impliedFormat":1},{"version":"bef88efba8852386d816a3a83fad1609a3214faa0cdf7a447c308cf1d15efc2a","impliedFormat":1},{"version":"2a974f024550d5c45fba33d899291a108b6906678fe36bcb9db6739919495d92","impliedFormat":1},{"version":"bc4cb88a0bd52e13d599dc1d61aa8a6234b509e6a81782d3d91517125ffc8c5d","impliedFormat":1},{"version":"f740e94014daa37b0fc90a9e30bf2455c6c5a6c969164e8a705515bc008b9996","impliedFormat":1},{"version":"d941fd4a46bddc870508bf1dcc367e8d9f7ce6c8a73cde059c902d446f25b03a","signature":"d47d90c50d7b3eeb497bfee327ffd5096b1828405e9d549d22b885a2453227e3"},{"version":"d7a6d8923fce240a602f13ed3c7aa24becceb40238802694f54b1427d92e5674","signature":"f0c2de3b2ee12d861786540076ea86887ade022875ebe512e310235288283dc6"},{"version":"878cca70d0472e4cd4d35298e5206f5f90f55a0ec4199da41ec6131d40faf155","impliedFormat":1},{"version":"76aefb4eb07ea212a554458097738ba89a8e30d465feaed0da3792c052e03684","signature":"5b2ce6be76c8df2f15fa3e6bb758b72244de049f0abea2aff46114a73c81ad3a"},{"version":"b1535397a73ca6046ca08957788a4c9a745730c7b2b887e9b9bc784214f3abac","impliedFormat":1},{"version":"1dab12d45a7ab2b167b489150cc7d10043d97eadc4255bfee8d9e07697073c61","impliedFormat":1},{"version":"611c4448eee5289fb486356d96a8049ce8e10e58885608b1d218ab6000c489b3","impliedFormat":1},{"version":"5de017dece7444a2041f5f729fe5035c3e8a94065910fbd235949a25c0c5b035","impliedFormat":1},{"version":"d47961927fe421b16a444286485165f10f18c2ef7b2b32a599c6f22106cd223b","impliedFormat":1},{"version":"341672ca9475e1625c105a6a99f46e8b4f14dff977e53a828deef7b5e932638f","impliedFormat":1},{"version":"d3b5d359e0523d0b9f85016266c9a50ce9cda399aeac1b9eeecb63ba577e4d27","impliedFormat":1},{"version":"5b9f65234e953177fcc9088e69d363706ccd0696a15d254ac5787b28bdfb7cb0","impliedFormat":1},{"version":"510a5373df4110d355b3fb5c72dfd3906782aeacbb44de71ceee0f0dece36352","impliedFormat":1},{"version":"137272a656222e83280287c3b6b6d949d38e6c125b48aff9e987cf584ff8eb42","impliedFormat":1},{"version":"eb76f85d8a8893360da026a53b39152237aaa7f033a267009b8e590139afd7de","impliedFormat":1},{"version":"fcd615891bdf6421c708b42a6006ed8b0cf50ca0ac2b37d66a5777d8222893ce","impliedFormat":1},{"version":"84a28d684e49bae482c89c996e8aeaabf44c0355237a3a1303749da2161a90c1","impliedFormat":1},{"version":"89c36d61bae1591a26b3c08db2af6fdd43ffaab0f96646dead5af39ff0cf44d3","impliedFormat":1},{"version":"5277b2beeb856b348af1c23ffdaccde1ec447abede6f017a0ab0362613309587","impliedFormat":1},{"version":"d4b6804b4c4cb3d65efd5dc8a672825cea7b39db98363d2d9c2608078adce5f8","impliedFormat":1},{"version":"929f67e0e7f3b3a3bcd4e17074e2e60c94b1e27a8135472a7d002a36cd640629","impliedFormat":1},{"version":"bd8e8f02d1b0ebfa518f7d8b5f0db06ae260c192e211a1ef86397f4b49ee198f","impliedFormat":1},{"version":"71b32ccf8c508c2f7445b1b2c144dd7eef9434f7bfa6a92a9ebd0253a75cb54a","impliedFormat":1},{"version":"4fd8e7e446c8379cfb1f165961b1d2f984b40d73f5ad343d93e33962292ec2e0","impliedFormat":1},{"version":"45079ac211d6cfda93dd7d0e7fc1cf2e510dad5610048ef71e47328b765515be","impliedFormat":1},{"version":"1c19f268e0f1ed1a6485ca80e0cfd4e21bdc71cb974e2ac7b04b5fce0a91482b","impliedFormat":1},{"version":"7ae8f8b4f56ba486dc9561d873aae5b3ad263ffb9683c8f9ffc18d25a7fd09a4","impliedFormat":1},{"version":"e0ab56e00ef473df66b345c9d64e42823c03e84d9a679020746d23710c2f9fce","impliedFormat":1},{"version":"d99deead63d250c60b647620d1ddaf497779aef1084f85d3d0a353cbc4ea8a60","impliedFormat":1},{"version":"ba64b14db9d08613474dc7c06d8ffbcb22a00a4f9d2641b2dcf97bc91da14275","impliedFormat":1},{"version":"530197974beb0a02c5a9eb7223f03e27651422345c8c35e1a13ddc67e6365af5","impliedFormat":1},{"version":"512c43b21074254148f89bd80ae00f7126db68b4d0bd1583b77b9c8af91cc0d3","impliedFormat":1},{"version":"0bfacd36c923f059779049c6c74c00823c56386397a541fefc8d8672d26e0c42","impliedFormat":1},{"version":"19d04b82ed0dc5ba742521b6da97f22362fe40d6efa5ca5650f08381e5c939b2","impliedFormat":1},{"version":"f02ac71075b54b5c0a384dddbd773c9852dba14b4bf61ca9f1c8ba6b09101d3e","impliedFormat":1},{"version":"bbf0ae18efd0b886897a23141532d9695435c279921c24bcb86090f2466d0727","impliedFormat":1},{"version":"067670de65606b4aa07964b0269b788a7fe48026864326cd3ab5db9fc5e93120","impliedFormat":1},{"version":"7a094146e95764e687120cdb840d7e92fe9960c2168d697639ad51af7230ef5e","impliedFormat":1},{"version":"21290aaea56895f836a0f1da5e1ef89285f8c0e85dc85fd59e2b887255484a6f","impliedFormat":1},{"version":"a07254fded28555a750750f3016aa44ec8b41fbf3664b380829ed8948124bafe","impliedFormat":1},{"version":"f14fbd9ec19692009e5f2727a662f841bbe65ac098e3371eb9a4d9e6ac05bca7","impliedFormat":1},{"version":"46f640a5efe8e5d464ced887797e7855c60581c27575971493998f253931b9a3","impliedFormat":1},{"version":"cdf62cebf884c6fde74f733d7993b7e255e513d6bc1d0e76c5c745ac8df98453","impliedFormat":1},{"version":"e6dd8526d318cce4cb3e83bef3cb4bf3aa08186ddc984c4663cf7dee221d430e","impliedFormat":1},{"version":"bc79e5e54981d32d02e32014b0279f1577055b2ebee12f4d2dc6451efd823a19","impliedFormat":1},{"version":"ce9f76eceb4f35c5ecd9bf7a1a22774c8b4962c2c52e5d56a8d3581a07b392f9","impliedFormat":1},{"version":"7d390f34038ca66aef27575cffb5a25a1034df470a8f7789a9079397a359bf8b","impliedFormat":1},{"version":"18084f07f6e85e59ce11b7118163dff2e452694fffb167d9973617699405fbd1","impliedFormat":1},{"version":"6af607dd78a033679e46c1c69c126313a1485069bdec46036f0fbfe64e393979","impliedFormat":1},{"version":"44c556b0d0ede234f633da4fb95df7d6e9780007003e108e88b4969541373db1","impliedFormat":1},{"version":"ef1491fb98f7a8837af94bfff14351b28485d8b8f490987820695cedac76dc99","impliedFormat":1},{"version":"0d4ba4ad7632e46bab669c1261452a1b35b58c3b1f6a64fb456440488f9008cf","impliedFormat":1},{"version":"74a0fa488591d372a544454d6cd93bbadd09c26474595ea8afed7125692e0859","impliedFormat":1},{"version":"0a9ae72be840cc5be5b0af985997029c74e3f5bcd4237b0055096bb01241d723","impliedFormat":1},{"version":"920004608418d82d0aad39134e275a427255aaf1dafe44dca10cc432ef5ca72a","impliedFormat":1},{"version":"1c87dfe5efcac5c2cd5fc454fe5df66116d7dc284b6e7b70bd30c07375176b36","impliedFormat":1},{"version":"3ac2bd86af2bab352d126ccdde1381cd4db82e3d09a887391c5c1254790727a1","impliedFormat":1},{"version":"2efc9ad74a84d3af0e00c12769a1032b2c349430d49aadebdf710f57857c9647","impliedFormat":1},{"version":"f18cc4e4728203a0282b94fc542523dfd78967a8f160fabc920faa120688151f","impliedFormat":1},{"version":"cc609a30a3dd07d6074290dadfb49b9f0f2c09d0ae7f2fa6b41e2dae2432417b","impliedFormat":1},{"version":"6362fcd24c5b52eb88e9cf33876abd9b066d520fc9d4c24173e58dcddcfe12d5","impliedFormat":1},{"version":"c473f6bd005279b9f3a08c38986f1f0eaf1b0f9d094fec6bc66309e7504b6460","impliedFormat":1},{"version":"0043ff78e9f07cbbbb934dd80d0f5fe190437715446ec9550d1f97b74ec951ac","impliedFormat":1},{"version":"bdc013746db3189a2525e87e2da9a6681f78352ef25ae513aa5f9a75f541e0ae","impliedFormat":1},{"version":"4f567b8360c2be77e609f98efc15de3ffcdbe2a806f34a3eba1ee607c04abab6","impliedFormat":1},{"version":"615bf0ac5606a0e79312d70d4b978ac4a39b3add886b555b1b1a35472327034e","impliedFormat":1},{"version":"818e96d8e24d98dfd8fd6d9d1bbabcac082bcf5fbbe64ca2a32d006209a8ee54","impliedFormat":1},{"version":"18b0b9a38fe92aa95a40431676b2102139c5257e5635fe6a48b197e9dcb660f1","impliedFormat":1},{"version":"86b382f98cb678ff23a74fe1d940cbbf67bcd3162259e8924590ecf8ee24701e","impliedFormat":1},{"version":"aeea2c497f27ce34df29448cbe66adb0f07d3a5d210c24943d38b8026ffa6d3c","impliedFormat":1},{"version":"aa064f60b7e64c04a759f5806a0d82a954452300ee27566232b0cf5dad5b6ba6","impliedFormat":1},{"version":"7ffb4e58ca1b9ed5f26bed3dc0287c4abd7a2ba301ca55e2546d01a7f7f73de7","impliedFormat":1},{"version":"65a6307cc74644b8813e553b468ea7cc7a1e5c4b241db255098b35f308bfc4b5","impliedFormat":1},{"version":"0fbe1a754e3da007cc2726f61bc8f89b34b466fe205b20c1e316eb240bebe9e8","impliedFormat":1},{"version":"aa2f3c289c7a3403633e411985025b79af473c0bf0fdd980b9712bd6a1705d59","impliedFormat":1},{"version":"e140d9fa025dadc4b098c54278271a032d170d09f85f16f372e4879765277af8","impliedFormat":1},{"version":"70d9e5189fd4dabc81b82cf7691d80e0abf55df5030cc7f12d57df62c72b5076","impliedFormat":1},{"version":"a96be3ed573c2a6d4c7d4e7540f1738a6e90c92f05f684f5ee2533929dd8c6b2","impliedFormat":1},{"version":"0c73536b65135298d43d1ef51dd81a6eba3b69ef0ce005db3de11365fda30a55","impliedFormat":1},{"version":"2a545aa0bc738bd0080a931ccf8d1d9486c75cbc93e154597d93f46d2f3be3b4","impliedFormat":1},{"version":"56803867c2ff5fd2c6ddec523df2ed03d9d3aa07f4f2b7ff3645a21f4c32ccfb","signature":"7048a0334753043ac40c97f740b0c570d45153abdc4d5971bf9a4f206016ff81"},{"version":"d474bb4a44492c182b5a96a39fb1af20b893deed6e9effde918eb854c25193d4","signature":"d0d5e6c40fcfb14a60ffa82ac97d83b2e694583fc84c8238f9733237744d114d"},{"version":"9cf09bc3432679b411e62de6588cdafb4cba1501a986335cc9b22148fae706ea","signature":"fc234116255c165988e9e7cf0d0ff231806272e3467bb9518e9f1f15dba996bd"},{"version":"cbdb89bea41c405603f30ef117384ee7f46377e320ac27548492515ba9f7c2ca","signature":"ac3f46f5bc96fe50bbe280bcc3df3537f95dbc17c3a620a18c87bfdc76a1afef"},{"version":"793ce024127b03acaca95b2ea497637c56419ca6ac92a02379d3fa10bdc8c08c","signature":"227da327ba96814798a4676d18c99f2e82193d1679b2e3196f6d4465dc4fe428"},{"version":"58632babad29f46ad7507e92392b563b3ba6010e357541450390f3d52c6f2cab","signature":"79361db6857baa62867e71873a593ff5e655ee48a4f62641c1412b9d5cd3e845"},{"version":"933362e6a1766f8403953ec5367083e49b2c80e2937a5e1721f75d8652b6ba1e","signature":"18385d7d9b0be639d38c729777f6bcf22106494080bc9bc38ace77eae9c1bc45"},{"version":"7b47404ef0f95b88cab9704c3b8a60f85c75f1ce841b4a672b52c196caf6598f","signature":"fe6df9a31ef8477ea7cedc9999cc61427a55eedbdb4553ff5cdd68014608e757"},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"89e326922cadcc2331d7e851011cf9f0456a681aaf3c95b48b81f8d80e8cdfba","impliedFormat":1},{"version":"9d33091b4e67c102dc792d8e37677dc9ca320411aee33c2fc7f4da9b7ecfe8f4","signature":"eb283cda573291d0d8cd9a6d8a709656c0cbe3a725568f4c6f326a3da6d9901e"},{"version":"226412856e089cbc14d4a4d6188ea20b6fdba6cd0714de2a82cf6bc3432a62e3","signature":"5af61b3b579a9a880ce05be09c427fd0d8983726bfa12d15486099e4b7db8bdf"},{"version":"3137137a623222afdabf5b5c2520b3a0ef28b9524711da024f5adf960b8e8094","signature":"dfd2320e5918f44c3838356fd506096fa4195addc1c55e15bd625a7e7ac9e913"},{"version":"52571b91879393d08ed11c97b596a7239165930091730c43b4595355566baae1","signature":"f2671ab690ea462f413ab4bec5762df02736a58cff71645f8d9aa1e34e0f91f9"},{"version":"3edf594125b3d16986af084aa679ad8bd220ec93ad792cddc1466e451d42c561","signature":"2e9d667860242a993d8d7f8f124491761b479059b88966f7ce10e4689934f56c"},{"version":"d169ddf5e51c87d73f031ae34731dbcc34065e329b97f0dc2bc43d21734e2e08","signature":"c7d3d96e41f81fb3bf0dbee51c58a612ad8e8e52bb92d5bbaf2718cb8484a3ae"},{"version":"ce89e524335dc639f9e657947b97b65ef7323f70761f5f4372d13d1f94f39cab","signature":"ef99912c317e21105dcc367169e07d6536e756b7f3cf43e294dc8463fd241d5d"},{"version":"eea53c76381b2cdb81f9f92a2a34c364536e9c7c748c6931446f42d5c2825094","signature":"e20946e2e2e63c2d1804540342c93c2ddc829f0381c1debcf5f0669c96d68b19"},{"version":"1c08f49d8a66aff3442e9d91625e5635b7a88cf35a43b55f49672949d819ef70","signature":"d187b4e3e1a04c64b5c93fe0d30f3a275bfa6a89c2f493d71a6240a89db09056"},{"version":"1db9ce3c7ebe7d4d48e43758b79e46023f7507e1199c0d9b022e1d3a21703d11","signature":"9405a12cd7747ee3010a7a57b8f6804b95ea27209c2dd9d1f9b4f8d3b90d1528"},{"version":"f451695acedfc0f648bc22afb17dd5cba936dd28130a29f43349329f716c4378","signature":"5be4337d4df44645094fabd2c78101bd10fe67b6b09b175bb4347c04aeb44be5"},{"version":"787ec2cb9b94f5b01905cea10d1f23f6c48cead3b350f123610b920d17b148db","signature":"83d82c8d9554ec62080f51aa9ce27140245c9da21f98ef9b4e113c0fa7ca1e23"},{"version":"cd1b3f7cc45861ad65cba283b71c569d1c5368728dcaa262c5aa44925320e1c3","signature":"75740cae8152235182c5dd737fa4073ab76afa24cfa430d94b514e79941539db"},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"e1028394c1cf96d5d057ecc647e31e457b919092f882ed0c7092152b077fed9d","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"f8db4fea512ab759b2223b90ecbbe7dae919c02f8ce95ec03f7fb1cf757cfbeb","affectsGlobalScope":true,"impliedFormat":1}],"root":[61,186,214,215,217,[294,301],[304,316]],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"inlineSources":true,"module":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./","skipLibCheck":true,"sourceMap":true,"strict":false,"target":9,"useDefineForClassFields":false},"referencedMap":[[188,1],[194,2],[187,1],[191,1],[193,3],[190,4],[213,5],[200,6],[199,1],[207,7],[204,8],[195,4],[197,4],[209,9],[206,10],[208,11],[198,12],[210,13],[212,14],[203,15],[201,16],[202,17],[205,18],[211,12],[196,1],[189,19],[192,20],[216,1],[317,1],[320,21],[319,1],[303,22],[325,23],[302,1],[119,24],[120,24],[121,25],[72,26],[122,27],[123,28],[124,29],[67,1],[70,30],[68,1],[69,1],[125,31],[126,32],[127,33],[128,34],[129,35],[130,36],[131,36],[132,37],[133,38],[134,39],[135,40],[73,1],[71,1],[136,41],[137,42],[138,43],[172,44],[139,45],[140,1],[141,46],[142,47],[143,48],[144,49],[145,50],[146,51],[147,52],[148,53],[149,54],[150,54],[151,55],[152,1],[153,56],[154,57],[156,58],[155,59],[157,60],[158,61],[159,62],[160,63],[161,64],[162,65],[163,66],[164,67],[165,68],[166,69],[167,70],[168,71],[169,72],[74,1],[75,1],[76,1],[115,73],[116,1],[117,1],[118,60],[170,74],[171,75],[173,1],[77,1],[318,1],[324,76],[322,77],[323,78],[174,79],[219,1],[225,80],[218,1],[222,1],[224,81],[221,82],[293,83],[248,84],[244,85],[259,86],[249,87],[256,88],[243,89],[257,1],[255,90],[252,91],[253,92],[250,93],[258,94],[226,82],[227,95],[238,96],[235,97],[236,98],[237,99],[239,100],[246,101],[265,102],[261,103],[260,104],[264,105],[262,106],[263,106],[240,107],[242,108],[241,109],[245,110],[232,111],[247,112],[231,113],[233,114],[230,115],[234,116],[229,117],[268,118],[266,97],[267,119],[269,106],[273,120],[271,121],[272,122],[274,123],[277,124],[276,125],[279,126],[278,127],[282,128],[280,127],[281,129],[275,130],[270,131],[283,130],[284,106],[292,132],[285,127],[286,106],[251,133],[254,134],[228,1],[287,106],[288,135],[290,136],[289,137],[291,138],[220,139],[223,140],[321,141],[60,1],[58,1],[59,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[93,142],[103,143],[92,142],[113,144],[84,145],[83,146],[112,147],[106,148],[111,149],[86,150],[100,151],[85,152],[109,153],[81,154],[80,147],[110,155],[82,156],[87,157],[88,1],[91,157],[78,1],[114,158],[104,159],[95,160],[96,161],[98,162],[94,163],[97,164],[107,147],[89,165],[90,166],[99,167],[79,168],[102,159],[101,157],[105,1],[108,169],[179,170],[175,171],[178,172],[176,147],[177,173],[316,174],[304,175],[305,176],[313,177],[306,178],[310,179],[312,180],[311,181],[309,182],[307,177],[308,183],[186,184],[315,185],[215,186],[217,187],[295,188],[294,189],[314,190],[301,191],[300,190],[299,177],[61,177],[296,177],[298,192],[214,177],[297,177],[184,1],[183,1],[66,1],[62,1],[63,1],[185,193],[180,194],[182,195],[181,1],[65,1],[64,1]],"version":"5.9.3"}
@@ -29,7 +29,7 @@ It rejects an envelope that omits the explicit human-approval boundary.
29
29
  | Twin | KPI, journal, baseline, forecast, and what-if calculations | Causal engineering claims and simulation assumptions |
30
30
  | Plant | Execution records, production/OEE facts, and permitted actions | Shop-floor authority and action semantics |
31
31
  | Figure | FigureSource, palette, geometry budgets, and render evidence | Type invariants, release gates, and visual quality rules |
32
- | Board | Board schema, selected objects, and `BoardEditPatch` candidates | Scene editing scope and component compatibility |
32
+ | Board | Board schema, selected objects, and `SceneEditPatch` candidates | Scene editing scope and component compatibility |
33
33
 
34
34
  ## Current adoption status
35
35
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/ai-client-base",
3
- "version": "10.1.25",
3
+ "version": "10.1.26",
4
4
  "main": "dist-server/index.js",
5
5
  "things-factory": true,
6
6
  "author": "heartyoh",
@@ -27,5 +27,5 @@
27
27
  "@things-factory/env": "^10.1.20",
28
28
  "openai": "^4.0.0"
29
29
  },
30
- "gitHead": "8407b1e9d1f47f6676af144d4a33c8ac01cb49c4"
30
+ "gitHead": "151bda14d899442c6846532ddded1e2bfe23a2f5"
31
31
  }
@@ -1,5 +1,4 @@
1
1
  import assert from 'node:assert/strict'
2
- import test from 'node:test'
3
2
 
4
3
  import { isGroundedAnalysisContract } from './analysis-contract.ts'
5
4
 
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export * from './abort-notice.js'
7
7
  export * from './summarize.js'
8
+ export * from './tool-scope.js'
8
9
  export * from './registry-gate.js'
9
10
  export * from './assistant-chat.js'
10
11
  export * from './registry-assistant.js'
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import { registryAssistantChat } from './registry-assistant'
15
15
  import { clearToolRegistry, registerToolCategory } from '../tool-registry/index.js'
16
+ import { toolCallContextFixture } from '../testing/tool-call-context.js'
16
17
  import type { AIToolCall, AIToolChatResult } from '../types.js'
17
18
 
18
19
  const TC = (name: string, args: any = {}, id = 't1'): AIToolCall =>
@@ -60,6 +61,7 @@ beforeEach(() => {
60
61
  kind: 'write',
61
62
  name: 'addComponent',
62
63
  description: 'adds a component to the document',
64
+ privilege: { category: 'board', privilege: 'mutation' },
63
65
  schema: { type: 'object', properties: {} },
64
66
  builder: () => {
65
67
  ran.push({ name: 'addComponent', args: {}, context: null })
@@ -74,7 +76,7 @@ beforeEach(() => {
74
76
  guidance: 'Never state a quantity you did not read.',
75
77
  specs: [
76
78
  {
77
- kind: 'external',
79
+ kind: 'read',
78
80
  name: 'readOrderState',
79
81
  description: 'reads live order state',
80
82
  schema: { type: 'object', properties: {} },
@@ -85,6 +87,40 @@ beforeEach(() => {
85
87
  }
86
88
  ]
87
89
  } as any)
90
+
91
+ /*
92
+ * A category whose tools change something outside the conversation, each behind the same
93
+ * privilege its GraphQL door uses. This is the shape of board-import's `materializeImportSession`,
94
+ * which creates a Board.
95
+ */
96
+ registerToolCategory({
97
+ name: 'board-import',
98
+ guidance: 'Create a board only after the user confirms.',
99
+ specs: [
100
+ {
101
+ kind: 'read',
102
+ name: 'getImportSession',
103
+ description: 'reads an import session',
104
+ privilege: { category: 'board-import', privilege: 'query' },
105
+ schema: { type: 'object', properties: {} },
106
+ builder: (args: any, context: any) => {
107
+ ran.push({ name: 'getImportSession', args, context })
108
+ return { status: 'completed' }
109
+ }
110
+ },
111
+ {
112
+ kind: 'external',
113
+ name: 'materializeImportSession',
114
+ description: 'creates a board from an import session',
115
+ privilege: { category: 'board-import', privilege: 'mutation' },
116
+ schema: { type: 'object', properties: {} },
117
+ builder: (args: any, context: any) => {
118
+ ran.push({ name: 'materializeImportSession', args, context })
119
+ return { boardId: 'b-1' }
120
+ }
121
+ }
122
+ ]
123
+ } as any)
88
124
  })
89
125
 
90
126
  const input = (over: any = {}) => ({
@@ -98,7 +134,7 @@ const input = (over: any = {}) => ({
98
134
  describe('what the model is offered', () => {
99
135
  it('★ only the kinds that answer — a write tool is not offered to a surface with no document', async () => {
100
136
  const { client, seen } = recordingClient()
101
- await registryAssistantChat(input({ client }))
137
+ await registryAssistantChat(input({ client, toolCategories: ['figure-authoring', 'plant-ops'] }))
102
138
 
103
139
  const offered = seen[0].tools.map(tool => tool.name)
104
140
  expect(offered).toEqual(expect.arrayContaining(['listFigures', 'readOrderState']))
@@ -147,7 +183,7 @@ describe('running a tool', () => {
147
183
  const { client } = recordingClient([okResult(undefined, [TC('listFigures', { q: 'roller' })]), okResult('two of them')])
148
184
 
149
185
  const result = await registryAssistantChat(
150
- input({ client, hostContext: { surface: 'figure-modeller', figureId: 'fig-1' } })
186
+ input({ client, toolCategories: ['figure-authoring'], hostContext: { surface: 'figure-modeller', figureId: 'fig-1' } })
151
187
  )
152
188
 
153
189
  expect(ran).toHaveLength(1)
@@ -158,10 +194,12 @@ describe('running a tool', () => {
158
194
  expect(result.reply).toContain('two of them')
159
195
  })
160
196
 
197
+
161
198
  it('★ a write tool call is not executed — the same set decides offering and dispatch', async () => {
162
199
  const { client } = recordingClient([okResult(undefined, [TC('addComponent')]), okResult('cannot do that')])
163
200
 
164
- await registryAssistantChat(input({ client }))
201
+ /* The category is allowed; the kind is what keeps the write out. */
202
+ await registryAssistantChat(input({ client, toolCategories: ['figure-authoring'] }))
165
203
 
166
204
  expect(ran.map(one => one.name)).not.toContain('addComponent')
167
205
  })
@@ -175,6 +213,95 @@ describe('running a tool', () => {
175
213
  })
176
214
  })
177
215
 
216
+ describe('what a tool is handed (A3)', () => {
217
+ it('★ exactly the shared shape — state and host side by side', async () => {
218
+ const { client } = recordingClient([okResult(undefined, [TC('listFigures')]), okResult('ok')])
219
+ const state = { domain: { id: 'dom-1' }, user: { id: 'u-1' } }
220
+
221
+ await registryAssistantChat(input({ client, state, toolCategories: ['figure-authoring'], hostContext: { figureId: 'fig-1' } }))
222
+
223
+ expect(ran[0].context).toEqual(toolCallContextFixture({ domainId: 'dom-1', userId: 'u-1', host: { figureId: 'fig-1' } }))
224
+ expect(ran[0].context.state).not.toHaveProperty('host')
225
+ })
226
+
227
+ it('★ host is an empty object when the surface sent none — a tool never reads it off undefined', async () => {
228
+ const { client } = recordingClient([okResult(undefined, [TC('listFigures')]), okResult('ok')])
229
+
230
+ await registryAssistantChat(input({ client, toolCategories: ['figure-authoring'] }))
231
+
232
+ expect(ran[0].context.host).toEqual({})
233
+ })
234
+ })
235
+
236
+ describe('who may use a tool (A1)', () => {
237
+ const grantAll = async () => true
238
+ const denyAll = async () => false
239
+
240
+ it('★ omitting the category list offers nothing and runs nothing', async () => {
241
+ const { client, seen } = recordingClient([okResult(undefined, [TC('listFigures')]), okResult('done')])
242
+
243
+ await registryAssistantChat(input({ client, toolAccess: grantAll }))
244
+
245
+ expect(seen[0].tools).toEqual([])
246
+ expect(ran).toHaveLength(0)
247
+ })
248
+
249
+ it('★ a tool that changes something outside is not offered here, even with the privilege', async () => {
250
+ const { client, seen } = recordingClient([okResult(undefined, [TC('materializeImportSession')]), okResult('done')])
251
+
252
+ await registryAssistantChat(input({ client, toolCategories: ['board-import'], toolAccess: grantAll }))
253
+
254
+ expect(seen[0].tools.map((t: any) => t.name)).not.toContain('materializeImportSession')
255
+ expect(ran.map(one => one.name)).not.toContain('materializeImportSession')
256
+ })
257
+
258
+ it('★ a tool behind a privilege the caller lacks is neither offered nor run when called by name', async () => {
259
+ const { client, seen } = recordingClient([okResult(undefined, [TC('getImportSession')]), okResult('done')])
260
+
261
+ await registryAssistantChat(input({ client, toolCategories: ['board-import'], toolAccess: denyAll }))
262
+
263
+ expect(seen[0].tools.map((t: any) => t.name)).not.toContain('getImportSession')
264
+ expect(ran.map(one => one.name)).not.toContain('getImportSession')
265
+ })
266
+
267
+ it('★ with no access check at all, a tool behind a privilege stays closed', async () => {
268
+ const { client, seen } = recordingClient([okResult(undefined, [TC('getImportSession')]), okResult('done')])
269
+
270
+ await registryAssistantChat(input({ client, toolCategories: ['board-import'] }))
271
+
272
+ expect(seen[0].tools.map((t: any) => t.name)).not.toContain('getImportSession')
273
+ expect(ran.map(one => one.name)).not.toContain('getImportSession')
274
+ })
275
+
276
+ it('the access check is asked with the privilege the tool declares, and a grant opens the tool', async () => {
277
+ const asked: any[] = []
278
+ const { client, seen } = recordingClient([okResult(undefined, [TC('getImportSession')]), okResult('done')])
279
+
280
+ await registryAssistantChat(
281
+ input({
282
+ client,
283
+ toolCategories: ['board-import'],
284
+ toolAccess: async (privilege: any) => {
285
+ asked.push(privilege)
286
+ return privilege.privilege === 'query'
287
+ }
288
+ })
289
+ )
290
+
291
+ expect(asked).toContainEqual({ category: 'board-import', privilege: 'query' })
292
+ expect(seen[0].tools.map((t: any) => t.name)).toContain('getImportSession')
293
+ expect(ran.map(one => one.name)).toContain('getImportSession')
294
+ })
295
+
296
+ it('guidance of a category whose every tool is withheld is not read to the model', async () => {
297
+ const { client, seen } = recordingClient()
298
+
299
+ await registryAssistantChat(input({ client, toolCategories: ['board-import'], toolAccess: denyAll }))
300
+
301
+ expect(seen[0].options.systemPrompt).not.toContain('Create a board only after the user confirms.')
302
+ })
303
+ })
304
+
178
305
  describe('a client that cannot call tools', () => {
179
306
  it('★ refuses instead of answering from nothing', async () => {
180
307
  await expect(registryAssistantChat(input({ client: {} as any }))).rejects.toThrow(/cannot call tools/)
@@ -9,28 +9,24 @@
9
9
  * operato-figure hit exactly that: the dock was mounted, the tools were registered, and the only
10
10
  * mutation that could run them lived in a package figure does not load.
11
11
  *
12
- * ── Read and external only ─────────────────────────────────────────────────────
12
+ * ── Read only ──────────────────────────────────────────────────────────────────
13
13
  * A registry category may also carry `write` and `action` tools. Those produce edit ops for a
14
14
  * document the host owns, and a host with no document cannot apply them. Offering them here would
15
15
  * declare a door with no road behind it — the model would call one and the call would go nowhere.
16
- * So this runner offers, and dispatches, `read` and `external` only. A host that owns a document
17
- * keeps assembling its own conversation, as board-ai does.
16
+ * `external` tools change something outside the conversation (board-import's
17
+ * `materializeImportSession` creates a Board) and this door has no confirm-and-apply step, so they
18
+ * are not offered either (A1, 2026-09-17). This runner offers, and dispatches, `read` only.
18
19
  *
19
20
  * The gate answers from the same list the definitions are built from, so what is offered and what
20
21
  * may be dispatched cannot drift apart.
21
22
  */
22
23
  import type { AIClient, AIMessage } from '../types.js'
23
- import { getCategoryGuidance, getToolSpecsFor, type ToolCategoryFilter, type ToolSpec } from '../tool-registry/index.js'
24
+ import { narrowToolScope, resolveToolScope, toolScopeGuidance, type ToolAccessCheck } from './tool-scope.js'
24
25
  import { assistantChat, type AssistantChatResult } from './assistant-chat.js'
25
26
  import { summarizeToolResult } from './summarize.js'
26
27
  import type { GroundingSources } from '../utils/index.js'
28
+ import type { ToolCallContext } from '../tool-registry/types.js'
27
29
 
28
- /** What a registry tool is handed when it runs. `state` is the caller's koa state. */
29
- export interface RegistryToolCallContext {
30
- state: any
31
- /** What this surface is looking at — the host passes it through; tools read it as `host`. */
32
- host?: any
33
- }
34
30
 
35
31
  export interface RegistryAssistantInput {
36
32
  /** Provider client. Must implement `chatWithTools`. */
@@ -40,12 +36,17 @@ export interface RegistryAssistantInput {
40
36
  /** Who the assistant is and what this surface is. The host owns this prose. */
41
37
  systemPrompt: string
42
38
  /**
43
- * Categories this conversation may use. Omit to allow every registered category.
44
- *
45
- * An empty array is not the same as omitting: it allows nothing, and the conversation runs with
46
- * no tools at all. That is a legitimate surface (plain chat), so it is not corrected here.
39
+ * Categories this conversation may use. **Omitting it allows nothing** — the same as an empty
40
+ * list, a plain conversation with no tools (A1, 2026-09-17). It used to mean every registered
41
+ * category, which is how a Board-creating tool reached any conversation.
47
42
  */
48
43
  toolCategories?: string[]
44
+ /**
45
+ * Answers whether the caller holds a tool's declared privilege. Without it, every tool that
46
+ * declares a privilege stays closed. The host builds it from the request — this package does
47
+ * not know auth.
48
+ */
49
+ toolAccess?: ToolAccessCheck
49
50
  /** Passed to tools as `context.host`. Client-supplied — never used for authorization. */
50
51
  hostContext?: any
51
52
  /** Caller's koa state (domain, user, tx). Tools that read the database need it. */
@@ -64,11 +65,6 @@ export interface RegistryAssistantResult extends AssistantChatResult<unknown> {
64
65
  offeredTools: string[]
65
66
  }
66
67
 
67
- /** `read` and `external` are the two kinds that answer a question without changing a document. */
68
- function answeringSpecs(filter: ToolCategoryFilter): ToolSpec[] {
69
- return getToolSpecsFor(filter).filter(spec => spec.kind === 'read' || spec.kind === 'external')
70
- }
71
-
72
68
  /**
73
69
  * Run one turn of a conversation whose only tools come from the registry.
74
70
  *
@@ -82,8 +78,17 @@ export async function registryAssistantChat(input: RegistryAssistantInput): Prom
82
78
  throw new Error('[registry-assistant] the configured AI client cannot call tools, so this conversation cannot run')
83
79
  }
84
80
 
85
- const filter: ToolCategoryFilter = toolCategories
86
- const specs = answeringSpecs(filter)
81
+ /*
82
+ * Only `read` is offered here. `external` means the tool changes something outside the
83
+ * conversation (board-import's `materializeImportSession` creates a Board); this door answers
84
+ * questions and has no confirm-and-apply step, so a tool with an effect does not go through it
85
+ * even when the caller holds the privilege.
86
+ */
87
+ const scope = narrowToolScope(
88
+ await resolveToolScope(toolCategories, input.toolAccess),
89
+ spec => spec.kind === 'read'
90
+ )
91
+ const specs = scope.specs
87
92
  const byName = new Map(specs.map(spec => [spec.name, spec]))
88
93
 
89
94
  const tools = specs.map(spec => ({
@@ -96,12 +101,12 @@ export async function registryAssistantChat(input: RegistryAssistantInput): Prom
96
101
  * The rules for using a tool belong to whoever registered it. Collect only the exposed ones, so
97
102
  * a surface never reads instructions for a category it cannot call.
98
103
  */
99
- const guidance = getCategoryGuidance(filter)
104
+ const guidance = toolScopeGuidance(scope)
100
105
  const prompt = guidance.length > 0 ? `${systemPrompt}\n\n${guidance.join('\n\n')}` : systemPrompt
101
106
 
102
- const toolContext: RegistryToolCallContext = { state, host: hostContext }
107
+ const toolContext: ToolCallContext = { state, host: hostContext ?? {} }
103
108
 
104
- const result = await assistantChat<RegistryToolCallContext, unknown>({
109
+ const result = await assistantChat<ToolCallContext, unknown>({
105
110
  initialConversation: messages,
106
111
  tools,
107
112
  options: {