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 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE;QACR,MAAM,EAAE,mBAAmB,CAAA;QAC3B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,SAAS,EAAE,mBAAmB,CAAA;QAC9B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,UAAU,EAAE,mBAAmB,CAAA;QAC/B,SAAS,EAAE,mBAAmB,CAAA;KAC/B,CAAA;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAwCD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCxB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiF9D"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Doctor CLI support — collect onboarding diagnostics via HTTP endpoints.
|
|
3
|
+
async function getJson(fetchFn, baseUrl, path, timeoutMs) {
|
|
4
|
+
const started = Date.now();
|
|
5
|
+
const controller = new AbortController();
|
|
6
|
+
const t = setTimeout(() => controller.abort(), timeoutMs);
|
|
7
|
+
try {
|
|
8
|
+
const res = await fetchFn(`${baseUrl}${path}`, {
|
|
9
|
+
method: 'GET',
|
|
10
|
+
headers: { accept: 'application/json' },
|
|
11
|
+
signal: controller.signal,
|
|
12
|
+
});
|
|
13
|
+
const ms = Date.now() - started;
|
|
14
|
+
const json = await res.json().catch(() => null);
|
|
15
|
+
if (!res.ok) {
|
|
16
|
+
const errMsg = (json && (json.error || json.message))
|
|
17
|
+
? String(json.error || json.message)
|
|
18
|
+
: `HTTP ${res.status}`;
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
status: res.status,
|
|
22
|
+
ms,
|
|
23
|
+
error: errMsg,
|
|
24
|
+
data: json,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { ok: true, status: res.status, ms, data: json };
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const ms = Date.now() - started;
|
|
31
|
+
return { ok: false, ms, error: err?.name === 'AbortError' ? `timeout after ${timeoutMs}ms` : String(err?.message || err) };
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
clearTimeout(t);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function collectDoctorReport(input) {
|
|
38
|
+
const baseUrl = input.baseUrl.replace(/\/+$/, '');
|
|
39
|
+
const timeoutMs = input.timeoutMs ?? 4000;
|
|
40
|
+
const fetchFn = input.fetchFn ?? fetch;
|
|
41
|
+
const [health, system, execution, policy, teamDoctor, preflight] = await Promise.all([
|
|
42
|
+
getJson(fetchFn, baseUrl, '/health', timeoutMs),
|
|
43
|
+
getJson(fetchFn, baseUrl, '/health/system', timeoutMs),
|
|
44
|
+
getJson(fetchFn, baseUrl, '/execution-health', timeoutMs),
|
|
45
|
+
getJson(fetchFn, baseUrl, '/policy', timeoutMs),
|
|
46
|
+
getJson(fetchFn, baseUrl, '/health/team/doctor', timeoutMs),
|
|
47
|
+
getJson(fetchFn, baseUrl, '/preflight', timeoutMs),
|
|
48
|
+
]);
|
|
49
|
+
const sections = { health, system, execution, policy, teamDoctor, preflight };
|
|
50
|
+
const teamOverall = teamDoctor.ok ? teamDoctor.data?.overall : undefined;
|
|
51
|
+
const hardFail = Object.values(sections).some(s => !s.ok) || teamOverall === 'fail';
|
|
52
|
+
const hasWarn = !hardFail && teamOverall === 'warn';
|
|
53
|
+
const overall = hardFail ? 'fail' : hasWarn ? 'warn' : 'pass';
|
|
54
|
+
const ok = overall !== 'fail';
|
|
55
|
+
const hints = [];
|
|
56
|
+
if (!health.ok)
|
|
57
|
+
hints.push('Server not reachable: ensure reflectt-node is running (try `reflectt start`), and check host/port in ~/.reflectt/config.json');
|
|
58
|
+
if (teamDoctor.ok && teamOverall === 'fail')
|
|
59
|
+
hints.push('Team doctor reports failures — fix the first failing check and re-run `reflectt doctor`');
|
|
60
|
+
if (teamDoctor.ok && teamOverall === 'warn')
|
|
61
|
+
hints.push('Team doctor reports warnings — fix warnings to improve reliability and re-run `reflectt doctor`');
|
|
62
|
+
if (execution.ok && execution.data?.sweeper?.running === false)
|
|
63
|
+
hints.push('Execution sweeper is not running — validating queue may not be enforced');
|
|
64
|
+
if (preflight.ok && preflight.data?.allPassed === false)
|
|
65
|
+
hints.push('Preflight checks failing — run `curl -s /preflight | jq` and fix failing checks before onboarding users');
|
|
66
|
+
return {
|
|
67
|
+
baseUrl,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
overall,
|
|
70
|
+
ok,
|
|
71
|
+
sections,
|
|
72
|
+
hints,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function formatDoctorHuman(report) {
|
|
76
|
+
const lines = [];
|
|
77
|
+
const label = report.overall === 'pass' ? 'PASS' : report.overall === 'warn' ? 'WARN' : 'FAIL';
|
|
78
|
+
lines.push(`reflectt doctor — ${label}`);
|
|
79
|
+
lines.push(`baseUrl: ${report.baseUrl}`);
|
|
80
|
+
lines.push(`timestamp: ${new Date(report.timestamp).toISOString()}`);
|
|
81
|
+
lines.push('');
|
|
82
|
+
function section(name, title, pick) {
|
|
83
|
+
const s = report.sections[name];
|
|
84
|
+
const head = `${s.ok ? '✅' : '❌'} ${title}${s.status ? ` (HTTP ${s.status})` : ''}${typeof s.ms === 'number' ? ` — ${s.ms}ms` : ''}`;
|
|
85
|
+
lines.push(head);
|
|
86
|
+
if (!s.ok) {
|
|
87
|
+
if (s.error)
|
|
88
|
+
lines.push(` error: ${s.error}`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const detail = pick ? pick(s.data) : '';
|
|
93
|
+
if (detail)
|
|
94
|
+
lines.push(` ${detail}`);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// ignore formatting errors
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
section('health', '/health', (d) => `status=${d?.status ?? 'unknown'} version=${d?.version ?? 'n/a'} commit=${d?.commit ?? 'n/a'}`);
|
|
101
|
+
section('system', '/health/system', (d) => {
|
|
102
|
+
const uptimeH = d?.uptimeHours ?? d?.uptime_hours;
|
|
103
|
+
const req = d?.requestCount ?? d?.request_count;
|
|
104
|
+
const errRate = d?.errorRate ?? d?.error_rate;
|
|
105
|
+
return `uptimeHours=${uptimeH ?? 'n/a'} requestCount=${req ?? 'n/a'} errorRate=${errRate ?? 'n/a'}%`;
|
|
106
|
+
});
|
|
107
|
+
section('execution', '/execution-health', (d) => {
|
|
108
|
+
const running = d?.sweeper?.running;
|
|
109
|
+
const last = d?.sweeper?.lastSweepAt;
|
|
110
|
+
const v = Array.isArray(d?.current?.violations) ? d.current.violations.length : 'n/a';
|
|
111
|
+
return `sweeper.running=${String(running)} lastSweepAt=${last ?? 'n/a'} violations=${v}`;
|
|
112
|
+
});
|
|
113
|
+
section('policy', '/policy', (d) => {
|
|
114
|
+
const qh = d?.policy?.quietHours;
|
|
115
|
+
const enabled = qh?.enabled;
|
|
116
|
+
const window = (qh && typeof qh.startHour === 'number' && typeof qh.endHour === 'number') ? `${qh.startHour}-${qh.endHour}` : 'n/a';
|
|
117
|
+
return `quietHours.enabled=${String(enabled)} window=${window}`;
|
|
118
|
+
});
|
|
119
|
+
section('teamDoctor', '/health/team/doctor', (d) => {
|
|
120
|
+
const overall = d?.overall;
|
|
121
|
+
const fails = Array.isArray(d?.checks) ? d.checks.filter((c) => c?.status === 'fail').map((c) => c?.name).filter(Boolean) : [];
|
|
122
|
+
const warns = Array.isArray(d?.checks) ? d.checks.filter((c) => c?.status === 'warn').map((c) => c?.name).filter(Boolean) : [];
|
|
123
|
+
const parts = [`overall=${overall ?? 'n/a'}`];
|
|
124
|
+
if (fails.length)
|
|
125
|
+
parts.push(`fails=${fails.join(',')}`);
|
|
126
|
+
if (warns.length)
|
|
127
|
+
parts.push(`warns=${warns.join(',')}`);
|
|
128
|
+
return parts.join(' ');
|
|
129
|
+
});
|
|
130
|
+
section('preflight', '/preflight', (d) => {
|
|
131
|
+
// /preflight returns { success, allPassed, results[] }
|
|
132
|
+
const allPassed = d?.allPassed;
|
|
133
|
+
const results = Array.isArray(d?.results) ? d.results : [];
|
|
134
|
+
const failing = results.filter((r) => r && r.passed === false);
|
|
135
|
+
const failCount = failing.length;
|
|
136
|
+
const failIds = failing.map((r) => r?.check?.id).filter(Boolean);
|
|
137
|
+
const parts = [`allPassed=${String(allPassed)}`];
|
|
138
|
+
parts.push(`failCount=${failCount}`);
|
|
139
|
+
if (failIds.length)
|
|
140
|
+
parts.push(`fails=${failIds.join(',')}`);
|
|
141
|
+
return parts.join(' ');
|
|
142
|
+
});
|
|
143
|
+
if (report.hints.length) {
|
|
144
|
+
lines.push('');
|
|
145
|
+
lines.push('Hints:');
|
|
146
|
+
for (const h of report.hints)
|
|
147
|
+
lines.push(`- ${h}`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
lines.push('Copy/paste support bundle:');
|
|
151
|
+
lines.push(`curl -s ${report.baseUrl}/health | jq`);
|
|
152
|
+
lines.push(`curl -s ${report.baseUrl}/health/system | jq`);
|
|
153
|
+
lines.push(`curl -s ${report.baseUrl}/execution-health | jq`);
|
|
154
|
+
lines.push(`curl -s ${report.baseUrl}/policy | jq`);
|
|
155
|
+
lines.push(`curl -s ${report.baseUrl}/health/team/doctor | jq`);
|
|
156
|
+
lines.push(`curl -s ${report.baseUrl}/preflight | jq`);
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate-closure canonical reference enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Why: Auto-close writers (sweeper/automerge/server) can close tasks without
|
|
5
|
+
* going through interactive precheck flows. If a task is closed as a
|
|
6
|
+
* "duplicate" without canonical refs, reviewers get churny N/A proof packets.
|
|
7
|
+
*/
|
|
8
|
+
export type DuplicateClosureMeta = Record<string, unknown>;
|
|
9
|
+
export declare function isDuplicateClosure(meta: DuplicateClosureMeta | null | undefined): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Throws if a task is being closed as a duplicate without canonical proof.
|
|
12
|
+
*
|
|
13
|
+
* Intended acceptance rule (2026-02-26):
|
|
14
|
+
* - metadata.duplicate_of must be a canonical task id (must start with "task-")
|
|
15
|
+
* - metadata.duplicate_proof (or duplicate_of.proof) must be present and not "N/A"
|
|
16
|
+
* - AND at least one of:
|
|
17
|
+
* - metadata.canonical_pr (GitHub PR URL) OR
|
|
18
|
+
* - metadata.canonical_commit (>=7 hex)
|
|
19
|
+
*
|
|
20
|
+
* Fallbacks allowed:
|
|
21
|
+
* - PR/commit may also come from metadata.review_handoff.{pr_url,commit_sha} or metadata.pr_url
|
|
22
|
+
*
|
|
23
|
+
* Note: we do NOT require both PR+commit.
|
|
24
|
+
*/
|
|
25
|
+
export declare function assertDuplicateClosureHasCanonicalRefs(meta: DuplicateClosureMeta | null | undefined): void;
|
|
26
|
+
/**
|
|
27
|
+
* Convenience helper for auto-close writers: returns a human-readable reason
|
|
28
|
+
* when canonical refs are missing for a duplicate closure.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDuplicateClosureCanonicalRefError(meta: DuplicateClosureMeta | null | undefined): string | null;
|
|
31
|
+
//# sourceMappingURL=duplicateClosureGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicateClosureGuard.d.ts","sourceRoot":"","sources":["../src/duplicateClosureGuard.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAqBzF;AAaD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CA0C1G;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAOjH"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
export function isDuplicateClosure(meta) {
|
|
4
|
+
if (!meta)
|
|
5
|
+
return false;
|
|
6
|
+
const autoCloseReason = meta.auto_close_reason;
|
|
7
|
+
const hasDupeReason = typeof autoCloseReason === 'string' && autoCloseReason.toLowerCase().includes('duplicate');
|
|
8
|
+
const hasDupeOf = Boolean(meta.duplicate_of);
|
|
9
|
+
const lane = meta.qa_bundle?.lane;
|
|
10
|
+
const hasDupeLane = typeof lane === 'string' && lane === 'duplicate-closure';
|
|
11
|
+
// Some older flows only record duplicates in artifacts (e.g., "duplicate:task-...")
|
|
12
|
+
const artifacts = meta.artifacts;
|
|
13
|
+
const hasDupeArtifact = Array.isArray(artifacts) && artifacts.some(a => typeof a === 'string' && a.startsWith('duplicate:'));
|
|
14
|
+
// Future-proof: allow explicit resolution/outcome flags.
|
|
15
|
+
const outcome = meta.outcome;
|
|
16
|
+
const resolution = meta.resolution;
|
|
17
|
+
const hasDupeOutcome = outcome === 'duplicate' || resolution === 'duplicate';
|
|
18
|
+
return hasDupeReason || hasDupeOf || hasDupeLane || hasDupeArtifact || hasDupeOutcome;
|
|
19
|
+
}
|
|
20
|
+
function firstString(...candidates) {
|
|
21
|
+
for (const c of candidates) {
|
|
22
|
+
if (typeof c === 'string' && c.trim().length > 0)
|
|
23
|
+
return c.trim();
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function isHttpUrl(s) {
|
|
28
|
+
return typeof s === 'string' && (s.startsWith('http://') || s.startsWith('https://'));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Throws if a task is being closed as a duplicate without canonical proof.
|
|
32
|
+
*
|
|
33
|
+
* Intended acceptance rule (2026-02-26):
|
|
34
|
+
* - metadata.duplicate_of must be a canonical task id (must start with "task-")
|
|
35
|
+
* - metadata.duplicate_proof (or duplicate_of.proof) must be present and not "N/A"
|
|
36
|
+
* - AND at least one of:
|
|
37
|
+
* - metadata.canonical_pr (GitHub PR URL) OR
|
|
38
|
+
* - metadata.canonical_commit (>=7 hex)
|
|
39
|
+
*
|
|
40
|
+
* Fallbacks allowed:
|
|
41
|
+
* - PR/commit may also come from metadata.review_handoff.{pr_url,commit_sha} or metadata.pr_url
|
|
42
|
+
*
|
|
43
|
+
* Note: we do NOT require both PR+commit.
|
|
44
|
+
*/
|
|
45
|
+
export function assertDuplicateClosureHasCanonicalRefs(meta) {
|
|
46
|
+
if (!isDuplicateClosure(meta))
|
|
47
|
+
return;
|
|
48
|
+
const m = (meta || {});
|
|
49
|
+
const dupeOfId = firstString(m.duplicate_of, m.duplicateOf, m.duplicate_of?.task_id, m.duplicateOf?.task_id);
|
|
50
|
+
if (!dupeOfId) {
|
|
51
|
+
throw new Error('Duplicate closure requires metadata.duplicate_of (canonical task id)');
|
|
52
|
+
}
|
|
53
|
+
if (!/^task-/.test(dupeOfId)) {
|
|
54
|
+
throw new Error('Duplicate closure requires metadata.duplicate_of to be a canonical task id (must start with "task-")');
|
|
55
|
+
}
|
|
56
|
+
const proof = firstString(m.duplicate_proof, m.duplicateProof, m.duplicate_of?.proof, m.duplicateOf?.proof, m.duplicate_of_proof);
|
|
57
|
+
if (!proof || /^n\/?a$/i.test(proof.trim())) {
|
|
58
|
+
throw new Error('Duplicate closure requires metadata.duplicate_proof (non-empty, not "N/A")');
|
|
59
|
+
}
|
|
60
|
+
const canonicalPr = firstString(m.canonical_pr, m.canonicalPr, m.review_handoff?.pr_url, m.pr_url);
|
|
61
|
+
const canonicalCommit = firstString(m.canonical_commit, m.canonicalCommit, m.review_handoff?.commit_sha);
|
|
62
|
+
const hasPr = isHttpUrl(canonicalPr);
|
|
63
|
+
const hasCommit = typeof canonicalCommit === 'string'
|
|
64
|
+
&& canonicalCommit.length >= 7
|
|
65
|
+
&& /^[0-9a-f]+$/i.test(canonicalCommit);
|
|
66
|
+
if (!hasPr && !hasCommit) {
|
|
67
|
+
throw new Error('Duplicate closure requires canonical_pr (PR URL) or canonical_commit (>=7 hex)');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convenience helper for auto-close writers: returns a human-readable reason
|
|
72
|
+
* when canonical refs are missing for a duplicate closure.
|
|
73
|
+
*/
|
|
74
|
+
export function getDuplicateClosureCanonicalRefError(meta) {
|
|
75
|
+
try {
|
|
76
|
+
assertDuplicateClosureHasCanonicalRefs(meta);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return err?.message || 'Duplicate closure missing canonical refs';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=duplicateClosureGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicateClosureGuard.js","sourceRoot":"","sources":["../src/duplicateClosureGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embed a single text into a normalized float32 vector.
|
|
3
|
+
* Model is lazily downloaded/loaded on first call.
|
|
4
|
+
*/
|
|
5
|
+
export declare function embed(text: string): Promise<Float32Array>;
|
|
6
|
+
/**
|
|
7
|
+
* Embed a batch of texts into normalized float32 vectors.
|
|
8
|
+
* Preserves input order.
|
|
9
|
+
*/
|
|
10
|
+
export declare function embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
11
|
+
export declare function embeddingModelId(): string;
|
|
12
|
+
export declare function resetEmbeddingCacheForTests(): void;
|
|
13
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AA0CA;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAQ/D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBzE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
import { pipeline } from '@xenova/transformers';
|
|
4
|
+
const DEFAULT_MODEL = process.env.REFLECTT_EMBED_MODEL || 'Xenova/all-MiniLM-L6-v2';
|
|
5
|
+
let extractorPromise = null;
|
|
6
|
+
function isNonEmptyString(value) {
|
|
7
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
8
|
+
}
|
|
9
|
+
async function getExtractor() {
|
|
10
|
+
if (!extractorPromise) {
|
|
11
|
+
extractorPromise = pipeline('feature-extraction', DEFAULT_MODEL);
|
|
12
|
+
}
|
|
13
|
+
return extractorPromise;
|
|
14
|
+
}
|
|
15
|
+
function toFloat32Array(value) {
|
|
16
|
+
if (value instanceof Float32Array)
|
|
17
|
+
return value;
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
// Handle [[...]] or [...] cases
|
|
20
|
+
if (value.length > 0 && Array.isArray(value[0])) {
|
|
21
|
+
return new Float32Array(value[0].map(Number));
|
|
22
|
+
}
|
|
23
|
+
return new Float32Array(value.map(Number));
|
|
24
|
+
}
|
|
25
|
+
if (value && typeof value === 'object') {
|
|
26
|
+
const maybeData = value.data;
|
|
27
|
+
if (maybeData instanceof Float32Array)
|
|
28
|
+
return maybeData;
|
|
29
|
+
if (Array.isArray(maybeData))
|
|
30
|
+
return new Float32Array(maybeData.map(Number));
|
|
31
|
+
}
|
|
32
|
+
throw new Error('Unexpected embedding output shape');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Embed a single text into a normalized float32 vector.
|
|
36
|
+
* Model is lazily downloaded/loaded on first call.
|
|
37
|
+
*/
|
|
38
|
+
export async function embed(text) {
|
|
39
|
+
if (!isNonEmptyString(text)) {
|
|
40
|
+
throw new Error('embed(text): text is required');
|
|
41
|
+
}
|
|
42
|
+
const extractor = await getExtractor();
|
|
43
|
+
const out = await extractor(text, { pooling: 'mean', normalize: true });
|
|
44
|
+
return toFloat32Array(out);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Embed a batch of texts into normalized float32 vectors.
|
|
48
|
+
* Preserves input order.
|
|
49
|
+
*/
|
|
50
|
+
export async function embedBatch(texts) {
|
|
51
|
+
if (!Array.isArray(texts) || texts.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
if (texts.some((t) => !isNonEmptyString(t))) {
|
|
54
|
+
throw new Error('embedBatch(texts): all texts must be non-empty strings');
|
|
55
|
+
}
|
|
56
|
+
const extractor = await getExtractor();
|
|
57
|
+
const out = await extractor(texts, { pooling: 'mean', normalize: true });
|
|
58
|
+
if (Array.isArray(out)) {
|
|
59
|
+
return out.map(toFloat32Array);
|
|
60
|
+
}
|
|
61
|
+
// Some runtimes may return a tensor-like object with nested lists in `tolist`
|
|
62
|
+
const maybeToList = out?.tolist;
|
|
63
|
+
if (typeof maybeToList === 'function') {
|
|
64
|
+
const asList = maybeToList.call(out);
|
|
65
|
+
if (Array.isArray(asList)) {
|
|
66
|
+
return asList.map((row) => toFloat32Array(row));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Fallback: if a single tensor comes back for one item, normalize to batch shape.
|
|
70
|
+
return [toFloat32Array(out)];
|
|
71
|
+
}
|
|
72
|
+
export function embeddingModelId() {
|
|
73
|
+
return DEFAULT_MODEL;
|
|
74
|
+
}
|
|
75
|
+
export function resetEmbeddingCacheForTests() {
|
|
76
|
+
extractorPromise = null;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type SupportTier } from './feedback.js';
|
|
2
|
+
export type EscalationLevel = 'owner_alert' | 'ack_missed' | 'manager_escalation' | 'exec_escalation';
|
|
3
|
+
export type EscalationStatus = 'active' | 'acknowledged' | 'resolved' | 'escalated';
|
|
4
|
+
export interface EscalationRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
feedbackId: string;
|
|
7
|
+
priority: string;
|
|
8
|
+
tier: SupportTier;
|
|
9
|
+
status: EscalationStatus;
|
|
10
|
+
/** Who should own this incident */
|
|
11
|
+
owner: string;
|
|
12
|
+
/** Current escalation level */
|
|
13
|
+
level: EscalationLevel;
|
|
14
|
+
/** When the escalation was created */
|
|
15
|
+
createdAt: number;
|
|
16
|
+
/** When owner acknowledged (undefined = not yet) */
|
|
17
|
+
acknowledgedAt?: number;
|
|
18
|
+
/** Ack deadline (createdAt + ackWindowMs) */
|
|
19
|
+
ackDeadlineAt: number;
|
|
20
|
+
/** Alert history */
|
|
21
|
+
alerts: EscalationAlert[];
|
|
22
|
+
/** Last time we checked/ticked this escalation */
|
|
23
|
+
lastTickAt: number;
|
|
24
|
+
}
|
|
25
|
+
export interface EscalationAlert {
|
|
26
|
+
level: EscalationLevel;
|
|
27
|
+
target: string;
|
|
28
|
+
message: string;
|
|
29
|
+
sentAt: number;
|
|
30
|
+
}
|
|
31
|
+
/** Ack window by priority — how long before escalating on no-ack */
|
|
32
|
+
declare const ACK_WINDOW_MS: Record<string, number>;
|
|
33
|
+
/** Escalation chain: level → next level */
|
|
34
|
+
declare const ESCALATION_CHAIN: Record<EscalationLevel, EscalationLevel | null>;
|
|
35
|
+
/** Time between escalation levels (after missed ack) */
|
|
36
|
+
declare const ESCALATION_INTERVAL_MS: Record<string, number>;
|
|
37
|
+
/** Default escalation targets by level */
|
|
38
|
+
declare const DEFAULT_TARGETS: Record<EscalationLevel, string>;
|
|
39
|
+
/**
|
|
40
|
+
* Set the alert delivery function. Called whenever an alert fires.
|
|
41
|
+
* Default is no-op (logs silently). Wire this to chatManager, webhooks, etc.
|
|
42
|
+
* Wraps the sink with alert-preflight guard.
|
|
43
|
+
*/
|
|
44
|
+
export declare function setAlertSink(sink: (alert: EscalationAlert, record: EscalationRecord) => void): void;
|
|
45
|
+
/**
|
|
46
|
+
* Create a new escalation for a P0/P1 feedback item.
|
|
47
|
+
* Returns null if priority is not P0/P1 or escalation already exists.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createEscalation(feedbackId: string, priority: string, tier: SupportTier, owner?: string): EscalationRecord | null;
|
|
50
|
+
/**
|
|
51
|
+
* Acknowledge an escalation. Stops the ack timer.
|
|
52
|
+
*/
|
|
53
|
+
export declare function acknowledgeEscalation(escalationId: string, actor?: string): EscalationRecord | null;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve an escalation (incident handled).
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveEscalation(escalationId: string): EscalationRecord | null;
|
|
58
|
+
/**
|
|
59
|
+
* Tick all active escalations — checks ack timers and triggers escalation chain.
|
|
60
|
+
* Call this periodically (e.g. every 60s from a watchdog/sweeper).
|
|
61
|
+
*/
|
|
62
|
+
export declare function tickEscalations(now?: number): EscalationTickResult;
|
|
63
|
+
export interface EscalationTickResult {
|
|
64
|
+
checked: number;
|
|
65
|
+
escalated: number;
|
|
66
|
+
alerts: EscalationAlert[];
|
|
67
|
+
}
|
|
68
|
+
export declare function getEscalation(id: string): EscalationRecord | undefined;
|
|
69
|
+
export declare function getEscalationByFeedback(feedbackId: string): EscalationRecord | undefined;
|
|
70
|
+
export interface EscalationSummary {
|
|
71
|
+
active: number;
|
|
72
|
+
acknowledged: number;
|
|
73
|
+
escalated: number;
|
|
74
|
+
resolved: number;
|
|
75
|
+
items: EscalationRecord[];
|
|
76
|
+
}
|
|
77
|
+
export declare function listEscalations(status?: EscalationStatus): EscalationSummary;
|
|
78
|
+
export declare function _clearEscalationStore(): void;
|
|
79
|
+
export { ACK_WINDOW_MS, ESCALATION_CHAIN, ESCALATION_INTERVAL_MS, DEFAULT_TARGETS };
|
|
80
|
+
//# sourceMappingURL=escalation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"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"}
|