specweave 1.0.355 → 1.0.356

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 (35) hide show
  1. package/dist/src/adapters/claude/adapter.d.ts +3 -4
  2. package/dist/src/adapters/claude/adapter.d.ts.map +1 -1
  3. package/dist/src/adapters/claude/adapter.js +3 -4
  4. package/dist/src/adapters/claude/adapter.js.map +1 -1
  5. package/dist/src/cli/commands/refresh-plugins.d.ts +3 -2
  6. package/dist/src/cli/commands/refresh-plugins.d.ts.map +1 -1
  7. package/dist/src/cli/commands/refresh-plugins.js +3 -8
  8. package/dist/src/cli/commands/refresh-plugins.js.map +1 -1
  9. package/dist/src/cli/commands/update.d.ts.map +1 -1
  10. package/dist/src/cli/commands/update.js +35 -4
  11. package/dist/src/cli/commands/update.js.map +1 -1
  12. package/dist/src/core/doctor/checkers/installation-health-checker.d.ts +14 -15
  13. package/dist/src/core/doctor/checkers/installation-health-checker.d.ts.map +1 -1
  14. package/dist/src/core/doctor/checkers/installation-health-checker.js +78 -148
  15. package/dist/src/core/doctor/checkers/installation-health-checker.js.map +1 -1
  16. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts +2 -2
  17. package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts.map +1 -1
  18. package/dist/src/core/lazy-loading/llm-plugin-detector.js +31 -15
  19. package/dist/src/core/lazy-loading/llm-plugin-detector.js.map +1 -1
  20. package/dist/src/utils/plugin-copier.d.ts +28 -47
  21. package/dist/src/utils/plugin-copier.d.ts.map +1 -1
  22. package/dist/src/utils/plugin-copier.js +85 -155
  23. package/dist/src/utils/plugin-copier.js.map +1 -1
  24. package/package.json +1 -1
  25. package/plugins/specweave/hooks/stop-auto-v5.sh +26 -17
  26. package/plugins/specweave/skills/auto/SKILL.md +15 -1
  27. package/plugins/specweave/skills/do/SKILL.md +3 -3
  28. package/plugins/specweave/skills/increment/SKILL.md +3 -3
  29. package/plugins/specweave/skills/team-build/SKILL.md +1 -1
  30. package/plugins/specweave/skills/team-lead/SKILL.md +7 -5
  31. package/plugins/specweave/skills/validate/SKILL.md +1 -1
  32. package/dist/src/utils/claude-plugin-cli.d.ts +0 -32
  33. package/dist/src/utils/claude-plugin-cli.d.ts.map +0 -1
  34. package/dist/src/utils/claude-plugin-cli.js +0 -74
  35. package/dist/src/utils/claude-plugin-cli.js.map +0 -1
@@ -155,8 +155,9 @@ if [ -f "$DEDUP_PREV" ]; then
155
155
  fi
156
156
  echo "$NOW" > "$DEDUP_PREV" 2>/dev/null
157
157
 
158
- # 7. Read userGoal from session marker
158
+ # 7. Read userGoal and simple mode from session marker
159
159
  USER_GOAL=$(jq -r '.userGoal // ""' "$SESSION" 2>/dev/null || echo "")
160
+ SIMPLE=$(jq -r '.simple // false' "$SESSION" 2>/dev/null || echo "false")
160
161
 
161
162
  # 8. Scan active increments (enriched: next task, progress fraction)
162
163
  TP=0; TAC=0; IC=0; ILIST=""
@@ -212,7 +213,7 @@ if [ "$IC" -eq 0 ]; then
212
213
  fi
213
214
  fi
214
215
 
215
- # 10. Work remains → block with enriched context message
216
+ # 10. Work remains → block with context message (simple or enriched)
216
217
  # Sort entries by score descending (highest-relevance first) when userGoal is set
217
218
  SORTED_ILIST="$ILIST"
218
219
  if [ -n "$USER_GOAL" ] && [ "$IC" -gt 1 ]; then
