attocode 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/dist/src/adapters.d.ts +83 -0
- package/dist/src/adapters.d.ts.map +1 -0
- package/dist/src/adapters.js +221 -0
- package/dist/src/adapters.js.map +1 -0
- package/dist/src/agent-tools/index.d.ts +7 -0
- package/dist/src/agent-tools/index.d.ts.map +1 -0
- package/dist/src/agent-tools/index.js +8 -0
- package/dist/src/agent-tools/index.js.map +1 -0
- package/dist/src/agent-tools/lsp-file-tools.d.ts +33 -0
- package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -0
- package/dist/src/agent-tools/lsp-file-tools.js +200 -0
- package/dist/src/agent-tools/lsp-file-tools.js.map +1 -0
- package/dist/src/agent.d.ts +667 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +2824 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/cli.d.ts +36 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +176 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/handler.d.ts +22 -0
- package/dist/src/commands/handler.d.ts.map +1 -0
- package/dist/src/commands/handler.js +1320 -0
- package/dist/src/commands/handler.js.map +1 -0
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +153 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/types.d.ts +70 -0
- package/dist/src/commands/types.d.ts.map +1 -0
- package/dist/src/commands/types.js +8 -0
- package/dist/src/commands/types.js.map +1 -0
- package/dist/src/config.d.ts +22 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +25 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/core/index.d.ts +32 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +35 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/process-handlers.d.ts +43 -0
- package/dist/src/core/process-handlers.d.ts.map +1 -0
- package/dist/src/core/process-handlers.js +117 -0
- package/dist/src/core/process-handlers.js.map +1 -0
- package/dist/src/core/protocol/bridge.d.ts +117 -0
- package/dist/src/core/protocol/bridge.d.ts.map +1 -0
- package/dist/src/core/protocol/bridge.js +149 -0
- package/dist/src/core/protocol/bridge.js.map +1 -0
- package/dist/src/core/protocol/index.d.ts +8 -0
- package/dist/src/core/protocol/index.d.ts.map +1 -0
- package/dist/src/core/protocol/index.js +8 -0
- package/dist/src/core/protocol/index.js.map +1 -0
- package/dist/src/core/protocol/types.d.ts +539 -0
- package/dist/src/core/protocol/types.d.ts.map +1 -0
- package/dist/src/core/protocol/types.js +149 -0
- package/dist/src/core/protocol/types.js.map +1 -0
- package/dist/src/core/queues/atomic-counter.d.ts +36 -0
- package/dist/src/core/queues/atomic-counter.d.ts.map +1 -0
- package/dist/src/core/queues/atomic-counter.js +46 -0
- package/dist/src/core/queues/atomic-counter.js.map +1 -0
- package/dist/src/core/queues/event-queue.d.ts +126 -0
- package/dist/src/core/queues/event-queue.d.ts.map +1 -0
- package/dist/src/core/queues/event-queue.js +208 -0
- package/dist/src/core/queues/event-queue.js.map +1 -0
- package/dist/src/core/queues/index.d.ts +12 -0
- package/dist/src/core/queues/index.d.ts.map +1 -0
- package/dist/src/core/queues/index.js +15 -0
- package/dist/src/core/queues/index.js.map +1 -0
- package/dist/src/core/queues/submission-queue.d.ts +116 -0
- package/dist/src/core/queues/submission-queue.d.ts.map +1 -0
- package/dist/src/core/queues/submission-queue.js +236 -0
- package/dist/src/core/queues/submission-queue.js.map +1 -0
- package/dist/src/costs/index.d.ts +22 -0
- package/dist/src/costs/index.d.ts.map +1 -0
- package/dist/src/costs/index.js +22 -0
- package/dist/src/costs/index.js.map +1 -0
- package/dist/src/costs/model-registry.d.ts +80 -0
- package/dist/src/costs/model-registry.d.ts.map +1 -0
- package/dist/src/costs/model-registry.js +237 -0
- package/dist/src/costs/model-registry.js.map +1 -0
- package/dist/src/costs/types.d.ts +50 -0
- package/dist/src/costs/types.d.ts.map +1 -0
- package/dist/src/costs/types.js +2 -0
- package/dist/src/costs/types.js.map +1 -0
- package/dist/src/defaults.d.ts +114 -0
- package/dist/src/defaults.d.ts.map +1 -0
- package/dist/src/defaults.js +457 -0
- package/dist/src/defaults.js.map +1 -0
- package/dist/src/first-run.d.ts +35 -0
- package/dist/src/first-run.d.ts.map +1 -0
- package/dist/src/first-run.js +94 -0
- package/dist/src/first-run.js.map +1 -0
- package/dist/src/hello.d.ts +2 -0
- package/dist/src/hello.d.ts.map +1 -0
- package/dist/src/hello.js +4 -0
- package/dist/src/hello.js.map +1 -0
- package/dist/src/integrations/agent-registry.d.ts +160 -0
- package/dist/src/integrations/agent-registry.d.ts.map +1 -0
- package/dist/src/integrations/agent-registry.js +446 -0
- package/dist/src/integrations/agent-registry.js.map +1 -0
- package/dist/src/integrations/auto-compaction.d.ts +177 -0
- package/dist/src/integrations/auto-compaction.d.ts.map +1 -0
- package/dist/src/integrations/auto-compaction.js +428 -0
- package/dist/src/integrations/auto-compaction.js.map +1 -0
- package/dist/src/integrations/cancellation.d.ts +162 -0
- package/dist/src/integrations/cancellation.d.ts.map +1 -0
- package/dist/src/integrations/cancellation.js +339 -0
- package/dist/src/integrations/cancellation.js.map +1 -0
- package/dist/src/integrations/codebase-context.d.ts +319 -0
- package/dist/src/integrations/codebase-context.d.ts.map +1 -0
- package/dist/src/integrations/codebase-context.js +816 -0
- package/dist/src/integrations/codebase-context.js.map +1 -0
- package/dist/src/integrations/compaction.d.ts +192 -0
- package/dist/src/integrations/compaction.d.ts.map +1 -0
- package/dist/src/integrations/compaction.js +376 -0
- package/dist/src/integrations/compaction.js.map +1 -0
- package/dist/src/integrations/context-engineering.d.ts +246 -0
- package/dist/src/integrations/context-engineering.d.ts.map +1 -0
- package/dist/src/integrations/context-engineering.js +394 -0
- package/dist/src/integrations/context-engineering.js.map +1 -0
- package/dist/src/integrations/diff-utils.d.ts +105 -0
- package/dist/src/integrations/diff-utils.d.ts.map +1 -0
- package/dist/src/integrations/diff-utils.js +497 -0
- package/dist/src/integrations/diff-utils.js.map +1 -0
- package/dist/src/integrations/economics.d.ts +192 -0
- package/dist/src/integrations/economics.d.ts.map +1 -0
- package/dist/src/integrations/economics.js +431 -0
- package/dist/src/integrations/economics.js.map +1 -0
- package/dist/src/integrations/execution-policy.d.ts +189 -0
- package/dist/src/integrations/execution-policy.d.ts.map +1 -0
- package/dist/src/integrations/execution-policy.js +352 -0
- package/dist/src/integrations/execution-policy.js.map +1 -0
- package/dist/src/integrations/file-change-tracker.d.ts +161 -0
- package/dist/src/integrations/file-change-tracker.d.ts.map +1 -0
- package/dist/src/integrations/file-change-tracker.js +520 -0
- package/dist/src/integrations/file-change-tracker.js.map +1 -0
- package/dist/src/integrations/hierarchical-config.d.ts +212 -0
- package/dist/src/integrations/hierarchical-config.d.ts.map +1 -0
- package/dist/src/integrations/hierarchical-config.js +484 -0
- package/dist/src/integrations/hierarchical-config.js.map +1 -0
- package/dist/src/integrations/hooks.d.ts +114 -0
- package/dist/src/integrations/hooks.d.ts.map +1 -0
- package/dist/src/integrations/hooks.js +326 -0
- package/dist/src/integrations/hooks.js.map +1 -0
- package/dist/src/integrations/ignore.d.ts +143 -0
- package/dist/src/integrations/ignore.d.ts.map +1 -0
- package/dist/src/integrations/ignore.js +417 -0
- package/dist/src/integrations/ignore.js.map +1 -0
- package/dist/src/integrations/image-renderer.d.ts +119 -0
- package/dist/src/integrations/image-renderer.d.ts.map +1 -0
- package/dist/src/integrations/image-renderer.js +306 -0
- package/dist/src/integrations/image-renderer.js.map +1 -0
- package/dist/src/integrations/index.d.ts +42 -0
- package/dist/src/integrations/index.d.ts.map +1 -0
- package/dist/src/integrations/index.js +73 -0
- package/dist/src/integrations/index.js.map +1 -0
- package/dist/src/integrations/lsp.d.ts +196 -0
- package/dist/src/integrations/lsp.d.ts.map +1 -0
- package/dist/src/integrations/lsp.js +582 -0
- package/dist/src/integrations/lsp.js.map +1 -0
- package/dist/src/integrations/mcp-client.d.ts +270 -0
- package/dist/src/integrations/mcp-client.d.ts.map +1 -0
- package/dist/src/integrations/mcp-client.js +698 -0
- package/dist/src/integrations/mcp-client.js.map +1 -0
- package/dist/src/integrations/mcp-tool-search.d.ts +77 -0
- package/dist/src/integrations/mcp-tool-search.d.ts.map +1 -0
- package/dist/src/integrations/mcp-tool-search.js +220 -0
- package/dist/src/integrations/mcp-tool-search.js.map +1 -0
- package/dist/src/integrations/memory.d.ts +108 -0
- package/dist/src/integrations/memory.d.ts.map +1 -0
- package/dist/src/integrations/memory.js +288 -0
- package/dist/src/integrations/memory.js.map +1 -0
- package/dist/src/integrations/multi-agent.d.ts +150 -0
- package/dist/src/integrations/multi-agent.d.ts.map +1 -0
- package/dist/src/integrations/multi-agent.js +306 -0
- package/dist/src/integrations/multi-agent.js.map +1 -0
- package/dist/src/integrations/observability.d.ts +162 -0
- package/dist/src/integrations/observability.d.ts.map +1 -0
- package/dist/src/integrations/observability.js +406 -0
- package/dist/src/integrations/observability.js.map +1 -0
- package/dist/src/integrations/openrouter-pricing.d.ts +42 -0
- package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -0
- package/dist/src/integrations/openrouter-pricing.js +124 -0
- package/dist/src/integrations/openrouter-pricing.js.map +1 -0
- package/dist/src/integrations/pending-plan.d.ts +171 -0
- package/dist/src/integrations/pending-plan.d.ts.map +1 -0
- package/dist/src/integrations/pending-plan.js +244 -0
- package/dist/src/integrations/pending-plan.js.map +1 -0
- package/dist/src/integrations/persistence.d.ts +48 -0
- package/dist/src/integrations/persistence.d.ts.map +1 -0
- package/dist/src/integrations/persistence.js +196 -0
- package/dist/src/integrations/persistence.js.map +1 -0
- package/dist/src/integrations/planning.d.ts +96 -0
- package/dist/src/integrations/planning.d.ts.map +1 -0
- package/dist/src/integrations/planning.js +338 -0
- package/dist/src/integrations/planning.js.map +1 -0
- package/dist/src/integrations/pty-shell.d.ts +169 -0
- package/dist/src/integrations/pty-shell.d.ts.map +1 -0
- package/dist/src/integrations/pty-shell.js +367 -0
- package/dist/src/integrations/pty-shell.js.map +1 -0
- package/dist/src/integrations/react.d.ts +139 -0
- package/dist/src/integrations/react.d.ts.map +1 -0
- package/dist/src/integrations/react.js +273 -0
- package/dist/src/integrations/react.js.map +1 -0
- package/dist/src/integrations/resources.d.ts +177 -0
- package/dist/src/integrations/resources.d.ts.map +1 -0
- package/dist/src/integrations/resources.js +311 -0
- package/dist/src/integrations/resources.js.map +1 -0
- package/dist/src/integrations/result-synthesizer.d.ts +389 -0
- package/dist/src/integrations/result-synthesizer.d.ts.map +1 -0
- package/dist/src/integrations/result-synthesizer.js +951 -0
- package/dist/src/integrations/result-synthesizer.js.map +1 -0
- package/dist/src/integrations/routing.d.ts +117 -0
- package/dist/src/integrations/routing.d.ts.map +1 -0
- package/dist/src/integrations/routing.js +347 -0
- package/dist/src/integrations/routing.js.map +1 -0
- package/dist/src/integrations/rules.d.ts +131 -0
- package/dist/src/integrations/rules.d.ts.map +1 -0
- package/dist/src/integrations/rules.js +284 -0
- package/dist/src/integrations/rules.js.map +1 -0
- package/dist/src/integrations/safety.d.ts +142 -0
- package/dist/src/integrations/safety.d.ts.map +1 -0
- package/dist/src/integrations/safety.js +342 -0
- package/dist/src/integrations/safety.js.map +1 -0
- package/dist/src/integrations/sandbox/basic.d.ts +74 -0
- package/dist/src/integrations/sandbox/basic.d.ts.map +1 -0
- package/dist/src/integrations/sandbox/basic.js +310 -0
- package/dist/src/integrations/sandbox/basic.js.map +1 -0
- package/dist/src/integrations/sandbox/docker.d.ts +94 -0
- package/dist/src/integrations/sandbox/docker.d.ts.map +1 -0
- package/dist/src/integrations/sandbox/docker.js +293 -0
- package/dist/src/integrations/sandbox/docker.js.map +1 -0
- package/dist/src/integrations/sandbox/index.d.ts +182 -0
- package/dist/src/integrations/sandbox/index.d.ts.map +1 -0
- package/dist/src/integrations/sandbox/index.js +382 -0
- package/dist/src/integrations/sandbox/index.js.map +1 -0
- package/dist/src/integrations/sandbox/landlock.d.ts +59 -0
- package/dist/src/integrations/sandbox/landlock.d.ts.map +1 -0
- package/dist/src/integrations/sandbox/landlock.js +326 -0
- package/dist/src/integrations/sandbox/landlock.js.map +1 -0
- package/dist/src/integrations/sandbox/seatbelt.d.ts +68 -0
- package/dist/src/integrations/sandbox/seatbelt.d.ts.map +1 -0
- package/dist/src/integrations/sandbox/seatbelt.js +298 -0
- package/dist/src/integrations/sandbox/seatbelt.js.map +1 -0
- package/dist/src/integrations/semantic-cache.d.ts +178 -0
- package/dist/src/integrations/semantic-cache.d.ts.map +1 -0
- package/dist/src/integrations/semantic-cache.js +372 -0
- package/dist/src/integrations/semantic-cache.js.map +1 -0
- package/dist/src/integrations/session-store.d.ts +183 -0
- package/dist/src/integrations/session-store.d.ts.map +1 -0
- package/dist/src/integrations/session-store.js +345 -0
- package/dist/src/integrations/session-store.js.map +1 -0
- package/dist/src/integrations/shared-blackboard.d.ts +403 -0
- package/dist/src/integrations/shared-blackboard.d.ts.map +1 -0
- package/dist/src/integrations/shared-blackboard.js +710 -0
- package/dist/src/integrations/shared-blackboard.js.map +1 -0
- package/dist/src/integrations/skills.d.ts +171 -0
- package/dist/src/integrations/skills.d.ts.map +1 -0
- package/dist/src/integrations/skills.js +403 -0
- package/dist/src/integrations/skills.js.map +1 -0
- package/dist/src/integrations/smart-decomposer.d.ts +322 -0
- package/dist/src/integrations/smart-decomposer.d.ts.map +1 -0
- package/dist/src/integrations/smart-decomposer.js +856 -0
- package/dist/src/integrations/smart-decomposer.js.map +1 -0
- package/dist/src/integrations/sourcegraph.d.ts +169 -0
- package/dist/src/integrations/sourcegraph.d.ts.map +1 -0
- package/dist/src/integrations/sourcegraph.js +379 -0
- package/dist/src/integrations/sourcegraph.js.map +1 -0
- package/dist/src/integrations/sqlite-store.d.ts +518 -0
- package/dist/src/integrations/sqlite-store.d.ts.map +1 -0
- package/dist/src/integrations/sqlite-store.js +1423 -0
- package/dist/src/integrations/sqlite-store.js.map +1 -0
- package/dist/src/integrations/streaming.d.ts +102 -0
- package/dist/src/integrations/streaming.d.ts.map +1 -0
- package/dist/src/integrations/streaming.js +362 -0
- package/dist/src/integrations/streaming.js.map +1 -0
- package/dist/src/integrations/thread-manager.d.ts +199 -0
- package/dist/src/integrations/thread-manager.d.ts.map +1 -0
- package/dist/src/integrations/thread-manager.js +357 -0
- package/dist/src/integrations/thread-manager.js.map +1 -0
- package/dist/src/main.d.ts +26 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +170 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/modes/index.d.ts +10 -0
- package/dist/src/modes/index.d.ts.map +1 -0
- package/dist/src/modes/index.js +10 -0
- package/dist/src/modes/index.js.map +1 -0
- package/dist/src/modes/repl.d.ts +19 -0
- package/dist/src/modes/repl.d.ts.map +1 -0
- package/dist/src/modes/repl.js +393 -0
- package/dist/src/modes/repl.js.map +1 -0
- package/dist/src/modes/tui.d.ts +29 -0
- package/dist/src/modes/tui.d.ts.map +1 -0
- package/dist/src/modes/tui.js +272 -0
- package/dist/src/modes/tui.js.map +1 -0
- package/dist/src/modes.d.ts +179 -0
- package/dist/src/modes.d.ts.map +1 -0
- package/dist/src/modes.js +385 -0
- package/dist/src/modes.js.map +1 -0
- package/dist/src/observability/tracer.d.ts +111 -0
- package/dist/src/observability/tracer.d.ts.map +1 -0
- package/dist/src/observability/tracer.js +300 -0
- package/dist/src/observability/tracer.js.map +1 -0
- package/dist/src/observability/types.d.ts +271 -0
- package/dist/src/observability/types.d.ts.map +1 -0
- package/dist/src/observability/types.js +24 -0
- package/dist/src/observability/types.js.map +1 -0
- package/dist/src/paths.d.ts +101 -0
- package/dist/src/paths.d.ts.map +1 -0
- package/dist/src/paths.js +148 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/persistence/index.d.ts +38 -0
- package/dist/src/persistence/index.d.ts.map +1 -0
- package/dist/src/persistence/index.js +48 -0
- package/dist/src/persistence/index.js.map +1 -0
- package/dist/src/persistence/migrator.d.ts +135 -0
- package/dist/src/persistence/migrator.d.ts.map +1 -0
- package/dist/src/persistence/migrator.js +303 -0
- package/dist/src/persistence/migrator.js.map +1 -0
- package/dist/src/persistence/schema.d.ts +101 -0
- package/dist/src/persistence/schema.d.ts.map +1 -0
- package/dist/src/persistence/schema.js +395 -0
- package/dist/src/persistence/schema.js.map +1 -0
- package/dist/src/providers/adapters/anthropic.d.ts +20 -0
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -0
- package/dist/src/providers/adapters/anthropic.js +124 -0
- package/dist/src/providers/adapters/anthropic.js.map +1 -0
- package/dist/src/providers/adapters/mock.d.ts +25 -0
- package/dist/src/providers/adapters/mock.d.ts.map +1 -0
- package/dist/src/providers/adapters/mock.js +133 -0
- package/dist/src/providers/adapters/mock.js.map +1 -0
- package/dist/src/providers/adapters/openai.d.ts +21 -0
- package/dist/src/providers/adapters/openai.d.ts.map +1 -0
- package/dist/src/providers/adapters/openai.js +126 -0
- package/dist/src/providers/adapters/openai.js.map +1 -0
- package/dist/src/providers/adapters/openrouter.d.ts +49 -0
- package/dist/src/providers/adapters/openrouter.d.ts.map +1 -0
- package/dist/src/providers/adapters/openrouter.js +363 -0
- package/dist/src/providers/adapters/openrouter.js.map +1 -0
- package/dist/src/providers/provider.d.ts +54 -0
- package/dist/src/providers/provider.d.ts.map +1 -0
- package/dist/src/providers/provider.js +111 -0
- package/dist/src/providers/provider.js.map +1 -0
- package/dist/src/providers/resilient-fetch.d.ts +99 -0
- package/dist/src/providers/resilient-fetch.d.ts.map +1 -0
- package/dist/src/providers/resilient-fetch.js +208 -0
- package/dist/src/providers/resilient-fetch.js.map +1 -0
- package/dist/src/providers/types.d.ts +227 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +24 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/session-picker.d.ts +28 -0
- package/dist/src/session-picker.d.ts.map +1 -0
- package/dist/src/session-picker.js +256 -0
- package/dist/src/session-picker.js.map +1 -0
- package/dist/src/test-sqlite.d.ts +2 -0
- package/dist/src/test-sqlite.d.ts.map +1 -0
- package/dist/src/test-sqlite.js +114 -0
- package/dist/src/test-sqlite.js.map +1 -0
- package/dist/src/tools/agent.d.ts +44 -0
- package/dist/src/tools/agent.d.ts.map +1 -0
- package/dist/src/tools/agent.js +110 -0
- package/dist/src/tools/agent.js.map +1 -0
- package/dist/src/tools/bash.d.ts +52 -0
- package/dist/src/tools/bash.d.ts.map +1 -0
- package/dist/src/tools/bash.js +141 -0
- package/dist/src/tools/bash.js.map +1 -0
- package/dist/src/tools/file.d.ts +47 -0
- package/dist/src/tools/file.d.ts.map +1 -0
- package/dist/src/tools/file.js +263 -0
- package/dist/src/tools/file.js.map +1 -0
- package/dist/src/tools/permission.d.ts +43 -0
- package/dist/src/tools/permission.d.ts.map +1 -0
- package/dist/src/tools/permission.js +216 -0
- package/dist/src/tools/permission.js.map +1 -0
- package/dist/src/tools/registry.d.ts +63 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +250 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/standard.d.ts +57 -0
- package/dist/src/tools/standard.d.ts.map +1 -0
- package/dist/src/tools/standard.js +113 -0
- package/dist/src/tools/standard.js.map +1 -0
- package/dist/src/tools/types.d.ts +146 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +28 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/tools/undo.d.ts +71 -0
- package/dist/src/tools/undo.d.ts.map +1 -0
- package/dist/src/tools/undo.js +123 -0
- package/dist/src/tools/undo.js.map +1 -0
- package/dist/src/tracing/cache-boundary-tracker.d.ts +189 -0
- package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -0
- package/dist/src/tracing/cache-boundary-tracker.js +411 -0
- package/dist/src/tracing/cache-boundary-tracker.js.map +1 -0
- package/dist/src/tracing/trace-collector.d.ts +274 -0
- package/dist/src/tracing/trace-collector.d.ts.map +1 -0
- package/dist/src/tracing/trace-collector.js +727 -0
- package/dist/src/tracing/trace-collector.js.map +1 -0
- package/dist/src/tracing/types.d.ts +657 -0
- package/dist/src/tracing/types.d.ts.map +1 -0
- package/dist/src/tracing/types.js +39 -0
- package/dist/src/tracing/types.js.map +1 -0
- package/dist/src/tricks/failure-evidence.d.ts +268 -0
- package/dist/src/tricks/failure-evidence.d.ts.map +1 -0
- package/dist/src/tricks/failure-evidence.js +544 -0
- package/dist/src/tricks/failure-evidence.js.map +1 -0
- package/dist/src/tricks/json-utils.d.ts +77 -0
- package/dist/src/tricks/json-utils.d.ts.map +1 -0
- package/dist/src/tricks/json-utils.js +247 -0
- package/dist/src/tricks/json-utils.js.map +1 -0
- package/dist/src/tricks/kv-cache-context.d.ts +227 -0
- package/dist/src/tricks/kv-cache-context.d.ts.map +1 -0
- package/dist/src/tricks/kv-cache-context.js +377 -0
- package/dist/src/tricks/kv-cache-context.js.map +1 -0
- package/dist/src/tricks/recitation.d.ts +208 -0
- package/dist/src/tricks/recitation.d.ts.map +1 -0
- package/dist/src/tricks/recitation.js +374 -0
- package/dist/src/tricks/recitation.js.map +1 -0
- package/dist/src/tricks/reversible-compaction.d.ts +251 -0
- package/dist/src/tricks/reversible-compaction.d.ts.map +1 -0
- package/dist/src/tricks/reversible-compaction.js +555 -0
- package/dist/src/tricks/reversible-compaction.js.map +1 -0
- package/dist/src/tricks/serialization-diversity.d.ts +197 -0
- package/dist/src/tricks/serialization-diversity.d.ts.map +1 -0
- package/dist/src/tricks/serialization-diversity.js +460 -0
- package/dist/src/tricks/serialization-diversity.js.map +1 -0
- package/dist/src/tui/app.d.ts +42 -0
- package/dist/src/tui/app.d.ts.map +1 -0
- package/dist/src/tui/app.js +1076 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/components/ApprovalDialog.d.ts +28 -0
- package/dist/src/tui/components/ApprovalDialog.d.ts.map +1 -0
- package/dist/src/tui/components/ApprovalDialog.js +59 -0
- package/dist/src/tui/components/ApprovalDialog.js.map +1 -0
- package/dist/src/tui/components/InputArea.d.ts +35 -0
- package/dist/src/tui/components/InputArea.d.ts.map +1 -0
- package/dist/src/tui/components/InputArea.js +144 -0
- package/dist/src/tui/components/InputArea.js.map +1 -0
- package/dist/src/tui/components/MessageItem.d.ts +28 -0
- package/dist/src/tui/components/MessageItem.d.ts.map +1 -0
- package/dist/src/tui/components/MessageItem.js +27 -0
- package/dist/src/tui/components/MessageItem.js.map +1 -0
- package/dist/src/tui/components/ScrollableBox.d.ts +41 -0
- package/dist/src/tui/components/ScrollableBox.d.ts.map +1 -0
- package/dist/src/tui/components/ScrollableBox.js +101 -0
- package/dist/src/tui/components/ScrollableBox.js.map +1 -0
- package/dist/src/tui/components/ToolCallItem.d.ts +33 -0
- package/dist/src/tui/components/ToolCallItem.d.ts.map +1 -0
- package/dist/src/tui/components/ToolCallItem.js +91 -0
- package/dist/src/tui/components/ToolCallItem.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +13 -0
- package/dist/src/tui/components/index.d.ts.map +1 -0
- package/dist/src/tui/components/index.js +15 -0
- package/dist/src/tui/components/index.js.map +1 -0
- package/dist/src/tui/event-display.d.ts +19 -0
- package/dist/src/tui/event-display.d.ts.map +1 -0
- package/dist/src/tui/event-display.js +178 -0
- package/dist/src/tui/event-display.js.map +1 -0
- package/dist/src/tui/index.d.ts +105 -0
- package/dist/src/tui/index.d.ts.map +1 -0
- package/dist/src/tui/index.js +214 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/input/CommandPalette.d.ts +55 -0
- package/dist/src/tui/input/CommandPalette.d.ts.map +1 -0
- package/dist/src/tui/input/CommandPalette.js +135 -0
- package/dist/src/tui/input/CommandPalette.js.map +1 -0
- package/dist/src/tui/input/index.d.ts +7 -0
- package/dist/src/tui/input/index.d.ts.map +1 -0
- package/dist/src/tui/input/index.js +7 -0
- package/dist/src/tui/input/index.js.map +1 -0
- package/dist/src/tui/theme/index.d.ts +45 -0
- package/dist/src/tui/theme/index.d.ts.map +1 -0
- package/dist/src/tui/theme/index.js +215 -0
- package/dist/src/tui/theme/index.js.map +1 -0
- package/dist/src/tui/types.d.ts +214 -0
- package/dist/src/tui/types.d.ts.map +1 -0
- package/dist/src/tui/types.js +27 -0
- package/dist/src/tui/types.js.map +1 -0
- package/dist/src/types.d.ts +905 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trick: JSON Utilities
|
|
3
|
+
*
|
|
4
|
+
* Robust JSON parsing utilities that handle:
|
|
5
|
+
* - Nested objects (the regex `\{[^}]*\}` problem)
|
|
6
|
+
* - Strings containing braces
|
|
7
|
+
* - Escaped quotes
|
|
8
|
+
* - Malformed JSON with recovery
|
|
9
|
+
* - LLM response extraction (code blocks, tool calls)
|
|
10
|
+
*/
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// CORE: EXTRACT JSON OBJECT
|
|
13
|
+
// =============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Extract a complete JSON object from text using brace-depth tracking.
|
|
16
|
+
*
|
|
17
|
+
* Unlike regex `\{[^}]*\}`, this properly handles:
|
|
18
|
+
* - Nested objects: `{"a": {"b": 1}}`
|
|
19
|
+
* - Nested arrays: `{"a": [1, [2, 3]]}`
|
|
20
|
+
* - Strings containing braces: `{"text": "hello { } world"}`
|
|
21
|
+
* - Escaped quotes: `{"text": "he said \"hi\""}`
|
|
22
|
+
*
|
|
23
|
+
* @param text - The text to search for JSON
|
|
24
|
+
* @param startFrom - Optional index to start searching from
|
|
25
|
+
* @returns The extracted JSON string and its end index, or null if not found
|
|
26
|
+
*/
|
|
27
|
+
export function extractJsonObject(text, startFrom = 0) {
|
|
28
|
+
// Find the first `{`
|
|
29
|
+
const start = text.indexOf('{', startFrom);
|
|
30
|
+
if (start === -1)
|
|
31
|
+
return null;
|
|
32
|
+
let depth = 0;
|
|
33
|
+
let inString = false;
|
|
34
|
+
let escape = false;
|
|
35
|
+
for (let i = start; i < text.length; i++) {
|
|
36
|
+
const char = text[i];
|
|
37
|
+
// Handle escape sequences inside strings
|
|
38
|
+
if (escape) {
|
|
39
|
+
escape = false;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (char === '\\' && inString) {
|
|
43
|
+
escape = true;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Toggle string state on unescaped quotes
|
|
47
|
+
if (char === '"') {
|
|
48
|
+
inString = !inString;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Only count braces outside of strings
|
|
52
|
+
if (!inString) {
|
|
53
|
+
if (char === '{' || char === '[')
|
|
54
|
+
depth++;
|
|
55
|
+
if (char === '}' || char === ']')
|
|
56
|
+
depth--;
|
|
57
|
+
if (depth === 0) {
|
|
58
|
+
// Found complete JSON object
|
|
59
|
+
return {
|
|
60
|
+
json: text.slice(start, i + 1),
|
|
61
|
+
endIndex: i + 1,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Incomplete JSON (unclosed braces)
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract all JSON objects from text.
|
|
71
|
+
*/
|
|
72
|
+
export function extractAllJsonObjects(text) {
|
|
73
|
+
const results = [];
|
|
74
|
+
let position = 0;
|
|
75
|
+
while (position < text.length) {
|
|
76
|
+
const extracted = extractJsonObject(text, position);
|
|
77
|
+
if (!extracted)
|
|
78
|
+
break;
|
|
79
|
+
results.push(extracted.json);
|
|
80
|
+
position = extracted.endIndex;
|
|
81
|
+
}
|
|
82
|
+
return results;
|
|
83
|
+
}
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// SAFE PARSE: MULTI-LEVEL FALLBACK
|
|
86
|
+
// =============================================================================
|
|
87
|
+
/**
|
|
88
|
+
* Safely parse JSON with multi-level fallback and recovery.
|
|
89
|
+
*
|
|
90
|
+
* Fallback levels:
|
|
91
|
+
* 1. Direct JSON.parse
|
|
92
|
+
* 2. Extract JSON object from surrounding text
|
|
93
|
+
* 3. Attempt malformed JSON recovery (if enabled)
|
|
94
|
+
*
|
|
95
|
+
* @param input - Raw input (may be JSON or text containing JSON)
|
|
96
|
+
* @param options - Parsing options
|
|
97
|
+
*/
|
|
98
|
+
export function safeParseJson(input, options = {}) {
|
|
99
|
+
const { context, attemptRecovery = true } = options;
|
|
100
|
+
if (!input || typeof input !== 'string') {
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: `Invalid input${context ? ` for ${context}` : ''}: expected string`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const trimmed = input.trim();
|
|
107
|
+
// Level 1: Direct parse
|
|
108
|
+
try {
|
|
109
|
+
const value = JSON.parse(trimmed);
|
|
110
|
+
return { success: true, value };
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Continue to fallbacks
|
|
114
|
+
}
|
|
115
|
+
// Level 2: Extract JSON object from text
|
|
116
|
+
const extracted = extractJsonObject(trimmed);
|
|
117
|
+
if (extracted) {
|
|
118
|
+
try {
|
|
119
|
+
const value = JSON.parse(extracted.json);
|
|
120
|
+
return { success: true, value };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Continue to recovery
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Level 3: Attempt recovery (if enabled)
|
|
127
|
+
if (attemptRecovery) {
|
|
128
|
+
const recovered = attemptJsonRecovery(trimmed);
|
|
129
|
+
if (recovered) {
|
|
130
|
+
try {
|
|
131
|
+
const value = JSON.parse(recovered);
|
|
132
|
+
return { success: true, value, recovered: true };
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Recovery failed
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
success: false,
|
|
141
|
+
error: `Failed to parse JSON${context ? ` for ${context}` : ''}: ${trimmed.slice(0, 50)}...`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Attempt to recover malformed JSON.
|
|
146
|
+
*
|
|
147
|
+
* Handles common issues:
|
|
148
|
+
* - Trailing commas: `{"a": 1,}`
|
|
149
|
+
* - Single quotes: `{'a': 1}`
|
|
150
|
+
* - Unquoted keys: `{a: 1}`
|
|
151
|
+
* - Missing quotes on string values: `{"a": hello}`
|
|
152
|
+
*/
|
|
153
|
+
function attemptJsonRecovery(input) {
|
|
154
|
+
let fixed = input;
|
|
155
|
+
// Remove trailing commas before } or ]
|
|
156
|
+
fixed = fixed.replace(/,(\s*[}\]])/g, '$1');
|
|
157
|
+
// Replace single quotes with double quotes (simple cases only)
|
|
158
|
+
// This is intentionally conservative to avoid breaking strings with apostrophes
|
|
159
|
+
if (fixed.includes("'") && !fixed.includes('"')) {
|
|
160
|
+
fixed = fixed.replace(/'/g, '"');
|
|
161
|
+
}
|
|
162
|
+
// Try to quote unquoted keys: {foo: 1} -> {"foo": 1}
|
|
163
|
+
fixed = fixed.replace(/\{(\s*)([a-zA-Z_][a-zA-Z0-9_]*)(\s*):/g, '{$1"$2"$3:');
|
|
164
|
+
fixed = fixed.replace(/,(\s*)([a-zA-Z_][a-zA-Z0-9_]*)(\s*):/g, ',$1"$2"$3:');
|
|
165
|
+
// Only return if something changed
|
|
166
|
+
return fixed !== input ? fixed : null;
|
|
167
|
+
}
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// TOOL CALL EXTRACTION
|
|
170
|
+
// =============================================================================
|
|
171
|
+
/**
|
|
172
|
+
* Extract a tool call from an LLM response.
|
|
173
|
+
*
|
|
174
|
+
* Handles multiple formats:
|
|
175
|
+
* - Code block: ```json\n{"tool": "x", "input": {...}}\n```
|
|
176
|
+
* - Inline JSON: {"tool": "x", "input": {...}}
|
|
177
|
+
* - Nested inputs: {"tool": "x", "input": {"a": {"b": 1}}}
|
|
178
|
+
*
|
|
179
|
+
* @param response - The LLM response text
|
|
180
|
+
* @returns The extracted tool call, or null if not found
|
|
181
|
+
*/
|
|
182
|
+
export function extractToolCallJson(response) {
|
|
183
|
+
// Try code block first (most common format)
|
|
184
|
+
const codeBlockPatterns = [
|
|
185
|
+
/```json\s*([\s\S]*?)```/,
|
|
186
|
+
/```\s*([\s\S]*?)```/,
|
|
187
|
+
];
|
|
188
|
+
for (const pattern of codeBlockPatterns) {
|
|
189
|
+
const match = response.match(pattern);
|
|
190
|
+
if (match) {
|
|
191
|
+
const result = parseToolCallObject(match[1]);
|
|
192
|
+
if (result)
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Try extracting raw JSON from the response
|
|
197
|
+
const extracted = extractJsonObject(response);
|
|
198
|
+
if (extracted) {
|
|
199
|
+
const result = parseToolCallObject(extracted.json);
|
|
200
|
+
if (result)
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Parse a potential tool call object.
|
|
207
|
+
*/
|
|
208
|
+
function parseToolCallObject(text) {
|
|
209
|
+
const result = safeParseJson(text, {
|
|
210
|
+
context: 'tool call',
|
|
211
|
+
});
|
|
212
|
+
if (!result.success || !result.value)
|
|
213
|
+
return null;
|
|
214
|
+
const obj = result.value;
|
|
215
|
+
// Validate tool call structure
|
|
216
|
+
if (typeof obj.tool !== 'string')
|
|
217
|
+
return null;
|
|
218
|
+
return {
|
|
219
|
+
tool: obj.tool,
|
|
220
|
+
input: obj.input ?? {},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Extract multiple tool calls from a response.
|
|
225
|
+
*/
|
|
226
|
+
export function extractAllToolCalls(response) {
|
|
227
|
+
const results = [];
|
|
228
|
+
// Try code blocks first
|
|
229
|
+
const codeBlockPattern = /```(?:json)?\s*([\s\S]*?)```/g;
|
|
230
|
+
let match;
|
|
231
|
+
while ((match = codeBlockPattern.exec(response)) !== null) {
|
|
232
|
+
const result = parseToolCallObject(match[1]);
|
|
233
|
+
if (result)
|
|
234
|
+
results.push(result);
|
|
235
|
+
}
|
|
236
|
+
// If no code blocks found tool calls, try raw JSON objects
|
|
237
|
+
if (results.length === 0) {
|
|
238
|
+
const jsonObjects = extractAllJsonObjects(response);
|
|
239
|
+
for (const json of jsonObjects) {
|
|
240
|
+
const result = parseToolCallObject(json);
|
|
241
|
+
if (result)
|
|
242
|
+
results.push(result);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return results;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=json-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../../src/tricks/json-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trick P: KV-Cache Aware Context
|
|
3
|
+
*
|
|
4
|
+
* Optimizes context structure for LLM KV-cache efficiency.
|
|
5
|
+
* Cached input tokens cost ~10x less than uncached ones.
|
|
6
|
+
*
|
|
7
|
+
* Key principles:
|
|
8
|
+
* 1. Keep system prompt PREFIX stable (no timestamps, session IDs at start)
|
|
9
|
+
* 2. Use deterministic JSON serialization (sorted keys)
|
|
10
|
+
* 3. Mark explicit cache breakpoints
|
|
11
|
+
* 4. Append-only message history (never modify past messages)
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createCacheAwareContext, stableStringify } from './kv-cache-context';
|
|
16
|
+
*
|
|
17
|
+
* const context = createCacheAwareContext({
|
|
18
|
+
* staticPrefix: 'You are a helpful coding assistant.',
|
|
19
|
+
* cacheBreakpoints: ['system_end', 'tools_end'],
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Build system prompt with stable prefix
|
|
23
|
+
* const systemPrompt = context.buildSystemPrompt({
|
|
24
|
+
* rules: rulesContent,
|
|
25
|
+
* sessionId: 'abc123', // Goes at END, not beginning
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Serialize tool calls deterministically
|
|
29
|
+
* const serialized = stableStringify(toolCall.arguments);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Configuration for cache-aware context.
|
|
34
|
+
*/
|
|
35
|
+
export interface CacheAwareConfig {
|
|
36
|
+
/** Static prefix that never changes (maximizes cache hits) */
|
|
37
|
+
staticPrefix: string;
|
|
38
|
+
/** Points where cache can be safely broken */
|
|
39
|
+
cacheBreakpoints?: CacheBreakpoint[];
|
|
40
|
+
/** Whether to use deterministic JSON serialization */
|
|
41
|
+
deterministicJson?: boolean;
|
|
42
|
+
/** Whether to validate append-only constraint */
|
|
43
|
+
enforceAppendOnly?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Cache breakpoint markers.
|
|
47
|
+
*/
|
|
48
|
+
export type CacheBreakpoint = 'system_end' | 'tools_end' | 'rules_end' | 'memory_end' | 'custom';
|
|
49
|
+
/**
|
|
50
|
+
* Dynamic content that goes at the END of system prompt.
|
|
51
|
+
*/
|
|
52
|
+
export interface DynamicContent {
|
|
53
|
+
/** Current session ID */
|
|
54
|
+
sessionId?: string;
|
|
55
|
+
/** Current timestamp */
|
|
56
|
+
timestamp?: string;
|
|
57
|
+
/** Current mode */
|
|
58
|
+
mode?: string;
|
|
59
|
+
/** Any other dynamic values */
|
|
60
|
+
[key: string]: string | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Cache statistics.
|
|
64
|
+
*/
|
|
65
|
+
export interface CacheStats {
|
|
66
|
+
/** Estimated cacheable tokens */
|
|
67
|
+
cacheableTokens: number;
|
|
68
|
+
/** Estimated non-cacheable tokens */
|
|
69
|
+
nonCacheableTokens: number;
|
|
70
|
+
/** Cache efficiency ratio */
|
|
71
|
+
cacheRatio: number;
|
|
72
|
+
/** Estimated cost savings (0-1) */
|
|
73
|
+
estimatedSavings: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Message for context building.
|
|
77
|
+
*/
|
|
78
|
+
export interface ContextMessage {
|
|
79
|
+
id?: string;
|
|
80
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
81
|
+
content: string;
|
|
82
|
+
timestamp?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Events emitted by cache-aware context.
|
|
86
|
+
*/
|
|
87
|
+
export type CacheEvent = {
|
|
88
|
+
type: 'cache.breakpoint';
|
|
89
|
+
breakpoint: CacheBreakpoint;
|
|
90
|
+
position: number;
|
|
91
|
+
} | {
|
|
92
|
+
type: 'cache.violation';
|
|
93
|
+
reason: string;
|
|
94
|
+
details: string;
|
|
95
|
+
} | {
|
|
96
|
+
type: 'cache.stats';
|
|
97
|
+
stats: CacheStats;
|
|
98
|
+
};
|
|
99
|
+
export type CacheEventListener = (event: CacheEvent) => void;
|
|
100
|
+
/**
|
|
101
|
+
* Stringify JSON with sorted keys for deterministic output.
|
|
102
|
+
* This ensures the same object always produces the same string,
|
|
103
|
+
* which is critical for KV-cache efficiency.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* // Standard JSON.stringify - key order not guaranteed
|
|
108
|
+
* JSON.stringify({ b: 1, a: 2 }); // Could be '{"b":1,"a":2}' or '{"a":2,"b":1}'
|
|
109
|
+
*
|
|
110
|
+
* // stableStringify - always same order
|
|
111
|
+
* stableStringify({ b: 1, a: 2 }); // Always '{"a":2,"b":1}'
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function stableStringify(obj: unknown, indent?: number): string;
|
|
115
|
+
/**
|
|
116
|
+
* Parse JSON and re-serialize deterministically.
|
|
117
|
+
* Useful for normalizing JSON strings from external sources.
|
|
118
|
+
*/
|
|
119
|
+
export declare function normalizeJson(jsonString: string): string;
|
|
120
|
+
/**
|
|
121
|
+
* Manages context in a KV-cache-friendly way.
|
|
122
|
+
*/
|
|
123
|
+
export declare class CacheAwareContext {
|
|
124
|
+
private config;
|
|
125
|
+
private messageHashes;
|
|
126
|
+
private listeners;
|
|
127
|
+
private breakpointPositions;
|
|
128
|
+
constructor(config: CacheAwareConfig);
|
|
129
|
+
/**
|
|
130
|
+
* Build system prompt with stable prefix and dynamic content at END.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const prompt = context.buildSystemPrompt({
|
|
135
|
+
* rules: 'Follow these rules...',
|
|
136
|
+
* tools: toolDescriptions,
|
|
137
|
+
* dynamic: { sessionId: 'abc', mode: 'build' },
|
|
138
|
+
* });
|
|
139
|
+
* // Result:
|
|
140
|
+
* // "You are a helpful assistant. <- STABLE (cached)
|
|
141
|
+
* //
|
|
142
|
+
* // ## Rules
|
|
143
|
+
* // Follow these rules... <- Semi-stable (cached if unchanged)
|
|
144
|
+
* //
|
|
145
|
+
* // ## Tools
|
|
146
|
+
* // [tool descriptions] <- Semi-stable
|
|
147
|
+
* //
|
|
148
|
+
* // ---
|
|
149
|
+
* // Session: abc | Mode: build" <- DYNAMIC (not cached)
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
buildSystemPrompt(options: {
|
|
153
|
+
rules?: string;
|
|
154
|
+
tools?: string;
|
|
155
|
+
memory?: string;
|
|
156
|
+
dynamic?: DynamicContent;
|
|
157
|
+
}): string;
|
|
158
|
+
/**
|
|
159
|
+
* Validate that messages follow append-only constraint.
|
|
160
|
+
* Returns violations if any past messages were modified.
|
|
161
|
+
*/
|
|
162
|
+
validateAppendOnly(messages: ContextMessage[]): string[];
|
|
163
|
+
/**
|
|
164
|
+
* Serialize a message in a cache-friendly way.
|
|
165
|
+
*/
|
|
166
|
+
serializeMessage(message: ContextMessage): string;
|
|
167
|
+
/**
|
|
168
|
+
* Serialize tool arguments deterministically.
|
|
169
|
+
*/
|
|
170
|
+
serializeToolArgs(args: Record<string, unknown>): string;
|
|
171
|
+
/**
|
|
172
|
+
* Calculate cache statistics for a context.
|
|
173
|
+
*/
|
|
174
|
+
calculateCacheStats(options: {
|
|
175
|
+
systemPrompt: string;
|
|
176
|
+
messages: ContextMessage[];
|
|
177
|
+
dynamicContentLength?: number;
|
|
178
|
+
}): CacheStats;
|
|
179
|
+
/**
|
|
180
|
+
* Get breakpoint positions.
|
|
181
|
+
*/
|
|
182
|
+
getBreakpointPositions(): Map<CacheBreakpoint, number>;
|
|
183
|
+
/**
|
|
184
|
+
* Subscribe to cache events.
|
|
185
|
+
*/
|
|
186
|
+
on(listener: CacheEventListener): () => void;
|
|
187
|
+
/**
|
|
188
|
+
* Reset message hashes (call when starting new session).
|
|
189
|
+
*/
|
|
190
|
+
reset(): void;
|
|
191
|
+
private hashMessage;
|
|
192
|
+
private markBreakpoint;
|
|
193
|
+
private emit;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a cache-aware context manager.
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const context = createCacheAwareContext({
|
|
201
|
+
* staticPrefix: `You are a coding assistant.
|
|
202
|
+
*
|
|
203
|
+
* You help users write, debug, and understand code.
|
|
204
|
+
* Always explain your reasoning.`,
|
|
205
|
+
* cacheBreakpoints: ['system_end', 'tools_end'],
|
|
206
|
+
* deterministicJson: true,
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
export declare function createCacheAwareContext(config: CacheAwareConfig): CacheAwareContext;
|
|
211
|
+
/**
|
|
212
|
+
* Check if a system prompt has timestamps/dynamic content at the start.
|
|
213
|
+
* Returns warnings about cache-unfriendly patterns.
|
|
214
|
+
*/
|
|
215
|
+
export declare function analyzeCacheEfficiency(systemPrompt: string): {
|
|
216
|
+
warnings: string[];
|
|
217
|
+
suggestions: string[];
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Format cache stats for display.
|
|
221
|
+
*/
|
|
222
|
+
export declare function formatCacheStats(stats: CacheStats): string;
|
|
223
|
+
/**
|
|
224
|
+
* Create a cache-friendly timestamp that goes at the end.
|
|
225
|
+
*/
|
|
226
|
+
export declare function createEndTimestamp(): string;
|
|
227
|
+
//# sourceMappingURL=kv-cache-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-cache-context.d.ts","sourceRoot":"","sources":["../../../src/tricks/kv-cache-context.ts"],"names":[],"mappings":"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"}
|