@garygentry/system1-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/config/consent.d.ts +11 -0
  4. package/dist/config/consent.d.ts.map +1 -0
  5. package/dist/config/consent.js +33 -0
  6. package/dist/config/consent.js.map +1 -0
  7. package/dist/config/load.d.ts +64 -0
  8. package/dist/config/load.d.ts.map +1 -0
  9. package/dist/config/load.js +216 -0
  10. package/dist/config/load.js.map +1 -0
  11. package/dist/config/session.d.ts +31 -0
  12. package/dist/config/session.d.ts.map +1 -0
  13. package/dist/config/session.js +36 -0
  14. package/dist/config/session.js.map +1 -0
  15. package/dist/config.d.ts +28 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +64 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/decide.d.ts +57 -0
  20. package/dist/decide.d.ts.map +1 -0
  21. package/dist/decide.js +87 -0
  22. package/dist/decide.js.map +1 -0
  23. package/dist/egress/exclude.d.ts +24 -0
  24. package/dist/egress/exclude.d.ts.map +1 -0
  25. package/dist/egress/exclude.js +60 -0
  26. package/dist/egress/exclude.js.map +1 -0
  27. package/dist/egress/scrub.d.ts +12 -0
  28. package/dist/egress/scrub.d.ts.map +1 -0
  29. package/dist/egress/scrub.js +84 -0
  30. package/dist/egress/scrub.js.map +1 -0
  31. package/dist/egress/size.d.ts +16 -0
  32. package/dist/egress/size.d.ts.map +1 -0
  33. package/dist/egress/size.js +25 -0
  34. package/dist/egress/size.js.map +1 -0
  35. package/dist/errors.d.ts +44 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +23 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/fixtures/store.d.ts +34 -0
  40. package/dist/fixtures/store.d.ts.map +1 -0
  41. package/dist/fixtures/store.js +74 -0
  42. package/dist/fixtures/store.js.map +1 -0
  43. package/dist/index.d.ts +59 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +33 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/model/answers.d.ts +38 -0
  48. package/dist/model/answers.d.ts.map +1 -0
  49. package/dist/model/answers.js +48 -0
  50. package/dist/model/answers.js.map +1 -0
  51. package/dist/model/profiles.d.ts +39 -0
  52. package/dist/model/profiles.d.ts.map +1 -0
  53. package/dist/model/profiles.js +42 -0
  54. package/dist/model/profiles.js.map +1 -0
  55. package/dist/model/types.d.ts +107 -0
  56. package/dist/model/types.d.ts.map +1 -0
  57. package/dist/model/types.js +17 -0
  58. package/dist/model/types.js.map +1 -0
  59. package/dist/model/validate.d.ts +17 -0
  60. package/dist/model/validate.d.ts.map +1 -0
  61. package/dist/model/validate.js +151 -0
  62. package/dist/model/validate.js.map +1 -0
  63. package/dist/ping.d.ts +30 -0
  64. package/dist/ping.d.ts.map +1 -0
  65. package/dist/ping.js +50 -0
  66. package/dist/ping.js.map +1 -0
  67. package/dist/prepare.d.ts +39 -0
  68. package/dist/prepare.d.ts.map +1 -0
  69. package/dist/prepare.js +84 -0
  70. package/dist/prepare.js.map +1 -0
  71. package/dist/project/project.d.ts +64 -0
  72. package/dist/project/project.d.ts.map +1 -0
  73. package/dist/project/project.js +144 -0
  74. package/dist/project/project.js.map +1 -0
  75. package/dist/run/budget.d.ts +20 -0
  76. package/dist/run/budget.d.ts.map +1 -0
  77. package/dist/run/budget.js +31 -0
  78. package/dist/run/budget.js.map +1 -0
  79. package/dist/run/pool.d.ts +16 -0
  80. package/dist/run/pool.d.ts.map +1 -0
  81. package/dist/run/pool.js +35 -0
  82. package/dist/run/pool.js.map +1 -0
  83. package/dist/run/spend.d.ts +34 -0
  84. package/dist/run/spend.d.ts.map +1 -0
  85. package/dist/run/spend.js +55 -0
  86. package/dist/run/spend.js.map +1 -0
  87. package/dist/sources/read.d.ts +40 -0
  88. package/dist/sources/read.d.ts.map +1 -0
  89. package/dist/sources/read.js +294 -0
  90. package/dist/sources/read.js.map +1 -0
  91. package/dist/sources/types.d.ts +79 -0
  92. package/dist/sources/types.d.ts.map +1 -0
  93. package/dist/sources/types.js +2 -0
  94. package/dist/sources/types.js.map +1 -0
  95. package/dist/spec/expect.d.ts +39 -0
  96. package/dist/spec/expect.d.ts.map +1 -0
  97. package/dist/spec/expect.js +95 -0
  98. package/dist/spec/expect.js.map +1 -0
  99. package/dist/spec/spec.d.ts +90 -0
  100. package/dist/spec/spec.d.ts.map +1 -0
  101. package/dist/spec/spec.js +252 -0
  102. package/dist/spec/spec.js.map +1 -0
  103. package/dist/split/split.d.ts +33 -0
  104. package/dist/split/split.d.ts.map +1 -0
  105. package/dist/split/split.js +116 -0
  106. package/dist/split/split.js.map +1 -0
  107. package/dist/testdata/index.d.ts +5 -0
  108. package/dist/testdata/index.d.ts.map +1 -0
  109. package/dist/testdata/index.js +6 -0
  110. package/dist/testdata/index.js.map +1 -0
  111. package/dist/testkit/fake-model.d.ts +14 -0
  112. package/dist/testkit/fake-model.d.ts.map +1 -0
  113. package/dist/testkit/fake-model.js +57 -0
  114. package/dist/testkit/fake-model.js.map +1 -0
  115. package/dist/testkit/tmp.d.ts +6 -0
  116. package/dist/testkit/tmp.d.ts.map +1 -0
  117. package/dist/testkit/tmp.js +46 -0
  118. package/dist/testkit/tmp.js.map +1 -0
  119. package/dist/tools/ask.d.ts +32 -0
  120. package/dist/tools/ask.d.ts.map +1 -0
  121. package/dist/tools/ask.js +59 -0
  122. package/dist/tools/ask.js.map +1 -0
  123. package/dist/tools/context.d.ts +52 -0
  124. package/dist/tools/context.d.ts.map +1 -0
  125. package/dist/tools/context.js +130 -0
  126. package/dist/tools/context.js.map +1 -0
  127. package/dist/tools/doctor.d.ts +37 -0
  128. package/dist/tools/doctor.d.ts.map +1 -0
  129. package/dist/tools/doctor.js +203 -0
  130. package/dist/tools/doctor.js.map +1 -0
  131. package/dist/tools/many.d.ts +74 -0
  132. package/dist/tools/many.d.ts.map +1 -0
  133. package/dist/tools/many.js +141 -0
  134. package/dist/tools/many.js.map +1 -0
  135. package/dist/tools/schemas.d.ts +293 -0
  136. package/dist/tools/schemas.d.ts.map +1 -0
  137. package/dist/tools/schemas.js +112 -0
  138. package/dist/tools/schemas.js.map +1 -0
  139. package/dist/tools/spec-check.d.ts +48 -0
  140. package/dist/tools/spec-check.d.ts.map +1 -0
  141. package/dist/tools/spec-check.js +164 -0
  142. package/dist/tools/spec-check.js.map +1 -0
  143. package/dist/tools/usage.d.ts +11 -0
  144. package/dist/tools/usage.d.ts.map +1 -0
  145. package/dist/tools/usage.js +27 -0
  146. package/dist/tools/usage.js.map +1 -0
  147. package/dist/transport/openrouter.d.ts +38 -0
  148. package/dist/transport/openrouter.d.ts.map +1 -0
  149. package/dist/transport/openrouter.js +89 -0
  150. package/dist/transport/openrouter.js.map +1 -0
  151. package/dist/version.d.ts +4 -0
  152. package/dist/version.d.ts.map +1 -0
  153. package/dist/version.js +5 -0
  154. package/dist/version.js.map +1 -0
  155. package/dist/wiring.d.ts +30 -0
  156. package/dist/wiring.d.ts.map +1 -0
  157. package/dist/wiring.js +31 -0
  158. package/dist/wiring.js.map +1 -0
  159. package/package.json +63 -0