@@ -221,24 +222,32 @@ if [ -n "$USER_GOAL" ] && [ "$IC" -gt 1 ]; then
221
222
  SORTED_ILIST="${SORTED_ILIST%,}" # trim trailing comma
222
223
  fi
223
224
 
224
- DETAILS=""
225
+ # Extract best increment ID (first entry after sorting)
225
226
  _BEST_ID=""
226
227
  IFS=',' read -ra ENTRIES <<< "$SORTED_ILIST"
227
- for entry in "${ENTRIES[@]}"; do
228
- IFS='|' read -r eid ep ea enext edone etotal escore <<< "$entry"
229
- [ -z "$_BEST_ID" ] && _BEST_ID="$eid"
230
- _progress="${edone:-0}/${etotal:-0} tasks"
231
- _next_info=""
232
- [ -n "$enext" ] && _next_info=" | Next: $enext"
233
- DETAILS="${DETAILS}\n ▸ ${eid}: ${_progress}${_next_info}"
234
- done
228
+ IFS='|' read -r _BEST_ID _rest <<< "${ENTRIES[0]}"
235
229
 
236
- # Build enriched block message
237
- BMSG=""
238
- [ -n "$USER_GOAL" ] && BMSG="Goal: ${USER_GOAL}\n"
239
- BMSG="${BMSG}Auto Mode: ${IC} increment(s) need work${DETAILS}"
240
- BMSG="${BMSG}\nTurn $TURN/$MAX_TURNS | Continue: /sw:do ${_BEST_ID}"
241
- BMSG=$(echo -e "$BMSG")
230
+ if [ "$SIMPLE" = "true" ]; then
231
+ # Simple mode: minimal message to reduce context tokens per turn
232
+ BMSG="Continue: /sw:do ${_BEST_ID} ($TP tasks left, turn $TURN/$MAX_TURNS)"
233
+ BMSG=$(echo -e "$BMSG")
234
+ else
235
+ # Full mode: enriched context with per-increment progress and next task
236
+ DETAILS=""
237
+ for entry in "${ENTRIES[@]}"; do
238
+ IFS='|' read -r eid ep ea enext edone etotal escore <<< "$entry"
239
+ _progress="${edone:-0}/${etotal:-0} tasks"
240
+ _next_info=""
241
+ [ -n "$enext" ] && _next_info=" | Next: $enext"
242
+ DETAILS="${DETAILS}\n ▸ ${eid}: ${_progress}${_next_info}"
243
+ done
244
+
245
+ BMSG=""
246
+ [ -n "$USER_GOAL" ] && BMSG="Goal: ${USER_GOAL}\n"
247
+ BMSG="${BMSG}Auto Mode: ${IC} increment(s) need work${DETAILS}"
248
+ BMSG="${BMSG}\nTurn $TURN/$MAX_TURNS | Continue: /sw:do ${_BEST_ID}"
249
+ BMSG=$(echo -e "$BMSG")
250
+ fi
242
251
 
243
252
  block "Work remaining: $TP tasks, $TAC ACs" "work_remaining" \
244
253
  "$(jq -n --argjson p "$TP" --argjson a "$TAC" --argjson i "$IC" \
@@ -44,6 +44,18 @@ argument-hint: "[INCREMENT_IDS...] [OPTIONS]"
44
44
  | `--cov <n>` | Code coverage threshold (%) | 80 |
45
45
  | `--cmd "<command>"` | Custom command must pass | None |
46
46
 
47
+ ## Simple Mode (`--simple`)
48
+
49
+ When `simple: true` is set in the session marker, reduce context consumption per iteration:
50
+
51
+ 1. **Skip spec re-reads** — Do NOT re-read `spec.md` on each task iteration. Read it once at session start, then rely on `tasks.md` alone for task-by-task execution.
52
+ 2. **Minimal task context** — Read only the current task's section from `tasks.md`, not the entire file. Use line offsets if the file is long.
53
+ 3. **No sub-skill loading** — Do NOT invoke domain skills (frontend:architect, testing:qa, etc.) during auto execution. Execute tasks directly using code tools.
54
+ 4. **Shorter status output** — Skip banners and progress tables between tasks. Just implement, test, mark complete, move on.
55
+ 5. **No complexity re-check** — Skip Step 1.5a (team-lead routing check) since the caller already decided the execution mode.
56
+
57
+ **When to use**: Primarily for sub-agents in team-lead mode where the team-lead has already loaded specs, assigned tasks, and the agent just needs to execute. Also useful for simple increments with <10 tasks.
58
+
47
59
  ## Core Loop
