wave-agent-sdk 0.10.4 → 0.11.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 (133) hide show
  1. package/dist/agent.d.ts +8 -6
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +12 -9
  4. package/dist/builtin-skills/builtin-skills/loop/SKILL.md +53 -0
  5. package/dist/builtin-skills/builtin-skills/loop/parsing.ts +159 -0
  6. package/dist/builtin-skills/builtin-skills/settings/HOOKS.md +82 -0
  7. package/dist/builtin-skills/{settings → builtin-skills/settings}/SKILL.md +1 -1
  8. package/dist/builtin-skills/loop/parsing.d.ts +13 -0
  9. package/dist/builtin-skills/loop/parsing.d.ts.map +1 -0
  10. package/dist/builtin-skills/loop/parsing.js +125 -0
  11. package/dist/constants/tools.d.ts +3 -0
  12. package/dist/constants/tools.d.ts.map +1 -1
  13. package/dist/constants/tools.js +3 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +1 -0
  17. package/dist/managers/aiManager.d.ts +0 -2
  18. package/dist/managers/aiManager.d.ts.map +1 -1
  19. package/dist/managers/aiManager.js +53 -14
  20. package/dist/managers/cronManager.d.ts +19 -0
  21. package/dist/managers/cronManager.d.ts.map +1 -0
  22. package/dist/managers/cronManager.js +124 -0
  23. package/dist/managers/hookManager.d.ts.map +1 -1
  24. package/dist/managers/hookManager.js +21 -13
  25. package/dist/managers/liveConfigManager.js +1 -1
  26. package/dist/managers/mcpManager.d.ts +1 -1
  27. package/dist/managers/mcpManager.d.ts.map +1 -1
  28. package/dist/managers/mcpManager.js +10 -2
  29. package/dist/managers/messageManager.d.ts +0 -1
  30. package/dist/managers/messageManager.d.ts.map +1 -1
  31. package/dist/managers/permissionManager.d.ts +27 -7
  32. package/dist/managers/permissionManager.d.ts.map +1 -1
  33. package/dist/managers/permissionManager.js +119 -14
  34. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  35. package/dist/managers/slashCommandManager.js +11 -0
  36. package/dist/managers/subagentManager.d.ts +3 -0
  37. package/dist/managers/subagentManager.d.ts.map +1 -1
  38. package/dist/managers/subagentManager.js +10 -17
  39. package/dist/managers/toolManager.d.ts +1 -1
  40. package/dist/managers/toolManager.d.ts.map +1 -1
  41. package/dist/managers/toolManager.js +28 -4
  42. package/dist/services/configurationService.d.ts.map +1 -1
  43. package/dist/services/configurationService.js +8 -7
  44. package/dist/services/hook.d.ts.map +1 -1
  45. package/dist/services/hook.js +3 -10
  46. package/dist/services/initializationService.js +2 -2
  47. package/dist/services/jsonlHandler.d.ts.map +1 -1
  48. package/dist/services/jsonlHandler.js +3 -0
  49. package/dist/services/reversionService.d.ts +2 -2
  50. package/dist/services/reversionService.d.ts.map +1 -1
  51. package/dist/services/reversionService.js +3 -3
  52. package/dist/services/session.d.ts.map +1 -1
  53. package/dist/services/session.js +18 -11
  54. package/dist/tools/agentTool.js +1 -1
  55. package/dist/tools/bashTool.d.ts.map +1 -1
  56. package/dist/tools/bashTool.js +5 -5
  57. package/dist/tools/cronCreateTool.d.ts +3 -0
  58. package/dist/tools/cronCreateTool.d.ts.map +1 -0
  59. package/dist/tools/cronCreateTool.js +59 -0
  60. package/dist/tools/cronDeleteTool.d.ts +3 -0
  61. package/dist/tools/cronDeleteTool.d.ts.map +1 -0
  62. package/dist/tools/cronDeleteTool.js +38 -0
  63. package/dist/tools/cronListTool.d.ts +3 -0
  64. package/dist/tools/cronListTool.d.ts.map +1 -0
  65. package/dist/tools/cronListTool.js +30 -0
  66. package/dist/tools/skillTool.d.ts +0 -3
  67. package/dist/tools/skillTool.d.ts.map +1 -1
  68. package/dist/tools/skillTool.js +4 -3
  69. package/dist/tools/taskOutputTool.d.ts.map +1 -1
  70. package/dist/tools/taskOutputTool.js +15 -8
  71. package/dist/tools/types.d.ts +2 -0
  72. package/dist/tools/types.d.ts.map +1 -1
  73. package/dist/types/agent.d.ts +10 -0
  74. package/dist/types/agent.d.ts.map +1 -1
  75. package/dist/types/configuration.d.ts +1 -1
  76. package/dist/types/configuration.d.ts.map +1 -1
  77. package/dist/types/cron.d.ts +10 -0
  78. package/dist/types/cron.d.ts.map +1 -0
  79. package/dist/types/cron.js +1 -0
  80. package/dist/types/hooks.d.ts +1 -5
  81. package/dist/types/hooks.d.ts.map +1 -1
  82. package/dist/types/hooks.js +1 -1
  83. package/dist/types/index.d.ts +1 -0
  84. package/dist/types/index.d.ts.map +1 -1
  85. package/dist/types/index.js +1 -0
  86. package/dist/types/messaging.d.ts +1 -1
  87. package/dist/types/messaging.d.ts.map +1 -1
  88. package/dist/utils/containerSetup.d.ts.map +1 -1
  89. package/dist/utils/containerSetup.js +40 -13
  90. package/dist/utils/mcpUtils.d.ts +2 -2
  91. package/dist/utils/mcpUtils.d.ts.map +1 -1
  92. package/dist/utils/mcpUtils.js +1 -5
  93. package/package.json +2 -1
  94. package/src/agent.ts +17 -12
  95. package/src/builtin-skills/loop/SKILL.md +53 -0
  96. package/src/builtin-skills/loop/parsing.ts +159 -0
  97. package/src/builtin-skills/settings/HOOKS.md +44 -57
  98. package/src/builtin-skills/settings/SKILL.md +1 -1
  99. package/src/constants/tools.ts +3 -0
  100. package/src/index.ts +1 -0
  101. package/src/managers/aiManager.ts +72 -24
  102. package/src/managers/cronManager.ts +167 -0
  103. package/src/managers/hookManager.ts +27 -13
  104. package/src/managers/liveConfigManager.ts +2 -2
  105. package/src/managers/mcpManager.ts +23 -2
  106. package/src/managers/messageManager.ts +0 -6
  107. package/src/managers/permissionManager.ts +154 -18
  108. package/src/managers/slashCommandManager.ts +12 -0
  109. package/src/managers/subagentManager.ts +15 -19
  110. package/src/managers/toolManager.ts +37 -4
  111. package/src/services/configurationService.ts +8 -7
  112. package/src/services/hook.ts +5 -11
  113. package/src/services/initializationService.ts +3 -3
  114. package/src/services/jsonlHandler.ts +4 -0
  115. package/src/services/reversionService.ts +9 -4
  116. package/src/services/session.ts +19 -12
  117. package/src/tools/agentTool.ts +1 -1
  118. package/src/tools/bashTool.ts +6 -5
  119. package/src/tools/cronCreateTool.ts +73 -0
  120. package/src/tools/cronDeleteTool.ts +47 -0
  121. package/src/tools/cronListTool.ts +38 -0
  122. package/src/tools/skillTool.ts +6 -4
  123. package/src/tools/taskOutputTool.ts +14 -8
  124. package/src/tools/types.ts +2 -0
  125. package/src/types/agent.ts +10 -0
  126. package/src/types/configuration.ts +1 -1
  127. package/src/types/cron.ts +9 -0
  128. package/src/types/hooks.ts +5 -9
  129. package/src/types/index.ts +1 -0
  130. package/src/types/messaging.ts +1 -1
  131. package/src/utils/containerSetup.ts +50 -16
  132. package/src/utils/mcpUtils.ts +2 -5
  133. package/dist/builtin-skills/settings/HOOKS.md +0 -95
