@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,947 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runtime Environment — RuntimeManager.
|
|
3
|
+
*
|
|
4
|
+
* The central orchestrator that ties together lifecycle management,
|
|
5
|
+
* resource allocation, the event bus, registry persistence, and the
|
|
6
|
+
* agent driver. Provides the high-level API for spawning, pausing,
|
|
7
|
+
* resuming, and terminating agent instances.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const manager = new RuntimeManager(driver, configOverrides);
|
|
11
|
+
* await manager.init();
|
|
12
|
+
* const instance = await manager.spawn({ taskId, label, prompt, origin });
|
|
13
|
+
* await manager.pause(instance.id);
|
|
14
|
+
* await manager.resume(instance.id);
|
|
15
|
+
* await manager.terminate(instance.id);
|
|
16
|
+
* await manager.shutdown();
|
|
17
|
+
*/
|
|
18
|
+
import { RuntimeError, ErrorCodes } from "./errors.js";
|
|
19
|
+
import { loadRuntimeConfig, resolveInstanceConfig, resolveResources } from "./config.js";
|
|
20
|
+
import { transition, shouldRetry, prepareRetry, isTerminal } from "./lifecycle.js";
|
|
21
|
+
import { ResourcePool } from "./resources.js";
|
|
22
|
+
import { RuntimeBus } from "./bus.js";
|
|
23
|
+
import { AgentRegistry } from "./registry.js";
|
|
24
|
+
import { logActivity } from "../../activity/log.js";
|
|
25
|
+
import { createLogger } from "../../utils/logger.js";
|
|
26
|
+
import { rememberTaskOutcome } from "../memory.js";
|
|
27
|
+
import { readTask, readTaskOutput, updateTask } from "../store.js";
|
|
28
|
+
import { updateBoardTaskState } from "../spawn.js";
|
|
29
|
+
const log = createLogger("agent-runtime");
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// RuntimeManager
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
export class RuntimeManager {
|
|
34
|
+
config;
|
|
35
|
+
bus;
|
|
36
|
+
resources;
|
|
37
|
+
registry;
|
|
38
|
+
driver;
|
|
39
|
+
monitorTimer = null;
|
|
40
|
+
shutdownRequested = false;
|
|
41
|
+
// ── Retry loop guards ──────────────────────────────────────────────────
|
|
42
|
+
/** Prevents concurrent handleExit calls for the same instance. */
|
|
43
|
+
handleExitGuard = new Set();
|
|
44
|
+
/** Tracks instances with a pending retry timeout (prevents duplicate scheduling). */
|
|
45
|
+
retryPending = new Set();
|
|
46
|
+
// ── Global retry budget ────────────────────────────────────────────────
|
|
47
|
+
/** Rolling window of retry timestamps across all instances. */
|
|
48
|
+
globalRetryTimestamps = [];
|
|
49
|
+
/**
|
|
50
|
+
* Max retries across all instances within the budget window.
|
|
51
|
+
* Scaled to 3× maxConcurrentAgents to avoid budget exhaustion when a full
|
|
52
|
+
* batch fails (each agent gets maxRetries=2, so 5 agents = 10 retries
|
|
53
|
+
* which previously exhausted the entire budget in one batch).
|
|
54
|
+
*/
|
|
55
|
+
globalRetryBudget;
|
|
56
|
+
/** Rolling window for the global retry budget (ms). */
|
|
57
|
+
static GLOBAL_RETRY_WINDOW_MS = 5 * 60_000; // 5 minutes
|
|
58
|
+
constructor(driver, configOverrides) {
|
|
59
|
+
this.config = loadRuntimeConfig(configOverrides);
|
|
60
|
+
this.driver = driver;
|
|
61
|
+
this.bus = new RuntimeBus();
|
|
62
|
+
this.resources = new ResourcePool(this.config);
|
|
63
|
+
this.registry = new AgentRegistry(this.config.persistDir);
|
|
64
|
+
// Scale retry budget: 3× max concurrent agents ensures one bad batch
|
|
65
|
+
// doesn't exhaust the entire budget (5 agents × 2 retries = 10, budget = 15)
|
|
66
|
+
this.globalRetryBudget = Math.max(10, this.config.maxConcurrentAgents * 3);
|
|
67
|
+
}
|
|
68
|
+
// -------------------------------------------------------------------------
|
|
69
|
+
// Initialization & shutdown
|
|
70
|
+
// -------------------------------------------------------------------------
|
|
71
|
+
/** Initialize the runtime: load registry, recover agents, start monitor. */
|
|
72
|
+
async init() {
|
|
73
|
+
const t0 = Date.now();
|
|
74
|
+
log.info("Initializing agent runtime", { driver: this.driver.name, maxAgents: this.config.maxConcurrentAgents });
|
|
75
|
+
const t1 = Date.now();
|
|
76
|
+
await this.registry.init();
|
|
77
|
+
const registryMs = Date.now() - t1;
|
|
78
|
+
const t2 = Date.now();
|
|
79
|
+
await this.recoverAgents();
|
|
80
|
+
const recoveryMs = Date.now() - t2;
|
|
81
|
+
this.startMonitor();
|
|
82
|
+
const totalMs = Date.now() - t0;
|
|
83
|
+
logActivity({
|
|
84
|
+
source: "agent",
|
|
85
|
+
summary: "Agent runtime initialized",
|
|
86
|
+
detail: `Driver: ${this.driver.name}, max agents: ${this.config.maxConcurrentAgents}, init ${totalMs}ms [registry:${registryMs}ms recovery:${recoveryMs}ms]`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/** Graceful shutdown: terminate active agents, stop monitor, clean up. */
|
|
90
|
+
async shutdown(reason = "Runtime shutdown") {
|
|
91
|
+
if (this.shutdownRequested)
|
|
92
|
+
return;
|
|
93
|
+
log.info("Shutting down agent runtime", { reason });
|
|
94
|
+
this.shutdownRequested = true;
|
|
95
|
+
this.bus.emitShutdown(reason);
|
|
96
|
+
this.stopMonitor();
|
|
97
|
+
// Terminate all active agents
|
|
98
|
+
const active = this.registry.listActive();
|
|
99
|
+
const terminations = active.map((inst) => this.terminate(inst.id, reason).catch(() => { }));
|
|
100
|
+
await Promise.allSettled(terminations);
|
|
101
|
+
// Clean up resources, retry guards, and bus
|
|
102
|
+
this.resources.clear();
|
|
103
|
+
this.handleExitGuard.clear();
|
|
104
|
+
this.retryPending.clear();
|
|
105
|
+
this.globalRetryTimestamps.length = 0;
|
|
106
|
+
this.bus.destroy();
|
|
107
|
+
logActivity({
|
|
108
|
+
source: "agent",
|
|
109
|
+
summary: "Agent runtime shut down",
|
|
110
|
+
detail: `Reason: ${reason}, terminated ${active.length} agents`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
114
|
+
// Core lifecycle operations
|
|
115
|
+
// -------------------------------------------------------------------------
|
|
116
|
+
/** Spawn a new agent instance. */
|
|
117
|
+
async spawn(request) {
|
|
118
|
+
log.info(`Spawning agent instance: ${request.label}`, { taskId: request.taskId, origin: request.origin });
|
|
119
|
+
if (this.shutdownRequested) {
|
|
120
|
+
throw new RuntimeError(ErrorCodes.SHUTDOWN_IN_PROGRESS, "Runtime is shutting down");
|
|
121
|
+
}
|
|
122
|
+
const instanceConfig = resolveInstanceConfig(this.config, request.config);
|
|
123
|
+
const resourceAlloc = resolveResources(this.config, request.resources);
|
|
124
|
+
// Check resource availability — queue if not available
|
|
125
|
+
if (!this.resources.canAllocate(resourceAlloc)) {
|
|
126
|
+
logActivity({
|
|
127
|
+
source: "agent",
|
|
128
|
+
summary: `Agent queued (resources exhausted): ${request.label}`,
|
|
129
|
+
detail: `Active: ${this.resources.activeCount}/${this.config.maxConcurrentAgents}`,
|
|
130
|
+
});
|
|
131
|
+
await this.resources.enqueue(request, instanceConfig.priority);
|
|
132
|
+
}
|
|
133
|
+
// Create the instance
|
|
134
|
+
const now = new Date().toISOString();
|
|
135
|
+
const instance = {
|
|
136
|
+
id: this.registry.generateId(),
|
|
137
|
+
taskId: request.taskId,
|
|
138
|
+
state: "initializing",
|
|
139
|
+
config: instanceConfig,
|
|
140
|
+
resources: resourceAlloc,
|
|
141
|
+
metadata: {
|
|
142
|
+
label: request.label,
|
|
143
|
+
origin: request.origin,
|
|
144
|
+
parentId: request.parentId,
|
|
145
|
+
tags: request.tags ?? [],
|
|
146
|
+
},
|
|
147
|
+
retryCount: 0,
|
|
148
|
+
createdAt: now,
|
|
149
|
+
updatedAt: now,
|
|
150
|
+
};
|
|
151
|
+
// Store the prompt on the instance for the driver
|
|
152
|
+
instance._prompt = request.prompt;
|
|
153
|
+
// Register and allocate resources
|
|
154
|
+
await this.registry.register(instance);
|
|
155
|
+
this.resources.allocate(instance.id, resourceAlloc);
|
|
156
|
+
logActivity({
|
|
157
|
+
source: "agent",
|
|
158
|
+
summary: `Spawning agent: ${request.label}`,
|
|
159
|
+
detail: `Instance ${instance.id}, task ${request.taskId}`,
|
|
160
|
+
});
|
|
161
|
+
// Attempt to spawn via driver
|
|
162
|
+
try {
|
|
163
|
+
const pid = await this.driver.spawn(instance);
|
|
164
|
+
instance.pid = pid;
|
|
165
|
+
const event = transition(instance, "running", "Spawned successfully");
|
|
166
|
+
await this.registry.update(instance.id, {
|
|
167
|
+
state: instance.state,
|
|
168
|
+
pid,
|
|
169
|
+
updatedAt: instance.updatedAt,
|
|
170
|
+
});
|
|
171
|
+
this.bus.emitLifecycle(event);
|
|
172
|
+
this.bus.emitSpawned(instance.id, pid);
|
|
173
|
+
// Register exit handler with driver
|
|
174
|
+
if ("onExit" in this.driver && typeof this.driver.onExit === "function") {
|
|
175
|
+
this.driver
|
|
176
|
+
.onExit(instance.id, (code) => this.handleExit(instance.id, code));
|
|
177
|
+
}
|
|
178
|
+
logActivity({
|
|
179
|
+
source: "agent",
|
|
180
|
+
summary: `Agent running: ${request.label}`,
|
|
181
|
+
detail: `PID ${pid}, instance ${instance.id}`,
|
|
182
|
+
});
|
|
183
|
+
return instance;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
const error = this.toAgentError(err, ErrorCodes.SPAWN_FAILED, true);
|
|
187
|
+
const event = transition(instance, "failed", "Spawn failed", error);
|
|
188
|
+
await this.registry.update(instance.id, {
|
|
189
|
+
state: "failed",
|
|
190
|
+
error,
|
|
191
|
+
updatedAt: instance.updatedAt,
|
|
192
|
+
});
|
|
193
|
+
this.resources.release(instance.id);
|
|
194
|
+
this.bus.emitLifecycle(event);
|
|
195
|
+
// Check if retry is possible BEFORE emitting terminal failure.
|
|
196
|
+
// Same fix as handleExit: prevent external listeners from firing
|
|
197
|
+
// prematurely while retries are still pending.
|
|
198
|
+
const retryDelay = shouldRetry(instance);
|
|
199
|
+
if (retryDelay !== null) {
|
|
200
|
+
logActivity({
|
|
201
|
+
source: "agent",
|
|
202
|
+
summary: `Agent spawn failed, will retry: ${request.label}`,
|
|
203
|
+
detail: `Attempt ${instance.retryCount + 1}/${instance.config.maxRetries}, backoff ${retryDelay}ms`,
|
|
204
|
+
});
|
|
205
|
+
await this.maybeRetry(instance);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Terminal failure — notify external listeners
|
|
209
|
+
this.bus.emitFailed(instance.id, error);
|
|
210
|
+
logActivity({
|
|
211
|
+
source: "agent",
|
|
212
|
+
summary: `Agent spawn failed (terminal): ${request.label}`,
|
|
213
|
+
detail: err.message,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return instance;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** Pause a running agent. */
|
|
220
|
+
async pause(instanceId, reason) {
|
|
221
|
+
const instance = this.requireInstance(instanceId);
|
|
222
|
+
this.assertState(instance, "running");
|
|
223
|
+
let checkpoint;
|
|
224
|
+
try {
|
|
225
|
+
checkpoint = await this.driver.pause(instance);
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
logActivity({
|
|
229
|
+
source: "agent",
|
|
230
|
+
summary: `Agent pause failed: ${instance.metadata.label}`,
|
|
231
|
+
detail: err.message,
|
|
232
|
+
});
|
|
233
|
+
throw err;
|
|
234
|
+
}
|
|
235
|
+
if (checkpoint) {
|
|
236
|
+
instance.checkpointData = checkpoint;
|
|
237
|
+
}
|
|
238
|
+
const event = transition(instance, "paused", reason ?? "Paused by request");
|
|
239
|
+
await this.registry.update(instanceId, {
|
|
240
|
+
state: "paused",
|
|
241
|
+
checkpointData: instance.checkpointData,
|
|
242
|
+
pausedAt: instance.pausedAt,
|
|
243
|
+
updatedAt: instance.updatedAt,
|
|
244
|
+
});
|
|
245
|
+
this.resources.release(instanceId);
|
|
246
|
+
this.bus.emitLifecycle(event);
|
|
247
|
+
logActivity({
|
|
248
|
+
source: "agent",
|
|
249
|
+
summary: `Agent paused: ${instance.metadata.label}`,
|
|
250
|
+
detail: checkpoint ? "Checkpoint saved" : "No checkpoint",
|
|
251
|
+
});
|
|
252
|
+
return instance;
|
|
253
|
+
}
|
|
254
|
+
/** Resume a paused agent. */
|
|
255
|
+
async resume(instanceId) {
|
|
256
|
+
const instance = this.requireInstance(instanceId);
|
|
257
|
+
this.assertState(instance, "paused");
|
|
258
|
+
// Check resource availability
|
|
259
|
+
if (!this.resources.canAllocate(instance.resources)) {
|
|
260
|
+
throw new RuntimeError(ErrorCodes.RESOURCE_EXHAUSTED, "Cannot resume: resources unavailable", true);
|
|
261
|
+
}
|
|
262
|
+
const resumeEvent = transition(instance, "resuming", "Resuming from pause");
|
|
263
|
+
this.bus.emitLifecycle(resumeEvent);
|
|
264
|
+
// Re-allocate resources
|
|
265
|
+
this.resources.allocate(instanceId, instance.resources);
|
|
266
|
+
try {
|
|
267
|
+
const pid = await this.driver.resume(instance, instance.checkpointData);
|
|
268
|
+
instance.pid = pid;
|
|
269
|
+
instance.pausedAt = undefined;
|
|
270
|
+
const runEvent = transition(instance, "running", "Resumed successfully");
|
|
271
|
+
await this.registry.update(instanceId, {
|
|
272
|
+
state: "running",
|
|
273
|
+
pid,
|
|
274
|
+
pausedAt: undefined,
|
|
275
|
+
updatedAt: instance.updatedAt,
|
|
276
|
+
});
|
|
277
|
+
this.bus.emitLifecycle(runEvent);
|
|
278
|
+
this.bus.emitSpawned(instanceId, pid);
|
|
279
|
+
// Re-register exit handler
|
|
280
|
+
if ("onExit" in this.driver && typeof this.driver.onExit === "function") {
|
|
281
|
+
this.driver
|
|
282
|
+
.onExit(instanceId, (code) => this.handleExit(instanceId, code));
|
|
283
|
+
}
|
|
284
|
+
logActivity({
|
|
285
|
+
source: "agent",
|
|
286
|
+
summary: `Agent resumed: ${instance.metadata.label}`,
|
|
287
|
+
detail: `PID ${pid}, instance ${instanceId}`,
|
|
288
|
+
});
|
|
289
|
+
return instance;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
const error = this.toAgentError(err, ErrorCodes.RESUME_FAILED, true);
|
|
293
|
+
const failEvent = transition(instance, "failed", "Resume failed", error);
|
|
294
|
+
await this.registry.update(instanceId, {
|
|
295
|
+
state: "failed",
|
|
296
|
+
error,
|
|
297
|
+
updatedAt: instance.updatedAt,
|
|
298
|
+
});
|
|
299
|
+
this.resources.release(instanceId);
|
|
300
|
+
this.bus.emitLifecycle(failEvent);
|
|
301
|
+
this.bus.emitFailed(instanceId, error);
|
|
302
|
+
logActivity({
|
|
303
|
+
source: "agent",
|
|
304
|
+
summary: `Agent resume failed: ${instance.metadata.label}`,
|
|
305
|
+
detail: err.message,
|
|
306
|
+
});
|
|
307
|
+
return instance;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** Terminate an agent (from any active state). */
|
|
311
|
+
async terminate(instanceId, reason) {
|
|
312
|
+
const instance = this.requireInstance(instanceId);
|
|
313
|
+
if (isTerminal(instance.state)) {
|
|
314
|
+
return instance; // Already done
|
|
315
|
+
}
|
|
316
|
+
// Transition to terminating
|
|
317
|
+
try {
|
|
318
|
+
const termEvent = transition(instance, "terminating", reason ?? "Terminated by request");
|
|
319
|
+
this.bus.emitLifecycle(termEvent);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// If transition isn't valid from current state, force it
|
|
323
|
+
instance.state = "terminating";
|
|
324
|
+
instance.updatedAt = new Date().toISOString();
|
|
325
|
+
}
|
|
326
|
+
// Kill the process
|
|
327
|
+
try {
|
|
328
|
+
await this.driver.terminate(instance);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Best effort — process may already be dead
|
|
332
|
+
}
|
|
333
|
+
// Transition to terminated
|
|
334
|
+
const finalEvent = transition(instance, "terminated", reason ?? "Terminated");
|
|
335
|
+
// Skip disk persist — GC will delete this file within gcTtlMs.
|
|
336
|
+
// On restart, driver.isAlive() returns false → recovery handles correctly.
|
|
337
|
+
await this.registry.update(instanceId, {
|
|
338
|
+
state: "terminated",
|
|
339
|
+
terminatedAt: instance.terminatedAt,
|
|
340
|
+
updatedAt: instance.updatedAt,
|
|
341
|
+
}, true);
|
|
342
|
+
this.resources.release(instanceId);
|
|
343
|
+
this.bus.unsubscribe(instanceId);
|
|
344
|
+
this.bus.emitLifecycle(finalEvent);
|
|
345
|
+
// Update linked AgentTask
|
|
346
|
+
await updateTask(instance.taskId, {
|
|
347
|
+
status: "cancelled",
|
|
348
|
+
finishedAt: new Date().toISOString(),
|
|
349
|
+
}).catch(() => { });
|
|
350
|
+
logActivity({
|
|
351
|
+
source: "agent",
|
|
352
|
+
summary: `Agent terminated: ${instance.metadata.label}`,
|
|
353
|
+
detail: `Reason: ${reason ?? "requested"}, instance ${instanceId}`,
|
|
354
|
+
});
|
|
355
|
+
return instance;
|
|
356
|
+
}
|
|
357
|
+
// -------------------------------------------------------------------------
|
|
358
|
+
// Queries
|
|
359
|
+
// -------------------------------------------------------------------------
|
|
360
|
+
/** Get an agent instance by ID. */
|
|
361
|
+
getInstance(id) {
|
|
362
|
+
return this.registry.get(id);
|
|
363
|
+
}
|
|
364
|
+
/** Get an instance by its linked task ID. */
|
|
365
|
+
getByTaskId(taskId) {
|
|
366
|
+
return this.registry.getByTaskId(taskId);
|
|
367
|
+
}
|
|
368
|
+
/** List all instances, optionally filtered. */
|
|
369
|
+
listInstances(filter) {
|
|
370
|
+
if (filter?.states) {
|
|
371
|
+
return this.registry.list({ states: filter.states });
|
|
372
|
+
}
|
|
373
|
+
return this.registry.list();
|
|
374
|
+
}
|
|
375
|
+
/** List all active (non-terminal) instances. */
|
|
376
|
+
listActive() {
|
|
377
|
+
return this.registry.listActive();
|
|
378
|
+
}
|
|
379
|
+
/** Get a snapshot of current resource usage. */
|
|
380
|
+
getResourceSnapshot() {
|
|
381
|
+
return this.resources.snapshot();
|
|
382
|
+
}
|
|
383
|
+
/** Get instance counts by state. */
|
|
384
|
+
getStateCounts() {
|
|
385
|
+
return this.registry.countByState();
|
|
386
|
+
}
|
|
387
|
+
/** Remove a terminated instance from the registry and disk. */
|
|
388
|
+
async removeInstance(id) {
|
|
389
|
+
return this.registry.remove(id);
|
|
390
|
+
}
|
|
391
|
+
/** Remove multiple terminated instances in parallel. */
|
|
392
|
+
async removeInstances(ids) {
|
|
393
|
+
return this.registry.removeMany(ids);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Remove multiple instances from in-memory registry only (no file I/O).
|
|
397
|
+
* Returns the count removed and their persist file paths for caller-managed
|
|
398
|
+
* batch deletion.
|
|
399
|
+
*/
|
|
400
|
+
removeInstancesInMemory(ids) {
|
|
401
|
+
return this.registry.removeManyInMemory(ids);
|
|
402
|
+
}
|
|
403
|
+
// -------------------------------------------------------------------------
|
|
404
|
+
// Inter-agent messaging
|
|
405
|
+
// -------------------------------------------------------------------------
|
|
406
|
+
/** Send a message between agents. */
|
|
407
|
+
sendMessage(from, to, type, payload) {
|
|
408
|
+
return this.bus.send({ from, to, type, payload });
|
|
409
|
+
}
|
|
410
|
+
/** Send a request and await a correlated response. */
|
|
411
|
+
async requestResponse(from, to, type, payload, timeoutMs) {
|
|
412
|
+
return this.bus.request({ from, to, type, payload }, timeoutMs);
|
|
413
|
+
}
|
|
414
|
+
/** Subscribe an agent to receive messages. */
|
|
415
|
+
subscribeAgent(agentId, handler) {
|
|
416
|
+
this.bus.subscribe(agentId, handler);
|
|
417
|
+
}
|
|
418
|
+
// -------------------------------------------------------------------------
|
|
419
|
+
// Event subscriptions (for external consumers)
|
|
420
|
+
// -------------------------------------------------------------------------
|
|
421
|
+
/** Subscribe to lifecycle events. */
|
|
422
|
+
onLifecycle(handler) {
|
|
423
|
+
this.bus.on("agent:lifecycle", handler);
|
|
424
|
+
}
|
|
425
|
+
/** Subscribe to agent error events. */
|
|
426
|
+
onError(handler) {
|
|
427
|
+
this.bus.on("agent:error", handler);
|
|
428
|
+
}
|
|
429
|
+
/** Subscribe to resource warning events. */
|
|
430
|
+
onResourceWarning(handler) {
|
|
431
|
+
this.bus.on("runtime:resource-warning", handler);
|
|
432
|
+
}
|
|
433
|
+
// -------------------------------------------------------------------------
|
|
434
|
+
// Internal: process exit handling
|
|
435
|
+
// -------------------------------------------------------------------------
|
|
436
|
+
async handleExit(instanceId, code) {
|
|
437
|
+
const instance = this.registry.get(instanceId);
|
|
438
|
+
if (!instance || isTerminal(instance.state))
|
|
439
|
+
return;
|
|
440
|
+
// Guard: prevent concurrent handleExit for the same instance.
|
|
441
|
+
// Monitor poll + driver exit handler can race, causing duplicate retry scheduling.
|
|
442
|
+
if (this.handleExitGuard.has(instanceId)) {
|
|
443
|
+
logActivity({
|
|
444
|
+
source: "agent",
|
|
445
|
+
summary: `handleExit skipped (concurrent call): ${instance.metadata.label}`,
|
|
446
|
+
detail: `Instance ${instanceId}, exit code ${code} — another handleExit is already processing`,
|
|
447
|
+
});
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
this.handleExitGuard.add(instanceId);
|
|
451
|
+
try {
|
|
452
|
+
await this.handleExitInner(instanceId, instance, code);
|
|
453
|
+
}
|
|
454
|
+
finally {
|
|
455
|
+
this.handleExitGuard.delete(instanceId);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
async handleExitInner(instanceId, instance, code) {
|
|
459
|
+
const output = await readTaskOutput(instance.taskId).catch(() => "");
|
|
460
|
+
const resultSummary = output.trim().slice(0, 1000) || undefined;
|
|
461
|
+
// Null exit code (signal/restart) with substantial output is treated as success,
|
|
462
|
+
// matching the same logic in spawn.ts. Without this, RuntimeManager retries
|
|
463
|
+
// agents that spawn.ts already marked as completed.
|
|
464
|
+
const hasSubstantialOutput = output.trim().length > 100;
|
|
465
|
+
const success = code === 0 || (code == null && hasSubstantialOutput);
|
|
466
|
+
if (success) {
|
|
467
|
+
const event = transition(instance, "completed", `Exited with code ${code}`);
|
|
468
|
+
// Skip disk persist — GC will delete this file within gcTtlMs.
|
|
469
|
+
// On restart, driver.isAlive() returns false → recovery handles correctly.
|
|
470
|
+
await this.registry.update(instanceId, {
|
|
471
|
+
state: "completed",
|
|
472
|
+
updatedAt: instance.updatedAt,
|
|
473
|
+
terminatedAt: instance.terminatedAt,
|
|
474
|
+
}, true);
|
|
475
|
+
this.resources.release(instanceId);
|
|
476
|
+
this.bus.emitLifecycle(event);
|
|
477
|
+
this.bus.emitCompleted(instanceId, code ?? undefined);
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
// Classify recoverability based on exit code and context:
|
|
481
|
+
// - null + near timeout: timeout kill — not recoverable (retrying will timeout again)
|
|
482
|
+
// - null (signal/OOM/killed): potentially recoverable (worth retrying)
|
|
483
|
+
// - non-zero: check output for deterministic failure patterns
|
|
484
|
+
const elapsed = Date.now() - new Date(instance.createdAt).getTime();
|
|
485
|
+
const isTimeout = code === null && elapsed >= instance.config.timeoutMs * 0.9;
|
|
486
|
+
const isDeterministicFailure = isTimeout || this.isDeterministicFailure(output, code);
|
|
487
|
+
const recoverable = !isDeterministicFailure;
|
|
488
|
+
if (isTimeout) {
|
|
489
|
+
logActivity({
|
|
490
|
+
source: "agent",
|
|
491
|
+
summary: `Agent timed out: ${instance.metadata.label}`,
|
|
492
|
+
detail: `Elapsed ${Math.round(elapsed / 1000)}s of ${Math.round(instance.config.timeoutMs / 1000)}s limit — will not retry`,
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
const error = this.toAgentError(new Error(`Process exited with code ${code}`), ErrorCodes.DRIVER_ERROR, recoverable);
|
|
496
|
+
const event = transition(instance, "failed", `Exited with code ${code}`, error);
|
|
497
|
+
await this.registry.update(instanceId, {
|
|
498
|
+
state: "failed",
|
|
499
|
+
error,
|
|
500
|
+
updatedAt: instance.updatedAt,
|
|
501
|
+
});
|
|
502
|
+
// Release resources before retry check (maybeRetry re-allocates if needed)
|
|
503
|
+
this.resources.release(instanceId);
|
|
504
|
+
this.bus.emitLifecycle(event);
|
|
505
|
+
// Check if retry is possible BEFORE emitting terminal failure.
|
|
506
|
+
// This prevents external listeners (spawn.ts batch tracking) from
|
|
507
|
+
// prematurely processing the failure while retries are still pending,
|
|
508
|
+
// which was causing retry loop fan-out: continuation spawned new agents
|
|
509
|
+
// while the RuntimeManager was still retrying the original.
|
|
510
|
+
const retryDelay = shouldRetry(instance);
|
|
511
|
+
if (retryDelay !== null) {
|
|
512
|
+
logActivity({
|
|
513
|
+
source: "agent",
|
|
514
|
+
summary: `Agent failed, will retry: ${instance.metadata.label}`,
|
|
515
|
+
detail: `Attempt ${instance.retryCount + 1}/${instance.config.maxRetries}, backoff ${retryDelay}ms, exit code ${code}, recoverable=${recoverable}, instance ${instanceId}`,
|
|
516
|
+
});
|
|
517
|
+
await this.maybeRetry(instance);
|
|
518
|
+
return; // Don't emit agent:failed or update task store — retry pending
|
|
519
|
+
}
|
|
520
|
+
// Terminal failure — no more retries, notify external listeners
|
|
521
|
+
logActivity({
|
|
522
|
+
source: "agent",
|
|
523
|
+
summary: `Agent failed (terminal, no retries left): ${instance.metadata.label}`,
|
|
524
|
+
detail: `Exit code ${code}, retryCount=${instance.retryCount}/${instance.config.maxRetries}, recoverable=${recoverable}, instance ${instanceId}`,
|
|
525
|
+
});
|
|
526
|
+
this.bus.emitFailed(instanceId, error);
|
|
527
|
+
}
|
|
528
|
+
// ── Finalize (reached only for terminal success or terminal failure) ──
|
|
529
|
+
this.bus.unsubscribe(instanceId);
|
|
530
|
+
const newState = success ? "completed" : "failed";
|
|
531
|
+
await updateTask(instance.taskId, {
|
|
532
|
+
status: newState,
|
|
533
|
+
exitCode: code ?? undefined,
|
|
534
|
+
finishedAt: new Date().toISOString(),
|
|
535
|
+
resultSummary,
|
|
536
|
+
}).catch(() => { });
|
|
537
|
+
// Persist to episodic memory
|
|
538
|
+
const task = await readTask(instance.taskId).catch(() => null);
|
|
539
|
+
if (task) {
|
|
540
|
+
rememberTaskOutcome({ ...task, status: newState, exitCode: code ?? undefined }, output).catch(() => { });
|
|
541
|
+
}
|
|
542
|
+
// Sync board task state (survives server restarts — inline spawn listeners don't)
|
|
543
|
+
if (task?.boardTaskId) {
|
|
544
|
+
updateBoardTaskState(task.boardTaskId, success
|
|
545
|
+
? { state: "done" }
|
|
546
|
+
: { state: "todo", assignee: null }).catch(() => { });
|
|
547
|
+
}
|
|
548
|
+
logActivity({
|
|
549
|
+
source: "agent",
|
|
550
|
+
summary: `Agent ${newState}: ${instance.metadata.label}`,
|
|
551
|
+
detail: `Exit code ${code}, instance ${instanceId}`,
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
// -------------------------------------------------------------------------
|
|
555
|
+
// Internal: retry logic
|
|
556
|
+
// -------------------------------------------------------------------------
|
|
557
|
+
/**
|
|
558
|
+
* Emit terminal failure event and finalize task store + memory.
|
|
559
|
+
* Called when all retries are exhausted or a non-recoverable error occurs
|
|
560
|
+
* within the retry path. This ensures external listeners (spawn.ts batch
|
|
561
|
+
* tracking) are notified and the task store reflects the final state.
|
|
562
|
+
*
|
|
563
|
+
* Without this, tasks that fail during retries would leave the task store
|
|
564
|
+
* in a stale "running" state and batch continuation would never trigger.
|
|
565
|
+
*/
|
|
566
|
+
async finalizeTerminalFailure(instance, error) {
|
|
567
|
+
const finalError = error ?? instance.error ?? {
|
|
568
|
+
code: ErrorCodes.MAX_RETRIES_EXCEEDED,
|
|
569
|
+
message: "Agent failed after all retry attempts",
|
|
570
|
+
timestamp: new Date().toISOString(),
|
|
571
|
+
recoverable: false,
|
|
572
|
+
};
|
|
573
|
+
this.bus.emitFailed(instance.id, finalError);
|
|
574
|
+
this.bus.unsubscribe(instance.id);
|
|
575
|
+
// Update linked AgentTask
|
|
576
|
+
const output = await readTaskOutput(instance.taskId).catch(() => "");
|
|
577
|
+
const resultSummary = output.trim().slice(0, 1000) || undefined;
|
|
578
|
+
await updateTask(instance.taskId, {
|
|
579
|
+
status: "failed",
|
|
580
|
+
finishedAt: new Date().toISOString(),
|
|
581
|
+
resultSummary,
|
|
582
|
+
}).catch(() => { });
|
|
583
|
+
// Persist to episodic memory
|
|
584
|
+
const task = await readTask(instance.taskId).catch(() => null);
|
|
585
|
+
if (task) {
|
|
586
|
+
rememberTaskOutcome({ ...task, status: "failed" }, output).catch(() => { });
|
|
587
|
+
}
|
|
588
|
+
logActivity({
|
|
589
|
+
source: "agent",
|
|
590
|
+
summary: `Agent failed (terminal): ${instance.metadata.label}`,
|
|
591
|
+
detail: `${instance.retryCount} retries exhausted, instance ${instance.id}`,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
async maybeRetry(instance) {
|
|
595
|
+
// Guard: prevent duplicate retry scheduling for the same instance.
|
|
596
|
+
// This can happen when monitor poll and driver exit handler both trigger handleExit.
|
|
597
|
+
if (this.retryPending.has(instance.id)) {
|
|
598
|
+
logActivity({
|
|
599
|
+
source: "agent",
|
|
600
|
+
summary: `Retry already pending, skipping duplicate: ${instance.metadata.label}`,
|
|
601
|
+
detail: `Instance ${instance.id}, retryCount=${instance.retryCount}`,
|
|
602
|
+
});
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
const delay = shouldRetry(instance);
|
|
606
|
+
if (delay === null) {
|
|
607
|
+
// Retries exhausted — emit terminal failure for external listeners.
|
|
608
|
+
// handleExit and spawn() skip emitting agent:failed when retry was
|
|
609
|
+
// possible, so this is the terminal notification path.
|
|
610
|
+
const terminalError = instance.error ?? {
|
|
611
|
+
code: ErrorCodes.MAX_RETRIES_EXCEEDED,
|
|
612
|
+
message: `Max retries (${instance.config.maxRetries}) exceeded after ${instance.retryCount} attempts`,
|
|
613
|
+
timestamp: new Date().toISOString(),
|
|
614
|
+
recoverable: false,
|
|
615
|
+
};
|
|
616
|
+
if (instance.retryCount > 0) {
|
|
617
|
+
logActivity({
|
|
618
|
+
source: "agent",
|
|
619
|
+
summary: `Agent max retries exceeded: ${instance.metadata.label}`,
|
|
620
|
+
detail: `${instance.retryCount}/${instance.config.maxRetries} attempts, instance ${instance.id}`,
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
await this.finalizeTerminalFailure(instance, terminalError);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
// Check global retry budget to prevent retry storms when many agents fail at once
|
|
627
|
+
const now = Date.now();
|
|
628
|
+
this.globalRetryTimestamps = this.globalRetryTimestamps.filter((t) => now - t < RuntimeManager.GLOBAL_RETRY_WINDOW_MS);
|
|
629
|
+
if (this.globalRetryTimestamps.length >= this.globalRetryBudget) {
|
|
630
|
+
const budgetError = {
|
|
631
|
+
code: ErrorCodes.MAX_RETRIES_EXCEEDED,
|
|
632
|
+
message: `Global retry budget exhausted: ${this.globalRetryTimestamps.length} retries in ${RuntimeManager.GLOBAL_RETRY_WINDOW_MS / 60_000}min window`,
|
|
633
|
+
timestamp: new Date().toISOString(),
|
|
634
|
+
recoverable: false,
|
|
635
|
+
};
|
|
636
|
+
logActivity({
|
|
637
|
+
source: "agent",
|
|
638
|
+
summary: `Global retry budget exhausted, failing: ${instance.metadata.label}`,
|
|
639
|
+
detail: `${this.globalRetryTimestamps.length}/${this.globalRetryBudget} retries in ${RuntimeManager.GLOBAL_RETRY_WINDOW_MS / 60_000}min, instance ${instance.id}`,
|
|
640
|
+
});
|
|
641
|
+
await this.finalizeTerminalFailure(instance, budgetError);
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
// Mark this instance as having a pending retry
|
|
645
|
+
this.retryPending.add(instance.id);
|
|
646
|
+
this.globalRetryTimestamps.push(now);
|
|
647
|
+
logActivity({
|
|
648
|
+
source: "agent",
|
|
649
|
+
summary: `Agent retrying in ${delay}ms: ${instance.metadata.label}`,
|
|
650
|
+
detail: `Attempt ${instance.retryCount + 1}/${instance.config.maxRetries}, instance ${instance.id}, global retries: ${this.globalRetryTimestamps.length}/${this.globalRetryBudget}`,
|
|
651
|
+
});
|
|
652
|
+
setTimeout(async () => {
|
|
653
|
+
this.retryPending.delete(instance.id);
|
|
654
|
+
let resourcesAllocated = false;
|
|
655
|
+
try {
|
|
656
|
+
const retryEvent = prepareRetry(instance);
|
|
657
|
+
this.bus.emitLifecycle(retryEvent);
|
|
658
|
+
await this.registry.update(instance.id, {
|
|
659
|
+
state: "initializing",
|
|
660
|
+
retryCount: instance.retryCount,
|
|
661
|
+
error: undefined,
|
|
662
|
+
pid: undefined,
|
|
663
|
+
terminatedAt: undefined,
|
|
664
|
+
updatedAt: instance.updatedAt,
|
|
665
|
+
});
|
|
666
|
+
// Re-read the original task for the prompt
|
|
667
|
+
const task = await readTask(instance.taskId).catch(() => null);
|
|
668
|
+
if (task) {
|
|
669
|
+
instance._prompt = task.prompt;
|
|
670
|
+
}
|
|
671
|
+
// Re-allocate and spawn
|
|
672
|
+
if (!this.resources.canAllocate(instance.resources)) {
|
|
673
|
+
// Resources unavailable — fail the retry instead of leaving a zombie
|
|
674
|
+
const error = {
|
|
675
|
+
code: ErrorCodes.RESOURCE_EXHAUSTED,
|
|
676
|
+
message: `Resources unavailable for retry attempt ${instance.retryCount}`,
|
|
677
|
+
timestamp: new Date().toISOString(),
|
|
678
|
+
recoverable: false,
|
|
679
|
+
};
|
|
680
|
+
instance.state = "failed";
|
|
681
|
+
instance.error = error;
|
|
682
|
+
instance.updatedAt = new Date().toISOString();
|
|
683
|
+
await this.registry.update(instance.id, {
|
|
684
|
+
state: "failed",
|
|
685
|
+
error,
|
|
686
|
+
updatedAt: instance.updatedAt,
|
|
687
|
+
});
|
|
688
|
+
logActivity({
|
|
689
|
+
source: "agent",
|
|
690
|
+
summary: `Agent retry aborted (resources exhausted): ${instance.metadata.label}`,
|
|
691
|
+
detail: `Attempt ${instance.retryCount}/${instance.config.maxRetries}, instance ${instance.id}`,
|
|
692
|
+
});
|
|
693
|
+
await this.finalizeTerminalFailure(instance, error);
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
this.resources.allocate(instance.id, instance.resources);
|
|
697
|
+
resourcesAllocated = true;
|
|
698
|
+
const pid = await this.driver.spawn(instance);
|
|
699
|
+
instance.pid = pid;
|
|
700
|
+
const runEvent = transition(instance, "running", "Retry spawned");
|
|
701
|
+
await this.registry.update(instance.id, {
|
|
702
|
+
state: "running",
|
|
703
|
+
pid,
|
|
704
|
+
updatedAt: instance.updatedAt,
|
|
705
|
+
});
|
|
706
|
+
this.bus.emitLifecycle(runEvent);
|
|
707
|
+
this.bus.emitSpawned(instance.id, pid);
|
|
708
|
+
logActivity({
|
|
709
|
+
source: "agent",
|
|
710
|
+
summary: `Agent retry spawned: ${instance.metadata.label}`,
|
|
711
|
+
detail: `Attempt ${instance.retryCount}/${instance.config.maxRetries}, PID ${pid}, instance ${instance.id}`,
|
|
712
|
+
});
|
|
713
|
+
if ("onExit" in this.driver && typeof this.driver.onExit === "function") {
|
|
714
|
+
this.driver
|
|
715
|
+
.onExit(instance.id, (code) => this.handleExit(instance.id, code));
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
catch (err) {
|
|
719
|
+
// Clean up on retry failure: release resources and fail the instance
|
|
720
|
+
// to prevent zombie agents stuck in "initializing" forever
|
|
721
|
+
if (resourcesAllocated) {
|
|
722
|
+
this.resources.release(instance.id);
|
|
723
|
+
}
|
|
724
|
+
const error = {
|
|
725
|
+
code: ErrorCodes.SPAWN_FAILED,
|
|
726
|
+
message: `Retry spawn failed: ${err.message}`,
|
|
727
|
+
timestamp: new Date().toISOString(),
|
|
728
|
+
recoverable: false,
|
|
729
|
+
};
|
|
730
|
+
instance.state = "failed";
|
|
731
|
+
instance.error = error;
|
|
732
|
+
instance.updatedAt = new Date().toISOString();
|
|
733
|
+
await this.registry.update(instance.id, {
|
|
734
|
+
state: "failed",
|
|
735
|
+
error,
|
|
736
|
+
updatedAt: instance.updatedAt,
|
|
737
|
+
}).catch(() => { });
|
|
738
|
+
logActivity({
|
|
739
|
+
source: "agent",
|
|
740
|
+
summary: `Agent retry spawn failed: ${instance.metadata.label}`,
|
|
741
|
+
detail: `Attempt ${instance.retryCount}/${instance.config.maxRetries}: ${err.message}, instance ${instance.id}`,
|
|
742
|
+
});
|
|
743
|
+
await this.finalizeTerminalFailure(instance, error);
|
|
744
|
+
}
|
|
745
|
+
}, delay);
|
|
746
|
+
}
|
|
747
|
+
// -------------------------------------------------------------------------
|
|
748
|
+
// Internal: recovery on startup
|
|
749
|
+
// -------------------------------------------------------------------------
|
|
750
|
+
async recoverAgents() {
|
|
751
|
+
const instances = this.registry.listActive();
|
|
752
|
+
// Skip recovery entirely when there's nothing to recover (cold start)
|
|
753
|
+
if (instances.length === 0) {
|
|
754
|
+
log.info("No active instances to recover");
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
let recovered = 0;
|
|
758
|
+
let marked = 0;
|
|
759
|
+
// Separate alive, dead, and initializing instances for parallel recovery
|
|
760
|
+
const alive = [];
|
|
761
|
+
const dead = [];
|
|
762
|
+
const initializing = [];
|
|
763
|
+
for (const instance of instances) {
|
|
764
|
+
if (instance.state === "running" || instance.state === "resuming") {
|
|
765
|
+
if (this.driver.isAlive(instance)) {
|
|
766
|
+
alive.push(instance);
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
dead.push(instance);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
else if (instance.state === "initializing") {
|
|
773
|
+
initializing.push(instance);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
// Count alive agents (no I/O needed)
|
|
777
|
+
recovered = alive.length;
|
|
778
|
+
for (const instance of alive) {
|
|
779
|
+
logActivity({
|
|
780
|
+
source: "agent",
|
|
781
|
+
summary: `Recovered running agent: ${instance.metadata.label}`,
|
|
782
|
+
detail: `PID ${instance.pid} still alive`,
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
// Recover dead agents in parallel (each reads task output)
|
|
786
|
+
if (dead.length > 0) {
|
|
787
|
+
marked += dead.length;
|
|
788
|
+
await Promise.all(dead.map(async (instance) => {
|
|
789
|
+
const output = await readTaskOutput(instance.taskId).catch(() => "");
|
|
790
|
+
const hasOutput = output.trim().length > 0;
|
|
791
|
+
const finalState = hasOutput ? "completed" : "failed";
|
|
792
|
+
if (hasOutput) {
|
|
793
|
+
transition(instance, "completed", "Recovered after restart");
|
|
794
|
+
}
|
|
795
|
+
else {
|
|
796
|
+
const error = {
|
|
797
|
+
code: ErrorCodes.DRIVER_ERROR,
|
|
798
|
+
message: "Process died while runtime was down",
|
|
799
|
+
timestamp: new Date().toISOString(),
|
|
800
|
+
recoverable: false,
|
|
801
|
+
};
|
|
802
|
+
transition(instance, "failed", "Died during downtime", error);
|
|
803
|
+
}
|
|
804
|
+
await this.registry.update(instance.id, {
|
|
805
|
+
state: instance.state,
|
|
806
|
+
error: instance.error,
|
|
807
|
+
terminatedAt: instance.terminatedAt,
|
|
808
|
+
updatedAt: instance.updatedAt,
|
|
809
|
+
});
|
|
810
|
+
logActivity({
|
|
811
|
+
source: "agent",
|
|
812
|
+
summary: `Recovered ${finalState} agent: ${instance.metadata.label}`,
|
|
813
|
+
detail: `PID ${instance.pid} was dead`,
|
|
814
|
+
});
|
|
815
|
+
}));
|
|
816
|
+
}
|
|
817
|
+
// Recover initializing agents in parallel
|
|
818
|
+
if (initializing.length > 0) {
|
|
819
|
+
marked += initializing.length;
|
|
820
|
+
await Promise.all(initializing.map(async (instance) => {
|
|
821
|
+
const error = {
|
|
822
|
+
code: ErrorCodes.DRIVER_ERROR,
|
|
823
|
+
message: "Runtime restarted during initialization",
|
|
824
|
+
timestamp: new Date().toISOString(),
|
|
825
|
+
recoverable: true,
|
|
826
|
+
};
|
|
827
|
+
transition(instance, "failed", "Runtime restarted", error);
|
|
828
|
+
await this.registry.update(instance.id, {
|
|
829
|
+
state: "failed",
|
|
830
|
+
error,
|
|
831
|
+
updatedAt: instance.updatedAt,
|
|
832
|
+
});
|
|
833
|
+
await this.maybeRetry(instance);
|
|
834
|
+
}));
|
|
835
|
+
}
|
|
836
|
+
if (recovered > 0 || marked > 0) {
|
|
837
|
+
logActivity({
|
|
838
|
+
source: "agent",
|
|
839
|
+
summary: `Runtime recovery: ${recovered} alive, ${marked} resolved`,
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
// -------------------------------------------------------------------------
|
|
844
|
+
// Internal: monitoring
|
|
845
|
+
// -------------------------------------------------------------------------
|
|
846
|
+
startMonitor() {
|
|
847
|
+
if (this.monitorTimer)
|
|
848
|
+
return;
|
|
849
|
+
this.monitorTimer = setInterval(() => {
|
|
850
|
+
this.monitorCycle().catch((err) => {
|
|
851
|
+
logActivity({
|
|
852
|
+
source: "agent",
|
|
853
|
+
summary: "Runtime monitor error",
|
|
854
|
+
detail: err.message,
|
|
855
|
+
});
|
|
856
|
+
});
|
|
857
|
+
}, this.config.monitorIntervalMs);
|
|
858
|
+
}
|
|
859
|
+
stopMonitor() {
|
|
860
|
+
if (this.monitorTimer) {
|
|
861
|
+
clearInterval(this.monitorTimer);
|
|
862
|
+
this.monitorTimer = null;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
async monitorCycle() {
|
|
866
|
+
const running = this.registry.list({ state: "running" });
|
|
867
|
+
for (const instance of running) {
|
|
868
|
+
// Skip instances with pending retries or active handleExit processing
|
|
869
|
+
// to prevent concurrent exit handling that causes duplicate retry scheduling
|
|
870
|
+
if (this.retryPending.has(instance.id) || this.handleExitGuard.has(instance.id)) {
|
|
871
|
+
continue;
|
|
872
|
+
}
|
|
873
|
+
if (!this.driver.isAlive(instance)) {
|
|
874
|
+
// Process died without triggering exit handler (recovered PID)
|
|
875
|
+
await this.handleExit(instance.id, null);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
// Emit resource warning if nearing capacity
|
|
879
|
+
const snapshot = this.resources.snapshot();
|
|
880
|
+
const agentRatio = snapshot.activeAgents / snapshot.maxAgents;
|
|
881
|
+
const memoryRatio = snapshot.totalMemoryMB / snapshot.maxMemoryMB;
|
|
882
|
+
if (agentRatio > 0.8 || memoryRatio > 0.8) {
|
|
883
|
+
this.bus.emitResourceWarning(snapshot);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
// -------------------------------------------------------------------------
|
|
887
|
+
// Helpers
|
|
888
|
+
// -------------------------------------------------------------------------
|
|
889
|
+
requireInstance(id) {
|
|
890
|
+
const instance = this.registry.get(id);
|
|
891
|
+
if (!instance) {
|
|
892
|
+
throw new RuntimeError(ErrorCodes.AGENT_NOT_FOUND, `Agent instance not found: ${id}`);
|
|
893
|
+
}
|
|
894
|
+
return instance;
|
|
895
|
+
}
|
|
896
|
+
assertState(instance, expected) {
|
|
897
|
+
if (instance.state !== expected) {
|
|
898
|
+
throw new RuntimeError(ErrorCodes.INVALID_TRANSITION, `Expected agent state '${expected}', got '${instance.state}'`, false, { agentId: instance.id, actual: instance.state, expected });
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Detect deterministic failures that won't succeed on retry.
|
|
903
|
+
* Checks output for patterns like TypeScript errors, missing modules, etc.
|
|
904
|
+
* A broader pattern set prevents wasting retry budget on non-recoverable errors.
|
|
905
|
+
*/
|
|
906
|
+
isDeterministicFailure(output, code) {
|
|
907
|
+
// null exit code = signal/OOM — worth retrying
|
|
908
|
+
if (code === null)
|
|
909
|
+
return false;
|
|
910
|
+
// Check output for patterns that indicate a deterministic failure
|
|
911
|
+
const tail = output.slice(-3000);
|
|
912
|
+
const deterministicPatterns = [
|
|
913
|
+
/error TS\d+:/i, // TypeScript compilation errors
|
|
914
|
+
/SyntaxError:/, // JS/TS syntax errors
|
|
915
|
+
/Cannot find module/, // Missing module (won't appear on retry)
|
|
916
|
+
/Module not found/, // Same
|
|
917
|
+
/ENOENT.*no such file/i, // Missing file
|
|
918
|
+
/Permission denied/i, // Permission issues (won't self-resolve)
|
|
919
|
+
/EACCES/, // Access denied (filesystem)
|
|
920
|
+
/ENOSPC/i, // Disk full
|
|
921
|
+
/Invalid API key/i, // Auth errors (won't self-resolve)
|
|
922
|
+
/authentication failed/i, // Auth errors
|
|
923
|
+
/unauthorized/i, // 401 errors
|
|
924
|
+
/forbidden/i, // 403 errors
|
|
925
|
+
/ 402[:\s]/, // Payment required (insufficient credits)
|
|
926
|
+
/insufficient.credits/i, // OpenRouter credit exhaustion
|
|
927
|
+
/payment.required/i, // Billing errors
|
|
928
|
+
/out of.*credits/i, // Credit exhaustion variant
|
|
929
|
+
/can'?t afford/i, // OpenRouter "can't afford" message
|
|
930
|
+
/ERR_INVALID_ARG_TYPE/, // Programming error
|
|
931
|
+
/TypeError:.*is not a function/, // Programming error
|
|
932
|
+
/ReferenceError:/, // Undefined variable
|
|
933
|
+
/ENOMEM/i, // Out of memory (system-level)
|
|
934
|
+
];
|
|
935
|
+
return deterministicPatterns.some((pattern) => pattern.test(tail));
|
|
936
|
+
}
|
|
937
|
+
toAgentError(err, code, recoverable) {
|
|
938
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
939
|
+
return {
|
|
940
|
+
code,
|
|
941
|
+
message,
|
|
942
|
+
timestamp: new Date().toISOString(),
|
|
943
|
+
recoverable,
|
|
944
|
+
};
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
//# sourceMappingURL=manager.js.map
|