reflectt-node 0.1.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/LICENSE +178 -0
- package/README.md +188 -0
- package/dist/activationEvents.d.ts +110 -0
- package/dist/activationEvents.d.ts.map +1 -0
- package/dist/activationEvents.js +378 -0
- package/dist/activationEvents.js.map +1 -0
- package/dist/activity-signal.d.ts +30 -0
- package/dist/activity-signal.d.ts.map +1 -0
- package/dist/activity-signal.js +93 -0
- package/dist/activity-signal.js.map +1 -0
- package/dist/alert-integrity.d.ts +100 -0
- package/dist/alert-integrity.d.ts.map +1 -0
- package/dist/alert-integrity.js +333 -0
- package/dist/alert-integrity.js.map +1 -0
- package/dist/alert-preflight.d.ts +40 -0
- package/dist/alert-preflight.d.ts.map +1 -0
- package/dist/alert-preflight.js +235 -0
- package/dist/alert-preflight.js.map +1 -0
- package/dist/analytics.d.ts +131 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +371 -0
- package/dist/analytics.js.map +1 -0
- package/dist/artifact-mirror.d.ts +26 -0
- package/dist/artifact-mirror.d.ts.map +1 -0
- package/dist/artifact-mirror.js +170 -0
- package/dist/artifact-mirror.js.map +1 -0
- package/dist/artifact-resolver.d.ts +48 -0
- package/dist/artifact-resolver.d.ts.map +1 -0
- package/dist/artifact-resolver.js +164 -0
- package/dist/artifact-resolver.js.map +1 -0
- package/dist/assignment.d.ts +116 -0
- package/dist/assignment.d.ts.map +1 -0
- package/dist/assignment.js +475 -0
- package/dist/assignment.js.map +1 -0
- package/dist/auditLedger.d.ts +50 -0
- package/dist/auditLedger.d.ts.map +1 -0
- package/dist/auditLedger.js +136 -0
- package/dist/auditLedger.js.map +1 -0
- package/dist/boardHealthWorker.d.ts +134 -0
- package/dist/boardHealthWorker.d.ts.map +1 -0
- package/dist/boardHealthWorker.js +882 -0
- package/dist/boardHealthWorker.js.map +1 -0
- package/dist/bootstrap-team.d.ts +42 -0
- package/dist/bootstrap-team.d.ts.map +1 -0
- package/dist/bootstrap-team.js +111 -0
- package/dist/bootstrap-team.js.map +1 -0
- package/dist/buildInfo.d.ts +17 -0
- package/dist/buildInfo.d.ts.map +1 -0
- package/dist/buildInfo.js +56 -0
- package/dist/buildInfo.js.map +1 -0
- package/dist/calendar-events.d.ts +133 -0
- package/dist/calendar-events.d.ts.map +1 -0
- package/dist/calendar-events.js +615 -0
- package/dist/calendar-events.js.map +1 -0
- package/dist/calendar-ical.d.ts +41 -0
- package/dist/calendar-ical.d.ts.map +1 -0
- package/dist/calendar-ical.js +413 -0
- package/dist/calendar-ical.js.map +1 -0
- package/dist/calendar-reminder-engine.d.ts +10 -0
- package/dist/calendar-reminder-engine.d.ts.map +1 -0
- package/dist/calendar-reminder-engine.js +143 -0
- package/dist/calendar-reminder-engine.js.map +1 -0
- package/dist/calendar.d.ts +75 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +391 -0
- package/dist/calendar.js.map +1 -0
- package/dist/canvas-multiplexer.d.ts +44 -0
- package/dist/canvas-multiplexer.d.ts.map +1 -0
- package/dist/canvas-multiplexer.js +150 -0
- package/dist/canvas-multiplexer.js.map +1 -0
- package/dist/canvas-slots.d.ts +83 -0
- package/dist/canvas-slots.d.ts.map +1 -0
- package/dist/canvas-slots.js +144 -0
- package/dist/canvas-slots.js.map +1 -0
- package/dist/canvas-types.d.ts +56 -0
- package/dist/canvas-types.d.ts.map +1 -0
- package/dist/canvas-types.js +54 -0
- package/dist/canvas-types.js.map +1 -0
- package/dist/cf-keepalive.d.ts +40 -0
- package/dist/cf-keepalive.d.ts.map +1 -0
- package/dist/cf-keepalive.js +153 -0
- package/dist/cf-keepalive.js.map +1 -0
- package/dist/changeFeed.d.ts +38 -0
- package/dist/changeFeed.d.ts.map +1 -0
- package/dist/changeFeed.js +324 -0
- package/dist/changeFeed.js.map +1 -0
- package/dist/channels.d.ts +28 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +23 -0
- package/dist/channels.js.map +1 -0
- package/dist/chat-approval-detector.d.ts +47 -0
- package/dist/chat-approval-detector.d.ts.map +1 -0
- package/dist/chat-approval-detector.js +224 -0
- package/dist/chat-approval-detector.js.map +1 -0
- package/dist/chat.d.ts +119 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +666 -0
- package/dist/chat.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1142 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud.d.ts +45 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +962 -0
- package/dist/cloud.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +33 -0
- package/dist/config.js.map +1 -0
- package/dist/connectivity.d.ts +59 -0
- package/dist/connectivity.d.ts.map +1 -0
- package/dist/connectivity.js +173 -0
- package/dist/connectivity.js.map +1 -0
- package/dist/contacts.d.ts +59 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +183 -0
- package/dist/contacts.js.map +1 -0
- package/dist/content.d.ts +130 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +186 -0
- package/dist/content.js.map +1 -0
- package/dist/context-budget.d.ts +87 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +459 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/continuity-loop.d.ts +55 -0
- package/dist/continuity-loop.d.ts.map +1 -0
- package/dist/continuity-loop.js +267 -0
- package/dist/continuity-loop.js.map +1 -0
- package/dist/dashboard.d.ts +6 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +2348 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/db.d.ts +44 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +648 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor.d.ts +30 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +159 -0
- package/dist/doctor.js.map +1 -0
- package/dist/duplicateClosureGuard.d.ts +31 -0
- package/dist/duplicateClosureGuard.d.ts.map +1 -0
- package/dist/duplicateClosureGuard.js +83 -0
- package/dist/duplicateClosureGuard.js.map +1 -0
- package/dist/embeddings.d.ts +13 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +78 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/escalation.d.ts +80 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +213 -0
- package/dist/escalation.js.map +1 -0
- package/dist/events.d.ts +130 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +382 -0
- package/dist/events.js.map +1 -0
- package/dist/executionSweeper.d.ts +97 -0
- package/dist/executionSweeper.d.ts.map +1 -0
- package/dist/executionSweeper.js +875 -0
- package/dist/executionSweeper.js.map +1 -0
- package/dist/experiments.d.ts +47 -0
- package/dist/experiments.d.ts.map +1 -0
- package/dist/experiments.js +133 -0
- package/dist/experiments.js.map +1 -0
- package/dist/feedback.d.ts +179 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +397 -0
- package/dist/feedback.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +172 -0
- package/dist/files.js.map +1 -0
- package/dist/format-duration.d.ts +19 -0
- package/dist/format-duration.d.ts.map +1 -0
- package/dist/format-duration.js +33 -0
- package/dist/format-duration.js.map +1 -0
- package/dist/github-actor-auth.d.ts +20 -0
- package/dist/github-actor-auth.d.ts.map +1 -0
- package/dist/github-actor-auth.js +54 -0
- package/dist/github-actor-auth.js.map +1 -0
- package/dist/github-ci.d.ts +16 -0
- package/dist/github-ci.d.ts.map +1 -0
- package/dist/github-ci.js +37 -0
- package/dist/github-ci.js.map +1 -0
- package/dist/github-identity.d.ts +30 -0
- package/dist/github-identity.d.ts.map +1 -0
- package/dist/github-identity.js +96 -0
- package/dist/github-identity.js.map +1 -0
- package/dist/github-reviews.d.ts +24 -0
- package/dist/github-reviews.d.ts.map +1 -0
- package/dist/github-reviews.js +56 -0
- package/dist/github-reviews.js.map +1 -0
- package/dist/health.d.ts +391 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +1841 -0
- package/dist/health.js.map +1 -0
- package/dist/host-keepalive.d.ts +22 -0
- package/dist/host-keepalive.d.ts.map +1 -0
- package/dist/host-keepalive.js +126 -0
- package/dist/host-keepalive.js.map +1 -0
- package/dist/host-registry.d.ts +43 -0
- package/dist/host-registry.d.ts.map +1 -0
- package/dist/host-registry.js +93 -0
- package/dist/host-registry.js.map +1 -0
- package/dist/inbox.d.ts +87 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +410 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/insight-mutation.d.ts +32 -0
- package/dist/insight-mutation.d.ts.map +1 -0
- package/dist/insight-mutation.js +160 -0
- package/dist/insight-mutation.js.map +1 -0
- package/dist/insight-promotion.d.ts +89 -0
- package/dist/insight-promotion.d.ts.map +1 -0
- package/dist/insight-promotion.js +278 -0
- package/dist/insight-promotion.js.map +1 -0
- package/dist/insight-task-bridge.d.ts +77 -0
- package/dist/insight-task-bridge.d.ts.map +1 -0
- package/dist/insight-task-bridge.js +556 -0
- package/dist/insight-task-bridge.js.map +1 -0
- package/dist/insights.d.ts +222 -0
- package/dist/insights.d.ts.map +1 -0
- package/dist/insights.js +871 -0
- package/dist/insights.js.map +1 -0
- package/dist/intake-pipeline.d.ts +74 -0
- package/dist/intake-pipeline.d.ts.map +1 -0
- package/dist/intake-pipeline.js +199 -0
- package/dist/intake-pipeline.js.map +1 -0
- package/dist/intensity.d.ts +31 -0
- package/dist/intensity.d.ts.map +1 -0
- package/dist/intensity.js +94 -0
- package/dist/intensity.js.map +1 -0
- package/dist/knowledge-auto-index.d.ts +37 -0
- package/dist/knowledge-auto-index.d.ts.map +1 -0
- package/dist/knowledge-auto-index.js +149 -0
- package/dist/knowledge-auto-index.js.map +1 -0
- package/dist/knowledge-docs.d.ts +45 -0
- package/dist/knowledge-docs.d.ts.map +1 -0
- package/dist/knowledge-docs.js +188 -0
- package/dist/knowledge-docs.js.map +1 -0
- package/dist/lane-config.d.ts +25 -0
- package/dist/lane-config.d.ts.map +1 -0
- package/dist/lane-config.js +105 -0
- package/dist/lane-config.js.map +1 -0
- package/dist/lineage.d.ts +86 -0
- package/dist/lineage.d.ts.map +1 -0
- package/dist/lineage.js +303 -0
- package/dist/lineage.js.map +1 -0
- package/dist/logStore.d.ts +25 -0
- package/dist/logStore.d.ts.map +1 -0
- package/dist/logStore.js +83 -0
- package/dist/logStore.js.map +1 -0
- package/dist/manage.d.ts +12 -0
- package/dist/manage.d.ts.map +1 -0
- package/dist/manage.js +253 -0
- package/dist/manage.js.map +1 -0
- package/dist/mcp.d.ts +5 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +604 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +47 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +149 -0
- package/dist/memory.js.map +1 -0
- package/dist/mention-ack.d.ts +80 -0
- package/dist/mention-ack.d.ts.map +1 -0
- package/dist/mention-ack.js +175 -0
- package/dist/mention-ack.js.map +1 -0
- package/dist/messageRouter.d.ts +60 -0
- package/dist/messageRouter.d.ts.map +1 -0
- package/dist/messageRouter.js +309 -0
- package/dist/messageRouter.js.map +1 -0
- package/dist/mutationAlert.d.ts +44 -0
- package/dist/mutationAlert.d.ts.map +1 -0
- package/dist/mutationAlert.js +174 -0
- package/dist/mutationAlert.js.map +1 -0
- package/dist/noise-budget.d.ts +136 -0
- package/dist/noise-budget.d.ts.map +1 -0
- package/dist/noise-budget.js +340 -0
- package/dist/noise-budget.js.map +1 -0
- package/dist/notifications.d.ts +67 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +253 -0
- package/dist/notifications.js.map +1 -0
- package/dist/openclaw.d.ts +34 -0
- package/dist/openclaw.d.ts.map +1 -0
- package/dist/openclaw.js +208 -0
- package/dist/openclaw.js.map +1 -0
- package/dist/pause-controls.d.ts +31 -0
- package/dist/pause-controls.d.ts.map +1 -0
- package/dist/pause-controls.js +130 -0
- package/dist/pause-controls.js.map +1 -0
- package/dist/pidlock.d.ts +25 -0
- package/dist/pidlock.d.ts.map +1 -0
- package/dist/pidlock.js +179 -0
- package/dist/pidlock.js.map +1 -0
- package/dist/policy.d.ts +139 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +264 -0
- package/dist/policy.js.map +1 -0
- package/dist/polls.d.ts +47 -0
- package/dist/polls.d.ts.map +1 -0
- package/dist/polls.js +162 -0
- package/dist/polls.js.map +1 -0
- package/dist/portability.d.ts +55 -0
- package/dist/portability.d.ts.map +1 -0
- package/dist/portability.js +292 -0
- package/dist/portability.js.map +1 -0
- package/dist/pr-integrity.d.ts +45 -0
- package/dist/pr-integrity.d.ts.map +1 -0
- package/dist/pr-integrity.js +124 -0
- package/dist/pr-integrity.js.map +1 -0
- package/dist/prAutoMerge.d.ts +62 -0
- package/dist/prAutoMerge.d.ts.map +1 -0
- package/dist/prAutoMerge.js +493 -0
- package/dist/prAutoMerge.js.map +1 -0
- package/dist/preflight.d.ts +66 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +864 -0
- package/dist/preflight.js.map +1 -0
- package/dist/presence.d.ts +98 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +347 -0
- package/dist/presence.js.map +1 -0
- package/dist/provisioning.d.ts +101 -0
- package/dist/provisioning.d.ts.map +1 -0
- package/dist/provisioning.js +430 -0
- package/dist/provisioning.js.map +1 -0
- package/dist/reflection-automation.d.ts +59 -0
- package/dist/reflection-automation.d.ts.map +1 -0
- package/dist/reflection-automation.js +350 -0
- package/dist/reflection-automation.js.map +1 -0
- package/dist/reflections.d.ts +65 -0
- package/dist/reflections.d.ts.map +1 -0
- package/dist/reflections.js +306 -0
- package/dist/reflections.js.map +1 -0
- package/dist/release.d.ts +67 -0
- package/dist/release.d.ts.map +1 -0
- package/dist/release.js +275 -0
- package/dist/release.js.map +1 -0
- package/dist/request-tracker.d.ts +36 -0
- package/dist/request-tracker.d.ts.map +1 -0
- package/dist/request-tracker.js +109 -0
- package/dist/request-tracker.js.map +1 -0
- package/dist/research.d.ts +75 -0
- package/dist/research.d.ts.map +1 -0
- package/dist/research.js +171 -0
- package/dist/research.js.map +1 -0
- package/dist/routing-approvals.d.ts +73 -0
- package/dist/routing-approvals.d.ts.map +1 -0
- package/dist/routing-approvals.js +88 -0
- package/dist/routing-approvals.js.map +1 -0
- package/dist/routing-override.d.ts +94 -0
- package/dist/routing-override.d.ts.map +1 -0
- package/dist/routing-override.js +290 -0
- package/dist/routing-override.js.map +1 -0
- package/dist/scope-routing.d.ts +18 -0
- package/dist/scope-routing.d.ts.map +1 -0
- package/dist/scope-routing.js +29 -0
- package/dist/scope-routing.js.map +1 -0
- package/dist/secrets.d.ts +77 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +287 -0
- package/dist/secrets.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10887 -0
- package/dist/server.js.map +1 -0
- package/dist/service-probe.d.ts +53 -0
- package/dist/service-probe.d.ts.map +1 -0
- package/dist/service-probe.js +225 -0
- package/dist/service-probe.js.map +1 -0
- package/dist/shared-workspace-api.d.ts +73 -0
- package/dist/shared-workspace-api.d.ts.map +1 -0
- package/dist/shared-workspace-api.js +281 -0
- package/dist/shared-workspace-api.js.map +1 -0
- package/dist/shipped-heartbeat.d.ts +91 -0
- package/dist/shipped-heartbeat.d.ts.map +1 -0
- package/dist/shipped-heartbeat.js +272 -0
- package/dist/shipped-heartbeat.js.map +1 -0
- package/dist/starter-team.d.ts +23 -0
- package/dist/starter-team.d.ts.map +1 -0
- package/dist/starter-team.js +88 -0
- package/dist/starter-team.js.map +1 -0
- package/dist/suppression-ledger.d.ts +73 -0
- package/dist/suppression-ledger.d.ts.map +1 -0
- package/dist/suppression-ledger.js +125 -0
- package/dist/suppression-ledger.js.map +1 -0
- package/dist/system-loop-state.d.ts +4 -0
- package/dist/system-loop-state.d.ts.map +1 -0
- package/dist/system-loop-state.js +40 -0
- package/dist/system-loop-state.js.map +1 -0
- package/dist/taskCommentIngest.d.ts +43 -0
- package/dist/taskCommentIngest.d.ts.map +1 -0
- package/dist/taskCommentIngest.js +59 -0
- package/dist/taskCommentIngest.js.map +1 -0
- package/dist/taskPrecheck.d.ts +20 -0
- package/dist/taskPrecheck.d.ts.map +1 -0
- package/dist/taskPrecheck.js +329 -0
- package/dist/taskPrecheck.js.map +1 -0
- package/dist/taskStateSync.d.ts +8 -0
- package/dist/taskStateSync.d.ts.map +1 -0
- package/dist/taskStateSync.js +79 -0
- package/dist/taskStateSync.js.map +1 -0
- package/dist/tasks.d.ts +140 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +1281 -0
- package/dist/tasks.js.map +1 -0
- package/dist/team-config.d.ts +24 -0
- package/dist/team-config.d.ts.map +1 -0
- package/dist/team-config.js +221 -0
- package/dist/team-config.js.map +1 -0
- package/dist/team-doctor.d.ts +22 -0
- package/dist/team-doctor.d.ts.map +1 -0
- package/dist/team-doctor.js +270 -0
- package/dist/team-doctor.js.map +1 -0
- package/dist/team-pulse.d.ts +52 -0
- package/dist/team-pulse.d.ts.map +1 -0
- package/dist/team-pulse.js +176 -0
- package/dist/team-pulse.js.map +1 -0
- package/dist/telemetry.d.ts +74 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +256 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/test-task-filter.d.ts +21 -0
- package/dist/test-task-filter.d.ts.map +1 -0
- package/dist/test-task-filter.js +48 -0
- package/dist/test-task-filter.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/usage-tracking.d.ts +101 -0
- package/dist/usage-tracking.d.ts.map +1 -0
- package/dist/usage-tracking.js +325 -0
- package/dist/usage-tracking.js.map +1 -0
- package/dist/vector-store.d.ts +87 -0
- package/dist/vector-store.d.ts.map +1 -0
- package/dist/vector-store.js +247 -0
- package/dist/vector-store.js.map +1 -0
- package/dist/watchdog/idleNudgeLane.d.ts +22 -0
- package/dist/watchdog/idleNudgeLane.d.ts.map +1 -0
- package/dist/watchdog/idleNudgeLane.js +98 -0
- package/dist/watchdog/idleNudgeLane.js.map +1 -0
- package/dist/webhooks.d.ts +103 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +398 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/working-contract.d.ts +42 -0
- package/dist/working-contract.d.ts.map +1 -0
- package/dist/working-contract.js +228 -0
- package/dist/working-contract.js.map +1 -0
- package/dist/ws-heartbeat.d.ts +66 -0
- package/dist/ws-heartbeat.d.ts.map +1 -0
- package/dist/ws-heartbeat.js +174 -0
- package/dist/ws-heartbeat.js.map +1 -0
- package/package.json +87 -0
- package/plugins/reflectt-channel/README.md +96 -0
- package/plugins/reflectt-channel/index.ts +789 -0
- package/plugins/reflectt-channel/openclaw.plugin.json +23 -0
- package/plugins/reflectt-channel/package.json +23 -0
- package/plugins/reflectt-channel/src/channel.ts +433 -0
- package/plugins/reflectt-channel/src/types.ts +29 -0
- package/public/avatars/echo.png +0 -0
- package/public/avatars/harmony.png +0 -0
- package/public/avatars/kai.png +0 -0
- package/public/avatars/link.png +0 -0
- package/public/avatars/pixel.png +0 -0
- package/public/avatars/rhythm.png +0 -0
- package/public/avatars/ryan.png +0 -0
- package/public/avatars/sage.png +0 -0
- package/public/avatars/scout.png +0 -0
- package/public/avatars/spark.png +0 -0
- package/public/dashboard-animations.css +381 -0
- package/public/dashboard.js +3479 -0
- package/public/docs.md +1062 -0
- package/public/file-upload-mock.html +1097 -0
- package/public/og-card.png +0 -0
- package/public/ui-kit.html +318 -0
- package/public/widget/feedback.js +194 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Insight→Task Bridge: listens for insight:promoted events and creates tasks.
|
|
3
|
+
//
|
|
4
|
+
// Severity-aware routing:
|
|
5
|
+
// - high/critical → auto-create task immediately
|
|
6
|
+
// - medium/low → set insight to pending_triage (manual review required)
|
|
7
|
+
//
|
|
8
|
+
// Design decisions (locked by kai + sage):
|
|
9
|
+
// - Soft guardrail: prefer non-author assignee; if author is best, require non-author reviewer
|
|
10
|
+
// - Required linkage: task.metadata.insight_id + insight.task_id
|
|
11
|
+
// - Idempotency: one task per insight (check insight.task_id before creating)
|
|
12
|
+
import { eventBus } from './events.js';
|
|
13
|
+
import { getInsight, updateInsightStatus } from './insights.js';
|
|
14
|
+
import { taskManager } from './tasks.js';
|
|
15
|
+
import { getDb } from './db.js';
|
|
16
|
+
import { suggestAssignee, suggestReviewer, getAgentRoles } from './assignment.js';
|
|
17
|
+
// ── State ──
|
|
18
|
+
const LISTENER_ID = 'insight-task-bridge';
|
|
19
|
+
let stats = {
|
|
20
|
+
tasksAutoCreated: 0,
|
|
21
|
+
insightsTriaged: 0,
|
|
22
|
+
duplicatesSkipped: 0,
|
|
23
|
+
errors: 0,
|
|
24
|
+
lastEventAt: null,
|
|
25
|
+
};
|
|
26
|
+
let config = {
|
|
27
|
+
enabled: true,
|
|
28
|
+
autoCreateSeverities: ['high', 'critical'],
|
|
29
|
+
defaultReviewer: 'sage',
|
|
30
|
+
defaultEtaDays: 3,
|
|
31
|
+
assignableAgents: [],
|
|
32
|
+
ownershipGuardrail: {
|
|
33
|
+
enabled: true,
|
|
34
|
+
requireNonAuthorReviewer: true,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Update bridge config at runtime (e.g., from policy or API).
|
|
39
|
+
*/
|
|
40
|
+
export function configureBridge(partial) {
|
|
41
|
+
config = { ...config, ...partial };
|
|
42
|
+
if (partial.ownershipGuardrail) {
|
|
43
|
+
config.ownershipGuardrail = { ...config.ownershipGuardrail, ...partial.ownershipGuardrail };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ── Bridge Logic ──
|
|
47
|
+
async function handlePromotedInsight(event) {
|
|
48
|
+
const data = event.data;
|
|
49
|
+
if (data.kind !== 'insight:promoted' || !data.insightId)
|
|
50
|
+
return;
|
|
51
|
+
if (!config.enabled)
|
|
52
|
+
return;
|
|
53
|
+
stats.lastEventAt = Date.now();
|
|
54
|
+
const insight = getInsight(data.insightId);
|
|
55
|
+
if (!insight) {
|
|
56
|
+
stats.errors++;
|
|
57
|
+
console.error(`[InsightTaskBridge] Insight ${data.insightId} not found`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Idempotency: skip if insight already has a linked task
|
|
61
|
+
if (insight.task_id) {
|
|
62
|
+
stats.duplicatesSkipped++;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const severity = insight.severity_max || 'medium';
|
|
66
|
+
const isAutoCreate = config.autoCreateSeverities.includes(severity);
|
|
67
|
+
if (isAutoCreate) {
|
|
68
|
+
await autoCreateTask(insight);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
updateInsightStatus(insight.id, 'pending_triage');
|
|
72
|
+
stats.insightsTriaged++;
|
|
73
|
+
console.log(`[InsightTaskBridge] Insight ${insight.id} → pending_triage (severity: ${severity})`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function findExistingTaskForInsight(insight) {
|
|
77
|
+
const allTasks = taskManager.listTasks({});
|
|
78
|
+
const targetTitle = `[Insight] ${insight.title}`.toLowerCase();
|
|
79
|
+
// Evidence-based dedup: if an insight explicitly references an existing task or PR,
|
|
80
|
+
// treat it as covered even if the cluster_key differs (common in follow-up insights).
|
|
81
|
+
const evidence = (insight.evidence_refs || []).filter(Boolean);
|
|
82
|
+
// 0a) Direct task-id reference in evidence (e.g. "task-..." in links/logs)
|
|
83
|
+
const taskIdMatches = new Set();
|
|
84
|
+
for (const line of evidence) {
|
|
85
|
+
const matches = String(line).match(/task-\d+-[a-z0-9]+/gi) || [];
|
|
86
|
+
for (const m of matches)
|
|
87
|
+
taskIdMatches.add(m);
|
|
88
|
+
}
|
|
89
|
+
if (taskIdMatches.size > 0) {
|
|
90
|
+
for (const task of allTasks) {
|
|
91
|
+
if (taskIdMatches.has(task.id)) {
|
|
92
|
+
return {
|
|
93
|
+
id: task.id,
|
|
94
|
+
title: task.title,
|
|
95
|
+
status: task.status,
|
|
96
|
+
alreadyAddressed: task.status === 'done' || task.status === 'validating',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 0b) PR link reference in evidence (e.g. https://github.com/.../pull/123)
|
|
102
|
+
const prUrlMatches = new Set();
|
|
103
|
+
for (const line of evidence) {
|
|
104
|
+
const matches = String(line).match(/https:\/\/github\.com\/[^\s/]+\/[^\s/]+\/pull\/\d+/gi) || [];
|
|
105
|
+
for (const m of matches)
|
|
106
|
+
prUrlMatches.add(m);
|
|
107
|
+
}
|
|
108
|
+
if (prUrlMatches.size > 0) {
|
|
109
|
+
for (const task of allTasks) {
|
|
110
|
+
const meta = (task.metadata || {});
|
|
111
|
+
const prUrl = (meta.pr_url || meta.review_handoff?.pr_url || meta.qa_bundle?.pr_link);
|
|
112
|
+
if (prUrl && prUrlMatches.has(prUrl)) {
|
|
113
|
+
return {
|
|
114
|
+
id: task.id,
|
|
115
|
+
title: task.title,
|
|
116
|
+
status: task.status,
|
|
117
|
+
alreadyAddressed: task.status === 'done' || task.status === 'validating',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const task of allTasks) {
|
|
123
|
+
const meta = (task.metadata || {});
|
|
124
|
+
// 1. Direct insight_id match
|
|
125
|
+
if (meta.insight_id === insight.id || meta.source_insight === insight.id) {
|
|
126
|
+
return {
|
|
127
|
+
id: task.id,
|
|
128
|
+
title: task.title,
|
|
129
|
+
status: task.status,
|
|
130
|
+
alreadyAddressed: task.status === 'done' || task.status === 'validating',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// 2. Exact title match (case-insensitive) for insight-bridge tasks
|
|
134
|
+
if (meta.source === 'insight-task-bridge' && task.title.toLowerCase() === targetTitle) {
|
|
135
|
+
return {
|
|
136
|
+
id: task.id,
|
|
137
|
+
title: task.title,
|
|
138
|
+
status: task.status,
|
|
139
|
+
alreadyAddressed: task.status === 'done' || task.status === 'validating',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// 3. Same full cluster_key (stage::family::unit) via insight-bridge source
|
|
143
|
+
if (meta.source === 'insight-task-bridge' && typeof meta.insight_id === 'string') {
|
|
144
|
+
try {
|
|
145
|
+
const sourceInsight = getInsight(meta.insight_id);
|
|
146
|
+
if (sourceInsight && sourceInsight.cluster_key === insight.cluster_key) {
|
|
147
|
+
return {
|
|
148
|
+
id: task.id,
|
|
149
|
+
title: task.title,
|
|
150
|
+
status: task.status,
|
|
151
|
+
alreadyAddressed: task.status === 'done' || task.status === 'validating',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch { /* ignore lookup failures */ }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
// ── Feature Detection ──
|
|
161
|
+
/**
|
|
162
|
+
* Heuristic: classify whether an insight is a feature request vs a bug/problem.
|
|
163
|
+
* Feature requests should NOT be auto-promoted to P0.
|
|
164
|
+
*
|
|
165
|
+
* Signals:
|
|
166
|
+
* - cluster_key workflow_stage contains "feature", "enhancement", "request"
|
|
167
|
+
* - title contains feature-request language
|
|
168
|
+
* - No severity or low severity (features aren't "critical")
|
|
169
|
+
*/
|
|
170
|
+
const FEATURE_PATTERNS = [
|
|
171
|
+
/\bfeature\b/i,
|
|
172
|
+
/\benhancement\b/i,
|
|
173
|
+
/\brequest\b/i,
|
|
174
|
+
/\badd support\b/i,
|
|
175
|
+
/\bwould be nice\b/i,
|
|
176
|
+
/\bwish list\b/i,
|
|
177
|
+
/\bnew capability\b/i,
|
|
178
|
+
/\bplease add\b/i,
|
|
179
|
+
];
|
|
180
|
+
export function isFeatureRequest(insight) {
|
|
181
|
+
const title = insight.title || '';
|
|
182
|
+
const cluster = insight.cluster_key || '';
|
|
183
|
+
// Check title and cluster key against feature patterns
|
|
184
|
+
for (const pattern of FEATURE_PATTERNS) {
|
|
185
|
+
if (pattern.test(title) || pattern.test(cluster))
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
// No severity or low severity + no "bug/error/crash/broken" in title = likely feature
|
|
189
|
+
const bugPatterns = /\bbug\b|\berror\b|\bcrash\b|\bbroken\b|\bfail\b|\bfix\b|\bregress/i;
|
|
190
|
+
if (!insight.severity_max || insight.severity_max === 'low') {
|
|
191
|
+
if (!bugPatterns.test(title))
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
async function autoCreateTask(insight) {
|
|
197
|
+
const title = `[Insight] ${insight.title}`;
|
|
198
|
+
// Feature request gate: don't auto-create P0 tasks for feature requests
|
|
199
|
+
if (isFeatureRequest(insight)) {
|
|
200
|
+
updateInsightStatus(insight.id, 'pending_triage');
|
|
201
|
+
stats.insightsTriaged++;
|
|
202
|
+
console.log(`[InsightTaskBridge] Feature request detected: insight ${insight.id} ("${insight.title}") → pending_triage (not auto-promoted to P0)`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Dedup check: prevent creating tasks for already-addressed problems
|
|
206
|
+
const existing = findExistingTaskForInsight(insight);
|
|
207
|
+
if (existing) {
|
|
208
|
+
stats.duplicatesSkipped++;
|
|
209
|
+
// Link this insight to the existing task regardless of status
|
|
210
|
+
updateInsightStatus(insight.id, 'task_created', existing.id);
|
|
211
|
+
const addressedNote = existing.alreadyAddressed ? ` (already ${existing.status})` : '';
|
|
212
|
+
console.log(`[InsightTaskBridge] Dedup: insight ${insight.id} linked to existing task ${existing.id} ("${existing.title}")${addressedNote}`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const description = buildTaskDescription(insight);
|
|
216
|
+
const decision = resolveAssignment(insight);
|
|
217
|
+
try {
|
|
218
|
+
const task = await taskManager.createTask({
|
|
219
|
+
title,
|
|
220
|
+
description,
|
|
221
|
+
status: 'todo',
|
|
222
|
+
priority: insight.priority || 'P2',
|
|
223
|
+
assignee: decision.assignee,
|
|
224
|
+
reviewer: decision.reviewer,
|
|
225
|
+
createdBy: 'insight-bridge',
|
|
226
|
+
done_criteria: [
|
|
227
|
+
'Root cause addressed or mitigated',
|
|
228
|
+
`Evidence from insight ${insight.id} validated`,
|
|
229
|
+
'Follow-up reflection submitted confirming fix',
|
|
230
|
+
],
|
|
231
|
+
metadata: {
|
|
232
|
+
insight_id: insight.id,
|
|
233
|
+
source_insight: insight.id,
|
|
234
|
+
source_reflection: insight.reflection_ids[0] || undefined,
|
|
235
|
+
promotion_reason: insight.promotion_readiness,
|
|
236
|
+
severity: insight.severity_max,
|
|
237
|
+
source: 'insight-task-bridge',
|
|
238
|
+
reflection_count: insight.reflection_ids.length,
|
|
239
|
+
authors: insight.authors,
|
|
240
|
+
assignment_decision: {
|
|
241
|
+
reason: decision.reason,
|
|
242
|
+
guardrail_applied: decision.guardrailApplied,
|
|
243
|
+
sole_author_fallback: decision.soleAuthorFallback,
|
|
244
|
+
candidates_considered: decision.candidatesConsidered,
|
|
245
|
+
insight_authors: decision.insightAuthors,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
updateInsightStatus(insight.id, 'task_created', task.id);
|
|
250
|
+
stats.tasksAutoCreated++;
|
|
251
|
+
console.log(`[InsightTaskBridge] Auto-created task ${task.id} from insight ${insight.id} (severity: ${insight.severity_max}, assignee: ${decision.assignee}, guardrail: ${decision.guardrailApplied})`);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
stats.errors++;
|
|
255
|
+
console.error(`[InsightTaskBridge] Failed to create task for insight ${insight.id}:`, err);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// ── Ownership Guardrail ──
|
|
259
|
+
/**
|
|
260
|
+
* Resolve assignee + reviewer with ownership guardrail.
|
|
261
|
+
*
|
|
262
|
+
* Policy:
|
|
263
|
+
* 1. If guardrail enabled and insight has single author:
|
|
264
|
+
* a. Use suggestAssignee (scoring engine) excluding the author
|
|
265
|
+
* b. If no non-author candidate available → fallback to author, but require non-author reviewer
|
|
266
|
+
* 2. If multi-author: normal suggestAssignee routing (authors are valid candidates)
|
|
267
|
+
* 3. Decision is fully recorded for audit trail
|
|
268
|
+
*/
|
|
269
|
+
export function resolveAssignment(insight, teamId) {
|
|
270
|
+
const authors = insight.authors || [];
|
|
271
|
+
const guardrail = config.ownershipGuardrail;
|
|
272
|
+
const guardrailEnabled = guardrail.enabled &&
|
|
273
|
+
(!teamId || !guardrail.teamOverrides || guardrail.teamOverrides[teamId] !== false);
|
|
274
|
+
const isSingleAuthor = authors.length === 1;
|
|
275
|
+
const shouldAvoidAuthor = guardrailEnabled && isSingleAuthor;
|
|
276
|
+
// Get all tasks for WIP scoring
|
|
277
|
+
let allTasks = [];
|
|
278
|
+
try {
|
|
279
|
+
allTasks = taskManager.listTasks();
|
|
280
|
+
}
|
|
281
|
+
catch { /* scoring works without tasks */ }
|
|
282
|
+
// Get role-based candidates
|
|
283
|
+
const roleNames = getAgentRoles().map(r => r.name);
|
|
284
|
+
const candidates = config.assignableAgents.length > 0 ? config.assignableAgents : roleNames;
|
|
285
|
+
// Synthetic task for scoring
|
|
286
|
+
const metaTags = Array.isArray(insight.metadata?.tags)
|
|
287
|
+
? insight.metadata.tags.map(String)
|
|
288
|
+
: [];
|
|
289
|
+
const syntheticTask = {
|
|
290
|
+
title: `[Insight] ${insight.title}`,
|
|
291
|
+
// Insight does not include reflection-level fields like pain/impact/proposed_fix.
|
|
292
|
+
// Use cluster metadata + optional metadata.tags for routing/affinity.
|
|
293
|
+
tags: [insight.cluster_key, insight.failure_family, insight.impacted_unit, ...metaTags].filter(Boolean),
|
|
294
|
+
// Use evidence refs as additional keywords (best-effort).
|
|
295
|
+
done_criteria: insight.evidence_refs.slice(0, 10),
|
|
296
|
+
metadata: {
|
|
297
|
+
cluster_key: insight.cluster_key,
|
|
298
|
+
failure_family: insight.failure_family,
|
|
299
|
+
// surface/lane may be absent for auto-created tasks; routing guardrails use cluster_key.
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
let assignee;
|
|
303
|
+
let reason;
|
|
304
|
+
let guardrailApplied = false;
|
|
305
|
+
let soleAuthorFallback = false;
|
|
306
|
+
if (shouldAvoidAuthor) {
|
|
307
|
+
// Score all agents including author for role-fit comparison
|
|
308
|
+
const suggestion = suggestAssignee(syntheticTask, allTasks);
|
|
309
|
+
const suggestedAgent = suggestion.suggested;
|
|
310
|
+
const authorName = authors[0];
|
|
311
|
+
const scores = suggestion.scores || [];
|
|
312
|
+
// Compare author's role-fit score vs best non-author
|
|
313
|
+
const authorScore = scores.find(s => s.agent === authorName);
|
|
314
|
+
const nonAuthorScored = scores
|
|
315
|
+
// Prefer any non-author candidate with non-negative score.
|
|
316
|
+
// If all scores are 0 (no clear affinity), we still want to avoid self-assignment.
|
|
317
|
+
.filter(s => !authors.includes(s.agent) && s.score >= 0 && !s.overCap &&
|
|
318
|
+
(candidates.length === 0 || candidates.includes(s.agent)));
|
|
319
|
+
const bestNonAuthor = nonAuthorScored[0]; // Already sorted desc
|
|
320
|
+
// Role-fit bypass: author-exclusion must NOT override when author is best/only fit.
|
|
321
|
+
// Use *affinity* (domain match) rather than final score so WIP penalties don't defeat best-fit detection.
|
|
322
|
+
const authorAffinity = authorScore?.breakdown?.affinity ?? 0;
|
|
323
|
+
const bestNonAuthorAffinity = bestNonAuthor?.breakdown?.affinity ?? 0;
|
|
324
|
+
const authorIsBestFit = authorScore && authorAffinity > 0 && (!bestNonAuthor ||
|
|
325
|
+
(authorAffinity > bestNonAuthorAffinity * 1.5) ||
|
|
326
|
+
(authorAffinity - bestNonAuthorAffinity >= 0.2));
|
|
327
|
+
const isProtectedMatch = suggestion.protectedMatch &&
|
|
328
|
+
suggestion.suggested === authorName;
|
|
329
|
+
if (isProtectedMatch) {
|
|
330
|
+
// Protected domain → author IS the correct owner, no guardrail needed
|
|
331
|
+
assignee = authorName;
|
|
332
|
+
reason = `author_exclusion_bypassed: protected domain "${suggestion.protectedMatch}" → author "${authorName}" is correct owner`;
|
|
333
|
+
guardrailApplied = false;
|
|
334
|
+
}
|
|
335
|
+
else if (authorIsBestFit) {
|
|
336
|
+
// Author is best role-fit → allow self-assignment, require non-author reviewer
|
|
337
|
+
assignee = authorName;
|
|
338
|
+
const gap = bestNonAuthor
|
|
339
|
+
? `(author affinity ${authorAffinity.toFixed(2)} vs best non-author ${bestNonAuthor.agent} affinity ${bestNonAuthorAffinity.toFixed(2)})`
|
|
340
|
+
: '(no non-author candidates with non-negative score)';
|
|
341
|
+
const capNote = authorScore?.overCap ? ' (note: author over WIP cap)' : '';
|
|
342
|
+
reason = `author_exclusion_bypassed: author "${authorName}" is best role-fit ${gap}${capNote}. Non-author reviewer required.`;
|
|
343
|
+
guardrailApplied = true;
|
|
344
|
+
soleAuthorFallback = true; // Triggers non-author reviewer requirement
|
|
345
|
+
}
|
|
346
|
+
else if (suggestedAgent && !authors.includes(suggestedAgent) && (candidates.length === 0 || candidates.includes(suggestedAgent))) {
|
|
347
|
+
// Scoring engine picked a viable non-author — use it
|
|
348
|
+
assignee = suggestedAgent;
|
|
349
|
+
reason = `author_exclusion_applied: non-author "${suggestedAgent}" selected (sole author "${authorName}" avoided)`;
|
|
350
|
+
guardrailApplied = true;
|
|
351
|
+
}
|
|
352
|
+
else if (bestNonAuthor) {
|
|
353
|
+
// Best-scoring non-author
|
|
354
|
+
assignee = bestNonAuthor.agent;
|
|
355
|
+
reason = `author_exclusion_applied: best non-author "${bestNonAuthor.agent}" selected (sole author "${authorName}" avoided)`;
|
|
356
|
+
guardrailApplied = true;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
// No non-author available at all — fall back to author
|
|
360
|
+
assignee = authorName;
|
|
361
|
+
reason = `author_exclusion_bypassed: no non-author candidates available. "${authorName}" assigned as sole fallback. Non-author reviewer required.`;
|
|
362
|
+
guardrailApplied = true;
|
|
363
|
+
soleAuthorFallback = true;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else if (!guardrailEnabled) {
|
|
367
|
+
// Guardrail disabled — use scoring engine normally
|
|
368
|
+
const suggestion = suggestAssignee(syntheticTask, allTasks);
|
|
369
|
+
assignee = suggestion.suggested || authors[0] || candidates[0] || 'unassigned';
|
|
370
|
+
reason = `Guardrail disabled. Scoring engine selected "${assignee}".`;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
// Multi-author — normal routing (authors are valid candidates)
|
|
374
|
+
const suggestion = suggestAssignee(syntheticTask, allTasks);
|
|
375
|
+
assignee = suggestion.suggested || authors[0] || candidates[0] || 'unassigned';
|
|
376
|
+
reason = `Multi-author insight (${authors.length} authors). Normal scoring applied, selected "${assignee}".`;
|
|
377
|
+
}
|
|
378
|
+
// Resolve reviewer
|
|
379
|
+
const reviewer = resolveReviewer(insight, assignee, authors, soleAuthorFallback);
|
|
380
|
+
return {
|
|
381
|
+
assignee,
|
|
382
|
+
reviewer,
|
|
383
|
+
reason,
|
|
384
|
+
guardrailApplied,
|
|
385
|
+
soleAuthorFallback,
|
|
386
|
+
candidatesConsidered: candidates,
|
|
387
|
+
insightAuthors: authors,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Pick reviewer, enforcing non-author requirement when sole-author fallback was used.
|
|
392
|
+
*/
|
|
393
|
+
function resolveReviewer(insight, assignee, authors, soleAuthorFallback) {
|
|
394
|
+
// Use suggestReviewer from assignment engine
|
|
395
|
+
let allTasks = [];
|
|
396
|
+
try {
|
|
397
|
+
allTasks = taskManager.listTasks();
|
|
398
|
+
}
|
|
399
|
+
catch { /* ok */ }
|
|
400
|
+
const metaTags = Array.isArray(insight.metadata?.tags)
|
|
401
|
+
? insight.metadata.tags.map(String)
|
|
402
|
+
: [];
|
|
403
|
+
const suggestion = suggestReviewer({
|
|
404
|
+
title: `[Insight] ${insight.title}`,
|
|
405
|
+
assignee,
|
|
406
|
+
tags: [insight.cluster_key, insight.failure_family, insight.impacted_unit, ...metaTags].filter(Boolean),
|
|
407
|
+
done_criteria: insight.evidence_refs.slice(0, 10),
|
|
408
|
+
metadata: {
|
|
409
|
+
cluster_key: insight.cluster_key,
|
|
410
|
+
failure_family: insight.failure_family,
|
|
411
|
+
},
|
|
412
|
+
}, allTasks);
|
|
413
|
+
// If sole-author fallback, reviewer MUST NOT be an author
|
|
414
|
+
if (soleAuthorFallback && config.ownershipGuardrail.requireNonAuthorReviewer) {
|
|
415
|
+
if (suggestion.suggested && !authors.includes(suggestion.suggested)) {
|
|
416
|
+
return suggestion.suggested;
|
|
417
|
+
}
|
|
418
|
+
// Find any non-author reviewer from scores
|
|
419
|
+
const nonAuthorReviewer = (suggestion.scores || [])
|
|
420
|
+
.find(s => !authors.includes(s.agent) && s.agent !== assignee);
|
|
421
|
+
if (nonAuthorReviewer)
|
|
422
|
+
return nonAuthorReviewer.agent;
|
|
423
|
+
// Hard fallback: default reviewer if not an author
|
|
424
|
+
if (!authors.includes(config.defaultReviewer) && config.defaultReviewer !== assignee) {
|
|
425
|
+
return config.defaultReviewer;
|
|
426
|
+
}
|
|
427
|
+
// Last resort: any agent not the assignee
|
|
428
|
+
const roleNames = getAgentRoles().map(r => r.name);
|
|
429
|
+
const anyone = roleNames.find(r => r !== assignee && !authors.includes(r));
|
|
430
|
+
return anyone || config.defaultReviewer;
|
|
431
|
+
}
|
|
432
|
+
return suggestion.suggested || config.defaultReviewer;
|
|
433
|
+
}
|
|
434
|
+
function buildTaskDescription(insight) {
|
|
435
|
+
return [
|
|
436
|
+
`Auto-created from promoted insight **${insight.id}**.`,
|
|
437
|
+
'',
|
|
438
|
+
`**Cluster:** ${insight.cluster_key}`,
|
|
439
|
+
`**Severity:** ${insight.severity_max || 'unknown'}`,
|
|
440
|
+
`**Score:** ${insight.score}/10`,
|
|
441
|
+
`**Reflections:** ${insight.reflection_ids.length} (${insight.independent_count} independent)`,
|
|
442
|
+
`**Authors:** ${insight.authors.join(', ')}`,
|
|
443
|
+
'',
|
|
444
|
+
`**Evidence:**`,
|
|
445
|
+
...insight.evidence_refs.map(e => `- ${e}`),
|
|
446
|
+
'',
|
|
447
|
+
'Investigate root cause, validate evidence, implement fix.',
|
|
448
|
+
'Submit a follow-up reflection when done.',
|
|
449
|
+
].join('\n');
|
|
450
|
+
}
|
|
451
|
+
export function ensureTriageAuditTable() {
|
|
452
|
+
const db = getDb();
|
|
453
|
+
db.exec(`
|
|
454
|
+
CREATE TABLE IF NOT EXISTS triage_audit (
|
|
455
|
+
id TEXT PRIMARY KEY,
|
|
456
|
+
insight_id TEXT NOT NULL,
|
|
457
|
+
action TEXT NOT NULL,
|
|
458
|
+
reviewer TEXT NOT NULL,
|
|
459
|
+
rationale TEXT NOT NULL DEFAULT '',
|
|
460
|
+
outcome_task_id TEXT,
|
|
461
|
+
previous_status TEXT NOT NULL,
|
|
462
|
+
new_status TEXT NOT NULL,
|
|
463
|
+
timestamp INTEGER NOT NULL
|
|
464
|
+
);
|
|
465
|
+
CREATE INDEX IF NOT EXISTS idx_triage_audit_insight ON triage_audit(insight_id);
|
|
466
|
+
CREATE INDEX IF NOT EXISTS idx_triage_audit_ts ON triage_audit(timestamp);
|
|
467
|
+
`);
|
|
468
|
+
}
|
|
469
|
+
export function recordTriageDecision(decision) {
|
|
470
|
+
ensureTriageAuditTable();
|
|
471
|
+
const db = getDb();
|
|
472
|
+
const id = `triage-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
473
|
+
db.prepare(`
|
|
474
|
+
INSERT INTO triage_audit (id, insight_id, action, reviewer, rationale, outcome_task_id, previous_status, new_status, timestamp)
|
|
475
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
476
|
+
`).run(id, decision.insight_id, decision.action, decision.reviewer, decision.rationale, decision.outcome_task_id, decision.previous_status, decision.new_status, decision.timestamp);
|
|
477
|
+
return { id, ...decision };
|
|
478
|
+
}
|
|
479
|
+
export function getTriageAudit(insightId, limit = 50) {
|
|
480
|
+
ensureTriageAuditTable();
|
|
481
|
+
const db = getDb();
|
|
482
|
+
if (insightId) {
|
|
483
|
+
return db.prepare('SELECT * FROM triage_audit WHERE insight_id = ? ORDER BY timestamp DESC LIMIT ?')
|
|
484
|
+
.all(insightId, limit);
|
|
485
|
+
}
|
|
486
|
+
return db.prepare('SELECT * FROM triage_audit ORDER BY timestamp DESC LIMIT ?')
|
|
487
|
+
.all(limit);
|
|
488
|
+
}
|
|
489
|
+
// ── Lifecycle ──
|
|
490
|
+
export function startInsightTaskBridge() {
|
|
491
|
+
if (!config.enabled) {
|
|
492
|
+
console.log('[InsightTaskBridge] Disabled');
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
eventBus.on(LISTENER_ID, handlePromotedInsight);
|
|
496
|
+
console.log('[InsightTaskBridge] Listening for insight:promoted events');
|
|
497
|
+
// Catch-up scan: process any promoted insights that were missed
|
|
498
|
+
// (e.g., emitted before bridge was registered, or async handler failed)
|
|
499
|
+
catchUpPromotedInsights().catch(err => console.error('[InsightTaskBridge] Catch-up scan error:', err));
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Scan for promoted insights without linked tasks and process them.
|
|
503
|
+
* Runs once on bridge startup to close the event-miss gap.
|
|
504
|
+
*/
|
|
505
|
+
async function catchUpPromotedInsights() {
|
|
506
|
+
const db = getDb();
|
|
507
|
+
// Find insights that are promoted but never got a task.
|
|
508
|
+
// Check both status=promoted (set by engine) and readiness signals.
|
|
509
|
+
const rows = db.prepare(`
|
|
510
|
+
SELECT * FROM insights
|
|
511
|
+
WHERE task_id IS NULL
|
|
512
|
+
AND (
|
|
513
|
+
status = 'promoted'
|
|
514
|
+
OR promotion_readiness IN ('promoted', 'override', 'ready')
|
|
515
|
+
)
|
|
516
|
+
AND status NOT IN ('closed', 'pending_triage', 'task_created')
|
|
517
|
+
ORDER BY score DESC
|
|
518
|
+
`).all();
|
|
519
|
+
if (rows.length === 0)
|
|
520
|
+
return;
|
|
521
|
+
console.log(`[InsightTaskBridge] Catch-up: found ${rows.length} promoted insight(s) without tasks`);
|
|
522
|
+
let processed = 0;
|
|
523
|
+
for (const row of rows) {
|
|
524
|
+
const insight = getInsight(row.id);
|
|
525
|
+
if (!insight || insight.task_id)
|
|
526
|
+
continue; // re-check after getInsight
|
|
527
|
+
const severity = insight.severity_max || 'medium';
|
|
528
|
+
const isAutoCreate = config.autoCreateSeverities.includes(severity);
|
|
529
|
+
if (isAutoCreate) {
|
|
530
|
+
await autoCreateTask(insight);
|
|
531
|
+
processed++;
|
|
532
|
+
}
|
|
533
|
+
else if (insight.status !== 'pending_triage') {
|
|
534
|
+
updateInsightStatus(insight.id, 'pending_triage');
|
|
535
|
+
stats.insightsTriaged++;
|
|
536
|
+
processed++;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
if (processed > 0) {
|
|
540
|
+
console.log(`[InsightTaskBridge] Catch-up: processed ${processed} insight(s)`);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
export function stopInsightTaskBridge() {
|
|
544
|
+
eventBus.off(LISTENER_ID);
|
|
545
|
+
}
|
|
546
|
+
export function getInsightTaskBridgeStats() {
|
|
547
|
+
return { ...stats };
|
|
548
|
+
}
|
|
549
|
+
export function _resetBridgeStats() {
|
|
550
|
+
stats = { tasksAutoCreated: 0, insightsTriaged: 0, duplicatesSkipped: 0, errors: 0, lastEventAt: null };
|
|
551
|
+
}
|
|
552
|
+
export function getBridgeConfig() {
|
|
553
|
+
return { ...config, ownershipGuardrail: { ...config.ownershipGuardrail } };
|
|
554
|
+
}
|
|
555
|
+
export { handlePromotedInsight as _handlePromotedInsight };
|
|
556
|
+
//# sourceMappingURL=insight-task-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insight-task-bridge.js","sourceRoot":"","sources":["../src/insight-task-bridge.ts"],"names":[],"mappings":"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"}
|