package/dist/agent.d.ts CHANGED
@@ -15,6 +15,7 @@ export declare class Agent {
15
15
  private slashCommandManager;
16
16
  private pluginManager;
17
17
  private skillManager;
18
+ private cronManager;
18
19
  private hookManager;
19
20
  private reversionManager;
20
21
  private memoryRuleManager;
@@ -141,7 +142,7 @@ export declare class Agent {
141
142
  abortAIMessage(): void;
142
143
  /** Execute bash command */
143
144
  executeBashCommand(command: string): Promise<void>;
144
- clearMessages(): void;
145
+ clearMessages(): Promise<void>;
145
146
  /** Unified interrupt method, interrupts both AI messages and command execution */
146
147
  abortMessage(): void;
147
148
  /** Interrupt bash command execution */
@@ -162,11 +163,6 @@ export declare class Agent {
162
163
  backgroundCurrentTask(): Promise<void>;
163
164
  /** Destroy managers, clean up resources */
164
165
  destroy(): Promise<void>;
165
- /**
166
- * Get a subagent instance by its ID
167
- * @param subagentId - The ID of the subagent instance
168
- */
169
- getSubagentInstance(subagentId: string): import("./managers/subagentManager.js").SubagentInstance | null;
170
166
  /**
171
167
  * Trigger the rewind UI callback
172
168
  */
@@ -263,6 +259,12 @@ export declare class Agent {
263
259
  * @param rule - The rule to add (e.g., "Bash(ls)")
264
260
  */
265
261
  addPermissionRule(rule: string): Promise<void>;
262
+ /**
263
+ * Get subagent instance by ID
264
+ * @param subagentId - The ID of the subagent instance
265
+ * @returns The subagent instance or null if not found
266
+ */
267
+ getSubagentInstance(subagentId: string): import("./managers/subagentManager.js").SubagentInstance | null;
266
268
  /**
267
269
  * Get the current task list ID
268
270
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -87,6 +87,7 @@ export class Agent {
87
87
  this.slashCommandManager = this.container.get("SlashCommandManager");
88
88
  this.pluginManager = this.container.get("PluginManager");
89
89
  this.bangManager = this.container.get("BangManager");
90
+ this.cronManager = this.container.get("CronManager");
90
91
  // Set initial permission mode if provided
91
92
  if (options.permissionMode) {
92
93
  this.setPermissionMode(options.permissionMode);
@@ -272,8 +273,8 @@ export class Agent {
272
273
  async executeBashCommand(command) {
273
274
  await this.bangManager?.executeCommand(command);
274
275
  }
275
- clearMessages() {
276
- this.messageManager.clearMessages();
276
+ async clearMessages() {
277
+ await this.slashCommandManager.executeCommand("clear");
277
278
  }
278
279
  /** Unified interrupt method, interrupts both AI messages and command execution */
279
280
  abortMessage() {
@@ -314,6 +315,7 @@ export class Agent {
314
315
  this.abortAIMessage(); // This will abort tools including Agent tool (subagents)
315
316
  this.abortBashCommand();
316
317
  this.abortSlashCommand();
318
+ this.cronManager.stop();
317
319
  // Cleanup background task manager
318
320
  this.backgroundTaskManager.cleanup();
319
321
  // Cleanup MCP connections
@@ -335,13 +337,6 @@ export class Agent {
335
337
  }
336
338
  // Cleanup memory store
337
339
  }
338
- /**
339
- * Get a subagent instance by its ID
340
- * @param subagentId - The ID of the subagent instance
341
- */
342
- getSubagentInstance(subagentId) {
343
- return this.subagentManager.getInstance(subagentId);
344
- }
345
340
  /**
346
341
  * Trigger the rewind UI callback
347
342
  */
@@ -498,6 +493,14 @@ export class Agent {
498
493
  async addPermissionRule(rule) {
499
494
  await this.permissionManager.addPermissionRule(rule);
500
495
  }
496
+ /**
497
+ * Get subagent instance by ID
498
+ * @param subagentId - The ID of the subagent instance
499
+ * @returns The subagent instance or null if not found
500
+ */
501
+ getSubagentInstance(subagentId) {
502
+ return this.subagentManager.getInstance(subagentId);
503
+ }
501
504
  /**
502
505
  * Get the current task list ID
503
506
  */
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: loop
3
+ description: Parses user input into an interval and prompt, converts the interval to a cron expression, and schedules a recurring task
4
+ allowed-tools: CronCreate, Skill
5
+ ---
6
+ # /loop — schedule a recurring prompt
7
+
8
+ Parse the input below into `[interval] <prompt…>` and schedule it with CronCreate.
9
+
10
+ ## Parsing (in priority order)
11
+
12
+ 1. **Leading token**: if the first whitespace-delimited token matches `^\d+[smhd]$` (e.g. `5m`, `2h`), that's the interval; the rest is the prompt.
13
+ 2. **Trailing "every" clause**: otherwise, if the input ends with `every <N><unit>` or `every <N> <unit-word>` (e.g. `every 20m`, `every 5 minutes`, `every 2 hours`), extract that as the interval and strip it from the prompt. Only match when what follows "every" is a time expression — `check every PR` has no interval.
14
+ 3. **Default**: otherwise, interval is `10m` and the entire input is the prompt.
15
+
16
+ If the resulting prompt is empty, show usage `/loop [interval] <prompt>` and stop — do not call CronCreate.
17
+
18
+ Examples:
19
+ - `5m /babysit-prs` → interval `5m`, prompt `/babysit-prs` (rule 1)
20
+ - `check the deploy every 20m` → interval `20m`, prompt `check the deploy` (rule 2)
21
+ - `run tests every 5 minutes` → interval `5m`, prompt `run tests` (rule 2)
22
+ - `check the deploy` → interval `10m`, prompt `check the deploy` (rule 3)
23
+ - `check every PR` → interval `10m`, prompt `check every PR` (rule 3 — "every" not followed by time)
24
+ - `5m` → empty prompt → show usage
25
+
26
+ ## Interval → cron
27
+
28
+ Supported suffixes: `s` (seconds, rounded up to nearest minute, min 1), `m` (minutes), `h` (hours), `d` (days). Convert:
29
+
30
+ | Interval pattern | Cron expression | Notes |
31
+ |-----------------------|---------------------|------------------------------------------|
32
+ | `Nm` where N ≤ 59 | `*/N * * * *` | every N minutes |
33
+ | `Nm` where N ≥ 60 | `0 */H * * *` | round to hours (H = N/60, must divide 24)|
34
+ | `Nh` where N ≤ 23 | `0 */N * * *` | every N hours |
35
+ | `Nd` | `0 0 */N * *` | every N days at midnight local |
36
+ | `Ns` | treat as `ceil(N/60)m` | cron minimum granularity is 1 minute |
37
+
38
+ **If the interval doesn't cleanly divide its unit** (e.g. `7m` → `*/7 * * * *` gives uneven gaps at :56→:00; `90m` → 1.5h which cron can't express), pick the nearest clean interval and tell the user what you rounded to before scheduling.
39
+
40
+ **Thundering herd prevention**: For approximate requests like "hourly" or "every morning", pick a random minute (e.g., 7) instead of 0 to avoid global sync issues.
41
+
42
+ ## Action
43
+
44
+ 1. Call CronCreate with:
45
+ - `cron`: the expression from the table above
46
+ - `prompt`: the parsed prompt from above, verbatim (slash commands are passed through unchanged)
47
+ - `recurring`: `true`
48
+ 2. Briefly confirm: what's scheduled, the cron expression, the human-readable cadence, that recurring tasks auto-expire after 7 days, and that they can cancel sooner with CronDelete (include the job ID).
49
+ 3. **Then immediately execute the parsed prompt now** — don't wait for the first cron fire. If it's a slash command, invoke it via the Skill tool; otherwise act on it directly.
50
+
51
+ ## Input
52
+
53
+ $ARGUMENTS
@@ -0,0 +1,159 @@
1
+ export interface ParsedLoop {
2
+ interval: string;
3
+ prompt: string;
4
+ originalInterval?: string;
5
+ roundedTo?: string;
6
+ }
7
+
8
+ export function parseLoopInput(
9
+ input: string,
10
+ defaultInterval: string = "10m",
11
+ ): ParsedLoop {
12
+ const trimmedInput = input.trim();
13
+ if (!trimmedInput) {
14
+ return { interval: defaultInterval, prompt: "" };
15
+ }
16
+
17
+ // 1. Leading token: ^\d+[smhd]$
18
+ const tokens = trimmedInput.split(/\s+/);
19
+ if (tokens[0].match(/^\d+[smhd]$/)) {
20
+ const interval = tokens[0];
21
+ const prompt = tokens.slice(1).join(" ");
22
+ return { interval, prompt };
23
+ }
24
+
25
+ // 2. Trailing "every" clause: every <N><unit> or every <N> <unit-word>
26
+ // Units: s, m, h, d, second(s), minute(s), hour(s), day(s)
27
+ const everyRegex =
28
+ /\s+every\s+(\d+)\s*(s|m|h|d|seconds?|minutes?|hours?|days?)$/i;
29
+ const match = trimmedInput.match(everyRegex);
30
+ if (match) {
31
+ const n = match[1];
32
+ const unitWord = match[2].toLowerCase();
33
+ const unit = unitWord[0];
34
+ const interval = `${n}${unit}`;
35
+ const prompt = trimmedInput.substring(0, match.index).trim();
36
+ return { interval, prompt };
37
+ }
38
+
39
+ // 3. Default
40
+ return { interval: defaultInterval, prompt: trimmedInput };
41
+ }
42
+
43
+ const CLEAN_MINUTES = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30];
44
+ const CLEAN_HOURS = [1, 2, 3, 4, 6, 8, 12];
45
+
46
+ function getNearestClean(value: number, cleanValues: number[]): number {
47
+ let nearest = cleanValues[0];
48
+ let minDiff = Math.abs(value - nearest);
49
+ for (const clean of cleanValues) {
50
+ const diff = Math.abs(value - clean);
51
+ if (diff < minDiff) {
52
+ minDiff = diff;
53
+ nearest = clean;
54
+ } else if (diff === minDiff) {
55
+ // If equal diff, prefer the larger one? Or smaller?
56
+ // Let's prefer the larger one to be less frequent
57
+ if (clean > nearest) {
58
+ nearest = clean;
59
+ }
60
+ }
61
+ }
62
+ return nearest;
63
+ }
64
+
65
+ export function intervalToCron(interval: string): {
66
+ cron: string;
67
+ roundedTo?: string;
68
+ cadence: string;
69
+ } {
70
+ const match = interval.match(/^(\d+)([smhd])$/);
71
+ if (!match) {
72
+ throw new Error(`Invalid interval format: ${interval}`);
73
+ }
74
+
75
+ let n = parseInt(match[1], 10);
76
+ const unit = match[2];
77
+ let roundedTo: string | undefined;
78
+
79
+ if (unit === "s") {
80
+ const minutes = Math.ceil(n / 60);
81
+ const result = intervalToCron(`${minutes}m`);
82
+ return {
83
+ ...result,
84
+ roundedTo:
85
+ result.roundedTo || (minutes * 60 !== n ? `${minutes}m` : undefined),
86
+ };
87
+ }
88
+
89
+ if (unit === "m") {
90
+ if (n >= 60) {
91
+ const hours = Math.round(n / 60);
92
+ const result = intervalToCron(`${hours}h`);
93
+ return {
94
+ ...result,
95
+ roundedTo:
96
+ result.roundedTo || (hours * 60 !== n ? `${hours}h` : undefined),
97
+ };
98
+ }
99
+
100
+ if (!CLEAN_MINUTES.includes(n)) {
101
+ const nearest = getNearestClean(n, CLEAN_MINUTES);
102
+ roundedTo = `${nearest}m`;
103
+ n = nearest;
104
+ }
105
+
106
+ // For minutes, we use */N. Thundering herd is less of an issue for high frequency,
107
+ // but we could still offset it. However, the spec says "random minute for approximate requests like 'hourly'".
108
+ // So for minutes, we'll stick to */N.
109
+ return {
110
+ cron: `*/${n} * * * *`,
111
+ roundedTo,
112
+ cadence: `every ${n} minute${n > 1 ? "s" : ""}`,
113
+ };
114
+ }
115
+
116
+ if (unit === "h") {
117
+ if (n > 23) {
118
+ const days = Math.round(n / 24);
119
+ const result = intervalToCron(`${days}d`);
120
+ return {
121
+ ...result,
122
+ roundedTo:
123
+ result.roundedTo || (days * 24 !== n ? `${days}d` : undefined),
124
+ };
125
+ }
126
+
127
+ if (!CLEAN_HOURS.includes(n)) {
128
+ const nearest = getNearestClean(n, CLEAN_HOURS);
129
+ roundedTo = `${nearest}h`;
130
+ n = nearest;
131
+ }
132
+
133
+ // Thundering herd prevention: pick a random minute
134
+ const randomMinute = Math.floor(Math.random() * 60);
135
+ return {
136
+ cron: `${randomMinute} */${n} * * *`,
137
+ roundedTo,
138
+ cadence: `every ${n} hour${n > 1 ? "s" : ""}`,
139
+ };
140
+ }
141
+
142
+ if (unit === "d") {
143
+ if (![1, 2, 3, 4, 5, 6, 7, 10, 14, 30].includes(n)) {
144
+ // For days, we don't have a strict "clean" list in spec, but let's use some common ones if needed.
145
+ // Actually, cron supports any */N for days.
146
+ }
147
+
148
+ // Thundering herd prevention: pick a random minute and hour
149
+ const randomMinute = Math.floor(Math.random() * 60);
150
+ const randomHour = Math.floor(Math.random() * 24);
151
+ return {
152
+ cron: `${randomMinute} ${randomHour} */${n} * *`,
153
+ roundedTo,
154
+ cadence: `every ${n} day${n > 1 ? "s" : ""}`,
155
+ };
156
+ }
157
+
158
+ throw new Error(`Unsupported unit: ${unit}`);
159
+ }
@@ -0,0 +1,82 @@
1
+ # Wave Hooks Configuration
2
+
3
+ Hooks allow you to automate tasks when certain events occur in Wave. This document provides detailed guidance on how to configure hooks in `settings.json`.
4
+
5
+ ## Hook Events
6
+
7
+ Wave supports the following hook events:
8
+
9
+ - `PreToolUse`: Triggered before a tool is executed.
10
+ - `PostToolUse`: Triggered after a tool has finished executing.
11
+ - `UserPromptSubmit`: Triggered when a user submits a prompt.
12
+ - `PermissionRequest`: Triggered when Wave requests permission to use a tool.
13
+ - `Stop`: Triggered when Wave finishes its response cycle (no more tool calls).
14
+ - `SubagentStop`: Triggered when a subagent finishes its response cycle.
15
+ - `WorktreeCreate`: Triggered when a new worktree is created.
16
+
17
+ ## Hook Configuration Structure
18
+
19
+ Hooks are configured in the `hooks` field of `settings.json`. Each event can have multiple hook configurations.
20
+
21
+ ```json
22
+ {
23
+ "hooks": {
24
+ "PreToolUse": [
25
+ {
26
+ "matcher": "Write",
27
+ "hooks": [
28
+ {
29
+ "command": "pnpm lint",
30
+ "description": "Run lint before writing files"
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "PermissionRequest": [
36
+ {
37
+ "matcher": "Bash",
38
+ "hooks": [
39
+ {
40
+ "command": "echo \"Permission requested for Bash tool\" >> hooks.log",
41
+ "description": "Log permission requests for Bash"
42
+ }
43
+ ]
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## Hook Configuration Fields
51
+
52
+ - `matcher`: (Optional) A pattern to match against the tool name (e.g., "Write", "Read*", "/^Edit/"). Only applicable for `PreToolUse`, `PostToolUse`, and `PermissionRequest`.
53
+ - `hooks`: An array of hook commands to execute.
54
+ - `command`: The shell command to execute.
55
+ - `description`: A brief description of the hook's purpose.
56
+ - `async`: (Optional) Whether the hook should run in the background without blocking (default: `false`).
57
+ - `timeout`: (Optional) Maximum execution time in seconds (default: `600`).
58
+
59
+ ## Hook Input JSON
60
+
61
+ Wave provides detailed context to hook processes via `stdin` as a JSON object. This allows hooks to make informed decisions based on the current state.
62
+
63
+ ### Common Fields
64
+ - `session_id`: The current session ID.
65
+ - `transcript_path`: Path to the session transcript file (JSON).
66
+ - `cwd`: The current working directory.
67
+ - `hook_event_name`: The name of the triggering event.
68
+
69
+ ### Event-Specific Fields
70
+ - `tool_name`: (PreToolUse, PostToolUse, PermissionRequest) The name of the tool.
71
+ - `tool_input`: (PreToolUse, PostToolUse, PermissionRequest) The input parameters passed to the tool.
72
+ - `tool_response`: (PostToolUse) The result of the tool execution.
73
+ - `user_prompt`: (UserPromptSubmit) The text submitted by the user.
74
+ - `subagent_type`: (If executed by a subagent) The type of the subagent.
75
+ - `name`: (WorktreeCreate) The name of the new worktree.
76
+
77
+ ## Best Practices
78
+
79
+ - **Keep hooks fast**: Long-running hooks can slow down your workflow unless they are `async`.
80
+ - **Use descriptive names**: Help yourself and others understand what each hook does.
81
+ - **Test your hooks**: Run the commands manually first to ensure they work as expected.
82
+ - **Use local overrides**: For machine-specific hooks, use `.wave/settings.local.json`.
@@ -41,7 +41,7 @@ Manage tool permissions and define the "Safe Zone".
41
41
  "permissions": {
42
42
  "allow": ["Bash", "Read"],
43
43
  "deny": ["Write"],
44
- "defaultMode": "interactive",
44
+ "permissionMode": "default",
45
45
  "additionalDirectories": ["/tmp/wave-exports"]
46
46
  }
47
47
  }
@@ -0,0 +1,13 @@
1
+ export interface ParsedLoop {
2
+ interval: string;
3
+ prompt: string;
4
+ originalInterval?: string;
5
+ roundedTo?: string;
6
+ }
7
+ export declare function parseLoopInput(input: string, defaultInterval?: string): ParsedLoop;
8
+ export declare function intervalToCron(interval: string): {
9
+ cron: string;
10
+ roundedTo?: string;
11
+ cadence: string;
12
+ };
13
+ //# sourceMappingURL=parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../src/builtin-skills/loop/parsing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,eAAe,GAAE,MAAc,GAC9B,UAAU,CA8BZ;AAwBD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CA0FA"}
@@ -0,0 +1,125 @@
1
+ export function parseLoopInput(input, defaultInterval = "10m") {
2
+ const trimmedInput = input.trim();
3
+ if (!trimmedInput) {
4
+ return { interval: defaultInterval, prompt: "" };
5
+ }
6
+ // 1. Leading token: ^\d+[smhd]$
7
+ const tokens = trimmedInput.split(/\s+/);
8
+ if (tokens[0].match(/^\d+[smhd]$/)) {
9
+ const interval = tokens[0];
10
+ const prompt = tokens.slice(1).join(" ");
11
+ return { interval, prompt };
12
+ }
13
+ // 2. Trailing "every" clause: every <N><unit> or every <N> <unit-word>
14
+ // Units: s, m, h, d, second(s), minute(s), hour(s), day(s)
15
+ const everyRegex = /\s+every\s+(\d+)\s*(s|m|h|d|seconds?|minutes?|hours?|days?)$/i;
16
+ const match = trimmedInput.match(everyRegex);
17
+ if (match) {
18
+ const n = match[1];
19
+ const unitWord = match[2].toLowerCase();
20
+ const unit = unitWord[0];
21
+ const interval = `${n}${unit}`;
22
+ const prompt = trimmedInput.substring(0, match.index).trim();
23
+ return { interval, prompt };
24
+ }
25
+ // 3. Default
26
+ return { interval: defaultInterval, prompt: trimmedInput };
27
+ }
28
+ const CLEAN_MINUTES = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30];
29
+ const CLEAN_HOURS = [1, 2, 3, 4, 6, 8, 12];
30
+ function getNearestClean(value, cleanValues) {
31
+ let nearest = cleanValues[0];
32
+ let minDiff = Math.abs(value - nearest);
33
+ for (const clean of cleanValues) {
34
+ const diff = Math.abs(value - clean);
35
+ if (diff < minDiff) {
36
+ minDiff = diff;
37
+ nearest = clean;
38
+ }
39
+ else if (diff === minDiff) {
40
+ // If equal diff, prefer the larger one? Or smaller?
41
+ // Let's prefer the larger one to be less frequent
42
+ if (clean > nearest) {
43
+ nearest = clean;
44
+ }
45
+ }
46
+ }
47
+ return nearest;
48
+ }
49
+ export function intervalToCron(interval) {
50
+ const match = interval.match(/^(\d+)([smhd])$/);
51
+ if (!match) {
52
+ throw new Error(`Invalid interval format: ${interval}`);
53
+ }
54
+ let n = parseInt(match[1], 10);
55
+ const unit = match[2];
56
+ let roundedTo;
57
+ if (unit === "s") {
58
+ const minutes = Math.ceil(n / 60);
59
+ const result = intervalToCron(`${minutes}m`);
60
+ return {
61
+ ...result,
62
+ roundedTo: result.roundedTo || (minutes * 60 !== n ? `${minutes}m` : undefined),
63
+ };
64
+ }
65
+ if (unit === "m") {
66
+ if (n >= 60) {
67
+ const hours = Math.round(n / 60);
68
+ const result = intervalToCron(`${hours}h`);
69
+ return {
70
+ ...result,
71
+ roundedTo: result.roundedTo || (hours * 60 !== n ? `${hours}h` : undefined),
72
+ };
73
+ }
74
+ if (!CLEAN_MINUTES.includes(n)) {
75
+ const nearest = getNearestClean(n, CLEAN_MINUTES);
76
+ roundedTo = `${nearest}m`;
77
+ n = nearest;
78
+ }
79
+ // For minutes, we use */N. Thundering herd is less of an issue for high frequency,
80
+ // but we could still offset it. However, the spec says "random minute for approximate requests like 'hourly'".
81
+ // So for minutes, we'll stick to */N.
82
+ return {
83
+ cron: `*/${n} * * * *`,
84
+ roundedTo,
85
+ cadence: `every ${n} minute${n > 1 ? "s" : ""}`,
86
+ };
87
+ }
88
+ if (unit === "h") {
89
+ if (n > 23) {
90
+ const days = Math.round(n / 24);
91
+ const result = intervalToCron(`${days}d`);
92
+ return {
93
+ ...result,
94
+ roundedTo: result.roundedTo || (days * 24 !== n ? `${days}d` : undefined),
95
+ };
96
+ }
97
+ if (!CLEAN_HOURS.includes(n)) {
98
+ const nearest = getNearestClean(n, CLEAN_HOURS);
99
+ roundedTo = `${nearest}h`;
100
+ n = nearest;
101
+ }
102
+ // Thundering herd prevention: pick a random minute
103
+ const randomMinute = Math.floor(Math.random() * 60);
104
+ return {
105
+ cron: `${randomMinute} */${n} * * *`,
106
+ roundedTo,
107
+ cadence: `every ${n} hour${n > 1 ? "s" : ""}`,
108
+ };
109
+ }
110
+ if (unit === "d") {
111
+ if (![1, 2, 3, 4, 5, 6, 7, 10, 14, 30].includes(n)) {
112
+ // For days, we don't have a strict "clean" list in spec, but let's use some common ones if needed.
113
+ // Actually, cron supports any */N for days.
114
+ }
115
+ // Thundering herd prevention: pick a random minute and hour
116
+ const randomMinute = Math.floor(Math.random() * 60);
117
+ const randomHour = Math.floor(Math.random() * 24);
118
+ return {
119
+ cron: `${randomMinute} ${randomHour} */${n} * *`,
120
+ roundedTo,
121
+ cadence: `every ${n} day${n > 1 ? "s" : ""}`,
122
+ };
123
+ }
124
+ throw new Error(`Unsupported unit: ${unit}`);
125
+ }
@@ -15,4 +15,7 @@ export declare const TASK_GET_TOOL_NAME = "TaskGet";
15
15
  export declare const TASK_UPDATE_TOOL_NAME = "TaskUpdate";
16
16
  export declare const TASK_LIST_TOOL_NAME = "TaskList";
17
17
  export declare const WRITE_TOOL_NAME = "Write";
18
+ export declare const CRON_CREATE_TOOL_NAME = "CronCreate";
19
+ export declare const CRON_DELETE_TOOL_NAME = "CronDelete";
20
+ export declare const CRON_LIST_TOOL_NAME = "CronList";
18
21
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/constants/tools.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAC7D,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AACvD,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/constants/tools.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAC7D,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AACvD,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAClD,eAAO,MAAM,mBAAmB,aAAa,CAAC"}
@@ -15,3 +15,6 @@ export const TASK_GET_TOOL_NAME = "TaskGet";
15
15
  export const TASK_UPDATE_TOOL_NAME = "TaskUpdate";
16
16
  export const TASK_LIST_TOOL_NAME = "TaskList";
17
17
  export const WRITE_TOOL_NAME = "Write";
18
+ export const CRON_CREATE_TOOL_NAME = "CronCreate";
19
+ export const CRON_DELETE_TOOL_NAME = "CronDelete";
20
+ export const CRON_LIST_TOOL_NAME = "CronList";
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from "./core/session.js";
2
2
  export * from "./constants/tools.js";
3
3
  export * from "./agent.js";
4
4
  export * from "./core/plugin.js";
5
+ export * from "./managers/cronManager.js";
5
6
  export * from "./utils/bashParser.js";
6
7
  export * from "./utils/convertMessagesForAPI.js";
7
8
  export * from "./utils/fileSearch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ export * from "./constants/tools.js";
5
5
  // Export main agent
6
6
  export * from "./agent.js";
7
7
  export * from "./core/plugin.js";
8
+ export * from "./managers/cronManager.js";
8
9
  // Export all utilities
9
10
  export * from "./utils/bashParser.js";
10
11
  export * from "./utils/convertMessagesForAPI.js";
@@ -58,8 +58,6 @@ export declare class AIManager {
58
58
  model?: string;
59
59
  /** Rules for automatic tool approval (e.g., "Bash(git status*)") */
60
60
  allowedRules?: string[];
61
- /** List of tools available to the AI (e.g., ["Bash", "Read"]) */
62
- tools?: string[];
63
61
  maxTokens?: number;
64
62
  }): Promise<void>;
65
63
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,SAAS;IAYlB,OAAO,CAAC,SAAS;IAXZ,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,aAAa,CAAC,CAAS;gBAIrB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,gBAAgB;IAU3B,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAIxB;IAED,OAAO,KAAK,WAAW,GAItB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,gBAAgB,GAM3B;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,KAAK,oBAAoB,GAE/B;IAGM,gBAAgB,IAAI,aAAa;IAIjC,cAAc,IAAI,WAAW;IA6B7B,iBAAiB,IAAI,MAAM;IAI3B,WAAW,IAAI,MAAM,GAAG,SAAS;IAIjC,oBAAoB,IAAI,OAAO;IAItC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsBvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAsBf,8BAA8B;IAgFrC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOrD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,YAAY,GAEvB;IAEY,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oEAAoE;QACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,iEAAiE;QACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,IAAI,CAAC;IAkhBhB;;;;OAIG;YACW,gBAAgB;IAiE9B;;;OAGG;YACW,sBAAsB;IA6DpC;;OAEG;YACW,uBAAuB;CAwDtC"}
1
+ {"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,KAAK,EAGN,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,SAAS;IAYlB,OAAO,CAAC,SAAS;IAXZ,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,aAAa,CAAC,CAAS;gBAIrB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,gBAAgB;IAU3B,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAIxB;IAED,OAAO,KAAK,WAAW,GAItB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,gBAAgB,GAM3B;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,KAAK,oBAAoB,GAE/B;IAGM,gBAAgB,IAAI,aAAa;IAIjC,cAAc,IAAI,WAAW;IA6B7B,iBAAiB,IAAI,MAAM;IAI3B,WAAW,IAAI,MAAM,GAAG,SAAS;IAIjC,oBAAoB,IAAI,OAAO;IAItC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAcvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAsBf,8BAA8B;IAgFrC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOrD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,YAAY,GAEvB;IAEY,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oEAAoE;QACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,IAAI,CAAC;IA2kBhB;;;;OAIG;YACW,gBAAgB;IAiE9B;;;OAGG;YACW,sBAAsB;IA6DpC;;OAEG;YACW,uBAAuB;CAwDtC"}