@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
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
* wiring and existing test files stay valid.
|
|
18
18
|
*/
|
|
19
19
|
import { logger } from '../../core/utils/logger.js';
|
|
20
|
-
import {
|
|
21
|
-
import { truncateString } from '../../core/utils/format.js';
|
|
20
|
+
import { classifyPromptKind } from '../../core/utils/noise-prompt.js';
|
|
22
21
|
import { ContextInjector } from '../services/context-injector.js';
|
|
23
22
|
import { KbInjector } from '../services/kb-injector.js';
|
|
24
23
|
import { SpecGate } from '../services/spec-gate.js';
|
|
25
24
|
import { emitDecisionHintSimple, resolveTriggerLen } from '../services/decision-hint.js';
|
|
25
|
+
import { emitLoopHintSimple } from '../services/loop-hint.js';
|
|
26
26
|
import { OutcomeNudgeService } from '../services/outcome-nudge.js';
|
|
27
27
|
export class UserPromptHandler {
|
|
28
28
|
resume;
|
|
@@ -40,7 +40,15 @@ export class UserPromptHandler {
|
|
|
40
40
|
* reference. Public so StopHandler can reach it without new ctor wiring.
|
|
41
41
|
*/
|
|
42
42
|
outcomeNudge = new OutcomeNudgeService();
|
|
43
|
-
constructor(resume = null, conventionExtractor = null, storage = null,
|
|
43
|
+
constructor(resume = null, conventionExtractor = null, storage = null,
|
|
44
|
+
/**
|
|
45
|
+
* @deprecated Skill push routing was removed (skills are pull-only via
|
|
46
|
+
* MCP `skill-list` / `skill-invoke`); this handler never reads the
|
|
47
|
+
* registry anymore. The positional parameter is kept only for API
|
|
48
|
+
* compatibility with existing daemon/index.ts wiring and tests
|
|
49
|
+
* (decision ed98c8e8, 2026-06-10).
|
|
50
|
+
*/
|
|
51
|
+
skillRegistry = null,
|
|
44
52
|
/**
|
|
45
53
|
* v9.x Phase 2b — backing store for approve-token short-circuit (step 0).
|
|
46
54
|
* When null, step 0 is skipped (`approve <token>` falls through).
|
|
@@ -79,8 +87,19 @@ export class UserPromptHandler {
|
|
|
79
87
|
// 1. Resume + convention (once per session, owned by ContextInjector).
|
|
80
88
|
this.contextInjector.injectOnce(event, sessionKey, contextParts);
|
|
81
89
|
// 2. KB injection — keyword query against .forge-knowledge/.
|
|
90
|
+
//
|
|
91
|
+
// Eligibility gate (decision d08da374): KB inject previously ran BEFORE
|
|
92
|
+
// any noise/length check (unlike the skill path which had its own
|
|
93
|
+
// isAgentCallbackPrompt guard), so it fired on `<task-notification>`
|
|
94
|
+
// envelopes, sub-8-char prompts, and bare acks — exactly the rows the
|
|
95
|
+
// web "eligible" denominator (SKILL_WORTHY_SQL in routing.ts) excludes.
|
|
96
|
+
// Mirroring that predicate here aligns the injection numerator with the
|
|
97
|
+
// metric denominator: KB only injects on a code-relevant prompt.
|
|
98
|
+
//
|
|
82
99
|
// Failure modes (silently skipped, never break the prompt path).
|
|
83
|
-
const kbResult =
|
|
100
|
+
const kbResult = isKbEligiblePrompt(prompt)
|
|
101
|
+
? await this.kbInjector.inject(event, prompt, [])
|
|
102
|
+
: { block: null, hits: [] };
|
|
84
103
|
if (kbResult.block) {
|
|
85
104
|
contextParts.unshift(kbResult.block);
|
|
86
105
|
logger.info(`[UserPrompt] Injected KB context: ${kbResult.hits.length} page(s), scores=[${kbResult.hits
|
|
@@ -125,6 +144,31 @@ export class UserPromptHandler {
|
|
|
125
144
|
catch (err) {
|
|
126
145
|
logger.warn(`[UserPrompt] Decision hint failed (skipped): ${err}`);
|
|
127
146
|
}
|
|
147
|
+
// 3.4. Loop hint (decision e7d13697, Option C — advisory only).
|
|
148
|
+
// When the prompt looks like one of the 3 whitelisted loop-suitable
|
|
149
|
+
// scenarios (bug-fix / test-lint green / spec impl with a clean PASS
|
|
150
|
+
// criterion), mint an ADVISORY [LOOP HINT] suggesting the loop-until-
|
|
151
|
+
// verify-PASS pattern. ADDITIVE + SECONDARY to the decision hint above:
|
|
152
|
+
// both can fire for the same prompt; the loop hint never suppresses /
|
|
153
|
+
// replaces the decision hint. Zero auto-execution — the daemon NEVER
|
|
154
|
+
// calls `cf loop run`; the main thread still gates with a human review.
|
|
155
|
+
// Gated behind `loop.hint_enabled` (default true); telemetry row written
|
|
156
|
+
// on mint so adoption can later be measured (see services/loop-hint.ts).
|
|
157
|
+
try {
|
|
158
|
+
const loopHint = emitLoopHintSimple(prompt, this.storage, {
|
|
159
|
+
session_id: event.session_id,
|
|
160
|
+
project_path: event.project_path,
|
|
161
|
+
event_id: event.event_id,
|
|
162
|
+
timestamp: event.timestamp,
|
|
163
|
+
});
|
|
164
|
+
if (loopHint) {
|
|
165
|
+
systemParts.push(loopHint.message);
|
|
166
|
+
logger.info(`[UserPrompt] Loop hint emitted: scenario=${loopHint.scenario}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
logger.warn(`[UserPrompt] Loop hint failed (skipped): ${err}`);
|
|
171
|
+
}
|
|
128
172
|
// 3.5. outcome-backfill soft-gate (decision 1ac6fc31). Independent
|
|
129
173
|
// `[OUTCOME NUDGE]` section (NOT merged into the decision hint) reminding
|
|
130
174
|
// the main thread / implementing agent to back-fill outcomes for resolved
|
|
@@ -142,51 +186,16 @@ export class UserPromptHandler {
|
|
|
142
186
|
catch (err) {
|
|
143
187
|
logger.warn(`[UserPrompt] Outcome nudge failed (skipped): ${err}`);
|
|
144
188
|
}
|
|
145
|
-
// 4. Skill injection —
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
logger.info(`[UserPrompt] Skill matched: ${skill.id} (${source})`);
|
|
156
|
-
if (this.storage) {
|
|
157
|
-
try {
|
|
158
|
-
this.storage.writeSkillInvocation({
|
|
159
|
-
id: randomUUID(),
|
|
160
|
-
route_request_id: null,
|
|
161
|
-
session_id: event.session_id,
|
|
162
|
-
agent_id: null,
|
|
163
|
-
skill_id: skill.id,
|
|
164
|
-
invocation_type: 'dynamic',
|
|
165
|
-
reason: `Auto-matched by ${source} matching`,
|
|
166
|
-
workflow: null,
|
|
167
|
-
phase: null,
|
|
168
|
-
feature_slug: null,
|
|
169
|
-
artifact_path: null,
|
|
170
|
-
depth: 0,
|
|
171
|
-
success: 1,
|
|
172
|
-
error: null,
|
|
173
|
-
timestamp: Date.now(),
|
|
174
|
-
});
|
|
175
|
-
logger.debug(`[UserPrompt] Recorded skill invocation: ${skill.id}`);
|
|
176
|
-
}
|
|
177
|
-
catch (err) {
|
|
178
|
-
logger.warn(`[UserPrompt] Failed to record skill invocation: ${err}`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
logger.debug(`[UserPrompt] No skill matched for prompt: "${truncateString(prompt, 80)}"`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
catch (err) {
|
|
187
|
-
logger.warn(`[UserPrompt] Skill matching failed: ${err}`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
189
|
+
// 4. Skill injection — REMOVED (decision d08da374).
|
|
190
|
+
//
|
|
191
|
+
// The main-thread UserPromptSubmit auto-match skill injection was retired:
|
|
192
|
+
// live evidence showed 515 injections vs 7 genuine Skill invocations in
|
|
193
|
+
// all history, 0 in the last 13 days, and a 1.3% follow-through — it is
|
|
194
|
+
// redundant with the agent-delegation protocol (agents invoke `Skill` on
|
|
195
|
+
// demand via mcp__claude-forge__skill_invoke, which is the ONLY path that
|
|
196
|
+
// still records skill_invocations — see src/skills/tools/skill-invoke.ts).
|
|
197
|
+
// The inject-time `writeSkillInvocation({ recorded_at_inject: 1 })` call
|
|
198
|
+
// and `formatSkillDirective` systemMessage are gone with it.
|
|
190
199
|
const result = { allow: true };
|
|
191
200
|
if (contextParts.length > 0)
|
|
192
201
|
result.additionalContext = contextParts.join('\n\n');
|
|
@@ -239,13 +248,45 @@ export class UserPromptHandler {
|
|
|
239
248
|
}
|
|
240
249
|
// ── Module-private helpers ────────────────────────────────────────────────
|
|
241
250
|
/**
|
|
242
|
-
*
|
|
251
|
+
* ACK / continuation keywords mirroring task-segmenter.ts ACK_CONTINUE_KEYWORDS
|
|
252
|
+
* and the routing.ts SKILL_WORTHY_SQL predicate. Kept in sync manually (the
|
|
253
|
+
* SQL form cannot import TS); when either list changes, update both.
|
|
243
254
|
*/
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
255
|
+
const ACK_CONTINUE_KEYWORDS = [
|
|
256
|
+
'继续', '然后', '还有', '另外', '好的', '可以', '是的', '批准', '同意',
|
|
257
|
+
'ok', 'yes', 'continue',
|
|
258
|
+
];
|
|
259
|
+
/** Max trimmed length for a prompt to count as a pure ack (mirrors ACK_MAX_LEN). */
|
|
260
|
+
const ACK_MAX_LEN = 16;
|
|
261
|
+
/** Min trimmed length for a prompt to be "skill-worthy" (mirrors SKILL_WORTHY_SQL). */
|
|
262
|
+
const MIN_ELIGIBLE_LEN = 8;
|
|
263
|
+
/**
|
|
264
|
+
* KB-injection eligibility gate (decision d08da374).
|
|
265
|
+
*
|
|
266
|
+
* Returns false for prompts the web "eligible" denominator excludes
|
|
267
|
+
* (SKILL_WORTHY_SQL in core/storage/routing.ts), so the KB-injection numerator
|
|
268
|
+
* lines up with that denominator. A prompt is INELIGIBLE when it is:
|
|
269
|
+
* 1. a framework / agent-callback envelope (classifyPromptKind !== 'user') —
|
|
270
|
+
* `<task-notification>`, `<system-reminder>`, `[Image #N]`, etc.;
|
|
271
|
+
* 2. too short — trimmed length < 8 (chit-chat / single token);
|
|
272
|
+
* 3. a pure ack / continuation — trimmed length ≤ 16 AND contains an
|
|
273
|
+
* ACK_CONTINUE keyword ("好的" / "继续" / "批准" / "ok" / "yes" / …).
|
|
274
|
+
*
|
|
275
|
+
* Mirrors routing.ts's SQL predicate so the injection path and the metric stay
|
|
276
|
+
* on the same definition of "code-relevant prompt".
|
|
277
|
+
*/
|
|
278
|
+
function isKbEligiblePrompt(prompt) {
|
|
279
|
+
if (classifyPromptKind(prompt) !== 'user')
|
|
280
|
+
return false;
|
|
281
|
+
const trimmed = prompt.trim();
|
|
282
|
+
if (trimmed.length < MIN_ELIGIBLE_LEN)
|
|
283
|
+
return false;
|
|
284
|
+
if (trimmed.length <= ACK_MAX_LEN) {
|
|
285
|
+
const lower = trimmed.toLowerCase();
|
|
286
|
+
if (ACK_CONTINUE_KEYWORDS.some((kw) => lower.includes(kw.toLowerCase()))) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return true;
|
|
250
291
|
}
|
|
251
292
|
//# sourceMappingURL=user-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Violation-content backfill (spec 1446 / decision 0df5271f).
|
|
3
|
+
*
|
|
4
|
+
* When the main thread VIOLATES (inline Edit/Write that should have spawned an
|
|
5
|
+
* agent), its tool ACTIONS are already in the events table but its natural-
|
|
6
|
+
* language output (reasoning / inline content) was never recorded. At Stop we
|
|
7
|
+
* read the session transcript JSONL, extract the assistant text generated DURING
|
|
8
|
+
* violation windows, and backfill it (PLAIN TEXT) into `events.ai_response` on
|
|
9
|
+
* the earliest inline-edit row of each window.
|
|
10
|
+
*
|
|
11
|
+
* Core-belief invariant (core-beliefs.md): this is PURELY passive recording.
|
|
12
|
+
* daemon / classifiers / loop NEVER read ai_response to auto-mint rules, change
|
|
13
|
+
* routing, or add intercepts.
|
|
14
|
+
*
|
|
15
|
+
* Transcript JSONL schema (verified against a real Claude Code transcript,
|
|
16
|
+
* 2026-06-17 — file ~/.claude/projects/<...>/<session>.jsonl):
|
|
17
|
+
* - top-level `type === 'assistant'`
|
|
18
|
+
* - `timestamp` — ISO string (e.g. "2026-06-17T01:47:40.838Z")
|
|
19
|
+
* - `isSidechain` — true for subagent (Task) turns; we SKIP those so
|
|
20
|
+
* only MAIN-THREAD assistant text is captured
|
|
21
|
+
* (subagent output is recorded separately).
|
|
22
|
+
* - `message.content[]` — array of blocks; we keep only `type === 'text'`
|
|
23
|
+
* `.text` (skip `thinking` / `tool_use` /
|
|
24
|
+
* `tool_result`).
|
|
25
|
+
* Parsing is DEFENSIVE: any missing/mistyped field → skip that line, never throw.
|
|
26
|
+
*/
|
|
27
|
+
import type { Violation } from '../../core/insights/violation-reporter.js';
|
|
28
|
+
/** Merge violations whose timestamps are within this many minutes into one window. */
|
|
29
|
+
export declare const WINDOW_GAP_MIN = 10;
|
|
30
|
+
/** Padding (seconds) on each side of a window to tolerate hook↔transcript ts skew. */
|
|
31
|
+
export declare const PRE_PAD_SEC = 60;
|
|
32
|
+
export declare const POST_PAD_SEC = 60;
|
|
33
|
+
/** Cumulative byte ceiling read from the transcript before bailing out. */
|
|
34
|
+
export declare const MAX_TRANSCRIPT_BYTES: number;
|
|
35
|
+
/** Separator between assistant turns when joining a window's text. */
|
|
36
|
+
export declare const TURN_SEPARATOR = "\n\n---\n\n";
|
|
37
|
+
export interface ViolationWindow {
|
|
38
|
+
/** ISO lower bound (already padded). */
|
|
39
|
+
startIso: string;
|
|
40
|
+
/** ISO upper bound (already padded). */
|
|
41
|
+
endIso: string;
|
|
42
|
+
/** Unpadded earliest violation ts (for locating the inline-edit row). */
|
|
43
|
+
rawStartIso: string;
|
|
44
|
+
/** Unpadded latest violation ts. */
|
|
45
|
+
rawEndIso: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Merge a violation list's timestamps into padded time windows. Violations
|
|
49
|
+
* within WINDOW_GAP_MIN of each other collapse into one window. PRE/POST
|
|
50
|
+
* padding is applied to the merged bounds for transcript-turn alignment.
|
|
51
|
+
*/
|
|
52
|
+
export declare function mergeViolationWindows(violations: Violation[]): ViolationWindow[];
|
|
53
|
+
/** One extracted main-thread assistant turn from the transcript. */
|
|
54
|
+
export interface AssistantTurn {
|
|
55
|
+
ts: number;
|
|
56
|
+
text: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Defensively extract a main-thread assistant text turn from one parsed JSONL
|
|
60
|
+
* object, or null if the line is not a usable main-thread assistant text turn.
|
|
61
|
+
* Exported for unit testing of the defensive-parse contract.
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractAssistantTurn(obj: unknown): AssistantTurn | null;
|
|
64
|
+
/**
|
|
65
|
+
* Stream-read a transcript JSONL file and return main-thread assistant turns
|
|
66
|
+
* whose timestamp falls within ANY of the given windows. Streaming + byte cap
|
|
67
|
+
* guard against pathologically large transcripts. Never throws — file/parse
|
|
68
|
+
* errors resolve to whatever was collected so far (possibly empty).
|
|
69
|
+
*/
|
|
70
|
+
export declare function readAssistantTurnsInWindows(transcriptPath: string, windows: ViolationWindow[]): Promise<AssistantTurn[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Join a window's assistant turns into the single ai_response string written to
|
|
73
|
+
* the window's earliest inline-edit row. Preserves time order, separates turns.
|
|
74
|
+
*/
|
|
75
|
+
export declare function joinWindowText(turns: AssistantTurn[]): string;
|
|
76
|
+
//# sourceMappingURL=violation-content-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-content-backfill.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/violation-content-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAE3E,sFAAsF;AACtF,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,sFAAsF;AACtF,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,QAAkB,CAAC;AACpD,sEAAsE;AACtE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CA6BhF;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA2BvE;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,eAAe,EAAE,GACzB,OAAO,CAAC,aAAa,EAAE,CAAC,CA2C1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Violation-content backfill (spec 1446 / decision 0df5271f).
|
|
3
|
+
*
|
|
4
|
+
* When the main thread VIOLATES (inline Edit/Write that should have spawned an
|
|
5
|
+
* agent), its tool ACTIONS are already in the events table but its natural-
|
|
6
|
+
* language output (reasoning / inline content) was never recorded. At Stop we
|
|
7
|
+
* read the session transcript JSONL, extract the assistant text generated DURING
|
|
8
|
+
* violation windows, and backfill it (PLAIN TEXT) into `events.ai_response` on
|
|
9
|
+
* the earliest inline-edit row of each window.
|
|
10
|
+
*
|
|
11
|
+
* Core-belief invariant (core-beliefs.md): this is PURELY passive recording.
|
|
12
|
+
* daemon / classifiers / loop NEVER read ai_response to auto-mint rules, change
|
|
13
|
+
* routing, or add intercepts.
|
|
14
|
+
*
|
|
15
|
+
* Transcript JSONL schema (verified against a real Claude Code transcript,
|
|
16
|
+
* 2026-06-17 — file ~/.claude/projects/<...>/<session>.jsonl):
|
|
17
|
+
* - top-level `type === 'assistant'`
|
|
18
|
+
* - `timestamp` — ISO string (e.g. "2026-06-17T01:47:40.838Z")
|
|
19
|
+
* - `isSidechain` — true for subagent (Task) turns; we SKIP those so
|
|
20
|
+
* only MAIN-THREAD assistant text is captured
|
|
21
|
+
* (subagent output is recorded separately).
|
|
22
|
+
* - `message.content[]` — array of blocks; we keep only `type === 'text'`
|
|
23
|
+
* `.text` (skip `thinking` / `tool_use` /
|
|
24
|
+
* `tool_result`).
|
|
25
|
+
* Parsing is DEFENSIVE: any missing/mistyped field → skip that line, never throw.
|
|
26
|
+
*/
|
|
27
|
+
import { createReadStream } from 'node:fs';
|
|
28
|
+
import { createInterface } from 'node:readline';
|
|
29
|
+
/** Merge violations whose timestamps are within this many minutes into one window. */
|
|
30
|
+
export const WINDOW_GAP_MIN = 10;
|
|
31
|
+
/** Padding (seconds) on each side of a window to tolerate hook↔transcript ts skew. */
|
|
32
|
+
export const PRE_PAD_SEC = 60;
|
|
33
|
+
export const POST_PAD_SEC = 60;
|
|
34
|
+
/** Cumulative byte ceiling read from the transcript before bailing out. */
|
|
35
|
+
export const MAX_TRANSCRIPT_BYTES = 5 * 1024 * 1024;
|
|
36
|
+
/** Separator between assistant turns when joining a window's text. */
|
|
37
|
+
export const TURN_SEPARATOR = '\n\n---\n\n';
|
|
38
|
+
/**
|
|
39
|
+
* Merge a violation list's timestamps into padded time windows. Violations
|
|
40
|
+
* within WINDOW_GAP_MIN of each other collapse into one window. PRE/POST
|
|
41
|
+
* padding is applied to the merged bounds for transcript-turn alignment.
|
|
42
|
+
*/
|
|
43
|
+
export function mergeViolationWindows(violations) {
|
|
44
|
+
const tsList = violations
|
|
45
|
+
.map((v) => new Date(v.timestamp).getTime())
|
|
46
|
+
.filter((t) => Number.isFinite(t))
|
|
47
|
+
.sort((a, b) => a - b);
|
|
48
|
+
if (tsList.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const gapMs = WINDOW_GAP_MIN * 60_000;
|
|
51
|
+
const windows = [];
|
|
52
|
+
let curStart = tsList[0];
|
|
53
|
+
let curEnd = tsList[0];
|
|
54
|
+
for (let i = 1; i < tsList.length; i++) {
|
|
55
|
+
const t = tsList[i];
|
|
56
|
+
if (t - curEnd <= gapMs) {
|
|
57
|
+
curEnd = t;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
windows.push({ start: curStart, end: curEnd });
|
|
61
|
+
curStart = t;
|
|
62
|
+
curEnd = t;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
windows.push({ start: curStart, end: curEnd });
|
|
66
|
+
return windows.map((w) => ({
|
|
67
|
+
startIso: new Date(w.start - PRE_PAD_SEC * 1000).toISOString(),
|
|
68
|
+
endIso: new Date(w.end + POST_PAD_SEC * 1000).toISOString(),
|
|
69
|
+
rawStartIso: new Date(w.start).toISOString(),
|
|
70
|
+
rawEndIso: new Date(w.end).toISOString(),
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Defensively extract a main-thread assistant text turn from one parsed JSONL
|
|
75
|
+
* object, or null if the line is not a usable main-thread assistant text turn.
|
|
76
|
+
* Exported for unit testing of the defensive-parse contract.
|
|
77
|
+
*/
|
|
78
|
+
export function extractAssistantTurn(obj) {
|
|
79
|
+
if (!obj || typeof obj !== 'object')
|
|
80
|
+
return null;
|
|
81
|
+
const o = obj;
|
|
82
|
+
if (o.type !== 'assistant')
|
|
83
|
+
return null;
|
|
84
|
+
// Skip subagent (sidechain) turns — only main-thread content is in scope.
|
|
85
|
+
if (o.isSidechain === true)
|
|
86
|
+
return null;
|
|
87
|
+
const tsRaw = o.timestamp;
|
|
88
|
+
if (typeof tsRaw !== 'string')
|
|
89
|
+
return null;
|
|
90
|
+
const ts = new Date(tsRaw).getTime();
|
|
91
|
+
if (!Number.isFinite(ts))
|
|
92
|
+
return null;
|
|
93
|
+
const message = o.message;
|
|
94
|
+
if (!message || typeof message !== 'object')
|
|
95
|
+
return null;
|
|
96
|
+
const content = message.content;
|
|
97
|
+
if (!Array.isArray(content))
|
|
98
|
+
return null;
|
|
99
|
+
const parts = [];
|
|
100
|
+
for (const block of content) {
|
|
101
|
+
if (!block || typeof block !== 'object')
|
|
102
|
+
continue;
|
|
103
|
+
const b = block;
|
|
104
|
+
if (b.type === 'text' && typeof b.text === 'string' && b.text.trim().length > 0) {
|
|
105
|
+
parts.push(b.text);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (parts.length === 0)
|
|
109
|
+
return null;
|
|
110
|
+
return { ts, text: parts.join('\n') };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Stream-read a transcript JSONL file and return main-thread assistant turns
|
|
114
|
+
* whose timestamp falls within ANY of the given windows. Streaming + byte cap
|
|
115
|
+
* guard against pathologically large transcripts. Never throws — file/parse
|
|
116
|
+
* errors resolve to whatever was collected so far (possibly empty).
|
|
117
|
+
*/
|
|
118
|
+
export async function readAssistantTurnsInWindows(transcriptPath, windows) {
|
|
119
|
+
if (windows.length === 0)
|
|
120
|
+
return [];
|
|
121
|
+
const ranges = windows.map((w) => ({
|
|
122
|
+
start: new Date(w.startIso).getTime(),
|
|
123
|
+
end: new Date(w.endIso).getTime(),
|
|
124
|
+
}));
|
|
125
|
+
const inAnyWindow = (ts) => ranges.some((r) => ts >= r.start && ts <= r.end);
|
|
126
|
+
const turns = [];
|
|
127
|
+
try {
|
|
128
|
+
const stream = createReadStream(transcriptPath, { encoding: 'utf-8' });
|
|
129
|
+
const rl = createInterface({ input: stream, crlfDelay: Infinity });
|
|
130
|
+
let bytes = 0;
|
|
131
|
+
for await (const line of rl) {
|
|
132
|
+
bytes += Buffer.byteLength(line, 'utf-8') + 1; // +1 for the stripped newline
|
|
133
|
+
if (bytes > MAX_TRANSCRIPT_BYTES) {
|
|
134
|
+
rl.close();
|
|
135
|
+
stream.destroy();
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
if (!line.trim())
|
|
139
|
+
continue;
|
|
140
|
+
let obj;
|
|
141
|
+
try {
|
|
142
|
+
obj = JSON.parse(line);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
continue; // malformed line — skip, never crash
|
|
146
|
+
}
|
|
147
|
+
const turn = extractAssistantTurn(obj);
|
|
148
|
+
if (turn && inAnyWindow(turn.ts)) {
|
|
149
|
+
turns.push(turn);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// file missing / read error — return whatever we have (possibly empty)
|
|
155
|
+
return turns;
|
|
156
|
+
}
|
|
157
|
+
turns.sort((a, b) => a.ts - b.ts);
|
|
158
|
+
return turns;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Join a window's assistant turns into the single ai_response string written to
|
|
162
|
+
* the window's earliest inline-edit row. Preserves time order, separates turns.
|
|
163
|
+
*/
|
|
164
|
+
export function joinWindowText(turns) {
|
|
165
|
+
return turns.map((t) => t.text).join(TURN_SEPARATOR);
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=violation-content-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-content-backfill.js","sourceRoot":"","sources":["../../../src/daemon/handlers/violation-content-backfill.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/index.d.ts
CHANGED
|
@@ -8,9 +8,28 @@
|
|
|
8
8
|
* 4. Create event handlers and start socket server
|
|
9
9
|
* 5. Handle graceful shutdown
|
|
10
10
|
*/
|
|
11
|
+
import { SQLiteStorage } from '../core/storage/sqlite.js';
|
|
11
12
|
export interface DaemonOptions {
|
|
12
13
|
/** Whether to enable the web server (default: use config value) */
|
|
13
14
|
web?: boolean;
|
|
14
15
|
}
|
|
15
16
|
export declare function startDaemon(foreground?: boolean, options?: DaemonOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* P2 dedup helper (audit e888352d).
|
|
19
|
+
*
|
|
20
|
+
* The merged UserPromptSubmit `additionalContext` recorded under the generic
|
|
21
|
+
* `<hook>Handler` source_handler often re-contains the KB block, which
|
|
22
|
+
* UserPromptHandler already recorded as its own `UserPromptSubmitHandler:kb`
|
|
23
|
+
* injection row. That double-count inflated injection metrics ~15%.
|
|
24
|
+
*
|
|
25
|
+
* Given the full merged additionalContext, this removes any sibling `:kb`
|
|
26
|
+
* injection content already recorded for the same `event_id`, returning the
|
|
27
|
+
* remaining context (resume/convention) to record under the generic handler.
|
|
28
|
+
* Returns null when nothing meaningful remains (→ caller skips the write, the
|
|
29
|
+
* `:kb` row being the sole record).
|
|
30
|
+
*
|
|
31
|
+
* Storage failures degrade gracefully to "record the full merged content"
|
|
32
|
+
* (no worse than the pre-fix behaviour).
|
|
33
|
+
*/
|
|
34
|
+
export declare function stripAlreadyRecordedKb(storage: SQLiteStorage, eventId: string | undefined, merged: string): string | null;
|
|
16
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4C1D,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAMD,wBAAsB,WAAW,CAAC,UAAU,GAAE,OAAe,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqkBzG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CA0Bf"}
|