48
60
 
49
61
  ```
@@ -73,6 +85,7 @@ Use Read/Write/Edit/Glob tools directly (no CLI needed):
73
85
  "active": true,
74
86
  "timestamp": "<ISO>",
75
87
  "incrementIds": ["0001-feature"],
88
+ "simple": false,
76
89
  "tddMode": false,
77
90
  "requireTests": false,
78
91
  "userGoal": null,
@@ -84,7 +97,8 @@ Use Read/Write/Edit/Glob tools directly (no CLI needed):
84
97
  }
85
98
  ```
86
99
 
87
- Map flags to extra `successCriteria` entries:
100
+ Map flags to session marker fields:
101
+ - `--simple` -> set `"simple": true`
88
102
  - `--tests` -> `{ "type": "tests_pass", "required": true }`
89
103
  - `--build` -> `{ "type": "build_succeeds", "required": true }`
90
104
  - `--e2e` -> `{ "type": "tests_pass", "description": "E2E tests", "required": true }`
@@ -6,11 +6,11 @@ hooks:
6
6
  - matcher: Edit
7
7
  hooks:
8
8
  - type: command
9
- command: bash plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh
9
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/task-ac-sync-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
10
10
  - matcher: Write
11
11
  hooks:
12
12
  - type: command
13
- command: bash plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh
13
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/task-ac-sync-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
14
14
  ---
15
15
 
16
16
  # Do Increment
@@ -69,7 +69,7 @@ This ensures the execution loop stays focused on the contextually correct increm
69
69
  5. **Task count validation**: If >25 tasks, warn and offer to split, phase, or use `/sw:auto`/`/sw:team-lead`
70
70
  6. **Validate AC presence** (MANDATORY):
71
71
  ```bash
72
- bash plugins/specweave/hooks/pre-increment-start.sh <increment-path>
72
+ bash "${CLAUDE_PLUGIN_ROOT}/hooks/pre-increment-start.sh" <increment-path>
73
73
  ```
74
74
  If fails: manually add ACs to spec.md, then retry. Do NOT proceed without ACs in spec.md.
75
75
 
@@ -7,14 +7,14 @@ hooks:
7
7
  - matcher: Write
8
8
  hooks:
9
9
  - type: command
10
- command: bash plugins/specweave/hooks/v2/guards/interview-enforcement-guard.sh
10
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/interview-enforcement-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
11
11
  - type: command
12
- command: bash plugins/specweave/hooks/v2/guards/spec-template-enforcement-guard.sh
12
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/spec-template-enforcement-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
13
13
  PostToolUse:
14
14
  - matcher: Write
15
15
  hooks:
16
16
  - type: command
17
- command: bash plugins/specweave/hooks/v2/guards/increment-duplicate-guard.sh
17
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/increment-duplicate-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
18
18
  ---
19
19
 
20
20
  # Plan Product Increment
@@ -5,7 +5,7 @@ hooks:
5
5
  - matcher: TeamCreate
6
6
  hooks:
7
7
  - type: command
8
- command: bash plugins/specweave/hooks/v2/guards/increment-existence-guard.sh
8
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/increment-existence-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
9
9
  ---
10
10
 
11
11
  # Team Build
@@ -5,7 +5,7 @@ hooks:
5
5
  - matcher: TeamCreate
6
6
  hooks:
7
7
  - type: command
8
- command: bash plugins/specweave/hooks/v2/guards/increment-existence-guard.sh
8
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/increment-existence-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"allow\"}")'
9
9
  ---
10
10
 
