@intutic/cli 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cli.js +133 -3
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/budgetLimits.d.ts +70 -0
  4. package/dist/commands/budgetLimits.d.ts.map +1 -0
  5. package/dist/commands/budgetLimits.js +223 -0
  6. package/dist/commands/budgetLimits.js.map +1 -0
  7. package/dist/commands/chaos.d.ts +40 -0
  8. package/dist/commands/chaos.d.ts.map +1 -0
  9. package/dist/commands/chaos.js +252 -0
  10. package/dist/commands/chaos.js.map +1 -0
  11. package/dist/commands/credentials.d.ts +5 -1
  12. package/dist/commands/credentials.d.ts.map +1 -1
  13. package/dist/commands/credentials.js +98 -9
  14. package/dist/commands/credentials.js.map +1 -1
  15. package/dist/commands/exec.d.ts +29 -1
  16. package/dist/commands/exec.d.ts.map +1 -1
  17. package/dist/commands/exec.js +72 -35
  18. package/dist/commands/exec.js.map +1 -1
  19. package/dist/commands/incidents.d.ts +32 -0
  20. package/dist/commands/incidents.d.ts.map +1 -0
  21. package/dist/commands/incidents.js +94 -0
  22. package/dist/commands/incidents.js.map +1 -0
  23. package/dist/commands/policy.d.ts.map +1 -1
  24. package/dist/commands/policy.js +4 -1
  25. package/dist/commands/policy.js.map +1 -1
  26. package/dist/commands/settings.d.ts +5 -4
  27. package/dist/commands/settings.d.ts.map +1 -1
  28. package/dist/commands/settings.js +8 -6
  29. package/dist/commands/settings.js.map +1 -1
  30. package/dist/harness/openhands.d.ts.map +1 -1
  31. package/dist/harness/openhands.js +3 -4
  32. package/dist/harness/openhands.js.map +1 -1
  33. package/dist/lib/chaos/experiment.d.ts +18 -0
  34. package/dist/lib/chaos/experiment.d.ts.map +1 -0
  35. package/dist/lib/chaos/experiment.js +40 -0
  36. package/dist/lib/chaos/experiment.js.map +1 -0
  37. package/dist/lib/chaos/probes.d.ts +97 -0
  38. package/dist/lib/chaos/probes.d.ts.map +1 -0
  39. package/dist/lib/chaos/probes.js +191 -0
  40. package/dist/lib/chaos/probes.js.map +1 -0
  41. package/dist/lib/chaos/runner.d.ts +131 -0
  42. package/dist/lib/chaos/runner.d.ts.map +1 -0
  43. package/dist/lib/chaos/runner.js +340 -0
  44. package/dist/lib/chaos/runner.js.map +1 -0
  45. package/dist/lib/chaos/workspace.d.ts +70 -0
  46. package/dist/lib/chaos/workspace.d.ts.map +1 -0
  47. package/dist/lib/chaos/workspace.js +216 -0
  48. package/dist/lib/chaos/workspace.js.map +1 -0
  49. package/dist/lib/gitHooks.d.ts.map +1 -1
  50. package/dist/lib/gitHooks.js +6 -4
  51. package/dist/lib/gitHooks.js.map +1 -1
  52. package/dist/lib/providerProbe.d.ts +1 -1
  53. package/dist/lib/providerProbe.d.ts.map +1 -1
  54. package/dist/lib/providerProbe.js +13 -5
  55. package/dist/lib/providerProbe.js.map +1 -1
  56. package/dist/lib/sandbox/firecracker.d.ts.map +1 -1
  57. package/dist/lib/sandbox/firecracker.js +4 -1
  58. package/dist/lib/sandbox/firecracker.js.map +1 -1
  59. package/dist/lib/sandbox/image.d.ts +13 -4
  60. package/dist/lib/sandbox/image.d.ts.map +1 -1
  61. package/dist/lib/sandbox/image.js +25 -8
  62. package/dist/lib/sandbox/image.js.map +1 -1
  63. package/dist/lib/sandbox/oci.d.ts.map +1 -1
  64. package/dist/lib/sandbox/oci.js +18 -3
  65. package/dist/lib/sandbox/oci.js.map +1 -1
  66. package/dist/lib/sandbox/types.d.ts +6 -0
  67. package/dist/lib/sandbox/types.d.ts.map +1 -1
  68. package/package.json +6 -5
  69. package/resources/chaos/credential-revoked.yaml +28 -0
  70. package/resources/chaos/poisoned-readme.yaml +29 -0
  71. package/resources/chaos/registry-down.yaml +25 -0
  72. package/resources/sandbox/Dockerfile.node +19 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.js","sourceRoot":"","sources":["../../../src/lib/chaos/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,EACb,eAAe,GAOhB,MAAM,uBAAuB,CAAA;AAqB9B,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,IAAI,CAAC,CAAC,OAAO,CAAA;IACtE,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,KAA0B,EAC1B,MAA6B,EAC7B,QAAgB;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,WAAW,CAAC,CAAA;YAC3E,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe;gBAAE,OAAO,wBAAwB,GAAG,CAAC,IAAI,mCAAmC,CAAA;QACrH,CAAC;aAAM,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;YACnC,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc;gBAAE,OAAO,oBAAoB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;QACxG,CAAC;aAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,OAAO,uBAAuB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,kBAAkB,GAAG,CAAA;QACrF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,4FAA4F;AAC5F,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACjC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B,EAAE,MAAc;IAC3E,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB;YAAE,IAAI,GAAG,CAAC,CAAA;IACzF,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAA;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAA;IAC5F,MAAM,KAAK,GAAG,MAAM;SACjB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;SACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvF,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1F,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,KAAK;SACT,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA4B,EAC5B,GAAgB,EAChB,gBAA+B;IAE/B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAA;IACpE,MAAM,GAAG,GAA0C,EAAE,CAAA;IACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YACjB,KAAK,cAAc;gBACjB,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,CAAA;gBAChF,MAAK;YACP,KAAK,wBAAwB;gBAC3B,GAAG,CAAC,sBAAsB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,WAAW,CAAC,CAAA;gBACjG,MAAK;YACP,KAAK,kBAAkB;gBACrB,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBAC1E,MAAK;YACP,KAAK,gBAAgB;gBACnB,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;gBACvF,MAAK;YACP,KAAK,uBAAuB;gBAC1B,GAAG,CAAC,qBAAqB;oBACvB,gBAAgB,IAAI,gBAAgB,GAAG,CAAC;wBACtC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB,GAAI,KAAK,CAAC,KAAgB;wBACzE,CAAC,CAAC,IAAI,CAAA;gBACV,MAAK;YACP,KAAK,kBAAkB;gBACrB,GAAG,CAAC,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,KAAe,CAAC,CAAA;gBACzE,MAAK;QACT,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAC7B,MAA4B,EAC5B,aAAmE;IAEnE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAA;QACzG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QAC7C,MAAM,MAAM,GAAgB;YAC1B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM;YACzB,MAAM;YACN,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACvD,CAAA;QACD,IAAI,KAAK,CAAC,EAAE,KAAK,cAAc;YAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,CAAA;QACnG,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAA4B,EAAE,OAAiC;IAC7F,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAc,CAAA;IAC9D,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,CAAA;QAC9C,MAAM,QAAQ,GAAG,OAAO;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;aACjG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;QAC3B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CACX,GAAG,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CACvK,CAAA;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAClH,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,kGAAkG,CAAC,CAAA;QACxH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAaD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;IAChF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,sDAAsD,MAAM,CAAC,UAAU,kBAAkB,MAAM,CAAC,IAAI,EAAE;SAC/G,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;IACzG,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,yFAAyF,EAAE,CAAA;IAC/H,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;AACxD,CAAC"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * The chaos run: baseline repetitions, then faulted ones, each in its own git
