threadwell 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4170 -0
- package/README.md +393 -4
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +9 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +53 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +341 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +83 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +35 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +93 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +404 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +117 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +300 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +117 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +659 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +3210 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +141 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +441 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +88 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +243 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +615 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +38 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +153 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/continuity/continuity-files.d.ts +79 -0
- package/dist/core/continuity/continuity-files.d.ts.map +1 -0
- package/dist/core/continuity/continuity-files.js +326 -0
- package/dist/core/continuity/continuity-files.js.map +1 -0
- package/dist/core/continuity/continuity-intent-router.d.ts +9 -0
- package/dist/core/continuity/continuity-intent-router.d.ts.map +1 -0
- package/dist/core/continuity/continuity-intent-router.js +96 -0
- package/dist/core/continuity/continuity-intent-router.js.map +1 -0
- package/dist/core/continuity/continuity-manager.d.ts +28 -0
- package/dist/core/continuity/continuity-manager.d.ts.map +1 -0
- package/dist/core/continuity/continuity-manager.js +288 -0
- package/dist/core/continuity/continuity-manager.js.map +1 -0
- package/dist/core/continuity/continuity-service.d.ts +22 -0
- package/dist/core/continuity/continuity-service.d.ts.map +1 -0
- package/dist/core/continuity/continuity-service.js +34 -0
- package/dist/core/continuity/continuity-service.js.map +1 -0
- package/dist/core/continuity/index.d.ts +5 -0
- package/dist/core/continuity/index.d.ts.map +1 -0
- package/dist/core/continuity/index.js +5 -0
- package/dist/core/continuity/index.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +224 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1834 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +485 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +159 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +824 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1173 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +45 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +72 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +374 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/identity.d.ts +8 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +8 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +353 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +295 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/memory/adr/adr-candidates.d.ts +15 -0
- package/dist/core/memory/adr/adr-candidates.d.ts.map +1 -0
- package/dist/core/memory/adr/adr-candidates.js +63 -0
- package/dist/core/memory/adr/adr-candidates.js.map +1 -0
- package/dist/core/memory/adr/adr-format.d.ts +31 -0
- package/dist/core/memory/adr/adr-format.d.ts.map +1 -0
- package/dist/core/memory/adr/adr-format.js +138 -0
- package/dist/core/memory/adr/adr-format.js.map +1 -0
- package/dist/core/memory/adr/adr-service.d.ts +19 -0
- package/dist/core/memory/adr/adr-service.d.ts.map +1 -0
- package/dist/core/memory/adr/adr-service.js +63 -0
- package/dist/core/memory/adr/adr-service.js.map +1 -0
- package/dist/core/memory/adr/index.d.ts +4 -0
- package/dist/core/memory/adr/index.d.ts.map +1 -0
- package/dist/core/memory/adr/index.js +4 -0
- package/dist/core/memory/adr/index.js.map +1 -0
- package/dist/core/memory/content-ref.d.ts +22 -0
- package/dist/core/memory/content-ref.d.ts.map +1 -0
- package/dist/core/memory/content-ref.js +34 -0
- package/dist/core/memory/content-ref.js.map +1 -0
- package/dist/core/memory/context/context-candidates.d.ts +9 -0
- package/dist/core/memory/context/context-candidates.d.ts.map +1 -0
- package/dist/core/memory/context/context-candidates.js +64 -0
- package/dist/core/memory/context/context-candidates.js.map +1 -0
- package/dist/core/memory/context/context-diagnostics.d.ts +12 -0
- package/dist/core/memory/context/context-diagnostics.d.ts.map +1 -0
- package/dist/core/memory/context/context-diagnostics.js +50 -0
- package/dist/core/memory/context/context-diagnostics.js.map +1 -0
- package/dist/core/memory/context/context-format.d.ts +41 -0
- package/dist/core/memory/context/context-format.d.ts.map +1 -0
- package/dist/core/memory/context/context-format.js +199 -0
- package/dist/core/memory/context/context-format.js.map +1 -0
- package/dist/core/memory/context/index.d.ts +4 -0
- package/dist/core/memory/context/index.d.ts.map +1 -0
- package/dist/core/memory/context/index.js +4 -0
- package/dist/core/memory/context/index.js.map +1 -0
- package/dist/core/memory/context-pressure.d.ts +15 -0
- package/dist/core/memory/context-pressure.d.ts.map +1 -0
- package/dist/core/memory/context-pressure.js +36 -0
- package/dist/core/memory/context-pressure.js.map +1 -0
- package/dist/core/memory/continuity-import.d.ts +6 -0
- package/dist/core/memory/continuity-import.d.ts.map +1 -0
- package/dist/core/memory/continuity-import.js +63 -0
- package/dist/core/memory/continuity-import.js.map +1 -0
- package/dist/core/memory/dedupe.d.ts +10 -0
- package/dist/core/memory/dedupe.d.ts.map +1 -0
- package/dist/core/memory/dedupe.js +36 -0
- package/dist/core/memory/dedupe.js.map +1 -0
- package/dist/core/memory/embedding-adapter.d.ts +20 -0
- package/dist/core/memory/embedding-adapter.d.ts.map +1 -0
- package/dist/core/memory/embedding-adapter.js +11 -0
- package/dist/core/memory/embedding-adapter.js.map +1 -0
- package/dist/core/memory/event-summary.d.ts +7 -0
- package/dist/core/memory/event-summary.d.ts.map +1 -0
- package/dist/core/memory/event-summary.js +23 -0
- package/dist/core/memory/event-summary.js.map +1 -0
- package/dist/core/memory/feature/feature-format.d.ts +30 -0
- package/dist/core/memory/feature/feature-format.d.ts.map +1 -0
- package/dist/core/memory/feature/feature-format.js +121 -0
- package/dist/core/memory/feature/feature-format.js.map +1 -0
- package/dist/core/memory/feature/index.d.ts +2 -0
- package/dist/core/memory/feature/index.d.ts.map +1 -0
- package/dist/core/memory/feature/index.js +2 -0
- package/dist/core/memory/feature/index.js.map +1 -0
- package/dist/core/memory/ignore.d.ts +5 -0
- package/dist/core/memory/ignore.d.ts.map +1 -0
- package/dist/core/memory/ignore.js +26 -0
- package/dist/core/memory/ignore.js.map +1 -0
- package/dist/core/memory/index.d.ts +21 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js +20 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/memory-anchors.d.ts +11 -0
- package/dist/core/memory/memory-anchors.d.ts.map +1 -0
- package/dist/core/memory/memory-anchors.js +35 -0
- package/dist/core/memory/memory-anchors.js.map +1 -0
- package/dist/core/memory/memory-identity.d.ts +11 -0
- package/dist/core/memory/memory-identity.d.ts.map +1 -0
- package/dist/core/memory/memory-identity.js +19 -0
- package/dist/core/memory/memory-identity.js.map +1 -0
- package/dist/core/memory/memory-retrieval.d.ts +55 -0
- package/dist/core/memory/memory-retrieval.d.ts.map +1 -0
- package/dist/core/memory/memory-retrieval.js +128 -0
- package/dist/core/memory/memory-retrieval.js.map +1 -0
- package/dist/core/memory/memory-schema.d.ts +11 -0
- package/dist/core/memory/memory-schema.d.ts.map +1 -0
- package/dist/core/memory/memory-schema.js +111 -0
- package/dist/core/memory/memory-schema.js.map +1 -0
- package/dist/core/memory/memory-service.d.ts +35 -0
- package/dist/core/memory/memory-service.d.ts.map +1 -0
- package/dist/core/memory/memory-service.js +125 -0
- package/dist/core/memory/memory-service.js.map +1 -0
- package/dist/core/memory/memory-store.d.ts +37 -0
- package/dist/core/memory/memory-store.d.ts.map +1 -0
- package/dist/core/memory/memory-store.js +109 -0
- package/dist/core/memory/memory-store.js.map +1 -0
- package/dist/core/memory/memory-types.d.ts +55 -0
- package/dist/core/memory/memory-types.d.ts.map +1 -0
- package/dist/core/memory/memory-types.js +2 -0
- package/dist/core/memory/memory-types.js.map +1 -0
- package/dist/core/memory/redaction.d.ts +4 -0
- package/dist/core/memory/redaction.d.ts.map +1 -0
- package/dist/core/memory/redaction.js +49 -0
- package/dist/core/memory/redaction.js.map +1 -0
- package/dist/core/memory/sqlite-memory-store.d.ts +30 -0
- package/dist/core/memory/sqlite-memory-store.d.ts.map +1 -0
- package/dist/core/memory/sqlite-memory-store.js +300 -0
- package/dist/core/memory/sqlite-memory-store.js.map +1 -0
- package/dist/core/memory/startup-order.d.ts +9 -0
- package/dist/core/memory/startup-order.d.ts.map +1 -0
- package/dist/core/memory/startup-order.js +39 -0
- package/dist/core/memory/startup-order.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +150 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +727 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +110 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +494 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +198 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1961 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +52 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +250 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +32 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +23 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +126 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +194 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +731 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +107 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +282 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +333 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1109 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +295 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +842 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +404 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +14 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +32 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +120 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +8 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +31 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +68 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +335 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +85 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +338 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +49 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +324 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +298 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +304 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +40 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +112 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +169 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +50 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +178 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +288 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +26 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +213 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +583 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +31 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +279 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +122 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +182 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +481 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +26 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +58 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +111 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +78 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/flexible-viewport-spacer.d.ts +10 -0
- package/dist/modes/interactive/components/flexible-viewport-spacer.d.ts.map +1 -0
- package/dist/modes/interactive/components/flexible-viewport-spacer.js +20 -0
- package/dist/modes/interactive/components/flexible-viewport-spacer.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +27 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +272 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +32 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +22 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +160 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +271 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +96 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +861 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +73 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +531 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/split-info-card.d.ts +18 -0
- package/dist/modes/interactive/components/split-info-card.d.ts.map +1 -0
- package/dist/modes/interactive/components/split-info-card.js +82 -0
- package/dist/modes/interactive/components/split-info-card.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +51 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +66 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +313 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1092 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +10 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +29 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +369 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +4899 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +81 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +971 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +131 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +224 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +410 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +601 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +419 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +460 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +12 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +86 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +8 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard-text.d.ts +4 -0
- package/dist/utils/clipboard-text.d.ts.map +1 -0
- package/dist/utils/clipboard-text.js +37 -0
- package/dist/utils/clipboard-text.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +117 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +39 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +137 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/paths.d.ts +14 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +34 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +30 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +190 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/threadwell-user-agent.d.ts +2 -0
- package/dist/utils/threadwell-user-agent.d.ts.map +1 -0
- package/dist/utils/threadwell-user-agent.js +5 -0
- package/dist/utils/threadwell-user-agent.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +256 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +77 -0
- package/dist/utils/version-check.js.map +1 -0
- package/docs/compaction.md +394 -0
- package/docs/custom-provider.md +646 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2596 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +64 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/memory.md +484 -0
- package/docs/models.md +474 -0
- package/docs/packages.md +223 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +241 -0
- package/docs/quickstart.md +142 -0
- package/docs/rpc.md +1407 -0
- package/docs/sdk.md +1149 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +378 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +232 -0
- package/docs/terminal-setup.md +106 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +277 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +147 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +436 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +987 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +62 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +44 -0
- package/examples/sdk/06-extensions.ts +90 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +73 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +147 -0
- package/package.json +101 -33
- package/LICENSE +0 -21
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const EPHEMERAL_PATTERNS = /\b(today|now|currently|temporary|todo|fix this|error log|stack trace|npm run|validation|token|secret|password)\b/i;
|
|
2
|
+
function cleanTerm(value) {
|
|
3
|
+
return value
|
|
4
|
+
.replaceAll("`", "")
|
|
5
|
+
.replace(/[.:;]+$/g, "")
|
|
6
|
+
.trim();
|
|
7
|
+
}
|
|
8
|
+
function isUsefulTerm(term, meaning) {
|
|
9
|
+
if (term.length < 3 || meaning.length < 8)
|
|
10
|
+
return false;
|
|
11
|
+
if (term.length > 80 || meaning.length > 300)
|
|
12
|
+
return false;
|
|
13
|
+
if (EPHEMERAL_PATTERNS.test(`${term} ${meaning}`))
|
|
14
|
+
return false;
|
|
15
|
+
return /[A-Za-z]/.test(term) && /[A-Za-z]/.test(meaning);
|
|
16
|
+
}
|
|
17
|
+
function candidate(term, meaning, reason, confidence, source) {
|
|
18
|
+
const name = cleanTerm(term);
|
|
19
|
+
const description = cleanTerm(meaning);
|
|
20
|
+
if (!isUsefulTerm(name, description))
|
|
21
|
+
return undefined;
|
|
22
|
+
return { name, meaning: description, reason, confidence, source };
|
|
23
|
+
}
|
|
24
|
+
export function detectContextCandidates(text, source = "user") {
|
|
25
|
+
const candidates = [];
|
|
26
|
+
const patterns = [
|
|
27
|
+
{
|
|
28
|
+
regex: /\b(?:call|llam(?:a|emos)|use|usar)\s+(.+?)\s+(?:as|como)\s+(.+?)(?:\.|\n|$)/gi,
|
|
29
|
+
reason: "explicit naming convention",
|
|
30
|
+
confidence: 0.8,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
regex: /\b(.+?)\s+(?:means|significa|is defined as|se define como)\s+(.+?)(?:\.|\n|$)/gi,
|
|
34
|
+
reason: "explicit term definition",
|
|
35
|
+
confidence: 0.85,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
regex: /\b(?:in this project|en este proyecto),?\s+(.+?)\s+(?:means|significa|refers to|se refiere a)\s+(.+?)(?:\.|\n|$)/gi,
|
|
39
|
+
reason: "project-scoped vocabulary",
|
|
40
|
+
confidence: 0.9,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
for (const pattern of patterns) {
|
|
44
|
+
for (const match of text.matchAll(pattern.regex)) {
|
|
45
|
+
const found = candidate(match[1], match[2], pattern.reason, pattern.confidence, source);
|
|
46
|
+
if (found)
|
|
47
|
+
candidates.push(found);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return dedupeContextCandidates(candidates);
|
|
51
|
+
}
|
|
52
|
+
export function dedupeContextCandidates(candidates) {
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
const deduped = [];
|
|
55
|
+
for (const entry of candidates) {
|
|
56
|
+
const key = entry.name.toLowerCase();
|
|
57
|
+
if (seen.has(key))
|
|
58
|
+
continue;
|
|
59
|
+
seen.add(key);
|
|
60
|
+
deduped.push(entry);
|
|
61
|
+
}
|
|
62
|
+
return deduped.sort((left, right) => right.confidence - left.confidence);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=context-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-candidates.js","sourceRoot":"","sources":["../../../../src/core/memory/context/context-candidates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextTerm } from \"./context-format.js\";\n\nexport interface ContextCandidate extends ContextTerm {\n\treason: string;\n\tconfidence: number;\n\tsource: \"user\" | \"assistant\" | \"memory\";\n}\n\nconst EPHEMERAL_PATTERNS =\n\t/\\b(today|now|currently|temporary|todo|fix this|error log|stack trace|npm run|validation|token|secret|password)\\b/i;\n\nfunction cleanTerm(value: string): string {\n\treturn value\n\t\t.replaceAll(\"`\", \"\")\n\t\t.replace(/[.:;]+$/g, \"\")\n\t\t.trim();\n}\n\nfunction isUsefulTerm(term: string, meaning: string): boolean {\n\tif (term.length < 3 || meaning.length < 8) return false;\n\tif (term.length > 80 || meaning.length > 300) return false;\n\tif (EPHEMERAL_PATTERNS.test(`${term} ${meaning}`)) return false;\n\treturn /[A-Za-z]/.test(term) && /[A-Za-z]/.test(meaning);\n}\n\nfunction candidate(\n\tterm: string,\n\tmeaning: string,\n\treason: string,\n\tconfidence: number,\n\tsource: ContextCandidate[\"source\"],\n): ContextCandidate | undefined {\n\tconst name = cleanTerm(term);\n\tconst description = cleanTerm(meaning);\n\tif (!isUsefulTerm(name, description)) return undefined;\n\treturn { name, meaning: description, reason, confidence, source };\n}\n\nexport function detectContextCandidates(text: string, source: ContextCandidate[\"source\"] = \"user\"): ContextCandidate[] {\n\tconst candidates: ContextCandidate[] = [];\n\tconst patterns: Array<{ regex: RegExp; reason: string; confidence: number }> = [\n\t\t{\n\t\t\tregex: /\\b(?:call|llam(?:a|emos)|use|usar)\\s+(.+?)\\s+(?:as|como)\\s+(.+?)(?:\\.|\\n|$)/gi,\n\t\t\treason: \"explicit naming convention\",\n\t\t\tconfidence: 0.8,\n\t\t},\n\t\t{\n\t\t\tregex: /\\b(.+?)\\s+(?:means|significa|is defined as|se define como)\\s+(.+?)(?:\\.|\\n|$)/gi,\n\t\t\treason: \"explicit term definition\",\n\t\t\tconfidence: 0.85,\n\t\t},\n\t\t{\n\t\t\tregex: /\\b(?:in this project|en este proyecto),?\\s+(.+?)\\s+(?:means|significa|refers to|se refiere a)\\s+(.+?)(?:\\.|\\n|$)/gi,\n\t\t\treason: \"project-scoped vocabulary\",\n\t\t\tconfidence: 0.9,\n\t\t},\n\t];\n\tfor (const pattern of patterns) {\n\t\tfor (const match of text.matchAll(pattern.regex)) {\n\t\t\tconst found = candidate(match[1], match[2], pattern.reason, pattern.confidence, source);\n\t\t\tif (found) candidates.push(found);\n\t\t}\n\t}\n\treturn dedupeContextCandidates(candidates);\n}\n\nexport function dedupeContextCandidates(candidates: readonly ContextCandidate[]): ContextCandidate[] {\n\tconst seen = new Set<string>();\n\tconst deduped: ContextCandidate[] = [];\n\tfor (const entry of candidates) {\n\t\tconst key = entry.name.toLowerCase();\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tdeduped.push(entry);\n\t}\n\treturn deduped.sort((left, right) => right.confidence - left.confidence);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ContextDocument } from "./context-format.js";
|
|
2
|
+
export type ContextDiagnosticSeverity = "info" | "warning" | "error";
|
|
3
|
+
export interface ContextDiagnostic {
|
|
4
|
+
severity: ContextDiagnosticSeverity;
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
term?: string;
|
|
8
|
+
suggestion?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function diagnoseContextDocument(document: ContextDocument): ContextDiagnostic[];
|
|
11
|
+
export declare function renderContextDiagnostics(diagnostics: readonly ContextDiagnostic[]): string;
|
|
12
|
+
//# sourceMappingURL=context-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-diagnostics.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/context/context-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,iBAAiB,EAAE,CAmCtF;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAU1F","sourcesContent":["import type { ContextDocument } from \"./context-format.js\";\n\nexport type ContextDiagnosticSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface ContextDiagnostic {\n\tseverity: ContextDiagnosticSeverity;\n\tcode: string;\n\tmessage: string;\n\tterm?: string;\n\tsuggestion?: string;\n}\n\nconst FORBIDDEN_HISTORY_PATTERNS =\n\t/\\b(npm run|stack trace|today I|current task|todo|temporary|raw output|password|secret|token)\\b/i;\n\nexport function diagnoseContextDocument(document: ContextDocument): ContextDiagnostic[] {\n\tconst diagnostics: ContextDiagnostic[] = [];\n\tconst seenTerms = new Map<string, string>();\n\tfor (const term of document.terms) {\n\t\tconst key = term.name.toLowerCase();\n\t\tconst existing = seenTerms.get(key);\n\t\tif (existing && existing !== term.meaning) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"duplicate-term-conflict\",\n\t\t\t\tterm: term.name,\n\t\t\t\tmessage: `Term \"${term.name}\" has multiple meanings.`,\n\t\t\t\tsuggestion: \"Merge the duplicate entries or clarify aliases/related terms.\",\n\t\t\t});\n\t\t}\n\t\tseenTerms.set(key, term.meaning);\n\t\tif (FORBIDDEN_HISTORY_PATTERNS.test(`${term.name} ${term.meaning}`)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"ephemeral-or-sensitive-term\",\n\t\t\t\tterm: term.name,\n\t\t\t\tmessage: `Term \"${term.name}\" looks ephemeral, task-history-like, or sensitive.`,\n\t\t\t\tsuggestion: \"Remove raw progress, validation output, secrets, or task history from CONTEXT.md.\",\n\t\t\t});\n\t\t}\n\t}\n\tif (!document.purpose.trim()) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"missing-purpose\",\n\t\t\tmessage: \"CONTEXT.md has no project purpose.\",\n\t\t\tsuggestion: \"Add a stable project purpose in the Purpose section.\",\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nexport function renderContextDiagnostics(diagnostics: readonly ContextDiagnostic[]): string {\n\tif (diagnostics.length === 0) return \"CONTEXT.md diagnostics: OK\";\n\treturn [\n\t\t\"CONTEXT.md diagnostics:\",\n\t\t...diagnostics.map((diagnostic) => {\n\t\t\tconst term = diagnostic.term ? ` (${diagnostic.term})` : \"\";\n\t\t\tconst suggestion = diagnostic.suggestion ? `\\n suggestion: ${diagnostic.suggestion}` : \"\";\n\t\t\treturn `- ${diagnostic.severity} ${diagnostic.code}${term}: ${diagnostic.message}${suggestion}`;\n\t\t}),\n\t].join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const FORBIDDEN_HISTORY_PATTERNS = /\b(npm run|stack trace|today I|current task|todo|temporary|raw output|password|secret|token)\b/i;
|
|
2
|
+
export function diagnoseContextDocument(document) {
|
|
3
|
+
const diagnostics = [];
|
|
4
|
+
const seenTerms = new Map();
|
|
5
|
+
for (const term of document.terms) {
|
|
6
|
+
const key = term.name.toLowerCase();
|
|
7
|
+
const existing = seenTerms.get(key);
|
|
8
|
+
if (existing && existing !== term.meaning) {
|
|
9
|
+
diagnostics.push({
|
|
10
|
+
severity: "warning",
|
|
11
|
+
code: "duplicate-term-conflict",
|
|
12
|
+
term: term.name,
|
|
13
|
+
message: `Term "${term.name}" has multiple meanings.`,
|
|
14
|
+
suggestion: "Merge the duplicate entries or clarify aliases/related terms.",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
seenTerms.set(key, term.meaning);
|
|
18
|
+
if (FORBIDDEN_HISTORY_PATTERNS.test(`${term.name} ${term.meaning}`)) {
|
|
19
|
+
diagnostics.push({
|
|
20
|
+
severity: "warning",
|
|
21
|
+
code: "ephemeral-or-sensitive-term",
|
|
22
|
+
term: term.name,
|
|
23
|
+
message: `Term "${term.name}" looks ephemeral, task-history-like, or sensitive.`,
|
|
24
|
+
suggestion: "Remove raw progress, validation output, secrets, or task history from CONTEXT.md.",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!document.purpose.trim()) {
|
|
29
|
+
diagnostics.push({
|
|
30
|
+
severity: "info",
|
|
31
|
+
code: "missing-purpose",
|
|
32
|
+
message: "CONTEXT.md has no project purpose.",
|
|
33
|
+
suggestion: "Add a stable project purpose in the Purpose section.",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return diagnostics;
|
|
37
|
+
}
|
|
38
|
+
export function renderContextDiagnostics(diagnostics) {
|
|
39
|
+
if (diagnostics.length === 0)
|
|
40
|
+
return "CONTEXT.md diagnostics: OK";
|
|
41
|
+
return [
|
|
42
|
+
"CONTEXT.md diagnostics:",
|
|
43
|
+
...diagnostics.map((diagnostic) => {
|
|
44
|
+
const term = diagnostic.term ? ` (${diagnostic.term})` : "";
|
|
45
|
+
const suggestion = diagnostic.suggestion ? `\n suggestion: ${diagnostic.suggestion}` : "";
|
|
46
|
+
return `- ${diagnostic.severity} ${diagnostic.code}${term}: ${diagnostic.message}${suggestion}`;
|
|
47
|
+
}),
|
|
48
|
+
].join("\n");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=context-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-diagnostics.js","sourceRoot":"","sources":["../../../../src/core/memory/context/context-diagnostics.ts"],"names":[],"mappings":"AAYA,MAAM,0BAA0B,GAC/B,iGAAiG,CAAC;AAEnG,MAAM,UAAU,uBAAuB,CAAC,QAAyB,EAAuB;IACvF,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,WAAW,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,yBAAyB;gBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,0BAA0B;gBACrD,UAAU,EAAE,+DAA+D;aAC3E,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACrE,WAAW,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,qDAAqD;gBAChF,UAAU,EAAE,mFAAmF;aAC/F,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,oCAAoC;YAC7C,UAAU,EAAE,sDAAsD;SAClE,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;AAAA,CACnB;AAED,MAAM,UAAU,wBAAwB,CAAC,WAAyC,EAAU;IAC3F,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,4BAA4B,CAAC;IAClE,OAAO;QACN,yBAAyB;QACzB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,KAAK,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;QAAA,CAChG,CAAC;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb","sourcesContent":["import type { ContextDocument } from \"./context-format.js\";\n\nexport type ContextDiagnosticSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface ContextDiagnostic {\n\tseverity: ContextDiagnosticSeverity;\n\tcode: string;\n\tmessage: string;\n\tterm?: string;\n\tsuggestion?: string;\n}\n\nconst FORBIDDEN_HISTORY_PATTERNS =\n\t/\\b(npm run|stack trace|today I|current task|todo|temporary|raw output|password|secret|token)\\b/i;\n\nexport function diagnoseContextDocument(document: ContextDocument): ContextDiagnostic[] {\n\tconst diagnostics: ContextDiagnostic[] = [];\n\tconst seenTerms = new Map<string, string>();\n\tfor (const term of document.terms) {\n\t\tconst key = term.name.toLowerCase();\n\t\tconst existing = seenTerms.get(key);\n\t\tif (existing && existing !== term.meaning) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"duplicate-term-conflict\",\n\t\t\t\tterm: term.name,\n\t\t\t\tmessage: `Term \"${term.name}\" has multiple meanings.`,\n\t\t\t\tsuggestion: \"Merge the duplicate entries or clarify aliases/related terms.\",\n\t\t\t});\n\t\t}\n\t\tseenTerms.set(key, term.meaning);\n\t\tif (FORBIDDEN_HISTORY_PATTERNS.test(`${term.name} ${term.meaning}`)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"ephemeral-or-sensitive-term\",\n\t\t\t\tterm: term.name,\n\t\t\t\tmessage: `Term \"${term.name}\" looks ephemeral, task-history-like, or sensitive.`,\n\t\t\t\tsuggestion: \"Remove raw progress, validation output, secrets, or task history from CONTEXT.md.\",\n\t\t\t});\n\t\t}\n\t}\n\tif (!document.purpose.trim()) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"missing-purpose\",\n\t\t\tmessage: \"CONTEXT.md has no project purpose.\",\n\t\t\tsuggestion: \"Add a stable project purpose in the Purpose section.\",\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nexport function renderContextDiagnostics(diagnostics: readonly ContextDiagnostic[]): string {\n\tif (diagnostics.length === 0) return \"CONTEXT.md diagnostics: OK\";\n\treturn [\n\t\t\"CONTEXT.md diagnostics:\",\n\t\t...diagnostics.map((diagnostic) => {\n\t\t\tconst term = diagnostic.term ? ` (${diagnostic.term})` : \"\";\n\t\t\tconst suggestion = diagnostic.suggestion ? `\\n suggestion: ${diagnostic.suggestion}` : \"\";\n\t\t\treturn `- ${diagnostic.severity} ${diagnostic.code}${term}: ${diagnostic.message}${suggestion}`;\n\t\t}),\n\t].join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface ContextTerm {
|
|
2
|
+
name: string;
|
|
3
|
+
meaning: string;
|
|
4
|
+
aliases?: string[];
|
|
5
|
+
related?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface ContextConvention {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ContextDocument {
|
|
12
|
+
project: string;
|
|
13
|
+
purpose: string;
|
|
14
|
+
terms: ContextTerm[];
|
|
15
|
+
conventions: ContextConvention[];
|
|
16
|
+
openQuestions: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface ContextWriteResult {
|
|
19
|
+
path: string;
|
|
20
|
+
changed: boolean;
|
|
21
|
+
addedTerms: string[];
|
|
22
|
+
skippedTerms: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare const CONTEXT_FILE_NAME = "CONTEXT.md";
|
|
25
|
+
export declare function createContextScaffold(projectName: string): string;
|
|
26
|
+
export declare function parseContextDocument(markdown: string): ContextDocument;
|
|
27
|
+
export declare function getContextPath(projectRoot: string): string;
|
|
28
|
+
export declare function ensureContextScaffold(projectRoot: string, projectName: string): {
|
|
29
|
+
path: string;
|
|
30
|
+
created: boolean;
|
|
31
|
+
};
|
|
32
|
+
export declare function mergeAcceptedContextTerms(markdown: string, terms: readonly ContextTerm[]): {
|
|
33
|
+
markdown: string;
|
|
34
|
+
addedTerms: string[];
|
|
35
|
+
skippedTerms: string[];
|
|
36
|
+
};
|
|
37
|
+
export declare function writeAcceptedContextTerms(projectRoot: string, projectName: string, terms: readonly ContextTerm[]): ContextWriteResult;
|
|
38
|
+
export declare function findRelevantContextTerms(document: ContextDocument, query: string, limit?: number): ContextTerm[];
|
|
39
|
+
export declare function renderContextTerms(terms: readonly ContextTerm[]): string | undefined;
|
|
40
|
+
export declare function readContextDocument(projectRoot: string): ContextDocument | undefined;
|
|
41
|
+
//# sourceMappingURL=context-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-format.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/context/context-format.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAW9C,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA+BjE;AA0DD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAQtE;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAMlH;AA0BD,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC3B;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB,CAYA;AAED,wBAAgB,yBAAyB,CACxC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC3B,kBAAkB,CAapB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,WAAW,EAAE,CAqB3G;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CAGpF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAIpF","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ContextTerm {\n\tname: string;\n\tmeaning: string;\n\taliases?: string[];\n\trelated?: string[];\n}\n\nexport interface ContextConvention {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface ContextDocument {\n\tproject: string;\n\tpurpose: string;\n\tterms: ContextTerm[];\n\tconventions: ContextConvention[];\n\topenQuestions: string[];\n}\n\nexport interface ContextWriteResult {\n\tpath: string;\n\tchanged: boolean;\n\taddedTerms: string[];\n\tskippedTerms: string[];\n}\n\nexport const CONTEXT_FILE_NAME = \"CONTEXT.md\";\n\nconst SECTION_HEADINGS = [\n\t\"## Project\",\n\t\"## Purpose\",\n\t\"## Terms\",\n\t\"## Conventions\",\n\t\"## Open Questions\",\n\t\"## Not For This File\",\n] as const;\n\nexport function createContextScaffold(projectName: string): string {\n\treturn `# ${projectName} Context\n\n## Project\n\n${projectName}\n\n## Purpose\n\nDescribe the stable project purpose, domain, and mental model here.\n\n## Terms\n\n<!-- Threadwell writes accepted stable vocabulary here. Keep task history out. -->\n\n- **Example term**: Replace with project-specific language.\n - Aliases: example alias\n - Related: related concept\n\n## Conventions\n\n- **Naming**: Record durable naming and architecture conventions here.\n\n## Open Questions\n\n- Record durable semantic ambiguities that need user clarification.\n\n## Not For This File\n\nDo not store raw logs, transient task history, secrets, validation output, or ephemeral progress here.\n`;\n}\n\nfunction sectionBody(markdown: string, heading: string): string {\n\tconst start = markdown.indexOf(heading);\n\tif (start === -1) return \"\";\n\tconst bodyStart = start + heading.length;\n\tconst next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))\n\t\t.filter((index) => index !== -1)\n\t\t.sort((left, right) => left - right)[0];\n\treturn markdown.slice(bodyStart, next ?? markdown.length).trim();\n}\n\nfunction parseTerms(body: string): ContextTerm[] {\n\tconst terms: ContextTerm[] = [];\n\tconst blocks = body.split(/\\n(?=- \\*\\*)/g);\n\tfor (const block of blocks) {\n\t\tconst firstLine = block.split(/\\r?\\n/, 1)[0]?.trim();\n\t\tconst match = firstLine?.match(/^- \\*\\*(.+?)\\*\\*:\\s*(.+)$/);\n\t\tif (!match) continue;\n\t\tconst aliases = block\n\t\t\t.match(/Aliases:\\s*(.+)/)?.[1]\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t\tconst related = block\n\t\t\t.match(/Related:\\s*(.+)/)?.[1]\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t\tterms.push({\n\t\t\tname: match[1].trim(),\n\t\t\tmeaning: match[2].trim(),\n\t\t\taliases: aliases && aliases.length > 0 ? aliases : undefined,\n\t\t\trelated: related && related.length > 0 ? related : undefined,\n\t\t});\n\t}\n\treturn terms;\n}\n\nfunction parseConventions(body: string): ContextConvention[] {\n\treturn body\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.flatMap((line) => {\n\t\t\tconst match = line.match(/^- \\*\\*(.+?)\\*\\*:\\s*(.+)$/);\n\t\t\treturn match ? [{ name: match[1].trim(), description: match[2].trim() }] : [];\n\t\t});\n}\n\nfunction parseList(body: string): string[] {\n\treturn body\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.startsWith(\"- \"))\n\t\t.map((line) => line.slice(2).trim())\n\t\t.filter(Boolean);\n}\n\nexport function parseContextDocument(markdown: string): ContextDocument {\n\treturn {\n\t\tproject: sectionBody(markdown, \"## Project\") || \"Unknown project\",\n\t\tpurpose: sectionBody(markdown, \"## Purpose\"),\n\t\tterms: parseTerms(sectionBody(markdown, \"## Terms\")),\n\t\tconventions: parseConventions(sectionBody(markdown, \"## Conventions\")),\n\t\topenQuestions: parseList(sectionBody(markdown, \"## Open Questions\")),\n\t};\n}\n\nexport function getContextPath(projectRoot: string): string {\n\treturn join(projectRoot, CONTEXT_FILE_NAME);\n}\n\nexport function ensureContextScaffold(projectRoot: string, projectName: string): { path: string; created: boolean } {\n\tconst path = getContextPath(projectRoot);\n\tif (existsSync(path)) return { path, created: false };\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, createContextScaffold(projectName), \"utf-8\");\n\treturn { path, created: true };\n}\n\nfunction formatContextTerm(term: ContextTerm): string {\n\tconst aliases = term.aliases && term.aliases.length > 0 ? `\\n - Aliases: ${term.aliases.join(\", \")}` : \"\";\n\tconst related = term.related && term.related.length > 0 ? `\\n - Related: ${term.related.join(\", \")}` : \"\";\n\treturn `- **${term.name.trim()}**: ${term.meaning.trim()}${aliases}${related}`;\n}\n\nfunction isEphemeralContextTerm(term: ContextTerm): boolean {\n\tconst text = `${term.name} ${term.meaning}`.toLowerCase();\n\treturn /\\b(task|todo|log|today|yesterday|temporary|validation output|stack trace|raw output|secret|token|password)\\b/.test(\n\t\ttext,\n\t);\n}\n\nfunction insertBeforeNextSection(markdown: string, heading: string, content: string): string {\n\tconst start = markdown.indexOf(heading);\n\tif (start === -1) return `${markdown.trimEnd()}\\n\\n${heading}\\n\\n${content}\\n`;\n\tconst bodyStart = start + heading.length;\n\tconst next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))\n\t\t.filter((index) => index !== -1)\n\t\t.sort((left, right) => left - right)[0];\n\tif (next === undefined) return `${markdown.trimEnd()}\\n${content}\\n`;\n\treturn `${markdown.slice(0, next).trimEnd()}\\n${content}\\n\\n${markdown.slice(next).trimStart()}`;\n}\n\nexport function mergeAcceptedContextTerms(\n\tmarkdown: string,\n\tterms: readonly ContextTerm[],\n): {\n\tmarkdown: string;\n\taddedTerms: string[];\n\tskippedTerms: string[];\n} {\n\tconst document = parseContextDocument(markdown);\n\tconst existing = new Set(document.terms.map((term) => term.name.toLowerCase()));\n\tconst accepted = terms.filter((term) => term.name.trim() && term.meaning.trim() && !isEphemeralContextTerm(term));\n\tconst added = accepted.filter((term) => !existing.has(term.name.toLowerCase()));\n\tconst skippedTerms = terms\n\t\t.filter((term) => !added.includes(term))\n\t\t.map((term) => term.name.trim())\n\t\t.filter(Boolean);\n\tif (added.length === 0) return { markdown, addedTerms: [], skippedTerms };\n\tconst nextMarkdown = insertBeforeNextSection(markdown, \"## Terms\", `\\n${added.map(formatContextTerm).join(\"\\n\")}`);\n\treturn { markdown: nextMarkdown, addedTerms: added.map((term) => term.name), skippedTerms };\n}\n\nexport function writeAcceptedContextTerms(\n\tprojectRoot: string,\n\tprojectName: string,\n\tterms: readonly ContextTerm[],\n): ContextWriteResult {\n\tconst scaffold = ensureContextScaffold(projectRoot, projectName);\n\tconst current = readFileSync(scaffold.path, \"utf-8\");\n\tconst merged = mergeAcceptedContextTerms(current, terms);\n\tif (merged.markdown !== current) {\n\t\twriteFileSync(scaffold.path, merged.markdown, \"utf-8\");\n\t}\n\treturn {\n\t\tpath: scaffold.path,\n\t\tchanged: merged.markdown !== current,\n\t\taddedTerms: merged.addedTerms,\n\t\tskippedTerms: merged.skippedTerms,\n\t};\n}\n\nexport function findRelevantContextTerms(document: ContextDocument, query: string, limit = 5): ContextTerm[] {\n\tconst tokens = new Set(\n\t\tquery\n\t\t\t.toLowerCase()\n\t\t\t.split(/[^a-z0-9_-]+/i)\n\t\t\t.map((token) => token.trim())\n\t\t\t.filter((token) => token.length >= 3),\n\t);\n\tif (tokens.size === 0) return [];\n\treturn document.terms\n\t\t.map((term) => {\n\t\t\tconst haystack = [term.name, term.meaning, ...(term.aliases ?? []), ...(term.related ?? [])]\n\t\t\t\t.join(\" \")\n\t\t\t\t.toLowerCase();\n\t\t\tconst score = [...tokens].filter((token) => haystack.includes(token)).length;\n\t\t\treturn { term, score };\n\t\t})\n\t\t.filter((entry) => entry.score > 0)\n\t\t.sort((left, right) => right.score - left.score)\n\t\t.slice(0, limit)\n\t\t.map((entry) => entry.term);\n}\n\nexport function renderContextTerms(terms: readonly ContextTerm[]): string | undefined {\n\tif (terms.length === 0) return undefined;\n\treturn [\"Relevant CONTEXT.md terms:\", ...terms.map((term) => `- ${term.name}: ${term.meaning}`)].join(\"\\n\");\n}\n\nexport function readContextDocument(projectRoot: string): ContextDocument | undefined {\n\tconst path = getContextPath(projectRoot);\n\tif (!existsSync(path)) return undefined;\n\treturn parseContextDocument(readFileSync(path, \"utf-8\"));\n}\n"]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
export const CONTEXT_FILE_NAME = "CONTEXT.md";
|
|
4
|
+
const SECTION_HEADINGS = [
|
|
5
|
+
"## Project",
|
|
6
|
+
"## Purpose",
|
|
7
|
+
"## Terms",
|
|
8
|
+
"## Conventions",
|
|
9
|
+
"## Open Questions",
|
|
10
|
+
"## Not For This File",
|
|
11
|
+
];
|
|
12
|
+
export function createContextScaffold(projectName) {
|
|
13
|
+
return `# ${projectName} Context
|
|
14
|
+
|
|
15
|
+
## Project
|
|
16
|
+
|
|
17
|
+
${projectName}
|
|
18
|
+
|
|
19
|
+
## Purpose
|
|
20
|
+
|
|
21
|
+
Describe the stable project purpose, domain, and mental model here.
|
|
22
|
+
|
|
23
|
+
## Terms
|
|
24
|
+
|
|
25
|
+
<!-- Threadwell writes accepted stable vocabulary here. Keep task history out. -->
|
|
26
|
+
|
|
27
|
+
- **Example term**: Replace with project-specific language.
|
|
28
|
+
- Aliases: example alias
|
|
29
|
+
- Related: related concept
|
|
30
|
+
|
|
31
|
+
## Conventions
|
|
32
|
+
|
|
33
|
+
- **Naming**: Record durable naming and architecture conventions here.
|
|
34
|
+
|
|
35
|
+
## Open Questions
|
|
36
|
+
|
|
37
|
+
- Record durable semantic ambiguities that need user clarification.
|
|
38
|
+
|
|
39
|
+
## Not For This File
|
|
40
|
+
|
|
41
|
+
Do not store raw logs, transient task history, secrets, validation output, or ephemeral progress here.
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
function sectionBody(markdown, heading) {
|
|
45
|
+
const start = markdown.indexOf(heading);
|
|
46
|
+
if (start === -1)
|
|
47
|
+
return "";
|
|
48
|
+
const bodyStart = start + heading.length;
|
|
49
|
+
const next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))
|
|
50
|
+
.filter((index) => index !== -1)
|
|
51
|
+
.sort((left, right) => left - right)[0];
|
|
52
|
+
return markdown.slice(bodyStart, next ?? markdown.length).trim();
|
|
53
|
+
}
|
|
54
|
+
function parseTerms(body) {
|
|
55
|
+
const terms = [];
|
|
56
|
+
const blocks = body.split(/\n(?=- \*\*)/g);
|
|
57
|
+
for (const block of blocks) {
|
|
58
|
+
const firstLine = block.split(/\r?\n/, 1)[0]?.trim();
|
|
59
|
+
const match = firstLine?.match(/^- \*\*(.+?)\*\*:\s*(.+)$/);
|
|
60
|
+
if (!match)
|
|
61
|
+
continue;
|
|
62
|
+
const aliases = block
|
|
63
|
+
.match(/Aliases:\s*(.+)/)?.[1]
|
|
64
|
+
.split(",")
|
|
65
|
+
.map((entry) => entry.trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
const related = block
|
|
68
|
+
.match(/Related:\s*(.+)/)?.[1]
|
|
69
|
+
.split(",")
|
|
70
|
+
.map((entry) => entry.trim())
|
|
71
|
+
.filter(Boolean);
|
|
72
|
+
terms.push({
|
|
73
|
+
name: match[1].trim(),
|
|
74
|
+
meaning: match[2].trim(),
|
|
75
|
+
aliases: aliases && aliases.length > 0 ? aliases : undefined,
|
|
76
|
+
related: related && related.length > 0 ? related : undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return terms;
|
|
80
|
+
}
|
|
81
|
+
function parseConventions(body) {
|
|
82
|
+
return body
|
|
83
|
+
.split(/\r?\n/)
|
|
84
|
+
.map((line) => line.trim())
|
|
85
|
+
.flatMap((line) => {
|
|
86
|
+
const match = line.match(/^- \*\*(.+?)\*\*:\s*(.+)$/);
|
|
87
|
+
return match ? [{ name: match[1].trim(), description: match[2].trim() }] : [];
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function parseList(body) {
|
|
91
|
+
return body
|
|
92
|
+
.split(/\r?\n/)
|
|
93
|
+
.map((line) => line.trim())
|
|
94
|
+
.filter((line) => line.startsWith("- "))
|
|
95
|
+
.map((line) => line.slice(2).trim())
|
|
96
|
+
.filter(Boolean);
|
|
97
|
+
}
|
|
98
|
+
export function parseContextDocument(markdown) {
|
|
99
|
+
return {
|
|
100
|
+
project: sectionBody(markdown, "## Project") || "Unknown project",
|
|
101
|
+
purpose: sectionBody(markdown, "## Purpose"),
|
|
102
|
+
terms: parseTerms(sectionBody(markdown, "## Terms")),
|
|
103
|
+
conventions: parseConventions(sectionBody(markdown, "## Conventions")),
|
|
104
|
+
openQuestions: parseList(sectionBody(markdown, "## Open Questions")),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function getContextPath(projectRoot) {
|
|
108
|
+
return join(projectRoot, CONTEXT_FILE_NAME);
|
|
109
|
+
}
|
|
110
|
+
export function ensureContextScaffold(projectRoot, projectName) {
|
|
111
|
+
const path = getContextPath(projectRoot);
|
|
112
|
+
if (existsSync(path))
|
|
113
|
+
return { path, created: false };
|
|
114
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
115
|
+
writeFileSync(path, createContextScaffold(projectName), "utf-8");
|
|
116
|
+
return { path, created: true };
|
|
117
|
+
}
|
|
118
|
+
function formatContextTerm(term) {
|
|
119
|
+
const aliases = term.aliases && term.aliases.length > 0 ? `\n - Aliases: ${term.aliases.join(", ")}` : "";
|
|
120
|
+
const related = term.related && term.related.length > 0 ? `\n - Related: ${term.related.join(", ")}` : "";
|
|
121
|
+
return `- **${term.name.trim()}**: ${term.meaning.trim()}${aliases}${related}`;
|
|
122
|
+
}
|
|
123
|
+
function isEphemeralContextTerm(term) {
|
|
124
|
+
const text = `${term.name} ${term.meaning}`.toLowerCase();
|
|
125
|
+
return /\b(task|todo|log|today|yesterday|temporary|validation output|stack trace|raw output|secret|token|password)\b/.test(text);
|
|
126
|
+
}
|
|
127
|
+
function insertBeforeNextSection(markdown, heading, content) {
|
|
128
|
+
const start = markdown.indexOf(heading);
|
|
129
|
+
if (start === -1)
|
|
130
|
+
return `${markdown.trimEnd()}\n\n${heading}\n\n${content}\n`;
|
|
131
|
+
const bodyStart = start + heading.length;
|
|
132
|
+
const next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))
|
|
133
|
+
.filter((index) => index !== -1)
|
|
134
|
+
.sort((left, right) => left - right)[0];
|
|
135
|
+
if (next === undefined)
|
|
136
|
+
return `${markdown.trimEnd()}\n${content}\n`;
|
|
137
|
+
return `${markdown.slice(0, next).trimEnd()}\n${content}\n\n${markdown.slice(next).trimStart()}`;
|
|
138
|
+
}
|
|
139
|
+
export function mergeAcceptedContextTerms(markdown, terms) {
|
|
140
|
+
const document = parseContextDocument(markdown);
|
|
141
|
+
const existing = new Set(document.terms.map((term) => term.name.toLowerCase()));
|
|
142
|
+
const accepted = terms.filter((term) => term.name.trim() && term.meaning.trim() && !isEphemeralContextTerm(term));
|
|
143
|
+
const added = accepted.filter((term) => !existing.has(term.name.toLowerCase()));
|
|
144
|
+
const skippedTerms = terms
|
|
145
|
+
.filter((term) => !added.includes(term))
|
|
146
|
+
.map((term) => term.name.trim())
|
|
147
|
+
.filter(Boolean);
|
|
148
|
+
if (added.length === 0)
|
|
149
|
+
return { markdown, addedTerms: [], skippedTerms };
|
|
150
|
+
const nextMarkdown = insertBeforeNextSection(markdown, "## Terms", `\n${added.map(formatContextTerm).join("\n")}`);
|
|
151
|
+
return { markdown: nextMarkdown, addedTerms: added.map((term) => term.name), skippedTerms };
|
|
152
|
+
}
|
|
153
|
+
export function writeAcceptedContextTerms(projectRoot, projectName, terms) {
|
|
154
|
+
const scaffold = ensureContextScaffold(projectRoot, projectName);
|
|
155
|
+
const current = readFileSync(scaffold.path, "utf-8");
|
|
156
|
+
const merged = mergeAcceptedContextTerms(current, terms);
|
|
157
|
+
if (merged.markdown !== current) {
|
|
158
|
+
writeFileSync(scaffold.path, merged.markdown, "utf-8");
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
path: scaffold.path,
|
|
162
|
+
changed: merged.markdown !== current,
|
|
163
|
+
addedTerms: merged.addedTerms,
|
|
164
|
+
skippedTerms: merged.skippedTerms,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export function findRelevantContextTerms(document, query, limit = 5) {
|
|
168
|
+
const tokens = new Set(query
|
|
169
|
+
.toLowerCase()
|
|
170
|
+
.split(/[^a-z0-9_-]+/i)
|
|
171
|
+
.map((token) => token.trim())
|
|
172
|
+
.filter((token) => token.length >= 3));
|
|
173
|
+
if (tokens.size === 0)
|
|
174
|
+
return [];
|
|
175
|
+
return document.terms
|
|
176
|
+
.map((term) => {
|
|
177
|
+
const haystack = [term.name, term.meaning, ...(term.aliases ?? []), ...(term.related ?? [])]
|
|
178
|
+
.join(" ")
|
|
179
|
+
.toLowerCase();
|
|
180
|
+
const score = [...tokens].filter((token) => haystack.includes(token)).length;
|
|
181
|
+
return { term, score };
|
|
182
|
+
})
|
|
183
|
+
.filter((entry) => entry.score > 0)
|
|
184
|
+
.sort((left, right) => right.score - left.score)
|
|
185
|
+
.slice(0, limit)
|
|
186
|
+
.map((entry) => entry.term);
|
|
187
|
+
}
|
|
188
|
+
export function renderContextTerms(terms) {
|
|
189
|
+
if (terms.length === 0)
|
|
190
|
+
return undefined;
|
|
191
|
+
return ["Relevant CONTEXT.md terms:", ...terms.map((term) => `- ${term.name}: ${term.meaning}`)].join("\n");
|
|
192
|
+
}
|
|
193
|
+
export function readContextDocument(projectRoot) {
|
|
194
|
+
const path = getContextPath(projectRoot);
|
|
195
|
+
if (!existsSync(path))
|
|
196
|
+
return undefined;
|
|
197
|
+
return parseContextDocument(readFileSync(path, "utf-8"));
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=context-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-format.js","sourceRoot":"","sources":["../../../../src/core/memory/context/context-format.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ContextTerm {\n\tname: string;\n\tmeaning: string;\n\taliases?: string[];\n\trelated?: string[];\n}\n\nexport interface ContextConvention {\n\tname: string;\n\tdescription: string;\n}\n\nexport interface ContextDocument {\n\tproject: string;\n\tpurpose: string;\n\tterms: ContextTerm[];\n\tconventions: ContextConvention[];\n\topenQuestions: string[];\n}\n\nexport interface ContextWriteResult {\n\tpath: string;\n\tchanged: boolean;\n\taddedTerms: string[];\n\tskippedTerms: string[];\n}\n\nexport const CONTEXT_FILE_NAME = \"CONTEXT.md\";\n\nconst SECTION_HEADINGS = [\n\t\"## Project\",\n\t\"## Purpose\",\n\t\"## Terms\",\n\t\"## Conventions\",\n\t\"## Open Questions\",\n\t\"## Not For This File\",\n] as const;\n\nexport function createContextScaffold(projectName: string): string {\n\treturn `# ${projectName} Context\n\n## Project\n\n${projectName}\n\n## Purpose\n\nDescribe the stable project purpose, domain, and mental model here.\n\n## Terms\n\n<!-- Threadwell writes accepted stable vocabulary here. Keep task history out. -->\n\n- **Example term**: Replace with project-specific language.\n - Aliases: example alias\n - Related: related concept\n\n## Conventions\n\n- **Naming**: Record durable naming and architecture conventions here.\n\n## Open Questions\n\n- Record durable semantic ambiguities that need user clarification.\n\n## Not For This File\n\nDo not store raw logs, transient task history, secrets, validation output, or ephemeral progress here.\n`;\n}\n\nfunction sectionBody(markdown: string, heading: string): string {\n\tconst start = markdown.indexOf(heading);\n\tif (start === -1) return \"\";\n\tconst bodyStart = start + heading.length;\n\tconst next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))\n\t\t.filter((index) => index !== -1)\n\t\t.sort((left, right) => left - right)[0];\n\treturn markdown.slice(bodyStart, next ?? markdown.length).trim();\n}\n\nfunction parseTerms(body: string): ContextTerm[] {\n\tconst terms: ContextTerm[] = [];\n\tconst blocks = body.split(/\\n(?=- \\*\\*)/g);\n\tfor (const block of blocks) {\n\t\tconst firstLine = block.split(/\\r?\\n/, 1)[0]?.trim();\n\t\tconst match = firstLine?.match(/^- \\*\\*(.+?)\\*\\*:\\s*(.+)$/);\n\t\tif (!match) continue;\n\t\tconst aliases = block\n\t\t\t.match(/Aliases:\\s*(.+)/)?.[1]\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t\tconst related = block\n\t\t\t.match(/Related:\\s*(.+)/)?.[1]\n\t\t\t.split(\",\")\n\t\t\t.map((entry) => entry.trim())\n\t\t\t.filter(Boolean);\n\t\tterms.push({\n\t\t\tname: match[1].trim(),\n\t\t\tmeaning: match[2].trim(),\n\t\t\taliases: aliases && aliases.length > 0 ? aliases : undefined,\n\t\t\trelated: related && related.length > 0 ? related : undefined,\n\t\t});\n\t}\n\treturn terms;\n}\n\nfunction parseConventions(body: string): ContextConvention[] {\n\treturn body\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.flatMap((line) => {\n\t\t\tconst match = line.match(/^- \\*\\*(.+?)\\*\\*:\\s*(.+)$/);\n\t\t\treturn match ? [{ name: match[1].trim(), description: match[2].trim() }] : [];\n\t\t});\n}\n\nfunction parseList(body: string): string[] {\n\treturn body\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.startsWith(\"- \"))\n\t\t.map((line) => line.slice(2).trim())\n\t\t.filter(Boolean);\n}\n\nexport function parseContextDocument(markdown: string): ContextDocument {\n\treturn {\n\t\tproject: sectionBody(markdown, \"## Project\") || \"Unknown project\",\n\t\tpurpose: sectionBody(markdown, \"## Purpose\"),\n\t\tterms: parseTerms(sectionBody(markdown, \"## Terms\")),\n\t\tconventions: parseConventions(sectionBody(markdown, \"## Conventions\")),\n\t\topenQuestions: parseList(sectionBody(markdown, \"## Open Questions\")),\n\t};\n}\n\nexport function getContextPath(projectRoot: string): string {\n\treturn join(projectRoot, CONTEXT_FILE_NAME);\n}\n\nexport function ensureContextScaffold(projectRoot: string, projectName: string): { path: string; created: boolean } {\n\tconst path = getContextPath(projectRoot);\n\tif (existsSync(path)) return { path, created: false };\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, createContextScaffold(projectName), \"utf-8\");\n\treturn { path, created: true };\n}\n\nfunction formatContextTerm(term: ContextTerm): string {\n\tconst aliases = term.aliases && term.aliases.length > 0 ? `\\n - Aliases: ${term.aliases.join(\", \")}` : \"\";\n\tconst related = term.related && term.related.length > 0 ? `\\n - Related: ${term.related.join(\", \")}` : \"\";\n\treturn `- **${term.name.trim()}**: ${term.meaning.trim()}${aliases}${related}`;\n}\n\nfunction isEphemeralContextTerm(term: ContextTerm): boolean {\n\tconst text = `${term.name} ${term.meaning}`.toLowerCase();\n\treturn /\\b(task|todo|log|today|yesterday|temporary|validation output|stack trace|raw output|secret|token|password)\\b/.test(\n\t\ttext,\n\t);\n}\n\nfunction insertBeforeNextSection(markdown: string, heading: string, content: string): string {\n\tconst start = markdown.indexOf(heading);\n\tif (start === -1) return `${markdown.trimEnd()}\\n\\n${heading}\\n\\n${content}\\n`;\n\tconst bodyStart = start + heading.length;\n\tconst next = SECTION_HEADINGS.map((candidate) => markdown.indexOf(candidate, bodyStart))\n\t\t.filter((index) => index !== -1)\n\t\t.sort((left, right) => left - right)[0];\n\tif (next === undefined) return `${markdown.trimEnd()}\\n${content}\\n`;\n\treturn `${markdown.slice(0, next).trimEnd()}\\n${content}\\n\\n${markdown.slice(next).trimStart()}`;\n}\n\nexport function mergeAcceptedContextTerms(\n\tmarkdown: string,\n\tterms: readonly ContextTerm[],\n): {\n\tmarkdown: string;\n\taddedTerms: string[];\n\tskippedTerms: string[];\n} {\n\tconst document = parseContextDocument(markdown);\n\tconst existing = new Set(document.terms.map((term) => term.name.toLowerCase()));\n\tconst accepted = terms.filter((term) => term.name.trim() && term.meaning.trim() && !isEphemeralContextTerm(term));\n\tconst added = accepted.filter((term) => !existing.has(term.name.toLowerCase()));\n\tconst skippedTerms = terms\n\t\t.filter((term) => !added.includes(term))\n\t\t.map((term) => term.name.trim())\n\t\t.filter(Boolean);\n\tif (added.length === 0) return { markdown, addedTerms: [], skippedTerms };\n\tconst nextMarkdown = insertBeforeNextSection(markdown, \"## Terms\", `\\n${added.map(formatContextTerm).join(\"\\n\")}`);\n\treturn { markdown: nextMarkdown, addedTerms: added.map((term) => term.name), skippedTerms };\n}\n\nexport function writeAcceptedContextTerms(\n\tprojectRoot: string,\n\tprojectName: string,\n\tterms: readonly ContextTerm[],\n): ContextWriteResult {\n\tconst scaffold = ensureContextScaffold(projectRoot, projectName);\n\tconst current = readFileSync(scaffold.path, \"utf-8\");\n\tconst merged = mergeAcceptedContextTerms(current, terms);\n\tif (merged.markdown !== current) {\n\t\twriteFileSync(scaffold.path, merged.markdown, \"utf-8\");\n\t}\n\treturn {\n\t\tpath: scaffold.path,\n\t\tchanged: merged.markdown !== current,\n\t\taddedTerms: merged.addedTerms,\n\t\tskippedTerms: merged.skippedTerms,\n\t};\n}\n\nexport function findRelevantContextTerms(document: ContextDocument, query: string, limit = 5): ContextTerm[] {\n\tconst tokens = new Set(\n\t\tquery\n\t\t\t.toLowerCase()\n\t\t\t.split(/[^a-z0-9_-]+/i)\n\t\t\t.map((token) => token.trim())\n\t\t\t.filter((token) => token.length >= 3),\n\t);\n\tif (tokens.size === 0) return [];\n\treturn document.terms\n\t\t.map((term) => {\n\t\t\tconst haystack = [term.name, term.meaning, ...(term.aliases ?? []), ...(term.related ?? [])]\n\t\t\t\t.join(\" \")\n\t\t\t\t.toLowerCase();\n\t\t\tconst score = [...tokens].filter((token) => haystack.includes(token)).length;\n\t\t\treturn { term, score };\n\t\t})\n\t\t.filter((entry) => entry.score > 0)\n\t\t.sort((left, right) => right.score - left.score)\n\t\t.slice(0, limit)\n\t\t.map((entry) => entry.term);\n}\n\nexport function renderContextTerms(terms: readonly ContextTerm[]): string | undefined {\n\tif (terms.length === 0) return undefined;\n\treturn [\"Relevant CONTEXT.md terms:\", ...terms.map((term) => `- ${term.name}: ${term.meaning}`)].join(\"\\n\");\n}\n\nexport function readContextDocument(projectRoot: string): ContextDocument | undefined {\n\tconst path = getContextPath(projectRoot);\n\tif (!existsSync(path)) return undefined;\n\treturn parseContextDocument(readFileSync(path, \"utf-8\"));\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { type ContextCandidate, dedupeContextCandidates, detectContextCandidates, } from "./context-candidates.js";
|
|
2
|
+
export { type ContextDiagnostic, type ContextDiagnosticSeverity, diagnoseContextDocument, renderContextDiagnostics, } from "./context-diagnostics.js";
|
|
3
|
+
export { CONTEXT_FILE_NAME, type ContextConvention, type ContextDocument, type ContextTerm, type ContextWriteResult, createContextScaffold, ensureContextScaffold, findRelevantContextTerms, getContextPath, mergeAcceptedContextTerms, parseContextDocument, readContextDocument, renderContextTerms, writeAcceptedContextTerms, } from "./context-format.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,uBAAuB,EACvB,wBAAwB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,GACzB,MAAM,qBAAqB,CAAC","sourcesContent":["export {\n\ttype ContextCandidate,\n\tdedupeContextCandidates,\n\tdetectContextCandidates,\n} from \"./context-candidates.js\";\nexport {\n\ttype ContextDiagnostic,\n\ttype ContextDiagnosticSeverity,\n\tdiagnoseContextDocument,\n\trenderContextDiagnostics,\n} from \"./context-diagnostics.js\";\nexport {\n\tCONTEXT_FILE_NAME,\n\ttype ContextConvention,\n\ttype ContextDocument,\n\ttype ContextTerm,\n\ttype ContextWriteResult,\n\tcreateContextScaffold,\n\tensureContextScaffold,\n\tfindRelevantContextTerms,\n\tgetContextPath,\n\tmergeAcceptedContextTerms,\n\tparseContextDocument,\n\treadContextDocument,\n\trenderContextTerms,\n\twriteAcceptedContextTerms,\n} from \"./context-format.js\";\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { dedupeContextCandidates, detectContextCandidates, } from "./context-candidates.js";
|
|
2
|
+
export { diagnoseContextDocument, renderContextDiagnostics, } from "./context-diagnostics.js";
|
|
3
|
+
export { CONTEXT_FILE_NAME, createContextScaffold, ensureContextScaffold, findRelevantContextTerms, getContextPath, mergeAcceptedContextTerms, parseContextDocument, readContextDocument, renderContextTerms, writeAcceptedContextTerms, } from "./context-format.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/memory/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGN,uBAAuB,EACvB,wBAAwB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,iBAAiB,EAKjB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,GACzB,MAAM,qBAAqB,CAAC","sourcesContent":["export {\n\ttype ContextCandidate,\n\tdedupeContextCandidates,\n\tdetectContextCandidates,\n} from \"./context-candidates.js\";\nexport {\n\ttype ContextDiagnostic,\n\ttype ContextDiagnosticSeverity,\n\tdiagnoseContextDocument,\n\trenderContextDiagnostics,\n} from \"./context-diagnostics.js\";\nexport {\n\tCONTEXT_FILE_NAME,\n\ttype ContextConvention,\n\ttype ContextDocument,\n\ttype ContextTerm,\n\ttype ContextWriteResult,\n\tcreateContextScaffold,\n\tensureContextScaffold,\n\tfindRelevantContextTerms,\n\tgetContextPath,\n\tmergeAcceptedContextTerms,\n\tparseContextDocument,\n\treadContextDocument,\n\trenderContextTerms,\n\twriteAcceptedContextTerms,\n} from \"./context-format.js\";\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ContextPressureLevel = "low" | "medium" | "high" | "critical";
|
|
2
|
+
export interface ContextPressureInput {
|
|
3
|
+
textBytes?: number;
|
|
4
|
+
estimatedTokens?: number;
|
|
5
|
+
contextWindowTokens?: number;
|
|
6
|
+
artifactThresholdBytes?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ContextPressureResult {
|
|
9
|
+
level: ContextPressureLevel;
|
|
10
|
+
shouldArtifact: boolean;
|
|
11
|
+
shouldSummarize: boolean;
|
|
12
|
+
reason: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function detectContextPressure(input: ContextPressureInput): ContextPressureResult;
|
|
15
|
+
//# sourceMappingURL=context-pressure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pressure.d.ts","sourceRoot":"","sources":["../../../src/core/memory/context-pressure.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAmCxF","sourcesContent":["export type ContextPressureLevel = \"low\" | \"medium\" | \"high\" | \"critical\";\n\nexport interface ContextPressureInput {\n\ttextBytes?: number;\n\testimatedTokens?: number;\n\tcontextWindowTokens?: number;\n\tartifactThresholdBytes?: number;\n}\n\nexport interface ContextPressureResult {\n\tlevel: ContextPressureLevel;\n\tshouldArtifact: boolean;\n\tshouldSummarize: boolean;\n\treason: string;\n}\n\nexport function detectContextPressure(input: ContextPressureInput): ContextPressureResult {\n\tconst artifactThresholdBytes = input.artifactThresholdBytes ?? 16 * 1024;\n\tconst bytes = input.textBytes ?? 0;\n\tconst tokenRatio =\n\t\tinput.contextWindowTokens && input.estimatedTokens ? input.estimatedTokens / input.contextWindowTokens : 0;\n\tif (bytes >= artifactThresholdBytes * 4 || tokenRatio >= 0.9) {\n\t\treturn {\n\t\t\tlevel: \"critical\",\n\t\t\tshouldArtifact: true,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content is too large for safe prompt inclusion\",\n\t\t};\n\t}\n\tif (bytes >= artifactThresholdBytes || tokenRatio >= 0.7) {\n\t\treturn {\n\t\t\tlevel: \"high\",\n\t\t\tshouldArtifact: true,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content should be artifacted and summarized\",\n\t\t};\n\t}\n\tif (bytes >= artifactThresholdBytes / 2 || tokenRatio >= 0.5) {\n\t\treturn {\n\t\t\tlevel: \"medium\",\n\t\t\tshouldArtifact: false,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content is approaching context pressure\",\n\t\t};\n\t}\n\treturn {\n\t\tlevel: \"low\",\n\t\tshouldArtifact: false,\n\t\tshouldSummarize: false,\n\t\treason: \"content fits normal context handling\",\n\t};\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function detectContextPressure(input) {
|
|
2
|
+
const artifactThresholdBytes = input.artifactThresholdBytes ?? 16 * 1024;
|
|
3
|
+
const bytes = input.textBytes ?? 0;
|
|
4
|
+
const tokenRatio = input.contextWindowTokens && input.estimatedTokens ? input.estimatedTokens / input.contextWindowTokens : 0;
|
|
5
|
+
if (bytes >= artifactThresholdBytes * 4 || tokenRatio >= 0.9) {
|
|
6
|
+
return {
|
|
7
|
+
level: "critical",
|
|
8
|
+
shouldArtifact: true,
|
|
9
|
+
shouldSummarize: true,
|
|
10
|
+
reason: "content is too large for safe prompt inclusion",
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (bytes >= artifactThresholdBytes || tokenRatio >= 0.7) {
|
|
14
|
+
return {
|
|
15
|
+
level: "high",
|
|
16
|
+
shouldArtifact: true,
|
|
17
|
+
shouldSummarize: true,
|
|
18
|
+
reason: "content should be artifacted and summarized",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (bytes >= artifactThresholdBytes / 2 || tokenRatio >= 0.5) {
|
|
22
|
+
return {
|
|
23
|
+
level: "medium",
|
|
24
|
+
shouldArtifact: false,
|
|
25
|
+
shouldSummarize: true,
|
|
26
|
+
reason: "content is approaching context pressure",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
level: "low",
|
|
31
|
+
shouldArtifact: false,
|
|
32
|
+
shouldSummarize: false,
|
|
33
|
+
reason: "content fits normal context handling",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=context-pressure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pressure.js","sourceRoot":"","sources":["../../../src/core/memory/context-pressure.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,qBAAqB,CAAC,KAA2B,EAAyB;IACzF,MAAM,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,IAAI,EAAE,GAAG,IAAI,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GACf,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,IAAI,KAAK,IAAI,sBAAsB,GAAG,CAAC,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QAC9D,OAAO;YACN,KAAK,EAAE,UAAU;YACjB,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,gDAAgD;SACxD,CAAC;IACH,CAAC;IACD,IAAI,KAAK,IAAI,sBAAsB,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QAC1D,OAAO;YACN,KAAK,EAAE,MAAM;YACb,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,6CAA6C;SACrD,CAAC;IACH,CAAC;IACD,IAAI,KAAK,IAAI,sBAAsB,GAAG,CAAC,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QAC9D,OAAO;YACN,KAAK,EAAE,QAAQ;YACf,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,yCAAyC;SACjD,CAAC;IACH,CAAC;IACD,OAAO;QACN,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,KAAK;QACrB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,sCAAsC;KAC9C,CAAC;AAAA,CACF","sourcesContent":["export type ContextPressureLevel = \"low\" | \"medium\" | \"high\" | \"critical\";\n\nexport interface ContextPressureInput {\n\ttextBytes?: number;\n\testimatedTokens?: number;\n\tcontextWindowTokens?: number;\n\tartifactThresholdBytes?: number;\n}\n\nexport interface ContextPressureResult {\n\tlevel: ContextPressureLevel;\n\tshouldArtifact: boolean;\n\tshouldSummarize: boolean;\n\treason: string;\n}\n\nexport function detectContextPressure(input: ContextPressureInput): ContextPressureResult {\n\tconst artifactThresholdBytes = input.artifactThresholdBytes ?? 16 * 1024;\n\tconst bytes = input.textBytes ?? 0;\n\tconst tokenRatio =\n\t\tinput.contextWindowTokens && input.estimatedTokens ? input.estimatedTokens / input.contextWindowTokens : 0;\n\tif (bytes >= artifactThresholdBytes * 4 || tokenRatio >= 0.9) {\n\t\treturn {\n\t\t\tlevel: \"critical\",\n\t\t\tshouldArtifact: true,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content is too large for safe prompt inclusion\",\n\t\t};\n\t}\n\tif (bytes >= artifactThresholdBytes || tokenRatio >= 0.7) {\n\t\treturn {\n\t\t\tlevel: \"high\",\n\t\t\tshouldArtifact: true,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content should be artifacted and summarized\",\n\t\t};\n\t}\n\tif (bytes >= artifactThresholdBytes / 2 || tokenRatio >= 0.5) {\n\t\treturn {\n\t\t\tlevel: \"medium\",\n\t\t\tshouldArtifact: false,\n\t\t\tshouldSummarize: true,\n\t\t\treason: \"content is approaching context pressure\",\n\t\t};\n\t}\n\treturn {\n\t\tlevel: \"low\",\n\t\tshouldArtifact: false,\n\t\tshouldSummarize: false,\n\t\treason: \"content fits normal context handling\",\n\t};\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { loadContinuityState } from "../continuity/index.js";
|
|
2
|
+
import type { MemoryService } from "./memory-service.js";
|
|
3
|
+
import type { MemoryEventInput } from "./memory-types.js";
|
|
4
|
+
export declare function continuityStateToMemoryEvents(cwd: string, state: Awaited<ReturnType<typeof loadContinuityState>>): MemoryEventInput[];
|
|
5
|
+
export declare function importContinuityIntoMemory(cwd: string, memoryService: MemoryService): Promise<number>;
|
|
6
|
+
//# sourceMappingURL=continuity-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuity-import.d.ts","sourceRoot":"","sources":["../../../src/core/memory/continuity-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,wBAAgB,6BAA6B,CAC5C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,GACpD,gBAAgB,EAAE,CAiDpB;AAED,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAS3G","sourcesContent":["import { loadContinuityState } from \"../continuity/index.js\";\nimport type { MemoryService } from \"./memory-service.js\";\nimport type { MemoryEventInput } from \"./memory-types.js\";\n\nexport function continuityStateToMemoryEvents(\n\tcwd: string,\n\tstate: Awaited<ReturnType<typeof loadContinuityState>>,\n): MemoryEventInput[] {\n\tconst events: MemoryEventInput[] = [];\n\tif (state.goal || state.currentTask || state.nextAction) {\n\t\tevents.push({\n\t\t\ttype: \"handoff\",\n\t\t\tsummary: state.currentTask ?? state.goal ?? state.nextAction ?? \"Continuity handoff\",\n\t\t\tcontent: [state.goal, state.currentTask, state.nextAction].filter(Boolean).join(\"\\n\"),\n\t\t\tpriority: 4,\n\t\t\ttags: [\"continuity\", \"import\", \"handoff\"],\n\t\t\tmetadata: { cwd, status: state.status },\n\t\t});\n\t}\n\tfor (const file of state.modifiedFiles.slice(-25)) {\n\t\tevents.push({\n\t\t\ttype: \"file_modified\",\n\t\t\tsummary: `Continuity modified file: ${file}`,\n\t\t\tpriority: 3,\n\t\t\tfilePaths: [file],\n\t\t\ttags: [\"continuity\", \"import\", \"file\"],\n\t\t});\n\t}\n\tfor (const question of state.openQuestions.slice(-10)) {\n\t\tevents.push({\n\t\t\ttype: \"open_question\",\n\t\t\tsummary: question,\n\t\t\tpriority: 4,\n\t\t\ttags: [\"continuity\", \"import\", \"question\"],\n\t\t});\n\t}\n\tfor (const blocker of state.blockedOn.slice(-10)) {\n\t\tevents.push({\n\t\t\ttype: \"blocker\",\n\t\t\tsummary: blocker,\n\t\t\tpriority: 5,\n\t\t\ttags: [\"continuity\", \"import\", \"blocker\"],\n\t\t});\n\t}\n\tfor (const checkpoint of state.checkpoints.slice(-10)) {\n\t\tevents.push({\n\t\t\ttype: \"handoff\",\n\t\t\tsummary: `Imported continuity checkpoint: ${checkpoint.reason}`,\n\t\t\tcontent: JSON.stringify(checkpoint),\n\t\t\tpriority: checkpoint.reason === \"loop_end\" ? 4 : 3,\n\t\t\tfilePaths: checkpoint.modifiedFiles,\n\t\t\ttags: [\"continuity\", \"import\", \"checkpoint\"],\n\t\t\tcreatedAt: new Date(checkpoint.timestamp).toISOString(),\n\t\t});\n\t}\n\treturn events;\n}\n\nexport async function importContinuityIntoMemory(cwd: string, memoryService: MemoryService): Promise<number> {\n\tconst state = await loadContinuityState(cwd);\n\tconst events = continuityStateToMemoryEvents(cwd, state);\n\tlet imported = 0;\n\tfor (const event of events) {\n\t\tconst recorded = await memoryService.recordEvent(event);\n\t\tif (recorded) imported++;\n\t}\n\treturn imported;\n}\n"]}
|