11
11
  # Team Lead
@@ -439,7 +439,7 @@ SendMessage({
439
439
  SendMessage({
440
440
  type: "message",
441
441
  recipient: "team-lead",
442
- content: "COMPLETION: All 8 tasks done. Tests passing (24/24). /sw:grill passed. Frontend increment ready for merge.",
442
+ content: "COMPLETION: All 8 tasks done. Tests passing (24/24). Ready for team-lead closure.",
443
443
  summary: "Frontend agent completed all tasks"
444
444
  });
445
445
  ```
@@ -563,12 +563,14 @@ Orchestrator Final Check:
563
563
 
564
564
  Agents can get stuck in extended thinking if their context overflows. The team-lead MUST monitor for stuck agents.
565
565
 
566
- ### Timeout Rules
566
+ ### Stuck Detection Rules
567
+
568
+ **Note**: Claude Code has no built-in timers. These are best-effort heuristics applied when the team-lead regains control (e.g., after processing other agent messages).
567
569
 
568
570
  | Condition | Action |
569
571
  |-----------|--------|
570
- | Agent idle >20 min after last message | Send `STATUS_CHECK` message to agent |
571
- | No response to STATUS_CHECK within 5 min | Declare agent stuck |
572
+ | Agent has not messaged since team-lead's last turn | Send `STATUS_CHECK` message to agent |
573
+ | Agent does not respond to STATUS_CHECK on next team-lead turn | Declare agent stuck |
572
574
  | Agent stuck | Log warning, proceed with other agents, handle stuck agent's increment manually in team-merge |
573
575
  | All agents stuck | STOP team, report to user |
574
576
 
@@ -5,7 +5,7 @@ hooks:
5
5
  Stop:
6
6
  - hooks:
7
7
  - type: command
8
- command: bash plugins/specweave/hooks/v2/guards/spec-validation-guard.sh
8
+ command: bash -c 'W="${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh"; S="${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/spec-validation-guard.sh"; [[ -x "$W" ]] && exec "$W" "$S" || (cat >/dev/null && printf "{\"decision\":\"approve\"}")'
9
9
  ---
10
10
 
11
11
  # Validate Increment
@@ -1,32 +0,0 @@
1
- /**
2
- * Claude Code Plugin CLI Integration
3
- *
4
- * Registers SpecWeave plugins with Claude Code's plugin system via the
5
- * `claude` CLI binary. This makes plugins appear in the `/plugin Installed`
6
- * UI alongside marketplace metadata.
7
- *
8
- * All operations are non-fatal — failures are logged (in DEBUG mode) but
9
- * never block the primary plugin installation to ~/.claude/commands/.
10
- *
11
- * @since 1.0.290
12
- */
13
- export interface CliRegistrationResult {
14
- /** True if marketplace was registered successfully */
15
- marketplaceRegistered: boolean;
16
- /** Plugin names that were successfully installed via CLI */
17
- installedPlugins: string[];
18
- /** Plugin names that failed CLI installation */
19
- failedPlugins: string[];
20
- }
21
- /**
22
- * Register SpecWeave marketplace and install plugins via Claude CLI.
23
- *
24
- * Steps:
25
- * 1. Validates specweaveRoot contains .claude-plugin/marketplace.json
26
- * 2. Runs `claude plugin marketplace add <specweaveRoot>`
27
- * 3. Runs `claude plugin install <name>@specweave` for each plugin
28
- *
29
- * Entirely non-fatal. Returns a result with success/failure per plugin.
30
- */
31
- export declare function registerPluginsWithClaudeCli(specweaveRoot: string, pluginNames: string[]): CliRegistrationResult;
32
- //# sourceMappingURL=claude-plugin-cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-plugin-cli.d.ts","sourceRoot":"","sources":["../../../src/utils/claude-plugin-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,qBAAqB,EAAE,OAAO,CAAC;IAC/B,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gDAAgD;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,qBAAqB,CA6CvB"}
@@ -1,74 +0,0 @@
1
- /**
2
- * Claude Code Plugin CLI Integration
3
- *
4
- * Registers SpecWeave plugins with Claude Code's plugin system via the
5
- * `claude` CLI binary. This makes plugins appear in the `/plugin Installed`
6
- * UI alongside marketplace metadata.
7
- *
8
- * All operations are non-fatal — failures are logged (in DEBUG mode) but
9
- * never block the primary plugin installation to ~/.claude/commands/.
10
- *
11
- * @since 1.0.290
12
- */
13
- import { existsSync } from 'node:fs';
14
- import { join } from 'node:path';
15
- import { execFileNoThrowSync } from './execFileNoThrow.js';
16
- import { getPluginScope, getScopeArgs } from '../core/types/plugin-scope.js';
17
- // ---------------------------------------------------------------------------
18
- // Core
19
- // ---------------------------------------------------------------------------
20
- /**
21
- * Register SpecWeave marketplace and install plugins via Claude CLI.
22
- *
23
- * Steps:
24
- * 1. Validates specweaveRoot contains .claude-plugin/marketplace.json
25
- * 2. Runs `claude plugin marketplace add <specweaveRoot>`
26
- * 3. Runs `claude plugin install <name>@specweave` for each plugin
27
- *
28
- * Entirely non-fatal. Returns a result with success/failure per plugin.
29
- */
30
- export function registerPluginsWithClaudeCli(specweaveRoot, pluginNames) {
31
- const result = {
32
- marketplaceRegistered: false,
33
- installedPlugins: [],
34
- failedPlugins: [],
35
- };
36
- if (pluginNames.length === 0)
37
- return result;
38
- // Validate marketplace exists at path
39
- const marketplacePath = join(specweaveRoot, '.claude-plugin', 'marketplace.json');
40
- if (!existsSync(marketplacePath)) {
41
- if (process.env.DEBUG) {
42
- console.warn(`[DEBUG] Skipping Claude CLI registration: no marketplace.json at ${marketplacePath}`);
43
- }
44
- return result;
45
- }
46
- // Register marketplace
47
- const addResult = execFileNoThrowSync('claude', ['plugin', 'marketplace', 'add', specweaveRoot]);
48
- if (addResult.success || addResult.exitCode === 0) {
49
- result.marketplaceRegistered = true;
50
- }
51
- else {
52
- if (process.env.DEBUG) {
53
- console.warn(`[DEBUG] claude plugin marketplace add failed (exit ${addResult.exitCode}): ${addResult.stderr}`);
54
- }
55
- // Don't bail — install may still work if marketplace was already registered
56
- }
57
- // Install each plugin with correct scope
58
- for (const name of pluginNames) {
59
- const scope = getPluginScope(name, 'specweave');
60
- const scopeArgs = getScopeArgs(scope);
61
- const installResult = execFileNoThrowSync('claude', ['plugin', 'install', `${name}@specweave`, ...scopeArgs]);
62
- if (installResult.success || installResult.exitCode === 0) {
63
- result.installedPlugins.push(name);
64
- }
65
- else {
66
- result.failedPlugins.push(name);
67
- if (process.env.DEBUG) {
68
- console.warn(`[DEBUG] claude plugin install ${name}@specweave failed (exit ${installResult.exitCode}): ${installResult.stderr}`);
69
- }
70
- }
71
- }
72
- return result;
73
- }
74
- //# sourceMappingURL=claude-plugin-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-plugin-cli.js","sourceRoot":"","sources":["../../../src/utils/claude-plugin-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAe7E,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,aAAqB,EACrB,WAAqB;IAErB,MAAM,MAAM,GAA0B;QACpC,qBAAqB,EAAE,KAAK;QAC5B,gBAAgB,EAAE,EAAE;QACpB,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE5C,sCAAsC;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,oEAAoE,eAAe,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IACjG,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,sDAAsD,SAAS,CAAC,QAAQ,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,4EAA4E;IAC9E,CAAC;IAED,yCAAyC;IACzC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;QAC9G,IAAI,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,2BAA2B,aAAa,CAAC,QAAQ,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YACnI,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}