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,149 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Knowledge Auto-Index Pipeline
|
|
5
|
+
*
|
|
6
|
+
* Automatically indexes knowledge into the vector store when:
|
|
7
|
+
* 1. A task transitions to done (indexes artifacts, QA bundle, done criteria)
|
|
8
|
+
* 2. Process files are written via API
|
|
9
|
+
* 3. Task comments tagged as decisions are created
|
|
10
|
+
*
|
|
11
|
+
* Dedup: uses composite source IDs to prevent duplicate indexing.
|
|
12
|
+
*/
|
|
13
|
+
import { getDb } from './db.js';
|
|
14
|
+
// ── Dedup tracking ─────────────────────────────────────────────────────────
|
|
15
|
+
// Track what's been indexed this session to avoid redundant embedding calls
|
|
16
|
+
const indexedSet = new Set();
|
|
17
|
+
function makeKey(sourceType, sourceId) {
|
|
18
|
+
return `${sourceType}::${sourceId}`;
|
|
19
|
+
}
|
|
20
|
+
function alreadyIndexed(sourceType, sourceId) {
|
|
21
|
+
return indexedSet.has(makeKey(sourceType, sourceId));
|
|
22
|
+
}
|
|
23
|
+
function markIndexed(sourceType, sourceId) {
|
|
24
|
+
indexedSet.add(makeKey(sourceType, sourceId));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Called when a task transitions to done.
|
|
28
|
+
* Indexes: task content, QA bundle summary, artifact references.
|
|
29
|
+
*/
|
|
30
|
+
export async function onTaskShipped(data) {
|
|
31
|
+
let indexed = 0;
|
|
32
|
+
try {
|
|
33
|
+
const { upsertVector } = await import('./vector-store.js');
|
|
34
|
+
const { embed } = await import('./embeddings.js');
|
|
35
|
+
const db = getDb();
|
|
36
|
+
// 1. Index the task itself (may already be indexed, but update with final state)
|
|
37
|
+
const taskKey = `task-ship::${data.taskId}`;
|
|
38
|
+
if (!alreadyIndexed('task_ship', taskKey)) {
|
|
39
|
+
const parts = [`Task shipped: ${data.title}`];
|
|
40
|
+
if (data.description)
|
|
41
|
+
parts.push(data.description);
|
|
42
|
+
if (data.doneCriteria?.length)
|
|
43
|
+
parts.push(`Done: ${data.doneCriteria.join('. ')}`);
|
|
44
|
+
if (data.assignee)
|
|
45
|
+
parts.push(`By: ${data.assignee}`);
|
|
46
|
+
const text = parts.join(' — ');
|
|
47
|
+
const embedding = await embed(text);
|
|
48
|
+
upsertVector(db, 'task_ship', data.taskId, text.slice(0, 500), embedding);
|
|
49
|
+
markIndexed('task_ship', taskKey);
|
|
50
|
+
indexed++;
|
|
51
|
+
}
|
|
52
|
+
// 2. Index QA bundle summary if present
|
|
53
|
+
const meta = data.metadata || {};
|
|
54
|
+
const qaBundleSummary = meta.qa_bundle?.summary;
|
|
55
|
+
if (qaBundleSummary && typeof qaBundleSummary === 'string') {
|
|
56
|
+
const qaKey = `qa::${data.taskId}`;
|
|
57
|
+
if (!alreadyIndexed('qa_bundle', qaKey)) {
|
|
58
|
+
const qaText = `QA: ${data.title} — ${qaBundleSummary}`;
|
|
59
|
+
const embedding = await embed(qaText);
|
|
60
|
+
upsertVector(db, 'qa_bundle', data.taskId, qaText.slice(0, 500), embedding);
|
|
61
|
+
markIndexed('qa_bundle', qaKey);
|
|
62
|
+
indexed++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 3. Index artifact paths/links
|
|
66
|
+
const artifacts = meta.artifacts || [];
|
|
67
|
+
const artifactPath = meta.artifact_path;
|
|
68
|
+
if (artifactPath)
|
|
69
|
+
artifacts.push(artifactPath);
|
|
70
|
+
for (const artifact of artifacts) {
|
|
71
|
+
const artKey = `artifact::${data.taskId}::${artifact}`;
|
|
72
|
+
if (!alreadyIndexed('artifact', artKey)) {
|
|
73
|
+
const artText = `Artifact for "${data.title}": ${artifact}`;
|
|
74
|
+
const embedding = await embed(artText);
|
|
75
|
+
upsertVector(db, 'artifact', `${data.taskId}::${artifact}`, artText.slice(0, 500), embedding);
|
|
76
|
+
markIndexed('artifact', artKey);
|
|
77
|
+
indexed++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(`[KnowledgeAutoIndex] Failed to index shipped task ${data.taskId}:`, err?.message);
|
|
83
|
+
}
|
|
84
|
+
if (indexed > 0) {
|
|
85
|
+
console.log(`[KnowledgeAutoIndex] Indexed ${indexed} entries for shipped task ${data.taskId}`);
|
|
86
|
+
}
|
|
87
|
+
return indexed;
|
|
88
|
+
}
|
|
89
|
+
// ── Process File Indexing ──────────────────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* Called when a file in process/ is written via API or filesystem.
|
|
92
|
+
* Re-indexes the file content.
|
|
93
|
+
*/
|
|
94
|
+
export async function onProcessFileWritten(filePath, content) {
|
|
95
|
+
const key = `process_file::${filePath}`;
|
|
96
|
+
// Don't check alreadyIndexed for file writes — content may have changed
|
|
97
|
+
try {
|
|
98
|
+
const { upsertVector } = await import('./vector-store.js');
|
|
99
|
+
const { embed } = await import('./embeddings.js');
|
|
100
|
+
const db = getDb();
|
|
101
|
+
const text = `File: ${filePath}\n${content.slice(0, 3000)}`;
|
|
102
|
+
const embedding = await embed(text);
|
|
103
|
+
upsertVector(db, 'shared_file', filePath, text.slice(0, 500), embedding);
|
|
104
|
+
markIndexed('shared_file', key);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error(`[KnowledgeAutoIndex] Failed to index process file ${filePath}:`, err?.message);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Called when a task comment is created with category 'decision' or
|
|
114
|
+
* contains decision-indicating content.
|
|
115
|
+
*/
|
|
116
|
+
export async function onDecisionComment(data) {
|
|
117
|
+
const key = `decision::${data.commentId}`;
|
|
118
|
+
if (alreadyIndexed('decision', key))
|
|
119
|
+
return false;
|
|
120
|
+
try {
|
|
121
|
+
const { upsertVector } = await import('./vector-store.js');
|
|
122
|
+
const { embed } = await import('./embeddings.js');
|
|
123
|
+
const db = getDb();
|
|
124
|
+
const parts = [`Decision on "${data.taskTitle || data.taskId}"`];
|
|
125
|
+
parts.push(data.content);
|
|
126
|
+
parts.push(`By: ${data.author}`);
|
|
127
|
+
const text = parts.join(' — ');
|
|
128
|
+
const embedding = await embed(text);
|
|
129
|
+
upsertVector(db, 'decision', data.commentId, text.slice(0, 500), embedding);
|
|
130
|
+
markIndexed('decision', key);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
console.error(`[KnowledgeAutoIndex] Failed to index decision comment ${data.commentId}:`, err?.message);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if a comment looks like a decision.
|
|
140
|
+
* Matches category=decision or content patterns.
|
|
141
|
+
*/
|
|
142
|
+
export function isDecisionComment(content, category) {
|
|
143
|
+
if (category === 'decision')
|
|
144
|
+
return true;
|
|
145
|
+
// Content heuristics
|
|
146
|
+
const lower = content.toLowerCase();
|
|
147
|
+
return lower.startsWith('decision:') || lower.includes('[decision]');
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=knowledge-auto-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-auto-index.js","sourceRoot":"","sources":["../src/knowledge-auto-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type DocCategory = 'decision' | 'runbook' | 'architecture' | 'lesson' | 'how-to';
|
|
2
|
+
export declare const VALID_CATEGORIES: DocCategory[];
|
|
3
|
+
export interface KnowledgeDoc {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
content: string;
|
|
7
|
+
tags: string[];
|
|
8
|
+
category: DocCategory;
|
|
9
|
+
author: string;
|
|
10
|
+
related_task_ids: string[];
|
|
11
|
+
related_insight_ids: string[];
|
|
12
|
+
created_at: number;
|
|
13
|
+
updated_at: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateDocInput {
|
|
16
|
+
title: string;
|
|
17
|
+
content: string;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
category: DocCategory;
|
|
20
|
+
author: string;
|
|
21
|
+
related_task_ids?: string[];
|
|
22
|
+
related_insight_ids?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface UpdateDocInput {
|
|
25
|
+
title?: string;
|
|
26
|
+
content?: string;
|
|
27
|
+
tags?: string[];
|
|
28
|
+
category?: DocCategory;
|
|
29
|
+
author?: string;
|
|
30
|
+
related_task_ids?: string[];
|
|
31
|
+
related_insight_ids?: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function createDoc(input: CreateDocInput): KnowledgeDoc;
|
|
34
|
+
export declare function getDoc(id: string): KnowledgeDoc | null;
|
|
35
|
+
export declare function listDocs(filters?: {
|
|
36
|
+
tag?: string;
|
|
37
|
+
category?: DocCategory;
|
|
38
|
+
author?: string;
|
|
39
|
+
search?: string;
|
|
40
|
+
limit?: number;
|
|
41
|
+
}): KnowledgeDoc[];
|
|
42
|
+
export declare function updateDoc(id: string, input: UpdateDocInput): KnowledgeDoc | null;
|
|
43
|
+
export declare function deleteDoc(id: string): boolean;
|
|
44
|
+
export declare function countDocs(category?: DocCategory): number;
|
|
45
|
+
//# sourceMappingURL=knowledge-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-docs.d.ts","sourceRoot":"","sources":["../src/knowledge-docs.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEvF,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAAgE,CAAA;AAE1G,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B;AA6FD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CA2B7D;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKtD;AAED,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,YAAY,EAAE,CAgCjB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CAkDhF;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK7C;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAOxD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Knowledge Documents — Structured team knowledge with tags and categories
|
|
5
|
+
*
|
|
6
|
+
* CRUD for durable knowledge articles: decisions, runbooks, architecture docs,
|
|
7
|
+
* lessons, and how-tos. Auto-indexed in vector store for semantic search.
|
|
8
|
+
*/
|
|
9
|
+
import { getDb } from './db.js';
|
|
10
|
+
export const VALID_CATEGORIES = ['decision', 'runbook', 'architecture', 'lesson', 'how-to'];
|
|
11
|
+
// ── Database setup ─────────────────────────────────────────────────────────
|
|
12
|
+
let initialized = false;
|
|
13
|
+
function ensureTable() {
|
|
14
|
+
if (initialized)
|
|
15
|
+
return;
|
|
16
|
+
const db = getDb();
|
|
17
|
+
db.exec(`
|
|
18
|
+
CREATE TABLE IF NOT EXISTS knowledge_docs (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
title TEXT NOT NULL,
|
|
21
|
+
content TEXT NOT NULL,
|
|
22
|
+
tags_json TEXT NOT NULL DEFAULT '[]',
|
|
23
|
+
category TEXT NOT NULL CHECK(category IN ('decision', 'runbook', 'architecture', 'lesson', 'how-to')),
|
|
24
|
+
author TEXT NOT NULL,
|
|
25
|
+
related_task_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
26
|
+
related_insight_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
27
|
+
created_at INTEGER NOT NULL,
|
|
28
|
+
updated_at INTEGER NOT NULL
|
|
29
|
+
)
|
|
30
|
+
`);
|
|
31
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_kdocs_category ON knowledge_docs(category)');
|
|
32
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_kdocs_author ON knowledge_docs(author)');
|
|
33
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_kdocs_created ON knowledge_docs(created_at)');
|
|
34
|
+
initialized = true;
|
|
35
|
+
}
|
|
36
|
+
// ── ID generation ──────────────────────────────────────────────────────────
|
|
37
|
+
function generateId() {
|
|
38
|
+
const ts = Date.now();
|
|
39
|
+
const rand = Math.random().toString(36).slice(2, 10);
|
|
40
|
+
return `kdoc-${ts}-${rand}`;
|
|
41
|
+
}
|
|
42
|
+
function rowToDoc(row) {
|
|
43
|
+
return {
|
|
44
|
+
id: row.id,
|
|
45
|
+
title: row.title,
|
|
46
|
+
content: row.content,
|
|
47
|
+
tags: JSON.parse(row.tags_json || '[]'),
|
|
48
|
+
category: row.category,
|
|
49
|
+
author: row.author,
|
|
50
|
+
related_task_ids: JSON.parse(row.related_task_ids_json || '[]'),
|
|
51
|
+
related_insight_ids: JSON.parse(row.related_insight_ids_json || '[]'),
|
|
52
|
+
created_at: row.created_at,
|
|
53
|
+
updated_at: row.updated_at,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// ── Validation ─────────────────────────────────────────────────────────────
|
|
57
|
+
function validateCreateInput(input) {
|
|
58
|
+
const errors = [];
|
|
59
|
+
if (!input.title || typeof input.title !== 'string' || input.title.trim() === '') {
|
|
60
|
+
errors.push('title is required');
|
|
61
|
+
}
|
|
62
|
+
if (!input.content || typeof input.content !== 'string' || input.content.trim() === '') {
|
|
63
|
+
errors.push('content is required');
|
|
64
|
+
}
|
|
65
|
+
if (!input.category || !VALID_CATEGORIES.includes(input.category)) {
|
|
66
|
+
errors.push(`category must be one of: ${VALID_CATEGORIES.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
if (!input.author || typeof input.author !== 'string' || input.author.trim() === '') {
|
|
69
|
+
errors.push('author is required');
|
|
70
|
+
}
|
|
71
|
+
if (input.tags && !Array.isArray(input.tags)) {
|
|
72
|
+
errors.push('tags must be an array');
|
|
73
|
+
}
|
|
74
|
+
return errors;
|
|
75
|
+
}
|
|
76
|
+
// ── CRUD ───────────────────────────────────────────────────────────────────
|
|
77
|
+
export function createDoc(input) {
|
|
78
|
+
ensureTable();
|
|
79
|
+
const errors = validateCreateInput(input);
|
|
80
|
+
if (errors.length > 0) {
|
|
81
|
+
throw new Error(`Validation failed: ${errors.join('; ')}`);
|
|
82
|
+
}
|
|
83
|
+
const db = getDb();
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const id = generateId();
|
|
86
|
+
db.prepare(`
|
|
87
|
+
INSERT INTO knowledge_docs (id, title, content, tags_json, category, author, related_task_ids_json, related_insight_ids_json, created_at, updated_at)
|
|
88
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
89
|
+
`).run(id, input.title.trim(), input.content, JSON.stringify(input.tags || []), input.category, input.author.trim(), JSON.stringify(input.related_task_ids || []), JSON.stringify(input.related_insight_ids || []), now, now);
|
|
90
|
+
return getDoc(id);
|
|
91
|
+
}
|
|
92
|
+
export function getDoc(id) {
|
|
93
|
+
ensureTable();
|
|
94
|
+
const db = getDb();
|
|
95
|
+
const row = db.prepare('SELECT * FROM knowledge_docs WHERE id = ?').get(id);
|
|
96
|
+
return row ? rowToDoc(row) : null;
|
|
97
|
+
}
|
|
98
|
+
export function listDocs(filters) {
|
|
99
|
+
ensureTable();
|
|
100
|
+
const db = getDb();
|
|
101
|
+
const conditions = [];
|
|
102
|
+
const params = [];
|
|
103
|
+
if (filters?.category) {
|
|
104
|
+
conditions.push('category = ?');
|
|
105
|
+
params.push(filters.category);
|
|
106
|
+
}
|
|
107
|
+
if (filters?.author) {
|
|
108
|
+
conditions.push('author = ?');
|
|
109
|
+
params.push(filters.author);
|
|
110
|
+
}
|
|
111
|
+
if (filters?.search) {
|
|
112
|
+
conditions.push('(title LIKE ? OR content LIKE ?)');
|
|
113
|
+
const term = `%${filters.search}%`;
|
|
114
|
+
params.push(term, term);
|
|
115
|
+
}
|
|
116
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
117
|
+
const limit = filters?.limit || 100;
|
|
118
|
+
let docs = db.prepare(`SELECT * FROM knowledge_docs ${where} ORDER BY updated_at DESC LIMIT ?`).all(...params, limit).map(rowToDoc);
|
|
119
|
+
// Post-filter: tag (JSON array in tags_json)
|
|
120
|
+
if (filters?.tag) {
|
|
121
|
+
const tag = filters.tag.toLowerCase();
|
|
122
|
+
docs = docs.filter(d => d.tags.some(t => t.toLowerCase() === tag));
|
|
123
|
+
}
|
|
124
|
+
return docs;
|
|
125
|
+
}
|
|
126
|
+
export function updateDoc(id, input) {
|
|
127
|
+
ensureTable();
|
|
128
|
+
const db = getDb();
|
|
129
|
+
const existing = getDoc(id);
|
|
130
|
+
if (!existing)
|
|
131
|
+
return null;
|
|
132
|
+
const updates = [];
|
|
133
|
+
const params = [];
|
|
134
|
+
if (input.title !== undefined) {
|
|
135
|
+
updates.push('title = ?');
|
|
136
|
+
params.push(input.title.trim());
|
|
137
|
+
}
|
|
138
|
+
if (input.content !== undefined) {
|
|
139
|
+
updates.push('content = ?');
|
|
140
|
+
params.push(input.content);
|
|
141
|
+
}
|
|
142
|
+
if (input.tags !== undefined) {
|
|
143
|
+
updates.push('tags_json = ?');
|
|
144
|
+
params.push(JSON.stringify(input.tags));
|
|
145
|
+
}
|
|
146
|
+
if (input.category !== undefined) {
|
|
147
|
+
if (!VALID_CATEGORIES.includes(input.category)) {
|
|
148
|
+
throw new Error(`category must be one of: ${VALID_CATEGORIES.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
updates.push('category = ?');
|
|
151
|
+
params.push(input.category);
|
|
152
|
+
}
|
|
153
|
+
if (input.author !== undefined) {
|
|
154
|
+
updates.push('author = ?');
|
|
155
|
+
params.push(input.author.trim());
|
|
156
|
+
}
|
|
157
|
+
if (input.related_task_ids !== undefined) {
|
|
158
|
+
updates.push('related_task_ids_json = ?');
|
|
159
|
+
params.push(JSON.stringify(input.related_task_ids));
|
|
160
|
+
}
|
|
161
|
+
if (input.related_insight_ids !== undefined) {
|
|
162
|
+
updates.push('related_insight_ids_json = ?');
|
|
163
|
+
params.push(JSON.stringify(input.related_insight_ids));
|
|
164
|
+
}
|
|
165
|
+
if (updates.length === 0)
|
|
166
|
+
return existing;
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
updates.push('updated_at = ?');
|
|
169
|
+
params.push(now);
|
|
170
|
+
params.push(id);
|
|
171
|
+
db.prepare(`UPDATE knowledge_docs SET ${updates.join(', ')} WHERE id = ?`).run(...params);
|
|
172
|
+
return getDoc(id);
|
|
173
|
+
}
|
|
174
|
+
export function deleteDoc(id) {
|
|
175
|
+
ensureTable();
|
|
176
|
+
const db = getDb();
|
|
177
|
+
const result = db.prepare('DELETE FROM knowledge_docs WHERE id = ?').run(id);
|
|
178
|
+
return result.changes > 0;
|
|
179
|
+
}
|
|
180
|
+
export function countDocs(category) {
|
|
181
|
+
ensureTable();
|
|
182
|
+
const db = getDb();
|
|
183
|
+
if (category) {
|
|
184
|
+
return db.prepare('SELECT COUNT(*) as c FROM knowledge_docs WHERE category = ?').get(category).c;
|
|
185
|
+
}
|
|
186
|
+
return db.prepare('SELECT COUNT(*) as c FROM knowledge_docs').get().c;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=knowledge-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-docs.js","sourceRoot":"","sources":["../src/knowledge-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface LaneConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
agents: string[];
|
|
4
|
+
readyFloor: number;
|
|
5
|
+
wipLimit: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const DEFAULT_LANES: LaneConfig[];
|
|
8
|
+
/**
|
|
9
|
+
* Load lanes config. Reads TEAM-ROLES.yaml `lanes:` section if available;
|
|
10
|
+
* falls back to DEFAULT_LANES.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getLanesConfig(): LaneConfig[];
|
|
13
|
+
/** Find the lane an agent belongs to. Returns null if not in any lane. */
|
|
14
|
+
export declare function getAgentLane(agent: string): LaneConfig | null;
|
|
15
|
+
/**
|
|
16
|
+
* Check if an agent has reached their WIP limit.
|
|
17
|
+
* Returns null if agent is not in any lane (no limit applies).
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkWipLimit(agent: string, doingCount: number): {
|
|
20
|
+
blocked: boolean;
|
|
21
|
+
wipLimit: number;
|
|
22
|
+
doing: number;
|
|
23
|
+
message: string;
|
|
24
|
+
} | null;
|
|
25
|
+
//# sourceMappingURL=lane-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-config.d.ts","sourceRoot":"","sources":["../src/lane-config.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAMD,eAAO,MAAM,aAAa,EAAE,UAAU,EAMrC,CAAA;AA+BD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,UAAU,EAAE,CAwB7C;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAG7D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa/E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Lane configuration for ready-queue engine v1
|
|
5
|
+
*
|
|
6
|
+
* Lanes group agents into work streams with:
|
|
7
|
+
* readyFloor — minimum unblocked todo tasks per agent
|
|
8
|
+
* wipLimit — max simultaneous doing tasks per agent
|
|
9
|
+
*
|
|
10
|
+
* Config is loaded from TEAM-ROLES.yaml `lanes:` section.
|
|
11
|
+
* Falls back to hardcoded defaults if not configured.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { parse as parseYaml } from 'yaml';
|
|
16
|
+
import { REFLECTT_HOME } from './config.js';
|
|
17
|
+
// ── Hardcoded defaults ─────────────────────────────────────────────────────
|
|
18
|
+
// Matches the hardcoded lanes in server.ts /health/backlog.
|
|
19
|
+
// These are the fallback when TEAM-ROLES.yaml has no `lanes:` section.
|
|
20
|
+
export const DEFAULT_LANES = [
|
|
21
|
+
{ name: 'engineering', agents: ['link', 'pixel'], readyFloor: 2, wipLimit: 2 },
|
|
22
|
+
{ name: 'content', agents: ['echo'], readyFloor: 2, wipLimit: 2 },
|
|
23
|
+
{ name: 'operations', agents: ['kai', 'sage'], readyFloor: 1, wipLimit: 2 },
|
|
24
|
+
{ name: 'research', agents: ['scout'], readyFloor: 1, wipLimit: 2 },
|
|
25
|
+
{ name: 'rhythm', agents: ['rhythm'], readyFloor: 1, wipLimit: 2 },
|
|
26
|
+
];
|
|
27
|
+
// ── Config paths ────────────────────────────────────────────────────────────
|
|
28
|
+
const CONFIG_PATHS = [
|
|
29
|
+
join(REFLECTT_HOME, 'TEAM-ROLES.yaml'),
|
|
30
|
+
join(REFLECTT_HOME, 'TEAM-ROLES.yml'),
|
|
31
|
+
];
|
|
32
|
+
// ── YAML parsing ────────────────────────────────────────────────────────────
|
|
33
|
+
function parseLanesFromYaml(content) {
|
|
34
|
+
try {
|
|
35
|
+
const data = parseYaml(content);
|
|
36
|
+
if (!data?.lanes || !Array.isArray(data.lanes))
|
|
37
|
+
return null;
|
|
38
|
+
const parsed = data.lanes.map((l) => ({
|
|
39
|
+
name: String(l.name || ''),
|
|
40
|
+
agents: Array.isArray(l.agents) ? l.agents.map(String) : [],
|
|
41
|
+
readyFloor: typeof l.readyFloor === 'number' ? l.readyFloor : 1,
|
|
42
|
+
wipLimit: typeof l.wipLimit === 'number' ? l.wipLimit : 2,
|
|
43
|
+
})).filter((l) => l.name && l.agents.length > 0);
|
|
44
|
+
return parsed.length > 0 ? parsed : null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Load lanes config. Reads TEAM-ROLES.yaml `lanes:` section if available;
|
|
53
|
+
* falls back to DEFAULT_LANES.
|
|
54
|
+
*/
|
|
55
|
+
export function getLanesConfig() {
|
|
56
|
+
const isTest = Boolean(process.env.VITEST) || process.env.NODE_ENV === 'test';
|
|
57
|
+
if (!isTest) {
|
|
58
|
+
// Try user config files
|
|
59
|
+
for (const configPath of CONFIG_PATHS) {
|
|
60
|
+
if (!existsSync(configPath))
|
|
61
|
+
continue;
|
|
62
|
+
try {
|
|
63
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
64
|
+
const lanes = parseLanesFromYaml(content);
|
|
65
|
+
if (lanes)
|
|
66
|
+
return lanes;
|
|
67
|
+
}
|
|
68
|
+
catch { /* fall through */ }
|
|
69
|
+
}
|
|
70
|
+
// Try defaults shipped with repo
|
|
71
|
+
try {
|
|
72
|
+
const defaultsPath = new URL('../defaults/TEAM-ROLES.yaml', import.meta.url);
|
|
73
|
+
const content = readFileSync(defaultsPath, 'utf-8');
|
|
74
|
+
const lanes = parseLanesFromYaml(content);
|
|
75
|
+
if (lanes)
|
|
76
|
+
return lanes;
|
|
77
|
+
}
|
|
78
|
+
catch { /* fall through */ }
|
|
79
|
+
}
|
|
80
|
+
return DEFAULT_LANES;
|
|
81
|
+
}
|
|
82
|
+
/** Find the lane an agent belongs to. Returns null if not in any lane. */
|
|
83
|
+
export function getAgentLane(agent) {
|
|
84
|
+
const agentLower = agent.toLowerCase();
|
|
85
|
+
return getLanesConfig().find(l => l.agents.some(a => a.toLowerCase() === agentLower)) ?? null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if an agent has reached their WIP limit.
|
|
89
|
+
* Returns null if agent is not in any lane (no limit applies).
|
|
90
|
+
*/
|
|
91
|
+
export function checkWipLimit(agent, doingCount) {
|
|
92
|
+
const lane = getAgentLane(agent);
|
|
93
|
+
if (!lane)
|
|
94
|
+
return null;
|
|
95
|
+
const blocked = doingCount >= lane.wipLimit;
|
|
96
|
+
return {
|
|
97
|
+
blocked,
|
|
98
|
+
wipLimit: lane.wipLimit,
|
|
99
|
+
doing: doingCount,
|
|
100
|
+
message: blocked
|
|
101
|
+
? `WIP limit reached (${doingCount}/${lane.wipLimit} doing). Complete or park a task first.`
|
|
102
|
+
: `WIP ok (${doingCount}/${lane.wipLimit} doing).`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=lane-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-config.js","sourceRoot":"","sources":["../src/lane-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export interface LineageEntry {
|
|
2
|
+
/** Unique lineage chain ID (derived from insight or reflection) */
|
|
3
|
+
chain_id: string;
|
|
4
|
+
/** Reflection that started the chain */
|
|
5
|
+
reflection: {
|
|
6
|
+
id: string;
|
|
7
|
+
author: string;
|
|
8
|
+
pain: string;
|
|
9
|
+
severity: string | null;
|
|
10
|
+
confidence: number;
|
|
11
|
+
created_at: number;
|
|
12
|
+
} | null;
|
|
13
|
+
/** Insight the reflection was clustered into */
|
|
14
|
+
insight: {
|
|
15
|
+
id: string;
|
|
16
|
+
cluster_key: string;
|
|
17
|
+
status: string;
|
|
18
|
+
score: number;
|
|
19
|
+
priority: string;
|
|
20
|
+
promotion_readiness: string;
|
|
21
|
+
reflection_count: number;
|
|
22
|
+
independent_count: number;
|
|
23
|
+
severity_max: string | null;
|
|
24
|
+
created_at: number;
|
|
25
|
+
updated_at: number;
|
|
26
|
+
} | null;
|
|
27
|
+
/** Task created from the insight (if any) */
|
|
28
|
+
task: {
|
|
29
|
+
id: string;
|
|
30
|
+
title: string;
|
|
31
|
+
status: string;
|
|
32
|
+
priority: string;
|
|
33
|
+
assignee: string | null;
|
|
34
|
+
reviewer: string | null;
|
|
35
|
+
created_at: number;
|
|
36
|
+
} | null;
|
|
37
|
+
/** Promotion audit record (if promoted) */
|
|
38
|
+
promotion: {
|
|
39
|
+
id: string;
|
|
40
|
+
promoted_by: string;
|
|
41
|
+
created_at: number;
|
|
42
|
+
} | null;
|
|
43
|
+
/** Missing-link anomalies detected in this chain */
|
|
44
|
+
anomalies: LineageAnomaly[];
|
|
45
|
+
/** Timestamps of key events in the chain */
|
|
46
|
+
timeline: TimelineEvent[];
|
|
47
|
+
}
|
|
48
|
+
export interface LineageAnomaly {
|
|
49
|
+
type: 'missing_insight' | 'missing_task' | 'orphaned_insight' | 'stale_promotion' | 'missing_reflection';
|
|
50
|
+
message: string;
|
|
51
|
+
severity: 'warning' | 'error';
|
|
52
|
+
}
|
|
53
|
+
export interface TimelineEvent {
|
|
54
|
+
event: string;
|
|
55
|
+
timestamp: number;
|
|
56
|
+
actor?: string;
|
|
57
|
+
detail?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface LineageListOpts {
|
|
60
|
+
status?: string;
|
|
61
|
+
team_id?: string;
|
|
62
|
+
role_type?: string;
|
|
63
|
+
author?: string;
|
|
64
|
+
has_anomaly?: boolean;
|
|
65
|
+
limit?: number;
|
|
66
|
+
offset?: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build lineage entries by walking insight → reflections → tasks.
|
|
70
|
+
* Each insight forms a chain; orphaned reflections (no insight) get their own chain.
|
|
71
|
+
*/
|
|
72
|
+
export declare function listLineage(opts?: LineageListOpts): {
|
|
73
|
+
entries: LineageEntry[];
|
|
74
|
+
total: number;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Get lineage for a specific chain (by insight ID, reflection ID, or task ID).
|
|
78
|
+
*/
|
|
79
|
+
export declare function getLineage(id: string): LineageEntry | null;
|
|
80
|
+
export declare function lineageStats(): {
|
|
81
|
+
total_chains: number;
|
|
82
|
+
with_task: number;
|
|
83
|
+
with_anomalies: number;
|
|
84
|
+
anomaly_breakdown: Record<string, number>;
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=lineage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineage.d.ts","sourceRoot":"","sources":["../src/lineage.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAA;IACR,gDAAgD;IAChD,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,gBAAgB,EAAE,MAAM,CAAA;QACxB,iBAAiB,EAAE,MAAM,CAAA;QACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAA;IACR,6CAA6C;IAC7C,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAA;IACR,2CAA2C;IAC3C,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAA;QACV,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAA;IACR,oDAAoD;IACpD,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,4CAA4C;IAC5C,QAAQ,EAAE,aAAa,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,iBAAiB,GAAG,cAAc,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,oBAAoB,CAAA;IACxG,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,eAAoB,GAAG;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuClG;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA6C1D;AAkND,wBAAgB,YAAY,IAAI;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C,CAqBA"}
|