@roj-ai/sdk 0.1.35 → 0.2.1
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/dist/bootstrap.d.ts +420 -26
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +55 -24
- package/dist/bootstrap.js.map +1 -1
- package/dist/bun-platform/fs.d.ts.map +1 -1
- package/dist/bun-platform/fs.js +1 -0
- package/dist/bun-platform/fs.js.map +1 -1
- package/dist/bun-platform/index.d.ts +4 -1
- package/dist/bun-platform/index.d.ts.map +1 -1
- package/dist/bun-platform/index.js +7 -1
- package/dist/bun-platform/index.js.map +1 -1
- package/dist/bun-platform/server-lifecycle.d.ts +30 -0
- package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
- package/dist/bun-platform/server-lifecycle.js +182 -0
- package/dist/bun-platform/server-lifecycle.js.map +1 -0
- package/dist/bun-platform/shell.d.ts +33 -0
- package/dist/bun-platform/shell.d.ts.map +1 -0
- package/dist/bun-platform/shell.js +322 -0
- package/dist/bun-platform/shell.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agents/agent.d.ts +42 -7
- package/dist/core/agents/agent.d.ts.map +1 -1
- package/dist/core/agents/agent.js +209 -90
- package/dist/core/agents/agent.js.map +1 -1
- package/dist/core/agents/config.d.ts +8 -1
- package/dist/core/agents/config.d.ts.map +1 -1
- package/dist/core/agents/config.js +5 -1
- package/dist/core/agents/config.js.map +1 -1
- package/dist/core/agents/retry.d.ts +1 -1
- package/dist/core/agents/retry.d.ts.map +1 -1
- package/dist/core/agents/retry.js +14 -16
- package/dist/core/agents/retry.js.map +1 -1
- package/dist/core/agents/state.d.ts +27 -1
- package/dist/core/agents/state.d.ts.map +1 -1
- package/dist/core/agents/state.js +1 -1
- package/dist/core/agents/state.js.map +1 -1
- package/dist/core/context/state.d.ts +3 -3
- package/dist/core/context/state.d.ts.map +1 -1
- package/dist/core/context/state.js +6 -2
- package/dist/core/context/state.js.map +1 -1
- package/dist/core/events/base-event-store.d.ts.map +1 -1
- package/dist/core/events/base-event-store.js +22 -14
- package/dist/core/events/base-event-store.js.map +1 -1
- package/dist/core/events/file.d.ts +39 -1
- package/dist/core/events/file.d.ts.map +1 -1
- package/dist/core/events/file.js +159 -20
- package/dist/core/events/file.js.map +1 -1
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/file-store/containment.d.ts +19 -0
- package/dist/core/file-store/containment.d.ts.map +1 -0
- package/dist/core/file-store/containment.js +62 -0
- package/dist/core/file-store/containment.js.map +1 -0
- package/dist/core/file-store/file-store.d.ts +22 -2
- package/dist/core/file-store/file-store.d.ts.map +1 -1
- package/dist/core/file-store/file-store.js +88 -20
- package/dist/core/file-store/file-store.js.map +1 -1
- package/dist/core/file-store/types.d.ts +13 -1
- package/dist/core/file-store/types.d.ts.map +1 -1
- package/dist/core/image/image-processor.d.ts.map +1 -1
- package/dist/core/image/image-processor.js +3 -1
- package/dist/core/image/image-processor.js.map +1 -1
- package/dist/core/image/types.d.ts +2 -0
- package/dist/core/image/types.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.js +81 -33
- package/dist/core/image/vips-resizer.js.map +1 -1
- package/dist/core/llm/anthropic.d.ts +0 -1
- package/dist/core/llm/anthropic.d.ts.map +1 -1
- package/dist/core/llm/anthropic.js +101 -74
- package/dist/core/llm/anthropic.js.map +1 -1
- package/dist/core/llm/logger.d.ts +14 -2
- package/dist/core/llm/logger.d.ts.map +1 -1
- package/dist/core/llm/logger.js +161 -36
- package/dist/core/llm/logger.js.map +1 -1
- package/dist/core/llm/openrouter.d.ts +0 -1
- package/dist/core/llm/openrouter.d.ts.map +1 -1
- package/dist/core/llm/openrouter.js +70 -74
- package/dist/core/llm/openrouter.js.map +1 -1
- package/dist/core/llm/provider-request.d.ts +10 -0
- package/dist/core/llm/provider-request.d.ts.map +1 -0
- package/dist/core/llm/provider-request.js +41 -0
- package/dist/core/llm/provider-request.js.map +1 -0
- package/dist/core/llm/provider.d.ts +45 -3
- package/dist/core/llm/provider.d.ts.map +1 -1
- package/dist/core/llm/provider.js +26 -0
- package/dist/core/llm/provider.js.map +1 -1
- package/dist/core/llm/state.d.ts +4 -2
- package/dist/core/llm/state.d.ts.map +1 -1
- package/dist/core/llm/state.js +15 -4
- package/dist/core/llm/state.js.map +1 -1
- package/dist/core/plugins/plugin-builder.d.ts +57 -3
- package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
- package/dist/core/plugins/plugin-builder.js +68 -14
- package/dist/core/plugins/plugin-builder.js.map +1 -1
- package/dist/core/preset/preset-builder.d.ts +3 -2
- package/dist/core/preset/preset-builder.d.ts.map +1 -1
- package/dist/core/preset/preset-builder.js +7 -16
- package/dist/core/preset/preset-builder.js.map +1 -1
- package/dist/core/sessions/context.d.ts +23 -5
- package/dist/core/sessions/context.d.ts.map +1 -1
- package/dist/core/sessions/runtime-activity.d.ts +33 -0
- package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
- package/dist/core/sessions/runtime-activity.js +55 -0
- package/dist/core/sessions/runtime-activity.js.map +1 -0
- package/dist/core/sessions/schema.d.ts +23 -2
- package/dist/core/sessions/schema.d.ts.map +1 -1
- package/dist/core/sessions/schema.js +24 -3
- package/dist/core/sessions/schema.js.map +1 -1
- package/dist/core/sessions/session-manager.d.ts +83 -6
- package/dist/core/sessions/session-manager.d.ts.map +1 -1
- package/dist/core/sessions/session-manager.js +517 -118
- package/dist/core/sessions/session-manager.js.map +1 -1
- package/dist/core/sessions/session-store.d.ts +18 -0
- package/dist/core/sessions/session-store.d.ts.map +1 -1
- package/dist/core/sessions/session-store.js +33 -0
- package/dist/core/sessions/session-store.js.map +1 -1
- package/dist/core/sessions/session.d.ts +42 -6
- package/dist/core/sessions/session.d.ts.map +1 -1
- package/dist/core/sessions/session.js +176 -44
- package/dist/core/sessions/session.js.map +1 -1
- package/dist/core/sessions/state.d.ts +10 -1
- package/dist/core/sessions/state.d.ts.map +1 -1
- package/dist/core/sessions/state.js +16 -1
- package/dist/core/sessions/state.js.map +1 -1
- package/dist/core/system.d.ts +9 -0
- package/dist/core/system.d.ts.map +1 -1
- package/dist/core/system.js +4 -1
- package/dist/core/system.js.map +1 -1
- package/dist/core/tools/executor.d.ts +1 -1
- package/dist/core/wake-key.d.ts +34 -0
- package/dist/core/wake-key.d.ts.map +1 -0
- package/dist/core/wake-key.js +51 -0
- package/dist/core/wake-key.js.map +1 -0
- package/dist/index.d.ts +24 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/archive/archive-inspection.d.ts +48 -0
- package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
- package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
- package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
- package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
- package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
- package/dist/lib/archive/archive-inspection.js +253 -0
- package/dist/lib/archive/archive-inspection.js.map +1 -0
- package/dist/lib/archive/index.d.ts +3 -0
- package/dist/lib/archive/index.d.ts.map +1 -0
- package/dist/lib/archive/index.js +2 -0
- package/dist/lib/archive/index.js.map +1 -0
- package/dist/lib/logger/console.d.ts +5 -12
- package/dist/lib/logger/console.d.ts.map +1 -1
- package/dist/lib/logger/console.js +5 -47
- package/dist/lib/logger/console.js.map +1 -1
- package/dist/lib/logger/file.d.ts +8 -11
- package/dist/lib/logger/file.d.ts.map +1 -1
- package/dist/lib/logger/file.js +26 -37
- package/dist/lib/logger/file.js.map +1 -1
- package/dist/lib/logger/index.d.ts +3 -1
- package/dist/lib/logger/index.d.ts.map +1 -1
- package/dist/lib/logger/index.js +3 -1
- package/dist/lib/logger/index.js.map +1 -1
- package/dist/lib/logger/jsonl.d.ts +21 -0
- package/dist/lib/logger/jsonl.d.ts.map +1 -0
- package/dist/lib/logger/jsonl.js +29 -0
- package/dist/lib/logger/jsonl.js.map +1 -0
- package/dist/lib/logger/logger.d.ts +22 -0
- package/dist/lib/logger/logger.d.ts.map +1 -1
- package/dist/lib/logger/logger.js +37 -0
- package/dist/lib/logger/logger.js.map +1 -1
- package/dist/lib/logger/session-log.d.ts +21 -0
- package/dist/lib/logger/session-log.d.ts.map +1 -0
- package/dist/lib/logger/session-log.js +37 -0
- package/dist/lib/logger/session-log.js.map +1 -0
- package/dist/lib/utils/concurrency.d.ts +1 -1
- package/dist/lib/utils/concurrency.d.ts.map +1 -1
- package/dist/lib/utils/concurrency.js +30 -7
- package/dist/lib/utils/concurrency.js.map +1 -1
- package/dist/lib/utils/fs-batch.d.ts +17 -0
- package/dist/lib/utils/fs-batch.d.ts.map +1 -0
- package/dist/lib/utils/fs-batch.js +38 -0
- package/dist/lib/utils/fs-batch.js.map +1 -0
- package/dist/lib/utils/result.d.ts +7 -22
- package/dist/lib/utils/result.d.ts.map +1 -1
- package/dist/lib/utils/result.js +6 -17
- package/dist/lib/utils/result.js.map +1 -1
- package/dist/lib/utils/sleep.d.ts +10 -0
- package/dist/lib/utils/sleep.d.ts.map +1 -0
- package/dist/lib/utils/sleep.js +26 -0
- package/dist/lib/utils/sleep.js.map +1 -0
- package/dist/platform/fs-revision.d.ts +21 -0
- package/dist/platform/fs-revision.d.ts.map +1 -0
- package/dist/platform/fs-revision.js +9 -0
- package/dist/platform/fs-revision.js.map +1 -0
- package/dist/platform/fs.d.ts +104 -1
- package/dist/platform/fs.d.ts.map +1 -1
- package/dist/platform/git.d.ts +59 -0
- package/dist/platform/git.d.ts.map +1 -0
- package/dist/platform/git.js +8 -0
- package/dist/platform/git.js.map +1 -0
- package/dist/platform/index.d.ts +40 -1
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +1 -1
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/llm-call-log.d.ts +80 -0
- package/dist/platform/llm-call-log.d.ts.map +1 -0
- package/dist/platform/llm-call-log.js +12 -0
- package/dist/platform/llm-call-log.js.map +1 -0
- package/dist/platform/scheduler.d.ts +32 -0
- package/dist/platform/scheduler.d.ts.map +1 -0
- package/dist/platform/scheduler.js +46 -0
- package/dist/platform/scheduler.js.map +1 -0
- package/dist/platform/session-log.d.ts +36 -0
- package/dist/platform/session-log.d.ts.map +1 -0
- package/dist/platform/session-log.js +12 -0
- package/dist/platform/session-log.js.map +1 -0
- package/dist/platform/shell.d.ts +83 -0
- package/dist/platform/shell.d.ts.map +1 -0
- package/dist/platform/shell.js +13 -0
- package/dist/platform/shell.js.map +1 -0
- package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
- package/dist/plugins/agent-status/plugin.js +1 -0
- package/dist/plugins/agent-status/plugin.js.map +1 -1
- package/dist/plugins/agents/plugin.d.ts.map +1 -1
- package/dist/plugins/agents/plugin.js +129 -62
- package/dist/plugins/agents/plugin.js.map +1 -1
- package/dist/plugins/filesystem/listing.d.ts +3 -0
- package/dist/plugins/filesystem/listing.d.ts.map +1 -1
- package/dist/plugins/filesystem/listing.js +66 -10
- package/dist/plugins/filesystem/listing.js.map +1 -1
- package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
- package/dist/plugins/filesystem/plugin.js +8 -6
- package/dist/plugins/filesystem/plugin.js.map +1 -1
- package/dist/plugins/git-status/plugin.d.ts +34 -7
- package/dist/plugins/git-status/plugin.d.ts.map +1 -1
- package/dist/plugins/git-status/plugin.js +168 -64
- package/dist/plugins/git-status/plugin.js.map +1 -1
- package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
- package/dist/plugins/llm-debug/plugin.js +1 -0
- package/dist/plugins/llm-debug/plugin.js.map +1 -1
- package/dist/plugins/logs/plugin.d.ts +1 -4
- package/dist/plugins/logs/plugin.d.ts.map +1 -1
- package/dist/plugins/logs/plugin.js +7 -0
- package/dist/plugins/logs/plugin.js.map +1 -1
- package/dist/plugins/mailbox/helpers.d.ts +2 -2
- package/dist/plugins/mailbox/helpers.js +1 -1
- package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
- package/dist/plugins/mailbox/plugin.js +38 -43
- package/dist/plugins/mailbox/plugin.js.map +1 -1
- package/dist/plugins/mailbox/query.d.ts +7 -2
- package/dist/plugins/mailbox/query.d.ts.map +1 -1
- package/dist/plugins/mailbox/query.js +14 -7
- package/dist/plugins/mailbox/query.js.map +1 -1
- package/dist/plugins/mailbox/state.d.ts +5 -4
- package/dist/plugins/mailbox/state.d.ts.map +1 -1
- package/dist/plugins/mailbox/state.js +6 -5
- package/dist/plugins/mailbox/state.js.map +1 -1
- package/dist/plugins/resources/filename.d.ts +4 -0
- package/dist/plugins/resources/filename.d.ts.map +1 -0
- package/dist/plugins/resources/filename.js +18 -0
- package/dist/plugins/resources/filename.js.map +1 -0
- package/dist/plugins/resources/plugin.d.ts +3 -0
- package/dist/plugins/resources/plugin.d.ts.map +1 -1
- package/dist/plugins/resources/plugin.js +97 -60
- package/dist/plugins/resources/plugin.js.map +1 -1
- package/dist/plugins/resources/state.d.ts +1 -1
- package/dist/plugins/resources/state.js +1 -1
- package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
- package/dist/plugins/result-eviction/plugin.js +6 -1
- package/dist/plugins/result-eviction/plugin.js.map +1 -1
- package/dist/plugins/services/plugin.d.ts +4 -1
- package/dist/plugins/services/plugin.d.ts.map +1 -1
- package/dist/plugins/services/plugin.js +251 -100
- package/dist/plugins/services/plugin.js.map +1 -1
- package/dist/plugins/services/prompt.d.ts.map +1 -1
- package/dist/plugins/services/prompt.js +1 -4
- package/dist/plugins/services/prompt.js.map +1 -1
- package/dist/plugins/services/schema.d.ts +15 -5
- package/dist/plugins/services/schema.d.ts.map +1 -1
- package/dist/plugins/services/service.d.ts +100 -18
- package/dist/plugins/services/service.d.ts.map +1 -1
- package/dist/plugins/services/service.js +680 -230
- package/dist/plugins/services/service.js.map +1 -1
- package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
- package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
- package/dist/plugins/session-lifecycle/plugin.js +53 -40
- package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
- package/dist/plugins/session-state/plugin.d.ts +21 -13
- package/dist/plugins/session-state/plugin.d.ts.map +1 -1
- package/dist/plugins/session-state/plugin.js +214 -79
- package/dist/plugins/session-state/plugin.js.map +1 -1
- package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
- package/dist/plugins/session-stats/plugin.js +1 -0
- package/dist/plugins/session-stats/plugin.js.map +1 -1
- package/dist/plugins/shell/executor.d.ts +17 -15
- package/dist/plugins/shell/executor.d.ts.map +1 -1
- package/dist/plugins/shell/executor.js +130 -195
- package/dist/plugins/shell/executor.js.map +1 -1
- package/dist/plugins/shell/index.d.ts +2 -2
- package/dist/plugins/shell/index.d.ts.map +1 -1
- package/dist/plugins/shell/index.js +2 -2
- package/dist/plugins/shell/index.js.map +1 -1
- package/dist/plugins/shell/plugin.d.ts +5 -4
- package/dist/plugins/shell/plugin.d.ts.map +1 -1
- package/dist/plugins/shell/plugin.js +4 -8
- package/dist/plugins/shell/plugin.js.map +1 -1
- package/dist/plugins/skills/discovery.d.ts.map +1 -1
- package/dist/plugins/skills/discovery.js +10 -8
- package/dist/plugins/skills/discovery.js.map +1 -1
- package/dist/plugins/skills/index.d.ts +1 -1
- package/dist/plugins/skills/index.d.ts.map +1 -1
- package/dist/plugins/skills/plugin.d.ts +1 -1
- package/dist/plugins/skills/plugin.d.ts.map +1 -1
- package/dist/plugins/skills/plugin.js +23 -30
- package/dist/plugins/skills/plugin.js.map +1 -1
- package/dist/plugins/skills/prompts.d.ts +3 -3
- package/dist/plugins/skills/prompts.d.ts.map +1 -1
- package/dist/plugins/skills/prompts.js.map +1 -1
- package/dist/plugins/skills/schema.d.ts +4 -2
- package/dist/plugins/skills/schema.d.ts.map +1 -1
- package/dist/plugins/todo/schema.d.ts +1 -1
- package/dist/plugins/uploads/plugin.d.ts +11 -4
- package/dist/plugins/uploads/plugin.d.ts.map +1 -1
- package/dist/plugins/uploads/plugin.js +891 -225
- package/dist/plugins/uploads/plugin.js.map +1 -1
- package/dist/plugins/uploads/preprocessor.d.ts +14 -0
- package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessor.js +11 -0
- package/dist/plugins/uploads/preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
- package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/schema.d.ts +25 -2
- package/dist/plugins/uploads/schema.d.ts.map +1 -1
- package/dist/plugins/uploads/schema.js +24 -3
- package/dist/plugins/uploads/schema.js.map +1 -1
- package/dist/plugins/uploads/state.d.ts +13 -1
- package/dist/plugins/uploads/state.d.ts.map +1 -1
- package/dist/plugins/uploads/state.js +4 -1
- package/dist/plugins/uploads/state.js.map +1 -1
- package/dist/plugins/user-chat/plugin.d.ts +12 -5
- package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
- package/dist/plugins/user-chat/plugin.js +141 -32
- package/dist/plugins/user-chat/plugin.js.map +1 -1
- package/dist/plugins/workers/context.d.ts +35 -13
- package/dist/plugins/workers/context.d.ts.map +1 -1
- package/dist/plugins/workers/context.js +82 -32
- package/dist/plugins/workers/context.js.map +1 -1
- package/dist/plugins/workers/definition.d.ts +7 -0
- package/dist/plugins/workers/definition.d.ts.map +1 -1
- package/dist/plugins/workers/definition.js.map +1 -1
- package/dist/plugins/workers/index.d.ts +4 -4
- package/dist/plugins/workers/index.d.ts.map +1 -1
- package/dist/plugins/workers/index.js +2 -2
- package/dist/plugins/workers/index.js.map +1 -1
- package/dist/plugins/workers/plugin.d.ts +10 -57
- package/dist/plugins/workers/plugin.d.ts.map +1 -1
- package/dist/plugins/workers/plugin.js +385 -123
- package/dist/plugins/workers/plugin.js.map +1 -1
- package/dist/plugins/workers/state.d.ts +69 -0
- package/dist/plugins/workers/state.d.ts.map +1 -0
- package/dist/plugins/workers/state.js +52 -0
- package/dist/plugins/workers/state.js.map +1 -0
- package/dist/plugins/workers/worker.d.ts +15 -4
- package/dist/plugins/workers/worker.d.ts.map +1 -1
- package/dist/testing/conformance.d.ts +106 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +1463 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/node-platform.d.ts.map +1 -1
- package/dist/testing/node-platform.js +5 -0
- package/dist/testing/node-platform.js.map +1 -1
- package/dist/testing/test-harness.d.ts +11 -1
- package/dist/testing/test-harness.d.ts.map +1 -1
- package/dist/testing/test-harness.js +17 -37
- package/dist/testing/test-harness.js.map +1 -1
- package/dist/testing/wait-helpers.d.ts.map +1 -1
- package/dist/testing/wait-helpers.js +1 -3
- package/dist/testing/wait-helpers.js.map +1 -1
- package/dist/transport/adapter/client-adapter.d.ts +6 -0
- package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
- package/dist/transport/adapter/client-adapter.js +50 -3
- package/dist/transport/adapter/client-adapter.js.map +1 -1
- package/dist/transport/adapter/heartbeat.d.ts +16 -0
- package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
- package/dist/transport/adapter/heartbeat.js +41 -0
- package/dist/transport/adapter/heartbeat.js.map +1 -0
- package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
- package/dist/transport/adapter/server-adapter.js +6 -0
- package/dist/transport/adapter/server-adapter.js.map +1 -1
- package/dist/transport/http/app.d.ts +3 -30
- package/dist/transport/http/app.d.ts.map +1 -1
- package/dist/transport/http/app.js +3 -7
- package/dist/transport/http/app.js.map +1 -1
- package/dist/transport/http/context.d.ts +40 -0
- package/dist/transport/http/context.d.ts.map +1 -0
- package/dist/transport/http/context.js +17 -0
- package/dist/transport/http/context.js.map +1 -0
- package/dist/transport/http/fetch-guard.d.ts +49 -0
- package/dist/transport/http/fetch-guard.d.ts.map +1 -0
- package/dist/transport/http/fetch-guard.js +312 -0
- package/dist/transport/http/fetch-guard.js.map +1 -0
- package/dist/transport/http/index.d.ts +1 -1
- package/dist/transport/http/index.d.ts.map +1 -1
- package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
- package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
- package/dist/transport/http/middleware/error-handler.d.ts +2 -2
- package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
- package/dist/transport/http/path-containment.d.ts +20 -0
- package/dist/transport/http/path-containment.d.ts.map +1 -0
- package/dist/transport/http/path-containment.js +31 -0
- package/dist/transport/http/path-containment.js.map +1 -0
- package/dist/transport/http/responses.d.ts +30 -0
- package/dist/transport/http/responses.d.ts.map +1 -0
- package/dist/transport/http/responses.js +5 -0
- package/dist/transport/http/responses.js.map +1 -0
- package/dist/transport/http/routes/files.d.ts +1 -1
- package/dist/transport/http/routes/files.d.ts.map +1 -1
- package/dist/transport/http/routes/files.js +54 -155
- package/dist/transport/http/routes/files.js.map +1 -1
- package/dist/transport/http/routes/resources.d.ts +1 -1
- package/dist/transport/http/routes/resources.d.ts.map +1 -1
- package/dist/transport/http/routes/resources.js +92 -57
- package/dist/transport/http/routes/resources.js.map +1 -1
- package/dist/transport/http/routes/rpc.d.ts +6 -1
- package/dist/transport/http/routes/rpc.d.ts.map +1 -1
- package/dist/transport/http/routes/rpc.js +51 -21
- package/dist/transport/http/routes/rpc.js.map +1 -1
- package/dist/transport/http/routes/upload.d.ts +1 -1
- package/dist/transport/http/routes/upload.d.ts.map +1 -1
- package/dist/transport/http/routes/upload.js +256 -169
- package/dist/transport/http/routes/upload.js.map +1 -1
- package/dist/user-config.d.ts +34 -7
- package/dist/user-config.d.ts.map +1 -1
- package/dist/user-config.js +71 -0
- package/dist/user-config.js.map +1 -1
- package/package.json +18 -8
- package/src/bootstrap.ts +119 -35
- package/src/bun-platform/fs.ts +1 -0
- package/src/bun-platform/index.ts +18 -1
- package/src/bun-platform/server-lifecycle.ts +218 -0
- package/src/bun-platform/shell.ts +362 -0
- package/src/config.ts +130 -0
- package/src/core/agents/agent.ts +219 -95
- package/src/core/agents/config.ts +8 -0
- package/src/core/agents/retry.ts +16 -17
- package/src/core/agents/state.ts +28 -0
- package/src/core/context/state.ts +4 -0
- package/src/core/events/base-event-store.ts +24 -16
- package/src/core/events/file.ts +198 -22
- package/src/core/file-store/containment.ts +75 -0
- package/src/core/file-store/file-store.ts +106 -25
- package/src/core/file-store/types.ts +14 -1
- package/src/core/image/image-processor.ts +3 -1
- package/src/core/image/types.ts +2 -0
- package/src/core/image/vips-resizer.ts +102 -37
- package/src/core/llm/anthropic.ts +127 -82
- package/src/core/llm/logger.ts +175 -37
- package/src/core/llm/openrouter.ts +82 -81
- package/src/core/llm/provider-request.ts +40 -0
- package/src/core/llm/provider.ts +72 -3
- package/src/core/llm/state.ts +12 -0
- package/src/core/plugins/plugin-builder.ts +106 -14
- package/src/core/preset/preset-builder.ts +12 -22
- package/src/core/sessions/context.ts +18 -0
- package/src/core/sessions/runtime-activity.ts +78 -0
- package/src/core/sessions/schema.ts +29 -3
- package/src/core/sessions/session-manager.ts +560 -140
- package/src/core/sessions/session-store.ts +38 -0
- package/src/core/sessions/session.ts +187 -47
- package/src/core/sessions/state.ts +16 -0
- package/src/core/system.ts +15 -0
- package/src/core/wake-key.ts +65 -0
- package/src/index.ts +31 -12
- package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
- package/src/lib/archive/archive-inspection.ts +359 -0
- package/src/lib/archive/index.ts +17 -0
- package/src/lib/logger/console.ts +7 -57
- package/src/lib/logger/file.ts +28 -50
- package/src/lib/logger/index.ts +3 -1
- package/src/lib/logger/jsonl.ts +36 -0
- package/src/lib/logger/logger.ts +48 -0
- package/src/lib/logger/session-log.ts +42 -0
- package/src/lib/utils/concurrency.ts +37 -8
- package/src/lib/utils/fs-batch.ts +49 -0
- package/src/lib/utils/result.ts +7 -31
- package/src/lib/utils/sleep.ts +23 -0
- package/src/platform/fs-revision.ts +21 -0
- package/src/platform/fs.ts +109 -1
- package/src/platform/git.ts +67 -0
- package/src/platform/index.ts +51 -1
- package/src/platform/llm-call-log.ts +86 -0
- package/src/platform/scheduler.ts +71 -0
- package/src/platform/session-log.ts +39 -0
- package/src/platform/shell.ts +89 -0
- package/src/plugins/agent-status/plugin.ts +1 -0
- package/src/plugins/agents/plugin.ts +134 -81
- package/src/plugins/filesystem/listing.ts +70 -12
- package/src/plugins/filesystem/plugin.ts +8 -6
- package/src/plugins/git-status/plugin.ts +204 -77
- package/src/plugins/llm-debug/plugin.ts +1 -0
- package/src/plugins/logs/plugin.ts +9 -0
- package/src/plugins/mailbox/plugin.ts +46 -64
- package/src/plugins/mailbox/query.ts +15 -7
- package/src/plugins/mailbox/state.ts +1 -0
- package/src/plugins/resources/filename.ts +19 -0
- package/src/plugins/resources/plugin.ts +111 -59
- package/src/plugins/result-eviction/plugin.ts +6 -1
- package/src/plugins/services/plugin.ts +254 -98
- package/src/plugins/services/prompt.ts +1 -6
- package/src/plugins/services/schema.ts +17 -3
- package/src/plugins/services/service.ts +702 -252
- package/src/plugins/session-lifecycle/plugin.ts +56 -41
- package/src/plugins/session-state/plugin.ts +242 -88
- package/src/plugins/session-stats/plugin.ts +1 -0
- package/src/plugins/shell/executor.ts +144 -226
- package/src/plugins/shell/index.ts +1 -4
- package/src/plugins/shell/plugin.ts +7 -9
- package/src/plugins/skills/discovery.ts +10 -8
- package/src/plugins/skills/index.ts +1 -1
- package/src/plugins/skills/plugin.ts +19 -27
- package/src/plugins/skills/prompts.ts +3 -3
- package/src/plugins/skills/schema.ts +5 -2
- package/src/plugins/uploads/plugin.ts +991 -273
- package/src/plugins/uploads/preprocessor.ts +25 -0
- package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
- package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
- package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
- package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
- package/src/plugins/uploads/schema.ts +30 -3
- package/src/plugins/uploads/state.ts +12 -0
- package/src/plugins/user-chat/plugin.ts +196 -40
- package/src/plugins/workers/context.ts +102 -39
- package/src/plugins/workers/definition.ts +7 -0
- package/src/plugins/workers/index.ts +4 -4
- package/src/plugins/workers/plugin.ts +461 -151
- package/src/plugins/workers/state.ts +64 -0
- package/src/plugins/workers/worker.ts +15 -4
- package/src/testing/conformance.ts +1751 -0
- package/src/testing/node-platform.ts +5 -0
- package/src/testing/test-harness.ts +21 -38
- package/src/testing/wait-helpers.ts +1 -4
- package/src/transport/adapter/client-adapter.ts +60 -3
- package/src/transport/adapter/heartbeat.ts +50 -0
- package/src/transport/adapter/server-adapter.ts +6 -0
- package/src/transport/http/app.ts +7 -35
- package/src/transport/http/context.ts +46 -0
- package/src/transport/http/fetch-guard.ts +318 -0
- package/src/transport/http/index.ts +1 -1
- package/src/transport/http/middleware/bearer-auth.ts +1 -1
- package/src/transport/http/middleware/error-handler.ts +1 -1
- package/src/transport/http/path-containment.ts +44 -0
- package/src/transport/http/responses.ts +20 -0
- package/src/transport/http/routes/files.ts +69 -159
- package/src/transport/http/routes/resources.ts +124 -93
- package/src/transport/http/routes/rpc.ts +63 -26
- package/src/transport/http/routes/upload.ts +327 -258
- package/src/user-config.ts +93 -7
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -155
- package/dist/config.test.js.map +0 -1
- package/dist/core/agent-loop.integration.test.d.ts +0 -2
- package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
- package/dist/core/agent-loop.integration.test.js +0 -414
- package/dist/core/agent-loop.integration.test.js.map +0 -1
- package/dist/core/agents/agent-config.test.d.ts +0 -2
- package/dist/core/agents/agent-config.test.d.ts.map +0 -1
- package/dist/core/agents/agent-config.test.js +0 -194
- package/dist/core/agents/agent-config.test.js.map +0 -1
- package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
- package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
- package/dist/core/agents/agent-shutdown.test.js +0 -180
- package/dist/core/agents/agent-shutdown.test.js.map +0 -1
- package/dist/core/agents/agent.test.d.ts +0 -2
- package/dist/core/agents/agent.test.d.ts.map +0 -1
- package/dist/core/agents/agent.test.js +0 -313
- package/dist/core/agents/agent.test.js.map +0 -1
- package/dist/core/agents/communicator.d.ts +0 -3
- package/dist/core/agents/communicator.d.ts.map +0 -1
- package/dist/core/agents/communicator.js +0 -13
- package/dist/core/agents/communicator.js.map +0 -1
- package/dist/core/agents/handler-events.test.d.ts +0 -5
- package/dist/core/agents/handler-events.test.d.ts.map +0 -1
- package/dist/core/agents/handler-events.test.js +0 -115
- package/dist/core/agents/handler-events.test.js.map +0 -1
- package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
- package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
- package/dist/core/agents/response-sanitizer.test.js +0 -101
- package/dist/core/agents/response-sanitizer.test.js.map +0 -1
- package/dist/core/error-recovery.integration.test.d.ts +0 -2
- package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
- package/dist/core/error-recovery.integration.test.js +0 -288
- package/dist/core/error-recovery.integration.test.js.map +0 -1
- package/dist/core/event-sourcing.integration.test.d.ts +0 -2
- package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
- package/dist/core/event-sourcing.integration.test.js +0 -154
- package/dist/core/event-sourcing.integration.test.js.map +0 -1
- package/dist/core/events/file.test.d.ts +0 -2
- package/dist/core/events/file.test.d.ts.map +0 -1
- package/dist/core/events/file.test.js +0 -284
- package/dist/core/events/file.test.js.map +0 -1
- package/dist/core/events/memory.test.d.ts +0 -2
- package/dist/core/events/memory.test.d.ts.map +0 -1
- package/dist/core/events/memory.test.js +0 -502
- package/dist/core/events/memory.test.js.map +0 -1
- package/dist/core/image/image-processor.test.d.ts +0 -2
- package/dist/core/image/image-processor.test.d.ts.map +0 -1
- package/dist/core/image/image-processor.test.js +0 -171
- package/dist/core/image/image-processor.test.js.map +0 -1
- package/dist/core/image/vips-resizer.test.d.ts +0 -2
- package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
- package/dist/core/image/vips-resizer.test.js +0 -336
- package/dist/core/image/vips-resizer.test.js.map +0 -1
- package/dist/core/llm/anthropic.test.d.ts +0 -2
- package/dist/core/llm/anthropic.test.d.ts.map +0 -1
- package/dist/core/llm/anthropic.test.js +0 -464
- package/dist/core/llm/anthropic.test.js.map +0 -1
- package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
- package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
- package/dist/core/llm/cache-breakpoints.test.js +0 -69
- package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
- package/dist/core/llm/cache-live.test.d.ts +0 -16
- package/dist/core/llm/cache-live.test.d.ts.map +0 -1
- package/dist/core/llm/cache-live.test.js +0 -137
- package/dist/core/llm/cache-live.test.js.map +0 -1
- package/dist/core/llm/logger.test.d.ts +0 -7
- package/dist/core/llm/logger.test.d.ts.map +0 -1
- package/dist/core/llm/logger.test.js +0 -228
- package/dist/core/llm/logger.test.js.map +0 -1
- package/dist/core/llm/message-sanitization.test.d.ts +0 -2
- package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
- package/dist/core/llm/message-sanitization.test.js +0 -181
- package/dist/core/llm/message-sanitization.test.js.map +0 -1
- package/dist/core/llm/mock.test.d.ts +0 -2
- package/dist/core/llm/mock.test.d.ts.map +0 -1
- package/dist/core/llm/mock.test.js +0 -318
- package/dist/core/llm/mock.test.js.map +0 -1
- package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
- package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
- package/dist/core/llm/openrouter-mapping.test.js +0 -172
- package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
- package/dist/core/llm/openrouter.test.d.ts +0 -2
- package/dist/core/llm/openrouter.test.d.ts.map +0 -1
- package/dist/core/llm/openrouter.test.js +0 -377
- package/dist/core/llm/openrouter.test.js.map +0 -1
- package/dist/core/llm/provider-integration.test.d.ts +0 -12
- package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
- package/dist/core/llm/provider-integration.test.js +0 -350
- package/dist/core/llm/provider-integration.test.js.map +0 -1
- package/dist/core/llm/routing-provider.test.d.ts +0 -2
- package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
- package/dist/core/llm/routing-provider.test.js +0 -94
- package/dist/core/llm/routing-provider.test.js.map +0 -1
- package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
- package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
- package/dist/core/llm/snapshot-middleware.test.js +0 -144
- package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
- package/dist/core/multi-agent.integration.test.d.ts +0 -2
- package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
- package/dist/core/multi-agent.integration.test.js +0 -298
- package/dist/core/multi-agent.integration.test.js.map +0 -1
- package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
- package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
- package/dist/core/plugin-hooks.integration.test.js +0 -458
- package/dist/core/plugin-hooks.integration.test.js.map +0 -1
- package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
- package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/core/session-lifecycle.integration.test.js +0 -159
- package/dist/core/session-lifecycle.integration.test.js.map +0 -1
- package/dist/core/sessions/fork-utils.test.d.ts +0 -2
- package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
- package/dist/core/sessions/fork-utils.test.js +0 -129
- package/dist/core/sessions/fork-utils.test.js.map +0 -1
- package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
- package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
- package/dist/core/sessions/session-overrides.integration.test.js +0 -154
- package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
- package/dist/core/sessions/session.test.d.ts +0 -2
- package/dist/core/sessions/session.test.d.ts.map +0 -1
- package/dist/core/sessions/session.test.js +0 -1100
- package/dist/core/sessions/session.test.js.map +0 -1
- package/dist/core/tools/executor.test.d.ts +0 -2
- package/dist/core/tools/executor.test.d.ts.map +0 -1
- package/dist/core/tools/executor.test.js +0 -144
- package/dist/core/tools/executor.test.js.map +0 -1
- package/dist/lib/logger/console.test.d.ts +0 -2
- package/dist/lib/logger/console.test.d.ts.map +0 -1
- package/dist/lib/logger/console.test.js +0 -258
- package/dist/lib/logger/console.test.js.map +0 -1
- package/dist/lib/never.d.ts +0 -2
- package/dist/lib/never.d.ts.map +0 -1
- package/dist/lib/never.js +0 -4
- package/dist/lib/never.js.map +0 -1
- package/dist/lib/utils/concurrency.test.d.ts +0 -2
- package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
- package/dist/lib/utils/concurrency.test.js +0 -135
- package/dist/lib/utils/concurrency.test.js.map +0 -1
- package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
- package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
- package/dist/plugins/agent-status/agent-status.test.js +0 -136
- package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
- package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
- package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
- package/dist/plugins/agents/agents.integration.test.js +0 -830
- package/dist/plugins/agents/agents.integration.test.js.map +0 -1
- package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
- package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
- package/dist/plugins/agents/supervision.integration.test.js +0 -215
- package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
- package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
- package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/compaction-live.test.js +0 -177
- package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
- package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
- package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
- package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/context-compactor.test.js +0 -858
- package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
- package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
- package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/history-offloader.test.js +0 -77
- package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
- package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
- package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
- package/dist/plugins/filesystem/schema.d.ts +0 -7
- package/dist/plugins/filesystem/schema.d.ts.map +0 -1
- package/dist/plugins/filesystem/schema.js +0 -2
- package/dist/plugins/filesystem/schema.js.map +0 -1
- package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
- package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
- package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
- package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
- package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
- package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
- package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
- package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
- package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
- package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
- package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
- package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
- package/dist/plugins/resources/resources.integration.test.js +0 -62
- package/dist/plugins/resources/resources.integration.test.js.map +0 -1
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
- package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
- package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
- package/dist/plugins/services/pid-registry.test.d.ts +0 -2
- package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
- package/dist/plugins/services/pid-registry.test.js +0 -161
- package/dist/plugins/services/pid-registry.test.js.map +0 -1
- package/dist/plugins/services/services.integration.test.d.ts +0 -2
- package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
- package/dist/plugins/services/services.integration.test.js +0 -1057
- package/dist/plugins/services/services.integration.test.js.map +0 -1
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
- package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
- package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
- package/dist/plugins/session-stats/plugin.test.js +0 -145
- package/dist/plugins/session-stats/plugin.test.js.map +0 -1
- package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
- package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
- package/dist/plugins/shell/shell.integration.test.js +0 -234
- package/dist/plugins/shell/shell.integration.test.js.map +0 -1
- package/dist/plugins/shell/shell.test.d.ts +0 -2
- package/dist/plugins/shell/shell.test.d.ts.map +0 -1
- package/dist/plugins/shell/shell.test.js +0 -236
- package/dist/plugins/shell/shell.test.js.map +0 -1
- package/dist/plugins/skills/discovery.test.d.ts +0 -2
- package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
- package/dist/plugins/skills/discovery.test.js +0 -312
- package/dist/plugins/skills/discovery.test.js.map +0 -1
- package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
- package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
- package/dist/plugins/skills/skills.integration.test.js +0 -475
- package/dist/plugins/skills/skills.integration.test.js.map +0 -1
- package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
- package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
- package/dist/plugins/todo/todo.integration.test.js +0 -605
- package/dist/plugins/todo/todo.integration.test.js.map +0 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
- package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
- package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
- package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
- package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
- package/dist/plugins/uploads/uploads.integration.test.js +0 -639
- package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
- package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
- package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
- package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
- package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
- package/dist/plugins/workers/workers.integration.test.js +0 -629
- package/dist/plugins/workers/workers.integration.test.js.map +0 -1
- package/dist/prompts/macros.test.d.ts +0 -2
- package/dist/prompts/macros.test.d.ts.map +0 -1
- package/dist/prompts/macros.test.js +0 -80
- package/dist/prompts/macros.test.js.map +0 -1
- package/dist/testing/test-harness.test.d.ts +0 -2
- package/dist/testing/test-harness.test.d.ts.map +0 -1
- package/dist/testing/test-harness.test.js +0 -92
- package/dist/testing/test-harness.test.js.map +0 -1
- package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
- package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
- package/dist/transport/http/routes/rpc.integration.test.js +0 -189
- package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
- package/dist/transport/http/routes/rpc.test.d.ts +0 -2
- package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
- package/dist/transport/http/routes/rpc.test.js +0 -316
- package/dist/transport/http/routes/rpc.test.js.map +0 -1
- package/src/config.test.ts +0 -174
- package/src/core/agent-loop.integration.test.ts +0 -503
- package/src/core/agents/agent-config.test.ts +0 -240
- package/src/core/agents/agent-shutdown.test.ts +0 -236
- package/src/core/agents/agent.test.ts +0 -387
- package/src/core/agents/communicator.ts +0 -16
- package/src/core/agents/handler-events.test.ts +0 -167
- package/src/core/agents/response-sanitizer.test.ts +0 -137
- package/src/core/error-recovery.integration.test.ts +0 -343
- package/src/core/event-sourcing.integration.test.ts +0 -191
- package/src/core/events/file.test.ts +0 -436
- package/src/core/events/memory.test.ts +0 -741
- package/src/core/image/image-processor.test.ts +0 -218
- package/src/core/image/vips-resizer.test.ts +0 -388
- package/src/core/llm/anthropic.test.ts +0 -546
- package/src/core/llm/cache-breakpoints.test.ts +0 -85
- package/src/core/llm/cache-live.test.ts +0 -155
- package/src/core/llm/logger.test.ts +0 -270
- package/src/core/llm/message-sanitization.test.ts +0 -217
- package/src/core/llm/mock.test.ts +0 -402
- package/src/core/llm/openrouter-mapping.test.ts +0 -210
- package/src/core/llm/openrouter.test.ts +0 -499
- package/src/core/llm/provider-integration.test.ts +0 -408
- package/src/core/llm/routing-provider.test.ts +0 -113
- package/src/core/llm/snapshot-middleware.test.ts +0 -168
- package/src/core/multi-agent.integration.test.ts +0 -340
- package/src/core/plugin-hooks.integration.test.ts +0 -568
- package/src/core/session-lifecycle.integration.test.ts +0 -202
- package/src/core/sessions/fork-utils.test.ts +0 -158
- package/src/core/sessions/session-overrides.integration.test.ts +0 -210
- package/src/core/sessions/session.test.ts +0 -1736
- package/src/core/tools/executor.test.ts +0 -161
- package/src/lib/logger/console.test.ts +0 -348
- package/src/lib/never.ts +0 -3
- package/src/lib/utils/concurrency.test.ts +0 -169
- package/src/plugins/agent-status/agent-status.test.ts +0 -164
- package/src/plugins/agents/agents.integration.test.ts +0 -976
- package/src/plugins/agents/supervision.integration.test.ts +0 -249
- package/src/plugins/context-compact/compaction-live.test.ts +0 -221
- package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
- package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
- package/src/plugins/context-compact/history-offloader.test.ts +0 -100
- package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
- package/src/plugins/filesystem/schema.ts +0 -6
- package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
- package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
- package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
- package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
- package/src/plugins/resources/resources.integration.test.ts +0 -68
- package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
- package/src/plugins/services/pid-registry.test.ts +0 -180
- package/src/plugins/services/services.integration.test.ts +0 -1223
- package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
- package/src/plugins/session-stats/plugin.test.ts +0 -160
- package/src/plugins/shell/shell.integration.test.ts +0 -273
- package/src/plugins/shell/shell.test.ts +0 -314
- package/src/plugins/skills/discovery.test.ts +0 -395
- package/src/plugins/skills/skills.integration.test.ts +0 -580
- package/src/plugins/todo/todo.integration.test.ts +0 -687
- package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
- package/src/plugins/uploads/uploads.integration.test.ts +0 -831
- package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
- package/src/plugins/workers/workers.integration.test.ts +0 -778
- package/src/prompts/macros.test.ts +0 -107
- package/src/testing/test-harness.test.ts +0 -114
- package/src/transport/http/routes/rpc.integration.test.ts +0 -243
- package/src/transport/http/routes/rpc.test.ts +0 -372
|
@@ -17,7 +17,9 @@ import type {
|
|
|
17
17
|
RawInferenceRequest,
|
|
18
18
|
RawToolSpec,
|
|
19
19
|
} from './provider.js'
|
|
20
|
-
import {
|
|
20
|
+
import { mapProviderError } from './provider.js'
|
|
21
|
+
import { ProviderRequestAbortError, runProviderRequest } from './provider-request.js'
|
|
22
|
+
import { sanitizeProviderMessages } from './message-sanitization.js'
|
|
21
23
|
import type { RoutableLLMProvider } from './routing-provider.js'
|
|
22
24
|
|
|
23
25
|
// ============================================================================
|
|
@@ -48,6 +50,14 @@ interface AnthropicTextBlock {
|
|
|
48
50
|
interface AnthropicThinkingBlock {
|
|
49
51
|
type: 'thinking'
|
|
50
52
|
thinking: string
|
|
53
|
+
/** Verified by the API when the block is replayed. An edited block is rejected. */
|
|
54
|
+
signature: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Thinking the API withheld. Opaque, and must still be replayed — see AnthropicThinkingBlock. */
|
|
58
|
+
interface AnthropicRedactedThinkingBlock {
|
|
59
|
+
type: 'redacted_thinking'
|
|
60
|
+
data: string
|
|
51
61
|
}
|
|
52
62
|
|
|
53
63
|
interface AnthropicToolUseBlock {
|
|
@@ -57,7 +67,29 @@ interface AnthropicToolUseBlock {
|
|
|
57
67
|
input: unknown
|
|
58
68
|
}
|
|
59
69
|
|
|
60
|
-
type AnthropicContentBlock =
|
|
70
|
+
type AnthropicContentBlock =
|
|
71
|
+
| AnthropicTextBlock
|
|
72
|
+
| AnthropicThinkingBlock
|
|
73
|
+
| AnthropicRedactedThinkingBlock
|
|
74
|
+
| AnthropicToolUseBlock
|
|
75
|
+
|
|
76
|
+
const isThinkingBlock = (block: AnthropicContentBlock): block is AnthropicThinkingBlock | AnthropicRedactedThinkingBlock =>
|
|
77
|
+
block.type === 'thinking' || block.type === 'redacted_thinking'
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Narrow a stored block back to a thinking block on the way out.
|
|
81
|
+
*
|
|
82
|
+
* `AssistantLLMMessage.thinkingBlocks` is `unknown[]` — the domain layer does not model
|
|
83
|
+
* provider shapes. This provider wrote those blocks, so it is entitled to recognise them,
|
|
84
|
+
* but it validates every field it declares rather than assuming. Anything else the API
|
|
85
|
+
* added travels along untouched, because the block is passed by reference and never rebuilt.
|
|
86
|
+
*/
|
|
87
|
+
const isEchoableThinkingBlock = (value: unknown): value is AnthropicThinkingBlock | AnthropicRedactedThinkingBlock => {
|
|
88
|
+
if (typeof value !== 'object' || value === null || !('type' in value)) return false
|
|
89
|
+
if (value.type === 'thinking') return 'thinking' in value && 'signature' in value && typeof value.signature === 'string'
|
|
90
|
+
if (value.type === 'redacted_thinking') return 'data' in value && typeof value.data === 'string'
|
|
91
|
+
return false
|
|
92
|
+
}
|
|
61
93
|
|
|
62
94
|
interface AnthropicMessageResponse {
|
|
63
95
|
id: string
|
|
@@ -121,31 +153,46 @@ interface AnthropicToolResultBlockParam {
|
|
|
121
153
|
cache_control?: AnthropicCacheControl
|
|
122
154
|
}
|
|
123
155
|
|
|
124
|
-
|
|
156
|
+
/** Blocks the API accepts `cache_control` on — everything except a replayed thinking block. */
|
|
157
|
+
type AnthropicCacheableBlockParam =
|
|
125
158
|
| AnthropicTextBlockParam
|
|
126
159
|
| AnthropicImageBlockParam
|
|
127
160
|
| AnthropicToolUseBlockParam
|
|
128
161
|
| AnthropicToolResultBlockParam
|
|
129
162
|
|
|
163
|
+
type AnthropicContentBlockParam =
|
|
164
|
+
| AnthropicCacheableBlockParam
|
|
165
|
+
| AnthropicThinkingBlock
|
|
166
|
+
| AnthropicRedactedThinkingBlock
|
|
167
|
+
|
|
168
|
+
const isCacheableBlock = (block: AnthropicContentBlockParam): block is AnthropicCacheableBlockParam =>
|
|
169
|
+
block.type !== 'thinking' && block.type !== 'redacted_thinking'
|
|
170
|
+
|
|
130
171
|
interface AnthropicMessageParam {
|
|
131
172
|
role: 'user' | 'assistant'
|
|
132
173
|
content: string | AnthropicContentBlockParam[]
|
|
133
174
|
}
|
|
134
175
|
|
|
135
176
|
/**
|
|
136
|
-
* Add `cache_control` to the LAST content block of an AnthropicMessageParam
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
177
|
+
* Add `cache_control` to the LAST content block of an AnthropicMessageParam that can carry
|
|
178
|
+
* it. Converts string content to a single text block first so the mark has a place to live.
|
|
179
|
+
* Mutates in place so the cache breakpoint survives subsequent `mergeConsecutiveMessages`.
|
|
180
|
+
*
|
|
181
|
+
* Thinking blocks are skipped: they are replayed byte-for-byte and the API rejects an extra
|
|
182
|
+
* key on them. They lead the assistant message, so the only case where none of the blocks is
|
|
183
|
+
* cacheable is a message made of nothing but thinking — which then gets no breakpoint.
|
|
140
184
|
*/
|
|
141
185
|
function applyCacheControlToLastBlock(msg: AnthropicMessageParam, cacheControl: AnthropicCacheControl): void {
|
|
142
186
|
if (typeof msg.content === 'string') {
|
|
143
187
|
msg.content = [{ type: 'text', text: msg.content, cache_control: cacheControl }]
|
|
144
188
|
return
|
|
145
189
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
190
|
+
for (let i = msg.content.length - 1; i >= 0; i--) {
|
|
191
|
+
const block = msg.content[i]
|
|
192
|
+
if (!isCacheableBlock(block)) continue
|
|
193
|
+
msg.content[i] = { ...block, cache_control: cacheControl }
|
|
194
|
+
return
|
|
195
|
+
}
|
|
149
196
|
}
|
|
150
197
|
|
|
151
198
|
interface AnthropicToolParam {
|
|
@@ -245,18 +292,8 @@ export class AnthropicProvider implements RoutableLLMProvider {
|
|
|
245
292
|
}
|
|
246
293
|
|
|
247
294
|
const httpRequest = await this.buildHttpRequest(rawRequest, context)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
const timeoutId = setTimeout(() => controller.abort(), this.timeout)
|
|
251
|
-
|
|
252
|
-
// Combine with external signal if provided
|
|
253
|
-
if (context?.signal) {
|
|
254
|
-
context.signal.addEventListener('abort', () => controller.abort(), { once: true })
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
let response: Response
|
|
258
|
-
try {
|
|
259
|
-
response = await this.fetchFn(httpRequest.url, {
|
|
295
|
+
return await runProviderRequest({ callerSignal: context?.signal, timeoutMs: this.timeout }, async (signal) => {
|
|
296
|
+
const response = await this.fetchFn(httpRequest.url, {
|
|
260
297
|
method: httpRequest.method,
|
|
261
298
|
headers: {
|
|
262
299
|
...httpRequest.headers,
|
|
@@ -264,60 +301,70 @@ export class AnthropicProvider implements RoutableLLMProvider {
|
|
|
264
301
|
'anthropic-dangerous-direct-browser-access': 'true',
|
|
265
302
|
},
|
|
266
303
|
body: JSON.stringify(httpRequest.body),
|
|
267
|
-
signal
|
|
304
|
+
signal,
|
|
268
305
|
})
|
|
269
|
-
} finally {
|
|
270
|
-
clearTimeout(timeoutId)
|
|
271
|
-
}
|
|
272
306
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
307
|
+
if (!response.ok) {
|
|
308
|
+
const body = await response.text()
|
|
309
|
+
return Err(this.mapHttpError(response.status, body))
|
|
310
|
+
}
|
|
277
311
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
312
|
+
const data = await response.json() as AnthropicMessageResponse
|
|
313
|
+
const latencyMs = Date.now() - startTime
|
|
314
|
+
|
|
315
|
+
const textContent = data.content
|
|
316
|
+
.filter((block): block is AnthropicTextBlock => block.type === 'text')
|
|
317
|
+
.map((block) => block.text)
|
|
318
|
+
.join('')
|
|
319
|
+
|
|
320
|
+
// Kept whole, in order, signatures included: the API verifies them on replay.
|
|
321
|
+
// `redacted_thinking` has no readable text but still has to travel.
|
|
322
|
+
const thinkingBlocks = data.content.filter(isThinkingBlock)
|
|
323
|
+
|
|
324
|
+
const reasoning = thinkingBlocks
|
|
325
|
+
.filter((block): block is AnthropicThinkingBlock => block.type === 'thinking')
|
|
326
|
+
.map((block) => block.thinking)
|
|
327
|
+
.join('')
|
|
328
|
+
|
|
329
|
+
const toolCalls: ToolCall[] = data.content
|
|
330
|
+
.filter((block): block is AnthropicToolUseBlock => block.type === 'tool_use')
|
|
331
|
+
.map((block) => ({
|
|
332
|
+
id: ToolCallId(block.id),
|
|
333
|
+
name: block.name,
|
|
334
|
+
input: block.input,
|
|
335
|
+
}))
|
|
336
|
+
|
|
337
|
+
const metrics: LLMMetrics = {
|
|
338
|
+
promptTokens: data.usage.input_tokens,
|
|
339
|
+
completionTokens: data.usage.output_tokens,
|
|
340
|
+
totalTokens: data.usage.input_tokens + data.usage.output_tokens,
|
|
341
|
+
latencyMs,
|
|
342
|
+
model: data.model,
|
|
343
|
+
provider: this.name,
|
|
344
|
+
cost: this.calculateCost(data.model, data.usage),
|
|
345
|
+
cachedTokens: data.usage.cache_read_input_tokens || undefined,
|
|
346
|
+
cacheWriteTokens: data.usage.cache_creation_input_tokens || undefined,
|
|
347
|
+
}
|
|
310
348
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
349
|
+
return Ok({
|
|
350
|
+
content: textContent || null,
|
|
351
|
+
toolCalls,
|
|
352
|
+
finishReason: this.mapStopReason(data.stop_reason),
|
|
353
|
+
metrics,
|
|
354
|
+
providerRequestId: data.id,
|
|
355
|
+
reasoning: reasoning || undefined,
|
|
356
|
+
// Normalized to undefined so an empty array never reaches the wire on the way back.
|
|
357
|
+
thinkingBlocks: thinkingBlocks.length > 0 ? thinkingBlocks : undefined,
|
|
358
|
+
})
|
|
318
359
|
})
|
|
319
360
|
} catch (error) {
|
|
320
|
-
|
|
361
|
+
if (error instanceof ProviderRequestAbortError) {
|
|
362
|
+
return Err({
|
|
363
|
+
type: error.abortCause === 'caller' ? 'aborted' : 'timeout',
|
|
364
|
+
message: error.message,
|
|
365
|
+
})
|
|
366
|
+
}
|
|
367
|
+
return Err(mapProviderError(error))
|
|
321
368
|
}
|
|
322
369
|
}
|
|
323
370
|
|
|
@@ -399,6 +446,16 @@ export class AnthropicProvider implements RoutableLLMProvider {
|
|
|
399
446
|
}
|
|
400
447
|
case 'assistant': {
|
|
401
448
|
const contentBlocks: AnthropicContentBlockParam[] = []
|
|
449
|
+
// Thinking goes first — the API requires the block order the model produced, and
|
|
450
|
+
// during tool use it requires the blocks to be there at all. All or nothing: a
|
|
451
|
+
// partial sequence is rejected, so anything unrecognisable drops the whole set
|
|
452
|
+
// rather than sending a truncated one.
|
|
453
|
+
const thinking = msg.thinkingBlocks ?? []
|
|
454
|
+
if (thinking.length > 0 && thinking.every(isEchoableThinkingBlock)) {
|
|
455
|
+
contentBlocks.push(...thinking)
|
|
456
|
+
} else if (thinking.length > 0) {
|
|
457
|
+
this.logger?.warn('Dropping unrecognisable thinking blocks from an assistant message', { count: thinking.length })
|
|
458
|
+
}
|
|
402
459
|
if (msg.content) {
|
|
403
460
|
contentBlocks.push({ type: 'text', text: msg.content })
|
|
404
461
|
}
|
|
@@ -581,16 +638,4 @@ export class AnthropicProvider implements RoutableLLMProvider {
|
|
|
581
638
|
return { type: 'server_error', message, statusCode: status, responseBody: body }
|
|
582
639
|
}
|
|
583
640
|
|
|
584
|
-
private mapError(err: unknown): LLMError {
|
|
585
|
-
if (err instanceof ProviderMessageValidationError) {
|
|
586
|
-
return { type: 'invalid_request', message: err.message }
|
|
587
|
-
}
|
|
588
|
-
if (err instanceof Error && err.name === 'AbortError') {
|
|
589
|
-
return { type: 'aborted', message: 'Request was aborted' }
|
|
590
|
-
}
|
|
591
|
-
if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network'))) {
|
|
592
|
-
return { type: 'network_error', message: err.message, cause: err }
|
|
593
|
-
}
|
|
594
|
-
return { type: 'network_error', message: err instanceof Error ? err.message : String(err), cause: err }
|
|
595
|
-
}
|
|
596
641
|
}
|
package/src/core/llm/logger.ts
CHANGED
|
@@ -5,13 +5,20 @@
|
|
|
5
5
|
* Per spec.md 9.1: "Pro debugging a audit se bude logovat kompletní LLM komunikace"
|
|
6
6
|
*
|
|
7
7
|
* Calls are stored in the session folder: {dataPath}/sessions/{sessionId}/calls/
|
|
8
|
+
*
|
|
9
|
+
* A host that has a table for them ({@link LLMCallStore}) gets rows instead: the
|
|
10
|
+
* same entries, but `completeCall` stops reading the whole entry back to rewrite
|
|
11
|
+
* it and `listCalls` stops being a `readdir` plus one read per row of the page.
|
|
12
|
+
* Without a store nothing changes — same directory, same files, same content.
|
|
8
13
|
*/
|
|
9
14
|
|
|
10
15
|
import { join } from 'node:path'
|
|
11
|
-
import
|
|
16
|
+
import { AgentId } from '~/core/agents/schema.js'
|
|
12
17
|
import { generateLLMCallId, LLMCallId } from '~/core/llm/schema.js'
|
|
13
18
|
import type { SessionId } from '~/core/sessions/schema.js'
|
|
19
|
+
import { readTextFilesOrUndefined } from '~/lib/utils/fs-batch.js'
|
|
14
20
|
import type { FileSystem } from '~/platform/fs.js'
|
|
21
|
+
import type { LLMCallRow, LLMCallStore } from '~/platform/llm-call-log.js'
|
|
15
22
|
import type { LLMCallError, LLMCallLogEntry, LLMCallMessage, LLMCallMetrics, LLMCallRequest, LLMCallResponse } from './llm-log-types.js'
|
|
16
23
|
import type { InferenceRequest, InferenceResponse, LLMError } from './provider.js'
|
|
17
24
|
|
|
@@ -27,6 +34,70 @@ export interface LLMLoggerConfig {
|
|
|
27
34
|
basePath: string
|
|
28
35
|
enabled: boolean
|
|
29
36
|
fs: FileSystem
|
|
37
|
+
/** Rows instead of files, where the host has a table for them. */
|
|
38
|
+
store?: LLMCallStore
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const ENCODER = new TextEncoder()
|
|
42
|
+
|
|
43
|
+
/** UTF-8 length; the SDK cannot assume `Buffer`. */
|
|
44
|
+
function byteLength(text: string): number {
|
|
45
|
+
return ENCODER.encode(text).byteLength
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Fit a request inside the host's column ceiling.
|
|
50
|
+
*
|
|
51
|
+
* Everything in a request is bounded by the agent definition except the message
|
|
52
|
+
* history, which grows with the session and carries whole tool results. Over the
|
|
53
|
+
* ceiling the store would reject the row and, because `createCall` is awaited on
|
|
54
|
+
* the inference path, turn a logged call into a failed one.
|
|
55
|
+
*/
|
|
56
|
+
function clampRequest(request: LLMCallRequest, maxBytes: number | undefined): string {
|
|
57
|
+
const json = JSON.stringify(request)
|
|
58
|
+
// UTF-8 is at most 3 bytes per UTF-16 unit, so the common case never encodes.
|
|
59
|
+
if (maxBytes === undefined || json.length * 3 <= maxBytes) return json
|
|
60
|
+
|
|
61
|
+
const bytes = byteLength(json)
|
|
62
|
+
if (bytes <= maxBytes) return json
|
|
63
|
+
|
|
64
|
+
const dropped: LLMCallRequest = {
|
|
65
|
+
...request,
|
|
66
|
+
messages: [{
|
|
67
|
+
role: 'system',
|
|
68
|
+
content: `[${request.messages.length} messages, ${bytes} B, dropped: over the host's ${maxBytes} B column limit]`,
|
|
69
|
+
}],
|
|
70
|
+
tools: undefined,
|
|
71
|
+
}
|
|
72
|
+
const withoutMessages = JSON.stringify(dropped)
|
|
73
|
+
if (byteLength(withoutMessages) <= maxBytes) return withoutMessages
|
|
74
|
+
|
|
75
|
+
// A system prompt alone past the ceiling is pathological; keep only what a listing shows.
|
|
76
|
+
const minimal: LLMCallRequest = {
|
|
77
|
+
model: request.model,
|
|
78
|
+
systemPrompt: `[${byteLength(request.systemPrompt)} B, dropped]`,
|
|
79
|
+
messages: [],
|
|
80
|
+
toolsCount: request.tools?.length ?? 0,
|
|
81
|
+
}
|
|
82
|
+
return JSON.stringify(minimal)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** JSON this logger wrote itself; annotated rather than cast, and never validated on read. */
|
|
86
|
+
function parseJson<T>(json: string): T {
|
|
87
|
+
return JSON.parse(json)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function parseOptionalJson<T>(json: string | undefined): T | undefined {
|
|
91
|
+
return json === undefined ? undefined : parseJson<T>(json)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** One stored entry, or null when the file stopped being JSON. */
|
|
95
|
+
function parseEntry(content: string): LLMCallLogEntry | null {
|
|
96
|
+
try {
|
|
97
|
+
return parseJson<LLMCallLogEntry>(content)
|
|
98
|
+
} catch {
|
|
99
|
+
return null
|
|
100
|
+
}
|
|
30
101
|
}
|
|
31
102
|
|
|
32
103
|
// ============================================================================
|
|
@@ -35,14 +106,17 @@ export interface LLMLoggerConfig {
|
|
|
35
106
|
|
|
36
107
|
/**
|
|
37
108
|
* Logger for LLM requests and responses.
|
|
38
|
-
*
|
|
109
|
+
* One JSON file per call in the session folder, or one row per call in a
|
|
110
|
+
* {@link LLMCallStore} where the host has one.
|
|
39
111
|
*/
|
|
40
112
|
export class LLMLogger {
|
|
41
113
|
private dirCache = new Set<string>()
|
|
42
114
|
private readonly fs: FileSystem
|
|
115
|
+
private readonly store?: LLMCallStore
|
|
43
116
|
|
|
44
117
|
constructor(private config: LLMLoggerConfig) {
|
|
45
118
|
this.fs = config.fs
|
|
119
|
+
this.store = config.store
|
|
46
120
|
}
|
|
47
121
|
|
|
48
122
|
/**
|
|
@@ -138,6 +212,18 @@ export class LLMLogger {
|
|
|
138
212
|
providerOptions,
|
|
139
213
|
}
|
|
140
214
|
|
|
215
|
+
if (this.store !== undefined) {
|
|
216
|
+
await this.store.create(sessionId, {
|
|
217
|
+
callId,
|
|
218
|
+
agentId,
|
|
219
|
+
createdAt: now,
|
|
220
|
+
status: 'running',
|
|
221
|
+
model: request.model,
|
|
222
|
+
request: clampRequest(callRequest, this.store.maxBlobBytes),
|
|
223
|
+
})
|
|
224
|
+
return callId
|
|
225
|
+
}
|
|
226
|
+
|
|
141
227
|
const entry: LLMCallLogEntry = {
|
|
142
228
|
id: callId,
|
|
143
229
|
sessionId,
|
|
@@ -163,17 +249,6 @@ export class LLMLogger {
|
|
|
163
249
|
response: InferenceResponse,
|
|
164
250
|
durationMs: number,
|
|
165
251
|
): Promise<void> {
|
|
166
|
-
const filePath = this.getCallFilePath(sessionId, callId)
|
|
167
|
-
|
|
168
|
-
let entry: LLMCallLogEntry
|
|
169
|
-
try {
|
|
170
|
-
const content = await this.fs.readFile(filePath, 'utf-8')
|
|
171
|
-
entry = JSON.parse(content) as LLMCallLogEntry
|
|
172
|
-
} catch {
|
|
173
|
-
// File doesn't exist or is invalid - skip update
|
|
174
|
-
return
|
|
175
|
-
}
|
|
176
|
-
|
|
177
252
|
const callResponse: LLMCallResponse = {
|
|
178
253
|
content: response.content,
|
|
179
254
|
toolCalls: response.toolCalls.map((tc) => ({
|
|
@@ -199,6 +274,25 @@ export class LLMLogger {
|
|
|
199
274
|
reasoningTokens: response.metrics.reasoningTokens,
|
|
200
275
|
}
|
|
201
276
|
|
|
277
|
+
if (this.store !== undefined) {
|
|
278
|
+
// The whole reason for splitting the row: no read-back, and the request
|
|
279
|
+
// column is not in the SET list.
|
|
280
|
+
await this.store.complete(sessionId, callId, {
|
|
281
|
+
status: 'success',
|
|
282
|
+
completedAt: Date.now(),
|
|
283
|
+
durationMs,
|
|
284
|
+
providerRequestId: response.providerRequestId,
|
|
285
|
+
response: JSON.stringify(callResponse),
|
|
286
|
+
metrics: JSON.stringify(callMetrics),
|
|
287
|
+
})
|
|
288
|
+
return
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const filePath = this.getCallFilePath(sessionId, callId)
|
|
292
|
+
const entry = await this.readEntry(filePath)
|
|
293
|
+
// File doesn't exist or is invalid - skip update
|
|
294
|
+
if (entry === null) return
|
|
295
|
+
|
|
202
296
|
entry.status = 'success'
|
|
203
297
|
entry.completedAt = Date.now()
|
|
204
298
|
entry.durationMs = durationMs
|
|
@@ -218,17 +312,6 @@ export class LLMLogger {
|
|
|
218
312
|
error: LLMError,
|
|
219
313
|
durationMs: number,
|
|
220
314
|
): Promise<void> {
|
|
221
|
-
const filePath = this.getCallFilePath(sessionId, callId)
|
|
222
|
-
|
|
223
|
-
let entry: LLMCallLogEntry
|
|
224
|
-
try {
|
|
225
|
-
const content = await this.fs.readFile(filePath, 'utf-8')
|
|
226
|
-
entry = JSON.parse(content) as LLMCallLogEntry
|
|
227
|
-
} catch {
|
|
228
|
-
// File doesn't exist or is invalid - skip update
|
|
229
|
-
return
|
|
230
|
-
}
|
|
231
|
-
|
|
232
315
|
const callError: LLMCallError = {
|
|
233
316
|
type: error.type,
|
|
234
317
|
message: error.message,
|
|
@@ -237,6 +320,21 @@ export class LLMLogger {
|
|
|
237
320
|
responseBody: error.responseBody,
|
|
238
321
|
}
|
|
239
322
|
|
|
323
|
+
if (this.store !== undefined) {
|
|
324
|
+
await this.store.complete(sessionId, callId, {
|
|
325
|
+
status: 'error',
|
|
326
|
+
completedAt: Date.now(),
|
|
327
|
+
durationMs,
|
|
328
|
+
error: JSON.stringify(callError),
|
|
329
|
+
})
|
|
330
|
+
return
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const filePath = this.getCallFilePath(sessionId, callId)
|
|
334
|
+
const entry = await this.readEntry(filePath)
|
|
335
|
+
// File doesn't exist or is invalid - skip update
|
|
336
|
+
if (entry === null) return
|
|
337
|
+
|
|
240
338
|
entry.status = 'error'
|
|
241
339
|
entry.completedAt = Date.now()
|
|
242
340
|
entry.durationMs = durationMs
|
|
@@ -252,11 +350,18 @@ export class LLMLogger {
|
|
|
252
350
|
sessionId: SessionId,
|
|
253
351
|
callId: LLMCallId,
|
|
254
352
|
): Promise<LLMCallLogEntry | null> {
|
|
255
|
-
|
|
353
|
+
if (this.store !== undefined) {
|
|
354
|
+
const row = await this.store.get(sessionId, callId)
|
|
355
|
+
return row === null ? null : toEntry(sessionId, row)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return this.readEntry(this.getCallFilePath(sessionId, callId))
|
|
359
|
+
}
|
|
256
360
|
|
|
361
|
+
/** One stored entry, or null when the file has gone or stopped being JSON. */
|
|
362
|
+
private async readEntry(filePath: string): Promise<LLMCallLogEntry | null> {
|
|
257
363
|
try {
|
|
258
|
-
|
|
259
|
-
return JSON.parse(content) as LLMCallLogEntry
|
|
364
|
+
return parseEntry(await this.fs.readFile(filePath, 'utf-8'))
|
|
260
365
|
} catch {
|
|
261
366
|
return null
|
|
262
367
|
}
|
|
@@ -269,6 +374,17 @@ export class LLMLogger {
|
|
|
269
374
|
sessionId: SessionId,
|
|
270
375
|
options?: { limit?: number; offset?: number },
|
|
271
376
|
): Promise<{ calls: LLMCallLogEntry[]; total: number }> {
|
|
377
|
+
const offset = options?.offset ?? 0
|
|
378
|
+
const limit = options?.limit ?? 100
|
|
379
|
+
|
|
380
|
+
if (this.store !== undefined) {
|
|
381
|
+
// One indexed query where the file path listed a directory, sorted the
|
|
382
|
+
// names and read the page's files one at a time. Same order, same page
|
|
383
|
+
// boundaries — see LLMCallStore.list.
|
|
384
|
+
const page = await this.store.list(sessionId, { limit, offset })
|
|
385
|
+
return { calls: page.calls.map((row) => toEntry(sessionId, row)), total: page.total }
|
|
386
|
+
}
|
|
387
|
+
|
|
272
388
|
const callsDir = join(this.config.basePath, 'sessions', sessionId, 'calls')
|
|
273
389
|
|
|
274
390
|
let files: string[]
|
|
@@ -286,21 +402,43 @@ export class LLMLogger {
|
|
|
286
402
|
.reverse() // Most recent first
|
|
287
403
|
|
|
288
404
|
const total = jsonFiles.length
|
|
289
|
-
const offset = options?.offset ?? 0
|
|
290
|
-
const limit = options?.limit ?? 100
|
|
291
405
|
const paginated = jsonFiles.slice(offset, offset + limit)
|
|
292
406
|
|
|
407
|
+
// The page is a known set of paths, so it is asked for as one where the
|
|
408
|
+
// platform takes one — the same read the store branch above replaces with
|
|
409
|
+
// a single query.
|
|
410
|
+
const contents = await readTextFilesOrUndefined(this.fs, paginated.map((file) => join(callsDir, file)))
|
|
411
|
+
|
|
293
412
|
const calls: LLMCallLogEntry[] = []
|
|
294
|
-
for (const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
calls.push(JSON.parse(content) as LLMCallLogEntry)
|
|
299
|
-
} catch {
|
|
300
|
-
// Skip invalid files
|
|
301
|
-
}
|
|
413
|
+
for (const content of contents) {
|
|
414
|
+
// Skip invalid files
|
|
415
|
+
const entry = content === undefined ? null : parseEntry(content)
|
|
416
|
+
if (entry !== null) calls.push(entry)
|
|
302
417
|
}
|
|
303
418
|
|
|
304
419
|
return { calls, total }
|
|
305
420
|
}
|
|
306
421
|
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Reassemble a stored row into the entry every reader is typed against.
|
|
425
|
+
*
|
|
426
|
+
* `sessionId` comes from the key rather than the row: it is what the caller
|
|
427
|
+
* looked the row up by, so storing it again would only be a second copy.
|
|
428
|
+
*/
|
|
429
|
+
function toEntry(sessionId: SessionId, row: LLMCallRow): LLMCallLogEntry {
|
|
430
|
+
return {
|
|
431
|
+
id: LLMCallId(row.callId),
|
|
432
|
+
sessionId,
|
|
433
|
+
agentId: AgentId(row.agentId),
|
|
434
|
+
createdAt: row.createdAt,
|
|
435
|
+
completedAt: row.completedAt,
|
|
436
|
+
durationMs: row.durationMs,
|
|
437
|
+
status: row.status,
|
|
438
|
+
request: parseJson<LLMCallRequest>(row.request),
|
|
439
|
+
response: parseOptionalJson<LLMCallResponse>(row.response),
|
|
440
|
+
metrics: parseOptionalJson<LLMCallMetrics>(row.metrics),
|
|
441
|
+
error: parseOptionalJson<LLMCallError>(row.error),
|
|
442
|
+
providerRequestId: row.providerRequestId,
|
|
443
|
+
}
|
|
444
|
+
}
|