@vinhnt-sdk/tools 1.0.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/arity.d.ts +22 -0
  3. package/dist/arity.d.ts.map +1 -0
  4. package/dist/arity.js +96 -0
  5. package/dist/arity.js.map +1 -0
  6. package/dist/context.d.ts +43 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +2 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/define-tool.d.ts +45 -0
  11. package/dist/define-tool.d.ts.map +1 -0
  12. package/dist/define-tool.js +120 -0
  13. package/dist/define-tool.js.map +1 -0
  14. package/dist/definitions.d.ts +24 -0
  15. package/dist/definitions.d.ts.map +1 -0
  16. package/dist/definitions.js +2 -0
  17. package/dist/definitions.js.map +1 -0
  18. package/dist/description-lint.d.ts +25 -0
  19. package/dist/description-lint.d.ts.map +1 -0
  20. package/dist/description-lint.js +90 -0
  21. package/dist/description-lint.js.map +1 -0
  22. package/dist/diff.d.ts +7 -0
  23. package/dist/diff.d.ts.map +1 -0
  24. package/dist/diff.js +26 -0
  25. package/dist/diff.js.map +1 -0
  26. package/dist/domain.d.ts +39 -0
  27. package/dist/domain.d.ts.map +1 -0
  28. package/dist/domain.js +20 -0
  29. package/dist/domain.js.map +1 -0
  30. package/dist/file-history.d.ts +43 -0
  31. package/dist/file-history.d.ts.map +1 -0
  32. package/dist/file-history.js +55 -0
  33. package/dist/file-history.js.map +1 -0
  34. package/dist/file-tools.d.ts +56 -0
  35. package/dist/file-tools.d.ts.map +1 -0
  36. package/dist/file-tools.js +542 -0
  37. package/dist/file-tools.js.map +1 -0
  38. package/dist/git-tools.d.ts +8 -0
  39. package/dist/git-tools.d.ts.map +1 -0
  40. package/dist/git-tools.js +114 -0
  41. package/dist/git-tools.js.map +1 -0
  42. package/dist/history-hook.d.ts +4 -0
  43. package/dist/history-hook.d.ts.map +1 -0
  44. package/dist/history-hook.js +62 -0
  45. package/dist/history-hook.js.map +1 -0
  46. package/dist/image-tools.d.ts +11 -0
  47. package/dist/image-tools.d.ts.map +1 -0
  48. package/dist/image-tools.js +55 -0
  49. package/dist/image-tools.js.map +1 -0
  50. package/dist/index.d.ts +57 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +36 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/json-schema.d.ts +22 -0
  55. package/dist/json-schema.d.ts.map +1 -0
  56. package/dist/json-schema.js +2 -0
  57. package/dist/json-schema.js.map +1 -0
  58. package/dist/lazy-registry.d.ts +23 -0
  59. package/dist/lazy-registry.d.ts.map +1 -0
  60. package/dist/lazy-registry.js +64 -0
  61. package/dist/lazy-registry.js.map +1 -0
  62. package/dist/policy.d.ts +5 -0
  63. package/dist/policy.d.ts.map +1 -0
  64. package/dist/policy.js +2 -0
  65. package/dist/policy.js.map +1 -0
  66. package/dist/provider-helpers.d.ts +26 -0
  67. package/dist/provider-helpers.d.ts.map +1 -0
  68. package/dist/provider-helpers.js +46 -0
  69. package/dist/provider-helpers.js.map +1 -0
  70. package/dist/provider.d.ts +80 -0
  71. package/dist/provider.d.ts.map +1 -0
  72. package/dist/provider.js +96 -0
  73. package/dist/provider.js.map +1 -0
  74. package/dist/providers/agent-provider.d.ts +32 -0
  75. package/dist/providers/agent-provider.d.ts.map +1 -0
  76. package/dist/providers/agent-provider.js +35 -0
  77. package/dist/providers/agent-provider.js.map +1 -0
  78. package/dist/providers/builtin-provider.d.ts +36 -0
  79. package/dist/providers/builtin-provider.d.ts.map +1 -0
  80. package/dist/providers/builtin-provider.js +86 -0
  81. package/dist/providers/builtin-provider.js.map +1 -0
  82. package/dist/providers/file-loader.d.ts +47 -0
  83. package/dist/providers/file-loader.d.ts.map +1 -0
  84. package/dist/providers/file-loader.js +120 -0
  85. package/dist/providers/file-loader.js.map +1 -0
  86. package/dist/providers/index.d.ts +6 -0
  87. package/dist/providers/index.d.ts.map +1 -0
  88. package/dist/providers/index.js +5 -0
  89. package/dist/providers/index.js.map +1 -0
  90. package/dist/providers/skill-provider.d.ts +23 -0
  91. package/dist/providers/skill-provider.d.ts.map +1 -0
  92. package/dist/providers/skill-provider.js +28 -0
  93. package/dist/providers/skill-provider.js.map +1 -0
  94. package/dist/question-tool.d.ts +15 -0
  95. package/dist/question-tool.d.ts.map +1 -0
  96. package/dist/question-tool.js +51 -0
  97. package/dist/question-tool.js.map +1 -0
  98. package/dist/read-tracker.d.ts +8 -0
  99. package/dist/read-tracker.d.ts.map +1 -0
  100. package/dist/read-tracker.js +33 -0
  101. package/dist/read-tracker.js.map +1 -0
  102. package/dist/registry.d.ts +58 -0
  103. package/dist/registry.d.ts.map +1 -0
  104. package/dist/registry.js +128 -0
  105. package/dist/registry.js.map +1 -0
  106. package/dist/sandbox.d.ts +85 -0
  107. package/dist/sandbox.d.ts.map +1 -0
  108. package/dist/sandbox.js +409 -0
  109. package/dist/sandbox.js.map +1 -0
  110. package/dist/search-tools.d.ts +11 -0
  111. package/dist/search-tools.d.ts.map +1 -0
  112. package/dist/search-tools.js +124 -0
  113. package/dist/search-tools.js.map +1 -0
  114. package/dist/shell-parser.d.ts +9 -0
  115. package/dist/shell-parser.d.ts.map +1 -0
  116. package/dist/shell-parser.js +68 -0
  117. package/dist/shell-parser.js.map +1 -0
  118. package/dist/shell-tool.d.ts +22 -0
  119. package/dist/shell-tool.d.ts.map +1 -0
  120. package/dist/shell-tool.js +100 -0
  121. package/dist/shell-tool.js.map +1 -0
  122. package/dist/todo-tool.d.ts +2 -0
  123. package/dist/todo-tool.d.ts.map +1 -0
  124. package/dist/todo-tool.js +121 -0
  125. package/dist/todo-tool.js.map +1 -0
  126. package/dist/tool-search.d.ts +14 -0
  127. package/dist/tool-search.d.ts.map +1 -0
  128. package/dist/tool-search.js +46 -0
  129. package/dist/tool-search.js.map +1 -0
  130. package/dist/types.d.ts +30 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +2 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/validate.d.ts +9 -0
  135. package/dist/validate.d.ts.map +1 -0
  136. package/dist/validate.js +26 -0
  137. package/dist/validate.js.map +1 -0
  138. package/dist/web-search-tool.d.ts +84 -0
  139. package/dist/web-search-tool.d.ts.map +1 -0
  140. package/dist/web-search-tool.js +134 -0
  141. package/dist/web-search-tool.js.map +1 -0
  142. package/dist/web-tools.d.ts +10 -0
  143. package/dist/web-tools.d.ts.map +1 -0
  144. package/dist/web-tools.js +62 -0
  145. package/dist/web-tools.js.map +1 -0
  146. package/package.json +58 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nguyen Thanh Vinh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Extract the "human-understandable command prefix" from shell tokens.
