@winspan/claude-forge 9.2.0 → 9.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +80 -19
- package/README.md +13 -6
- package/dist/catalogs/agents.json +19 -24
- package/dist/catalogs/skills.json +139 -27
- package/dist/claudemd/templates/swarm-protocol.md +1 -1
- package/dist/cli/commands/agent.d.ts +169 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +690 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/codegraph.d.ts +17 -0
- package/dist/cli/commands/codegraph.d.ts.map +1 -0
- package/dist/cli/commands/codegraph.js +263 -0
- package/dist/cli/commands/codegraph.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -1
- package/dist/cli/commands/decisions.js +46 -9
- package/dist/cli/commands/decisions.js.map +1 -1
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +2 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +5 -1
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
- package/dist/cli/commands/insights-goal-check.js +15 -15
- package/dist/cli/commands/insights-goal-check.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +51 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +202 -29
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/loop.d.ts +95 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +408 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +33 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +75 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +23 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +82 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +131 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +409 -9
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +9 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +43 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts.map +1 -1
- package/dist/core/diagnostics/checks.js +2 -1
- package/dist/core/diagnostics/checks.js.map +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
- package/dist/core/diagnostics/daemon-status.js +1 -1
- package/dist/core/diagnostics/daemon-status.js.map +1 -1
- package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
- package/dist/core/diagnostics/entropy-checks.js +10 -5
- package/dist/core/diagnostics/entropy-checks.js.map +1 -1
- package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.js +50 -0
- package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
- package/dist/core/event-fields.d.ts +27 -0
- package/dist/core/event-fields.d.ts.map +1 -1
- package/dist/core/event-fields.js +43 -0
- package/dist/core/event-fields.js.map +1 -1
- package/dist/core/governance/global-inject.d.ts +34 -4
- package/dist/core/governance/global-inject.d.ts.map +1 -1
- package/dist/core/governance/global-inject.js +80 -25
- package/dist/core/governance/global-inject.js.map +1 -1
- package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
- package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
- package/dist/core/insights/agent-anchor-guard.js +119 -0
- package/dist/core/insights/agent-anchor-guard.js.map +1 -0
- package/dist/core/insights/agent-distill-context.d.ts +55 -0
- package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-context.js +146 -0
- package/dist/core/insights/agent-distill-context.js.map +1 -0
- package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
- package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-spawn.js +179 -0
- package/dist/core/insights/agent-distill-spawn.js.map +1 -0
- package/dist/core/insights/agent-drift.d.ts +66 -0
- package/dist/core/insights/agent-drift.d.ts.map +1 -0
- package/dist/core/insights/agent-drift.js +109 -0
- package/dist/core/insights/agent-drift.js.map +1 -0
- package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
- package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
- package/dist/core/insights/agent-evolution-sources.js +36 -0
- package/dist/core/insights/agent-evolution-sources.js.map +1 -0
- package/dist/core/insights/agent-health.d.ts +142 -0
- package/dist/core/insights/agent-health.d.ts.map +1 -0
- package/dist/core/insights/agent-health.js +296 -0
- package/dist/core/insights/agent-health.js.map +1 -0
- package/dist/core/insights/agent-patch-apply.d.ts +45 -0
- package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
- package/dist/core/insights/agent-patch-apply.js +165 -0
- package/dist/core/insights/agent-patch-apply.js.map +1 -0
- package/dist/core/insights/agent-suggest.d.ts +128 -0
- package/dist/core/insights/agent-suggest.d.ts.map +1 -0
- package/dist/core/insights/agent-suggest.js +284 -0
- package/dist/core/insights/agent-suggest.js.map +1 -0
- package/dist/core/insights/coverage-tiers.d.ts +46 -0
- package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
- package/dist/core/insights/coverage-tiers.js +95 -0
- package/dist/core/insights/coverage-tiers.js.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
- package/dist/core/insights/experience-extractor.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
- package/dist/core/insights/experience-extractor.js.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
- package/dist/core/insights/violation-reporter.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
- package/dist/core/insights/violation-reporter.js.map +1 -0
- package/dist/core/loop/loop-engine.d.ts +140 -0
- package/dist/core/loop/loop-engine.d.ts.map +1 -0
- package/dist/core/loop/loop-engine.js +266 -0
- package/dist/core/loop/loop-engine.js.map +1 -0
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +2 -1
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +159 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +523 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codegraph-types.d.ts +79 -0
- package/dist/core/storage/codegraph-types.d.ts.map +1 -0
- package/dist/core/storage/codegraph-types.js +14 -0
- package/dist/core/storage/codegraph-types.js.map +1 -0
- package/dist/core/storage/codegraph.d.ts +186 -0
- package/dist/core/storage/codegraph.d.ts.map +1 -0
- package/dist/core/storage/codegraph.js +452 -0
- package/dist/core/storage/codegraph.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +30 -5
- package/dist/core/storage/decisions.d.ts.map +1 -1
- package/dist/core/storage/decisions.js +45 -13
- package/dist/core/storage/decisions.js.map +1 -1
- package/dist/core/storage/events.d.ts +127 -0
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +318 -3
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +3 -23
- package/dist/core/storage/feedback.d.ts.map +1 -1
- package/dist/core/storage/feedback.js +37 -38
- package/dist/core/storage/feedback.js.map +1 -1
- package/dist/core/storage/injections.d.ts +40 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +69 -0
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +226 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -1
- package/dist/core/storage/knowledge.js +391 -4
- package/dist/core/storage/knowledge.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +1 -7
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
- package/dist/core/storage/pipeline-rollup.js +18 -57
- package/dist/core/storage/pipeline-rollup.js.map +1 -1
- package/dist/core/storage/routing.d.ts +34 -0
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +92 -2
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +5 -25
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +92 -27
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +2 -1
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +159 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +350 -4
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +81 -25
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +143 -45
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +270 -0
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +495 -16
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +1 -1
- package/dist/core/storage/tool-intercepts.js +1 -1
- package/dist/core/types.d.ts +26 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/binary-paths.d.ts +32 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -1
- package/dist/core/utils/binary-paths.js +52 -0
- package/dist/core/utils/binary-paths.js.map +1 -1
- package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
- package/dist/core/utils/claude-cli-resolver.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
- package/dist/core/utils/claude-cli-spawn.js +2 -2
- package/dist/core/utils/claude-cli-spawn.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +1 -1
- package/dist/core/utils/noise-prompt.js +1 -1
- package/dist/core/utils/time.d.ts +26 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +33 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/config-store.d.ts.map +1 -1
- package/dist/daemon/config-store.js +14 -5
- package/dist/daemon/config-store.js.map +1 -1
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +5 -0
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +76 -116
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.js +71 -38
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +20 -0
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +96 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +16 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +97 -56
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
- package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
- package/dist/daemon/handlers/violation-content-backfill.js +167 -0
- package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
- package/dist/daemon/index.d.ts +19 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +125 -200
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts.map +1 -1
- package/dist/daemon/rules/defaults.js +151 -64
- package/dist/daemon/rules/defaults.js.map +1 -1
- package/dist/daemon/rules/types.d.ts +28 -22
- package/dist/daemon/rules/types.d.ts.map +1 -1
- package/dist/daemon/rules/workflow-defaults.js +9 -9
- package/dist/daemon/rules/workflow-defaults.js.map +1 -1
- package/dist/daemon/services/codegraph-sync.d.ts +94 -0
- package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
- package/dist/daemon/services/codegraph-sync.js +159 -0
- package/dist/daemon/services/codegraph-sync.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +47 -10
- package/dist/daemon/services/decision-hint.d.ts.map +1 -1
- package/dist/daemon/services/decision-hint.js +99 -24
- package/dist/daemon/services/decision-hint.js.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.js +3 -2
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
- package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
- package/dist/daemon/services/feedback-aggregator.js +23 -63
- package/dist/daemon/services/feedback-aggregator.js.map +1 -1
- package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
- package/dist/daemon/services/heartbeat-writer.js +7 -36
- package/dist/daemon/services/heartbeat-writer.js.map +1 -1
- package/dist/daemon/services/kb-injector.d.ts +1 -1
- package/dist/daemon/services/kb-injector.d.ts.map +1 -1
- package/dist/daemon/services/kb-injector.js +10 -2
- package/dist/daemon/services/kb-injector.js.map +1 -1
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
- package/dist/daemon/services/loop-hint.d.ts +139 -0
- package/dist/daemon/services/loop-hint.d.ts.map +1 -0
- package/dist/daemon/services/loop-hint.js +272 -0
- package/dist/daemon/services/loop-hint.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +1 -1
- package/dist/daemon/services/outcome-classification-service.js.map +1 -1
- package/dist/daemon/services/task-segmenter.d.ts +11 -0
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +48 -2
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
- package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
- package/dist/daemon/startup/maintenance-schedulers.js +294 -0
- package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
- package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
- package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
- package/dist/daemon/templates/agents/coder.md +165 -8
- package/dist/daemon/templates/agents/decision-maker.md +107 -21
- package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
- package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
- package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
- package/dist/daemon/templates/agents/patch-applier.md +1 -0
- package/dist/daemon/templates/agents/planner.md +55 -3
- package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
- package/dist/daemon/templates/agents/skill-distiller.md +1 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
- package/dist/daemon/templates/agents/verify-agent.md +128 -5
- package/dist/hooks/stop.sh +7 -1
- package/dist/knowledge/builder.js +36 -7
- package/dist/knowledge/builder.js.map +1 -1
- package/dist/knowledge/constants.d.ts +10 -5
- package/dist/knowledge/constants.d.ts.map +1 -1
- package/dist/knowledge/constants.js +10 -5
- package/dist/knowledge/constants.js.map +1 -1
- package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
- package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
- package/dist/knowledge/graph/edge-extractor.js +242 -0
- package/dist/knowledge/graph/edge-extractor.js.map +1 -0
- package/dist/knowledge/graph/impact.d.ts +73 -0
- package/dist/knowledge/graph/impact.d.ts.map +1 -0
- package/dist/knowledge/graph/impact.js +94 -0
- package/dist/knowledge/graph/impact.js.map +1 -0
- package/dist/knowledge/graph/types.d.ts +22 -0
- package/dist/knowledge/graph/types.d.ts.map +1 -0
- package/dist/knowledge/graph/types.js +13 -0
- package/dist/knowledge/graph/types.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +9 -0
- package/dist/knowledge/prompt.d.ts.map +1 -1
- package/dist/knowledge/prompt.js +17 -5
- package/dist/knowledge/prompt.js.map +1 -1
- package/dist/knowledge/query.d.ts +13 -0
- package/dist/knowledge/query.d.ts.map +1 -1
- package/dist/knowledge/query.js +107 -10
- package/dist/knowledge/query.js.map +1 -1
- package/dist/knowledge/repo-map.d.ts +11 -5
- package/dist/knowledge/repo-map.d.ts.map +1 -1
- package/dist/knowledge/repo-map.js +42 -3
- package/dist/knowledge/repo-map.js.map +1 -1
- package/dist/knowledge/validator.d.ts.map +1 -1
- package/dist/knowledge/validator.js +69 -2
- package/dist/knowledge/validator.js.map +1 -1
- package/dist/mcp/server.d.ts +64 -8
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +233 -18
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/distill/distiller.js +1 -1
- package/dist/skills/distill/distiller.js.map +1 -1
- package/dist/skills/distilled/distilled-api-design.md +4 -0
- package/dist/skills/distilled/distilled-brainstorming.md +79 -0
- package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
- package/dist/skills/distilled/distilled-canvas-design.md +128 -0
- package/dist/skills/distilled/distilled-claude-api.md +185 -0
- package/dist/skills/distilled/distilled-creator.md +5 -2
- package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
- package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
- package/dist/skills/distilled/distilled-docx.md +231 -0
- package/dist/skills/distilled/distilled-executing-plans.md +85 -50
- package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
- package/dist/skills/distilled/distilled-frontend-design.md +118 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
- package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
- package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
- package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
- package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
- package/dist/skills/distilled/distilled-writing-skills.md +175 -0
- package/dist/skills/registry.d.ts +10 -50
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +7 -118
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +2 -2
- package/dist/skills/tools/pipeline-suggest.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +2 -1
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +3 -1
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.js +6 -1
- package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts +6 -0
- package/dist/web/analytics/drift-detector.d.ts.map +1 -1
- package/dist/web/analytics/drift-detector.js +15 -8
- package/dist/web/analytics/drift-detector.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts +13 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +17 -3
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +31 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -1
- package/dist/web/routes/_helpers.js +33 -0
- package/dist/web/routes/_helpers.js.map +1 -1
- package/dist/web/routes/agent-distill.d.ts +49 -0
- package/dist/web/routes/agent-distill.d.ts.map +1 -0
- package/dist/web/routes/agent-distill.js +526 -0
- package/dist/web/routes/agent-distill.js.map +1 -0
- package/dist/web/routes/config.d.ts +56 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +243 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/decisions.js +1 -1
- package/dist/web/routes/decisions.js.map +1 -1
- package/dist/web/routes/error-handler.d.ts +0 -4
- package/dist/web/routes/error-handler.d.ts.map +1 -1
- package/dist/web/routes/error-handler.js +0 -8
- package/dist/web/routes/error-handler.js.map +1 -1
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +2 -1
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +0 -0
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +43 -2
- package/dist/web/routes/knowledge.d.ts.map +1 -1
- package/dist/web/routes/knowledge.js +117 -6
- package/dist/web/routes/knowledge.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +0 -9
- package/dist/web/routes/pipeline.d.ts.map +1 -1
- package/dist/web/routes/pipeline.js +0 -4
- package/dist/web/routes/pipeline.js.map +1 -1
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +20 -6
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +8 -7
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +153 -16
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills-distill.js +1 -1
- package/dist/web/routes/skills-distill.js.map +1 -1
- package/dist/web/routes/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +2 -1
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +95 -19
- package/dist/web/routes/task-timeline.d.ts.map +1 -1
- package/dist/web/routes/task-timeline.js +344 -88
- package/dist/web/routes/task-timeline.js.map +1 -1
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +52 -30
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/violations.d.ts +1 -1
- package/dist/web/routes/violations.d.ts.map +1 -1
- package/dist/web/routes/violations.js +3 -2
- package/dist/web/routes/violations.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +20 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/agent-distill-manager.d.ts +122 -0
- package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
- package/dist/web/services/agent-distill-manager.js +397 -0
- package/dist/web/services/agent-distill-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +47 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -1
- package/dist/web/services/distill-manager.js +103 -0
- package/dist/web/services/distill-manager.js.map +1 -1
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
- package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
- package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
- package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
- package/dist/web/static/assets/index-DileOOE4.js +4 -0
- package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
- package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
- package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
- package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
- package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
- package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
- package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
- package/dist/web/static/index.html +6 -6
- package/package.json +5 -3
- package/dist/core/storage/workflow-recommendations.d.ts +0 -124
- package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
- package/dist/core/storage/workflow-recommendations.js +0 -274
- package/dist/core/storage/workflow-recommendations.js.map +0 -1
- package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
- package/dist/daemon/services/experience-extractor.js.map +0 -1
- package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
- package/dist/daemon/services/violation-reporter.js.map +0 -1
- package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
- package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
- package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
- package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
- package/dist/skills/keyword-score.d.ts +0 -29
- package/dist/skills/keyword-score.d.ts.map +0 -1
- package/dist/skills/keyword-score.js +0 -54
- package/dist/skills/keyword-score.js.map +0 -1
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
- package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
- package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
- package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
- /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kb-rebuild-scheduler — daemon-side automatic KB index rebuild scheduling.
|
|
3
|
+
*
|
|
4
|
+
* Background (decision e888352d, full-link audit)
|
|
5
|
+
* -----------------------------------------------
|
|
6
|
+
* The full-link audit found the KB index can rot: `kb_build_log`'s last build
|
|
7
|
+
* was 20 days stale, and there was no auto-rebuild trigger — operators had to
|
|
8
|
+
* remember to run `cf knowledge build`. KB retrieval itself is healthy; the gap
|
|
9
|
+
* was a missing *schedule*.
|
|
10
|
+
*
|
|
11
|
+
* Design (minimal, reuse-first)
|
|
12
|
+
* -----------------------------
|
|
13
|
+
* Mirrors the established daemon maintenance pattern (event-ttl-sweep,
|
|
14
|
+
* codegraph-sync): a pure decision function consulted on a `setInterval`
|
|
15
|
+
* cadence under the shared maintenance mutex. No new cron, no fs.watch.
|
|
16
|
+
*
|
|
17
|
+
* Trigger strategy — staleness only (simplest correct signal):
|
|
18
|
+
* - Read the last `kb_build_log` row for the project via `queryLastKbBuild`.
|
|
19
|
+
* - If the last successful build is older than `kb.stale_threshold_days`
|
|
20
|
+
* (default 7), a rebuild is due.
|
|
21
|
+
* - If there is NO build log row at all, a rebuild is due (index never built).
|
|
22
|
+
* - A build currently `running` (per kb_build_log) is NOT re-triggered.
|
|
23
|
+
*
|
|
24
|
+
* The actual build is delegated to the existing `BuildManager` (single-instance
|
|
25
|
+
* concurrency control + kb_build_log telemetry already lives there). The daemon
|
|
26
|
+
* passes `triggerBuild` / `isBuildBusy` callbacks so this service keeps ZERO
|
|
27
|
+
* static edges into `src/web/` (BuildManager lives under web/, lazy-loaded).
|
|
28
|
+
*
|
|
29
|
+
* Fail-silent: every storage / trigger error is caught + logged at warn level.
|
|
30
|
+
* A scheduler hiccup must NEVER crash the daemon or block the maintenance loop.
|
|
31
|
+
*/
|
|
32
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
33
|
+
import type { KbBuildLogRow } from '../../core/storage/knowledge.js';
|
|
34
|
+
import type { ConfigStore } from '../config-store.js';
|
|
35
|
+
/** Config key: master on/off switch for auto-rebuild (default ON). */
|
|
36
|
+
export declare const CFG_AUTO_REBUILD_ENABLED = "kb.auto_rebuild_enabled";
|
|
37
|
+
/** Config key: staleness threshold in days before a rebuild is due. */
|
|
38
|
+
export declare const CFG_STALE_THRESHOLD_DAYS = "kb.stale_threshold_days";
|
|
39
|
+
/** Config key: how often the daemon checks for staleness (hours). */
|
|
40
|
+
export declare const CFG_CHECK_INTERVAL_HOURS = "kb.rebuild_check_interval_hours";
|
|
41
|
+
/** Built-in defaults. Conservative — 7d stale, checked every 6h. */
|
|
42
|
+
export declare const DEFAULTS: {
|
|
43
|
+
/** Master switch. Default ON so freshness is automatic out of the box. */
|
|
44
|
+
readonly enabled: true;
|
|
45
|
+
/** Rebuild when the last build is older than this many days. */
|
|
46
|
+
readonly staleThresholdDays: 7;
|
|
47
|
+
/** Cadence at which the daemon evaluates staleness. */
|
|
48
|
+
readonly checkIntervalHours: 6;
|
|
49
|
+
};
|
|
50
|
+
export interface RebuildConfig {
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
staleThresholdDays: number;
|
|
53
|
+
checkIntervalHours: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve effective rebuild config from forge_config > defaults. Exported for
|
|
57
|
+
* tests + daemon wiring.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveRebuildConfig(configStore: ConfigStore): RebuildConfig;
|
|
60
|
+
export type RebuildDecision = {
|
|
61
|
+
due: true;
|
|
62
|
+
reason: 'never-built' | 'stale';
|
|
63
|
+
} | {
|
|
64
|
+
due: false;
|
|
65
|
+
reason: 'disabled' | 'fresh' | 'in-progress';
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Pure decision: should the KB index be rebuilt now?
|
|
69
|
+
*
|
|
70
|
+
* @param lastBuild the most recent kb_build_log row for the project, or null.
|
|
71
|
+
* @param config resolved rebuild config.
|
|
72
|
+
* @param now current epoch ms (injectable for tests).
|
|
73
|
+
*/
|
|
74
|
+
export declare function decideRebuild(lastBuild: KbBuildLogRow | null, config: RebuildConfig, now?: number): RebuildDecision;
|
|
75
|
+
/** Side-effect callbacks the daemon wires to the (web-layer) BuildManager. */
|
|
76
|
+
export interface RebuildHooks {
|
|
77
|
+
/** True when a build is currently running (BuildManager.isBusy). */
|
|
78
|
+
isBuildBusy: () => boolean;
|
|
79
|
+
/** Kick off an apply-mode rebuild for `projectRoot`. May throw. */
|
|
80
|
+
triggerBuild: (projectRoot: string) => void;
|
|
81
|
+
}
|
|
82
|
+
export interface RebuildCheckResult {
|
|
83
|
+
decision: RebuildDecision;
|
|
84
|
+
/** True iff a build was actually kicked off this pass. */
|
|
85
|
+
triggered: boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Run one staleness check pass for `projectRoot`. Idempotent + fail-silent.
|
|
89
|
+
*
|
|
90
|
+
* Looks up the last build, applies `decideRebuild`, and — when due and no build
|
|
91
|
+
* is already running — invokes `hooks.triggerBuild`. Any error is swallowed
|
|
92
|
+
* (logged) so the maintenance loop is never disrupted.
|
|
93
|
+
*/
|
|
94
|
+
export declare function runKbRebuildCheck(storage: SQLiteStorage, configStore: ConfigStore, projectRoot: string, hooks: RebuildHooks, now?: number): RebuildCheckResult;
|
|
95
|
+
//# sourceMappingURL=kb-rebuild-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-rebuild-scheduler.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/kb-rebuild-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAE1E,oEAAoE;AACpE,eAAO,MAAM,QAAQ;IACnB,0EAA0E;;IAE1E,gEAAgE;;IAEhE,uDAAuD;;CAE/C,CAAC;AAIX,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAyBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,CAc5E;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAA;CAAE,GAC9C;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,aAAa,CAAA;CAAE,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,aAAa,GAAG,IAAI,EAC/B,MAAM,EAAE,aAAa,EACrB,GAAG,GAAE,MAAmB,GACvB,eAAe,CAejB;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,mEAAmE;IACnE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,GAAG,GAAE,MAAmB,GACvB,kBAAkB,CAuCpB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kb-rebuild-scheduler — daemon-side automatic KB index rebuild scheduling.
|
|
3
|
+
*
|
|
4
|
+
* Background (decision e888352d, full-link audit)
|
|
5
|
+
* -----------------------------------------------
|
|
6
|
+
* The full-link audit found the KB index can rot: `kb_build_log`'s last build
|
|
7
|
+
* was 20 days stale, and there was no auto-rebuild trigger — operators had to
|
|
8
|
+
* remember to run `cf knowledge build`. KB retrieval itself is healthy; the gap
|
|
9
|
+
* was a missing *schedule*.
|
|
10
|
+
*
|
|
11
|
+
* Design (minimal, reuse-first)
|
|
12
|
+
* -----------------------------
|
|
13
|
+
* Mirrors the established daemon maintenance pattern (event-ttl-sweep,
|
|
14
|
+
* codegraph-sync): a pure decision function consulted on a `setInterval`
|
|
15
|
+
* cadence under the shared maintenance mutex. No new cron, no fs.watch.
|
|
16
|
+
*
|
|
17
|
+
* Trigger strategy — staleness only (simplest correct signal):
|
|
18
|
+
* - Read the last `kb_build_log` row for the project via `queryLastKbBuild`.
|
|
19
|
+
* - If the last successful build is older than `kb.stale_threshold_days`
|
|
20
|
+
* (default 7), a rebuild is due.
|
|
21
|
+
* - If there is NO build log row at all, a rebuild is due (index never built).
|
|
22
|
+
* - A build currently `running` (per kb_build_log) is NOT re-triggered.
|
|
23
|
+
*
|
|
24
|
+
* The actual build is delegated to the existing `BuildManager` (single-instance
|
|
25
|
+
* concurrency control + kb_build_log telemetry already lives there). The daemon
|
|
26
|
+
* passes `triggerBuild` / `isBuildBusy` callbacks so this service keeps ZERO
|
|
27
|
+
* static edges into `src/web/` (BuildManager lives under web/, lazy-loaded).
|
|
28
|
+
*
|
|
29
|
+
* Fail-silent: every storage / trigger error is caught + logged at warn level.
|
|
30
|
+
* A scheduler hiccup must NEVER crash the daemon or block the maintenance loop.
|
|
31
|
+
*/
|
|
32
|
+
import { logger } from '../../core/utils/logger.js';
|
|
33
|
+
/** Config key: master on/off switch for auto-rebuild (default ON). */
|
|
34
|
+
export const CFG_AUTO_REBUILD_ENABLED = 'kb.auto_rebuild_enabled';
|
|
35
|
+
/** Config key: staleness threshold in days before a rebuild is due. */
|
|
36
|
+
export const CFG_STALE_THRESHOLD_DAYS = 'kb.stale_threshold_days';
|
|
37
|
+
/** Config key: how often the daemon checks for staleness (hours). */
|
|
38
|
+
export const CFG_CHECK_INTERVAL_HOURS = 'kb.rebuild_check_interval_hours';
|
|
39
|
+
/** Built-in defaults. Conservative — 7d stale, checked every 6h. */
|
|
40
|
+
export const DEFAULTS = {
|
|
41
|
+
/** Master switch. Default ON so freshness is automatic out of the box. */
|
|
42
|
+
enabled: true,
|
|
43
|
+
/** Rebuild when the last build is older than this many days. */
|
|
44
|
+
staleThresholdDays: 7,
|
|
45
|
+
/** Cadence at which the daemon evaluates staleness. */
|
|
46
|
+
checkIntervalHours: 6,
|
|
47
|
+
};
|
|
48
|
+
const MS_PER_DAY = 86_400_000;
|
|
49
|
+
/** Read a boolean from ConfigStore ('1'/'true'/'on' → true), else fallback. */
|
|
50
|
+
function readBoolConfig(configStore, key, fallback) {
|
|
51
|
+
const raw = configStore.get(key);
|
|
52
|
+
if (raw === undefined)
|
|
53
|
+
return fallback;
|
|
54
|
+
const v = raw.trim().toLowerCase();
|
|
55
|
+
if (v === '1' || v === 'true' || v === 'on' || v === 'yes')
|
|
56
|
+
return true;
|
|
57
|
+
if (v === '0' || v === 'false' || v === 'off' || v === 'no')
|
|
58
|
+
return false;
|
|
59
|
+
return fallback;
|
|
60
|
+
}
|
|
61
|
+
/** Read a positive number from ConfigStore, falling back on bad / missing input. */
|
|
62
|
+
function readPositiveNumberConfig(configStore, key, fallback) {
|
|
63
|
+
const raw = configStore.get(key);
|
|
64
|
+
if (raw === undefined)
|
|
65
|
+
return fallback;
|
|
66
|
+
const n = Number(raw);
|
|
67
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
68
|
+
return fallback;
|
|
69
|
+
return n;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve effective rebuild config from forge_config > defaults. Exported for
|
|
73
|
+
* tests + daemon wiring.
|
|
74
|
+
*/
|
|
75
|
+
export function resolveRebuildConfig(configStore) {
|
|
76
|
+
return {
|
|
77
|
+
enabled: readBoolConfig(configStore, CFG_AUTO_REBUILD_ENABLED, DEFAULTS.enabled),
|
|
78
|
+
staleThresholdDays: readPositiveNumberConfig(configStore, CFG_STALE_THRESHOLD_DAYS, DEFAULTS.staleThresholdDays),
|
|
79
|
+
checkIntervalHours: readPositiveNumberConfig(configStore, CFG_CHECK_INTERVAL_HOURS, DEFAULTS.checkIntervalHours),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pure decision: should the KB index be rebuilt now?
|
|
84
|
+
*
|
|
85
|
+
* @param lastBuild the most recent kb_build_log row for the project, or null.
|
|
86
|
+
* @param config resolved rebuild config.
|
|
87
|
+
* @param now current epoch ms (injectable for tests).
|
|
88
|
+
*/
|
|
89
|
+
export function decideRebuild(lastBuild, config, now = Date.now()) {
|
|
90
|
+
if (!config.enabled)
|
|
91
|
+
return { due: false, reason: 'disabled' };
|
|
92
|
+
// Never built → always due (no index to drift from, but nothing to query either).
|
|
93
|
+
if (!lastBuild)
|
|
94
|
+
return { due: true, reason: 'never-built' };
|
|
95
|
+
// A build already in flight — don't pile on. The BuildManager also guards
|
|
96
|
+
// concurrency, but short-circuiting here avoids a redundant trigger attempt.
|
|
97
|
+
if (lastBuild.status === 'running')
|
|
98
|
+
return { due: false, reason: 'in-progress' };
|
|
99
|
+
const ageMs = now - lastBuild.ts;
|
|
100
|
+
const thresholdMs = config.staleThresholdDays * MS_PER_DAY;
|
|
101
|
+
if (ageMs >= thresholdMs)
|
|
102
|
+
return { due: true, reason: 'stale' };
|
|
103
|
+
return { due: false, reason: 'fresh' };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Run one staleness check pass for `projectRoot`. Idempotent + fail-silent.
|
|
107
|
+
*
|
|
108
|
+
* Looks up the last build, applies `decideRebuild`, and — when due and no build
|
|
109
|
+
* is already running — invokes `hooks.triggerBuild`. Any error is swallowed
|
|
110
|
+
* (logged) so the maintenance loop is never disrupted.
|
|
111
|
+
*/
|
|
112
|
+
export function runKbRebuildCheck(storage, configStore, projectRoot, hooks, now = Date.now()) {
|
|
113
|
+
const config = resolveRebuildConfig(configStore);
|
|
114
|
+
let lastBuild = null;
|
|
115
|
+
try {
|
|
116
|
+
lastBuild = storage.queryLastKbBuild(projectRoot);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger.warn(`[kb-rebuild] queryLastKbBuild failed: ${err}`);
|
|
120
|
+
return { decision: { due: false, reason: 'fresh' }, triggered: false };
|
|
121
|
+
}
|
|
122
|
+
const decision = decideRebuild(lastBuild, config, now);
|
|
123
|
+
if (!decision.due) {
|
|
124
|
+
return { decision, triggered: false };
|
|
125
|
+
}
|
|
126
|
+
// Double-guard against an in-flight build the kb_build_log row may not yet
|
|
127
|
+
// reflect (e.g. a manual `cf knowledge build` running this instant).
|
|
128
|
+
let busy = false;
|
|
129
|
+
try {
|
|
130
|
+
busy = hooks.isBuildBusy();
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
logger.warn(`[kb-rebuild] isBuildBusy probe failed: ${err}`);
|
|
134
|
+
}
|
|
135
|
+
if (busy) {
|
|
136
|
+
return { decision, triggered: false };
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
hooks.triggerBuild(projectRoot);
|
|
140
|
+
logger.info(`[kb-rebuild] triggered auto-rebuild for ${projectRoot} (reason: ${decision.reason})`);
|
|
141
|
+
return { decision, triggered: true };
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
// fail-silent: a failed trigger must not crash the daemon.
|
|
145
|
+
logger.warn(`[kb-rebuild] triggerBuild failed for ${projectRoot}: ${err}`);
|
|
146
|
+
return { decision, triggered: false };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=kb-rebuild-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-rebuild-scheduler.js","sourceRoot":"","sources":["../../../src/daemon/services/kb-rebuild-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LoopHint — formats the advisory `[LOOP HINT]` systemMessage the daemon emits
|
|
3
|
+
* when a prompt looks like one of the 3 whitelisted loop-suitable scenarios.
|
|
4
|
+
*
|
|
5
|
+
* decision e7d13697 (2026-06-11, Option C — approved):
|
|
6
|
+
* The user wants the freshly-landed goal-convergence loop (`cf loop run`,
|
|
7
|
+
* governance §10) SUGGESTED automatically in matching scenarios — but as an
|
|
8
|
+
* ADVISORY hint only, never auto-run / never auto-spawn. This mirrors the
|
|
9
|
+
* existing `[DECISION HINT]` advisory pattern (services/decision-hint.ts):
|
|
10
|
+
* the daemon mints a systemMessage, the main thread still gates with a human
|
|
11
|
+
* review before entering a loop.
|
|
12
|
+
*
|
|
13
|
+
* Why advisory-only (core-belief «daemon 永不对主线程加硬约束新智能»):
|
|
14
|
+
* This service produces TEXT and (optionally) a telemetry row. It NEVER calls
|
|
15
|
+
* `cf loop run`, never spawns an agent, never denies. The "should we loop?"
|
|
16
|
+
* judgement stays with the main thread.
|
|
17
|
+
*
|
|
18
|
+
* Conservative-by-design (decision OQ2 hard constraint + fe6f98cd/KB
|
|
19
|
+
* low-adoption history): we only mint for prompts we are confident fall into a
|
|
20
|
+
* whitelisted scenario WITH a clean machine-judgeable PASS criterion. Open-ended
|
|
21
|
+
* tasks with no clean PASS are excluded — they would oscillate / loop forever.
|
|
22
|
+
* Better to under-mint than to spam.
|
|
23
|
+
*
|
|
24
|
+
* Fail-safe: every entry point catches its own errors and returns null; the
|
|
25
|
+
* UserPromptSubmit pipeline keeps running.
|
|
26
|
+
*/
|
|
27
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
28
|
+
/**
|
|
29
|
+
* forge_config key gating `[LOOP HINT]` minting. Default `true` (the user
|
|
30
|
+
* opted in via decision e7d13697). Set to `false` to suppress the hint without
|
|
31
|
+
* a code change (reversibility — decision Triage: all of A/B/C reversible).
|
|
32
|
+
*
|
|
33
|
+
* Seeded by `seedLoopConfig` (src/cli/commands/loop.ts) alongside the other
|
|
34
|
+
* `loop.*` keys, so a fresh install gets the default.
|
|
35
|
+
*/
|
|
36
|
+
export declare const LOOP_HINT_ENABLED_CONFIG_KEY = "loop.hint_enabled";
|
|
37
|
+
/** Default when the key is absent (user opted in). */
|
|
38
|
+
export declare const DEFAULT_LOOP_HINT_ENABLED = true;
|
|
39
|
+
/**
|
|
40
|
+
* source_handler tag for the telemetry injection row (decision OQ5).
|
|
41
|
+
*
|
|
42
|
+
* Mirrors the KB-adoption precedent (decision 148f7a0a): KB injections are
|
|
43
|
+
* tagged `UserPromptSubmitHandler:kb` and stamped `adopted_at` when the session
|
|
44
|
+
* later actively uses the injected knowledge. We reuse the SAME `injections`
|
|
45
|
+
* table + `adopted_at` mechanism: a `[LOOP HINT]` mint writes one row with this
|
|
46
|
+
* tag; PostToolUse stamps `adopted_at` when the session later runs `cf loop run`
|
|
47
|
+
* (the observable "the hint was adopted" signal). See
|
|
48
|
+
* src/core/storage/injections.ts writeLoopHintAdoption / countLoopHintAdoption.
|
|
49
|
+
*/
|
|
50
|
+
export declare const LOOP_HINT_SOURCE_HANDLER = "UserPromptSubmitHandler:loop-hint";
|
|
51
|
+
/** The 3 whitelisted scenarios (decision resolved scope). */
|
|
52
|
+
export type LoopScenario = 'bug-fix' | 'test-lint-green' | 'spec-impl';
|
|
53
|
+
/**
|
|
54
|
+
* Result of `classifyLoopScenario`. `null` when no whitelist scenario matched
|
|
55
|
+
* (the common case — most prompts are not loop-suitable).
|
|
56
|
+
*/
|
|
57
|
+
export interface LoopScenarioMatch {
|
|
58
|
+
scenario: LoopScenario;
|
|
59
|
+
/** Human-readable label for the hint body. */
|
|
60
|
+
label: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Conservative scenario classifier (decision OQ2).
|
|
64
|
+
*
|
|
65
|
+
* Returns the matched whitelist scenario, or `null` to mint nothing. Precision
|
|
66
|
+
* is favoured over recall: a prompt must clearly carry BOTH an action signal
|
|
67
|
+
* AND a subject/PASS signal for its scenario, and must NOT look open-ended.
|
|
68
|
+
*
|
|
69
|
+
* Order of checks:
|
|
70
|
+
* 0. Empty / system-generated / skip-decision → null (never classify).
|
|
71
|
+
* 1. Open-ended exclusion → null (vague tasks with no clean PASS).
|
|
72
|
+
* 2. Scenario-1 bug-fix.
|
|
73
|
+
* 3. Scenario-2 test/lint green.
|
|
74
|
+
* 4. Scenario-3 spec implementation (requires an explicit PASS-criterion or
|
|
75
|
+
* spec reference so "implement a button" doesn't mint).
|
|
76
|
+
*
|
|
77
|
+
* Pure function (no I/O) so it is trivially unit-testable.
|
|
78
|
+
*/
|
|
79
|
+
export declare function classifyLoopScenario(prompt: string): LoopScenarioMatch | null;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve whether `[LOOP HINT]` minting is enabled from forge_config.
|
|
82
|
+
*
|
|
83
|
+
* Default `true` (user opted in). Any value other than the literal `'false'`
|
|
84
|
+
* (case-insensitive, trimmed) is treated as enabled, matching the lenient
|
|
85
|
+
* coercion used elsewhere (the key is seeded as the string `'false'`/`'true'`).
|
|
86
|
+
* Fail-silent: on any storage error, fall back to the default.
|
|
87
|
+
*/
|
|
88
|
+
export declare function resolveLoopHintEnabled(storage?: SQLiteStorage | null): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Result returned by `emitLoopHintSimple` when a hint is generated.
|
|
91
|
+
*/
|
|
92
|
+
export interface LoopHintResult {
|
|
93
|
+
/** The `[LOOP HINT]` text to include in systemMessage. */
|
|
94
|
+
message: string;
|
|
95
|
+
/** The matched scenario (for logging / tests). */
|
|
96
|
+
scenario: LoopScenario;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Main entry point — decides whether to emit a `[LOOP HINT]` for this prompt
|
|
100
|
+
* and (when it does) writes the adoption-telemetry injection row.
|
|
101
|
+
*
|
|
102
|
+
* Guards (in order):
|
|
103
|
+
* 1. `loop.hint_enabled = false` → null (config gate, reversible).
|
|
104
|
+
* 2. scenario classifier returns null → null (not loop-suitable).
|
|
105
|
+
*
|
|
106
|
+
* When it mints:
|
|
107
|
+
* • Writes ONE `injections` row tagged LOOP_HINT_SOURCE_HANDLER (fail-silent)
|
|
108
|
+
* so adoption can later be measured (PostToolUse stamps `adopted_at` when
|
|
109
|
+
* the session runs `cf loop run`). Without this landing point we could not
|
|
110
|
+
* judge keep-vs-remove — the whole reason Option C was chosen over D.
|
|
111
|
+
* • Returns `{ message, scenario }`. The handler pushes `message` into
|
|
112
|
+
* systemParts; it is ADVISORY text with zero side effects beyond the row.
|
|
113
|
+
*
|
|
114
|
+
* Coexistence with `[DECISION HINT]` (decision guardrail): this is ADDITIVE and
|
|
115
|
+
* SECONDARY. A prompt can be both decision-worthy and loop-suitable; the loop
|
|
116
|
+
* hint is appended as its own section and never suppresses / replaces the
|
|
117
|
+
* decision hint. The decision hint stays the primary "spawn decision-maker"
|
|
118
|
+
* directive; the loop hint just additionally suggests the loop pattern.
|
|
119
|
+
*
|
|
120
|
+
* @param prompt - The raw user prompt text.
|
|
121
|
+
* @param storage - Optional SQLiteStorage (config gate + telemetry row).
|
|
122
|
+
* @param eventContext - Optional event fields for the telemetry row.
|
|
123
|
+
*/
|
|
124
|
+
export declare function emitLoopHintSimple(prompt: string, storage?: SQLiteStorage | null, eventContext?: {
|
|
125
|
+
session_id: string;
|
|
126
|
+
project_path: string;
|
|
127
|
+
event_id?: string;
|
|
128
|
+
timestamp?: string;
|
|
129
|
+
} | null): LoopHintResult | null;
|
|
130
|
+
/**
|
|
131
|
+
* Formats the `[LOOP HINT]` body. Kept separate for unit-test readability and
|
|
132
|
+
* to mirror `formatHintMessage` in decision-hint.ts.
|
|
133
|
+
*
|
|
134
|
+
* The body: names the matched scenario, suggests the loop-until-verify-PASS
|
|
135
|
+
* pattern (`cf loop run` / governance §10), and makes explicit that the main
|
|
136
|
+
* thread should still GATE at the start (human review — never auto-run).
|
|
137
|
+
*/
|
|
138
|
+
export declare function formatLoopHintMessage(match: LoopScenarioMatch, intentSummary: string): string;
|
|
139
|
+
//# sourceMappingURL=loop-hint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-hint.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/loop-hint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAMlE;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,sDAAsD;AACtD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAK5E,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAC;AA8DvE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA2C7E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAS9E;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,EAC9B,YAAY,CAAC,EAAE;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,GACP,cAAc,GAAG,IAAI,CAoCvB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAcR"}
|