@runcore-sh/runcore 0.1.2
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 +21 -0
- package/README.md +353 -0
- package/dist/activity/log.d.ts +37 -0
- package/dist/activity/log.d.ts.map +1 -0
- package/dist/activity/log.js +259 -0
- package/dist/activity/log.js.map +1 -0
- package/dist/adapters/storage/gdrive-backup.d.ts +20 -0
- package/dist/adapters/storage/gdrive-backup.d.ts.map +1 -0
- package/dist/adapters/storage/gdrive-backup.js +244 -0
- package/dist/adapters/storage/gdrive-backup.js.map +1 -0
- package/dist/adapters/storage/local.d.ts +19 -0
- package/dist/adapters/storage/local.d.ts.map +1 -0
- package/dist/adapters/storage/local.js +101 -0
- package/dist/adapters/storage/local.js.map +1 -0
- package/dist/adapters/storage/types.d.ts +44 -0
- package/dist/adapters/storage/types.d.ts.map +1 -0
- package/dist/adapters/storage/types.js +6 -0
- package/dist/adapters/storage/types.js.map +1 -0
- package/dist/agents/autonomous.d.ts +67 -0
- package/dist/agents/autonomous.d.ts.map +1 -0
- package/dist/agents/autonomous.js +710 -0
- package/dist/agents/autonomous.js.map +1 -0
- package/dist/agents/commit.d.ts +22 -0
- package/dist/agents/commit.d.ts.map +1 -0
- package/dist/agents/commit.js +120 -0
- package/dist/agents/commit.js.map +1 -0
- package/dist/agents/continue.d.ts +19 -0
- package/dist/agents/continue.d.ts.map +1 -0
- package/dist/agents/continue.js +158 -0
- package/dist/agents/continue.js.map +1 -0
- package/dist/agents/cooldown.d.ts +127 -0
- package/dist/agents/cooldown.d.ts.map +1 -0
- package/dist/agents/cooldown.js +396 -0
- package/dist/agents/cooldown.js.map +1 -0
- package/dist/agents/dedup-guard.d.ts +15 -0
- package/dist/agents/dedup-guard.d.ts.map +1 -0
- package/dist/agents/dedup-guard.js +128 -0
- package/dist/agents/dedup-guard.js.map +1 -0
- package/dist/agents/index.d.ts +34 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +51 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/instance-manager.d.ts +262 -0
- package/dist/agents/instance-manager.d.ts.map +1 -0
- package/dist/agents/instance-manager.js +850 -0
- package/dist/agents/instance-manager.js.map +1 -0
- package/dist/agents/locks.d.ts +81 -0
- package/dist/agents/locks.d.ts.map +1 -0
- package/dist/agents/locks.js +234 -0
- package/dist/agents/locks.js.map +1 -0
- package/dist/agents/memory.d.ts +37 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +92 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/monitor.d.ts +16 -0
- package/dist/agents/monitor.d.ts.map +1 -0
- package/dist/agents/monitor.js +235 -0
- package/dist/agents/monitor.js.map +1 -0
- package/dist/agents/orchestration.d.ts +218 -0
- package/dist/agents/orchestration.d.ts.map +1 -0
- package/dist/agents/orchestration.js +715 -0
- package/dist/agents/orchestration.js.map +1 -0
- package/dist/agents/recover.d.ts +30 -0
- package/dist/agents/recover.d.ts.map +1 -0
- package/dist/agents/recover.js +166 -0
- package/dist/agents/recover.js.map +1 -0
- package/dist/agents/reflection.d.ts +36 -0
- package/dist/agents/reflection.d.ts.map +1 -0
- package/dist/agents/reflection.js +198 -0
- package/dist/agents/reflection.js.map +1 -0
- package/dist/agents/runtime/bus.d.ts +46 -0
- package/dist/agents/runtime/bus.d.ts.map +1 -0
- package/dist/agents/runtime/bus.js +174 -0
- package/dist/agents/runtime/bus.js.map +1 -0
- package/dist/agents/runtime/config.d.ts +14 -0
- package/dist/agents/runtime/config.d.ts.map +1 -0
- package/dist/agents/runtime/config.js +100 -0
- package/dist/agents/runtime/config.js.map +1 -0
- package/dist/agents/runtime/driver.d.ts +25 -0
- package/dist/agents/runtime/driver.d.ts.map +1 -0
- package/dist/agents/runtime/driver.js +215 -0
- package/dist/agents/runtime/driver.js.map +1 -0
- package/dist/agents/runtime/errors.d.ts +30 -0
- package/dist/agents/runtime/errors.d.ts.map +1 -0
- package/dist/agents/runtime/errors.js +40 -0
- package/dist/agents/runtime/errors.js.map +1 -0
- package/dist/agents/runtime/index.d.ts +29 -0
- package/dist/agents/runtime/index.d.ts.map +1 -0
- package/dist/agents/runtime/index.js +54 -0
- package/dist/agents/runtime/index.js.map +1 -0
- package/dist/agents/runtime/lifecycle.d.ts +46 -0
- package/dist/agents/runtime/lifecycle.d.ts.map +1 -0
- package/dist/agents/runtime/lifecycle.js +116 -0
- package/dist/agents/runtime/lifecycle.js.map +1 -0
- package/dist/agents/runtime/manager.d.ts +129 -0
- package/dist/agents/runtime/manager.d.ts.map +1 -0
- package/dist/agents/runtime/manager.js +947 -0
- package/dist/agents/runtime/manager.js.map +1 -0
- package/dist/agents/runtime/registry.d.ts +66 -0
- package/dist/agents/runtime/registry.d.ts.map +1 -0
- package/dist/agents/runtime/registry.js +195 -0
- package/dist/agents/runtime/registry.js.map +1 -0
- package/dist/agents/runtime/resources.d.ts +49 -0
- package/dist/agents/runtime/resources.d.ts.map +1 -0
- package/dist/agents/runtime/resources.js +146 -0
- package/dist/agents/runtime/resources.js.map +1 -0
- package/dist/agents/runtime/types.d.ts +168 -0
- package/dist/agents/runtime/types.d.ts.map +1 -0
- package/dist/agents/runtime/types.js +24 -0
- package/dist/agents/runtime/types.js.map +1 -0
- package/dist/agents/runtime.d.ts +240 -0
- package/dist/agents/runtime.d.ts.map +1 -0
- package/dist/agents/runtime.js +577 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/agents/spawn.d.ts +49 -0
- package/dist/agents/spawn.d.ts.map +1 -0
- package/dist/agents/spawn.js +975 -0
- package/dist/agents/spawn.js.map +1 -0
- package/dist/agents/store.d.ts +29 -0
- package/dist/agents/store.d.ts.map +1 -0
- package/dist/agents/store.js +174 -0
- package/dist/agents/store.js.map +1 -0
- package/dist/agents/triage.d.ts +23 -0
- package/dist/agents/triage.d.ts.map +1 -0
- package/dist/agents/triage.js +81 -0
- package/dist/agents/triage.js.map +1 -0
- package/dist/agents/types.d.ts +37 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/workflow.d.ts +137 -0
- package/dist/agents/workflow.d.ts.map +1 -0
- package/dist/agents/workflow.js +542 -0
- package/dist/agents/workflow.js.map +1 -0
- package/dist/auth/crypto.d.ts +22 -0
- package/dist/auth/crypto.d.ts.map +1 -0
- package/dist/auth/crypto.js +42 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/identity.d.ts +89 -0
- package/dist/auth/identity.d.ts.map +1 -0
- package/dist/auth/identity.js +264 -0
- package/dist/auth/identity.js.map +1 -0
- package/dist/avatar/client.d.ts +34 -0
- package/dist/avatar/client.d.ts.map +1 -0
- package/dist/avatar/client.js +172 -0
- package/dist/avatar/client.js.map +1 -0
- package/dist/avatar/sidecar.d.ts +16 -0
- package/dist/avatar/sidecar.d.ts.map +1 -0
- package/dist/avatar/sidecar.js +125 -0
- package/dist/avatar/sidecar.js.map +1 -0
- package/dist/board/provider.d.ts +13 -0
- package/dist/board/provider.d.ts.map +1 -0
- package/dist/board/provider.js +19 -0
- package/dist/board/provider.js.map +1 -0
- package/dist/board/types.d.ts +76 -0
- package/dist/board/types.d.ts.map +1 -0
- package/dist/board/types.js +7 -0
- package/dist/board/types.js.map +1 -0
- package/dist/brain/skills.d.ts +177 -0
- package/dist/brain/skills.d.ts.map +1 -0
- package/dist/brain/skills.js +452 -0
- package/dist/brain/skills.js.map +1 -0
- package/dist/brain.d.ts +42 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +98 -0
- package/dist/brain.js.map +1 -0
- package/dist/browser/sessions.d.ts +23 -0
- package/dist/browser/sessions.d.ts.map +1 -0
- package/dist/browser/sessions.js +121 -0
- package/dist/browser/sessions.js.map +1 -0
- package/dist/cache/file.d.ts +56 -0
- package/dist/cache/file.d.ts.map +1 -0
- package/dist/cache/file.js +176 -0
- package/dist/cache/file.js.map +1 -0
- package/dist/cache/index.d.ts +64 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +108 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/keys.d.ts +29 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +52 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/llm-cache.d.ts +70 -0
- package/dist/cache/llm-cache.d.ts.map +1 -0
- package/dist/cache/llm-cache.js +165 -0
- package/dist/cache/llm-cache.js.map +1 -0
- package/dist/cache/memory.d.ts +53 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +114 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/calendar/google-adapter.d.ts +16 -0
- package/dist/calendar/google-adapter.d.ts.map +1 -0
- package/dist/calendar/google-adapter.js +163 -0
- package/dist/calendar/google-adapter.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +7 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/calendar/routes.d.ts +7 -0
- package/dist/calendar/routes.d.ts.map +1 -0
- package/dist/calendar/routes.js +199 -0
- package/dist/calendar/routes.js.map +1 -0
- package/dist/calendar/store.d.ts +73 -0
- package/dist/calendar/store.d.ts.map +1 -0
- package/dist/calendar/store.js +373 -0
- package/dist/calendar/store.js.map +1 -0
- package/dist/calendar/types.d.ts +99 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +7 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/capabilities/definitions/board.d.ts +7 -0
- package/dist/capabilities/definitions/board.d.ts.map +1 -0
- package/dist/capabilities/definitions/board.js +232 -0
- package/dist/capabilities/definitions/board.js.map +1 -0
- package/dist/capabilities/definitions/browser.d.ts +18 -0
- package/dist/capabilities/definitions/browser.d.ts.map +1 -0
- package/dist/capabilities/definitions/browser.js +242 -0
- package/dist/capabilities/definitions/browser.js.map +1 -0
- package/dist/capabilities/definitions/calendar-context.d.ts +8 -0
- package/dist/capabilities/definitions/calendar-context.d.ts.map +1 -0
- package/dist/capabilities/definitions/calendar-context.js +41 -0
- package/dist/capabilities/definitions/calendar-context.js.map +1 -0
- package/dist/capabilities/definitions/calendar.d.ts +7 -0
- package/dist/capabilities/definitions/calendar.d.ts.map +1 -0
- package/dist/capabilities/definitions/calendar.js +173 -0
- package/dist/capabilities/definitions/calendar.js.map +1 -0
- package/dist/capabilities/definitions/docs.d.ts +6 -0
- package/dist/capabilities/definitions/docs.d.ts.map +1 -0
- package/dist/capabilities/definitions/docs.js +62 -0
- package/dist/capabilities/definitions/docs.js.map +1 -0
- package/dist/capabilities/definitions/email-context.d.ts +7 -0
- package/dist/capabilities/definitions/email-context.d.ts.map +1 -0
- package/dist/capabilities/definitions/email-context.js +55 -0
- package/dist/capabilities/definitions/email-context.js.map +1 -0
- package/dist/capabilities/definitions/email.d.ts +7 -0
- package/dist/capabilities/definitions/email.d.ts.map +1 -0
- package/dist/capabilities/definitions/email.js +94 -0
- package/dist/capabilities/definitions/email.js.map +1 -0
- package/dist/capabilities/definitions/task-done.d.ts +10 -0
- package/dist/capabilities/definitions/task-done.d.ts.map +1 -0
- package/dist/capabilities/definitions/task-done.js +83 -0
- package/dist/capabilities/definitions/task-done.js.map +1 -0
- package/dist/capabilities/definitions/vault-context.d.ts +12 -0
- package/dist/capabilities/definitions/vault-context.d.ts.map +1 -0
- package/dist/capabilities/definitions/vault-context.js +62 -0
- package/dist/capabilities/definitions/vault-context.js.map +1 -0
- package/dist/capabilities/definitions/web-search-context.d.ts +22 -0
- package/dist/capabilities/definitions/web-search-context.d.ts.map +1 -0
- package/dist/capabilities/definitions/web-search-context.js +60 -0
- package/dist/capabilities/definitions/web-search-context.js.map +1 -0
- package/dist/capabilities/index.d.ts +18 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +21 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/registry.d.ts +84 -0
- package/dist/capabilities/registry.d.ts.map +1 -0
- package/dist/capabilities/registry.js +248 -0
- package/dist/capabilities/registry.js.map +1 -0
- package/dist/capabilities/types.d.ts +157 -0
- package/dist/capabilities/types.d.ts.map +1 -0
- package/dist/capabilities/types.js +35 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +88 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +200 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/cli/backup.d.ts +13 -0
- package/dist/cli/backup.d.ts.map +1 -0
- package/dist/cli/backup.js +176 -0
- package/dist/cli/backup.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +231 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +54 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/contacts/index.d.ts +3 -0
- package/dist/contacts/index.d.ts.map +1 -0
- package/dist/contacts/index.js +2 -0
- package/dist/contacts/index.js.map +1 -0
- package/dist/contacts/store.d.ts +58 -0
- package/dist/contacts/store.d.ts.map +1 -0
- package/dist/contacts/store.js +278 -0
- package/dist/contacts/store.js.map +1 -0
- package/dist/contacts/types.d.ts +47 -0
- package/dist/contacts/types.d.ts.map +1 -0
- package/dist/contacts/types.js +5 -0
- package/dist/contacts/types.js.map +1 -0
- package/dist/context/assembler.d.ts +26 -0
- package/dist/context/assembler.d.ts.map +1 -0
- package/dist/context/assembler.js +65 -0
- package/dist/context/assembler.js.map +1 -0
- package/dist/context/compaction.d.ts +34 -0
- package/dist/context/compaction.d.ts.map +1 -0
- package/dist/context/compaction.js +84 -0
- package/dist/context/compaction.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/core/registry/index.d.ts +12 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +14 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/publisher.d.ts +22 -0
- package/dist/core/registry/publisher.d.ts.map +1 -0
- package/dist/core/registry/publisher.js +195 -0
- package/dist/core/registry/publisher.js.map +1 -0
- package/dist/core/registry/registry.d.ts +92 -0
- package/dist/core/registry/registry.d.ts.map +1 -0
- package/dist/core/registry/registry.js +254 -0
- package/dist/core/registry/registry.js.map +1 -0
- package/dist/core/registry/search.d.ts +12 -0
- package/dist/core/registry/search.d.ts.map +1 -0
- package/dist/core/registry/search.js +132 -0
- package/dist/core/registry/search.js.map +1 -0
- package/dist/core/registry/store.d.ts +55 -0
- package/dist/core/registry/store.d.ts.map +1 -0
- package/dist/core/registry/store.js +185 -0
- package/dist/core/registry/store.js.map +1 -0
- package/dist/core/registry/types.d.ts +141 -0
- package/dist/core/registry/types.d.ts.map +1 -0
- package/dist/core/registry/types.js +30 -0
- package/dist/core/registry/types.js.map +1 -0
- package/dist/core/registry/versions.d.ts +56 -0
- package/dist/core/registry/versions.d.ts.map +1 -0
- package/dist/core/registry/versions.js +101 -0
- package/dist/core/registry/versions.js.map +1 -0
- package/dist/credentials/store.d.ts +59 -0
- package/dist/credentials/store.d.ts.map +1 -0
- package/dist/credentials/store.js +178 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/files/agent-api.d.ts +50 -0
- package/dist/files/agent-api.d.ts.map +1 -0
- package/dist/files/agent-api.js +126 -0
- package/dist/files/agent-api.js.map +1 -0
- package/dist/files/compress.d.ts +20 -0
- package/dist/files/compress.d.ts.map +1 -0
- package/dist/files/compress.js +83 -0
- package/dist/files/compress.js.map +1 -0
- package/dist/files/extract.d.ts +11 -0
- package/dist/files/extract.d.ts.map +1 -0
- package/dist/files/extract.js +33 -0
- package/dist/files/extract.js.map +1 -0
- package/dist/files/gdrive.d.ts +56 -0
- package/dist/files/gdrive.d.ts.map +1 -0
- package/dist/files/gdrive.js +246 -0
- package/dist/files/gdrive.js.map +1 -0
- package/dist/files/ingest-folder.d.ts +22 -0
- package/dist/files/ingest-folder.d.ts.map +1 -0
- package/dist/files/ingest-folder.js +71 -0
- package/dist/files/ingest-folder.js.map +1 -0
- package/dist/files/ingest.d.ts +13 -0
- package/dist/files/ingest.d.ts.map +1 -0
- package/dist/files/ingest.js +127 -0
- package/dist/files/ingest.js.map +1 -0
- package/dist/files/manager.d.ts +117 -0
- package/dist/files/manager.d.ts.map +1 -0
- package/dist/files/manager.js +306 -0
- package/dist/files/manager.js.map +1 -0
- package/dist/files/store.d.ts +41 -0
- package/dist/files/store.d.ts.map +1 -0
- package/dist/files/store.js +271 -0
- package/dist/files/store.js.map +1 -0
- package/dist/files/templates.d.ts +45 -0
- package/dist/files/templates.d.ts.map +1 -0
- package/dist/files/templates.js +179 -0
- package/dist/files/templates.js.map +1 -0
- package/dist/files/types.d.ts +115 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/types.js +20 -0
- package/dist/files/types.js.map +1 -0
- package/dist/files/validate.d.ts +15 -0
- package/dist/files/validate.d.ts.map +1 -0
- package/dist/files/validate.js +213 -0
- package/dist/files/validate.js.map +1 -0
- package/dist/files/version.d.ts +31 -0
- package/dist/files/version.d.ts.map +1 -0
- package/dist/files/version.js +129 -0
- package/dist/files/version.js.map +1 -0
- package/dist/github/client.d.ts +83 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +408 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/commit-analysis.d.ts +30 -0
- package/dist/github/commit-analysis.d.ts.map +1 -0
- package/dist/github/commit-analysis.js +276 -0
- package/dist/github/commit-analysis.js.map +1 -0
- package/dist/github/contributor-stats.d.ts +18 -0
- package/dist/github/contributor-stats.d.ts.map +1 -0
- package/dist/github/contributor-stats.js +119 -0
- package/dist/github/contributor-stats.js.map +1 -0
- package/dist/github/issue-sla.d.ts +25 -0
- package/dist/github/issue-sla.d.ts.map +1 -0
- package/dist/github/issue-sla.js +220 -0
- package/dist/github/issue-sla.js.map +1 -0
- package/dist/github/issue-triage.d.ts +49 -0
- package/dist/github/issue-triage.d.ts.map +1 -0
- package/dist/github/issue-triage.js +286 -0
- package/dist/github/issue-triage.js.map +1 -0
- package/dist/github/pr-readiness.d.ts +18 -0
- package/dist/github/pr-readiness.d.ts.map +1 -0
- package/dist/github/pr-readiness.js +197 -0
- package/dist/github/pr-readiness.js.map +1 -0
- package/dist/github/pr-review.d.ts +17 -0
- package/dist/github/pr-review.d.ts.map +1 -0
- package/dist/github/pr-review.js +410 -0
- package/dist/github/pr-review.js.map +1 -0
- package/dist/github/release-notes.d.ts +32 -0
- package/dist/github/release-notes.d.ts.map +1 -0
- package/dist/github/release-notes.js +227 -0
- package/dist/github/release-notes.js.map +1 -0
- package/dist/github/repo-health.d.ts +17 -0
- package/dist/github/repo-health.d.ts.map +1 -0
- package/dist/github/repo-health.js +303 -0
- package/dist/github/repo-health.js.map +1 -0
- package/dist/github/retry.d.ts +39 -0
- package/dist/github/retry.d.ts.map +1 -0
- package/dist/github/retry.js +117 -0
- package/dist/github/retry.js.map +1 -0
- package/dist/github/types.d.ts +527 -0
- package/dist/github/types.d.ts.map +1 -0
- package/dist/github/types.js +8 -0
- package/dist/github/types.js.map +1 -0
- package/dist/github/webhooks.d.ts +36 -0
- package/dist/github/webhooks.d.ts.map +1 -0
- package/dist/github/webhooks.js +153 -0
- package/dist/github/webhooks.js.map +1 -0
- package/dist/goals/loop.d.ts +27 -0
- package/dist/goals/loop.d.ts.map +1 -0
- package/dist/goals/loop.js +239 -0
- package/dist/goals/loop.js.map +1 -0
- package/dist/goals/notifications.d.ts +20 -0
- package/dist/goals/notifications.d.ts.map +1 -0
- package/dist/goals/notifications.js +101 -0
- package/dist/goals/notifications.js.map +1 -0
- package/dist/goals/timer.d.ts +21 -0
- package/dist/goals/timer.d.ts.map +1 -0
- package/dist/goals/timer.js +60 -0
- package/dist/goals/timer.js.map +1 -0
- package/dist/google/auth.d.ts +84 -0
- package/dist/google/auth.d.ts.map +1 -0
- package/dist/google/auth.js +323 -0
- package/dist/google/auth.js.map +1 -0
- package/dist/google/calendar-timer.d.ts +20 -0
- package/dist/google/calendar-timer.d.ts.map +1 -0
- package/dist/google/calendar-timer.js +91 -0
- package/dist/google/calendar-timer.js.map +1 -0
- package/dist/google/calendar.d.ts +126 -0
- package/dist/google/calendar.d.ts.map +1 -0
- package/dist/google/calendar.js +270 -0
- package/dist/google/calendar.js.map +1 -0
- package/dist/google/docs.d.ts +87 -0
- package/dist/google/docs.d.ts.map +1 -0
- package/dist/google/docs.js +309 -0
- package/dist/google/docs.js.map +1 -0
- package/dist/google/gmail-send.d.ts +58 -0
- package/dist/google/gmail-send.d.ts.map +1 -0
- package/dist/google/gmail-send.js +219 -0
- package/dist/google/gmail-send.js.map +1 -0
- package/dist/google/gmail-timer.d.ts +34 -0
- package/dist/google/gmail-timer.d.ts.map +1 -0
- package/dist/google/gmail-timer.js +223 -0
- package/dist/google/gmail-timer.js.map +1 -0
- package/dist/google/gmail.d.ts +172 -0
- package/dist/google/gmail.d.ts.map +1 -0
- package/dist/google/gmail.js +470 -0
- package/dist/google/gmail.js.map +1 -0
- package/dist/google/tasks-timer.d.ts +20 -0
- package/dist/google/tasks-timer.d.ts.map +1 -0
- package/dist/google/tasks-timer.js +107 -0
- package/dist/google/tasks-timer.js.map +1 -0
- package/dist/google/tasks.d.ts +167 -0
- package/dist/google/tasks.d.ts.map +1 -0
- package/dist/google/tasks.js +331 -0
- package/dist/google/tasks.js.map +1 -0
- package/dist/google/temporal.d.ts +76 -0
- package/dist/google/temporal.d.ts.map +1 -0
- package/dist/google/temporal.js +176 -0
- package/dist/google/temporal.js.map +1 -0
- package/dist/health/alert-defaults.d.ts +12 -0
- package/dist/health/alert-defaults.d.ts.map +1 -0
- package/dist/health/alert-defaults.js +88 -0
- package/dist/health/alert-defaults.js.map +1 -0
- package/dist/health/alert-types.d.ts +97 -0
- package/dist/health/alert-types.d.ts.map +1 -0
- package/dist/health/alert-types.js +8 -0
- package/dist/health/alert-types.js.map +1 -0
- package/dist/health/alerting.d.ts +66 -0
- package/dist/health/alerting.d.ts.map +1 -0
- package/dist/health/alerting.js +373 -0
- package/dist/health/alerting.js.map +1 -0
- package/dist/health/checker.d.ts +32 -0
- package/dist/health/checker.d.ts.map +1 -0
- package/dist/health/checker.js +138 -0
- package/dist/health/checker.js.map +1 -0
- package/dist/health/checks/openrouter.d.ts +29 -0
- package/dist/health/checks/openrouter.d.ts.map +1 -0
- package/dist/health/checks/openrouter.js +75 -0
- package/dist/health/checks/openrouter.js.map +1 -0
- package/dist/health/checks.d.ts +26 -0
- package/dist/health/checks.d.ts.map +1 -0
- package/dist/health/checks.js +122 -0
- package/dist/health/checks.js.map +1 -0
- package/dist/health/components.d.ts +38 -0
- package/dist/health/components.d.ts.map +1 -0
- package/dist/health/components.js +112 -0
- package/dist/health/components.js.map +1 -0
- package/dist/health/index.d.ts +19 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +23 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/recovery.d.ts +42 -0
- package/dist/health/recovery.d.ts.map +1 -0
- package/dist/health/recovery.js +138 -0
- package/dist/health/recovery.js.map +1 -0
- package/dist/health/types.d.ts +68 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/health/types.js +5 -0
- package/dist/health/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/instance.d.ts +24 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +48 -0
- package/dist/instance.js.map +1 -0
- package/dist/integrations/github.d.ts +83 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +331 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/google-tasks.d.ts +232 -0
- package/dist/integrations/google-tasks.d.ts.map +1 -0
- package/dist/integrations/google-tasks.js +432 -0
- package/dist/integrations/google-tasks.js.map +1 -0
- package/dist/learning/extractor.d.ts +28 -0
- package/dist/learning/extractor.d.ts.map +1 -0
- package/dist/learning/extractor.js +135 -0
- package/dist/learning/extractor.js.map +1 -0
- package/dist/lib/BasePlugin.d.ts +58 -0
- package/dist/lib/BasePlugin.d.ts.map +1 -0
- package/dist/lib/BasePlugin.js +181 -0
- package/dist/lib/BasePlugin.js.map +1 -0
- package/dist/lib/PluginRegistry.d.ts +56 -0
- package/dist/lib/PluginRegistry.d.ts.map +1 -0
- package/dist/lib/PluginRegistry.js +172 -0
- package/dist/lib/PluginRegistry.js.map +1 -0
- package/dist/lib/brain-io.d.ts +60 -0
- package/dist/lib/brain-io.d.ts.map +1 -0
- package/dist/lib/brain-io.js +180 -0
- package/dist/lib/brain-io.js.map +1 -0
- package/dist/lib/encryption-config.d.ts +16 -0
- package/dist/lib/encryption-config.d.ts.map +1 -0
- package/dist/lib/encryption-config.js +40 -0
- package/dist/lib/encryption-config.js.map +1 -0
- package/dist/lib/encryption.d.ts +19 -0
- package/dist/lib/encryption.d.ts.map +1 -0
- package/dist/lib/encryption.js +65 -0
- package/dist/lib/encryption.js.map +1 -0
- package/dist/lib/key-store.d.ts +24 -0
- package/dist/lib/key-store.d.ts.map +1 -0
- package/dist/lib/key-store.js +38 -0
- package/dist/lib/key-store.js.map +1 -0
- package/dist/lib/schema-migration.d.ts +34 -0
- package/dist/lib/schema-migration.d.ts.map +1 -0
- package/dist/lib/schema-migration.js +77 -0
- package/dist/lib/schema-migration.js.map +1 -0
- package/dist/library/brain-shadow.d.ts +10 -0
- package/dist/library/brain-shadow.d.ts.map +1 -0
- package/dist/library/brain-shadow.js +158 -0
- package/dist/library/brain-shadow.js.map +1 -0
- package/dist/library/index.d.ts +7 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +6 -0
- package/dist/library/index.js.map +1 -0
- package/dist/library/routes.d.ts +7 -0
- package/dist/library/routes.d.ts.map +1 -0
- package/dist/library/routes.js +473 -0
- package/dist/library/routes.js.map +1 -0
- package/dist/library/store.d.ts +54 -0
- package/dist/library/store.d.ts.map +1 -0
- package/dist/library/store.js +403 -0
- package/dist/library/store.js.map +1 -0
- package/dist/library/types.d.ts +56 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +12 -0
- package/dist/library/types.js.map +1 -0
- package/dist/llm/cache.d.ts +42 -0
- package/dist/llm/cache.d.ts.map +1 -0
- package/dist/llm/cache.js +104 -0
- package/dist/llm/cache.js.map +1 -0
- package/dist/llm/complete.d.ts +24 -0
- package/dist/llm/complete.d.ts.map +1 -0
- package/dist/llm/complete.js +56 -0
- package/dist/llm/complete.js.map +1 -0
- package/dist/llm/errors.d.ts +28 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +82 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/ollama.d.ts +21 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +116 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openrouter.d.ts +13 -0
- package/dist/llm/openrouter.d.ts.map +1 -0
- package/dist/llm/openrouter.js +105 -0
- package/dist/llm/openrouter.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +8 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +189 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/index.d.ts +20 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +47 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/ollama.d.ts +13 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +188 -0
- package/dist/llm/providers/ollama.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +8 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +144 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/providers/openrouter.d.ts +7 -0
- package/dist/llm/providers/openrouter.d.ts.map +1 -0
- package/dist/llm/providers/openrouter.js +158 -0
- package/dist/llm/providers/openrouter.js.map +1 -0
- package/dist/llm/providers/types.d.ts +29 -0
- package/dist/llm/providers/types.d.ts.map +1 -0
- package/dist/llm/providers/types.js +6 -0
- package/dist/llm/providers/types.js.map +1 -0
- package/dist/llm/retry.d.ts +29 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +139 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/memory/file-backed.d.ts +36 -0
- package/dist/memory/file-backed.d.ts.map +1 -0
- package/dist/memory/file-backed.js +178 -0
- package/dist/memory/file-backed.js.map +1 -0
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/long-term.d.ts +38 -0
- package/dist/memory/long-term.d.ts.map +1 -0
- package/dist/memory/long-term.js +58 -0
- package/dist/memory/long-term.js.map +1 -0
- package/dist/memory/vector-index.d.ts +55 -0
- package/dist/memory/vector-index.d.ts.map +1 -0
- package/dist/memory/vector-index.js +207 -0
- package/dist/memory/vector-index.js.map +1 -0
- package/dist/memory/visual.d.ts +53 -0
- package/dist/memory/visual.d.ts.map +1 -0
- package/dist/memory/visual.js +218 -0
- package/dist/memory/visual.js.map +1 -0
- package/dist/memory/working.d.ts +12 -0
- package/dist/memory/working.d.ts.map +1 -0
- package/dist/memory/working.js +34 -0
- package/dist/memory/working.js.map +1 -0
- package/dist/metrics/aggregator.d.ts +58 -0
- package/dist/metrics/aggregator.d.ts.map +1 -0
- package/dist/metrics/aggregator.js +253 -0
- package/dist/metrics/aggregator.js.map +1 -0
- package/dist/metrics/collector.d.ts +26 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +346 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/metrics/firewall-metrics.d.ts +95 -0
- package/dist/metrics/firewall-metrics.d.ts.map +1 -0
- package/dist/metrics/firewall-metrics.js +261 -0
- package/dist/metrics/firewall-metrics.js.map +1 -0
- package/dist/metrics/index.d.ts +20 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +23 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instruments.d.ts +89 -0
- package/dist/metrics/instruments.d.ts.map +1 -0
- package/dist/metrics/instruments.js +172 -0
- package/dist/metrics/instruments.js.map +1 -0
- package/dist/metrics/middleware.d.ts +12 -0
- package/dist/metrics/middleware.d.ts.map +1 -0
- package/dist/metrics/middleware.js +47 -0
- package/dist/metrics/middleware.js.map +1 -0
- package/dist/metrics/prometheus.d.ts +39 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +115 -0
- package/dist/metrics/prometheus.js.map +1 -0
- package/dist/metrics/registry.d.ts +58 -0
- package/dist/metrics/registry.d.ts.map +1 -0
- package/dist/metrics/registry.js +145 -0
- package/dist/metrics/registry.js.map +1 -0
- package/dist/metrics/reporter.d.ts +21 -0
- package/dist/metrics/reporter.d.ts.map +1 -0
- package/dist/metrics/reporter.js +207 -0
- package/dist/metrics/reporter.js.map +1 -0
- package/dist/metrics/store.d.ts +47 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +209 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/metrics/system.d.ts +20 -0
- package/dist/metrics/system.d.ts.map +1 -0
- package/dist/metrics/system.js +109 -0
- package/dist/metrics/system.js.map +1 -0
- package/dist/metrics/types.d.ts +101 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +6 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/modules/index.d.ts +6 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +6 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/registry.d.ts +36 -0
- package/dist/modules/registry.d.ts.map +1 -0
- package/dist/modules/registry.js +155 -0
- package/dist/modules/registry.js.map +1 -0
- package/dist/modules/types.d.ts +37 -0
- package/dist/modules/types.d.ts.map +1 -0
- package/dist/modules/types.js +9 -0
- package/dist/modules/types.js.map +1 -0
- package/dist/notifications/channel.d.ts +25 -0
- package/dist/notifications/channel.d.ts.map +1 -0
- package/dist/notifications/channel.js +83 -0
- package/dist/notifications/channel.js.map +1 -0
- package/dist/notifications/email.d.ts +27 -0
- package/dist/notifications/email.d.ts.map +1 -0
- package/dist/notifications/email.js +72 -0
- package/dist/notifications/email.js.map +1 -0
- package/dist/notifications/index.d.ts +16 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +12 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/phone.d.ts +16 -0
- package/dist/notifications/phone.d.ts.map +1 -0
- package/dist/notifications/phone.js +48 -0
- package/dist/notifications/phone.js.map +1 -0
- package/dist/notifications/sms.d.ts +26 -0
- package/dist/notifications/sms.d.ts.map +1 -0
- package/dist/notifications/sms.js +65 -0
- package/dist/notifications/sms.js.map +1 -0
- package/dist/notifications/webhook.d.ts +28 -0
- package/dist/notifications/webhook.d.ts.map +1 -0
- package/dist/notifications/webhook.js +65 -0
- package/dist/notifications/webhook.js.map +1 -0
- package/dist/openloop/foldback.d.ts +24 -0
- package/dist/openloop/foldback.d.ts.map +1 -0
- package/dist/openloop/foldback.js +127 -0
- package/dist/openloop/foldback.js.map +1 -0
- package/dist/openloop/index.d.ts +11 -0
- package/dist/openloop/index.d.ts.map +1 -0
- package/dist/openloop/index.js +9 -0
- package/dist/openloop/index.js.map +1 -0
- package/dist/openloop/lifecycle.d.ts +16 -0
- package/dist/openloop/lifecycle.d.ts.map +1 -0
- package/dist/openloop/lifecycle.js +304 -0
- package/dist/openloop/lifecycle.js.map +1 -0
- package/dist/openloop/resolution-scanner.d.ts +17 -0
- package/dist/openloop/resolution-scanner.d.ts.map +1 -0
- package/dist/openloop/resolution-scanner.js +551 -0
- package/dist/openloop/resolution-scanner.js.map +1 -0
- package/dist/openloop/scanner.d.ts +28 -0
- package/dist/openloop/scanner.d.ts.map +1 -0
- package/dist/openloop/scanner.js +587 -0
- package/dist/openloop/scanner.js.map +1 -0
- package/dist/openloop/store.d.ts +41 -0
- package/dist/openloop/store.d.ts.map +1 -0
- package/dist/openloop/store.js +154 -0
- package/dist/openloop/store.js.map +1 -0
- package/dist/openloop/types.d.ts +94 -0
- package/dist/openloop/types.d.ts.map +1 -0
- package/dist/openloop/types.js +6 -0
- package/dist/openloop/types.js.map +1 -0
- package/dist/plugins/google-tasks/index.d.ts +55 -0
- package/dist/plugins/google-tasks/index.d.ts.map +1 -0
- package/dist/plugins/google-tasks/index.js +135 -0
- package/dist/plugins/google-tasks/index.js.map +1 -0
- package/dist/pulse/activation-event.d.ts +66 -0
- package/dist/pulse/activation-event.d.ts.map +1 -0
- package/dist/pulse/activation-event.js +139 -0
- package/dist/pulse/activation-event.js.map +1 -0
- package/dist/pulse/activation-log.d.ts +37 -0
- package/dist/pulse/activation-log.d.ts.map +1 -0
- package/dist/pulse/activation-log.js +101 -0
- package/dist/pulse/activation-log.js.map +1 -0
- package/dist/pulse/index.d.ts +11 -0
- package/dist/pulse/index.d.ts.map +1 -0
- package/dist/pulse/index.js +13 -0
- package/dist/pulse/index.js.map +1 -0
- package/dist/pulse/pressure.d.ts +69 -0
- package/dist/pulse/pressure.d.ts.map +1 -0
- package/dist/pulse/pressure.js +304 -0
- package/dist/pulse/pressure.js.map +1 -0
- package/dist/pulse/types.d.ts +89 -0
- package/dist/pulse/types.d.ts.map +1 -0
- package/dist/pulse/types.js +6 -0
- package/dist/pulse/types.js.map +1 -0
- package/dist/queue/grooming.d.ts +16 -0
- package/dist/queue/grooming.d.ts.map +1 -0
- package/dist/queue/grooming.js +269 -0
- package/dist/queue/grooming.js.map +1 -0
- package/dist/queue/provider.d.ts +50 -0
- package/dist/queue/provider.d.ts.map +1 -0
- package/dist/queue/provider.js +131 -0
- package/dist/queue/provider.js.map +1 -0
- package/dist/queue/store.d.ts +97 -0
- package/dist/queue/store.d.ts.map +1 -0
- package/dist/queue/store.js +448 -0
- package/dist/queue/store.js.map +1 -0
- package/dist/queue/types.d.ts +47 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +22 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/rate-limit.d.ts +26 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +74 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/registry/discovery.d.ts +30 -0
- package/dist/registry/discovery.d.ts.map +1 -0
- package/dist/registry/discovery.js +171 -0
- package/dist/registry/discovery.js.map +1 -0
- package/dist/registry/index.d.ts +14 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +18 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/installer.d.ts +45 -0
- package/dist/registry/installer.d.ts.map +1 -0
- package/dist/registry/installer.js +175 -0
- package/dist/registry/installer.js.map +1 -0
- package/dist/registry/registry.d.ts +70 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +153 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/store.d.ts +69 -0
- package/dist/registry/store.d.ts.map +1 -0
- package/dist/registry/store.js +242 -0
- package/dist/registry/store.js.map +1 -0
- package/dist/registry/types.d.ts +116 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +9 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/validator.d.ts +24 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +203 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/scheduling/index.d.ts +4 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +3 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/store.d.ts +41 -0
- package/dist/scheduling/store.d.ts.map +1 -0
- package/dist/scheduling/store.js +237 -0
- package/dist/scheduling/store.js.map +1 -0
- package/dist/scheduling/timer.d.ts +25 -0
- package/dist/scheduling/timer.d.ts.map +1 -0
- package/dist/scheduling/timer.js +118 -0
- package/dist/scheduling/timer.js.map +1 -0
- package/dist/scheduling/types.d.ts +43 -0
- package/dist/scheduling/types.d.ts.map +1 -0
- package/dist/scheduling/types.js +5 -0
- package/dist/scheduling/types.js.map +1 -0
- package/dist/search/brain-docs.d.ts +20 -0
- package/dist/search/brain-docs.d.ts.map +1 -0
- package/dist/search/brain-docs.js +103 -0
- package/dist/search/brain-docs.js.map +1 -0
- package/dist/search/browse.d.ts +45 -0
- package/dist/search/browse.d.ts.map +1 -0
- package/dist/search/browse.js +225 -0
- package/dist/search/browse.js.map +1 -0
- package/dist/search/classify.d.ts +23 -0
- package/dist/search/classify.d.ts.map +1 -0
- package/dist/search/classify.js +132 -0
- package/dist/search/classify.js.map +1 -0
- package/dist/search/client.d.ts +32 -0
- package/dist/search/client.d.ts.map +1 -0
- package/dist/search/client.js +72 -0
- package/dist/search/client.js.map +1 -0
- package/dist/search/perplexity.d.ts +13 -0
- package/dist/search/perplexity.d.ts.map +1 -0
- package/dist/search/perplexity.js +41 -0
- package/dist/search/perplexity.js.map +1 -0
- package/dist/search/sidecar.d.ts +20 -0
- package/dist/search/sidecar.d.ts.map +1 -0
- package/dist/search/sidecar.js +103 -0
- package/dist/search/sidecar.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +4851 -0
- package/dist/server.js.map +1 -0
- package/dist/services/backlogReview.d.ts +66 -0
- package/dist/services/backlogReview.d.ts.map +1 -0
- package/dist/services/backlogReview.js +285 -0
- package/dist/services/backlogReview.js.map +1 -0
- package/dist/services/backup.d.ts +43 -0
- package/dist/services/backup.d.ts.map +1 -0
- package/dist/services/backup.js +334 -0
- package/dist/services/backup.js.map +1 -0
- package/dist/services/credit-monitor.d.ts +40 -0
- package/dist/services/credit-monitor.d.ts.map +1 -0
- package/dist/services/credit-monitor.js +147 -0
- package/dist/services/credit-monitor.js.map +1 -0
- package/dist/services/morningBriefing.d.ts +125 -0
- package/dist/services/morningBriefing.d.ts.map +1 -0
- package/dist/services/morningBriefing.js +660 -0
- package/dist/services/morningBriefing.js.map +1 -0
- package/dist/services/routine-patterns.d.ts +21 -0
- package/dist/services/routine-patterns.d.ts.map +1 -0
- package/dist/services/routine-patterns.js +46 -0
- package/dist/services/routine-patterns.js.map +1 -0
- package/dist/services/traceInsights.d.ts +53 -0
- package/dist/services/traceInsights.d.ts.map +1 -0
- package/dist/services/traceInsights.js +762 -0
- package/dist/services/traceInsights.js.map +1 -0
- package/dist/services/training.d.ts +63 -0
- package/dist/services/training.d.ts.map +1 -0
- package/dist/services/training.js +697 -0
- package/dist/services/training.js.map +1 -0
- package/dist/services/whatsapp.d.ts +45 -0
- package/dist/services/whatsapp.d.ts.map +1 -0
- package/dist/services/whatsapp.js +194 -0
- package/dist/services/whatsapp.js.map +1 -0
- package/dist/sessions/store.d.ts +21 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +47 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/settings.d.ts +111 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +256 -0
- package/dist/settings.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +11 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +22 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +65 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +161 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +664 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +31 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validator.d.ts +36 -0
- package/dist/skills/validator.d.ts.map +1 -0
- package/dist/skills/validator.js +114 -0
- package/dist/skills/validator.js.map +1 -0
- package/dist/slack/channels.d.ts +102 -0
- package/dist/slack/channels.d.ts.map +1 -0
- package/dist/slack/channels.js +277 -0
- package/dist/slack/channels.js.map +1 -0
- package/dist/slack/client.d.ts +151 -0
- package/dist/slack/client.d.ts.map +1 -0
- package/dist/slack/client.js +468 -0
- package/dist/slack/client.js.map +1 -0
- package/dist/slack/retry.d.ts +36 -0
- package/dist/slack/retry.d.ts.map +1 -0
- package/dist/slack/retry.js +100 -0
- package/dist/slack/retry.js.map +1 -0
- package/dist/slack/types.d.ts +271 -0
- package/dist/slack/types.d.ts.map +1 -0
- package/dist/slack/types.js +52 -0
- package/dist/slack/types.js.map +1 -0
- package/dist/slack/webhooks.d.ts +55 -0
- package/dist/slack/webhooks.d.ts.map +1 -0
- package/dist/slack/webhooks.js +285 -0
- package/dist/slack/webhooks.js.map +1 -0
- package/dist/stt/client.d.ts +18 -0
- package/dist/stt/client.d.ts.map +1 -0
- package/dist/stt/client.js +66 -0
- package/dist/stt/client.js.map +1 -0
- package/dist/stt/sidecar.d.ts +16 -0
- package/dist/stt/sidecar.d.ts.map +1 -0
- package/dist/stt/sidecar.js +115 -0
- package/dist/stt/sidecar.js.map +1 -0
- package/dist/tracing/bridge.d.ts +14 -0
- package/dist/tracing/bridge.d.ts.map +1 -0
- package/dist/tracing/bridge.js +70 -0
- package/dist/tracing/bridge.js.map +1 -0
- package/dist/tracing/correlation.d.ts +34 -0
- package/dist/tracing/correlation.d.ts.map +1 -0
- package/dist/tracing/correlation.js +49 -0
- package/dist/tracing/correlation.js.map +1 -0
- package/dist/tracing/index.d.ts +15 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +18 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/init.d.ts +42 -0
- package/dist/tracing/init.d.ts.map +1 -0
- package/dist/tracing/init.js +81 -0
- package/dist/tracing/init.js.map +1 -0
- package/dist/tracing/instrument.d.ts +39 -0
- package/dist/tracing/instrument.d.ts.map +1 -0
- package/dist/tracing/instrument.js +145 -0
- package/dist/tracing/instrument.js.map +1 -0
- package/dist/tracing/middleware.d.ts +18 -0
- package/dist/tracing/middleware.d.ts.map +1 -0
- package/dist/tracing/middleware.js +69 -0
- package/dist/tracing/middleware.js.map +1 -0
- package/dist/tracing/tracer.d.ts +105 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +327 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tts/client.d.ts +18 -0
- package/dist/tts/client.d.ts.map +1 -0
- package/dist/tts/client.js +48 -0
- package/dist/tts/client.js.map +1 -0
- package/dist/tts/sidecar.d.ts +16 -0
- package/dist/tts/sidecar.d.ts.map +1 -0
- package/dist/tts/sidecar.js +148 -0
- package/dist/tts/sidecar.js.map +1 -0
- package/dist/twilio/call.d.ts +22 -0
- package/dist/twilio/call.d.ts.map +1 -0
- package/dist/twilio/call.js +79 -0
- package/dist/twilio/call.js.map +1 -0
- package/dist/types/plugin.d.ts +342 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +10 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +53 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +169 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/vault/matcher.d.ts +39 -0
- package/dist/vault/matcher.d.ts.map +1 -0
- package/dist/vault/matcher.js +197 -0
- package/dist/vault/matcher.js.map +1 -0
- package/dist/vault/personal.d.ts +60 -0
- package/dist/vault/personal.d.ts.map +1 -0
- package/dist/vault/personal.js +162 -0
- package/dist/vault/personal.js.map +1 -0
- package/dist/vault/store.d.ts +39 -0
- package/dist/vault/store.d.ts.map +1 -0
- package/dist/vault/store.js +111 -0
- package/dist/vault/store.js.map +1 -0
- package/dist/webhooks/config.d.ts +64 -0
- package/dist/webhooks/config.d.ts.map +1 -0
- package/dist/webhooks/config.js +214 -0
- package/dist/webhooks/config.js.map +1 -0
- package/dist/webhooks/event-log.d.ts +90 -0
- package/dist/webhooks/event-log.d.ts.map +1 -0
- package/dist/webhooks/event-log.js +132 -0
- package/dist/webhooks/event-log.js.map +1 -0
- package/dist/webhooks/handler.d.ts +92 -0
- package/dist/webhooks/handler.d.ts.map +1 -0
- package/dist/webhooks/handler.js +103 -0
- package/dist/webhooks/handler.js.map +1 -0
- package/dist/webhooks/handlers.d.ts +100 -0
- package/dist/webhooks/handlers.d.ts.map +1 -0
- package/dist/webhooks/handlers.js +178 -0
- package/dist/webhooks/handlers.js.map +1 -0
- package/dist/webhooks/index.d.ts +29 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +33 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/mount.d.ts +77 -0
- package/dist/webhooks/mount.d.ts.map +1 -0
- package/dist/webhooks/mount.js +400 -0
- package/dist/webhooks/mount.js.map +1 -0
- package/dist/webhooks/registry.d.ts +52 -0
- package/dist/webhooks/registry.d.ts.map +1 -0
- package/dist/webhooks/registry.js +143 -0
- package/dist/webhooks/registry.js.map +1 -0
- package/dist/webhooks/relay.d.ts +25 -0
- package/dist/webhooks/relay.d.ts.map +1 -0
- package/dist/webhooks/relay.js +53 -0
- package/dist/webhooks/relay.js.map +1 -0
- package/dist/webhooks/retry.d.ts +92 -0
- package/dist/webhooks/retry.d.ts.map +1 -0
- package/dist/webhooks/retry.js +270 -0
- package/dist/webhooks/retry.js.map +1 -0
- package/dist/webhooks/router.d.ts +94 -0
- package/dist/webhooks/router.d.ts.map +1 -0
- package/dist/webhooks/router.js +290 -0
- package/dist/webhooks/router.js.map +1 -0
- package/dist/webhooks/twilio.d.ts +63 -0
- package/dist/webhooks/twilio.d.ts.map +1 -0
- package/dist/webhooks/twilio.js +129 -0
- package/dist/webhooks/twilio.js.map +1 -0
- package/dist/webhooks/types.d.ts +142 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +8 -0
- package/dist/webhooks/types.js.map +1 -0
- package/dist/webhooks/verify.d.ts +51 -0
- package/dist/webhooks/verify.d.ts.map +1 -0
- package/dist/webhooks/verify.js +98 -0
- package/dist/webhooks/verify.js.map +1 -0
- package/package.json +70 -0
- package/public/board.html +1316 -0
- package/public/browser.html +600 -0
- package/public/help.html +655 -0
- package/public/index.html +4689 -0
- package/public/library.html +3642 -0
- package/public/observatory.html +1693 -0
- package/public/ops.html +1129 -0
- package/public/share-modal.js +211 -0
- package/skills/README.md +34 -0
- package/skills/core-architecture.md +33 -0
- package/skills/form-fill.md +98 -0
- package/skills/form-review.md +110 -0
- package/skills/form-scout.md +94 -0
- package/skills/log-decision.md +27 -0
- package/skills/onboard.md +98 -0
- package/skills/voice-guide.md +22 -0
- package/skills/write-blog.md +43 -0
|
@@ -0,0 +1,762 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Correlation Engine — background service that watches the activity stream,
|
|
3
|
+
* builds trace chains, and uses the LLM to discover patterns and insights.
|
|
4
|
+
*
|
|
5
|
+
* Follows the established service pattern (morningBriefing.ts / backlogReview.ts):
|
|
6
|
+
* module-level state, idempotent start/stop, timer-driven.
|
|
7
|
+
*/
|
|
8
|
+
import { randomBytes } from "node:crypto";
|
|
9
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { getInstanceName } from "../instance.js";
|
|
12
|
+
import { getActivities, getActivitiesByTraceIds, logActivity } from "../activity/log.js";
|
|
13
|
+
import { completeChat } from "../llm/complete.js";
|
|
14
|
+
import { resolveProvider, resolveUtilityModel } from "../settings.js";
|
|
15
|
+
import { createLogger } from "../utils/logger.js";
|
|
16
|
+
import { getBoardProvider } from "../board/provider.js";
|
|
17
|
+
import { filterRoutine } from "./routine-patterns.js";
|
|
18
|
+
import { recordRoutineFiltered, recordResolvedFiltered, recordAnalysisThroughput } from "../metrics/firewall-metrics.js";
|
|
19
|
+
import { readBrainLines, appendBrainLine, writeBrainLines, ensureBrainJsonl } from "../lib/brain-io.js";
|
|
20
|
+
import { emitCdt } from "../pulse/activation-event.js";
|
|
21
|
+
const log = createLogger("trace-insights");
|
|
22
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
23
|
+
const ANALYSIS_INTERVAL_MS = 10 * 60 * 1000; // 10 min
|
|
24
|
+
const FIRST_RUN_DELAY_MS = 2 * 60 * 1000; // 2 min (let activity accumulate)
|
|
25
|
+
const MAX_INSIGHTS = 50; // FIFO eviction
|
|
26
|
+
const CLUSTER_WINDOW_MS = 5 * 60 * 1000; // 5 min temporal window
|
|
27
|
+
const MIN_CLUSTER_SIZE = 2;
|
|
28
|
+
const MAX_ENTRIES_PER_ANALYSIS = 100;
|
|
29
|
+
// ─── Escalation config ──────────────────────────────────────────────────────
|
|
30
|
+
/** Categories eligible for auto-escalation to the board. */
|
|
31
|
+
const ESCALATION_CATEGORIES = ["bottleneck", "anomaly"];
|
|
32
|
+
/** Only escalate high-confidence insights. */
|
|
33
|
+
const ESCALATION_MIN_CONFIDENCE = "high";
|
|
34
|
+
/** Track recently escalated titles to prevent duplicate board items. */
|
|
35
|
+
const escalatedTitles = new Set();
|
|
36
|
+
/**
|
|
37
|
+
* Cooldown tracker: maps insight title → timestamp of last escalation.
|
|
38
|
+
* Prevents re-escalating the same pattern within ESCALATION_COOLDOWN_MS.
|
|
39
|
+
*/
|
|
40
|
+
const escalationCooldowns = new Map();
|
|
41
|
+
const ESCALATION_COOLDOWN_MS = 6 * 60 * 60 * 1000; // 6h per pattern
|
|
42
|
+
/** Max activity entries to include in a triage LLM call. */
|
|
43
|
+
const TRIAGE_MAX_ENTRIES = 15;
|
|
44
|
+
/**
|
|
45
|
+
* Patterns from done/cancelled board items — permanently suppressed from re-analysis.
|
|
46
|
+
* Populated from board queries during escalation and at startup.
|
|
47
|
+
*/
|
|
48
|
+
const resolvedPatterns = new Set();
|
|
49
|
+
// ─── State ──────────────────────────────────────────────────────────────────
|
|
50
|
+
let timer = null;
|
|
51
|
+
let firstRunTimer = null;
|
|
52
|
+
let lastAnalysisId = 0;
|
|
53
|
+
let insights = [];
|
|
54
|
+
let lastRun = null;
|
|
55
|
+
// ─── Persistence ─────────────────────────────────────────────────────────────
|
|
56
|
+
const BRAIN_DIR = join(process.cwd(), "brain");
|
|
57
|
+
const INSIGHTS_FILE = join(BRAIN_DIR, "operations", "insights.jsonl");
|
|
58
|
+
const INSIGHTS_SCHEMA = JSON.stringify({ _schema: "insights", _version: "1.0" });
|
|
59
|
+
const WATERMARK_FILE = join(BRAIN_DIR, "operations", ".insights-watermark");
|
|
60
|
+
/** Load the analysis watermark so we don't re-analyze old entries on restart. */
|
|
61
|
+
function loadWatermark() {
|
|
62
|
+
try {
|
|
63
|
+
const raw = readFileSync(WATERMARK_FILE, "utf-8").trim();
|
|
64
|
+
const n = parseInt(raw, 10);
|
|
65
|
+
return Number.isFinite(n) && n > 0 ? n : 0;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Persist the analysis watermark to disk. */
|
|
72
|
+
function persistWatermark(id) {
|
|
73
|
+
try {
|
|
74
|
+
writeFileSync(WATERMARK_FILE, String(id), "utf-8");
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
log.debug("Failed to persist insights watermark");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Load persisted insights from disk on startup. */
|
|
81
|
+
async function loadInsights() {
|
|
82
|
+
try {
|
|
83
|
+
await ensureBrainJsonl(INSIGHTS_FILE, INSIGHTS_SCHEMA);
|
|
84
|
+
const lines = await readBrainLines(INSIGHTS_FILE);
|
|
85
|
+
const loaded = [];
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
try {
|
|
88
|
+
const obj = JSON.parse(line);
|
|
89
|
+
if (obj._schema)
|
|
90
|
+
continue;
|
|
91
|
+
if (obj.id && obj.title)
|
|
92
|
+
loaded.push(obj);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Keep only the latest MAX_INSIGHTS
|
|
99
|
+
insights = loaded.length > MAX_INSIGHTS
|
|
100
|
+
? loaded.slice(loaded.length - MAX_INSIGHTS)
|
|
101
|
+
: loaded;
|
|
102
|
+
log.info(`Loaded ${insights.length} persisted insight(s)`);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
log.debug(`Could not load insights: ${err instanceof Error ? err.message : String(err)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Append new insights to the JSONL file. */
|
|
109
|
+
async function persistInsights(newInsights) {
|
|
110
|
+
for (const ins of newInsights) {
|
|
111
|
+
await appendBrainLine(INSIGHTS_FILE, JSON.stringify(ins));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Compact insights file to only keep the latest MAX_INSIGHTS. */
|
|
115
|
+
async function compactInsights() {
|
|
116
|
+
const lines = [INSIGHTS_SCHEMA, ...insights.map((i) => JSON.stringify(i))];
|
|
117
|
+
await writeBrainLines(INSIGHTS_FILE, lines);
|
|
118
|
+
log.debug(`Insights compacted to ${insights.length} entries`);
|
|
119
|
+
}
|
|
120
|
+
// ─── Source affinity groups for temporal clustering ─────────────────────────
|
|
121
|
+
const SOURCE_AFFINITY = {
|
|
122
|
+
autonomous: "agent-lifecycle",
|
|
123
|
+
agent: "agent-lifecycle",
|
|
124
|
+
system: "agent-lifecycle",
|
|
125
|
+
"goal-loop": "goal-work",
|
|
126
|
+
gmail: "google-sync",
|
|
127
|
+
calendar: "google-sync",
|
|
128
|
+
google: "google-sync",
|
|
129
|
+
tasks: "google-sync",
|
|
130
|
+
slack: "messaging",
|
|
131
|
+
whatsapp: "messaging",
|
|
132
|
+
"open-loop": "open-loop",
|
|
133
|
+
};
|
|
134
|
+
// ─── Chain building ─────────────────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Build trace chains from activity entries using two strategies:
|
|
137
|
+
* 1. Backref linking (union-find style)
|
|
138
|
+
* 2. Temporal-source clustering (fallback for entries without backrefs)
|
|
139
|
+
*/
|
|
140
|
+
export function buildTraceChains(entries) {
|
|
141
|
+
const chains = [];
|
|
142
|
+
// --- Strategy 1: Backref linking ---
|
|
143
|
+
const byTraceId = new Map();
|
|
144
|
+
for (const e of entries) {
|
|
145
|
+
byTraceId.set(e.traceId, e);
|
|
146
|
+
}
|
|
147
|
+
// Union-find: map each traceId to its root
|
|
148
|
+
const parent = new Map();
|
|
149
|
+
function find(id) {
|
|
150
|
+
let root = id;
|
|
151
|
+
while (parent.has(root) && parent.get(root) !== root) {
|
|
152
|
+
root = parent.get(root);
|
|
153
|
+
}
|
|
154
|
+
// Path compression
|
|
155
|
+
let cur = id;
|
|
156
|
+
while (cur !== root) {
|
|
157
|
+
const next = parent.get(cur);
|
|
158
|
+
parent.set(cur, root);
|
|
159
|
+
cur = next;
|
|
160
|
+
}
|
|
161
|
+
return root;
|
|
162
|
+
}
|
|
163
|
+
function union(a, b) {
|
|
164
|
+
const ra = find(a);
|
|
165
|
+
const rb = find(b);
|
|
166
|
+
if (ra !== rb)
|
|
167
|
+
parent.set(ra, rb);
|
|
168
|
+
}
|
|
169
|
+
// Initialize each entry as its own root
|
|
170
|
+
for (const e of entries) {
|
|
171
|
+
parent.set(e.traceId, e.traceId);
|
|
172
|
+
}
|
|
173
|
+
// Link entries via backrefs
|
|
174
|
+
const linkedTraceIds = new Set();
|
|
175
|
+
for (const e of entries) {
|
|
176
|
+
if (e.backref && byTraceId.has(e.backref)) {
|
|
177
|
+
union(e.traceId, e.backref);
|
|
178
|
+
linkedTraceIds.add(e.traceId);
|
|
179
|
+
linkedTraceIds.add(e.backref);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Group linked entries by root
|
|
183
|
+
const groups = new Map();
|
|
184
|
+
for (const e of entries) {
|
|
185
|
+
if (!linkedTraceIds.has(e.traceId))
|
|
186
|
+
continue;
|
|
187
|
+
const root = find(e.traceId);
|
|
188
|
+
if (!groups.has(root))
|
|
189
|
+
groups.set(root, []);
|
|
190
|
+
groups.get(root).push(e);
|
|
191
|
+
}
|
|
192
|
+
for (const [rootId, groupEntries] of groups) {
|
|
193
|
+
if (groupEntries.length < 2)
|
|
194
|
+
continue;
|
|
195
|
+
groupEntries.sort((a, b) => a.id - b.id);
|
|
196
|
+
const timestamps = groupEntries.map((e) => new Date(e.timestamp).getTime());
|
|
197
|
+
const sources = [...new Set(groupEntries.map((e) => e.source))];
|
|
198
|
+
chains.push({
|
|
199
|
+
rootTraceId: rootId,
|
|
200
|
+
linkType: "backref",
|
|
201
|
+
entries: groupEntries,
|
|
202
|
+
sources,
|
|
203
|
+
spanMs: Math.max(...timestamps) - Math.min(...timestamps),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// --- Strategy 2: Temporal-source clustering ---
|
|
207
|
+
const unlinked = entries.filter((e) => !linkedTraceIds.has(e.traceId));
|
|
208
|
+
if (unlinked.length >= MIN_CLUSTER_SIZE) {
|
|
209
|
+
const sorted = [...unlinked].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
210
|
+
let clusterStart = 0;
|
|
211
|
+
while (clusterStart < sorted.length) {
|
|
212
|
+
const windowEnd = new Date(sorted[clusterStart].timestamp).getTime() + CLUSTER_WINDOW_MS;
|
|
213
|
+
let clusterEnd = clusterStart;
|
|
214
|
+
// Expand window
|
|
215
|
+
while (clusterEnd + 1 < sorted.length &&
|
|
216
|
+
new Date(sorted[clusterEnd + 1].timestamp).getTime() <= windowEnd) {
|
|
217
|
+
clusterEnd++;
|
|
218
|
+
}
|
|
219
|
+
const window = sorted.slice(clusterStart, clusterEnd + 1);
|
|
220
|
+
// Sub-cluster by source affinity
|
|
221
|
+
const affinityGroups = new Map();
|
|
222
|
+
for (const e of window) {
|
|
223
|
+
const group = SOURCE_AFFINITY[e.source] ?? e.source;
|
|
224
|
+
if (!affinityGroups.has(group))
|
|
225
|
+
affinityGroups.set(group, []);
|
|
226
|
+
affinityGroups.get(group).push(e);
|
|
227
|
+
}
|
|
228
|
+
for (const [, groupEntries] of affinityGroups) {
|
|
229
|
+
if (groupEntries.length < MIN_CLUSTER_SIZE)
|
|
230
|
+
continue;
|
|
231
|
+
const timestamps = groupEntries.map((e) => new Date(e.timestamp).getTime());
|
|
232
|
+
const sources = [...new Set(groupEntries.map((e) => e.source))];
|
|
233
|
+
chains.push({
|
|
234
|
+
rootTraceId: groupEntries[0].traceId,
|
|
235
|
+
linkType: "temporal-cluster",
|
|
236
|
+
entries: groupEntries,
|
|
237
|
+
sources,
|
|
238
|
+
spanMs: Math.max(...timestamps) - Math.min(...timestamps),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
clusterStart = clusterEnd + 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return chains;
|
|
245
|
+
}
|
|
246
|
+
// ─── LLM analysis ───────────────────────────────────────────────────────────
|
|
247
|
+
function getAnalystSystemPrompt() {
|
|
248
|
+
return `You are an activity pattern analyst for ${getInstanceName()}, a personal AI operating system.
|
|
249
|
+
You receive trace chains — groups of related activity entries linked by trace IDs or temporal proximity.
|
|
250
|
+
|
|
251
|
+
Analyze these chains and report 0-5 insights. Each insight should be one of:
|
|
252
|
+
- "pattern": A recurring behavior or cycle (e.g., "Agent GC runs every minute")
|
|
253
|
+
- "anomaly": Something unusual or unexpected
|
|
254
|
+
- "correlation": Two seemingly unrelated activities that co-occur
|
|
255
|
+
- "bottleneck": A chain that takes unusually long or has repeated retries
|
|
256
|
+
|
|
257
|
+
Respond with ONLY a JSON array of insight objects. If no interesting patterns exist, return [].
|
|
258
|
+
|
|
259
|
+
Each object: { "category": "pattern"|"anomaly"|"correlation"|"bottleneck", "title": "short title", "description": "1-2 sentences", "relatedTraceIds": ["id1","id2"], "confidence": "high"|"medium"|"low" }`;
|
|
260
|
+
}
|
|
261
|
+
async function analyzeChains(chains) {
|
|
262
|
+
// Serialize chains for the LLM
|
|
263
|
+
const serialized = chains.map((c) => ({
|
|
264
|
+
rootTraceId: c.rootTraceId,
|
|
265
|
+
linkType: c.linkType,
|
|
266
|
+
sources: c.sources,
|
|
267
|
+
spanMs: c.spanMs,
|
|
268
|
+
entries: c.entries.map((e) => ({
|
|
269
|
+
timestamp: e.timestamp,
|
|
270
|
+
source: e.source,
|
|
271
|
+
summary: e.summary,
|
|
272
|
+
traceId: e.traceId,
|
|
273
|
+
backref: e.backref ?? null,
|
|
274
|
+
})),
|
|
275
|
+
}));
|
|
276
|
+
const provider = resolveProvider();
|
|
277
|
+
const model = resolveUtilityModel();
|
|
278
|
+
const response = await completeChat({
|
|
279
|
+
messages: [
|
|
280
|
+
{ role: "system", content: getAnalystSystemPrompt() },
|
|
281
|
+
{ role: "user", content: JSON.stringify(serialized, null, 2) },
|
|
282
|
+
],
|
|
283
|
+
model,
|
|
284
|
+
provider,
|
|
285
|
+
});
|
|
286
|
+
// Parse JSON array from response (handle markdown fences)
|
|
287
|
+
let jsonStr = response.trim();
|
|
288
|
+
const fenceMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
289
|
+
if (fenceMatch)
|
|
290
|
+
jsonStr = fenceMatch[1].trim();
|
|
291
|
+
const arrayMatch = jsonStr.match(/\[[\s\S]*\]/);
|
|
292
|
+
if (!arrayMatch)
|
|
293
|
+
return [];
|
|
294
|
+
try {
|
|
295
|
+
const parsed = JSON.parse(arrayMatch[0]);
|
|
296
|
+
if (!Array.isArray(parsed))
|
|
297
|
+
return [];
|
|
298
|
+
const now = new Date().toISOString();
|
|
299
|
+
return parsed
|
|
300
|
+
.filter((p) => p.category && p.title && p.description && p.relatedTraceIds)
|
|
301
|
+
.map((p) => ({
|
|
302
|
+
id: "ins_" + randomBytes(4).toString("hex"),
|
|
303
|
+
discoveredAt: now,
|
|
304
|
+
category: p.category,
|
|
305
|
+
title: p.title,
|
|
306
|
+
description: p.description,
|
|
307
|
+
relatedTraceIds: Array.isArray(p.relatedTraceIds) ? p.relatedTraceIds : [],
|
|
308
|
+
confidence: p.confidence ?? "medium",
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
log.warn("Failed to parse LLM insight response");
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// ─── Pre-analysis filters ────────────────────────────────────────────────────
|
|
317
|
+
/**
|
|
318
|
+
* Filter out activity entries whose summaries match patterns from
|
|
319
|
+
* done/cancelled board items. Saves the LLM call for known-solved issues.
|
|
320
|
+
*/
|
|
321
|
+
function filterResolvedPatterns(entries) {
|
|
322
|
+
if (resolvedPatterns.size === 0)
|
|
323
|
+
return entries;
|
|
324
|
+
return entries.filter((e) => {
|
|
325
|
+
const lower = e.summary.toLowerCase();
|
|
326
|
+
for (const pattern of resolvedPatterns) {
|
|
327
|
+
if (lower.includes(pattern))
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
return true;
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// ─── Core analysis run ──────────────────────────────────────────────────────
|
|
334
|
+
async function runAnalysis() {
|
|
335
|
+
const rawEntries = (await getActivities(lastAnalysisId)).slice(0, MAX_ENTRIES_PER_ANALYSIS);
|
|
336
|
+
if (rawEntries.length < 3) {
|
|
337
|
+
log.info(`Only ${rawEntries.length} new entries — skipping analysis`);
|
|
338
|
+
const summary = {
|
|
339
|
+
ranAt: new Date().toISOString(),
|
|
340
|
+
chainsAnalyzed: 0,
|
|
341
|
+
entriesAnalyzed: rawEntries.length,
|
|
342
|
+
newInsights: 0,
|
|
343
|
+
};
|
|
344
|
+
lastRun = summary;
|
|
345
|
+
return summary;
|
|
346
|
+
}
|
|
347
|
+
// Update watermark from raw (not filtered) to avoid re-analyzing filtered entries
|
|
348
|
+
const rawWatermark = rawEntries[rawEntries.length - 1].id;
|
|
349
|
+
// ── Filter pipeline (cheap string ops before expensive LLM call) ──
|
|
350
|
+
// Component 3: Routine Activity Classifier — skip Instance GC, health checks, etc.
|
|
351
|
+
const { kept: afterRoutine, filtered: routineCount } = filterRoutine(rawEntries);
|
|
352
|
+
if (routineCount > 0) {
|
|
353
|
+
log.debug(`Filtered ${routineCount} routine entries from analysis`);
|
|
354
|
+
recordRoutineFiltered(routineCount);
|
|
355
|
+
}
|
|
356
|
+
// Component 2: Resolved-pattern filter — skip patterns from done/cancelled board items
|
|
357
|
+
const newEntries = filterResolvedPatterns(afterRoutine);
|
|
358
|
+
const resolvedCount = afterRoutine.length - newEntries.length;
|
|
359
|
+
if (resolvedCount > 0) {
|
|
360
|
+
recordResolvedFiltered(resolvedCount);
|
|
361
|
+
}
|
|
362
|
+
// Record analysis pipeline throughput
|
|
363
|
+
recordAnalysisThroughput(rawEntries.length, newEntries.length);
|
|
364
|
+
if (newEntries.length < 3) {
|
|
365
|
+
log.info(`Only ${newEntries.length} entries after filtering (${routineCount} routine, ${resolvedCount} resolved) — skipping analysis`);
|
|
366
|
+
lastAnalysisId = rawWatermark;
|
|
367
|
+
persistWatermark(rawWatermark);
|
|
368
|
+
const summary = {
|
|
369
|
+
ranAt: new Date().toISOString(),
|
|
370
|
+
chainsAnalyzed: 0,
|
|
371
|
+
entriesAnalyzed: newEntries.length,
|
|
372
|
+
newInsights: 0,
|
|
373
|
+
};
|
|
374
|
+
lastRun = summary;
|
|
375
|
+
return summary;
|
|
376
|
+
}
|
|
377
|
+
log.info(`Analyzing ${newEntries.length} entries (filtered ${rawEntries.length - newEntries.length} of ${rawEntries.length} raw)...`);
|
|
378
|
+
const chains = buildTraceChains(newEntries);
|
|
379
|
+
if (chains.length === 0) {
|
|
380
|
+
log.info("No trace chains found — skipping LLM call");
|
|
381
|
+
// Still update watermark so we don't re-analyze these
|
|
382
|
+
lastAnalysisId = rawWatermark;
|
|
383
|
+
persistWatermark(rawWatermark);
|
|
384
|
+
const summary = {
|
|
385
|
+
ranAt: new Date().toISOString(),
|
|
386
|
+
chainsAnalyzed: 0,
|
|
387
|
+
entriesAnalyzed: newEntries.length,
|
|
388
|
+
newInsights: 0,
|
|
389
|
+
};
|
|
390
|
+
lastRun = summary;
|
|
391
|
+
return summary;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
const newInsights = await analyzeChains(chains);
|
|
395
|
+
// Append insights (FIFO eviction at MAX_INSIGHTS) + persist to disk
|
|
396
|
+
insights.push(...newInsights);
|
|
397
|
+
if (newInsights.length > 0) {
|
|
398
|
+
persistInsights(newInsights).catch((err) => {
|
|
399
|
+
log.debug(`Insight persist failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
if (insights.length > MAX_INSIGHTS) {
|
|
403
|
+
insights = insights.slice(insights.length - MAX_INSIGHTS);
|
|
404
|
+
// Compact file after eviction to keep it trimmed
|
|
405
|
+
compactInsights().catch((err) => {
|
|
406
|
+
log.debug(`Insight compact failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
// Update watermark (use raw to skip filtered entries too)
|
|
410
|
+
lastAnalysisId = rawWatermark;
|
|
411
|
+
persistWatermark(rawWatermark);
|
|
412
|
+
const summary = {
|
|
413
|
+
ranAt: new Date().toISOString(),
|
|
414
|
+
chainsAnalyzed: chains.length,
|
|
415
|
+
entriesAnalyzed: newEntries.length,
|
|
416
|
+
newInsights: newInsights.length,
|
|
417
|
+
};
|
|
418
|
+
lastRun = summary;
|
|
419
|
+
log.info(`Analysis complete: ${chains.length} chains, ${newInsights.length} new insights`);
|
|
420
|
+
if (newInsights.length > 0) {
|
|
421
|
+
const titles = newInsights.map((i) => i.title).join("; ");
|
|
422
|
+
logActivity({
|
|
423
|
+
source: "system",
|
|
424
|
+
summary: `Trace insights: ${newInsights.length} discovered — ${titles}`,
|
|
425
|
+
});
|
|
426
|
+
// Escalate actionable insights to the board
|
|
427
|
+
escalateInsights(newInsights).catch((err) => {
|
|
428
|
+
log.warn(`Insight escalation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
return summary;
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
435
|
+
log.error(`Analysis failed: ${msg}`);
|
|
436
|
+
logActivity({ source: "system", summary: `Trace insight analysis failed: ${msg}` });
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// ─── Insight triage ──────────────────────────────────────────────────────────
|
|
441
|
+
function getTriageSystemPrompt() {
|
|
442
|
+
return `You are a triage analyst for ${getInstanceName()}, a file-based personal AI operating system.
|
|
443
|
+
|
|
444
|
+
You receive an insight (a bottleneck or anomaly detected by the trace correlation engine) along with the related activity entries that triggered it.
|
|
445
|
+
|
|
446
|
+
Your job: convert this vague observation into a concrete, actionable task spec that an autonomous agent can execute.
|
|
447
|
+
|
|
448
|
+
Respond with ONLY a JSON object (no markdown fences, no extra text):
|
|
449
|
+
{
|
|
450
|
+
"problem": "1-2 sentence summary of what's wrong",
|
|
451
|
+
"investigationSteps": ["step 1", "step 2", ...],
|
|
452
|
+
"filesToCheck": [{"path": "src/...", "reason": "why this file matters"}],
|
|
453
|
+
"acceptanceCriteria": ["criterion 1", "criterion 2", ...],
|
|
454
|
+
"rootCauseHypothesis": "best guess based on the activity data"
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
Rules:
|
|
458
|
+
- Reference actual ${getInstanceName()} file paths (src/, brain/) — be specific
|
|
459
|
+
- Investigation steps should be concrete actions (read file X, check metric Y, compare timestamps)
|
|
460
|
+
- Acceptance criteria must be verifiable (not "works better" but "response time < 5s")
|
|
461
|
+
- Keep total output under 500 words`;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Use the LLM to convert a vague insight into a concrete task spec.
|
|
465
|
+
* Returns an enriched markdown description, or null on any failure.
|
|
466
|
+
*/
|
|
467
|
+
async function triageInsightForEscalation(insight) {
|
|
468
|
+
try {
|
|
469
|
+
// Fetch related activity entries
|
|
470
|
+
const relatedEntries = await getActivitiesByTraceIds(insight.relatedTraceIds);
|
|
471
|
+
const capped = relatedEntries.slice(0, TRIAGE_MAX_ENTRIES);
|
|
472
|
+
const slimEntries = capped.map((e) => ({
|
|
473
|
+
timestamp: e.timestamp,
|
|
474
|
+
source: e.source,
|
|
475
|
+
summary: e.summary,
|
|
476
|
+
traceId: e.traceId,
|
|
477
|
+
}));
|
|
478
|
+
const payload = {
|
|
479
|
+
insight: {
|
|
480
|
+
category: insight.category,
|
|
481
|
+
title: insight.title,
|
|
482
|
+
description: insight.description,
|
|
483
|
+
confidence: insight.confidence,
|
|
484
|
+
discoveredAt: insight.discoveredAt,
|
|
485
|
+
},
|
|
486
|
+
relatedActivity: slimEntries,
|
|
487
|
+
};
|
|
488
|
+
const provider = resolveProvider();
|
|
489
|
+
const model = resolveUtilityModel();
|
|
490
|
+
const response = await completeChat({
|
|
491
|
+
messages: [
|
|
492
|
+
{ role: "system", content: getTriageSystemPrompt() },
|
|
493
|
+
{ role: "user", content: JSON.stringify(payload, null, 2) },
|
|
494
|
+
],
|
|
495
|
+
model,
|
|
496
|
+
provider,
|
|
497
|
+
noCache: true,
|
|
498
|
+
});
|
|
499
|
+
// Parse JSON from response (handle markdown fences)
|
|
500
|
+
let jsonStr = response.trim();
|
|
501
|
+
const fenceMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
502
|
+
if (fenceMatch)
|
|
503
|
+
jsonStr = fenceMatch[1].trim();
|
|
504
|
+
const objMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
505
|
+
if (!objMatch) {
|
|
506
|
+
log.warn("Triage response contained no JSON object");
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
const parsed = JSON.parse(objMatch[0]);
|
|
510
|
+
if (!parsed.problem || !parsed.investigationSteps) {
|
|
511
|
+
log.warn("Triage response missing required fields");
|
|
512
|
+
return null;
|
|
513
|
+
}
|
|
514
|
+
// Format as markdown
|
|
515
|
+
const sections = [
|
|
516
|
+
`**Problem:** ${parsed.problem}`,
|
|
517
|
+
``,
|
|
518
|
+
`**Investigation steps:**`,
|
|
519
|
+
...parsed.investigationSteps.map((s, i) => `${i + 1}. ${s}`),
|
|
520
|
+
];
|
|
521
|
+
if (parsed.rootCauseHypothesis) {
|
|
522
|
+
sections.push(``, `**Root cause hypothesis:** ${parsed.rootCauseHypothesis}`);
|
|
523
|
+
}
|
|
524
|
+
if (parsed.acceptanceCriteria && parsed.acceptanceCriteria.length > 0) {
|
|
525
|
+
sections.push(``, `**Acceptance criteria:**`);
|
|
526
|
+
for (const c of parsed.acceptanceCriteria) {
|
|
527
|
+
sections.push(`- ${c}`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
if (parsed.filesToCheck && parsed.filesToCheck.length > 0) {
|
|
531
|
+
sections.push(``, `**Files to check:**`);
|
|
532
|
+
for (const f of parsed.filesToCheck) {
|
|
533
|
+
sections.push(`- \`${f.path}\` — ${f.reason}`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return sections.join("\n");
|
|
537
|
+
}
|
|
538
|
+
catch (err) {
|
|
539
|
+
log.warn(`Triage failed for insight "${insight.title}": ${err instanceof Error ? err.message : String(err)}`);
|
|
540
|
+
return null;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
// ─── Insight → Board escalation ──────────────────────────────────────────────
|
|
544
|
+
/**
|
|
545
|
+
* Escalate high-confidence actionable insights to the board as backlog items.
|
|
546
|
+
* Only bottlenecks and anomalies qualify — patterns and correlations are informational.
|
|
547
|
+
*
|
|
548
|
+
* Deduplicates against:
|
|
549
|
+
* 1. In-memory set of recently escalated titles (fast path)
|
|
550
|
+
* 2. Existing board items (checks for substring match in title — survives restarts)
|
|
551
|
+
*/
|
|
552
|
+
async function escalateInsights(newInsights) {
|
|
553
|
+
const board = getBoardProvider();
|
|
554
|
+
if (!board?.isAvailable())
|
|
555
|
+
return;
|
|
556
|
+
const now = Date.now();
|
|
557
|
+
// Prune expired cooldowns
|
|
558
|
+
for (const [title, ts] of escalationCooldowns) {
|
|
559
|
+
if (now - ts > ESCALATION_COOLDOWN_MS)
|
|
560
|
+
escalationCooldowns.delete(title);
|
|
561
|
+
}
|
|
562
|
+
const eligible = newInsights.filter((i) => ESCALATION_CATEGORIES.includes(i.category) &&
|
|
563
|
+
i.confidence === ESCALATION_MIN_CONFIDENCE &&
|
|
564
|
+
!escalatedTitles.has(i.title) &&
|
|
565
|
+
!escalationCooldowns.has(i.title));
|
|
566
|
+
if (eligible.length === 0)
|
|
567
|
+
return;
|
|
568
|
+
// Fetch existing board items to deduplicate against (survives restarts)
|
|
569
|
+
let existingTitles = [];
|
|
570
|
+
try {
|
|
571
|
+
const existing = await board.listIssues({ limit: 200 });
|
|
572
|
+
if (existing) {
|
|
573
|
+
existingTitles = existing.map((i) => i.title.toLowerCase());
|
|
574
|
+
// Backfill the in-memory set so we don't re-query next time
|
|
575
|
+
for (const item of existing) {
|
|
576
|
+
const titleLower = item.title.toLowerCase();
|
|
577
|
+
if (titleLower.startsWith("[bottleneck]") || titleLower.startsWith("[anomaly]")) {
|
|
578
|
+
const stripped = titleLower.replace(/^\[(bottleneck|anomaly)\]\s*/, "");
|
|
579
|
+
escalatedTitles.add(stripped);
|
|
580
|
+
// Component 2: If item is resolved, add to permanent suppress list
|
|
581
|
+
const stateLower = item.state.toLowerCase();
|
|
582
|
+
if (stateLower === "done" || stateLower === "cancelled") {
|
|
583
|
+
resolvedPatterns.add(stripped);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
catch (err) {
|
|
590
|
+
log.warn(`Failed to fetch board items for dedup: ${err instanceof Error ? err.message : String(err)}`);
|
|
591
|
+
}
|
|
592
|
+
for (const insight of eligible) {
|
|
593
|
+
// Skip if already on the board (fuzzy: check if the insight title appears in any existing title)
|
|
594
|
+
const titleLower = insight.title.toLowerCase();
|
|
595
|
+
if (escalatedTitles.has(insight.title))
|
|
596
|
+
continue;
|
|
597
|
+
const alreadyOnBoard = existingTitles.some((t) => t.includes(titleLower) || titleLower.includes(t.replace(/^\[.*?\]\s*/, "")));
|
|
598
|
+
if (alreadyOnBoard) {
|
|
599
|
+
escalatedTitles.add(insight.title);
|
|
600
|
+
log.info(`Skipping escalation — already on board: ${insight.title}`);
|
|
601
|
+
continue;
|
|
602
|
+
}
|
|
603
|
+
try {
|
|
604
|
+
// Triage: enrich vague insight with concrete investigation spec
|
|
605
|
+
const enrichedDescription = await triageInsightForEscalation(insight);
|
|
606
|
+
const descriptionBody = enrichedDescription
|
|
607
|
+
? [
|
|
608
|
+
`**Auto-escalated from insight engine**`,
|
|
609
|
+
``,
|
|
610
|
+
`**Category:** ${insight.category}`,
|
|
611
|
+
`**Confidence:** ${insight.confidence}`,
|
|
612
|
+
`**Discovered:** ${insight.discoveredAt}`,
|
|
613
|
+
``,
|
|
614
|
+
enrichedDescription,
|
|
615
|
+
``,
|
|
616
|
+
`_Insight ID: ${insight.id}_`,
|
|
617
|
+
].join("\n")
|
|
618
|
+
: [
|
|
619
|
+
`**Auto-escalated from insight engine**`,
|
|
620
|
+
``,
|
|
621
|
+
`**Category:** ${insight.category}`,
|
|
622
|
+
`**Confidence:** ${insight.confidence}`,
|
|
623
|
+
`**Discovered:** ${insight.discoveredAt}`,
|
|
624
|
+
``,
|
|
625
|
+
insight.description,
|
|
626
|
+
``,
|
|
627
|
+
`_Insight ID: ${insight.id}_`,
|
|
628
|
+
].join("\n");
|
|
629
|
+
const issue = await board.createIssue(`[${insight.category}] ${insight.title}`, {
|
|
630
|
+
description: descriptionBody,
|
|
631
|
+
priority: insight.category === "bottleneck" ? 2 : 3,
|
|
632
|
+
});
|
|
633
|
+
if (issue) {
|
|
634
|
+
escalatedTitles.add(insight.title);
|
|
635
|
+
escalationCooldowns.set(insight.title, Date.now());
|
|
636
|
+
log.info(`Escalated insight to board: ${issue.identifier} — ${insight.title}`);
|
|
637
|
+
logActivity({
|
|
638
|
+
source: "board",
|
|
639
|
+
summary: `Insight escalated to ${issue.identifier}: ${insight.title}`,
|
|
640
|
+
detail: issue.url,
|
|
641
|
+
actionLabel: "AUTONOMOUS",
|
|
642
|
+
reason: "insight engine escalated high-confidence finding",
|
|
643
|
+
});
|
|
644
|
+
// DASH-102: Emit CDT activation via unified primitive
|
|
645
|
+
emitCdt({
|
|
646
|
+
triggerId: insight.id,
|
|
647
|
+
sourceKey: `insight:${insight.category}`,
|
|
648
|
+
anchor: insight.title,
|
|
649
|
+
loopsInvolved: insight.relatedTraceIds,
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch (err) {
|
|
654
|
+
log.warn(`Failed to escalate insight "${insight.title}": ${err instanceof Error ? err.message : String(err)}`);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
// ─── Resolved patterns hydration ─────────────────────────────────────────────
|
|
659
|
+
/**
|
|
660
|
+
* Pre-populate resolvedPatterns from board items in terminal states.
|
|
661
|
+
* Called once at startup so the first analysis run already benefits.
|
|
662
|
+
*/
|
|
663
|
+
async function hydrateResolvedPatterns() {
|
|
664
|
+
const board = getBoardProvider();
|
|
665
|
+
if (!board?.isAvailable())
|
|
666
|
+
return;
|
|
667
|
+
const existing = await board.listIssues({ limit: 200 });
|
|
668
|
+
if (!existing)
|
|
669
|
+
return;
|
|
670
|
+
for (const item of existing) {
|
|
671
|
+
const titleLower = item.title.toLowerCase();
|
|
672
|
+
if (titleLower.startsWith("[bottleneck]") || titleLower.startsWith("[anomaly]")) {
|
|
673
|
+
const stripped = titleLower.replace(/^\[(bottleneck|anomaly)\]\s*/, "");
|
|
674
|
+
const stateLower = item.state.toLowerCase();
|
|
675
|
+
if (stateLower === "done" || stateLower === "cancelled") {
|
|
676
|
+
resolvedPatterns.add(stripped);
|
|
677
|
+
}
|
|
678
|
+
// Also backfill escalatedTitles
|
|
679
|
+
escalatedTitles.add(stripped);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
if (resolvedPatterns.size > 0) {
|
|
683
|
+
log.info(`Hydrated ${resolvedPatterns.size} resolved pattern(s) from board`);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
687
|
+
/** Schedule the next recurring analysis run after ANALYSIS_INTERVAL_MS. */
|
|
688
|
+
function scheduleNextRun() {
|
|
689
|
+
timer = setTimeout(async () => {
|
|
690
|
+
try {
|
|
691
|
+
await runAnalysis();
|
|
692
|
+
}
|
|
693
|
+
catch (err) {
|
|
694
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
695
|
+
log.error(`Analysis error: ${msg}`);
|
|
696
|
+
}
|
|
697
|
+
// Chain next run after this one completes (prevents overlap)
|
|
698
|
+
if (timer)
|
|
699
|
+
scheduleNextRun();
|
|
700
|
+
}, ANALYSIS_INTERVAL_MS);
|
|
701
|
+
}
|
|
702
|
+
/** Start the insights analysis timer. Idempotent. */
|
|
703
|
+
export function startInsightsTimer() {
|
|
704
|
+
if (timer || firstRunTimer)
|
|
705
|
+
return;
|
|
706
|
+
// Restore watermark so we don't re-analyze old entries
|
|
707
|
+
lastAnalysisId = loadWatermark();
|
|
708
|
+
log.debug(`Restored analysis watermark: ${lastAnalysisId}`);
|
|
709
|
+
// Load persisted insights from disk (non-blocking)
|
|
710
|
+
loadInsights().catch((err) => {
|
|
711
|
+
log.debug(`Insight load failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
712
|
+
});
|
|
713
|
+
// Hydrate resolvedPatterns from board state at startup
|
|
714
|
+
hydrateResolvedPatterns().catch((err) => {
|
|
715
|
+
log.debug(`Resolved patterns hydration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
716
|
+
});
|
|
717
|
+
// First run after a delay to let activity accumulate
|
|
718
|
+
firstRunTimer = setTimeout(async () => {
|
|
719
|
+
firstRunTimer = null;
|
|
720
|
+
log.info("First insight analysis starting...");
|
|
721
|
+
try {
|
|
722
|
+
await runAnalysis();
|
|
723
|
+
}
|
|
724
|
+
catch (err) {
|
|
725
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
726
|
+
log.error(`First analysis error: ${msg}`);
|
|
727
|
+
}
|
|
728
|
+
// Start recurring chain (10 min after first run completes, not from timer start)
|
|
729
|
+
scheduleNextRun();
|
|
730
|
+
}, FIRST_RUN_DELAY_MS);
|
|
731
|
+
log.info(`Trace insights: first run in ${FIRST_RUN_DELAY_MS / 1000}s, then every ${ANALYSIS_INTERVAL_MS / 60_000} min`);
|
|
732
|
+
}
|
|
733
|
+
/** Stop the insights timer. */
|
|
734
|
+
export function stopInsightsTimer() {
|
|
735
|
+
if (firstRunTimer) {
|
|
736
|
+
clearTimeout(firstRunTimer);
|
|
737
|
+
firstRunTimer = null;
|
|
738
|
+
}
|
|
739
|
+
if (timer) {
|
|
740
|
+
clearTimeout(timer);
|
|
741
|
+
timer = null;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
/** Get all discovered insights. */
|
|
745
|
+
export function getInsights() {
|
|
746
|
+
return [...insights];
|
|
747
|
+
}
|
|
748
|
+
/** Get the summary of the last analysis run. */
|
|
749
|
+
export function getLastInsightRun() {
|
|
750
|
+
return lastRun;
|
|
751
|
+
}
|
|
752
|
+
/** Get timer diagnostic state. */
|
|
753
|
+
export function getInsightTimerState() {
|
|
754
|
+
return { timer: timer !== null, firstRunTimer: firstRunTimer !== null, lastAnalysisId };
|
|
755
|
+
}
|
|
756
|
+
/** Trigger an immediate analysis run (for manual/API use). */
|
|
757
|
+
export async function triggerInsightAnalysis() {
|
|
758
|
+
if (!timer && !firstRunTimer)
|
|
759
|
+
return null;
|
|
760
|
+
return runAnalysis();
|
|
761
|
+
}
|
|
762
|
+
//# sourceMappingURL=traceInsights.js.map
|