@@ -0,0 +1,59 @@
1
+ import { DecisionsError } from "../errors.js";
2
+ import { prepare } from "../prepare.js";
3
+ import { matches } from "../project/project.js";
4
+ import { checkInput, deciderFor, resolveRequest } from "./context.js";
5
+ import { summariseSkipped } from "./many.js";
6
+ /** One state, one question set, one call. The shape hooks and scripts want. */
7
+ export async function runAsk(ctx, rawInput) {
8
+ const input = checkInput("ask", rawInput);
9
+ const req = resolveRequest(ctx, input);
10
+ const prepared = await prepare({
11
+ sources: req.sources,
12
+ split: req.split,
13
+ questions: req.questions,
14
+ profile: req.profile,
15
+ cwd: ctx.config.repoRoot,
16
+ exclude: ctx.config.egress.exclude,
17
+ ...(input.allowOutside ? { allowOutside: true } : {}),
18
+ });
19
+ const [item, ...rest] = prepared.items;
20
+ if (!item || rest.length > 0) {
21
+ const withheld = prepared.skipped.length
22
+ ? ` (${prepared.skipped.length} withheld: ${prepared.skipped.map((s) => `${s.path} ${s.reason}`).join(", ")})`
23
+ : "";
24
+ throw new DecisionsError("invalid-request", item
25
+ ? `ask needs exactly one state, but the source gave ${prepared.items.length}. Use \`decide many\` to fan out.`
26
+ : `The source gave nothing to ask about${withheld}.`, { items: prepared.items.length });
27
+ }
28
+ const result = await deciderFor(ctx, req.profile, input.mode ?? "auto").decide({
29
+ state: item.state,
30
+ questions: req.questions,
31
+ namespace: req.namespace,
32
+ });
33
+ let verdict;
34
+ if (req.keep.length > 0) {
35
+ const referenced = new Set(req.keep.map((f) => f.question));
36
+ verdict = result.undecided.some((q) => referenced.has(q))
37
+ ? "undecided"
38
+ : req.keep.every((f) => matches(result.answers, f))
39
+ ? "kept"
40
+ : "dropped";
41
+ }
42
+ return {
43
+ ...(req.spec ? { spec: req.spec.name } : {}),
44
+ id: item.id,
45
+ ...(item.path ? { path: item.path } : {}),
46
+ ...(item.lines ? { lines: item.lines } : {}),
47
+ source: result.source,
48
+ model: result.model,
49
+ servedBy: result.servedBy,
50
+ answers: result.answers,
51
+ undecided: result.undecided,
52
+ ...(verdict ? { verdict } : {}),
53
+ usage: result.usage,
54
+ latencyMs: result.latencyMs,
55
+ skipped: summariseSkipped(prepared.skipped),
56
+ redactions: { total: prepared.redactions.total, items: prepared.redactions.items },
57
+ };
58
+ }
59
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAG/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAA;AACvF,OAAO,EAAuB,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAyBjE,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAgB,EAAE,QAAiB;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAW,KAAK,EAAE,QAAQ,CAAC,CAAA;IACnD,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;QACxB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;QAClC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAA;IACF,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAA;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM;YACtC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,cAAc,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC9G,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,IAAI,cAAc,CACtB,iBAAiB,EACjB,IAAI;YACF,CAAC,CAAC,oDAAoD,QAAQ,CAAC,KAAK,CAAC,MAAM,mCAAmC;YAC9G,CAAC,CAAC,uCAAuC,QAAQ,GAAG,EACtD,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CACjC,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC;QAC7E,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC,CAAA;IAEF,IAAI,OAA6B,CAAA;IACjC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC3D,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS,CAAA;IACjB,CAAC;IAED,OAAO;QACL,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3C,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE;KACnF,CAAA;AACH,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type ResolvedConfig } from "../config/load.js";
2
+ import { type DecideMode, type Decider } from "../decide.js";
3
+ import { type ModelProfile } from "../model/profiles.js";
4
+ import type { QuestionSet } from "../model/types.js";
5
+ import { parseFilter, parseSort } from "../project/project.js";
6
+ import { SpendLedger } from "../run/spend.js";
7
+ import type { SourceSpec } from "../sources/types.js";
8
+ import { type Spec, type SpecDirs } from "../spec/spec.js";
9
+ import { type SplitSpec } from "../split/split.js";
10
+ import { type ToolName } from "./schemas.js";
11
+ /** Everything a tool needs, resolved once per invocation. */
12
+ export interface ToolContext {
13
+ cwd: string;
14
+ config: ResolvedConfig;
15
+ specDirs: SpecDirs;
16
+ fetch?: typeof fetch;
17
+ }
18
+ export interface ContextOptions {
19
+ cwd?: string;
20
+ env?: NodeJS.ProcessEnv;
21
+ home?: string;
22
+ /** Specs shipped with the plugin/CLI. */
23
+ bundledSpecs?: string;
24
+ fetch?: typeof fetch;
25
+ }
26
+ export declare function createContext(options?: ContextOptions): ToolContext;
27
+ /** Validate tool input against its schema, reporting every problem. */
28
+ export declare function checkInput<T>(tool: ToolName, input: unknown): T;
29
+ export interface Resolved {
30
+ spec?: Spec;
31
+ namespace: string;
32
+ questions: QuestionSet;
33
+ sources: SourceSpec[];
34
+ split: SplitSpec;
35
+ keep: ReturnType<typeof parseFilter>[];
36
+ sort?: ReturnType<typeof parseSort>;
37
+ profile: ModelProfile;
38
+ }
39
+ /** Merge a spec's defaults with explicit input. Explicit input wins; inline questions and a spec conflict. */
40
+ export declare function resolveRequest(ctx: ToolContext, input: {
41
+ spec?: string;
42
+ questions?: Record<string, unknown>;
43
+ sources?: SourceSpec[];
44
+ split?: string;
45
+ keep?: string[];
46
+ sort?: string;
47
+ model?: string;
48
+ }): Resolved;
49
+ /** A decider wired to this context's config: transport only with a key, consent from the repo. */
50
+ export declare function deciderFor(ctx: ToolContext, profile: ModelProfile, mode?: DecideMode): Decider;
51
+ export declare function ledgerFor(ctx: ToolContext): SpendLedger;
52
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3E,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAY,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAY,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE9D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE1D,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,WAAW,CAWvE;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAa/D;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,WAAW,CAAA;IACtB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,EAAE,CAAA;IACtC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;IACnC,OAAO,EAAE,YAAY,CAAA;CACtB;AAED,8GAA8G;AAC9G,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IACL,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GACA,QAAQ,CAoCV;AAsCD,kGAAkG;AAClG,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE,UAAmB,GACxB,OAAO,CAsBT;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAEvD"}
@@ -0,0 +1,130 @@
1
+ import { isAbsolute, join, relative } from "node:path";
2
+ import { Value } from "typebox/value";
3
+ import { allProfiles, loadConfig, stateDir, userConfigDir, } from "../config/load.js";
4
+ import { createDecider } from "../decide.js";
5
+ import { DecisionsError } from "../errors.js";
6
+ import { FixtureStore } from "../fixtures/store.js";
7
+ import { resolveProfile } from "../model/profiles.js";
8
+ import { parseFilter, parseSort } from "../project/project.js";
9
+ import { SpendLedger } from "../run/spend.js";
10
+ import { loadSpec, specDirs } from "../spec/spec.js";
11
+ import { parseSplit } from "../split/split.js";
12
+ import { createOpenRouterTransport } from "../transport/openrouter.js";
13
+ import { TOOL_SCHEMAS } from "./schemas.js";
14
+ export function createContext(options = {}) {
15
+ const env = options.env ?? process.env;
16
+ const cwd = options.cwd ?? process.cwd();
17
+ const config = loadConfig({ cwd, env, ...(options.home ? { home: options.home } : {}) });
18
+ const bundled = env.SYSTEM1_SPECS_PATH?.trim() || options.bundledSpecs;
19
+ return {
20
+ cwd,
21
+ config,
22
+ specDirs: specDirs(config.repoRoot, userConfigDir(env, options.home), bundled),
23
+ ...(options.fetch ? { fetch: options.fetch } : {}),
24
+ };
25
+ }
26
+ /** Validate tool input against its schema, reporting every problem. */
27
+ export function checkInput(tool, input) {
28
+ const schema = TOOL_SCHEMAS[tool];
29
+ const problems = [...Value.Errors(schema, input)].map((e) => `${e.instancePath || "/"} ${e.message}`);
30
+ if (problems.length > 0) {
31
+ throw new DecisionsError("invalid-request", `Invalid ${tool} input:\n ${problems.join("\n ")}`, { problems });
32
+ }
33
+ return input;
34
+ }
35
+ /** Merge a spec's defaults with explicit input. Explicit input wins; inline questions and a spec conflict. */
36
+ export function resolveRequest(ctx, input) {
37
+ if (input.spec && input.questions) {
38
+ throw new DecisionsError("invalid-request", "Give either a spec or inline questions, not both");
39
+ }
40
+ const spec = input.spec ? loadSpec(input.spec, ctx.specDirs, ctx.cwd) : undefined;
41
+ const questions = (spec?.questions ?? input.questions);
42
+ if (!questions) {
43
+ throw new DecisionsError("invalid-request", "No questions: pass --spec <name>, --question, or --input with questions");
44
+ }
45
+ // Paths typed on the command line mean what the shell means by them; a
46
+ // spec's own defaults stay anchored to the repo, wherever it is run from.
47
+ const sources = input.sources?.length
48
+ ? input.sources.map((source) => rebase(source, ctx.cwd, ctx.config.repoRoot))
49
+ : specSources(spec);
50
+ if (sources.length === 0) {
51
+ throw new DecisionsError("invalid-request", "No source: pass --glob, --file, --jsonl, --diff, --text or --stdin (or use a spec with a source)");
52
+ }
53
+ const keepText = input.keep ?? spec?.keep ?? [];
54
+ const sortText = input.sort ?? spec?.sort;
55
+ const profile = resolveProfile(input.model ?? ctx.config.model, allProfiles(ctx.config));
56
+ return {
57
+ ...(spec ? { spec } : {}),
58
+ namespace: spec?.name ?? "adhoc",
59
+ questions,
60
+ sources,
61
+ split: parseSplit(input.split ?? spec?.source?.split ?? "file"),
62
+ keep: keepText.map((k) => parseFilter(k, questions)),
63
+ ...(sortText ? { sort: parseSort(sortText, questions) } : {}),
64
+ profile,
65
+ };
66
+ }
67
+ /**
68
+ * Re-anchor a source given on the command line from the invocation directory
69
+ * to the repo root, which is what the reader resolves against. Without this,
70
+ * `decide many --file a.ts` in `src/` reads `<repo>/a.ts`.
71
+ */
72
+ function rebase(source, cwd, repoRoot) {
73
+ const prefix = relative(repoRoot, cwd);
74
+ if (prefix === "" || prefix.startsWith("..") || isAbsolute(prefix))
75
+ return source;
76
+ const move = (path) => (isAbsolute(path) ? path : join(prefix, path));
77
+ switch (source.kind) {
78
+ case "file":
79
+ return { ...source, path: move(source.path) };
80
+ case "jsonl":
81
+ return { ...source, path: move(source.path) };
82
+ case "glob":
83
+ return { ...source, patterns: source.patterns.map(move) };
84
+ case "diff":
85
+ return source.paths ? { ...source, paths: source.paths.map(move) } : source;
86
+ default:
87
+ return source;
88
+ }
89
+ }
90
+ function specSources(spec) {
91
+ const s = spec?.source;
92
+ if (!s)
93
+ return [];
94
+ return [
95
+ ...(s.glob ? [{ kind: "glob", patterns: s.glob }] : []),
96
+ ...(s.file ? [{ kind: "file", path: s.file }] : []),
97
+ ...(s.jsonl ? [{ kind: "jsonl", path: s.jsonl }] : []),
98
+ ...(s.diff !== undefined
99
+ ? [{ kind: "diff", ...(s.diff ? { range: s.diff } : {}) }]
100
+ : []),
101
+ ];
102
+ }
103
+ /** A decider wired to this context's config: transport only with a key, consent from the repo. */
104
+ export function deciderFor(ctx, profile, mode = "auto") {
105
+ const { config } = ctx;
106
+ const dir = stateDir(config.repoRoot);
107
+ return createDecider({
108
+ profile,
109
+ egressConsent: config.egress.consent.granted,
110
+ repoRoot: config.repoRoot,
111
+ ...(config.apiKey
112
+ ? {
113
+ transport: createOpenRouterTransport({
114
+ endpoint: config.endpoint,
115
+ apiKey: config.apiKey,
116
+ timeoutMs: config.timeoutMs,
117
+ ...(ctx.fetch ? { fetch: ctx.fetch } : {}),
118
+ }),
119
+ }
120
+ : {}),
121
+ fixtures: new FixtureStore(join(dir, "fixtures")),
122
+ ledger: new SpendLedger(join(dir, "usage.jsonl")),
123
+ mode: config.replay ? "replay" : mode,
124
+ ...(config.session ? { session: config.session } : {}),
125
+ });
126
+ }
127
+ export function ledgerFor(ctx) {
128
+ return new SpendLedger(join(stateDir(ctx.config.repoRoot), "usage.jsonl"));
129
+ }
130
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type Harness } from "../config/session.js";
2
+ import { type ContextOptions } from "./context.js";
3
+ export type CheckStatus = "ok" | "warn" | "fail";
4
+ export interface DoctorCheck {
5
+ name: "cli" | "config" | "path" | "path-version" | "key" | "consent" | "network";
6
+ status: CheckStatus;
7
+ detail: string;
8
+ /** What the user (not the agent) can do about a warn or fail. */
9
+ fix?: string;
10
+ }
11
+ export interface DoctorResult {
12
+ /** False when any check failed; warnings alone keep it true. */
13
+ healthy: boolean;
14
+ /** Whether a live decision would be sent: key, consent, network, and replay not forced. */
15
+ live: boolean;
16
+ harness: Harness | null;
17
+ session: string | null;
18
+ version: string;
19
+ node: string;
20
+ checks: DoctorCheck[];
21
+ }
22
+ export interface DoctorOptions extends ContextOptions {
23
+ env: NodeJS.ProcessEnv;
24
+ /** The script that is running, for the report. */
25
+ cliPath?: string;
26
+ /**
27
+ * Reads the version of the `decide` found on PATH (the CLI runs it with
28
+ * `version`). Injected so the engine itself never spawns anything but git
29
+ * (0014). Without it the `path-version` check is skipped.
30
+ */
31
+ probeVersion?: (path: string) => Promise<string | undefined>;
32
+ }
33
+ export declare const CODEX_RULE = "prefix_rule(pattern = [\"decide\"], decision = \"allow\")";
34
+ export declare function runDoctor(options: DoctorOptions): Promise<DoctorResult>;
35
+ /** The first executable file `name` on `path`, like `command -v`. */
36
+ export declare function which(name: string, path: string): string | undefined;
37
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAmC,MAAM,cAAc,CAAA;AAEnF,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;AAEhD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAA;IAChF,MAAM,EAAE,WAAW,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,2FAA2F;IAC3F,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAC7D;AAED,eAAO,MAAM,UAAU,8DAA0D,CAAA;AAEjF,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAwG7E;AAwFD,qEAAqE;AACrE,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUpE"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * `doctor`: is `decide` usable from this shell, and if not, the exact fix for
3
+ * the harness running it. Read-only: it never writes a rule, a config file or
4
+ * an install. Those need the user's consent and belong to `setup`.
5
+ *
6
+ * Unlike the other tools it builds its own context: a broken config is one of
7
+ * the things it diagnoses, so it must not fail before it can report it.
8
+ */
9
+ import { accessSync, constants, statSync } from "node:fs";
10
+ import { delimiter, join } from "node:path";
11
+ import { detectHarness } from "../config/session.js";
12
+ import { ping } from "../ping.js";
13
+ import { CLI_PACKAGE, VERSION } from "../version.js";
14
+ import { createContext } from "./context.js";
15
+ export const CODEX_RULE = 'prefix_rule(pattern = ["decide"], decision = "allow")';
16
+ export async function runDoctor(options) {
17
+ const { env } = options;
18
+ const harness = detectHarness(env) ?? null;
19
+ const checks = [
20
+ {
21
+ name: "cli",
22
+ status: "ok",
23
+ detail: `decide ${VERSION} on node ${process.version}${options.cliPath ? ` (${options.cliPath})` : ""}`,
24
+ },
25
+ pathCheck(harness, env),
26
+ ];
27
+ const onPath = which("decide", env.PATH ?? "");
28
+ if (onPath && options.probeVersion) {
29
+ checks.push(await versionCheck(onPath, options.probeVersion, env));
30
+ }
31
+ const report = (ctx, live) => ({
32
+ healthy: !checks.some((c) => c.status === "fail"),
33
+ live,
34
+ harness,
35
+ session: ctx?.config.session ?? null,
36
+ version: VERSION,
37
+ node: process.version,
38
+ checks,
39
+ });
40
+ let ctx;
41
+ try {
42
+ ctx = createContext(options);
43
+ }
44
+ catch (error) {
45
+ checks.push({
46
+ name: "config",
47
+ status: "fail",
48
+ detail: error instanceof Error ? error.message : String(error),
49
+ fix: "correct the config file or environment variable named above",
50
+ });
51
+ return report(undefined, false);
52
+ }
53
+ const { config } = ctx;
54
+ checks.push(config.apiKey
55
+ ? { name: "key", status: "ok", detail: `OPENROUTER_API_KEY present (${config.apiKeySource})` }
56
+ : {
57
+ name: "key",
58
+ status: "warn",
59
+ detail: "no API key: only replay works",
60
+ fix: "set OPENROUTER_API_KEY, or write `openrouter_api_key: <key>` to ~/.config/system1/credentials (chmod 600)",
61
+ });
62
+ checks.push(config.egress.consent.granted
63
+ ? { name: "consent", status: "ok", detail: `egress consent granted for ${config.repoRoot}` }
64
+ : {
65
+ name: "consent",
66
+ status: "warn",
67
+ detail: `no egress consent for ${config.repoRoot}: live calls are refused`,
68
+ fix: "the user runs `decide config egress allow` in this repo, if they agree",
69
+ });
70
+ let reach;
71
+ try {
72
+ reach = await ping({
73
+ endpoint: config.endpoint,
74
+ model: config.model,
75
+ apiKey: config.apiKey,
76
+ replay: config.replay,
77
+ }, ctx.fetch ? { fetch: ctx.fetch } : {});
78
+ }
79
+ catch (error) {
80
+ // An endpoint that is not a URL at all.
81
+ checks.push({
82
+ name: "config",
83
+ status: "fail",
84
+ detail: `endpoint ${config.endpoint}: ${error instanceof Error ? error.message : String(error)}`,
85
+ fix: "correct SYSTEM1_ENDPOINT or `endpoint` in the config file",
86
+ });
87
+ return report(ctx, false);
88
+ }
89
+ if (reach.ok) {
90
+ checks.push({
91
+ name: "network",
92
+ status: "ok",
93
+ detail: `${config.model} reachable in ${reach.latencyMs} ms`,
94
+ });
95
+ }
96
+ else {
97
+ const sandboxed = env.CODEX_SANDBOX_NETWORK_DISABLED === "1";
98
+ checks.push({
99
+ name: "network",
100
+ // Replay needs no network, so an unreachable endpoint only warns there.
101
+ status: config.replay ? "warn" : "fail",
102
+ detail: `${reach.probe}: ${reach.error ?? "unreachable"}${sandboxed ? " (Codex sandbox has network disabled)" : ""}`,
103
+ fix: networkFix(reach.httpStatus, harness, sandboxed, env),
104
+ });
105
+ }
106
+ const live = !config.replay &&
107
+ config.apiKey !== undefined &&
108
+ config.egress.consent.granted &&
109
+ reach.ok === true;
110
+ return report(ctx, live);
111
+ }
112
+ function pathCheck(harness, env) {
113
+ const onPath = which("decide", env.PATH ?? "");
114
+ if (onPath)
115
+ return { name: "path", status: "ok", detail: `decide on PATH: ${onPath}` };
116
+ if (harness === "claude") {
117
+ return {
118
+ name: "path",
119
+ status: "warn",
120
+ detail: "decide is not on PATH, so the decisions plugin's bin/ is not loaded",
121
+ fix: "install the decisions plugin from its marketplace, or start Claude Code with `--plugin-dir <checkout>/plugins/system1`",
122
+ };
123
+ }
124
+ return {
125
+ name: "path",
126
+ status: "warn",
127
+ detail: "decide is not on PATH. Codex and Pi do not add plugin bin/ to PATH",
128
+ fix: `npm i -g ${CLI_PACKAGE}@${VERSION}`,
129
+ };
130
+ }
131
+ async function versionCheck(path, probe, env) {
132
+ let raw;
133
+ try {
134
+ raw = await probe(path);
135
+ }
136
+ catch { }
137
+ const found = raw?.trim() || undefined;
138
+ // Measured with Codex 0.152: inside its Linux sandbox, a child process that
139
+ // node spawns exits 0 with empty stdout (even `node -e "console.log(1)"`), so
140
+ // nothing can be learned there. Say so rather than warn about a false problem.
141
+ if (raw !== undefined && found === undefined && env.CODEX_SANDBOX_NETWORK_DISABLED === "1") {
142
+ return {
143
+ name: "path-version",
144
+ status: "ok",
145
+ detail: "not checked: the Codex sandbox hides a child process's output",
146
+ };
147
+ }
148
+ if (found === undefined) {
149
+ return {
150
+ name: "path-version",
151
+ status: "warn",
152
+ detail: `could not read the version of ${path}`,
153
+ fix: `run \`${path} version\` to see why; reinstall it if it fails`,
154
+ };
155
+ }
156
+ if (found === VERSION) {
157
+ return {
158
+ name: "path-version",
159
+ status: "ok",
160
+ detail: `decide on PATH is ${found}, same as this one`,
161
+ };
162
+ }
163
+ return {
164
+ name: "path-version",
165
+ status: "warn",
166
+ detail: `decide on PATH is ${found}, but this one is ${VERSION}: agents will run the one on PATH`,
167
+ fix: `npm i -g ${CLI_PACKAGE}@${VERSION}, or remove the other decide (${path})`,
168
+ };
169
+ }
170
+ function networkFix(httpStatus, harness, sandboxed, env) {
171
+ // An HTTP answer means the network works; the problem is what was asked for.
172
+ if (httpStatus === 404)
173
+ return "the endpoint does not know this model: check SYSTEM1_MODEL / `model` and SYSTEM1_ENDPOINT / `endpoint`";
174
+ if (httpStatus !== undefined && httpStatus >= 500)
175
+ return `the provider answered HTTP ${httpStatus}: retry later`;
176
+ if (httpStatus !== undefined)
177
+ return `the endpoint answered HTTP ${httpStatus}: check SYSTEM1_ENDPOINT / \`endpoint\``;
178
+ // Only a sandboxed Codex shell gets the rule: outside the sandbox (or with
179
+ // the rule applied) a failure is an ordinary network problem. The flag also
180
+ // beats the nesting heuristic (Codex inside Pi looks like Pi).
181
+ if (sandboxed) {
182
+ return `add \`${CODEX_RULE}\` to ${env.CODEX_HOME?.trim() || "~/.codex"}/rules/system1.rules, then restart Codex (it covers commands that start with decide; a pipe into decide stays offline)`;
183
+ }
184
+ if (harness === "claude")
185
+ return "allow outbound access to openrouter.ai in Claude Code's sandbox settings";
186
+ return "check that this machine can reach openrouter.ai (proxy, firewall, DNS)";
187
+ }
188
+ /** The first executable file `name` on `path`, like `command -v`. */
189
+ export function which(name, path) {
190
+ for (const dir of path.split(delimiter)) {
191
+ if (!dir)
192
+ continue;
193
+ const candidate = join(dir, name);
194
+ try {
195
+ accessSync(candidate, constants.X_OK);
196
+ if (statSync(candidate).isFile())
197
+ return candidate;
198
+ }
199
+ catch { }
200
+ }
201
+ return undefined;
202
+ }
203
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { type ErrorCode } from "../errors.js";
2
+ import type { Answers, Usage } from "../model/types.js";
3
+ import { type Projection } from "../run/budget.js";
4
+ import { type AnswerSource } from "../run/spend.js";
5
+ import type { LineRange, Skipped } from "../sources/types.js";
6
+ import { type ToolContext } from "./context.js";
7
+ export interface ResultRow {
8
+ id: string;
9
+ path?: string;
10
+ lines?: LineRange;
11
+ /**
12
+ * The start of the (scrubbed) text, for items whose id doesn't lead back to
13
+ * it: piped items, and single lines such as grep hits split by row.
14
+ */
15
+ excerpt?: string;
16
+ /**
17
+ * Answers of this row that came back too flat to act on. Present on kept
18
+ * rows too: a question the projection didn't act on can still be undecided,
19
+ * and hiding that would overstate the result.
20
+ */
21
+ undecided?: string[];
22
+ answers: Answers;
23
+ }
24
+ export interface SkippedSummary {
25
+ total: number;
26
+ byReason: Partial<Record<Skipped["reason"], number>>;
27
+ /** The first few, so the agent can see what kind of thing was withheld. */
28
+ sample: Skipped[];
29
+ }
30
+ export interface ManyResult {
31
+ dryRun: boolean;
32
+ spec?: string;
33
+ model: string;
34
+ /** How answers were produced: every item in one run shares the decider's mode. */
35
+ source?: AnswerSource;
36
+ counts: {
37
+ items: number;
38
+ kept: number;
39
+ /** Kept before `limit`. */
40
+ keptTotal: number;
41
+ undecided: number;
42
+ dropped: number;
43
+ failed: number;
44
+ skipped: number;
45
+ };
46
+ kept: ResultRow[];
47
+ /** Too flat to judge: read these yourself, or ask a human. */
48
+ undecided: Array<ResultRow & {
49
+ questions: string[];
50
+ }>;
51
+ failed: Array<{
52
+ id: string;
53
+ code: ErrorCode | "error";
54
+ message: string;
55
+ }>;
56
+ skipped: SkippedSummary;
57
+ redactions: {
58
+ total: number;
59
+ items: number;
60
+ };
61
+ /** Measured. Zero on a dry run or a replay. */
62
+ usage: Usage;
63
+ projection: Projection;
64
+ wallClockMs: number;
65
+ /** Present on a dry run: the first item ids that would be sent. */
66
+ sampleIds?: string[];
67
+ }
68
+ /**
69
+ * Fan-out: one question set over N items, each its own call, under the
70
+ * concurrency cap. Only what survives `keep` comes back in full.
71
+ */
72
+ export declare function runMany(ctx: ToolContext, rawInput: unknown): Promise<ManyResult>;
73
+ export declare function summariseSkipped(skipped: readonly Skipped[]): SkippedSummary;
74
+ //# sourceMappingURL=many.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"many.d.ts","sourceRoot":"","sources":["../../src/tools/many.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAGvD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE/D,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,iBAAiB,CAAA;AAC7D,OAAO,KAAK,EAAQ,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAGvF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAID,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IACpD,2EAA2E;IAC3E,MAAM,EAAE,OAAO,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,2BAA2B;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,SAAS,EAAE,CAAA;IACjB,8DAA8D;IAC9D,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG;QAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACrD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzE,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,+CAA+C;IAC/C,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAID;;;GAGG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAuGtF;AAyCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,cAAc,CAQ5E"}