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,325 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Usage Tracking — Model API cost instrumentation + spend caps
|
|
3
|
+
//
|
|
4
|
+
// Stores per-call usage events with token counts and estimated costs.
|
|
5
|
+
// Provides aggregation by agent, task, model, and time period.
|
|
6
|
+
// Enforces configurable spend caps with warn/throttle/block actions.
|
|
7
|
+
import { getDb } from './db.js';
|
|
8
|
+
import { eventBus } from './events.js';
|
|
9
|
+
// ── Model Pricing (estimated, per 1M tokens) ──
|
|
10
|
+
const MODEL_PRICING = {
|
|
11
|
+
'claude-opus-4': { input: 15.0, output: 75.0 },
|
|
12
|
+
'claude-opus-4-6': { input: 15.0, output: 75.0 },
|
|
13
|
+
'claude-sonnet-4': { input: 3.0, output: 15.0 },
|
|
14
|
+
'claude-sonnet-4-6': { input: 3.0, output: 15.0 },
|
|
15
|
+
'gpt-5.3': { input: 2.0, output: 8.0 },
|
|
16
|
+
'gpt-5.3-codex': { input: 2.0, output: 8.0 },
|
|
17
|
+
'gpt-4o-mini': { input: 0.15, output: 0.60 },
|
|
18
|
+
'gpt-4o': { input: 2.5, output: 10.0 },
|
|
19
|
+
};
|
|
20
|
+
export function estimateCost(model, inputTokens, outputTokens) {
|
|
21
|
+
// Try exact match, then prefix match
|
|
22
|
+
let pricing = MODEL_PRICING[model];
|
|
23
|
+
if (!pricing) {
|
|
24
|
+
const key = Object.keys(MODEL_PRICING).find(k => model.includes(k));
|
|
25
|
+
pricing = key ? MODEL_PRICING[key] : { input: 5.0, output: 20.0 }; // conservative default
|
|
26
|
+
}
|
|
27
|
+
return (inputTokens * pricing.input + outputTokens * pricing.output) / 1_000_000;
|
|
28
|
+
}
|
|
29
|
+
// ── DB Setup ──
|
|
30
|
+
export function ensureUsageTables() {
|
|
31
|
+
const db = getDb();
|
|
32
|
+
db.exec(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS model_usage (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
agent TEXT NOT NULL,
|
|
36
|
+
task_id TEXT,
|
|
37
|
+
model TEXT NOT NULL,
|
|
38
|
+
provider TEXT NOT NULL DEFAULT 'unknown',
|
|
39
|
+
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
41
|
+
estimated_cost_usd REAL NOT NULL DEFAULT 0,
|
|
42
|
+
category TEXT NOT NULL DEFAULT 'other',
|
|
43
|
+
team_id TEXT,
|
|
44
|
+
metadata TEXT,
|
|
45
|
+
timestamp INTEGER NOT NULL
|
|
46
|
+
);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_usage_agent ON model_usage(agent);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_usage_ts ON model_usage(timestamp);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_usage_model ON model_usage(model);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_usage_task ON model_usage(task_id);
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS spend_caps (
|
|
53
|
+
id TEXT PRIMARY KEY,
|
|
54
|
+
scope TEXT NOT NULL DEFAULT 'global',
|
|
55
|
+
scope_id TEXT,
|
|
56
|
+
period TEXT NOT NULL DEFAULT 'monthly',
|
|
57
|
+
limit_usd REAL NOT NULL,
|
|
58
|
+
action TEXT NOT NULL DEFAULT 'warn',
|
|
59
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
60
|
+
created_at INTEGER NOT NULL,
|
|
61
|
+
updated_at INTEGER NOT NULL
|
|
62
|
+
);
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
// ── Usage Recording ──
|
|
66
|
+
export function recordUsage(event) {
|
|
67
|
+
ensureUsageTables();
|
|
68
|
+
const db = getDb();
|
|
69
|
+
const id = `usage-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
70
|
+
const cost = event.estimated_cost_usd ?? estimateCost(event.model, event.input_tokens, event.output_tokens);
|
|
71
|
+
const record = {
|
|
72
|
+
id,
|
|
73
|
+
agent: event.agent,
|
|
74
|
+
task_id: event.task_id,
|
|
75
|
+
model: event.model,
|
|
76
|
+
provider: event.provider,
|
|
77
|
+
input_tokens: event.input_tokens,
|
|
78
|
+
output_tokens: event.output_tokens,
|
|
79
|
+
estimated_cost_usd: Math.round(cost * 1_000_000) / 1_000_000, // 6 decimal precision
|
|
80
|
+
category: event.category,
|
|
81
|
+
timestamp: event.timestamp || Date.now(),
|
|
82
|
+
team_id: event.team_id,
|
|
83
|
+
metadata: event.metadata,
|
|
84
|
+
};
|
|
85
|
+
db.prepare(`
|
|
86
|
+
INSERT INTO model_usage (id, agent, task_id, model, provider, input_tokens, output_tokens, estimated_cost_usd, category, team_id, metadata, timestamp)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
88
|
+
`).run(record.id, record.agent, record.task_id || null, record.model, record.provider, record.input_tokens, record.output_tokens, record.estimated_cost_usd, record.category, record.team_id || null, record.metadata ? JSON.stringify(record.metadata) : null, record.timestamp);
|
|
89
|
+
// Check caps after recording
|
|
90
|
+
checkCaps(record);
|
|
91
|
+
return record;
|
|
92
|
+
}
|
|
93
|
+
export function recordUsageBatch(events) {
|
|
94
|
+
return events.map(e => recordUsage(e));
|
|
95
|
+
}
|
|
96
|
+
// ── Aggregation ──
|
|
97
|
+
export function getUsageSummary(options = {}) {
|
|
98
|
+
ensureUsageTables();
|
|
99
|
+
const db = getDb();
|
|
100
|
+
const conditions = [];
|
|
101
|
+
const params = [];
|
|
102
|
+
if (options.since) {
|
|
103
|
+
conditions.push('timestamp >= ?');
|
|
104
|
+
params.push(options.since);
|
|
105
|
+
}
|
|
106
|
+
if (options.until) {
|
|
107
|
+
conditions.push('timestamp <= ?');
|
|
108
|
+
params.push(options.until);
|
|
109
|
+
}
|
|
110
|
+
if (options.agent) {
|
|
111
|
+
conditions.push('agent = ?');
|
|
112
|
+
params.push(options.agent);
|
|
113
|
+
}
|
|
114
|
+
if (options.team_id) {
|
|
115
|
+
conditions.push('team_id = ?');
|
|
116
|
+
params.push(options.team_id);
|
|
117
|
+
}
|
|
118
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
119
|
+
const rows = db.prepare(`
|
|
120
|
+
SELECT
|
|
121
|
+
'total' as period,
|
|
122
|
+
COALESCE(SUM(estimated_cost_usd), 0) as total_cost_usd,
|
|
123
|
+
COALESCE(SUM(input_tokens), 0) as total_input_tokens,
|
|
124
|
+
COALESCE(SUM(output_tokens), 0) as total_output_tokens,
|
|
125
|
+
COUNT(*) as event_count
|
|
126
|
+
FROM model_usage ${where}
|
|
127
|
+
`).all(...params);
|
|
128
|
+
return rows;
|
|
129
|
+
}
|
|
130
|
+
export function getUsageByAgent(options = {}) {
|
|
131
|
+
ensureUsageTables();
|
|
132
|
+
const db = getDb();
|
|
133
|
+
const conditions = [];
|
|
134
|
+
const params = [];
|
|
135
|
+
if (options.since) {
|
|
136
|
+
conditions.push('timestamp >= ?');
|
|
137
|
+
params.push(options.since);
|
|
138
|
+
}
|
|
139
|
+
if (options.until) {
|
|
140
|
+
conditions.push('timestamp <= ?');
|
|
141
|
+
params.push(options.until);
|
|
142
|
+
}
|
|
143
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
144
|
+
return db.prepare(`
|
|
145
|
+
SELECT
|
|
146
|
+
agent,
|
|
147
|
+
SUM(estimated_cost_usd) as total_cost_usd,
|
|
148
|
+
SUM(input_tokens) as total_input_tokens,
|
|
149
|
+
SUM(output_tokens) as total_output_tokens,
|
|
150
|
+
COUNT(*) as event_count,
|
|
151
|
+
(SELECT model FROM model_usage m2 WHERE m2.agent = model_usage.agent GROUP BY model ORDER BY SUM(estimated_cost_usd) DESC LIMIT 1) as top_model
|
|
152
|
+
FROM model_usage ${where}
|
|
153
|
+
GROUP BY agent
|
|
154
|
+
ORDER BY total_cost_usd DESC
|
|
155
|
+
`).all(...params);
|
|
156
|
+
}
|
|
157
|
+
export function getUsageByModel(options = {}) {
|
|
158
|
+
ensureUsageTables();
|
|
159
|
+
const db = getDb();
|
|
160
|
+
const conditions = [];
|
|
161
|
+
const params = [];
|
|
162
|
+
if (options.since) {
|
|
163
|
+
conditions.push('timestamp >= ?');
|
|
164
|
+
params.push(options.since);
|
|
165
|
+
}
|
|
166
|
+
if (options.until) {
|
|
167
|
+
conditions.push('timestamp <= ?');
|
|
168
|
+
params.push(options.until);
|
|
169
|
+
}
|
|
170
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
171
|
+
return db.prepare(`
|
|
172
|
+
SELECT model, SUM(estimated_cost_usd) as total_cost_usd, SUM(input_tokens) as total_input_tokens,
|
|
173
|
+
SUM(output_tokens) as total_output_tokens, COUNT(*) as event_count
|
|
174
|
+
FROM model_usage ${where}
|
|
175
|
+
GROUP BY model ORDER BY total_cost_usd DESC
|
|
176
|
+
`).all(...params);
|
|
177
|
+
}
|
|
178
|
+
export function getUsageByTask(options = {}) {
|
|
179
|
+
ensureUsageTables();
|
|
180
|
+
const db = getDb();
|
|
181
|
+
const limit = options.limit ?? 50;
|
|
182
|
+
const conditions = ['task_id IS NOT NULL'];
|
|
183
|
+
const params = [];
|
|
184
|
+
if (options.since) {
|
|
185
|
+
conditions.push('timestamp >= ?');
|
|
186
|
+
params.push(options.since);
|
|
187
|
+
}
|
|
188
|
+
if (options.until) {
|
|
189
|
+
conditions.push('timestamp <= ?');
|
|
190
|
+
params.push(options.until);
|
|
191
|
+
}
|
|
192
|
+
const where = `WHERE ${conditions.join(' AND ')}`;
|
|
193
|
+
return db.prepare(`
|
|
194
|
+
SELECT task_id, SUM(estimated_cost_usd) as total_cost_usd, COUNT(*) as event_count
|
|
195
|
+
FROM model_usage ${where}
|
|
196
|
+
GROUP BY task_id ORDER BY total_cost_usd DESC LIMIT ?
|
|
197
|
+
`).all(...params, limit);
|
|
198
|
+
}
|
|
199
|
+
// ── Spend Caps ──
|
|
200
|
+
export function setCap(cap) {
|
|
201
|
+
ensureUsageTables();
|
|
202
|
+
const db = getDb();
|
|
203
|
+
const now = Date.now();
|
|
204
|
+
const id = `cap-${now}-${Math.random().toString(36).slice(2, 7)}`;
|
|
205
|
+
const record = { id, ...cap, created_at: now, updated_at: now };
|
|
206
|
+
db.prepare(`
|
|
207
|
+
INSERT INTO spend_caps (id, scope, scope_id, period, limit_usd, action, enabled, created_at, updated_at)
|
|
208
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
209
|
+
`).run(id, record.scope, record.scope_id || null, record.period, record.limit_usd, record.action, record.enabled ? 1 : 0, now, now);
|
|
210
|
+
return record;
|
|
211
|
+
}
|
|
212
|
+
export function listCaps() {
|
|
213
|
+
ensureUsageTables();
|
|
214
|
+
const db = getDb();
|
|
215
|
+
return db.prepare('SELECT * FROM spend_caps WHERE enabled = 1 ORDER BY created_at DESC').all().map(r => ({
|
|
216
|
+
...r, enabled: !!r.enabled,
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
export function deleteCap(id) {
|
|
220
|
+
ensureUsageTables();
|
|
221
|
+
const db = getDb();
|
|
222
|
+
const result = db.prepare('DELETE FROM spend_caps WHERE id = ?').run(id);
|
|
223
|
+
return result.changes > 0;
|
|
224
|
+
}
|
|
225
|
+
function getPeriodStart(period) {
|
|
226
|
+
const now = new Date();
|
|
227
|
+
if (period === 'daily') {
|
|
228
|
+
return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
|
|
229
|
+
}
|
|
230
|
+
else if (period === 'weekly') {
|
|
231
|
+
const day = now.getDay();
|
|
232
|
+
const diff = now.getDate() - day + (day === 0 ? -6 : 1); // Monday start
|
|
233
|
+
return new Date(now.getFullYear(), now.getMonth(), diff).getTime();
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
return new Date(now.getFullYear(), now.getMonth(), 1).getTime();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
export function checkCaps(event) {
|
|
240
|
+
const caps = listCaps();
|
|
241
|
+
const results = [];
|
|
242
|
+
for (const cap of caps) {
|
|
243
|
+
const periodStart = getPeriodStart(cap.period);
|
|
244
|
+
const conditions = ['timestamp >= ?'];
|
|
245
|
+
const params = [periodStart];
|
|
246
|
+
if (cap.scope === 'agent' && cap.scope_id) {
|
|
247
|
+
conditions.push('agent = ?');
|
|
248
|
+
params.push(cap.scope_id);
|
|
249
|
+
}
|
|
250
|
+
else if (cap.scope === 'team' && cap.scope_id) {
|
|
251
|
+
conditions.push('team_id = ?');
|
|
252
|
+
params.push(cap.scope_id);
|
|
253
|
+
}
|
|
254
|
+
const db = getDb();
|
|
255
|
+
const row = db.prepare(`
|
|
256
|
+
SELECT COALESCE(SUM(estimated_cost_usd), 0) as total
|
|
257
|
+
FROM model_usage WHERE ${conditions.join(' AND ')}
|
|
258
|
+
`).get(...params);
|
|
259
|
+
const currentSpend = row.total;
|
|
260
|
+
const remaining = Math.max(0, cap.limit_usd - currentSpend);
|
|
261
|
+
const utilization = cap.limit_usd > 0 ? (currentSpend / cap.limit_usd) * 100 : 0;
|
|
262
|
+
const breached = currentSpend >= cap.limit_usd;
|
|
263
|
+
const status = {
|
|
264
|
+
cap,
|
|
265
|
+
current_spend_usd: Math.round(currentSpend * 100) / 100,
|
|
266
|
+
remaining_usd: Math.round(remaining * 100) / 100,
|
|
267
|
+
utilization_pct: Math.round(utilization * 10) / 10,
|
|
268
|
+
breached,
|
|
269
|
+
};
|
|
270
|
+
results.push(status);
|
|
271
|
+
// Emit events on breach or warning (>80%)
|
|
272
|
+
if (event && breached) {
|
|
273
|
+
eventBus.emit({
|
|
274
|
+
type: 'task_updated',
|
|
275
|
+
data: { kind: 'usage:cap_breached', source: 'usage-tracking', cap_id: cap.id, scope: cap.scope, scope_id: cap.scope_id, current_spend: currentSpend, limit: cap.limit_usd, action: cap.action },
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
else if (event && utilization >= 80) {
|
|
279
|
+
eventBus.emit({
|
|
280
|
+
type: 'task_updated',
|
|
281
|
+
data: { kind: 'usage:cap_warning', source: 'usage-tracking', cap_id: cap.id, scope: cap.scope, scope_id: cap.scope_id, current_spend: currentSpend, limit: cap.limit_usd, utilization_pct: utilization },
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return results;
|
|
286
|
+
}
|
|
287
|
+
// ── Routing Suggestions ──
|
|
288
|
+
export function getRoutingSuggestions(options = {}) {
|
|
289
|
+
ensureUsageTables();
|
|
290
|
+
const db = getDb();
|
|
291
|
+
const since = options.since ?? Date.now() - 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
292
|
+
const categories = db.prepare(`
|
|
293
|
+
SELECT category, model,
|
|
294
|
+
SUM(estimated_cost_usd) as total_cost,
|
|
295
|
+
SUM(input_tokens) as total_input,
|
|
296
|
+
SUM(output_tokens) as total_output
|
|
297
|
+
FROM model_usage WHERE timestamp >= ?
|
|
298
|
+
GROUP BY category, model
|
|
299
|
+
ORDER BY total_cost DESC
|
|
300
|
+
`).all(since);
|
|
301
|
+
const suggestions = [];
|
|
302
|
+
const cheapModel = 'gpt-4o-mini';
|
|
303
|
+
const lowStakesCategories = ['heartbeat', 'reflection', 'chat'];
|
|
304
|
+
for (const row of categories) {
|
|
305
|
+
if (!lowStakesCategories.includes(row.category))
|
|
306
|
+
continue;
|
|
307
|
+
if (row.model === cheapModel)
|
|
308
|
+
continue;
|
|
309
|
+
const projectedCost = estimateCost(cheapModel, row.total_input, row.total_output);
|
|
310
|
+
const savings = row.total_cost - projectedCost;
|
|
311
|
+
if (savings > 0.01) {
|
|
312
|
+
suggestions.push({
|
|
313
|
+
category: row.category,
|
|
314
|
+
current_model: row.model,
|
|
315
|
+
suggested_model: cheapModel,
|
|
316
|
+
current_cost_usd: Math.round(row.total_cost * 100) / 100,
|
|
317
|
+
projected_cost_usd: Math.round(projectedCost * 100) / 100,
|
|
318
|
+
savings_usd: Math.round(savings * 100) / 100,
|
|
319
|
+
savings_pct: Math.round((savings / row.total_cost) * 100),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return suggestions.sort((a, b) => b.savings_usd - a.savings_usd);
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=usage-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-tracking.js","sourceRoot":"","sources":["../src/usage-tracking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector store for semantic search using sqlite-vec.
|
|
3
|
+
*
|
|
4
|
+
* Stores embeddings alongside source metadata (type, id, text snippet).
|
|
5
|
+
* All vectors stay local — no external API calls for storage or search.
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
/**
|
|
9
|
+
* Load the sqlite-vec extension into the database connection.
|
|
10
|
+
* Safe to call multiple times — only loads once per connection.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadVecExtension(db: Database.Database): void;
|
|
13
|
+
/**
|
|
14
|
+
* Reset the vec loaded flag (for tests)
|
|
15
|
+
*/
|
|
16
|
+
export declare function resetVecLoadedForTests(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Initialize vector tables.
|
|
19
|
+
* Called during migration v4.
|
|
20
|
+
*/
|
|
21
|
+
export declare function initVectorTables(db: Database.Database): void;
|
|
22
|
+
/**
|
|
23
|
+
* Upsert a vector entry: store metadata + embedding.
|
|
24
|
+
* If a record with the same source_type+source_id exists, it gets replaced.
|
|
25
|
+
*/
|
|
26
|
+
export declare function upsertVector(db: Database.Database, sourceType: string, sourceId: string, textSnippet: string, embedding: Float32Array): void;
|
|
27
|
+
/**
|
|
28
|
+
* Search for the nearest vectors to a query embedding.
|
|
29
|
+
* Returns results sorted by distance (ascending = most similar first).
|
|
30
|
+
*/
|
|
31
|
+
export declare function searchVectors(db: Database.Database, queryEmbedding: Float32Array, limit?: number, sourceType?: string): Array<{
|
|
32
|
+
sourceType: string;
|
|
33
|
+
sourceId: string;
|
|
34
|
+
textSnippet: string;
|
|
35
|
+
distance: number;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Get the number of indexed vectors
|
|
39
|
+
*/
|
|
40
|
+
export declare function vectorCount(db: Database.Database, sourceType?: string): number;
|
|
41
|
+
/**
|
|
42
|
+
* Delete a vector entry by source type and id
|
|
43
|
+
*/
|
|
44
|
+
export declare function deleteVector(db: Database.Database, sourceType: string, sourceId: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Index a task for semantic search.
|
|
47
|
+
* Combines title + description + done criteria into searchable text.
|
|
48
|
+
*/
|
|
49
|
+
export declare function indexTask(taskId: string, title: string, description?: string | null, doneCriteria?: string[] | null): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Index a chat message for semantic search.
|
|
52
|
+
*/
|
|
53
|
+
export declare function indexChatMessage(messageId: string, content: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Index a reflection for semantic search.
|
|
56
|
+
* Combines pain + evidence + proposed_fix into searchable text.
|
|
57
|
+
*/
|
|
58
|
+
export declare function indexReflection(reflectionId: string, pain: string, evidence: string[], proposedFix: string, author?: string, tags?: string[]): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Index an insight for semantic search.
|
|
61
|
+
* Combines title + evidence_refs into searchable text.
|
|
62
|
+
*/
|
|
63
|
+
export declare function indexInsight(insightId: string, title: string, evidenceRefs: string[], authors?: string[], clusterKey?: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Index a shared workspace file for semantic search.
|
|
66
|
+
* Stores the file path and content snippet.
|
|
67
|
+
*/
|
|
68
|
+
export declare function indexSharedFile(filePath: string, content: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Index a knowledge document for semantic search.
|
|
71
|
+
* Combines title, content snippet, category, and tags.
|
|
72
|
+
*/
|
|
73
|
+
export declare function indexKnowledgeDoc(docId: string, title: string, content: string, category?: string, tags?: string[] | null): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Semantic search across all indexed content.
|
|
76
|
+
*/
|
|
77
|
+
export declare function semanticSearch(query: string, options?: {
|
|
78
|
+
limit?: number;
|
|
79
|
+
type?: string;
|
|
80
|
+
}): Promise<Array<{
|
|
81
|
+
sourceType: string;
|
|
82
|
+
sourceId: string;
|
|
83
|
+
textSnippet: string;
|
|
84
|
+
distance: number;
|
|
85
|
+
similarity: number;
|
|
86
|
+
}>>;
|
|
87
|
+
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
import { getDb } from './db.js';
|
|
4
|
+
// Embedding dimension for all-MiniLM-L6-v2
|
|
5
|
+
const EMBEDDING_DIM = 384;
|
|
6
|
+
let _vecLoaded = false;
|
|
7
|
+
/**
|
|
8
|
+
* Load the sqlite-vec extension into the database connection.
|
|
9
|
+
* Safe to call multiple times — only loads once per connection.
|
|
10
|
+
*/
|
|
11
|
+
export function loadVecExtension(db) {
|
|
12
|
+
if (_vecLoaded)
|
|
13
|
+
return;
|
|
14
|
+
try {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
16
|
+
const sqliteVec = require('sqlite-vec');
|
|
17
|
+
sqliteVec.load(db);
|
|
18
|
+
_vecLoaded = true;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error('[vector-store] Failed to load sqlite-vec extension:', err?.message);
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Reset the vec loaded flag (for tests)
|
|
27
|
+
*/
|
|
28
|
+
export function resetVecLoadedForTests() {
|
|
29
|
+
_vecLoaded = false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize vector tables.
|
|
33
|
+
* Called during migration v4.
|
|
34
|
+
*/
|
|
35
|
+
export function initVectorTables(db) {
|
|
36
|
+
loadVecExtension(db);
|
|
37
|
+
// Metadata table for vector entries
|
|
38
|
+
db.exec(`
|
|
39
|
+
CREATE TABLE IF NOT EXISTS vec_metadata (
|
|
40
|
+
row_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
41
|
+
source_type TEXT NOT NULL,
|
|
42
|
+
source_id TEXT NOT NULL,
|
|
43
|
+
text_snippet TEXT NOT NULL,
|
|
44
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
45
|
+
UNIQUE(source_type, source_id)
|
|
46
|
+
)
|
|
47
|
+
`);
|
|
48
|
+
db.exec(`
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_vec_metadata_source
|
|
50
|
+
ON vec_metadata(source_type, source_id)
|
|
51
|
+
`);
|
|
52
|
+
// Virtual table for vector search
|
|
53
|
+
db.exec(`
|
|
54
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_embeddings USING vec0(
|
|
55
|
+
row_id INTEGER PRIMARY KEY,
|
|
56
|
+
embedding float[${EMBEDDING_DIM}]
|
|
57
|
+
)
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Upsert a vector entry: store metadata + embedding.
|
|
62
|
+
* If a record with the same source_type+source_id exists, it gets replaced.
|
|
63
|
+
*/
|
|
64
|
+
export function upsertVector(db, sourceType, sourceId, textSnippet, embedding) {
|
|
65
|
+
// Delete existing entry if present
|
|
66
|
+
const existing = db.prepare('SELECT row_id FROM vec_metadata WHERE source_type = ? AND source_id = ?').get(sourceType, sourceId);
|
|
67
|
+
if (existing) {
|
|
68
|
+
db.prepare('DELETE FROM vec_embeddings WHERE row_id = ?').run(BigInt(existing.row_id));
|
|
69
|
+
db.prepare('DELETE FROM vec_metadata WHERE row_id = ?').run(existing.row_id);
|
|
70
|
+
}
|
|
71
|
+
// Insert metadata
|
|
72
|
+
const result = db.prepare('INSERT INTO vec_metadata (source_type, source_id, text_snippet, created_at) VALUES (?, ?, ?, ?)').run(sourceType, sourceId, textSnippet.slice(0, 500), Date.now());
|
|
73
|
+
const rowId = BigInt(result.lastInsertRowid);
|
|
74
|
+
// Insert embedding into vec0 virtual table
|
|
75
|
+
db.prepare('INSERT INTO vec_embeddings (row_id, embedding) VALUES (?, ?)').run(rowId, Buffer.from(embedding.buffer));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Search for the nearest vectors to a query embedding.
|
|
79
|
+
* Returns results sorted by distance (ascending = most similar first).
|
|
80
|
+
*/
|
|
81
|
+
export function searchVectors(db, queryEmbedding, limit = 10, sourceType) {
|
|
82
|
+
const queryBuffer = Buffer.from(queryEmbedding.buffer);
|
|
83
|
+
// Query vec0 for nearest neighbors
|
|
84
|
+
const rows = db.prepare(`
|
|
85
|
+
SELECT row_id, distance
|
|
86
|
+
FROM vec_embeddings
|
|
87
|
+
WHERE embedding MATCH ?
|
|
88
|
+
ORDER BY distance
|
|
89
|
+
LIMIT ?
|
|
90
|
+
`).all(queryBuffer, limit * 2);
|
|
91
|
+
if (rows.length === 0)
|
|
92
|
+
return [];
|
|
93
|
+
// Fetch metadata for matched rows
|
|
94
|
+
const results = [];
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
const meta = db.prepare('SELECT source_type, source_id, text_snippet FROM vec_metadata WHERE row_id = ?').get(row.row_id);
|
|
97
|
+
if (!meta)
|
|
98
|
+
continue;
|
|
99
|
+
// Filter by source type if specified
|
|
100
|
+
if (sourceType && meta.source_type !== sourceType)
|
|
101
|
+
continue;
|
|
102
|
+
results.push({
|
|
103
|
+
sourceType: meta.source_type,
|
|
104
|
+
sourceId: meta.source_id,
|
|
105
|
+
textSnippet: meta.text_snippet,
|
|
106
|
+
distance: row.distance,
|
|
107
|
+
});
|
|
108
|
+
if (results.length >= limit)
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the number of indexed vectors
|
|
115
|
+
*/
|
|
116
|
+
export function vectorCount(db, sourceType) {
|
|
117
|
+
if (sourceType) {
|
|
118
|
+
const row = db.prepare('SELECT COUNT(*) as c FROM vec_metadata WHERE source_type = ?').get(sourceType);
|
|
119
|
+
return row.c;
|
|
120
|
+
}
|
|
121
|
+
const row = db.prepare('SELECT COUNT(*) as c FROM vec_metadata').get();
|
|
122
|
+
return row.c;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Delete a vector entry by source type and id
|
|
126
|
+
*/
|
|
127
|
+
export function deleteVector(db, sourceType, sourceId) {
|
|
128
|
+
const existing = db.prepare('SELECT row_id FROM vec_metadata WHERE source_type = ? AND source_id = ?').get(sourceType, sourceId);
|
|
129
|
+
if (!existing)
|
|
130
|
+
return false;
|
|
131
|
+
db.prepare('DELETE FROM vec_embeddings WHERE row_id = ?').run(BigInt(existing.row_id));
|
|
132
|
+
db.prepare('DELETE FROM vec_metadata WHERE row_id = ?').run(existing.row_id);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Index a task for semantic search.
|
|
137
|
+
* Combines title + description + done criteria into searchable text.
|
|
138
|
+
*/
|
|
139
|
+
export async function indexTask(taskId, title, description, doneCriteria) {
|
|
140
|
+
const parts = [title];
|
|
141
|
+
if (description)
|
|
142
|
+
parts.push(description);
|
|
143
|
+
if (doneCriteria?.length)
|
|
144
|
+
parts.push(doneCriteria.join('. '));
|
|
145
|
+
const text = parts.join(' — ');
|
|
146
|
+
const { embed } = await import('./embeddings.js');
|
|
147
|
+
const embedding = await embed(text);
|
|
148
|
+
const db = getDb();
|
|
149
|
+
upsertVector(db, 'task', taskId, text, embedding);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Index a chat message for semantic search.
|
|
153
|
+
*/
|
|
154
|
+
export async function indexChatMessage(messageId, content) {
|
|
155
|
+
// Skip very short messages (not useful for search)
|
|
156
|
+
if (content.trim().length < 10)
|
|
157
|
+
return;
|
|
158
|
+
const { embed } = await import('./embeddings.js');
|
|
159
|
+
const embedding = await embed(content);
|
|
160
|
+
const db = getDb();
|
|
161
|
+
upsertVector(db, 'chat', messageId, content, embedding);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Index a reflection for semantic search.
|
|
165
|
+
* Combines pain + evidence + proposed_fix into searchable text.
|
|
166
|
+
*/
|
|
167
|
+
export async function indexReflection(reflectionId, pain, evidence, proposedFix, author, tags) {
|
|
168
|
+
const parts = [pain];
|
|
169
|
+
if (evidence?.length)
|
|
170
|
+
parts.push(evidence.join('. '));
|
|
171
|
+
if (proposedFix)
|
|
172
|
+
parts.push(proposedFix);
|
|
173
|
+
if (author)
|
|
174
|
+
parts.push(`author:${author}`);
|
|
175
|
+
if (tags?.length)
|
|
176
|
+
parts.push(`tags:${tags.join(',')}`);
|
|
177
|
+
const text = parts.join(' — ');
|
|
178
|
+
const { embed } = await import('./embeddings.js');
|
|
179
|
+
const embedding = await embed(text);
|
|
180
|
+
const db = getDb();
|
|
181
|
+
upsertVector(db, 'reflection', reflectionId, text, embedding);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Index an insight for semantic search.
|
|
185
|
+
* Combines title + evidence_refs into searchable text.
|
|
186
|
+
*/
|
|
187
|
+
export async function indexInsight(insightId, title, evidenceRefs, authors, clusterKey) {
|
|
188
|
+
const parts = [title];
|
|
189
|
+
if (evidenceRefs?.length)
|
|
190
|
+
parts.push(evidenceRefs.join('. '));
|
|
191
|
+
if (authors?.length)
|
|
192
|
+
parts.push(`authors:${authors.join(',')}`);
|
|
193
|
+
if (clusterKey)
|
|
194
|
+
parts.push(`cluster:${clusterKey}`);
|
|
195
|
+
const text = parts.join(' — ');
|
|
196
|
+
const { embed } = await import('./embeddings.js');
|
|
197
|
+
const embedding = await embed(text);
|
|
198
|
+
const db = getDb();
|
|
199
|
+
upsertVector(db, 'insight', insightId, text, embedding);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Index a shared workspace file for semantic search.
|
|
203
|
+
* Stores the file path and content snippet.
|
|
204
|
+
*/
|
|
205
|
+
export async function indexSharedFile(filePath, content) {
|
|
206
|
+
if (content.trim().length < 10)
|
|
207
|
+
return;
|
|
208
|
+
const text = `[${filePath}] ${content}`;
|
|
209
|
+
const { embed } = await import('./embeddings.js');
|
|
210
|
+
const embedding = await embed(text);
|
|
211
|
+
const db = getDb();
|
|
212
|
+
upsertVector(db, 'shared_file', filePath, text, embedding);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Index a knowledge document for semantic search.
|
|
216
|
+
* Combines title, content snippet, category, and tags.
|
|
217
|
+
*/
|
|
218
|
+
export async function indexKnowledgeDoc(docId, title, content, category, tags) {
|
|
219
|
+
const parts = [title];
|
|
220
|
+
// Use first ~2000 chars of content for embedding
|
|
221
|
+
if (content)
|
|
222
|
+
parts.push(content.slice(0, 2000));
|
|
223
|
+
if (category)
|
|
224
|
+
parts.push(`Category: ${category}`);
|
|
225
|
+
if (tags?.length)
|
|
226
|
+
parts.push(`Tags: ${tags.join(', ')}`);
|
|
227
|
+
const text = parts.join(' — ');
|
|
228
|
+
const { embed } = await import('./embeddings.js');
|
|
229
|
+
const embedding = await embed(text);
|
|
230
|
+
const db = getDb();
|
|
231
|
+
upsertVector(db, 'knowledge_doc', docId, text.slice(0, 500), embedding);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Semantic search across all indexed content.
|
|
235
|
+
*/
|
|
236
|
+
export async function semanticSearch(query, options) {
|
|
237
|
+
const { embed } = await import('./embeddings.js');
|
|
238
|
+
const queryEmbedding = await embed(query);
|
|
239
|
+
const db = getDb();
|
|
240
|
+
const results = searchVectors(db, queryEmbedding, options?.limit ?? 10, options?.type);
|
|
241
|
+
return results.map((r) => ({
|
|
242
|
+
...r,
|
|
243
|
+
// Convert L2 distance to similarity score (0-1, higher = more similar)
|
|
244
|
+
similarity: 1 / (1 + r.distance),
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=vector-store.js.map
|