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,378 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Activation Funnel Events — 6 lifecycle hooks for measuring
|
|
5
|
+
* signup-to-value conversion at launch.
|
|
6
|
+
*
|
|
7
|
+
* Events:
|
|
8
|
+
* 1. signup_completed — User account created and verified
|
|
9
|
+
* 2. workspace_ready — Org + team + first host connected
|
|
10
|
+
* 3. first_task_started — First task moved to "doing"
|
|
11
|
+
* 4. first_task_completed — First task moved to "done"
|
|
12
|
+
* 5. first_team_message_sent — First chat message sent by a human user
|
|
13
|
+
* 6. day2_return_action — Any meaningful action ≥24h after signup
|
|
14
|
+
*
|
|
15
|
+
* Each event is recorded once per userId (idempotent).
|
|
16
|
+
* Events are persisted to a JSONL audit file and queryable via
|
|
17
|
+
* GET /activation/funnel.
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs } from 'node:fs';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
const DATA_DIR = process.env.REFLECTT_DATA_DIR || path.join(process.cwd(), 'data');
|
|
22
|
+
const FUNNEL_FILE = path.join(DATA_DIR, 'activation-funnel.jsonl');
|
|
23
|
+
/* ─── In-memory state ─── */
|
|
24
|
+
/** userId → { eventType → timestamp } */
|
|
25
|
+
const userFunnels = new Map();
|
|
26
|
+
/** Ordered event log (also persisted) */
|
|
27
|
+
const eventLog = [];
|
|
28
|
+
const MAX_LOG_SIZE = 10_000;
|
|
29
|
+
const FUNNEL_ORDER = [
|
|
30
|
+
'signup_completed',
|
|
31
|
+
'host_preflight_passed',
|
|
32
|
+
// Note: host_preflight_failed is tracked in the event log but is NOT a
|
|
33
|
+
// forward funnel step — failure doesn't represent onboarding progress.
|
|
34
|
+
'workspace_ready',
|
|
35
|
+
'first_task_started',
|
|
36
|
+
'first_task_completed',
|
|
37
|
+
'first_team_message_sent',
|
|
38
|
+
'day2_return_action',
|
|
39
|
+
];
|
|
40
|
+
/* ─── Core API ─── */
|
|
41
|
+
/**
|
|
42
|
+
* Emit an activation event. Idempotent per (userId, type).
|
|
43
|
+
* Returns true if this was the first time the event fired for this user.
|
|
44
|
+
*/
|
|
45
|
+
export async function emitActivationEvent(type, userId, metadata) {
|
|
46
|
+
if (!userId)
|
|
47
|
+
return false;
|
|
48
|
+
let userMap = userFunnels.get(userId);
|
|
49
|
+
if (!userMap) {
|
|
50
|
+
userMap = new Map();
|
|
51
|
+
userFunnels.set(userId, userMap);
|
|
52
|
+
}
|
|
53
|
+
// Idempotent: skip if already recorded
|
|
54
|
+
if (userMap.has(type))
|
|
55
|
+
return false;
|
|
56
|
+
const timestamp = Date.now();
|
|
57
|
+
userMap.set(type, timestamp);
|
|
58
|
+
const event = { type, userId, timestamp, metadata };
|
|
59
|
+
eventLog.push(event);
|
|
60
|
+
if (eventLog.length > MAX_LOG_SIZE) {
|
|
61
|
+
eventLog.splice(0, eventLog.length - MAX_LOG_SIZE);
|
|
62
|
+
}
|
|
63
|
+
// Persist (best-effort)
|
|
64
|
+
try {
|
|
65
|
+
await fs.mkdir(DATA_DIR, { recursive: true });
|
|
66
|
+
await fs.appendFile(FUNNEL_FILE, JSON.stringify(event) + '\n', 'utf-8');
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error('[ActivationFunnel] Failed to persist event:', err);
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get funnel state for a specific user.
|
|
75
|
+
*/
|
|
76
|
+
export function getUserFunnelState(userId) {
|
|
77
|
+
const userMap = userFunnels.get(userId);
|
|
78
|
+
const events = {
|
|
79
|
+
signup_completed: null,
|
|
80
|
+
host_preflight_passed: null,
|
|
81
|
+
host_preflight_failed: null,
|
|
82
|
+
workspace_ready: null,
|
|
83
|
+
first_task_started: null,
|
|
84
|
+
first_task_completed: null,
|
|
85
|
+
first_team_message_sent: null,
|
|
86
|
+
day2_return_action: null,
|
|
87
|
+
};
|
|
88
|
+
let currentStep = 0;
|
|
89
|
+
if (userMap) {
|
|
90
|
+
for (const type of FUNNEL_ORDER) {
|
|
91
|
+
const ts = userMap.get(type);
|
|
92
|
+
if (ts !== undefined) {
|
|
93
|
+
events[type] = ts;
|
|
94
|
+
currentStep++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Populate tracked-but-not-funnel events (e.g. host_preflight_failed)
|
|
98
|
+
for (const [type, ts] of userMap) {
|
|
99
|
+
if (!FUNNEL_ORDER.includes(type) && events[type] === null) {
|
|
100
|
+
events[type] = ts;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const allDone = currentStep === FUNNEL_ORDER.length;
|
|
105
|
+
const completedAt = allDone
|
|
106
|
+
? Math.max(...Object.values(events).filter((v) => v !== null))
|
|
107
|
+
: null;
|
|
108
|
+
return { userId, events, currentStep, completedAt };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get funnel summary across all users.
|
|
112
|
+
*/
|
|
113
|
+
export function getFunnelSummary() {
|
|
114
|
+
const stepCounts = {
|
|
115
|
+
signup_completed: 0,
|
|
116
|
+
host_preflight_passed: 0,
|
|
117
|
+
host_preflight_failed: 0,
|
|
118
|
+
workspace_ready: 0,
|
|
119
|
+
first_task_started: 0,
|
|
120
|
+
first_task_completed: 0,
|
|
121
|
+
first_team_message_sent: 0,
|
|
122
|
+
day2_return_action: 0,
|
|
123
|
+
};
|
|
124
|
+
const funnelByUser = [];
|
|
125
|
+
let completedUsers = 0;
|
|
126
|
+
for (const userId of userFunnels.keys()) {
|
|
127
|
+
const state = getUserFunnelState(userId);
|
|
128
|
+
funnelByUser.push(state);
|
|
129
|
+
for (const type of FUNNEL_ORDER) {
|
|
130
|
+
if (state.events[type] !== null) {
|
|
131
|
+
stepCounts[type]++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (state.completedAt !== null)
|
|
135
|
+
completedUsers++;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
totalUsers: userFunnels.size,
|
|
139
|
+
stepCounts,
|
|
140
|
+
completedUsers,
|
|
141
|
+
funnelByUser,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if a user has completed a specific event.
|
|
146
|
+
*/
|
|
147
|
+
export function hasCompletedEvent(userId, type) {
|
|
148
|
+
return userFunnels.get(userId)?.has(type) ?? false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the signup timestamp for a user (for day2 calculation).
|
|
152
|
+
*/
|
|
153
|
+
export function getSignupTimestamp(userId) {
|
|
154
|
+
return userFunnels.get(userId)?.get('signup_completed') ?? null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Check if ≥24h have passed since signup (for day2_return_action eligibility).
|
|
158
|
+
*/
|
|
159
|
+
export function isDay2Eligible(userId) {
|
|
160
|
+
const signupTs = getSignupTimestamp(userId);
|
|
161
|
+
if (!signupTs)
|
|
162
|
+
return false;
|
|
163
|
+
return (Date.now() - signupTs) >= 24 * 60 * 60 * 1000;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Load persisted funnel events from disk on startup.
|
|
167
|
+
*/
|
|
168
|
+
export async function loadActivationFunnel() {
|
|
169
|
+
try {
|
|
170
|
+
const data = await fs.readFile(FUNNEL_FILE, 'utf-8');
|
|
171
|
+
const lines = data.split('\n').filter(l => l.trim());
|
|
172
|
+
let loaded = 0;
|
|
173
|
+
for (const line of lines) {
|
|
174
|
+
try {
|
|
175
|
+
const event = JSON.parse(line);
|
|
176
|
+
if (!event.type || !event.userId || !event.timestamp)
|
|
177
|
+
continue;
|
|
178
|
+
let userMap = userFunnels.get(event.userId);
|
|
179
|
+
if (!userMap) {
|
|
180
|
+
userMap = new Map();
|
|
181
|
+
userFunnels.set(event.userId, userMap);
|
|
182
|
+
}
|
|
183
|
+
// Only keep the first occurrence
|
|
184
|
+
if (!userMap.has(event.type)) {
|
|
185
|
+
userMap.set(event.type, event.timestamp);
|
|
186
|
+
}
|
|
187
|
+
eventLog.push(event);
|
|
188
|
+
loaded++;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Skip malformed lines
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (eventLog.length > MAX_LOG_SIZE) {
|
|
195
|
+
eventLog.splice(0, eventLog.length - MAX_LOG_SIZE);
|
|
196
|
+
}
|
|
197
|
+
return loaded;
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err?.code === 'ENOENT')
|
|
201
|
+
return 0;
|
|
202
|
+
console.error('[ActivationFunnel] Failed to load funnel data:', err);
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get step-by-step conversion funnel with rates and timing.
|
|
208
|
+
*/
|
|
209
|
+
export function getConversionFunnel() {
|
|
210
|
+
const conversions = [];
|
|
211
|
+
let prevReached = userFunnels.size; // total users = denominator for first step
|
|
212
|
+
for (let i = 0; i < FUNNEL_ORDER.length; i++) {
|
|
213
|
+
const step = FUNNEL_ORDER[i];
|
|
214
|
+
let reached = 0;
|
|
215
|
+
for (const userMap of userFunnels.values()) {
|
|
216
|
+
if (userMap.has(step))
|
|
217
|
+
reached++;
|
|
218
|
+
}
|
|
219
|
+
// Compute median time from previous step
|
|
220
|
+
let medianTimeMs = null;
|
|
221
|
+
if (i > 0) {
|
|
222
|
+
const prevStep = FUNNEL_ORDER[i - 1];
|
|
223
|
+
const deltas = [];
|
|
224
|
+
for (const userMap of userFunnels.values()) {
|
|
225
|
+
const prevTs = userMap.get(prevStep);
|
|
226
|
+
const thisTs = userMap.get(step);
|
|
227
|
+
if (prevTs !== undefined && thisTs !== undefined) {
|
|
228
|
+
deltas.push(thisTs - prevTs);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (deltas.length > 0) {
|
|
232
|
+
deltas.sort((a, b) => a - b);
|
|
233
|
+
medianTimeMs = deltas[Math.floor(deltas.length / 2)];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
conversions.push({
|
|
237
|
+
step,
|
|
238
|
+
reached,
|
|
239
|
+
conversionRate: prevReached > 0 ? reached / prevReached : 0,
|
|
240
|
+
medianTimeMs,
|
|
241
|
+
});
|
|
242
|
+
prevReached = reached;
|
|
243
|
+
}
|
|
244
|
+
return conversions;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get failure-reason distribution per step.
|
|
248
|
+
* Looks at event metadata for `failed_checks`, `first_blocker`, `error`, etc.
|
|
249
|
+
*/
|
|
250
|
+
export function getFailureDistribution() {
|
|
251
|
+
const distribution = [];
|
|
252
|
+
for (let i = 0; i < FUNNEL_ORDER.length; i++) {
|
|
253
|
+
const step = FUNNEL_ORDER[i];
|
|
254
|
+
const prevStep = i > 0 ? FUNNEL_ORDER[i - 1] : null;
|
|
255
|
+
// Count users who reached prev step but not this one
|
|
256
|
+
let droppedCount = 0;
|
|
257
|
+
const reasonCounts = new Map();
|
|
258
|
+
for (const [userId, userMap] of userFunnels.entries()) {
|
|
259
|
+
const reachedPrev = prevStep === null || userMap.has(prevStep);
|
|
260
|
+
const reachedThis = userMap.has(step);
|
|
261
|
+
if (reachedPrev && !reachedThis) {
|
|
262
|
+
droppedCount++;
|
|
263
|
+
// Check if there's a failure event with metadata
|
|
264
|
+
// For preflight: host_preflight_failed has failed_checks/first_blocker
|
|
265
|
+
const failEvent = step === 'host_preflight_passed'
|
|
266
|
+
? eventLog.find(e => e.userId === userId && e.type === 'host_preflight_failed')
|
|
267
|
+
: null;
|
|
268
|
+
if (failEvent?.metadata) {
|
|
269
|
+
const meta = failEvent.metadata;
|
|
270
|
+
if (Array.isArray(meta.failed_checks)) {
|
|
271
|
+
for (const check of meta.failed_checks) {
|
|
272
|
+
reasonCounts.set(check, (reasonCounts.get(check) || 0) + 1);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else if (meta.first_blocker) {
|
|
276
|
+
const reason = String(meta.first_blocker);
|
|
277
|
+
reasonCounts.set(reason, (reasonCounts.get(reason) || 0) + 1);
|
|
278
|
+
}
|
|
279
|
+
else if (meta.error) {
|
|
280
|
+
const reason = String(meta.error);
|
|
281
|
+
reasonCounts.set(reason, (reasonCounts.get(reason) || 0) + 1);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Generic: check for any failure metadata on events at this step
|
|
285
|
+
const stepFailEvents = eventLog.filter(e => e.userId === userId && e.metadata?.failedAt === step);
|
|
286
|
+
for (const fe of stepFailEvents) {
|
|
287
|
+
const reason = String(fe.metadata?.reason || 'unknown');
|
|
288
|
+
reasonCounts.set(reason, (reasonCounts.get(reason) || 0) + 1);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const reasons = Array.from(reasonCounts.entries())
|
|
293
|
+
.map(([reason, count]) => ({ reason, count }))
|
|
294
|
+
.sort((a, b) => b.count - a.count);
|
|
295
|
+
// Add "unspecified" for drops without metadata
|
|
296
|
+
const specifiedDrops = reasons.reduce((sum, r) => sum + r.count, 0);
|
|
297
|
+
if (droppedCount > specifiedDrops) {
|
|
298
|
+
reasons.push({ reason: 'unspecified', count: droppedCount - specifiedDrops });
|
|
299
|
+
}
|
|
300
|
+
distribution.push({ step, droppedCount, reasons });
|
|
301
|
+
}
|
|
302
|
+
return distribution;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get weekly trend snapshots for planning.
|
|
306
|
+
* Groups events by ISO week (Monday–Sunday).
|
|
307
|
+
*/
|
|
308
|
+
export function getWeeklyTrends(weekCount = 12) {
|
|
309
|
+
const now = Date.now();
|
|
310
|
+
const MS_PER_WEEK = 7 * 24 * 60 * 60 * 1000;
|
|
311
|
+
// Calculate week boundaries going back `weekCount` weeks
|
|
312
|
+
const trends = [];
|
|
313
|
+
// Find Monday of the current week as anchor
|
|
314
|
+
const anchor = new Date(now);
|
|
315
|
+
const anchorDay = anchor.getUTCDay();
|
|
316
|
+
const anchorMondayOffset = anchorDay === 0 ? -6 : 1 - anchorDay;
|
|
317
|
+
anchor.setUTCDate(anchor.getUTCDate() + anchorMondayOffset);
|
|
318
|
+
anchor.setUTCHours(0, 0, 0, 0);
|
|
319
|
+
const currentMondayTs = anchor.getTime();
|
|
320
|
+
for (let w = weekCount - 1; w >= 0; w--) {
|
|
321
|
+
const mondayTs = currentMondayTs - w * MS_PER_WEEK;
|
|
322
|
+
const sundayTs = mondayTs + MS_PER_WEEK - 1;
|
|
323
|
+
const stepCounts = {
|
|
324
|
+
signup_completed: 0,
|
|
325
|
+
host_preflight_passed: 0,
|
|
326
|
+
host_preflight_failed: 0,
|
|
327
|
+
workspace_ready: 0,
|
|
328
|
+
first_task_started: 0,
|
|
329
|
+
first_task_completed: 0,
|
|
330
|
+
first_team_message_sent: 0,
|
|
331
|
+
day2_return_action: 0,
|
|
332
|
+
};
|
|
333
|
+
let newUsers = 0;
|
|
334
|
+
let completedUsers = 0;
|
|
335
|
+
// Count events in this week window
|
|
336
|
+
for (const event of eventLog) {
|
|
337
|
+
if (event.timestamp >= mondayTs && event.timestamp <= sundayTs) {
|
|
338
|
+
if (event.type in stepCounts) {
|
|
339
|
+
stepCounts[event.type]++;
|
|
340
|
+
}
|
|
341
|
+
if (event.type === 'signup_completed')
|
|
342
|
+
newUsers++;
|
|
343
|
+
if (event.type === 'day2_return_action')
|
|
344
|
+
completedUsers++;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
trends.push({
|
|
348
|
+
weekStart: new Date(mondayTs).toISOString().slice(0, 10),
|
|
349
|
+
weekEnd: new Date(sundayTs).toISOString().slice(0, 10),
|
|
350
|
+
newUsers,
|
|
351
|
+
completedUsers,
|
|
352
|
+
stepCounts,
|
|
353
|
+
conversionRate: newUsers > 0 ? completedUsers / newUsers : 0,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
return trends;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Full onboarding telemetry dashboard snapshot.
|
|
360
|
+
* Combines funnel, failure distribution, and trends.
|
|
361
|
+
*/
|
|
362
|
+
export function getOnboardingDashboard(opts) {
|
|
363
|
+
return {
|
|
364
|
+
timestamp: Date.now(),
|
|
365
|
+
funnel: getConversionFunnel(),
|
|
366
|
+
failures: getFailureDistribution(),
|
|
367
|
+
trends: getWeeklyTrends(opts?.weeks || 12),
|
|
368
|
+
summary: getFunnelSummary(),
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Reset funnel state (for testing).
|
|
373
|
+
*/
|
|
374
|
+
export function resetActivationFunnel() {
|
|
375
|
+
userFunnels.clear();
|
|
376
|
+
eventLog.length = 0;
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=activationEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activationEvents.js","sourceRoot":"","sources":["../src/activationEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type ActivitySource = 'status_comment' | 'state_transition' | 'task_created' | 'none';
|
|
2
|
+
export interface ActivitySignal {
|
|
3
|
+
/** The effective timestamp used for enforcement decisions */
|
|
4
|
+
effectiveActivityTs: number;
|
|
5
|
+
/** Which source produced the winning timestamp */
|
|
6
|
+
source: ActivitySource;
|
|
7
|
+
/** Individual signal timestamps for debugging */
|
|
8
|
+
signals: {
|
|
9
|
+
lastCommentAt: number | null;
|
|
10
|
+
lastStateTransitionAt: number | null;
|
|
11
|
+
taskCreatedAt: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Compute the effective activity signal for a task.
|
|
16
|
+
*
|
|
17
|
+
* @param taskId - Task ID
|
|
18
|
+
* @param agent - Optional: restrict comment lookups to this agent
|
|
19
|
+
* @param taskCreatedAt - Fallback timestamp (from task record)
|
|
20
|
+
* @returns ActivitySignal with effective timestamp and source
|
|
21
|
+
*/
|
|
22
|
+
export declare function getEffectiveActivity(taskId: string, agent?: string | null, taskCreatedAt?: number): ActivitySignal;
|
|
23
|
+
/**
|
|
24
|
+
* Format an activity signal for inclusion in warning messages.
|
|
25
|
+
*
|
|
26
|
+
* Example output:
|
|
27
|
+
* "last activity: 47m ago (status_comment at 2025-01-15 14:23 UTC), threshold: 90m"
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatActivityWarning(signal: ActivitySignal, thresholdMin: number, now?: number): string;
|
|
30
|
+
//# sourceMappingURL=activity-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-signal.d.ts","sourceRoot":"","sources":["../src/activity-signal.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,cAAc,GACd,MAAM,CAAA;AAEV,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kDAAkD;IAClD,MAAM,EAAE,cAAc,CAAA;IACtB,iDAAiD;IACjD,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAID;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,cAAc,CA6DhB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,MAAM,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAOR"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Activity Signal — canonical "last real activity" for enforcement decisions.
|
|
5
|
+
*
|
|
6
|
+
* Problem: task.updatedAt is brittle — it's bumped by metadata edits, reviewer
|
|
7
|
+
* assignment, and other non-activity changes. Enforcement keying off updatedAt
|
|
8
|
+
* produces false stale warnings.
|
|
9
|
+
*
|
|
10
|
+
* Solution: effective_activity_ts = max(
|
|
11
|
+
* last_status_comment_at, — most recent task comment by assigned agent
|
|
12
|
+
* last_state_transition_at, — most recent status change in task_history
|
|
13
|
+
* task_created_at, — fallback for brand-new tasks
|
|
14
|
+
* )
|
|
15
|
+
*
|
|
16
|
+
* Each signal source is tracked so warnings can report WHY enforcement fired.
|
|
17
|
+
*/
|
|
18
|
+
import { getDb } from './db.js';
|
|
19
|
+
// ── Core function ──
|
|
20
|
+
/**
|
|
21
|
+
* Compute the effective activity signal for a task.
|
|
22
|
+
*
|
|
23
|
+
* @param taskId - Task ID
|
|
24
|
+
* @param agent - Optional: restrict comment lookups to this agent
|
|
25
|
+
* @param taskCreatedAt - Fallback timestamp (from task record)
|
|
26
|
+
* @returns ActivitySignal with effective timestamp and source
|
|
27
|
+
*/
|
|
28
|
+
export function getEffectiveActivity(taskId, agent, taskCreatedAt) {
|
|
29
|
+
const db = getDb();
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
if (taskCreatedAt === undefined) {
|
|
32
|
+
// Warn: callers should always pass task.createdAt to avoid masking staleness
|
|
33
|
+
console.warn(`[activity-signal] taskCreatedAt not provided for task ${taskId} — falling back to now (may mask staleness)`);
|
|
34
|
+
}
|
|
35
|
+
const created = taskCreatedAt ?? now;
|
|
36
|
+
// 1. Last comment by the agent (or any author)
|
|
37
|
+
let lastCommentAt = null;
|
|
38
|
+
try {
|
|
39
|
+
const commentQuery = agent
|
|
40
|
+
? db.prepare('SELECT MAX(timestamp) as latest FROM task_comments WHERE task_id = ? AND author = ? AND (suppressed IS NULL OR suppressed = 0)').get(taskId, agent)
|
|
41
|
+
: db.prepare('SELECT MAX(timestamp) as latest FROM task_comments WHERE task_id = ? AND (suppressed IS NULL OR suppressed = 0)').get(taskId);
|
|
42
|
+
lastCommentAt = commentQuery?.latest ?? null;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
// DB not available — fall through to createdAt (may revert to updatedAt-like behavior)
|
|
46
|
+
console.warn(`[activity-signal] comment query failed for task ${taskId}, falling back:`, err.message);
|
|
47
|
+
}
|
|
48
|
+
// 2. Last state transition from task_history
|
|
49
|
+
let lastStateTransitionAt = null;
|
|
50
|
+
try {
|
|
51
|
+
const historyRow = db.prepare('SELECT MAX(timestamp) as latest FROM task_history WHERE task_id = ?').get(taskId);
|
|
52
|
+
lastStateTransitionAt = historyRow?.latest ?? null;
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
// DB not available — fall through to createdAt
|
|
56
|
+
console.warn(`[activity-signal] history query failed for task ${taskId}, falling back:`, err.message);
|
|
57
|
+
}
|
|
58
|
+
// 3. Determine winner (monotonic: highest timestamp wins)
|
|
59
|
+
const candidates = [];
|
|
60
|
+
if (lastCommentAt !== null && lastCommentAt > 0) {
|
|
61
|
+
candidates.push({ ts: lastCommentAt, source: 'status_comment' });
|
|
62
|
+
}
|
|
63
|
+
if (lastStateTransitionAt !== null && lastStateTransitionAt > 0) {
|
|
64
|
+
candidates.push({ ts: lastStateTransitionAt, source: 'state_transition' });
|
|
65
|
+
}
|
|
66
|
+
candidates.push({ ts: created, source: 'task_created' });
|
|
67
|
+
// Sort descending — highest timestamp wins (monotonic guard)
|
|
68
|
+
candidates.sort((a, b) => b.ts - a.ts);
|
|
69
|
+
const winner = candidates[0];
|
|
70
|
+
return {
|
|
71
|
+
effectiveActivityTs: winner.ts,
|
|
72
|
+
source: winner.source,
|
|
73
|
+
signals: {
|
|
74
|
+
lastCommentAt,
|
|
75
|
+
lastStateTransitionAt,
|
|
76
|
+
taskCreatedAt: created,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format an activity signal for inclusion in warning messages.
|
|
82
|
+
*
|
|
83
|
+
* Example output:
|
|
84
|
+
* "last activity: 47m ago (status_comment at 2025-01-15 14:23 UTC), threshold: 90m"
|
|
85
|
+
*/
|
|
86
|
+
export function formatActivityWarning(signal, thresholdMin, now) {
|
|
87
|
+
const ts = now || Date.now();
|
|
88
|
+
const ageMin = Math.max(0, Math.floor((ts - signal.effectiveActivityTs) / 60_000));
|
|
89
|
+
const sourceLabel = signal.source.replace(/_/g, ' ');
|
|
90
|
+
const timeStr = new Date(signal.effectiveActivityTs).toISOString().replace('T', ' ').slice(0, 19) + ' UTC';
|
|
91
|
+
return `last activity: ${ageMin}m ago (${sourceLabel} at ${timeStr}), threshold: ${thresholdMin}m`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=activity-signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-signal.js","sourceRoot":"","sources":["../src/activity-signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export interface AlertPreflightInput {
|
|
2
|
+
/** Task the alert is about */
|
|
3
|
+
taskId: string;
|
|
4
|
+
/** Type of alert being sent */
|
|
5
|
+
alertType: 'sla_warning' | 'sla_breach' | 'stale_task' | 'requeue' | 'idle_nudge' | 'watchdog' | 'escalation' | 'mention_rescue' | 'generic';
|
|
6
|
+
/** The alert content (for dedup hashing) */
|
|
7
|
+
content: string;
|
|
8
|
+
/** Who triggered the alert */
|
|
9
|
+
from: string;
|
|
10
|
+
/** Expected task state when alert was generated */
|
|
11
|
+
expectedState?: {
|
|
12
|
+
status?: string;
|
|
13
|
+
assignee?: string;
|
|
14
|
+
reviewer?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface AlertPreflightResult {
|
|
18
|
+
/** Whether the alert should be published */
|
|
19
|
+
allowed: boolean;
|
|
20
|
+
/** Why the alert was allowed or suppressed */
|
|
21
|
+
reason: string;
|
|
22
|
+
/** Detailed reason code for metrics */
|
|
23
|
+
reasonCode: 'allowed' | 'task_not_found' | 'status_changed' | 'assignee_changed' | 'recent_activity' | 'duplicate' | 'task_done' | 'canary_allowed';
|
|
24
|
+
/** Live task state at preflight time */
|
|
25
|
+
liveState?: {
|
|
26
|
+
status: string;
|
|
27
|
+
assignee: string;
|
|
28
|
+
reviewer: string;
|
|
29
|
+
lastCommentTs: number | null;
|
|
30
|
+
stateHash: string;
|
|
31
|
+
};
|
|
32
|
+
/** Preflight latency in ms */
|
|
33
|
+
latencyMs: number;
|
|
34
|
+
}
|
|
35
|
+
export interface AlertIntegrityConfig {
|
|
36
|
+
/** Enable preflight checks (default: true) */
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
/** Canary mode — log but don't suppress (default: true) */
|
|
39
|
+
canaryMode: boolean;
|
|
40
|
+
/** Recent activity window — suppress alerts if task was commented on within this window */
|
|
41
|
+
recentActivityWindowMs: number;
|
|
42
|
+
/** Idempotent dedup window — suppress identical alerts within this window */
|
|
43
|
+
dedupWindowMs: number;
|
|
44
|
+
/** Alert types that bypass preflight (always send) */
|
|
45
|
+
bypassTypes: string[];
|
|
46
|
+
/** Maximum dedup cache entries */
|
|
47
|
+
maxDedupEntries: number;
|
|
48
|
+
}
|
|
49
|
+
export interface AlertIntegrityStats {
|
|
50
|
+
totalChecked: number;
|
|
51
|
+
totalAllowed: number;
|
|
52
|
+
totalSuppressed: number;
|
|
53
|
+
suppressionsByReason: Record<string, number>;
|
|
54
|
+
canaryWouldSuppress: number;
|
|
55
|
+
avgLatencyMs: number;
|
|
56
|
+
p95LatencyMs: number;
|
|
57
|
+
}
|
|
58
|
+
export declare class AlertIntegrityGuard {
|
|
59
|
+
private config;
|
|
60
|
+
private dedupCache;
|
|
61
|
+
private auditLog;
|
|
62
|
+
private latencies;
|
|
63
|
+
private stats;
|
|
64
|
+
constructor(config?: Partial<AlertIntegrityConfig>);
|
|
65
|
+
/**
|
|
66
|
+
* Run preflight reconciliation for a task-scoped alert.
|
|
67
|
+
* Returns whether the alert should be published.
|
|
68
|
+
*/
|
|
69
|
+
preflight(input: AlertPreflightInput): AlertPreflightResult;
|
|
70
|
+
private buildLiveState;
|
|
71
|
+
private computeStateHash;
|
|
72
|
+
private computeIdempotentKey;
|
|
73
|
+
private maybeCanary;
|
|
74
|
+
private recordResult;
|
|
75
|
+
private updateLatencyStats;
|
|
76
|
+
private pruneDedupCache;
|
|
77
|
+
getStats(): AlertIntegrityStats;
|
|
78
|
+
getAuditLog(options?: {
|
|
79
|
+
limit?: number;
|
|
80
|
+
since?: number;
|
|
81
|
+
taskId?: string;
|
|
82
|
+
}): typeof this.auditLog;
|
|
83
|
+
/**
|
|
84
|
+
* Get rollback signals for canary evaluation.
|
|
85
|
+
*/
|
|
86
|
+
getRollbackSignals(): {
|
|
87
|
+
missedTruePositives: number;
|
|
88
|
+
p95LatencyMs: number;
|
|
89
|
+
criticalAlertErrors: number;
|
|
90
|
+
rollbackTriggered: boolean;
|
|
91
|
+
};
|
|
92
|
+
getConfig(): Readonly<AlertIntegrityConfig>;
|
|
93
|
+
updateConfig(updates: Partial<AlertIntegrityConfig>): void;
|
|
94
|
+
/** Exit canary mode — start enforcing suppression */
|
|
95
|
+
activateEnforcement(): void;
|
|
96
|
+
/** Reset stats (for testing) */
|
|
97
|
+
resetStats(): void;
|
|
98
|
+
}
|
|
99
|
+
export declare const alertIntegrityGuard: AlertIntegrityGuard;
|
|
100
|
+
//# sourceMappingURL=alert-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-integrity.d.ts","sourceRoot":"","sources":["../src/alert-integrity.ts"],"names":[],"mappings":"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"}
|