oh-my-claude-sisyphus 3.8.16 → 3.9.1
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/agents/analyst.md +41 -0
- package/agents/architect.md +47 -2
- package/agents/critic.md +42 -0
- package/agents/deep-executor.md +193 -0
- package/agents/planner.md +82 -0
- package/bridge/mcp-server.cjs +181 -181
- package/commands/build-fix.md +3 -3
- package/commands/ralph.md +3 -3
- package/commands/ultraqa.md +4 -4
- package/commands/ultrawork.md +3 -3
- package/dist/__tests__/agent-registry.test.js +1 -1
- package/dist/__tests__/installer.test.js +8 -8
- package/dist/__tests__/installer.test.js.map +1 -1
- package/dist/__tests__/omc-tools-server.test.js +2 -2
- package/dist/__tests__/omc-tools-server.test.js.map +1 -1
- package/dist/__tests__/skills.test.js +5 -4
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/deep-executor.d.ts +15 -0
- package/dist/agents/deep-executor.d.ts.map +1 -0
- package/dist/agents/deep-executor.js +47 -0
- package/dist/agents/deep-executor.js.map +1 -0
- package/dist/agents/definitions.d.ts +16 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +26 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/doctor-conflicts.d.ts +55 -0
- package/dist/cli/commands/doctor-conflicts.d.ts.map +1 -0
- package/dist/cli/commands/doctor-conflicts.js +261 -0
- package/dist/cli/commands/doctor-conflicts.js.map +1 -0
- package/dist/cli/index.js +16 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/features/auto-update.d.ts +12 -0
- package/dist/features/auto-update.d.ts.map +1 -1
- package/dist/features/auto-update.js +4 -1
- package/dist/features/auto-update.js.map +1 -1
- package/dist/features/background-tasks.js +4 -4
- package/dist/features/context-injector/types.d.ts +1 -1
- package/dist/features/context-injector/types.d.ts.map +1 -1
- package/dist/features/task-decomposer/index.js +3 -3
- package/dist/features/task-decomposer/index.js.map +1 -1
- package/dist/features/verification/index.d.ts +3 -3
- package/dist/features/verification/index.js +3 -3
- package/dist/features/verification/index.js.map +1 -1
- package/dist/hooks/__tests__/bridge.test.d.ts +2 -0
- package/dist/hooks/__tests__/bridge.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/bridge.test.js +199 -0
- package/dist/hooks/__tests__/bridge.test.js.map +1 -0
- package/dist/hooks/autopilot/state.js +3 -3
- package/dist/hooks/beads-context/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/beads-context/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/beads-context/__tests__/index.test.js +150 -0
- package/dist/hooks/beads-context/__tests__/index.test.js.map +1 -0
- package/dist/hooks/beads-context/constants.d.ts +3 -0
- package/dist/hooks/beads-context/constants.d.ts.map +1 -0
- package/dist/hooks/beads-context/constants.js +35 -0
- package/dist/hooks/beads-context/constants.js.map +1 -0
- package/dist/hooks/beads-context/index.d.ts +21 -0
- package/dist/hooks/beads-context/index.d.ts.map +1 -0
- package/dist/hooks/beads-context/index.js +62 -0
- package/dist/hooks/beads-context/index.js.map +1 -0
- package/dist/hooks/beads-context/types.d.ts +7 -0
- package/dist/hooks/beads-context/types.d.ts.map +1 -0
- package/dist/hooks/beads-context/types.js +2 -0
- package/dist/hooks/beads-context/types.js.map +1 -0
- package/dist/hooks/bridge.d.ts +4 -0
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +76 -23
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/clear-suggestions/constants.d.ts +54 -0
- package/dist/hooks/clear-suggestions/constants.d.ts.map +1 -0
- package/dist/hooks/clear-suggestions/constants.js +102 -0
- package/dist/hooks/clear-suggestions/constants.js.map +1 -0
- package/dist/hooks/clear-suggestions/index.d.ts +61 -0
- package/dist/hooks/clear-suggestions/index.d.ts.map +1 -0
- package/dist/hooks/clear-suggestions/index.js +282 -0
- package/dist/hooks/clear-suggestions/index.js.map +1 -0
- package/dist/hooks/clear-suggestions/triggers.d.ts +65 -0
- package/dist/hooks/clear-suggestions/triggers.d.ts.map +1 -0
- package/dist/hooks/clear-suggestions/triggers.js +222 -0
- package/dist/hooks/clear-suggestions/triggers.js.map +1 -0
- package/dist/hooks/clear-suggestions/types.d.ts +92 -0
- package/dist/hooks/clear-suggestions/types.d.ts.map +1 -0
- package/dist/hooks/clear-suggestions/types.js +9 -0
- package/dist/hooks/clear-suggestions/types.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/permission-handler/index.d.ts.map +1 -1
- package/dist/hooks/permission-handler/index.js +3 -1
- package/dist/hooks/permission-handler/index.js.map +1 -1
- package/dist/hooks/setup/index.d.ts.map +1 -1
- package/dist/hooks/setup/index.js +12 -5
- package/dist/hooks/setup/index.js.map +1 -1
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
- package/dist/hooks/subagent-tracker/index.js +25 -9
- package/dist/hooks/subagent-tracker/index.js.map +1 -1
- package/dist/hooks/ultraqa/index.js +4 -4
- package/dist/hooks/ultraqa/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/__tests__/claude-md-merge.test.d.ts +6 -0
- package/dist/installer/__tests__/claude-md-merge.test.d.ts.map +1 -0
- package/dist/installer/__tests__/claude-md-merge.test.js +220 -0
- package/dist/installer/__tests__/claude-md-merge.test.js.map +1 -0
- package/dist/installer/__tests__/safe-installer.test.d.ts +6 -0
- package/dist/installer/__tests__/safe-installer.test.d.ts.map +1 -0
- package/dist/installer/__tests__/safe-installer.test.js +172 -0
- package/dist/installer/__tests__/safe-installer.test.js.map +1 -0
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +3 -1
- package/dist/installer/hooks.js.map +1 -1
- package/dist/installer/index.d.ts +27 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +209 -85
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/omc-tools-server.d.ts +1 -1
- package/dist/mcp/omc-tools-server.d.ts.map +1 -1
- package/dist/mcp/omc-tools-server.js +3 -3
- package/dist/mcp/omc-tools-server.js.map +1 -1
- package/dist/mcp/standalone-server.js +1 -1
- package/dist/mcp/standalone-server.js.map +1 -1
- package/dist/verification/tier-selector.d.ts +40 -0
- package/dist/verification/tier-selector.d.ts.map +1 -0
- package/dist/verification/tier-selector.js +95 -0
- package/dist/verification/tier-selector.js.map +1 -0
- package/dist/verification/tier-selector.test.d.ts +2 -0
- package/dist/verification/tier-selector.test.d.ts.map +1 -0
- package/dist/verification/tier-selector.test.js +282 -0
- package/dist/verification/tier-selector.test.js.map +1 -0
- package/docs/AGENTS.md +1 -1
- package/docs/CLAUDE.md +90 -378
- package/docs/partials/agent-tiers.md +165 -0
- package/docs/partials/features.md +131 -0
- package/docs/partials/mode-hierarchy.md +120 -0
- package/docs/partials/mode-selection-guide.md +82 -0
- package/docs/partials/verification-tiers.md +107 -0
- package/docs/shared/agent-tiers.md +165 -0
- package/docs/shared/features.md +131 -0
- package/docs/shared/mode-hierarchy.md +120 -0
- package/docs/shared/mode-selection-guide.md +82 -0
- package/docs/shared/verification-tiers.md +107 -0
- package/package.json +4 -3
- package/scripts/compose-docs.mjs +44 -0
- package/scripts/keyword-detector.mjs +13 -3
- package/skills/build-fix/SKILL.md +8 -8
- package/skills/deep-executor/SKILL.md +50 -0
- package/skills/deepinit/SKILL.md +2 -2
- package/skills/ecomode/SKILL.md +58 -103
- package/skills/omc-setup/SKILL.md +197 -20
- package/skills/plan/SKILL.md +62 -0
- package/skills/project-session-manager/SKILL.md +87 -4
- package/skills/project-session-manager/lib/config.sh +54 -5
- package/skills/project-session-manager/lib/parse.sh +65 -11
- package/skills/project-session-manager/lib/providers/github.sh +52 -0
- package/skills/project-session-manager/lib/providers/interface.sh +76 -0
- package/skills/project-session-manager/lib/providers/jira.sh +79 -0
- package/skills/project-session-manager/lib/session.sh +49 -12
- package/skills/project-session-manager/lib/worktree.sh +37 -4
- package/skills/project-session-manager/psm.sh +116 -51
- package/skills/ralph/SKILL.md +44 -30
- package/skills/tdd/SKILL.md +2 -2
- package/skills/ultrapilot/SKILL.md +3 -3
- package/skills/ultraqa/SKILL.md +4 -4
- package/skills/ultrawork/SKILL.md +59 -69
- package/templates/hooks/keyword-detector.mjs +21 -13
- package/templates/hooks/lib/stdin.mjs +62 -0
- package/templates/hooks/persistent-mode.mjs +7 -8
- package/templates/hooks/post-tool-use.mjs +8 -10
- package/templates/hooks/pre-tool-use.mjs +9 -6
- package/templates/hooks/session-start.mjs +7 -8
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clear Suggestions Constants
|
|
3
|
+
*
|
|
4
|
+
* Messages, thresholds, and configuration defaults for the
|
|
5
|
+
* adaptive /clear suggestions system.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cooldown period between clear suggestions (5 minutes)
|
|
9
|
+
*/
|
|
10
|
+
export const CLEAR_SUGGESTION_COOLDOWN_MS = 5 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum suggestions per session
|
|
13
|
+
*/
|
|
14
|
+
export const MAX_CLEAR_SUGGESTIONS = 2;
|
|
15
|
+
/**
|
|
16
|
+
* Context usage threshold to trigger context+artifacts suggestion (50%)
|
|
17
|
+
*/
|
|
18
|
+
export const CONTEXT_THRESHOLD = 0.50;
|
|
19
|
+
/**
|
|
20
|
+
* Consecutive failure count for degradation signal
|
|
21
|
+
*/
|
|
22
|
+
export const FAILURE_THRESHOLD = 3;
|
|
23
|
+
/**
|
|
24
|
+
* Failure window - only count failures within this window (10 minutes)
|
|
25
|
+
*/
|
|
26
|
+
export const FAILURE_WINDOW_MS = 10 * 60 * 1000;
|
|
27
|
+
/**
|
|
28
|
+
* Message for workflow completion trigger
|
|
29
|
+
*/
|
|
30
|
+
export const WORKFLOW_COMPLETE_MESSAGE = (modeName, artifacts) => `SESSION RESET SUGGESTION
|
|
31
|
+
|
|
32
|
+
The **${modeName}** workflow has completed successfully. Starting fresh with /clear would give you:
|
|
33
|
+
- A clean context window for your next task
|
|
34
|
+
- Faster, more reliable responses
|
|
35
|
+
- No stale context from the completed workflow
|
|
36
|
+
|
|
37
|
+
${artifacts}
|
|
38
|
+
Type **/clear** to start fresh, or continue working in this session.
|
|
39
|
+
`;
|
|
40
|
+
/**
|
|
41
|
+
* Message for architect verification trigger
|
|
42
|
+
*/
|
|
43
|
+
export const ARCHITECT_VERIFIED_MESSAGE = (artifacts) => `SESSION RESET SUGGESTION
|
|
44
|
+
|
|
45
|
+
Architect verification has **passed** - your work is approved. This is an ideal moment to reset:
|
|
46
|
+
- The verification cycle consumed significant context
|
|
47
|
+
- Your completed work is saved in project files
|
|
48
|
+
- A fresh session will be more responsive for the next task
|
|
49
|
+
|
|
50
|
+
${artifacts}
|
|
51
|
+
Type **/clear** to start fresh, or continue working in this session.
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* Message for planning complete trigger
|
|
55
|
+
*/
|
|
56
|
+
export const PLANNING_COMPLETE_MESSAGE = (artifacts) => `SESSION RESET SUGGESTION
|
|
57
|
+
|
|
58
|
+
Planning is **complete** and your plan has been saved to disk. Consider resetting:
|
|
59
|
+
- The planning interview used substantial context
|
|
60
|
+
- Your plan files are preserved and will be auto-loaded
|
|
61
|
+
- Execution will be more reliable in a fresh session
|
|
62
|
+
|
|
63
|
+
${artifacts}
|
|
64
|
+
Type **/clear** to start fresh, or continue working in this session.
|
|
65
|
+
`;
|
|
66
|
+
/**
|
|
67
|
+
* Message for context+artifacts trigger
|
|
68
|
+
*/
|
|
69
|
+
export const CONTEXT_ARTIFACTS_MESSAGE = (usagePct, artifacts) => `SESSION RESET SUGGESTION
|
|
70
|
+
|
|
71
|
+
Context usage is at **${usagePct}%** but your progress is safely preserved in project files. Consider resetting:
|
|
72
|
+
- High context usage can cause degraded performance
|
|
73
|
+
- /clear reloads your CLAUDE.md and project context automatically
|
|
74
|
+
- Your artifacts will be available in the new session
|
|
75
|
+
|
|
76
|
+
${artifacts}
|
|
77
|
+
Type **/clear** to start fresh, or use **/compact** if you want to continue this session.
|
|
78
|
+
`;
|
|
79
|
+
/**
|
|
80
|
+
* Message for degradation signals trigger
|
|
81
|
+
*/
|
|
82
|
+
export const DEGRADATION_SIGNALS_MESSAGE = (failureCount, artifacts) => `SESSION RESET SUGGESTION
|
|
83
|
+
|
|
84
|
+
Detected **${failureCount} consecutive failures** which may indicate context degradation. A fresh start could help:
|
|
85
|
+
- Accumulated context can cause tool call failures
|
|
86
|
+
- /clear gives you a clean slate while preserving all files
|
|
87
|
+
- Your work is saved on disk and will not be lost
|
|
88
|
+
|
|
89
|
+
${artifacts}
|
|
90
|
+
Type **/clear** to start fresh, or continue troubleshooting in this session.
|
|
91
|
+
`;
|
|
92
|
+
/**
|
|
93
|
+
* Format preserved artifacts into a readable list
|
|
94
|
+
*/
|
|
95
|
+
export function formatPreservedArtifacts(artifacts) {
|
|
96
|
+
if (artifacts.length === 0) {
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
const lines = artifacts.map(a => ` - ${a.description}`);
|
|
100
|
+
return `**Preserved artifacts** (available after /clear):\n${lines.join('\n')}\n`;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAU,EAAE,CACvF;;QAEM,QAAQ;;;;;EAKd,SAAS;;CAEV,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,SAAiB,EAAU,EAAE,CACtE;;;;;;;EAOA,SAAS;;CAEV,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAiB,EAAU,EAAE,CACrE;;;;;;;EAOA,SAAS;;CAEV,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAU,EAAE,CACvF;;wBAEsB,QAAQ;;;;;EAK9B,SAAS;;CAEV,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,YAAoB,EAAE,SAAiB,EAAU,EAAE,CAC7F;;aAEW,YAAY;;;;;EAKvB,SAAS;;CAEV,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAuD;IAEvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,OAAO,sDAAsD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clear Suggestions Hook
|
|
3
|
+
*
|
|
4
|
+
* Adaptive /clear suggestions system that intelligently recommends session
|
|
5
|
+
* resets when it would improve reliability and performance.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - 5 semantic triggers for context-aware suggestions
|
|
9
|
+
* - 5-minute cooldown between suggestions
|
|
10
|
+
* - Maximum 2 suggestions per session
|
|
11
|
+
* - Non-intrusive messaging explaining WHY clearing helps
|
|
12
|
+
* - Lists preserved artifacts (plans, notes, decisions)
|
|
13
|
+
*
|
|
14
|
+
* Complements (doesn't replace) existing /compact suggestions.
|
|
15
|
+
*/
|
|
16
|
+
import type { ClearSuggestionState, ClearSuggestionConfig, ClearSuggestionResult, ClearSuggestionInput } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Main check function - evaluates all triggers and returns suggestion if appropriate
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkClearSuggestion(input: ClearSuggestionInput, config?: ClearSuggestionConfig): ClearSuggestionResult;
|
|
21
|
+
/**
|
|
22
|
+
* Mark planning as just completed (called by plan/ralplan skills)
|
|
23
|
+
*/
|
|
24
|
+
export declare function markPlanningComplete(sessionId: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Reset session state (called on /clear)
|
|
27
|
+
*/
|
|
28
|
+
export declare function resetClearSuggestionState(sessionId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get current session stats (for debugging)
|
|
31
|
+
*/
|
|
32
|
+
export declare function getClearSuggestionStats(sessionId: string): ClearSuggestionState | null;
|
|
33
|
+
/**
|
|
34
|
+
* Clean up stale sessions (older than 30 minutes)
|
|
35
|
+
*/
|
|
36
|
+
export declare function cleanupStaleSessions(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Create a clear suggestion hook instance
|
|
39
|
+
*/
|
|
40
|
+
export declare function createClearSuggestionHook(config?: ClearSuggestionConfig): {
|
|
41
|
+
/**
|
|
42
|
+
* PostToolUse - Check if we should suggest /clear
|
|
43
|
+
*/
|
|
44
|
+
postToolUse: (input: {
|
|
45
|
+
tool_name: string;
|
|
46
|
+
session_id: string;
|
|
47
|
+
directory: string;
|
|
48
|
+
tool_response?: string;
|
|
49
|
+
context_usage_ratio?: number;
|
|
50
|
+
}) => string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Stop event - Reset failure tracking
|
|
53
|
+
*/
|
|
54
|
+
stop: (input: {
|
|
55
|
+
session_id: string;
|
|
56
|
+
}) => void;
|
|
57
|
+
};
|
|
58
|
+
export type { ClearSuggestionTrigger, ClearSuggestionState, ClearSuggestionConfig, ClearSuggestionResult, ClearSuggestionInput, PreservedArtifact, } from './types.js';
|
|
59
|
+
export { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, CONTEXT_THRESHOLD, FAILURE_THRESHOLD, } from './constants.js';
|
|
60
|
+
export { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AA8JpB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,qBAAqB,CAmGvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAEtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAS3C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,qBAAqB;IAEpE;;OAEG;yBACkB;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KAAG,MAAM,GAAG,IAAI;IAmBjB;;OAEG;kBACW;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KAAG,IAAI;EAI9C;AAGD,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,0BAA0B,EAC1B,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clear Suggestions Hook
|
|
3
|
+
*
|
|
4
|
+
* Adaptive /clear suggestions system that intelligently recommends session
|
|
5
|
+
* resets when it would improve reliability and performance.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - 5 semantic triggers for context-aware suggestions
|
|
9
|
+
* - 5-minute cooldown between suggestions
|
|
10
|
+
* - Maximum 2 suggestions per session
|
|
11
|
+
* - Non-intrusive messaging explaining WHY clearing helps
|
|
12
|
+
* - Lists preserved artifacts (plans, notes, decisions)
|
|
13
|
+
*
|
|
14
|
+
* Complements (doesn't replace) existing /compact suggestions.
|
|
15
|
+
*/
|
|
16
|
+
import { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, WORKFLOW_COMPLETE_MESSAGE, ARCHITECT_VERIFIED_MESSAGE, PLANNING_COMPLETE_MESSAGE, CONTEXT_ARTIFACTS_MESSAGE, DEGRADATION_SIGNALS_MESSAGE, formatPreservedArtifacts, } from './constants.js';
|
|
17
|
+
import { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
|
|
18
|
+
import { isAnyModeActive } from '../mode-registry/index.js';
|
|
19
|
+
/**
|
|
20
|
+
* In-memory session state tracking
|
|
21
|
+
*/
|
|
22
|
+
const sessionStates = new Map();
|
|
23
|
+
/**
|
|
24
|
+
* Get or create session state
|
|
25
|
+
*/
|
|
26
|
+
function getSessionState(sessionId) {
|
|
27
|
+
let state = sessionStates.get(sessionId);
|
|
28
|
+
if (!state) {
|
|
29
|
+
state = {
|
|
30
|
+
sessionId,
|
|
31
|
+
lastSuggestionTime: 0,
|
|
32
|
+
suggestionCount: 0,
|
|
33
|
+
consecutiveFailures: 0,
|
|
34
|
+
failureTimestamps: [],
|
|
35
|
+
};
|
|
36
|
+
sessionStates.set(sessionId, state);
|
|
37
|
+
}
|
|
38
|
+
return state;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Update session state
|
|
42
|
+
*/
|
|
43
|
+
function updateSessionState(sessionId, updates) {
|
|
44
|
+
const state = getSessionState(sessionId);
|
|
45
|
+
Object.assign(state, updates);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Record a suggestion was shown
|
|
49
|
+
*/
|
|
50
|
+
function recordSuggestion(sessionId) {
|
|
51
|
+
const state = getSessionState(sessionId);
|
|
52
|
+
state.lastSuggestionTime = Date.now();
|
|
53
|
+
state.suggestionCount++;
|
|
54
|
+
// Clear one-time flags
|
|
55
|
+
state.workflowJustCompleted = undefined;
|
|
56
|
+
state.architectJustVerified = undefined;
|
|
57
|
+
state.planningJustCompleted = undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Record a tool failure
|
|
61
|
+
*/
|
|
62
|
+
function recordFailure(sessionId) {
|
|
63
|
+
const state = getSessionState(sessionId);
|
|
64
|
+
state.consecutiveFailures++;
|
|
65
|
+
state.failureTimestamps.push(Date.now());
|
|
66
|
+
// Keep only recent timestamps (last 10)
|
|
67
|
+
if (state.failureTimestamps.length > 10) {
|
|
68
|
+
state.failureTimestamps = state.failureTimestamps.slice(-10);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Reset failure count (called on successful tool execution)
|
|
73
|
+
*/
|
|
74
|
+
function resetFailures(sessionId) {
|
|
75
|
+
const state = getSessionState(sessionId);
|
|
76
|
+
state.consecutiveFailures = 0;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if cooldown has elapsed
|
|
80
|
+
*/
|
|
81
|
+
function isCooldownElapsed(sessionId, config) {
|
|
82
|
+
const state = getSessionState(sessionId);
|
|
83
|
+
const cooldownMs = config?.cooldownMs ?? CLEAR_SUGGESTION_COOLDOWN_MS;
|
|
84
|
+
const elapsed = Date.now() - state.lastSuggestionTime;
|
|
85
|
+
return elapsed >= cooldownMs;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if max suggestions reached
|
|
89
|
+
*/
|
|
90
|
+
function isMaxSuggestionsReached(sessionId, config) {
|
|
91
|
+
const state = getSessionState(sessionId);
|
|
92
|
+
const maxSuggestions = config?.maxSuggestions ?? MAX_CLEAR_SUGGESTIONS;
|
|
93
|
+
return state.suggestionCount >= maxSuggestions;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate message for a trigger
|
|
97
|
+
*/
|
|
98
|
+
function generateMessage(trigger, artifacts, state, contextUsageRatio) {
|
|
99
|
+
const artifactsText = formatPreservedArtifacts(artifacts.map(a => ({ type: a.type, description: a.description })));
|
|
100
|
+
switch (trigger) {
|
|
101
|
+
case 'workflow_complete': {
|
|
102
|
+
const modeName = state.workflowJustCompleted || 'workflow';
|
|
103
|
+
const modeDisplayNames = {
|
|
104
|
+
ralph: 'Ralph',
|
|
105
|
+
autopilot: 'Autopilot',
|
|
106
|
+
ultrawork: 'Ultrawork',
|
|
107
|
+
ultraqa: 'UltraQA',
|
|
108
|
+
ultrapilot: 'Ultrapilot',
|
|
109
|
+
swarm: 'Swarm',
|
|
110
|
+
pipeline: 'Pipeline',
|
|
111
|
+
ecomode: 'Ecomode',
|
|
112
|
+
};
|
|
113
|
+
const displayName = modeDisplayNames[modeName] || modeName;
|
|
114
|
+
return WORKFLOW_COMPLETE_MESSAGE(displayName, artifactsText);
|
|
115
|
+
}
|
|
116
|
+
case 'architect_verified':
|
|
117
|
+
return ARCHITECT_VERIFIED_MESSAGE(artifactsText);
|
|
118
|
+
case 'planning_complete':
|
|
119
|
+
return PLANNING_COMPLETE_MESSAGE(artifactsText);
|
|
120
|
+
case 'context_artifacts': {
|
|
121
|
+
const usagePct = Math.round((contextUsageRatio ?? 0.5) * 100);
|
|
122
|
+
return CONTEXT_ARTIFACTS_MESSAGE(usagePct, artifactsText);
|
|
123
|
+
}
|
|
124
|
+
case 'degradation_signals': {
|
|
125
|
+
const failureCount = state.consecutiveFailures;
|
|
126
|
+
return DEGRADATION_SIGNALS_MESSAGE(failureCount, artifactsText);
|
|
127
|
+
}
|
|
128
|
+
default:
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Main check function - evaluates all triggers and returns suggestion if appropriate
|
|
134
|
+
*/
|
|
135
|
+
export function checkClearSuggestion(input, config) {
|
|
136
|
+
const { sessionId, directory, toolName, toolOutput, contextUsageRatio } = input;
|
|
137
|
+
// Check if disabled
|
|
138
|
+
if (config?.enabled === false) {
|
|
139
|
+
return { shouldSuggest: false, skipReason: 'disabled' };
|
|
140
|
+
}
|
|
141
|
+
// Don't suggest /clear while an OMC mode is actively running
|
|
142
|
+
// Only suggest after the mode completes
|
|
143
|
+
if (isAnyModeActive(directory)) {
|
|
144
|
+
return { shouldSuggest: false, skipReason: 'mode_active' };
|
|
145
|
+
}
|
|
146
|
+
// Check max suggestions
|
|
147
|
+
if (isMaxSuggestionsReached(sessionId, config)) {
|
|
148
|
+
return { shouldSuggest: false, skipReason: 'max_suggestions_reached' };
|
|
149
|
+
}
|
|
150
|
+
// Check cooldown
|
|
151
|
+
if (!isCooldownElapsed(sessionId, config)) {
|
|
152
|
+
return { shouldSuggest: false, skipReason: 'cooldown_active' };
|
|
153
|
+
}
|
|
154
|
+
// Get session state
|
|
155
|
+
const state = getSessionState(sessionId);
|
|
156
|
+
// Track tool failures/successes
|
|
157
|
+
if (toolName && toolOutput) {
|
|
158
|
+
if (isToolFailure(toolName, toolOutput)) {
|
|
159
|
+
recordFailure(sessionId);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
resetFailures(sessionId);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Check for mode completions
|
|
166
|
+
const completedModes = ['ralph', 'autopilot', 'ultrawork', 'ultraqa'];
|
|
167
|
+
for (const mode of completedModes) {
|
|
168
|
+
if (checkModeJustCompleted(directory, mode)) {
|
|
169
|
+
updateSessionState(sessionId, { workflowJustCompleted: mode });
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Check for architect verification
|
|
174
|
+
if (checkArchitectJustVerified(directory)) {
|
|
175
|
+
updateSessionState(sessionId, { architectJustVerified: true });
|
|
176
|
+
}
|
|
177
|
+
// Discover preserved artifacts
|
|
178
|
+
const artifacts = discoverPreservedArtifacts(directory);
|
|
179
|
+
// Evaluate triggers in priority order
|
|
180
|
+
// Priority: workflow_complete > architect_verified > planning_complete > context_artifacts > degradation_signals
|
|
181
|
+
let trigger = null;
|
|
182
|
+
// 1. Workflow complete (highest priority - clear win)
|
|
183
|
+
trigger = detectWorkflowComplete(state);
|
|
184
|
+
if (trigger) {
|
|
185
|
+
const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
|
|
186
|
+
recordSuggestion(sessionId);
|
|
187
|
+
return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
|
|
188
|
+
}
|
|
189
|
+
// 2. Architect verified
|
|
190
|
+
trigger = detectArchitectVerified(state);
|
|
191
|
+
if (trigger) {
|
|
192
|
+
const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
|
|
193
|
+
recordSuggestion(sessionId);
|
|
194
|
+
return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
|
|
195
|
+
}
|
|
196
|
+
// 3. Planning complete
|
|
197
|
+
trigger = detectPlanningComplete(state);
|
|
198
|
+
if (trigger) {
|
|
199
|
+
const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
|
|
200
|
+
recordSuggestion(sessionId);
|
|
201
|
+
return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
|
|
202
|
+
}
|
|
203
|
+
// 4. Context >50% with artifacts
|
|
204
|
+
trigger = detectContextWithArtifacts(contextUsageRatio, artifacts, config);
|
|
205
|
+
if (trigger) {
|
|
206
|
+
const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
|
|
207
|
+
recordSuggestion(sessionId);
|
|
208
|
+
return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
|
|
209
|
+
}
|
|
210
|
+
// 5. Degradation signals (lowest priority - only if nothing else triggered)
|
|
211
|
+
trigger = detectDegradationSignals(state, config);
|
|
212
|
+
if (trigger) {
|
|
213
|
+
const message = generateMessage(trigger, artifacts, state, contextUsageRatio);
|
|
214
|
+
recordSuggestion(sessionId);
|
|
215
|
+
return { shouldSuggest: true, trigger, message, preservedArtifacts: artifacts };
|
|
216
|
+
}
|
|
217
|
+
return { shouldSuggest: false, skipReason: 'no_triggers_fired' };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Mark planning as just completed (called by plan/ralplan skills)
|
|
221
|
+
*/
|
|
222
|
+
export function markPlanningComplete(sessionId) {
|
|
223
|
+
updateSessionState(sessionId, { planningJustCompleted: true });
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Reset session state (called on /clear)
|
|
227
|
+
*/
|
|
228
|
+
export function resetClearSuggestionState(sessionId) {
|
|
229
|
+
sessionStates.delete(sessionId);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get current session stats (for debugging)
|
|
233
|
+
*/
|
|
234
|
+
export function getClearSuggestionStats(sessionId) {
|
|
235
|
+
return sessionStates.get(sessionId) ?? null;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Clean up stale sessions (older than 30 minutes)
|
|
239
|
+
*/
|
|
240
|
+
export function cleanupStaleSessions() {
|
|
241
|
+
const now = Date.now();
|
|
242
|
+
const maxAge = 30 * 60 * 1000; // 30 minutes
|
|
243
|
+
for (const [sessionId, state] of sessionStates) {
|
|
244
|
+
if (state.lastSuggestionTime > 0 && now - state.lastSuggestionTime > maxAge) {
|
|
245
|
+
sessionStates.delete(sessionId);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create a clear suggestion hook instance
|
|
251
|
+
*/
|
|
252
|
+
export function createClearSuggestionHook(config) {
|
|
253
|
+
return {
|
|
254
|
+
/**
|
|
255
|
+
* PostToolUse - Check if we should suggest /clear
|
|
256
|
+
*/
|
|
257
|
+
postToolUse: (input) => {
|
|
258
|
+
const result = checkClearSuggestion({
|
|
259
|
+
sessionId: input.session_id,
|
|
260
|
+
directory: input.directory,
|
|
261
|
+
toolName: input.tool_name,
|
|
262
|
+
toolOutput: input.tool_response,
|
|
263
|
+
contextUsageRatio: input.context_usage_ratio,
|
|
264
|
+
}, config);
|
|
265
|
+
if (result.shouldSuggest && result.message) {
|
|
266
|
+
return result.message;
|
|
267
|
+
}
|
|
268
|
+
return null;
|
|
269
|
+
},
|
|
270
|
+
/**
|
|
271
|
+
* Stop event - Reset failure tracking
|
|
272
|
+
*/
|
|
273
|
+
stop: (input) => {
|
|
274
|
+
resetFailures(input.session_id);
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// Re-export constants
|
|
279
|
+
export { CLEAR_SUGGESTION_COOLDOWN_MS, MAX_CLEAR_SUGGESTIONS, CONTEXT_THRESHOLD, FAILURE_THRESHOLD, } from './constants.js';
|
|
280
|
+
// Re-export trigger functions for testing
|
|
281
|
+
export { detectWorkflowComplete, detectArchitectVerified, detectPlanningComplete, detectContextWithArtifacts, detectDegradationSignals, isToolFailure, discoverPreservedArtifacts, checkModeJustCompleted, checkArchitectJustVerified, } from './triggers.js';
|
|
282
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clear Suggestions Trigger Detection
|
|
3
|
+
*
|
|
4
|
+
* Implements the 5 semantic triggers that determine when to suggest /clear:
|
|
5
|
+
* 1. Workflow complete - ralph/autopilot/ultrawork finished
|
|
6
|
+
* 2. Architect verified - architect approval passed
|
|
7
|
+
* 3. Planning complete - ralplan/plan skill completed
|
|
8
|
+
* 4. Context >50% + artifacts - high context but plan files exist
|
|
9
|
+
* 5. Degradation signals - 3+ consecutive failures
|
|
10
|
+
*/
|
|
11
|
+
import type { ClearSuggestionTrigger, ClearSuggestionState, ClearSuggestionConfig, PreservedArtifact } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Detect if a workflow (ralph/autopilot/ultrawork) just completed.
|
|
14
|
+
*
|
|
15
|
+
* Checks state files for modes that transitioned from active to inactive
|
|
16
|
+
* within the current hook call.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectWorkflowComplete(state: ClearSuggestionState): ClearSuggestionTrigger | null;
|
|
19
|
+
/**
|
|
20
|
+
* Detect if architect verification just passed.
|
|
21
|
+
*
|
|
22
|
+
* Reads ralph verification state to see if architect approved.
|
|
23
|
+
*/
|
|
24
|
+
export declare function detectArchitectVerified(state: ClearSuggestionState): ClearSuggestionTrigger | null;
|
|
25
|
+
/**
|
|
26
|
+
* Detect if planning just completed.
|
|
27
|
+
*
|
|
28
|
+
* Checks if a plan skill or ralplan skill just finished.
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectPlanningComplete(state: ClearSuggestionState): ClearSuggestionTrigger | null;
|
|
31
|
+
/**
|
|
32
|
+
* Detect if context is above threshold and artifacts exist to reload.
|
|
33
|
+
*
|
|
34
|
+
* This trigger fires when context is high but the user has saved artifacts
|
|
35
|
+
* (plans, PRDs, notes) that would automatically reload after /clear.
|
|
36
|
+
*/
|
|
37
|
+
export declare function detectContextWithArtifacts(contextUsageRatio: number | undefined, artifacts: PreservedArtifact[], config?: ClearSuggestionConfig): ClearSuggestionTrigger | null;
|
|
38
|
+
/**
|
|
39
|
+
* Detect degradation signals from consecutive failures.
|
|
40
|
+
*
|
|
41
|
+
* Tracks recent tool failures and triggers when the threshold is exceeded.
|
|
42
|
+
*/
|
|
43
|
+
export declare function detectDegradationSignals(state: ClearSuggestionState, config?: ClearSuggestionConfig): ClearSuggestionTrigger | null;
|
|
44
|
+
/**
|
|
45
|
+
* Check if a tool output indicates a failure
|
|
46
|
+
*/
|
|
47
|
+
export declare function isToolFailure(toolName: string, toolOutput: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Discover preserved artifacts in the project directory.
|
|
50
|
+
*
|
|
51
|
+
* Scans for plans, PRDs, specs, progress files, notepads, and wisdom files
|
|
52
|
+
* that would survive a /clear and be available in the new session.
|
|
53
|
+
*/
|
|
54
|
+
export declare function discoverPreservedArtifacts(directory: string): PreservedArtifact[];
|
|
55
|
+
/**
|
|
56
|
+
* Check if a mode just completed by comparing current state with previous state.
|
|
57
|
+
*
|
|
58
|
+
* Reads mode state files to detect transitions from active to inactive.
|
|
59
|
+
*/
|
|
60
|
+
export declare function checkModeJustCompleted(directory: string, modeName: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Check if architect verification just passed
|
|
63
|
+
*/
|
|
64
|
+
export declare function checkArchitectJustVerified(directory: string): boolean;
|
|
65
|
+
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/hooks/clear-suggestions/triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGzH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,sBAAsB,GAAG,IAAI,CAK/B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,SAAS,EAAE,iBAAiB,EAAE,EAC9B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,sBAAsB,GAAG,IAAI,CAa/B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,CAAC,EAAE,qBAAqB,GAC7B,sBAAsB,GAAG,IAAI,CAc/B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAyC3E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwCjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAsCT;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAmBrE"}
|