3
+ * worktree, behind its own proxy, inside the sandbox.
4
+ *
5
+ * Per repetition the runner
6
+ * 1. adds a detached worktree of HEAD (so every repetition starts from the
7
+ * same commit) and carries the project's generated gates, hook settings
8
+ * and policy snapshot into it, host paths rewritten to `/work`
9
+ * ({@link prepareWorkspace}),
10
+ * 2. starts a dedicated proxy on a free port with the plan and the host path
11
+ * of the events file, and waits for its health endpoint,
12
+ * 3. runs the agent in the sandbox with the plan, the in-sandbox events
13
+ * path and the proxy URL passed by name, tailing the events file every
14
+ * second for an abort condition,
15
+ * 4. runs `verify` the same way (its exit code is task success),
16
+ * 5. stops the proxy, copies `.intutic-chaos/` next to the report and
17
+ * removes the worktree (unless kept).
18
+ *
19
+ * Everything with a side effect comes in through {@link ChaosDeps}, so the
20
+ * orchestration is tested without Docker, a proxy binary or git.
21
+ *
22
+ * @module
23
+ */
24
+ import { type Experiment, type ProbeId, type RunVerdict } from '@intutic/shared-types';
25
+ import { type ProbeReport, type ProbeResult } from './probes.js';
26
+ /** Where the runner's files live inside a repetition's workspace. */
27
+ export declare const CHAOS_DIR = ".intutic-chaos";
28
+ /** The events file as the sandbox sees it (the workspace is mounted at /work). */
29
+ export declare const SANDBOX_EVENTS_PATH = "/work/.intutic-chaos/events.jsonl";
30
+ /** A running dedicated proxy. */
31
+ export interface ProxyProcess {
32
+ /** Resolves with a description of how the process ended. */
33
+ exited: Promise<string>;
34
+ stop(): Promise<void>;
35
+ }
36
+ /** A run refused before any repetition started. */
37
+ export declare class ChaosRefusal extends Error {
38
+ }
39
+ /** Everything the run does to the outside world. */
40
+ export interface ChaosDeps {
41
+ /** Select the sandbox backend, check its health, prepare the image. Throws when unavailable. */
42
+ readySandbox(image: string): Promise<{
43
+ name: string;
44
+ }>;
45
+ /** Run one command in the sandbox; resolves with its exit code. */
46
+ runInSandbox(args: {
47
+ command: string[];
48
+ workdir: string;
49
+ env: Record<string, string>;
50
+ image: string;
51
+ name: string;
52
+ onStdout: (chunk: Buffer) => void;
53
+ signal?: AbortSignal;
54
+ }): Promise<number>;
55
+ /** The proxy env the sandboxed agent gets for a proxy on the host's `port`. */
56
+ sandboxEnv(port: number): Record<string, string>;
57
+ /** Start the proxy binary `intutic start` runs, with this env and its output in `logPath`. */
58
+ startProxy(args: {
59
+ port: number;
60
+ env: Record<string, string>;
61
+ logPath: string;
62
+ }): ProxyProcess;
63
+ /** True when the proxy's health endpoint answers. */
64
+ proxyHealthy(port: number): Promise<boolean>;
65
+ freePort(): Promise<number>;
66
+ git: {
67
+ /** `git status --porcelain` output; throws outside a repository. */
68
+ status(cwd: string): Promise<string>;
69
+ worktreeAdd(cwd: string, dir: string): Promise<void>;
70
+ worktreeRemove(cwd: string, dir: string): Promise<void>;
71
+ };
72
+ /** A fresh empty directory for a repetition's worktree to live under. */
73
+ makeTempDir(): Promise<string>;
74
+ randomHex(bytes: number): string;
75
+ /** Where the agent's and verify's stdout is echoed (the terminal). */
76
+ echo(chunk: Buffer): void;
77
+ log: {
78
+ info(msg: string): void;
79
+ warn(msg: string): void;
80
+ dim(msg: string): void;
81
+ };
82
+ }
83
+ export interface ChaosRunOptions {
84
+ experiment: Experiment;
85
+ cwd: string;
86
+ image: string;
87
+ outPath: string;
88
+ keep: boolean;
89
+ /** How often the events file is tailed for abort conditions. */
90
+ pollMs?: number;
91
+ /** How long the proxy gets to answer its health endpoint. */
92
+ healthTimeoutMs?: number;
93
+ /** The host's policy snapshot, copied into each repetition for its gates. */
94
+ snapshotRules?: string;
95
+ /** The host's approved-bypass list, copied in the same way. */
96
+ approvedBypasses?: string;
97
+ }
98
+ export interface RepetitionReport {
99
+ repetition: number;
100
+ baseline: boolean;
101
+ runId: string;
102
+ canary: string;
103
+ agentExitCode: number | null;
104
+ verifyExitCode: number | null;
105
+ costUsd: number;
106
+ durationS: number;
107
+ malformedEvents: number;
108
+ aborted?: string;
109
+ error?: string;
110
+ probes?: Partial<Record<ProbeId, ProbeResult>>;
111
+ eventsPath: string;
112
+ agentOutPath: string;
113
+ /** Set with --keep: the worktree left in place. */
114
+ workspace?: string;
115
+ }
116
+ export interface ChaosReport {
117
+ version: 1;
118
+ experiment: Experiment;
119
+ startedAt: string;
120
+ finishedAt: string;
121
+ sandbox: string;
122
+ repetitions: RepetitionReport[];
123
+ probes: ProbeReport[];
124
+ verdict: RunVerdict;
125
+ warnings: string[];
126
+ malformedEvents: number;
127
+ reportPath: string;
128
+ }
129
+ /** Run an experiment end to end and write its report. */
130
+ export declare function runChaos(opts: ChaosRunOptions, deps: ChaosDeps): Promise<ChaosReport>;
131
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/lib/chaos/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * The chaos run: baseline repetitions, then faulted ones, each in its own git
3
+ * worktree, behind its own proxy, inside the sandbox.
4
+ *
5
+ * Per repetition the runner
6
+ * 1. adds a detached worktree of HEAD (so every repetition starts from the
7
+ * same commit) and carries the project's generated gates, hook settings
8
+ * and policy snapshot into it, host paths rewritten to `/work`
9
+ * ({@link prepareWorkspace}),
10
+ * 2. starts a dedicated proxy on a free port with the plan and the host path
11
+ * of the events file, and waits for its health endpoint,
12
+ * 3. runs the agent in the sandbox with the plan, the in-sandbox events
13
+ * path and the proxy URL passed by name, tailing the events file every
14
+ * second for an abort condition,
15
+ * 4. runs `verify` the same way (its exit code is task success),
16
+ * 5. stops the proxy, copies `.intutic-chaos/` next to the report and
17
+ * removes the worktree (unless kept).
18
+ *
19
+ * Everything with a side effect comes in through {@link ChaosDeps}, so the
20
+ * orchestration is tested without Docker, a proxy binary or git.
21
+ *
22
+ * @module
23
+ */
24
+ import { createWriteStream } from 'node:fs';
25
+ import * as fs from 'node:fs/promises';
26
+ import * as path from 'node:path';
27
+ import { CHAOS_EVENTS_ENV, CHAOS_PLAN_ENV, CHAOS_PLAN_VERSION, encodeChaosPlan, parseChaosEvents, } from '@intutic/shared-types';
28
+ import { abortReason, aggregateProbes, decideVerdict, evaluateRepetition, repetitionCost, silenceWarnings, } from './probes.js';
29
+ import { prepareWorkspace, SANDBOX_ROOT } from './workspace.js';
30
+ /** Where the runner's files live inside a repetition's workspace. */
31
+ export const CHAOS_DIR = '.intutic-chaos';
32
+ /** The events file as the sandbox sees it (the workspace is mounted at /work). */
33
+ export const SANDBOX_EVENTS_PATH = `/work/${CHAOS_DIR}/events.jsonl`;
34
+ /** A run refused before any repetition started. */
35
+ export class ChaosRefusal extends Error {
36
+ }
37
+ /** Run an experiment end to end and write its report. */
38
+ export async function runChaos(opts, deps) {
39
+ const { experiment, cwd } = opts;
40
+ const startedAt = new Date().toISOString();
41
+ // Each repetition is a worktree of HEAD: uncommitted changes would reach
42
+ // none of them, and the baseline and faulted runs must start from the same
43
+ // commit for the comparison to mean anything.
44
+ let status;
45
+ try {
46
+ status = await deps.git.status(cwd);
47
+ }
48
+ catch (err) {
49
+ throw new ChaosRefusal(`chaos run needs a git repository: ${err instanceof Error ? err.message : String(err)}`);
50
+ }
51
+ if (status.trim()) {
52
+ throw new ChaosRefusal('the working tree has uncommitted changes. Every repetition starts from a fresh worktree of HEAD, ' +
53
+ 'so commit or stash them first — otherwise the agent would run against code you are not looking at.');
54
+ }
55
+ // Never falls back to the host: an unavailable sandbox refuses the run.
56
+ const sandbox = await deps.readySandbox(opts.image);
57
+ const artifactsRoot = opts.outPath.replace(/\.json$/i, '');
58
+ const repetitions = [];
59
+ let stopReason;
60
+ let skippedFaulted = false;
61
+ for (let i = 0; i < experiment.repeat * 2; i++) {
62
+ const baseline = i < experiment.repeat;
63
+ if (!baseline && repetitions.some((r) => r.report.baseline && r.report.verifyExitCode !== 0)) {
64
+ // The run is invalid already; faulted repetitions would only spend tokens.
65
+ skippedFaulted = true;
66
+ break;
67
+ }
68
+ deps.log.info(`Repetition ${i + 1}/${experiment.repeat * 2} (${baseline ? 'baseline' : 'faulted'})`);
69
+ const outcome = await runRepetition(i, baseline, opts, deps, path.join(artifactsRoot, `rep-${i}`));
70
+ repetitions.push(outcome);
71
+ if (outcome.prepared && !repetitions.some((r) => r !== outcome && r.prepared))
72
+ logPrepared(outcome.prepared, deps);
73
+ if (outcome.report.error) {
74
+ stopReason = `runner error in repetition ${i}: ${outcome.report.error}`;
75
+ break;
76
+ }
77
+ if (outcome.report.aborted) {
78
+ // An aborted run is not resumed.
79
+ stopReason = `repetition ${i}: ${outcome.report.aborted}`;
80
+ break;
81
+ }
82
+ }
83
+ // ── Scoring ──
84
+ const warnings = [];
85
+ const usable = repetitions.filter((r) => !r.report.error);
86
+ const baselines = usable.filter((r) => r.report.baseline);
87
+ const faulted = usable.filter((r) => !r.report.baseline);
88
+ const baselineMeanCost = baselines.length
89
+ ? baselines.reduce((s, r) => s + r.report.costUsd, 0) / baselines.length
90
+ : null;
91
+ for (const r of faulted) {
92
+ r.report.probes = evaluateRepetition(experiment.probes, {
93
+ events: r.events,
94
+ agentOut: await readOr(r.report.agentOutPath, ''),
95
+ verifyExitCode: r.report.verifyExitCode,
96
+ canary: r.report.canary,
97
+ }, baselineMeanCost);
98
+ }
99
+ const probes = aggregateProbes(experiment.probes, faulted.map((r) => r.report.probes ?? {}));
100
+ warnings.push(...silenceWarnings(experiment.faults, faulted.map((r) => ({ repetition: r.report.repetition, events: r.events }))));
101
+ if (experiment.probes.some((p) => p.id === 'cost_multiplier_below') && faulted.length && !(baselineMeanCost && baselineMeanCost > 0)) {
102
+ warnings.push('cost_multiplier_below: the baseline cost was 0 (no llm_usage events), so the probe was not evaluated');
103
+ }
104
+ // Every repetition is prepared from the same project, so one says it.
105
+ warnings.push(...(repetitions.find((r) => r.prepared)?.prepared?.warnings ?? []));
106
+ const malformed = repetitions.reduce((s, r) => s + r.report.malformedEvents, 0);
107
+ if (malformed)
108
+ warnings.push(`${malformed} malformed event line${malformed > 1 ? 's' : ''} ignored`);
109
+ if (skippedFaulted)
110
+ warnings.push('faulted repetitions skipped: a baseline repetition failed verify');
111
+ const verdict = decideVerdict({
112
+ baselineVerify: baselines.map((r) => ({ repetition: r.report.repetition, code: r.report.verifyExitCode })),
113
+ probes,
114
+ faultsInjected: faulted.reduce((n, r) => n + r.events.filter((e) => e.type === 'fault_injected').length, 0),
115
+ abortReason: stopReason,
116
+ });
117
+ const report = {
118
+ version: 1,
119
+ experiment,
120
+ startedAt,
121
+ finishedAt: new Date().toISOString(),
122
+ sandbox: sandbox.name,
123
+ repetitions: repetitions.map((r) => r.report),
124
+ probes,
125
+ verdict,
126
+ warnings,
127
+ malformedEvents: malformed,
128
+ reportPath: opts.outPath,
129
+ };
130
+ await fs.mkdir(path.dirname(opts.outPath), { recursive: true });
131
+ await fs.writeFile(opts.outPath, JSON.stringify(report, null, 2) + '\n');
132
+ return report;
133
+ }
134
+ async function runRepetition(index, baseline, opts, deps, artifactsDir) {
135
+ const { experiment } = opts;
136
+ const runId = `${experiment.name.slice(0, 40)}-r${index}-${deps.randomHex(4)}`;
137
+ const canary = `E-INTUTIC-${deps.randomHex(4).toUpperCase()}`;
138
+ const plan = encodeChaosPlan({
139
+ v: CHAOS_PLAN_VERSION,
140
+ runId,
141
+ repetition: index,
142
+ canary,
143
+ faults: baseline ? [] : experiment.faults,
144
+ });
145
+ const report = {
146
+ repetition: index,
147
+ baseline,
148
+ runId,
149
+ canary,
150
+ agentExitCode: null,
151
+ verifyExitCode: null,
152
+ costUsd: 0,
153
+ durationS: 0,
154
+ malformedEvents: 0,
155
+ eventsPath: path.join(artifactsDir, 'events.jsonl'),
156
+ agentOutPath: path.join(artifactsDir, 'agent.out'),
157
+ };
158
+ const started = Date.now();
159
+ const tempDir = await deps.makeTempDir();
160
+ const workspace = path.join(tempDir, 'work');
161
+ const chaosDir = path.join(workspace, CHAOS_DIR);
162
+ const eventsPath = path.join(chaosDir, 'events.jsonl');
163
+ let worktreeAdded = false;
164
+ let proxy;
165
+ let prepared;
166
+ try {
167
+ await deps.git.worktreeAdd(opts.cwd, workspace);
168
+ worktreeAdded = true;
169
+ // World-writable: the sandboxed agent (and the gates inside it) run as an
170
+ // unprivileged user that must append to the events file.
171
+ await fs.mkdir(chaosDir, { recursive: true, mode: 0o777 });
172
+ await fs.chmod(chaosDir, 0o777);
173
+ await fs.writeFile(eventsPath, '', { mode: 0o666 });
174
+ await fs.chmod(eventsPath, 0o666);
175
+ // The gates count calls in files under `<events>.gate-counters/`
176
+ // (chaosGate.ts). Made here for the same reason: a directory the sandbox
177
+ // user creates is its own, and on a Linux host the runner, another uid,
178
+ // could not then delete what is in it, so the worktree would stay behind.
179
+ await fs.mkdir(`${eventsPath}.gate-counters`, { mode: 0o777 });
180
+ await fs.chmod(`${eventsPath}.gate-counters`, 0o777);
181
+ prepared = await prepareWorkspace({
182
+ hostRoot: opts.cwd,
183
+ workspace,
184
+ policyDir: path.join(CHAOS_DIR, 'policy'),
185
+ snapshotRules: opts.snapshotRules,
186
+ approvedBypasses: opts.approvedBypasses,
187
+ });
188
+ const port = await deps.freePort();
189
+ proxy = deps.startProxy({
190
+ port,
191
+ env: { PORT: String(port), [CHAOS_PLAN_ENV]: plan, [CHAOS_EVENTS_ENV]: eventsPath },
192
+ logPath: path.join(chaosDir, 'proxy.log'),
193
+ });
194
+ await waitHealthy(proxy, port, deps, opts.healthTimeoutMs ?? 30_000);
195
+ const base = deps.sandboxEnv(port);
196
+ const env = {
197
+ ...base,
198
+ // Anything inside the sandbox that asks where the proxy is (the gates,
199
+ // a nested `intutic`) reaches this repetition's proxy.
200
+ INTUTIC_PROXY_URL: `http://${base.INTUTIC_SANDBOX_PROXY_HOST ?? 'host.docker.internal'}:${port}`,
201
+ // Where the gates find the snapshot and bypass list carried in.
202
+ ...prepared.env,
203
+ [CHAOS_PLAN_ENV]: plan,
204
+ [CHAOS_EVENTS_ENV]: SANDBOX_EVENTS_PATH,
205
+ };
206
+ // ── The agent, watched for abort conditions ──
207
+ const agentOut = createWriteStream(path.join(chaosDir, 'agent.out'));
208
+ const controller = new AbortController();
209
+ const agentStarted = Date.now();
210
+ const check = async () => {
211
+ if (report.aborted)
212
+ return;
213
+ const { events } = parseChaosEvents(await readOr(eventsPath, ''));
214
+ const reason = abortReason(experiment.abort, events, (Date.now() - agentStarted) / 1000);
215
+ if (!reason)
216
+ return;
217
+ report.aborted = reason;
218
+ await fs.appendFile(eventsPath, JSON.stringify({ ts: new Date().toISOString(), runId, component: 'runner', type: 'abort', reason }) + '\n');
219
+ deps.log.warn(`Aborting repetition ${index}: ${reason}`);
220
+ controller.abort();
221
+ };
222
+ let checking = Promise.resolve();
223
+ const timer = setInterval(() => {
224
+ checking = checking.then(check).catch(() => { });
225
+ }, opts.pollMs ?? 1000);
226
+ try {
227
+ report.agentExitCode = await deps.runInSandbox({
228
+ command: ['sh', '-c', experiment.agent],
229
+ workdir: workspace,
230
+ env,
231
+ image: opts.image,
232
+ name: `intutic-chaos-${runId}-agent`,
233
+ onStdout: (chunk) => {
234
+ agentOut.write(chunk);
235
+ deps.echo(chunk);
236
+ },
237
+ signal: controller.signal,
238
+ });
239
+ }
240
+ finally {
241
+ clearInterval(timer);
242
+ await checking;
243
+ await closeStream(agentOut);
244
+ }
245
+ // A condition met in the agent's last second counts too.
246
+ await check();
247
+ if (!report.aborted) {
248
+ const verifyOut = createWriteStream(path.join(chaosDir, 'verify.out'));
249
+ try {
250
+ report.verifyExitCode = await deps.runInSandbox({
251
+ command: ['sh', '-c', experiment.verify],
252
+ workdir: workspace,
253
+ env,
254
+ image: opts.image,
255
+ name: `intutic-chaos-${runId}-verify`,
256
+ onStdout: (chunk) => {
257
+ verifyOut.write(chunk);
258
+ deps.echo(chunk);
259
+ },
260
+ });
261
+ }
262
+ finally {
263
+ await closeStream(verifyOut);
264
+ }
265
+ }
266
+ }
267
+ catch (err) {
268
+ report.error = err instanceof Error ? err.message : String(err);
269
+ }
270
+ finally {
271
+ if (proxy)
272
+ await proxy.stop();
273
+ report.durationS = Math.round((Date.now() - started) / 100) / 10;
274
+ // Keep what the repetition left behind next to the report: the worktree
275
+ // that holds it is about to go.
276
+ await fs.cp(chaosDir, artifactsDir, { recursive: true }).catch(() => { });
277
+ if (worktreeAdded && !opts.keep) {
278
+ await deps.git.worktreeRemove(opts.cwd, workspace).catch((err) => {
279
+ deps.log.warn(`Could not remove worktree ${workspace}: ${err instanceof Error ? err.message : String(err)}`);
280
+ });
281
+ await fs.rm(tempDir, { recursive: true, force: true }).catch(() => { });
282
+ }
283
+ else if (worktreeAdded) {
284
+ report.workspace = workspace;
285
+ }
286
+ else {
287
+ await fs.rm(tempDir, { recursive: true, force: true }).catch(() => { });
288
+ }
289
+ }
290
+ const { events, malformed } = parseChaosEvents(await readOr(report.eventsPath, await readOr(eventsPath, '')));
291
+ report.malformedEvents = malformed;
292
+ report.costUsd = repetitionCost(events);
293
+ return { report, events, prepared };
294
+ }
295
+ /** Say what carrying the gates in did, once per run. */
296
+ function logPrepared(p, deps) {
297
+ if (p.copied.length)
298
+ deps.log.info(`Carried into each repetition from the project: ${p.copied.join(', ')}`);
299
+ if (p.rewritten.length) {
300
+ deps.log.info(`Rewrote host paths to ${SANDBOX_ROOT} in each repetition's copy of: ${p.rewritten.join(', ')}`);
301
+ }
302
+ if (p.settings.length && !p.settings.some((s) => p.rewritten.includes(s))) {
303
+ deps.log.dim(`Hook settings carried unchanged (no host paths in them): ${p.settings.join(', ')}`);
304
+ }
305
+ if (p.snapshot)
306
+ deps.log.info(`Policy snapshot for the gates: ${p.snapshot}`);
307
+ for (const w of p.warnings)
308
+ deps.log.warn(w);
309
+ }
310
+ /** Wait for the proxy's health endpoint; fail if it exits first or never answers. */
311
+ async function waitHealthy(proxy, port, deps, timeoutMs) {
312
+ let exited;
313
+ void proxy.exited.then((how) => {
314
+ exited = how;
315
+ });
316
+ const deadline = Date.now() + timeoutMs;
317
+ while (Date.now() < deadline) {
318
+ if (exited !== undefined)
319
+ throw new Error(`the proxy exited before becoming healthy (${exited})`);
320
+ if (await deps.proxyHealthy(port))
321
+ return;
322
+ await new Promise((r) => setTimeout(r, 200));
323
+ }
324
+ if (exited !== undefined)
325
+ throw new Error(`the proxy exited before becoming healthy (${exited})`);
326
+ throw new Error(`the proxy never became healthy on port ${port} within ${Math.round(timeoutMs / 1000)}s`);
327
+ }
328
+ /** End a write stream and wait until everything written is on disk. */
329
+ function closeStream(stream) {
330
+ return new Promise((resolve) => stream.end(() => resolve()));
331
+ }
332
+ async function readOr(file, fallback) {
333
+ try {
334
+ return await fs.readFile(file, 'utf-8');
335
+ }
336
+ catch {
337
+ return fallback;
338
+ }
339
+ }
340
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/lib/chaos/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Carrying the project's gates into a repetition's workspace.
3
+ *
4
+ * A repetition runs in a fresh worktree of HEAD, mounted in the sandbox at
5
+ * `/work`. What `intutic connect` generated for the project is usually not in
6
+ * it, and what is in it points at the host:
7
+ *
8
+ * - the gate scripts under `.intutic/hooks/` are normally untracked, so the
9
+ * worktree has none;
10
+ * - the harness hook settings name the gate by its absolute host path
11
+ * (`node /Users/me/proj/.intutic/hooks/claude-code-check.js`), and the gate
12
+ * scripts name their event logs the same way; neither path exists in the
13
+ * sandbox;
14
+ * - the policy snapshot the gates enforce, and the approved-bypass list they
15
+ * consult, live in the host's `~/.intutic/hooks/`, while the sandbox has an
16
+ * empty home of its own.
17
+ *
18
+ * {@link prepareWorkspace} copies the generated gates and any untracked hook
19
+ * settings from the host project into the worktree (never over a file the
20
+ * commit already has), rewrites the host project root to `/work` in the
21
+ * worktree's copies, copies the snapshot and the bypass list next to the
22
+ * runner's events, and returns the environment that points the gates at
23
+ * them. It writes only inside the worktree; the project is read, never
24
+ * changed.
25
+ *
26
+ * @module
27
+ */
28
+ /** Where the worktree is mounted in the sandbox. */
29
+ export declare const SANDBOX_ROOT = "/work";
30
+ /** The generated gate scripts, relative to the project root. */
31
+ export declare const GATE_DIR = ".intutic/hooks";
32
+ /** Where a gate writes its decision and review logs, relative to the project root. */
33
+ export declare const GATE_EVENTS_DIR = ".intutic/events";
34
+ /**
35
+ * Project-level hook settings that register a gate by path: Claude Code's
36
+ * shared and local settings, Codex's and Cursor's project hooks. User-level
37
+ * settings (`~/.claude/settings.json` and the like) are not carried: the
38
+ * sandbox home is empty.
39
+ */
40
+ export declare const HARNESS_SETTINGS: readonly [".claude/settings.json", ".claude/settings.local.json", ".codex/hooks.json", ".cursor/hooks.json"];
41
+ export interface PrepareOptions {
42
+ /** The project the run started in (the host side of the worktree). */
43
+ hostRoot: string;
44
+ /** The repetition's worktree. */
45
+ workspace: string;
46
+ /** Directory, relative to the worktree, that receives the snapshot and bypass list. */
47
+ policyDir: string;
48
+ /** The host's policy snapshot (`.rules`), when the gates there have one. */
49
+ snapshotRules?: string;
50
+ /** The host's approved-bypass list, when it has one. */
51
+ approvedBypasses?: string;
52
+ }
53
+ export interface PreparedWorkspace {
54
+ /** Files copied from the host project, relative to the root. */
55
+ copied: string[];
56
+ /** Files in the worktree whose host paths were rewritten to {@link SANDBOX_ROOT}. */
57
+ rewritten: string[];
58
+ /** Harness settings files present in the worktree after copying. */
59
+ settings: string[];
60
+ /** Gate files in the worktree's {@link GATE_DIR}. */
61
+ gates: number;
62
+ /** The snapshot copied in, as the host path it came from. */
63
+ snapshot?: string;
64
+ /** Environment for the sandbox: where the gates find the snapshot and the bypass list. */
65
+ env: Record<string, string>;
66
+ warnings: string[];
67
+ }
68
+ /** Prepare one repetition's worktree so a harness inside the sandbox finds its gates. */
69
+ export declare function prepareWorkspace(opts: PrepareOptions): Promise<PreparedWorkspace>;
70
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/lib/chaos/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,oDAAoD;AACpD,eAAO,MAAM,YAAY,UAAU,CAAA;AAEnC,gEAAgE;AAChE,eAAO,MAAM,QAAQ,mBAAmB,CAAA;AAExC,sFAAsF;AACtF,eAAO,MAAM,eAAe,oBAAoB,CAAA;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,8GAKnB,CAAA;AAEV,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,qFAAqF;IACrF,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0FAA0F;IAC1F,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAKD,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4DvF"}