oh-my-claude-sisyphus 3.7.3 → 3.7.4
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/agents/build-fixer-low.md +2 -2
- package/agents/build-fixer.md +74 -19
- package/agents/code-reviewer.md +7 -7
- package/agents/designer-high.md +2 -2
- package/agents/designer-low.md +1 -1
- package/agents/designer.md +17 -2
- package/agents/security-reviewer.md +86 -17
- package/agents/tdd-guide.md +151 -12
- package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
- package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
- package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
- package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/config.test.js +37 -0
- package/dist/__tests__/learned-skills/config.test.js.map +1 -0
- package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/detector.test.js +99 -0
- package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
- package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/finder.test.js +59 -0
- package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
- package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/loader.test.js +69 -0
- package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
- package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/parser.test.js +81 -0
- package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
- package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
- package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
- package/dist/__tests__/learned-skills/validator.test.js +85 -0
- package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
- package/dist/__tests__/skills.test.js +6 -5
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/agents/codex-agents.d.ts +20 -0
- package/dist/agents/codex-agents.d.ts.map +1 -0
- package/dist/agents/codex-agents.js +36 -0
- package/dist/agents/codex-agents.js.map +1 -0
- package/dist/agents/definitions.js +1 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/document-writer.d.ts +11 -0
- package/dist/agents/document-writer.d.ts.map +1 -0
- package/dist/agents/document-writer.js +209 -0
- package/dist/agents/document-writer.js.map +1 -0
- package/dist/agents/frontend-engineer.d.ts +11 -0
- package/dist/agents/frontend-engineer.d.ts.map +1 -0
- package/dist/agents/frontend-engineer.js +115 -0
- package/dist/agents/frontend-engineer.js.map +1 -0
- package/dist/agents/librarian.d.ts +12 -0
- package/dist/agents/librarian.d.ts.map +1 -0
- package/dist/agents/librarian.js +103 -0
- package/dist/agents/librarian.js.map +1 -0
- package/dist/agents/metis.d.ts +12 -0
- package/dist/agents/metis.d.ts.map +1 -0
- package/dist/agents/metis.js +117 -0
- package/dist/agents/metis.js.map +1 -0
- package/dist/agents/momus.d.ts +12 -0
- package/dist/agents/momus.d.ts.map +1 -0
- package/dist/agents/momus.js +128 -0
- package/dist/agents/momus.js.map +1 -0
- package/dist/agents/multimodal-looker.d.ts +11 -0
- package/dist/agents/multimodal-looker.d.ts.map +1 -0
- package/dist/agents/multimodal-looker.js +70 -0
- package/dist/agents/multimodal-looker.js.map +1 -0
- package/dist/agents/oracle.d.ts +13 -0
- package/dist/agents/oracle.d.ts.map +1 -0
- package/dist/agents/oracle.js +191 -0
- package/dist/agents/oracle.js.map +1 -0
- package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
- package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
- package/dist/agents/orchestrator-sisyphus.js +115 -0
- package/dist/agents/orchestrator-sisyphus.js.map +1 -0
- package/dist/agents/prometheus.d.ts +12 -0
- package/dist/agents/prometheus.d.ts.map +1 -0
- package/dist/agents/prometheus.js +195 -0
- package/dist/agents/prometheus.js.map +1 -0
- package/dist/agents/sisyphus-junior.d.ts +12 -0
- package/dist/agents/sisyphus-junior.d.ts.map +1 -0
- package/dist/agents/sisyphus-junior.js +93 -0
- package/dist/agents/sisyphus-junior.js.map +1 -0
- package/dist/cli/analytics.js +0 -0
- package/dist/cli/components/CostDashboard.d.ts +15 -0
- package/dist/cli/components/CostDashboard.d.ts.map +1 -0
- package/dist/cli/components/CostDashboard.js +15 -0
- package/dist/cli/components/CostDashboard.js.map +1 -0
- package/dist/cli/components/LiveStats.d.ts +16 -0
- package/dist/cli/components/LiveStats.d.ts.map +1 -0
- package/dist/cli/components/LiveStats.js +16 -0
- package/dist/cli/components/LiveStats.js.map +1 -0
- package/dist/cli/components/SessionBrowser.d.ts +14 -0
- package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
- package/dist/cli/components/SessionBrowser.js +14 -0
- package/dist/cli/components/SessionBrowser.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/cli/tui.d.ts +21 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +21 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/compatibility/discovery.d.ts.map +1 -1
- package/dist/compatibility/discovery.js +3 -1
- package/dist/compatibility/discovery.js.map +1 -1
- package/dist/hooks/autopilot/prompts.d.ts.map +1 -1
- package/dist/hooks/autopilot/prompts.js +17 -3
- package/dist/hooks/autopilot/prompts.js.map +1 -1
- package/dist/hooks/autopilot/signals.d.ts +20 -0
- package/dist/hooks/autopilot/signals.d.ts.map +1 -0
- package/dist/hooks/autopilot/signals.js +75 -0
- package/dist/hooks/autopilot/signals.js.map +1 -0
- package/dist/hooks/autopilot/summary.d.ts +27 -0
- package/dist/hooks/autopilot/summary.d.ts.map +1 -0
- package/dist/hooks/autopilot/summary.js +160 -0
- package/dist/hooks/autopilot/summary.js.map +1 -0
- package/dist/hooks/autopilot/transition.d.ts +39 -0
- package/dist/hooks/autopilot/transition.d.ts.map +1 -0
- package/dist/hooks/autopilot/transition.js +216 -0
- package/dist/hooks/autopilot/transition.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
- package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
- package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
- package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/index.js +201 -0
- package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
- package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
- package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
- package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
- package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
- package/dist/hooks/context-window-limit-recovery/types.js +34 -0
- package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
- package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
- package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
- package/dist/hooks/edit-error-recovery/index.js +89 -0
- package/dist/hooks/edit-error-recovery/index.js.map +1 -0
- package/dist/hooks/github-auto-responder/classifier.d.ts +43 -0
- package/dist/hooks/github-auto-responder/classifier.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/classifier.js +150 -0
- package/dist/hooks/github-auto-responder/classifier.js.map +1 -0
- package/dist/hooks/github-auto-responder/config.d.ts +109 -0
- package/dist/hooks/github-auto-responder/config.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/config.js +69 -0
- package/dist/hooks/github-auto-responder/config.js.map +1 -0
- package/dist/hooks/github-auto-responder/constants.d.ts +45 -0
- package/dist/hooks/github-auto-responder/constants.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/constants.js +60 -0
- package/dist/hooks/github-auto-responder/constants.js.map +1 -0
- package/dist/hooks/github-auto-responder/filters.d.ts +95 -0
- package/dist/hooks/github-auto-responder/filters.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/filters.js +174 -0
- package/dist/hooks/github-auto-responder/filters.js.map +1 -0
- package/dist/hooks/github-auto-responder/github-client.d.ts +65 -0
- package/dist/hooks/github-auto-responder/github-client.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/github-client.js +128 -0
- package/dist/hooks/github-auto-responder/github-client.js.map +1 -0
- package/dist/hooks/github-auto-responder/idempotency.d.ts +68 -0
- package/dist/hooks/github-auto-responder/idempotency.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/idempotency.js +147 -0
- package/dist/hooks/github-auto-responder/idempotency.js.map +1 -0
- package/dist/hooks/github-auto-responder/index.d.ts +140 -0
- package/dist/hooks/github-auto-responder/index.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/index.js +145 -0
- package/dist/hooks/github-auto-responder/index.js.map +1 -0
- package/dist/hooks/github-auto-responder/persona.d.ts +40 -0
- package/dist/hooks/github-auto-responder/persona.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/persona.js +99 -0
- package/dist/hooks/github-auto-responder/persona.js.map +1 -0
- package/dist/hooks/github-auto-responder/responder.d.ts +122 -0
- package/dist/hooks/github-auto-responder/responder.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/responder.js +264 -0
- package/dist/hooks/github-auto-responder/responder.js.map +1 -0
- package/dist/hooks/github-auto-responder/server.d.ts +140 -0
- package/dist/hooks/github-auto-responder/server.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/server.js +301 -0
- package/dist/hooks/github-auto-responder/server.js.map +1 -0
- package/dist/hooks/github-auto-responder/signature.d.ts +34 -0
- package/dist/hooks/github-auto-responder/signature.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/signature.js +79 -0
- package/dist/hooks/github-auto-responder/signature.js.map +1 -0
- package/dist/hooks/github-auto-responder/templates.d.ts +16 -0
- package/dist/hooks/github-auto-responder/templates.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/templates.js +93 -0
- package/dist/hooks/github-auto-responder/templates.js.map +1 -0
- package/dist/hooks/github-auto-responder/types.d.ts +246 -0
- package/dist/hooks/github-auto-responder/types.d.ts.map +1 -0
- package/dist/hooks/github-auto-responder/types.js +7 -0
- package/dist/hooks/github-auto-responder/types.js.map +1 -0
- package/dist/hooks/learned-skills/config.d.ts +53 -0
- package/dist/hooks/learned-skills/config.d.ts.map +1 -0
- package/dist/hooks/learned-skills/config.js +103 -0
- package/dist/hooks/learned-skills/config.js.map +1 -0
- package/dist/hooks/learned-skills/constants.d.ts +24 -0
- package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
- package/dist/hooks/learned-skills/constants.js +26 -0
- package/dist/hooks/learned-skills/constants.js.map +1 -0
- package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
- package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
- package/dist/hooks/learned-skills/detection-hook.js +83 -0
- package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
- package/dist/hooks/learned-skills/detector.d.ts +30 -0
- package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
- package/dist/hooks/learned-skills/detector.js +150 -0
- package/dist/hooks/learned-skills/detector.js.map +1 -0
- package/dist/hooks/learned-skills/finder.d.ts +21 -0
- package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
- package/dist/hooks/learned-skills/finder.js +117 -0
- package/dist/hooks/learned-skills/finder.js.map +1 -0
- package/dist/hooks/learned-skills/index.d.ts +62 -0
- package/dist/hooks/learned-skills/index.d.ts.map +1 -0
- package/dist/hooks/learned-skills/index.js +137 -0
- package/dist/hooks/learned-skills/index.js.map +1 -0
- package/dist/hooks/learned-skills/loader.d.ts +20 -0
- package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
- package/dist/hooks/learned-skills/loader.js +107 -0
- package/dist/hooks/learned-skills/loader.js.map +1 -0
- package/dist/hooks/learned-skills/parser.d.ts +21 -0
- package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
- package/dist/hooks/learned-skills/parser.js +190 -0
- package/dist/hooks/learned-skills/parser.js.map +1 -0
- package/dist/hooks/learned-skills/promotion.d.ts +29 -0
- package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
- package/dist/hooks/learned-skills/promotion.js +87 -0
- package/dist/hooks/learned-skills/promotion.js.map +1 -0
- package/dist/hooks/learned-skills/types.d.ts +109 -0
- package/dist/hooks/learned-skills/types.d.ts.map +1 -0
- package/dist/hooks/learned-skills/types.js +8 -0
- package/dist/hooks/learned-skills/types.js.map +1 -0
- package/dist/hooks/learned-skills/validator.d.ts +15 -0
- package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
- package/dist/hooks/learned-skills/validator.js +87 -0
- package/dist/hooks/learned-skills/validator.js.map +1 -0
- package/dist/hooks/learned-skills/writer.d.ts +27 -0
- package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
- package/dist/hooks/learned-skills/writer.js +126 -0
- package/dist/hooks/learned-skills/writer.js.map +1 -0
- package/dist/hooks/mnemosyne/config.d.ts +53 -0
- package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/config.js +103 -0
- package/dist/hooks/mnemosyne/config.js.map +1 -0
- package/dist/hooks/mnemosyne/constants.d.ts +24 -0
- package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/constants.js +26 -0
- package/dist/hooks/mnemosyne/constants.js.map +1 -0
- package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
- package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/detection-hook.js +83 -0
- package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
- package/dist/hooks/mnemosyne/detector.d.ts +30 -0
- package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/detector.js +150 -0
- package/dist/hooks/mnemosyne/detector.js.map +1 -0
- package/dist/hooks/mnemosyne/finder.d.ts +21 -0
- package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/finder.js +117 -0
- package/dist/hooks/mnemosyne/finder.js.map +1 -0
- package/dist/hooks/mnemosyne/index.d.ts +62 -0
- package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/index.js +137 -0
- package/dist/hooks/mnemosyne/index.js.map +1 -0
- package/dist/hooks/mnemosyne/loader.d.ts +20 -0
- package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/loader.js +113 -0
- package/dist/hooks/mnemosyne/loader.js.map +1 -0
- package/dist/hooks/mnemosyne/parser.d.ts +21 -0
- package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/parser.js +190 -0
- package/dist/hooks/mnemosyne/parser.js.map +1 -0
- package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
- package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/promotion.js +87 -0
- package/dist/hooks/mnemosyne/promotion.js.map +1 -0
- package/dist/hooks/mnemosyne/types.d.ts +109 -0
- package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/types.js +8 -0
- package/dist/hooks/mnemosyne/types.js.map +1 -0
- package/dist/hooks/mnemosyne/validator.d.ts +15 -0
- package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/validator.js +87 -0
- package/dist/hooks/mnemosyne/validator.js.map +1 -0
- package/dist/hooks/mnemosyne/writer.d.ts +27 -0
- package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
- package/dist/hooks/mnemosyne/writer.js +126 -0
- package/dist/hooks/mnemosyne/writer.js.map +1 -0
- package/dist/hooks/ralph-loop/index.d.ts +116 -0
- package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
- package/dist/hooks/ralph-loop/index.js +322 -0
- package/dist/hooks/ralph-loop/index.js.map +1 -0
- package/dist/hooks/ralph-prd/index.d.ts +130 -0
- package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
- package/dist/hooks/ralph-prd/index.js +310 -0
- package/dist/hooks/ralph-prd/index.js.map +1 -0
- package/dist/hooks/ralph-progress/index.d.ts +102 -0
- package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
- package/dist/hooks/ralph-progress/index.js +408 -0
- package/dist/hooks/ralph-progress/index.js.map +1 -0
- package/dist/hooks/ralph-verifier/index.d.ts +72 -0
- package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
- package/dist/hooks/ralph-verifier/index.js +223 -0
- package/dist/hooks/ralph-verifier/index.js.map +1 -0
- package/dist/hooks/session-recovery/constants.d.ts +56 -0
- package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
- package/dist/hooks/session-recovery/constants.js +78 -0
- package/dist/hooks/session-recovery/constants.js.map +1 -0
- package/dist/hooks/session-recovery/index.d.ts +53 -0
- package/dist/hooks/session-recovery/index.d.ts.map +1 -0
- package/dist/hooks/session-recovery/index.js +321 -0
- package/dist/hooks/session-recovery/index.js.map +1 -0
- package/dist/hooks/session-recovery/storage.d.ts +76 -0
- package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
- package/dist/hooks/session-recovery/storage.js +383 -0
- package/dist/hooks/session-recovery/storage.js.map +1 -0
- package/dist/hooks/session-recovery/types.d.ts +145 -0
- package/dist/hooks/session-recovery/types.d.ts.map +1 -0
- package/dist/hooks/session-recovery/types.js +8 -0
- package/dist/hooks/session-recovery/types.js.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
- package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
- package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
- package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
- package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
- package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
- package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
- package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
- package/dist/hooks/ultraqa-loop/index.js +216 -0
- package/dist/hooks/ultraqa-loop/index.js.map +1 -0
- package/dist/hooks/ultrawork-state/index.d.ts +62 -0
- package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
- package/dist/hooks/ultrawork-state/index.js +208 -0
- package/dist/hooks/ultrawork-state/index.js.map +1 -0
- package/dist/hud/sisyphus-state.d.ts +31 -0
- package/dist/hud/sisyphus-state.d.ts.map +1 -0
- package/dist/hud/sisyphus-state.js +163 -0
- package/dist/hud/sisyphus-state.js.map +1 -0
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +1 -1
- package/package.json +1 -1
- package/scripts/github-webhook-server.ts +141 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for GitHub Auto-Responder
|
|
3
|
+
*/
|
|
4
|
+
import type { PersonaConfig } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Default persona configuration for auto-responses
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_PERSONA: PersonaConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Labels that prevent auto-reply
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_SKIP_LABELS: string[];
|
|
13
|
+
/**
|
|
14
|
+
* Patterns for spam detection
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_SPAM_PATTERNS: RegExp[];
|
|
17
|
+
/**
|
|
18
|
+
* GitHub API base URL
|
|
19
|
+
*/
|
|
20
|
+
export declare const GITHUB_API_BASE = "https://api.github.com";
|
|
21
|
+
/**
|
|
22
|
+
* Anthropic API endpoint
|
|
23
|
+
*/
|
|
24
|
+
export declare const ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
|
|
25
|
+
/**
|
|
26
|
+
* Default server port
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFAULT_PORT = 3000;
|
|
29
|
+
/**
|
|
30
|
+
* Default LLM model for responses
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_LLM_MODEL = "claude-sonnet-4-20250514";
|
|
33
|
+
/**
|
|
34
|
+
* Maximum tokens for LLM response
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_MAX_RESPONSE_TOKENS = 500;
|
|
37
|
+
/**
|
|
38
|
+
* Response timeout in milliseconds
|
|
39
|
+
*/
|
|
40
|
+
export declare const RESPONSE_TIMEOUT_MS = 8000;
|
|
41
|
+
/**
|
|
42
|
+
* Idempotency key TTL (24 hours)
|
|
43
|
+
*/
|
|
44
|
+
export declare const IDEMPOTENCY_TTL_MS: number;
|
|
45
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,aAM7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAAkC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAYzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAsB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants for GitHub Auto-Responder
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default persona configuration for auto-responses
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_PERSONA = {
|
|
8
|
+
tone: 'direct',
|
|
9
|
+
technicalDepth: 'high',
|
|
10
|
+
language: 'ko-mix', // Korean/English blend
|
|
11
|
+
signatureEmoji: '🦞',
|
|
12
|
+
maintainerName: 'Yeachan Heo',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Labels that prevent auto-reply
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_SKIP_LABELS = ['no-auto-reply', 'bot-ignore'];
|
|
18
|
+
/**
|
|
19
|
+
* Patterns for spam detection
|
|
20
|
+
*/
|
|
21
|
+
export const DEFAULT_SPAM_PATTERNS = [
|
|
22
|
+
// ALL CAPS patterns (ignoring short acronyms)
|
|
23
|
+
/\b[A-Z]{10,}\b/,
|
|
24
|
+
/^[A-Z\s!?]{50,}$/,
|
|
25
|
+
// Excessive links (5+ URLs in a comment)
|
|
26
|
+
/(?:https?:\/\/[^\s]+.*?){5,}/,
|
|
27
|
+
// Known spam phrases
|
|
28
|
+
/\b(?:click here now|buy now|limited time offer|act now|free money|winner|congratulations you won)\b/i,
|
|
29
|
+
/\b(?:earn \$\d+|make money fast|work from home|100% free|risk free)\b/i,
|
|
30
|
+
/\b(?:casino|viagra|cialis|lottery|pills)\b/i,
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* GitHub API base URL
|
|
34
|
+
*/
|
|
35
|
+
export const GITHUB_API_BASE = 'https://api.github.com';
|
|
36
|
+
/**
|
|
37
|
+
* Anthropic API endpoint
|
|
38
|
+
*/
|
|
39
|
+
export const ANTHROPIC_API_URL = 'https://api.anthropic.com/v1/messages';
|
|
40
|
+
/**
|
|
41
|
+
* Default server port
|
|
42
|
+
*/
|
|
43
|
+
export const DEFAULT_PORT = 3000;
|
|
44
|
+
/**
|
|
45
|
+
* Default LLM model for responses
|
|
46
|
+
*/
|
|
47
|
+
export const DEFAULT_LLM_MODEL = 'claude-sonnet-4-20250514';
|
|
48
|
+
/**
|
|
49
|
+
* Maximum tokens for LLM response
|
|
50
|
+
*/
|
|
51
|
+
export const DEFAULT_MAX_RESPONSE_TOKENS = 500;
|
|
52
|
+
/**
|
|
53
|
+
* Response timeout in milliseconds
|
|
54
|
+
*/
|
|
55
|
+
export const RESPONSE_TIMEOUT_MS = 8000;
|
|
56
|
+
/**
|
|
57
|
+
* Idempotency key TTL (24 hours)
|
|
58
|
+
*/
|
|
59
|
+
export const IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1000;
|
|
60
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,MAAM;IACtB,QAAQ,EAAE,QAAQ,EAAE,uBAAuB;IAC3C,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,aAAa;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,8CAA8C;IAC9C,gBAAgB;IAChB,kBAAkB;IAElB,yCAAyC;IACzC,8BAA8B;IAE9B,qBAAqB;IACrB,sGAAsG;IACtG,wEAAwE;IACxE,6CAA6C;CAC9C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter pipeline for GitHub webhook payloads
|
|
3
|
+
*
|
|
4
|
+
* Filters determine whether to skip responding to an issue or PR based on:
|
|
5
|
+
* - Bot detection
|
|
6
|
+
* - Self-response prevention
|
|
7
|
+
* - Label-based skipping
|
|
8
|
+
* - Spam detection
|
|
9
|
+
* - Action filtering (only 'opened' events)
|
|
10
|
+
*/
|
|
11
|
+
import type { WebhookPayload, FilterResult, GitHubIssuePayload, GitHubPRPayload } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Type guard: Check if payload is an issue payload
|
|
14
|
+
*
|
|
15
|
+
* @param payload - Webhook payload
|
|
16
|
+
* @returns True if payload contains an issue
|
|
17
|
+
*/
|
|
18
|
+
export declare function isIssuePayload(payload: WebhookPayload): payload is GitHubIssuePayload;
|
|
19
|
+
/**
|
|
20
|
+
* Type guard: Check if payload is a pull request payload
|
|
21
|
+
*
|
|
22
|
+
* @param payload - Webhook payload
|
|
23
|
+
* @returns True if payload contains a pull request
|
|
24
|
+
*/
|
|
25
|
+
export declare function isPRPayload(payload: WebhookPayload): payload is GitHubPRPayload;
|
|
26
|
+
/**
|
|
27
|
+
* Filter: Skip bot-generated events
|
|
28
|
+
*
|
|
29
|
+
* @param payload - Webhook payload
|
|
30
|
+
* @returns Filter result (skip if sender is a bot)
|
|
31
|
+
*/
|
|
32
|
+
export declare function filterBot(payload: WebhookPayload): FilterResult;
|
|
33
|
+
/**
|
|
34
|
+
* Filter: Skip self-generated events
|
|
35
|
+
*
|
|
36
|
+
* @param payload - Webhook payload
|
|
37
|
+
* @param selfLogin - Bot's own GitHub username
|
|
38
|
+
* @returns Filter result (skip if sender is self)
|
|
39
|
+
*/
|
|
40
|
+
export declare function filterSelf(payload: WebhookPayload, selfLogin: string): FilterResult;
|
|
41
|
+
/**
|
|
42
|
+
* Filter: Skip issues/PRs with excluded labels
|
|
43
|
+
*
|
|
44
|
+
* @param payload - Webhook payload
|
|
45
|
+
* @param skipLabels - Labels that prevent auto-response
|
|
46
|
+
* @returns Filter result (skip if any skip label is present)
|
|
47
|
+
*/
|
|
48
|
+
export declare function filterLabel(payload: WebhookPayload, skipLabels: string[]): FilterResult;
|
|
49
|
+
/**
|
|
50
|
+
* Filter: Skip spam-like content
|
|
51
|
+
*
|
|
52
|
+
* @param payload - Webhook payload
|
|
53
|
+
* @param spamPatterns - Regex patterns to detect spam
|
|
54
|
+
* @returns Filter result (skip if title or body matches spam pattern)
|
|
55
|
+
*/
|
|
56
|
+
export declare function filterSpam(payload: WebhookPayload, spamPatterns: RegExp[]): FilterResult;
|
|
57
|
+
/**
|
|
58
|
+
* Filter: Skip non-opened actions
|
|
59
|
+
*
|
|
60
|
+
* Only respond to newly opened issues and PRs.
|
|
61
|
+
*
|
|
62
|
+
* @param payload - Webhook payload
|
|
63
|
+
* @returns Filter result (skip if action is not 'opened')
|
|
64
|
+
*/
|
|
65
|
+
export declare function filterAction(payload: WebhookPayload): FilterResult;
|
|
66
|
+
/**
|
|
67
|
+
* Create a filter pipeline that runs all filters in sequence
|
|
68
|
+
*
|
|
69
|
+
* Filters are run in order:
|
|
70
|
+
* 1. Bot check
|
|
71
|
+
* 2. Self check
|
|
72
|
+
* 3. Action check (only 'opened')
|
|
73
|
+
* 4. Label check
|
|
74
|
+
* 5. Spam check
|
|
75
|
+
*
|
|
76
|
+
* Pipeline short-circuits on first skip (returns immediately).
|
|
77
|
+
*
|
|
78
|
+
* @param selfLogin - Bot's own GitHub username
|
|
79
|
+
* @param skipLabels - Labels that prevent auto-response
|
|
80
|
+
* @param spamPatterns - Spam detection patterns (defaults to DEFAULT_SPAM_PATTERNS)
|
|
81
|
+
* @returns Filter function that returns skip decision
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const filter = createFilterPipeline('my-bot', ['no-auto-reply']);
|
|
86
|
+
* const result = await filter(payload);
|
|
87
|
+
* if (result.skip) {
|
|
88
|
+
* console.log('Skipping:', result.reason);
|
|
89
|
+
* return;
|
|
90
|
+
* }
|
|
91
|
+
* // Process payload...
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function createFilterPipeline(selfLogin: string, skipLabels: string[], spamPatterns?: RegExp[]): (payload: WebhookPayload) => Promise<FilterResult>;
|
|
95
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,IAAI,kBAAkB,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,GACtB,OAAO,IAAI,eAAe,CAE5B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAS/D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,YAAY,CASd;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAAE,GACnB,YAAY,CAed;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,YAAY,CAsBd;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CASlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,GAAE,MAAM,EAA0B,GAC7C,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,YAAY,CAAC,CAqBpD"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter pipeline for GitHub webhook payloads
|
|
3
|
+
*
|
|
4
|
+
* Filters determine whether to skip responding to an issue or PR based on:
|
|
5
|
+
* - Bot detection
|
|
6
|
+
* - Self-response prevention
|
|
7
|
+
* - Label-based skipping
|
|
8
|
+
* - Spam detection
|
|
9
|
+
* - Action filtering (only 'opened' events)
|
|
10
|
+
*/
|
|
11
|
+
import { DEFAULT_SPAM_PATTERNS } from './constants.js';
|
|
12
|
+
/**
|
|
13
|
+
* Type guard: Check if payload is an issue payload
|
|
14
|
+
*
|
|
15
|
+
* @param payload - Webhook payload
|
|
16
|
+
* @returns True if payload contains an issue
|
|
17
|
+
*/
|
|
18
|
+
export function isIssuePayload(payload) {
|
|
19
|
+
return 'issue' in payload;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Type guard: Check if payload is a pull request payload
|
|
23
|
+
*
|
|
24
|
+
* @param payload - Webhook payload
|
|
25
|
+
* @returns True if payload contains a pull request
|
|
26
|
+
*/
|
|
27
|
+
export function isPRPayload(payload) {
|
|
28
|
+
return 'pull_request' in payload;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Filter: Skip bot-generated events
|
|
32
|
+
*
|
|
33
|
+
* @param payload - Webhook payload
|
|
34
|
+
* @returns Filter result (skip if sender is a bot)
|
|
35
|
+
*/
|
|
36
|
+
export function filterBot(payload) {
|
|
37
|
+
if (payload.sender.type === 'Bot') {
|
|
38
|
+
return {
|
|
39
|
+
skip: true,
|
|
40
|
+
reason: `Sender is a bot (${payload.sender.login})`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return { skip: false, reason: '' };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Filter: Skip self-generated events
|
|
47
|
+
*
|
|
48
|
+
* @param payload - Webhook payload
|
|
49
|
+
* @param selfLogin - Bot's own GitHub username
|
|
50
|
+
* @returns Filter result (skip if sender is self)
|
|
51
|
+
*/
|
|
52
|
+
export function filterSelf(payload, selfLogin) {
|
|
53
|
+
if (payload.sender.login === selfLogin) {
|
|
54
|
+
return {
|
|
55
|
+
skip: true,
|
|
56
|
+
reason: `Sender is self (${selfLogin})`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { skip: false, reason: '' };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Filter: Skip issues/PRs with excluded labels
|
|
63
|
+
*
|
|
64
|
+
* @param payload - Webhook payload
|
|
65
|
+
* @param skipLabels - Labels that prevent auto-response
|
|
66
|
+
* @returns Filter result (skip if any skip label is present)
|
|
67
|
+
*/
|
|
68
|
+
export function filterLabel(payload, skipLabels) {
|
|
69
|
+
const labels = isIssuePayload(payload)
|
|
70
|
+
? payload.issue.labels
|
|
71
|
+
: payload.pull_request.labels;
|
|
72
|
+
for (const label of labels) {
|
|
73
|
+
if (skipLabels.includes(label.name)) {
|
|
74
|
+
return {
|
|
75
|
+
skip: true,
|
|
76
|
+
reason: `Has skip label: ${label.name}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { skip: false, reason: '' };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Filter: Skip spam-like content
|
|
84
|
+
*
|
|
85
|
+
* @param payload - Webhook payload
|
|
86
|
+
* @param spamPatterns - Regex patterns to detect spam
|
|
87
|
+
* @returns Filter result (skip if title or body matches spam pattern)
|
|
88
|
+
*/
|
|
89
|
+
export function filterSpam(payload, spamPatterns) {
|
|
90
|
+
const item = isIssuePayload(payload) ? payload.issue : payload.pull_request;
|
|
91
|
+
const title = item.title;
|
|
92
|
+
const body = item.body ?? '';
|
|
93
|
+
for (const pattern of spamPatterns) {
|
|
94
|
+
if (pattern.test(title)) {
|
|
95
|
+
return {
|
|
96
|
+
skip: true,
|
|
97
|
+
reason: `Title matches spam pattern: ${pattern}`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (pattern.test(body)) {
|
|
101
|
+
return {
|
|
102
|
+
skip: true,
|
|
103
|
+
reason: `Body matches spam pattern: ${pattern}`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { skip: false, reason: '' };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Filter: Skip non-opened actions
|
|
111
|
+
*
|
|
112
|
+
* Only respond to newly opened issues and PRs.
|
|
113
|
+
*
|
|
114
|
+
* @param payload - Webhook payload
|
|
115
|
+
* @returns Filter result (skip if action is not 'opened')
|
|
116
|
+
*/
|
|
117
|
+
export function filterAction(payload) {
|
|
118
|
+
if (payload.action !== 'opened') {
|
|
119
|
+
return {
|
|
120
|
+
skip: true,
|
|
121
|
+
reason: `Action is not 'opened': ${payload.action}`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return { skip: false, reason: '' };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a filter pipeline that runs all filters in sequence
|
|
128
|
+
*
|
|
129
|
+
* Filters are run in order:
|
|
130
|
+
* 1. Bot check
|
|
131
|
+
* 2. Self check
|
|
132
|
+
* 3. Action check (only 'opened')
|
|
133
|
+
* 4. Label check
|
|
134
|
+
* 5. Spam check
|
|
135
|
+
*
|
|
136
|
+
* Pipeline short-circuits on first skip (returns immediately).
|
|
137
|
+
*
|
|
138
|
+
* @param selfLogin - Bot's own GitHub username
|
|
139
|
+
* @param skipLabels - Labels that prevent auto-response
|
|
140
|
+
* @param spamPatterns - Spam detection patterns (defaults to DEFAULT_SPAM_PATTERNS)
|
|
141
|
+
* @returns Filter function that returns skip decision
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* const filter = createFilterPipeline('my-bot', ['no-auto-reply']);
|
|
146
|
+
* const result = await filter(payload);
|
|
147
|
+
* if (result.skip) {
|
|
148
|
+
* console.log('Skipping:', result.reason);
|
|
149
|
+
* return;
|
|
150
|
+
* }
|
|
151
|
+
* // Process payload...
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export function createFilterPipeline(selfLogin, skipLabels, spamPatterns = DEFAULT_SPAM_PATTERNS) {
|
|
155
|
+
return async (payload) => {
|
|
156
|
+
// Run filters in sequence, short-circuit on first skip
|
|
157
|
+
const filters = [
|
|
158
|
+
() => filterBot(payload),
|
|
159
|
+
() => filterSelf(payload, selfLogin),
|
|
160
|
+
() => filterAction(payload),
|
|
161
|
+
() => filterLabel(payload, skipLabels),
|
|
162
|
+
() => filterSpam(payload, spamPatterns),
|
|
163
|
+
];
|
|
164
|
+
for (const filter of filters) {
|
|
165
|
+
const result = filter();
|
|
166
|
+
if (result.skip) {
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// All filters passed
|
|
171
|
+
return { skip: false, reason: '' };
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAuB;IAEvB,OAAO,OAAO,IAAI,OAAO,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,OAAuB;IAEvB,OAAO,cAAc,IAAI,OAAO,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAuB;IAC/C,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,oBAAoB,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,OAAuB,EACvB,SAAiB;IAEjB,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,mBAAmB,SAAS,GAAG;SACxC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAuB,EACvB,UAAoB;IAEpB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC;QACpC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;QACtB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,mBAAmB,KAAK,CAAC,IAAI,EAAE;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,OAAuB,EACvB,YAAsB;IAEtB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,+BAA+B,OAAO,EAAE;aACjD,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,8BAA8B,OAAO,EAAE;aAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,2BAA2B,OAAO,CAAC,MAAM,EAAE;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,UAAoB,EACpB,eAAyB,qBAAqB;IAE9C,OAAO,KAAK,EAAE,OAAuB,EAAyB,EAAE;QAC9D,uDAAuD;QACvD,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;YACxB,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;YACpC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;YAC3B,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC;YACtC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;SACxC,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub REST API Client
|
|
3
|
+
*
|
|
4
|
+
* Client for making authenticated GitHub API calls with rate limiting support.
|
|
5
|
+
*/
|
|
6
|
+
import type { CommentResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* GitHub REST API client with authentication and rate limiting
|
|
9
|
+
*/
|
|
10
|
+
export declare class GitHubClient {
|
|
11
|
+
private token;
|
|
12
|
+
/**
|
|
13
|
+
* Create a new GitHub API client
|
|
14
|
+
* @param token - GitHub personal access token
|
|
15
|
+
*/
|
|
16
|
+
constructor(token: string);
|
|
17
|
+
/**
|
|
18
|
+
* Make an authenticated GitHub API request
|
|
19
|
+
* @param method - HTTP method
|
|
20
|
+
* @param path - API endpoint path (e.g., '/repos/owner/repo/issues')
|
|
21
|
+
* @param body - Request body (for POST/PATCH)
|
|
22
|
+
* @returns Response JSON
|
|
23
|
+
*/
|
|
24
|
+
private request;
|
|
25
|
+
/**
|
|
26
|
+
* Post a comment on a GitHub issue
|
|
27
|
+
* @param repo - Repository in format 'owner/name'
|
|
28
|
+
* @param issueNumber - Issue number
|
|
29
|
+
* @param body - Comment body (markdown supported)
|
|
30
|
+
* @returns Result with success status and comment URL
|
|
31
|
+
*/
|
|
32
|
+
postIssueComment(repo: string, issueNumber: number, body: string): Promise<CommentResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Post a comment on a GitHub pull request
|
|
35
|
+
* (Uses same endpoint as issues since PRs are issues)
|
|
36
|
+
* @param repo - Repository in format 'owner/name'
|
|
37
|
+
* @param prNumber - Pull request number
|
|
38
|
+
* @param body - Comment body (markdown supported)
|
|
39
|
+
* @returns Result with success status and comment URL
|
|
40
|
+
*/
|
|
41
|
+
postPRComment(repo: string, prNumber: number, body: string): Promise<CommentResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Add a label to a GitHub issue or pull request
|
|
44
|
+
* @param repo - Repository in format 'owner/name'
|
|
45
|
+
* @param issueNumber - Issue or PR number
|
|
46
|
+
* @param label - Label name to add
|
|
47
|
+
* @returns Success status
|
|
48
|
+
*/
|
|
49
|
+
addLabel(repo: string, issueNumber: number, label: string): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Get a GitHub issue or pull request
|
|
52
|
+
* @param repo - Repository in format 'owner/name'
|
|
53
|
+
* @param issueNumber - Issue or PR number
|
|
54
|
+
* @returns Issue/PR data
|
|
55
|
+
*/
|
|
56
|
+
getIssue(repo: string, issueNumber: number): Promise<any>;
|
|
57
|
+
/**
|
|
58
|
+
* List comments on a GitHub issue or pull request
|
|
59
|
+
* @param repo - Repository in format 'owner/name'
|
|
60
|
+
* @param issueNumber - Issue or PR number
|
|
61
|
+
* @returns Array of comments
|
|
62
|
+
*/
|
|
63
|
+
listComments(repo: string, issueNumber: number): Promise<any[]>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=github-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/github-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;OAGG;gBACS,KAAK,EAAE,MAAM;IAIzB;;;;;;OAMG;YACW,OAAO;IAiDrB;;;;;;OAMG;IACG,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC;IAoBzB;;;;;;;OAOG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC;IAIzB;;;;;;OAMG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAcnB;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI/D;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAGtE"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub REST API Client
|
|
3
|
+
*
|
|
4
|
+
* Client for making authenticated GitHub API calls with rate limiting support.
|
|
5
|
+
*/
|
|
6
|
+
import { GITHUB_API_BASE } from './constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* GitHub REST API client with authentication and rate limiting
|
|
9
|
+
*/
|
|
10
|
+
export class GitHubClient {
|
|
11
|
+
token;
|
|
12
|
+
/**
|
|
13
|
+
* Create a new GitHub API client
|
|
14
|
+
* @param token - GitHub personal access token
|
|
15
|
+
*/
|
|
16
|
+
constructor(token) {
|
|
17
|
+
this.token = token;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Make an authenticated GitHub API request
|
|
21
|
+
* @param method - HTTP method
|
|
22
|
+
* @param path - API endpoint path (e.g., '/repos/owner/repo/issues')
|
|
23
|
+
* @param body - Request body (for POST/PATCH)
|
|
24
|
+
* @returns Response JSON
|
|
25
|
+
*/
|
|
26
|
+
async request(method, path, body) {
|
|
27
|
+
const url = `${GITHUB_API_BASE}${path}`;
|
|
28
|
+
const headers = {
|
|
29
|
+
Authorization: `Bearer ${this.token}`,
|
|
30
|
+
Accept: 'application/vnd.github+json',
|
|
31
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
32
|
+
'User-Agent': 'omc-github-auto-responder',
|
|
33
|
+
};
|
|
34
|
+
if (body) {
|
|
35
|
+
headers['Content-Type'] = 'application/json';
|
|
36
|
+
}
|
|
37
|
+
const response = await fetch(url, {
|
|
38
|
+
method,
|
|
39
|
+
headers,
|
|
40
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
41
|
+
});
|
|
42
|
+
// Handle rate limiting
|
|
43
|
+
if (response.status === 429) {
|
|
44
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
45
|
+
const waitSeconds = retryAfter ? parseInt(retryAfter, 10) : 60;
|
|
46
|
+
throw new Error(`GitHub API rate limit exceeded. Retry after ${waitSeconds} seconds.`);
|
|
47
|
+
}
|
|
48
|
+
// Handle other errors
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text();
|
|
51
|
+
throw new Error(`GitHub API error (${response.status}): ${errorText || response.statusText}`);
|
|
52
|
+
}
|
|
53
|
+
// Handle 204 No Content
|
|
54
|
+
if (response.status === 204) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return await response.json();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Post a comment on a GitHub issue
|
|
61
|
+
* @param repo - Repository in format 'owner/name'
|
|
62
|
+
* @param issueNumber - Issue number
|
|
63
|
+
* @param body - Comment body (markdown supported)
|
|
64
|
+
* @returns Result with success status and comment URL
|
|
65
|
+
*/
|
|
66
|
+
async postIssueComment(repo, issueNumber, body) {
|
|
67
|
+
try {
|
|
68
|
+
const data = await this.request('POST', `/repos/${repo}/issues/${issueNumber}/comments`, { body });
|
|
69
|
+
return {
|
|
70
|
+
success: true,
|
|
71
|
+
url: data.html_url,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Post a comment on a GitHub pull request
|
|
83
|
+
* (Uses same endpoint as issues since PRs are issues)
|
|
84
|
+
* @param repo - Repository in format 'owner/name'
|
|
85
|
+
* @param prNumber - Pull request number
|
|
86
|
+
* @param body - Comment body (markdown supported)
|
|
87
|
+
* @returns Result with success status and comment URL
|
|
88
|
+
*/
|
|
89
|
+
async postPRComment(repo, prNumber, body) {
|
|
90
|
+
return this.postIssueComment(repo, prNumber, body);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Add a label to a GitHub issue or pull request
|
|
94
|
+
* @param repo - Repository in format 'owner/name'
|
|
95
|
+
* @param issueNumber - Issue or PR number
|
|
96
|
+
* @param label - Label name to add
|
|
97
|
+
* @returns Success status
|
|
98
|
+
*/
|
|
99
|
+
async addLabel(repo, issueNumber, label) {
|
|
100
|
+
try {
|
|
101
|
+
await this.request('POST', `/repos/${repo}/issues/${issueNumber}/labels`, { labels: [label] });
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error('Failed to add label:', error);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get a GitHub issue or pull request
|
|
111
|
+
* @param repo - Repository in format 'owner/name'
|
|
112
|
+
* @param issueNumber - Issue or PR number
|
|
113
|
+
* @returns Issue/PR data
|
|
114
|
+
*/
|
|
115
|
+
async getIssue(repo, issueNumber) {
|
|
116
|
+
return this.request('GET', `/repos/${repo}/issues/${issueNumber}`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List comments on a GitHub issue or pull request
|
|
120
|
+
* @param repo - Repository in format 'owner/name'
|
|
121
|
+
* @param issueNumber - Issue or PR number
|
|
122
|
+
* @returns Array of comments
|
|
123
|
+
*/
|
|
124
|
+
async listComments(repo, issueNumber) {
|
|
125
|
+
return this.request('GET', `/repos/${repo}/issues/${issueNumber}/comments`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=github-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../../src/hooks/github-auto-responder/github-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,CAAS;IAEtB;;;OAGG;IACH,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAU;QAEV,MAAM,GAAG,GAAG,GAAG,eAAe,GAAG,IAAI,EAAE,CAAC;QAExC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,MAAM,EAAE,6BAA6B;YACrC,sBAAsB,EAAE,YAAY;YACpC,YAAY,EAAE,2BAA2B;SAC1C,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,+CAA+C,WAAW,WAAW,CACtE,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7E,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,WAAmB,EACnB,IAAY;QAEZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,UAAU,IAAI,WAAW,WAAW,WAAW,EAC/C,EAAE,IAAI,EAAE,CACT,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,IAAI,CAAC,QAAQ;aACnB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CACjB,IAAY,EACZ,QAAgB,EAChB,IAAY;QAEZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,WAAmB,EACnB,KAAa;QAEb,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAChB,MAAM,EACN,UAAU,IAAI,WAAW,WAAW,SAAS,EAC7C,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CACpB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,WAAmB;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,IAAI,WAAW,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,WAAmB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,IAAI,WAAW,WAAW,WAAW,CAAC,CAAC;IAC9E,CAAC;CACF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency Store for GitHub Auto-Responder
|
|
3
|
+
*
|
|
4
|
+
* SQLite-based deduplication using GitHub delivery IDs.
|
|
5
|
+
* Prevents duplicate webhook processing with automatic cleanup of old records.
|
|
6
|
+
*/
|
|
7
|
+
import type { IdempotencyRecord } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* SQLite-backed idempotency store for webhook deduplication.
|
|
10
|
+
* Uses GitHub delivery IDs to track processed events.
|
|
11
|
+
*/
|
|
12
|
+
export declare class IdempotencyStore {
|
|
13
|
+
private readonly dbPath;
|
|
14
|
+
private db;
|
|
15
|
+
private initialized;
|
|
16
|
+
/**
|
|
17
|
+
* Create a new idempotency store.
|
|
18
|
+
* @param dbPath - Path to SQLite database file
|
|
19
|
+
*/
|
|
20
|
+
constructor(dbPath: string);
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the database connection and schema.
|
|
23
|
+
* Dynamically imports better-sqlite3 and creates tables.
|
|
24
|
+
*/
|
|
25
|
+
init(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Ensure database is initialized before use.
|
|
28
|
+
* @throws {Error} If database is not initialized
|
|
29
|
+
*/
|
|
30
|
+
private ensureDb;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a delivery ID has already been processed.
|
|
33
|
+
* @param deliveryId - GitHub webhook delivery ID
|
|
34
|
+
* @returns True if already processed, false otherwise
|
|
35
|
+
*/
|
|
36
|
+
isProcessed(deliveryId: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Mark a delivery ID as processed.
|
|
39
|
+
* @param deliveryId - GitHub webhook delivery ID
|
|
40
|
+
*/
|
|
41
|
+
markProcessed(deliveryId: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Remove records older than the TTL.
|
|
44
|
+
* @returns Number of records deleted
|
|
45
|
+
*/
|
|
46
|
+
cleanup(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Close the database connection.
|
|
49
|
+
* Safe to call multiple times.
|
|
50
|
+
*/
|
|
51
|
+
close(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get all processed records (for debugging/testing).
|
|
54
|
+
* @returns Array of idempotency records
|
|
55
|
+
*/
|
|
56
|
+
getAllRecords(): IdempotencyRecord[];
|
|
57
|
+
/**
|
|
58
|
+
* Get count of processed records.
|
|
59
|
+
* @returns Total number of records in store
|
|
60
|
+
*/
|
|
61
|
+
getRecordCount(): number;
|
|
62
|
+
/**
|
|
63
|
+
* Clear all records (for testing/reset).
|
|
64
|
+
* @returns Number of records deleted
|
|
65
|
+
*/
|
|
66
|
+
clearAll(): number;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=idempotency.d.ts.map
|