3
+ *
4
+ * Examples:
5
+ * prefix(["npm", "install", "express", "--save"]) → ["npm", "install"]
6
+ * prefix(["git", "checkout", "main"]) → ["git", "checkout"]
7
+ * prefix(["docker", "compose", "up", "-d"]) → ["docker", "compose", "up"]
8
+ * prefix(["cat", "file.txt"]) → ["cat"]
9
+ * prefix([]) → []
10
+ */
11
+ export declare function prefix(tokens: string[]): string[];
12
+ /**
13
+ * Convert a shell command string into a permission save pattern.
14
+ * The pattern with trailing " *" allows exact-match or prefix-match in saved rules.
15
+ *
16
+ * Examples:
17
+ * commandPattern("npm install express --save") → "npm install *"
18
+ * commandPattern("git checkout main") → "git checkout *"
19
+ * commandPattern("cat file.txt") → "cat *"
20
+ */
21
+ export declare function commandPattern(command: string): string;
22
+ //# sourceMappingURL=arity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arity.d.ts","sourceRoot":"","sources":["../src/arity.ts"],"names":[],"mappings":"AAuEA;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD"}
package/dist/arity.js ADDED
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ARITY dictionary: maps command prefixes to their "human-understandable" token count.
3
+ *
4
+ * When a user runs a command like "npm install express --save", the arity tells us
5
+ * that the meaningful prefix is ["npm", "install"] (arity 2). This enables:
6
+ * - Cleaner permission prompts ("Allow npm install?")
7
+ * - Smarter "always allow" patterns ("npm install *" matches any npm install variant)
8
+ */
9
+ const ARITY = {
10
+ // Single-arity commands
11
+ cat: 1, cd: 1, chmod: 1, chown: 1, cp: 1, echo: 1, env: 1,
12
+ export: 1, git: 2, "git config": 3, "git remote": 3, "git stash": 3, grep: 1, kill: 1, killall: 1, ln: 1, ls: 1,
13
+ mkdir: 1, mv: 1, ps: 1, pwd: 1, rm: 1, rmdir: 1, sleep: 1,
14
+ source: 1, tail: 1, touch: 1, unset: 1, which: 1,
15
+ // Cloud / infrastructure
16
+ aws: 3, az: 3, gcloud: 3, gh: 3, doctl: 3, eksctl: 2,
17
+ "eksctl create": 3, cdk: 2, cf: 2, heroku: 2, vercel: 2,
18
+ pulumi: 2, "pulumi stack": 3, terraform: 2,
19
+ "terraform workspace": 3, vault: 2, "vault auth": 3,
20
+ "vault kv": 3, consul: 2, "consul kv": 3, nomad: 2,
21
+ serverless: 2, sls: 2, sst: 2, flyctl: 2, sfdx: 3,
22
+ // Containers / orchestration
23
+ docker: 2, "docker builder": 3, "docker compose": 3,
24
+ "docker container": 3, "docker image": 3, "docker network": 3,
25
+ "docker volume": 3, podman: 2, "podman container": 3,
26
+ "podman image": 3, kubectl: 2, "kubectl kustomize": 3,
27
+ "kubectl rollout": 3, kustomize: 2, helm: 2,
28
+ minikube: 2, kind: 2, "kind create": 3, crictl: 2,
29
+ skaffold: 2, compose: 2,
30
+ // Languages / runtimes
31
+ node: 2, python: 2, python3: 2, ruby: 2, rake: 2,
32
+ go: 2, cargo: 2, "cargo add": 3, "cargo run": 3,
33
+ rustup: 2, dotnet: 2, mvn: 2, gradle: 2, swift: 2,
34
+ deno: 2, "deno task": 3, bun: 2, "bun run": 3, "bun x": 3,
35
+ // JavaScript / Node ecosystem
36
+ npm: 2, "npm exec": 3, "npm init": 3, "npm run": 3,
37
+ "npm view": 3, npx: 2, yarn: 2, "yarn dlx": 3, "yarn run": 3,
38
+ pnpm: 2, "pnpm dlx": 3, "pnpm exec": 3, "pnpm run": 3,
39
+ nvm: 2, volta: 2, ng: 2, nx: 2, turbo: 2,
40
+ // Python
41
+ pip: 2, pip3: 2, pipenv: 2, poetry: 2, pyenv: 2,
42
+ // PHP
43
+ composer: 2, wp: 2,
44
+ // Databases
45
+ psql: 2, mysql: 2, mongosh: 2, "redis-cli": 2,
46
+ sqlite3: 2, pg_dump: 2, pg_restore: 2,
47
+ // Build tools
48
+ make: 2, cmake: 2, bazel: 2, meson: 2,
49
+ // System / network
50
+ systemctl: 2, journalctl: 2, ufw: 2, ip: 2, "ip addr": 3,
51
+ "ip link": 3, "ip netns": 3, "ip route": 3, tmux: 2,
52
+ screen: 2, openssl: 2, "openssl req": 3, "openssl x509": 3,
53
+ // Firestore / GCP
54
+ firebase: 2, gsutil: 2, bq: 2,
55
+ // Misc
56
+ brew: 2, "brew bundle": 3, "brew services": 3, mc: 2,
57
+ "mc admin": 3, vagrant: 2, packer: 2, sdkmanager: 2,
58
+ adb: 2, fastlane: 2, cocoapods: 2,
59
+ };
60
+ /**
61
+ * Extract the "human-understandable command prefix" from shell tokens.
62
+ *
63
+ * Examples:
64
+ * prefix(["npm", "install", "express", "--save"]) → ["npm", "install"]
65
+ * prefix(["git", "checkout", "main"]) → ["git", "checkout"]
66
+ * prefix(["docker", "compose", "up", "-d"]) → ["docker", "compose", "up"]
67
+ * prefix(["cat", "file.txt"]) → ["cat"]
68
+ * prefix([]) → []
69
+ */
70
+ export function prefix(tokens) {
71
+ for (let len = tokens.length; len > 0; len--) {
72
+ const key = tokens.slice(0, len).join(" ");
73
+ const arity = ARITY[key];
74
+ if (arity !== undefined)
75
+ return tokens.slice(0, arity);
76
+ }
77
+ if (tokens.length === 0)
78
+ return [];
79
+ return tokens.slice(0, 1);
80
+ }
81
+ /**
82
+ * Convert a shell command string into a permission save pattern.
83
+ * The pattern with trailing " *" allows exact-match or prefix-match in saved rules.
84
+ *
85
+ * Examples:
86
+ * commandPattern("npm install express --save") → "npm install *"
87
+ * commandPattern("git checkout main") → "git checkout *"
88
+ * commandPattern("cat file.txt") → "cat *"
89
+ */
90
+ export function commandPattern(command) {
91
+ const tokens = command.trim().split(/\s+/);
92
+ if (tokens.length === 0 || (tokens.length === 1 && tokens[0] === ""))
93
+ return "*";
94
+ return prefix(tokens).join(" ") + " *";
95
+ }
96
+ //# sourceMappingURL=arity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arity.js","sourceRoot":"","sources":["../src/arity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** Reply from human-in-the-loop approval */
2
+ export type PermissionReply = "once" | "always" | "reject";
3
+ import type { RequestContext } from "@vinhnt-sdk/schema";
4
+ /** Context passed to every tool execution — replaces bare AbortSignal */
5
+ export interface ToolContext {
6
+ readonly sessionId: string;
7
+ readonly runId: string;
8
+ readonly agentId: string;
9
+ readonly agentName: string;
10
+ readonly signal: AbortSignal;
11
+ /**
12
+ * The parent run's request context (traceId/actorId/tenantId/requestId).
13
+ * Lets handoff tools (delegate/spawn) propagate identity + parent-run
14
+ * linkage to child agents instead of inventing a synthetic context.
15
+ */
16
+ readonly parentContext?: RequestContext;
17
+ /** Environment variables for subprocess execution (shell tool) */
18
+ readonly env: Record<string, string>;
19
+ /**
20
+ * Request human approval for a permission-bound operation.
21
+ * Returns the user's decision: "once" (allow once), "always" (approve forever), or "reject".
22
+ * When reply is "always", savePatterns are persisted as allow rules for future requests.
23
+ */
24
+ ask(input: {
25
+ permission: string;
26
+ resource: string;
27
+ reason: string;
28
+ /** Patterns to save as "always allow" rules if user replies "always". Uses arity-based truncation. */
29
+ savePatterns?: readonly string[];
30
+ }): Promise<PermissionReply>;
31
+ /** Attach metadata to the current tool call (for observability) */
32
+ metadata(input: {
33
+ title?: string;
34
+ metadata?: Record<string, unknown>;
35
+ }): void;
36
+ /**
37
+ * Register a compensation action for saga rollback.
38
+ * If the current run fails or is cancelled, this action will be called
39
+ * to undo the tool's side effect (e.g., restore original file content).
40
+ */
41
+ setCompensation(action: () => Promise<void>): void;
42
+ }
43
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC;IAExC,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,sGAAsG;QACtG,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAClC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,IAAI,CAAC;IAET;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import type { ToolDefinition, ToolContext, ToolRisk } from "./definitions.js";
3
+ import type { NestedJsonSchema } from "./json-schema.js";
4
+ /**
5
+ * ── Schema-first tool authoring (OpenCode-style `Tool.make`) ──────────────
6
+ * The tool OWNS its validation schema (`input`) instead of importing a
7
+ * standalone static schema. `toDefinition()` derives the provider-facing
8
+ * `ToolDefinition` (JSON Schema) from that schema, so there is exactly one
9
+ * source of truth per tool. Domain namespacing is applied via `name`.
10
+ */
11
+ export interface ToolConfig<TInput = unknown, TOutput = unknown> {
12
+ /** Tool name / id. Use dot-prefixed names for domains: "coding.read_file". */
13
+ name: string;
14
+ description: string;
15
+ risk: ToolRisk;
16
+ /** Runtime validation schema — owned by this tool, not a shared file. */
17
+ input: z.ZodType<TInput>;
18
+ /** Optional output validation schema. */
19
+ output?: z.ZodType<TOutput>;
20
+ /** Per-tool timeout in ms (overrides global default). */
21
+ timeoutMs?: number;
22
+ /** Permission action key for the gate (e.g. "edit", "shell"). Optional; defaults to risk. */
23
+ permissionAction?: string;
24
+ /** Optional LLM-facing JSON Schema override (e.g. to advertise `path` aliases). */
25
+ jsonSchema?: NestedJsonSchema;
26
+ /** Coerce raw model-agnostic input before validation (e.g. snake_case aliases). */
27
+ normalize?(raw: unknown): unknown;
28
+ execute(input: TInput, ctx: ToolContext): Promise<TOutput>;
29
+ }
30
+ export interface Tool<TInput = unknown, TOutput = unknown> {
31
+ readonly name: string;
32
+ readonly description: string;
33
+ readonly risk: ToolRisk;
34
+ readonly timeoutMs?: number;
35
+ readonly permissionAction?: string;
36
+ readonly input: z.ZodType<TInput>;
37
+ /** Derive the provider-facing ToolDefinition (registers as `name`). */
38
+ toDefinition(): ToolDefinition<TInput, TOutput>;
39
+ }
40
+ /** Map a Zod schema to the codebase's `NestedJsonSchema` shape (best effort). */
41
+ export declare function zodSchemaToNestedJsonSchema(schema: z.ZodTypeAny): NestedJsonSchema | undefined;
42
+ export declare function defineTool<TInput = unknown, TOutput = unknown>(config: ToolConfig<TInput, TOutput>): Tool<TInput, TOutput>;
43
+ /** Convenience: build a ToolDefinition directly from a ToolConfig. */
44
+ export declare function toolToDefinition<TInput = unknown, TOutput = unknown>(config: ToolConfig<TInput, TOutput>): ToolDefinition<TInput, TOutput>;
45
+ //# sourceMappingURL=define-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-tool.d.ts","sourceRoot":"","sources":["../src/define-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC7D,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,yEAAyE;IACzE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,yCAAyC;IACzC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,mFAAmF;IACnF,SAAS,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,uEAAuE;IACvE,YAAY,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAID,iFAAiF;AACjF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAI9F;AAgFD,wBAAgB,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC5D,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CA8BvB;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAClE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjC"}
@@ -0,0 +1,120 @@
1
+ import { validateInput } from "./validate.js";
2
+ /** Map a Zod schema to the codebase's `NestedJsonSchema` shape (best effort). */
3
+ export function zodSchemaToNestedJsonSchema(schema) {
4
+ if (!schema)
5
+ return undefined;
6
+ const out = convert(schema);
7
+ return out ? Object.assign({}, out) : undefined;
8
+ }
9
+ function convert(schema) {
10
+ if (!schema)
11
+ return undefined;
12
+ // Unwrap effects (refine/transform) and optional/default wrappers.
13
+ while (schema._def.type === "effects" || schema._def.type === "optional" || schema._def.type === "default") {
14
+ if (schema._def.type === "effects")
15
+ schema = schema._def.schema;
16
+ else
17
+ schema = schema._def.innerType;
18
+ }
19
+ const base = {};
20
+ const desc = schema.description ?? schema._def.description;
21
+ if (desc)
22
+ base.description = desc;
23
+ switch (schema._def.type) {
24
+ case "string":
25
+ base.type = "string";
26
+ return base;
27
+ case "number":
28
+ base.type = "number";
29
+ return base;
30
+ case "boolean":
31
+ base.type = "boolean";
32
+ return base;
33
+ case "enum": {
34
+ const entries = schema._def.entries ?? {};
35
+ base.type = "string";
36
+ base.enum = Object.keys(entries);
37
+ return base;
38
+ }
39
+ case "literal":
40
+ base.type = typeof schema._def.value === "string" ? "string" : "number";
41
+ return base;
42
+ case "array": {
43
+ base.type = "array";
44
+ base.items = convert(schema._def.innerType) ?? { type: "string" };
45
+ return base;
46
+ }
47
+ case "record":
48
+ base.type = "object";
49
+ return base;
50
+ case "object": {
51
+ base.type = "object";
52
+ const raw = schema._def.shape;
53
+ const shape = typeof raw === "function" ? raw() : (raw ?? {});
54
+ const properties = {};
55
+ const required = [];
56
+ for (const [key, child] of Object.entries(shape)) {
57
+ properties[key] = convert(child) ?? { type: "string" };
58
+ if (!child.isOptional?.() && child._def?.type !== "optional" && child._def?.type !== "default") {
59
+ required.push(key);
60
+ }
61
+ }
62
+ base.properties = properties;
63
+ if (required.length)
64
+ base.required = required;
65
+ return base;
66
+ }
67
+ case "union": {
68
+ const options = schema._def.options ?? [];
69
+ if (options.every((o) => o._def?.type === "string")) {
70
+ base.type = "string";
71
+ return base;
72
+ }
73
+ if (options.every((o) => o._def?.type === "number")) {
74
+ base.type = "number";
75
+ return base;
76
+ }
77
+ base.type = "string";
78
+ return base;
79
+ }
80
+ default:
81
+ base.type = "string";
82
+ return base;
83
+ }
84
+ }
85
+ export function defineTool(config) {
86
+ return {
87
+ name: config.name,
88
+ description: config.description,
89
+ risk: config.risk,
90
+ timeoutMs: config.timeoutMs,
91
+ permissionAction: config.permissionAction,
92
+ input: config.input,
93
+ toDefinition() {
94
+ return {
95
+ id: config.name,
96
+ description: config.description,
97
+ risk: config.risk,
98
+ inputSchema: config.jsonSchema ?? zodSchemaToNestedJsonSchema(config.input),
99
+ timeoutMs: config.timeoutMs,
100
+ permissionAction: config.permissionAction,
101
+ inputZodSchema: config.input,
102
+ outputZodSchema: config.output,
103
+ async execute(raw, ctx) {
104
+ const normalized = config.normalize ? config.normalize(raw) : raw;
105
+ const input = validateInput(config.name, config.input, normalized);
106
+ const result = await config.execute(input, ctx);
107
+ if (config.output) {
108
+ return validateInput(config.name, config.output, result);
109
+ }
110
+ return result;
111
+ },
112
+ };
113
+ },
114
+ };
115
+ }
116
+ /** Convenience: build a ToolDefinition directly from a ToolConfig. */
117
+ export function toolToDefinition(config) {
118
+ return defineTool(config).toDefinition();
119
+ }
120
+ //# sourceMappingURL=define-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-tool.js","sourceRoot":"","sources":["../src/define-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { z } from "zod";
2
+ import type { ToolDefinitionLike } from "@vinhnt-sdk/schema";
3
+ import type { ToolContext } from "./context.js";
4
+ export type { ToolContext };
5
+ import type { NestedJsonSchema } from "./json-schema.js";
6
+ export type ToolRisk = "read" | "write" | "destructive" | "external";
7
+ export interface ToolDefinition<TInput = unknown, TOutput = unknown> extends ToolDefinitionLike {
8
+ readonly inputSchema?: NestedJsonSchema | undefined;
9
+ readonly risk: ToolRisk;
10
+ /** Per-tool timeout in ms (overrides global default). */
11
+ readonly timeoutMs?: number;
12
+ /** Permission action key for the gate (e.g. "edit", "shell"). Optional; defaults to risk. */
13
+ readonly permissionAction?: string;
14
+ /** Zod schema for runtime input validation (carried from defineTool). */
15
+ readonly inputZodSchema?: z.ZodType<TInput>;
16
+ /** Zod schema for runtime output validation (carried from defineTool). */
17
+ readonly outputZodSchema?: z.ZodType<TOutput>;
18
+ /** If true, tool is not loaded into context until explicitly requested via search. */
19
+ readonly deferred?: boolean;
20
+ /** Tags for tool search (e.g. ["file", "read", "search"]). */
21
+ readonly tags?: readonly string[];
22
+ execute(input: TInput, ctx: ToolContext): Promise<TOutput>;
23
+ }
24
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,CAAE,SAAQ,kBAAkB;IAC7F,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ── Tool description lint (Phase 5) ──────────────────────────────────────
3
+ * LLM tool-selection accuracy depends on description quality: a bad or vague
4
+ * description ("Do stuff") makes the model pick the wrong tool or skip it.
5
+ * This module flags the common "smells" in tool descriptions so authors and
6
+ * CI can catch them early, mirroring API-doc review practices.
7
+ */
8
+ export type DescriptionIssueCode = "empty" | "too-short" | "no-verb" | "vague" | "placeholder" | "too-long";
9
+ export interface ToolDescriptionIssue {
10
+ readonly code: DescriptionIssueCode;
11
+ readonly message: string;
12
+ }
13
+ export interface ToolDescriptionReport {
14
+ readonly tool: string;
15
+ readonly description: string;
16
+ readonly issues: readonly ToolDescriptionIssue[];
17
+ }
18
+ /** Lint a single tool description. Returns the report (empty `issues` = clean). */
19
+ export declare function lintToolDescription(tool: string, description: string): ToolDescriptionReport;
20
+ /** Lint a list of tool definitions, returning only the ones with issues. */
21
+ export declare function lintToolDefinitions(definitions: readonly {
22
+ id: string;
23
+ description: string;
24
+ }[]): ToolDescriptionReport[];
25
+ //# sourceMappingURL=description-lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description-lint.d.ts","sourceRoot":"","sources":["../src/description-lint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAE5G,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAClD;AAwCD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,qBAAqB,CA6C5F;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1D,qBAAqB,EAAE,CAIzB"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * ── Tool description lint (Phase 5) ──────────────────────────────────────
3
+ * LLM tool-selection accuracy depends on description quality: a bad or vague
4
+ * description ("Do stuff") makes the model pick the wrong tool or skip it.
5
+ * This module flags the common "smells" in tool descriptions so authors and
6
+ * CI can catch them early, mirroring API-doc review practices.
7
+ */
8
+ /** Curated imperative verbs a tool description should start with. */
9
+ const ACTION_VERBS = new Set([
10
+ "abort", "accept", "add", "analyze", "apply", "ask", "attach", "authenticate", "authorize",
11
+ "build", "calculate", "cancel", "check", "clear", "close", "commit", "compile", "convert",
12
+ "copy", "count", "create", "decode", "delete", "deploy", "describe", "detect", "diff",
13
+ "download", "edit", "encode", "execute", "explain", "export", "fetch", "find", "fix",
14
+ "format", "generate", "get", "initialize", "install", "invoke", "join", "launch", "list",
15
+ "load", "login", "manage", "merge", "monitor", "move", "open", "optimize", "parse",
16
+ "patch", "plan", "preview", "publish", "push", "query", "read", "rebuild", "refactor",
17
+ "register", "reload", "remove", "rename", "replace", "resolve", "restart", "restore",
18
+ "review", "rollback", "run", "save", "scan", "schedule", "search", "select", "send",
19
+ "set", "show", "simulate", "sort", "spawn", "stage", "start", "stop", "subscribe",
20
+ "summarize", "sync", "test", "trace", "track", "translate", "trigger", "undo", "update",
21
+ "upload", "use", "validate", "verify", "view", "wait", "write", "zoom",
22
+ ]);
23
+ /** Leading adverbs that should be skipped when checking the first verb. */
24
+ const LEADING_ADVERBS = new Set([
25
+ "recursively", "automatically", "quickly", "quietly", "silently", "lazily", "eagerly",
26
+ "simply", "always", "never", "only", "just", "also", "finally", "first", "then", "once",
27
+ ]);
28
+ const MIN_DESCRIPTION_LENGTH = 12;
29
+ const MAX_DESCRIPTION_LENGTH = 220;
30
+ const MIN_WORDS = 4;
31
+ const PLACEHOLDER_RE = /\b(todo|tbd|fixme|placeholder|lorem|coming soon)\b|\byour (tool|plugin)\b|\betc\.?\.?\s*$/i;
32
+ function firstSignificantWord(description) {
33
+ const words = description.split(/\s+/);
34
+ for (const word of words) {
35
+ const normalized = word.toLowerCase().replace(/[^a-z]/g, "");
36
+ if (!normalized)
37
+ continue;
38
+ if (LEADING_ADVERBS.has(normalized))
39
+ continue;
40
+ return normalized;
41
+ }
42
+ return undefined;
43
+ }
44
+ /** Lint a single tool description. Returns the report (empty `issues` = clean). */
45
+ export function lintToolDescription(tool, description) {
46
+ const issues = [];
47
+ const trimmed = description.trim();
48
+ if (!trimmed) {
49
+ return { tool, description: trimmed, issues: [{ code: "empty", message: "Tool description is empty — the model cannot decide when to use this tool." }] };
50
+ }
51
+ if (trimmed.length < MIN_DESCRIPTION_LENGTH) {
52
+ issues.push({
53
+ code: "too-short",
54
+ message: `Description is only ${trimmed.length} chars (min ${MIN_DESCRIPTION_LENGTH}) — too little signal for tool selection.`,
55
+ });
56
+ }
57
+ if (trimmed.length > MAX_DESCRIPTION_LENGTH) {
58
+ issues.push({
59
+ code: "too-long",
60
+ message: `Description is ${trimmed.length} chars (max ${MAX_DESCRIPTION_LENGTH}) — wasteful for the context window; keep the first sentence scannable.`,
61
+ });
62
+ }
63
+ const verb = firstSignificantWord(trimmed);
64
+ if (!verb || !ACTION_VERBS.has(verb)) {
65
+ issues.push({
66
+ code: "no-verb",
67
+ message: `Description should start with an imperative verb (e.g. "Fetch", "Create", "Search") but starts with "${verb ?? "nothing"}".`,
68
+ });
69
+ }
70
+ if (trimmed.split(/\s+/).length < MIN_WORDS) {
71
+ issues.push({
72
+ code: "vague",
73
+ message: `Description is too vague (${trimmed.split(/\s+/).length} words) — state what it does and on what input.`,
74
+ });
75
+ }
76
+ if (PLACEHOLDER_RE.test(trimmed)) {
77
+ issues.push({
78
+ code: "placeholder",
79
+ message: "Description contains placeholder/TODO text — replace with a real description.",
80
+ });
81
+ }
82
+ return { tool, description: trimmed, issues };
83
+ }
84
+ /** Lint a list of tool definitions, returning only the ones with issues. */
85
+ export function lintToolDefinitions(definitions) {
86
+ return definitions
87
+ .map((d) => lintToolDescription(d.id, d.description))
88
+ .filter((report) => report.issues.length > 0);
89
+ }
90
+ //# sourceMappingURL=description-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"description-lint.js","sourceRoot":"","sources":["../src/description-lint.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export interface UnifiedDiff {
2
+ readonly diff: string;
3
+ readonly additions: number;
4
+ readonly removals: number;
5
+ }
6
+ export declare function generateDiff(filePath: string, oldContent: string, newContent: string): UnifiedDiff;
7
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,WAAW,CA6Bb"}
package/dist/diff.js ADDED
@@ -0,0 +1,26 @@
1
+ export function generateDiff(filePath, oldContent, newContent) {
2
+ const oldLines = oldContent.split("\n");
3
+ const newLines = newContent.split("\n");
4
+ const maxLen = Math.max(oldLines.length, newLines.length);
5
+ const result = [];
6
+ let additions = 0;
7
+ let removals = 0;
8
+ for (let i = 0; i < maxLen; i++) {
9
+ const oldLine = i < oldLines.length ? oldLines[i] : "";
10
+ const newLine = i < newLines.length ? newLines[i] : "";
11
+ if (oldLine !== newLine) {
12
+ if (oldLines[i] !== undefined) {
13
+ result.push(`-${i + 1}: ${oldLine}`);
14
+ removals++;
15
+ }
16
+ if (newLines[i] !== undefined) {
17
+ result.push(`+${i + 1}: ${newLine}`);
18
+ additions++;
19
+ }
20
+ }
21
+ }
22
+ result.unshift(`--- a/${filePath}`);
23
+ result.unshift(`+++ b/${filePath}`);
24
+ return { diff: result.join("\n"), additions, removals };
25
+ }
26
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,UAAkB,EAClB,UAAkB;IAElB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBACrC,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBACrC,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC"}