blun-king-cli 9.1.587 → 9.1.588
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 +11 -185
- package/LIESMICH.txt +51 -13
- package/README.md +44 -47
- package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
- package/agent-spine-plugin/CHANGELOG.md +37 -5
- package/agent-spine-plugin/README.md +3 -3
- package/agent-spine-plugin/blun.plugin.json +45 -10
- package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
- package/agent-spine-plugin/docs/host-integration.md +42 -27
- package/agent-spine-plugin/docs/preflight-recall.md +4 -2
- package/agent-spine-plugin/docs/session-timeline.md +97 -236
- package/agent-spine-plugin/docs/world-model.md +25 -0
- package/agent-spine-plugin/hooks/codex.json +1 -1
- package/agent-spine-plugin/hooks/hooks.json +1 -1
- package/agent-spine-plugin/package.json +1 -3
- package/agent-spine-plugin/scripts/check-hosts.js +3 -3
- package/agent-spine-plugin/scripts/release-check.js +10 -5
- package/agent-spine-plugin/scripts/run-checks.js +4 -1
- package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
- package/agent-spine-plugin/src/cli-learning.js +15 -0
- package/agent-spine-plugin/src/cli.js +2 -0
- package/agent-spine-plugin/src/hook.js +32 -32
- package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
- package/agent-spine-plugin/src/lib/briefing.js +146 -36
- package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
- package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
- package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
- package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
- package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
- package/agent-spine-plugin/src/lib/hook-context.js +16 -3
- package/agent-spine-plugin/src/lib/hook-output.js +129 -5
- package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
- package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
- package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
- package/agent-spine-plugin/src/lib/learning-context.js +11 -4
- package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
- package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
- package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
- package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
- package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
- package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
- package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
- package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
- package/agent-spine-plugin/src/lib/preflight.js +4 -4
- package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
- package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
- package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
- package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
- package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
- package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
- package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
- package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
- package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
- package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
- package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
- package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
- package/agent-spine-plugin/src/lib/source-roots.js +3 -2
- package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
- package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
- package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
- package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
- package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
- package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
- package/agent-spine-plugin/src/lib/world-model.js +64 -9
- package/agent-spine-plugin/src/worker.js +13 -1
- package/bin/blun.js +43 -28
- package/bin/core-bootstrap.js +5 -4
- package/bin/king.js +43 -28
- package/bin/launcher-mode.js +1 -10
- package/bin/launcher-runtime.js +128 -295
- package/bin/managed-node.js +0 -0
- package/bin/managed-plugin-selection.cjs +0 -1
- package/bin/native-module-repair.js +0 -0
- package/bin/node-runtime.js +0 -0
- package/bin/node-version.js +0 -0
- package/bin/plugin-bootstrap.js +56 -120
- package/bin/private-paths.js +11 -34
- package/bin/standard-tools-bootstrap.js +34 -114
- package/bin/turn-thinking-policy.cjs +3 -11
- package/bin/update-copy.js +200 -0
- package/bin/update-lease.js +0 -0
- package/bin/update-notice.js +136 -289
- package/bin/verify-agent-behavior.cjs +122 -0
- package/bin/verify-agent-components.cjs +104 -0
- package/bin/verify-bundled-agent-sources.cjs +57 -0
- package/blun.mjs +143076 -135288
- package/bundled-agent-sources.json +701 -0
- package/package.json +12 -15
- package/standard-skills/translate-native/README.md +1293 -0
- package/standard-skills/translate-native/SKILL.md +172 -22
- package/standard-skills/translate-native/VERSION +1 -1
- package/standard-skills/translate-native/agents/openai.yaml +18 -0
- package/standard-skills/translate-native/assets/icon.svg +8 -0
- package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
- package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
- package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
- package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
- package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
- package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
- package/standard-skills/translate-native/integrations/audit_log.py +327 -0
- package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
- package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
- package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
- package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
- package/standard-skills/translate-native/integrations/guard_service.py +435 -0
- package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
- package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
- package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
- package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
- package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
- package/standard-skills/translate-native/integrations/task_router.py +101 -0
- package/standard-skills/translate-native/integrations/website_localization.py +401 -0
- package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
- package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
- package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
- package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
- package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
- package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
- package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
- package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
- package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
- package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
- package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
- package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
- package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
- package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
- package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
- package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
- package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
- package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
- package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
- package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
- package/standard-skills/translate-native/provenance.json +3 -4
- package/standard-skills/translate-native/references/commercial-localization.md +177 -0
- package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
- package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
- package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/LICENSE +21 -0
- package/standard-tools/language-guard/VERSION +1 -0
- package/standard-tools/language-guard/blun_language_guard.py +7 -1
- package/standard-tools/language-guard/check_commercial_review.py +80 -0
- package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
- package/standard-tools/language-guard/language_gateway.py +62 -0
- package/standard-tools/language-guard/pre_output_guard.py +64 -0
- package/standard-tools/language-guard/provenance.json +4 -11
- package/standard-tools/manifest.json +34 -11
- package/telegram-plugin/commands/access.md +2 -10
- package/telegram-plugin/dist/bridge.mjs +64041 -687
- package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
- package/telegram-plugin/dist/noise.mjs +28 -63511
- package/agent-spine-plugin/CONTRIBUTING.md +0 -52
- package/agent-spine-plugin/SECURITY.md +0 -47
- package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
- package/agent-spine-plugin/docs/releasing.md +0 -85
- package/agent-spine-plugin/docs/structured-completion.md +0 -67
- package/bin/abort-listener-policy.cjs +0 -43
- package/bin/active-steer-priority-policy.cjs +0 -24
- package/bin/agent-api-http-adapter.mjs +0 -446
- package/bin/agent-api-private-http-server.mjs +0 -288
- package/bin/agent-api-runtime.mjs +0 -252
- package/bin/agent-api-service-environment.mjs +0 -236
- package/bin/agent-api-service-host.mjs +0 -209
- package/bin/agent-api-service-process.mjs +0 -171
- package/bin/agent-api-session-registry.mjs +0 -428
- package/bin/agent-api-tool-broker.cjs +0 -248
- package/bin/agent-api-turn-controller.mjs +0 -461
- package/bin/agent-api-usage-journal.cjs +0 -259
- package/bin/agent-resume-snapshot.cjs +0 -241
- package/bin/agentspine-king-goal-inbox.mjs +0 -111
- package/bin/agentspine-king-goal-intake.mjs +0 -106
- package/bin/approval-rejection-stop.cjs +0 -15
- package/bin/assistant-message-offload-policy.cjs +0 -284
- package/bin/baseline-skill-performance-policy.cjs +0 -39
- package/bin/bash-search-scope-policy.cjs +0 -49
- package/bin/codebase-search-runtime.cjs +0 -23
- package/bin/cognitive-action-checkpoint.cjs +0 -1104
- package/bin/cognitive-attention-delivery.cjs +0 -76
- package/bin/cognitive-attention-policy.cjs +0 -143
- package/bin/cognitive-attention-runtime.cjs +0 -91
- package/bin/cognitive-context-projection.cjs +0 -73
- package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
- package/bin/cognitive-effective-view.cjs +0 -77
- package/bin/cognitive-focus-projection.cjs +0 -206
- package/bin/cognitive-focus-scope.cjs +0 -37
- package/bin/cognitive-goal-autostart-policy.cjs +0 -72
- package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
- package/bin/cognitive-memory-adapter.cjs +0 -282
- package/bin/cognitive-memory-command.cjs +0 -293
- package/bin/cognitive-memory-provider.cjs +0 -92
- package/bin/cognitive-salience-policy.cjs +0 -159
- package/bin/cognitive-state-store.cjs +0 -508
- package/bin/cognitive-turn-lifecycle.cjs +0 -624
- package/bin/cognitive-work-focus.cjs +0 -180
- package/bin/compaction-history-archive.cjs +0 -166
- package/bin/compaction-history-startup.cjs +0 -50
- package/bin/compaction-model-policy.cjs +0 -31
- package/bin/compaction-stage-policy.cjs +0 -21
- package/bin/compaction-transaction-policy.cjs +0 -122
- package/bin/config-write-dedup-policy.cjs +0 -27
- package/bin/context-budget-ledger.cjs +0 -31
- package/bin/context-doctor-policy.cjs +0 -70
- package/bin/context-insight-policy.cjs +0 -36
- package/bin/context-performance-policy.cjs +0 -19
- package/bin/context-pressure-policy.cjs +0 -20
- package/bin/cron-run-output.cjs +0 -45
- package/bin/cron-run-store.cjs +0 -145
- package/bin/curiosity-scout-policy.cjs +0 -49
- package/bin/default-model-output-budget-policy.cjs +0 -28
- package/bin/durable-task-resume-policy.cjs +0 -130
- package/bin/durable-task-resume-runtime.cjs +0 -117
- package/bin/durable-task-resume-store.cjs +0 -88
- package/bin/editable-tool-approval-policy.cjs +0 -540
- package/bin/editable-tool-approval-runtime.cjs +0 -99
- package/bin/effective-system-prompt-cache-policy.cjs +0 -33
- package/bin/error-memory-performance-policy.cjs +0 -113
- package/bin/file-observation-policy.cjs +0 -133
- package/bin/foreground-output-capture-policy.cjs +0 -41
- package/bin/generated-source-health.cjs +0 -142
- package/bin/glob-pattern-policy.cjs +0 -13
- package/bin/goal-completion-evidence-policy.cjs +0 -120
- package/bin/grep-output-limit-policy.cjs +0 -39
- package/bin/historical-media-projection-policy.cjs +0 -48
- package/bin/history-offload-pressure-policy.cjs +0 -33
- package/bin/html-to-research-markdown.cjs +0 -147
- package/bin/identity-context-policy.cjs +0 -764
- package/bin/identity-journal-policy.cjs +0 -107
- package/bin/input-draft-persistence.cjs +0 -77
- package/bin/king-tui-function-contract.json +0 -33
- package/bin/launcher-restart-policy.cjs +0 -150
- package/bin/live-response-repetition-guard.cjs +0 -196
- package/bin/llm-config-log-dedup-policy.cjs +0 -76
- package/bin/loop-event-record-policy.cjs +0 -174
- package/bin/managed-context-startup-policy.cjs +0 -27
- package/bin/media-activity-layout-policy.cjs +0 -34
- package/bin/media-auto-retrieval-policy.cjs +0 -90
- package/bin/media-result-policy.cjs +0 -59
- package/bin/micro-compaction-policy.cjs +0 -145
- package/bin/mistake-relevance-policy.cjs +0 -319
- package/bin/model-retry-progress-policy.cjs +0 -46
- package/bin/native-large-file-io.cjs +0 -42
- package/bin/native-runtime-cache.cjs +0 -76
- package/bin/natural-presence-policy.cjs +0 -28
- package/bin/noninteractive-shell-env-policy.cjs +0 -19
- package/bin/observer-hooks.cjs +0 -14
- package/bin/outbound-claim-provenance.cjs +0 -150
- package/bin/oversized-context-offload-policy.cjs +0 -86
- package/bin/pending-media-policy.cjs +0 -182
- package/bin/pending-token-estimate-policy.cjs +0 -41
- package/bin/personal-memory-consent-policy.cjs +0 -72
- package/bin/personal-memory-performance-policy.cjs +0 -12
- package/bin/personality-choice-policy.cjs +0 -101
- package/bin/personality-memory-adapter.cjs +0 -379
- package/bin/personality-mode.cjs +0 -46
- package/bin/personality-setup-policy.cjs +0 -197
- package/bin/proactive-compaction-policy.cjs +0 -25
- package/bin/profile-identity-resolution.cjs +0 -136
- package/bin/profile-runtime.cjs +0 -318
- package/bin/profile-tool-exclusion-policy.cjs +0 -37
- package/bin/programmatic-context-isolation.cjs +0 -25
- package/bin/programmatic-tool-runtime.mjs +0 -627
- package/bin/provider-idle-timeout-policy.cjs +0 -14
- package/bin/provider-model-refresh-deadline.cjs +0 -53
- package/bin/provider-model-refresh-policy.cjs +0 -107
- package/bin/rate-limit-recovery-policy.cjs +0 -47
- package/bin/read-batch-policy.cjs +0 -32
- package/bin/read-continuation-policy.cjs +0 -59
- package/bin/recurring-cron-history-policy.cjs +0 -124
- package/bin/relationship-continuity-policy.cjs +0 -143
- package/bin/relationship-curiosity-policy.cjs +0 -107
- package/bin/relationship-learning-policy.cjs +0 -168
- package/bin/release-artifact-freeze-policy.cjs +0 -30
- package/bin/reload-plugin-bootstrap.cjs +0 -18
- package/bin/reload-queue-policy.cjs +0 -38
- package/bin/repeated-assistant-response-policy.cjs +0 -232
- package/bin/repeated-injection-projection.cjs +0 -107
- package/bin/repeated-user-message-projection.cjs +0 -8
- package/bin/research-page-result.cjs +0 -74
- package/bin/retry-checkpoint-policy.cjs +0 -13
- package/bin/runtime-exit-ledger.cjs +0 -144
- package/bin/scoped-cron-run-policy.cjs +0 -358
- package/bin/session-checkpoint-policy.cjs +0 -25
- package/bin/session-compaction-policy.cjs +0 -84
- package/bin/session-replay-policy.cjs +0 -20
- package/bin/session-replay-window-policy.cjs +0 -40
- package/bin/session-resume-checkpoint.cjs +0 -254
- package/bin/session-scrollback-archive.cjs +0 -229
- package/bin/skill-activation-performance-policy.cjs +0 -69
- package/bin/skill-listing-performance-policy.cjs +0 -92
- package/bin/soul-organization-policy.cjs +0 -78
- package/bin/soul-preservation-policy.cjs +0 -20
- package/bin/startup-preferences.cjs +0 -131
- package/bin/streaming-flush-performance-policy.cjs +0 -28
- package/bin/structured-agent-swarm-output.cjs +0 -325
- package/bin/structured-subagent-output.cjs +0 -252
- package/bin/subagent-context-fork-policy.cjs +0 -155
- package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
- package/bin/subagent-parent-responsiveness.cjs +0 -19
- package/bin/subagent-skill-policy.cjs +0 -206
- package/bin/subagent-timeout-policy.cjs +0 -182
- package/bin/subagent-tool-policy.cjs +0 -60
- package/bin/subagent-usage-rollup-policy.cjs +0 -29
- package/bin/system-prompt-context-policy.cjs +0 -124
- package/bin/system-prompt-token-cache-policy.cjs +0 -60
- package/bin/telegram-addressed-focus.cjs +0 -55
- package/bin/telegram-addressed-priority.cjs +0 -12
- package/bin/telegram-approval-relay.cjs +0 -290
- package/bin/telegram-bot-priority.cjs +0 -17
- package/bin/telegram-console-status-policy.cjs +0 -174
- package/bin/telegram-context-projection-policy.cjs +0 -141
- package/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/bin/telegram-direct-focus-policy.cjs +0 -273
- package/bin/telegram-mcp-compatibility.cjs +0 -49
- package/bin/telegram-media-delivery-policy.cjs +0 -42
- package/bin/telegram-private-conversation-policy.cjs +0 -185
- package/bin/telegram-queue-handoff-policy.cjs +0 -73
- package/bin/telegram-remote-status-policy.cjs +0 -120
- package/bin/telegram-session-queue-runtime.mjs +0 -306
- package/bin/telegram-text-chunk-policy.cjs +0 -63
- package/bin/telegram-truncated-reply-policy.cjs +0 -37
- package/bin/telegram-urgent-policy.cjs +0 -45
- package/bin/telemetry-spool-policy.cjs +0 -57
- package/bin/thinking-activity-status-policy.cjs +0 -132
- package/bin/thinking-only-guard.cjs +0 -80
- package/bin/todo-list-turn-policy.cjs +0 -131
- package/bin/tool-call-loop-policy.cjs +0 -51
- package/bin/tool-file-persistence.cjs +0 -141
- package/bin/tool-result-offload-policy.cjs +0 -359
- package/bin/tool-result-offload-telemetry.cjs +0 -12
- package/bin/tool-schema-token-cache-policy.cjs +0 -41
- package/bin/tool-stream-preview-policy.cjs +0 -9
- package/bin/tui-functional-contract.cjs +0 -55
- package/bin/turn-tool-performance-policy.cjs +0 -486
- package/bin/usage-cache-efficiency-policy.cjs +0 -26
- package/bin/user-home-path-policy.cjs +0 -13
- package/bin/user-message-offload-policy.cjs +0 -103
- package/bin/user-prompt-hook-origin-policy.cjs +0 -34
- package/bin/user-tool-record-policy.cjs +0 -7
- package/bin/validated-learning-insight-policy.cjs +0 -58
- package/bin/validated-learning-outcome-trace.cjs +0 -107
- package/bin/validated-learning-performance-policy.cjs +0 -53
- package/bin/validated-learning-signal.cjs +0 -463
- package/bin/windows-bash-dialect-policy.cjs +0 -25
- package/bin/windows-node-crash-dump.cjs +0 -110
- package/bin/write-continuation-policy.cjs +0 -69
- package/codebase-index/README.md +0 -82
- package/codebase-index/codebase_index.py +0 -470
- package/standard-skills/agent-browser/SKILL.md +0 -19
- package/standard-skills/agent-browser/references/runtime.md +0 -8
- package/standard-skills/blun-session-inspector/SKILL.md +0 -41
- package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
- package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
- package/standard-skills/full-output-enforcement/SKILL.md +0 -49
- package/standard-skills/high-end-visual-design/SKILL.md +0 -98
- package/standard-skills/image-to-code/SKILL.md +0 -1228
- package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
- package/standard-skills/minimalist-ui/SKILL.md +0 -85
- package/standard-skills/motion-design-taste/SKILL.md +0 -74
- package/standard-skills/playwright-testing/SKILL.md +0 -19
- package/standard-skills/playwright-testing/references/runtime.md +0 -7
- package/standard-skills/premortem/SKILL.md +0 -148
- package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
- package/standard-skills/research-evidence/SKILL.md +0 -39
- package/standard-skills/research-evidence/references/evidence-format.md +0 -104
- package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
- package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
- package/standard-skills/screenshot-lesen/SKILL.md +0 -52
- package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
- package/standard-skills/stitch-design-taste/SKILL.md +0 -184
- package/standard-skills/telegram-channel/SKILL.md +0 -18
- package/standard-skills/telegram-channel/references/runtime.md +0 -7
- package/standard-skills/venture-flywheel/SKILL.md +0 -32
- package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
- package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
- package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
- package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
- package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
- package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
- package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
- package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
- package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
- package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
- package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
- package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
- package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
- package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
- package/standard-skills/web-lesen/SKILL.md +0 -73
- package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
- package/standard-skills/windows-mcp/SKILL.md +0 -19
- package/standard-skills/windows-mcp/references/runtime.md +0 -9
- package/telegram-plugin/DELIVERY.md +0 -36
- package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
- package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
- package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
- package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
- package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
- package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
- package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
- package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
- package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
- package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
- package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
- /package/{bin → scripts}/fix-node-pty-perms.js +0 -0
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const crypto = require('node:crypto');
|
|
4
|
-
|
|
5
|
-
const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
|
|
6
|
-
const STATUSES = new Set(['active', 'paused', 'blocked']);
|
|
7
|
-
const EPISTEMIC_STATES = new Set([
|
|
8
|
-
'verified', 'credible_unverified', 'hypothesis', 'uncertain_memory', 'stale', 'unknown', 'legacy_unknown',
|
|
9
|
-
]);
|
|
10
|
-
const TRIGGER_KINDS = new Set([
|
|
11
|
-
'immediate', 'external_event', 'time', 'dependency', 'user_decision',
|
|
12
|
-
]);
|
|
13
|
-
const TRIGGER_KEYS = new Set(['kind', 'condition']);
|
|
14
|
-
const NEXT_TRIGGER = new Map([
|
|
15
|
-
['active', 'Continue the active goal from its last verified state.'],
|
|
16
|
-
['paused', 'Wait until the goal is explicitly resumed.'],
|
|
17
|
-
['blocked', 'Resolve the current blocker before continuing.'],
|
|
18
|
-
]);
|
|
19
|
-
|
|
20
|
-
function bounded(value, max = 512) {
|
|
21
|
-
const text = String(value ?? '').replace(/[\u0000-\u001f\u007f]+/gu, ' ').replace(/\s+/gu, ' ').trim();
|
|
22
|
-
if (!text) return '';
|
|
23
|
-
return text.length <= max ? text : `${text.slice(0, max - 3).trimEnd()}...`;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function buildCognitiveWorkFocus(goal, { decisionFreshness } = {}) {
|
|
27
|
-
if (!goal || typeof goal !== 'object' || Array.isArray(goal)) return null;
|
|
28
|
-
const goalId = String(goal.goalId ?? '').trim();
|
|
29
|
-
const objective = bounded(goal.objective);
|
|
30
|
-
const completionCriterion = bounded(goal.completionCriterion)
|
|
31
|
-
|| 'Goal completion must be supported by verified evidence.';
|
|
32
|
-
const status = String(goal.status ?? '');
|
|
33
|
-
const turnsUsed = Number(goal.turnsUsed);
|
|
34
|
-
if (!SAFE_ID_RE.test(goalId) || !objective || !STATUSES.has(status)
|
|
35
|
-
|| !Number.isSafeInteger(turnsUsed) || turnsUsed < 0) return null;
|
|
36
|
-
|
|
37
|
-
const focusScope = `goal:${goalId}`;
|
|
38
|
-
if (!SAFE_ID_RE.test(focusScope)) return null;
|
|
39
|
-
const checkpoint = goal.actionCheckpoint && typeof goal.actionCheckpoint === 'object'
|
|
40
|
-
? goal.actionCheckpoint
|
|
41
|
-
: null;
|
|
42
|
-
const checkpointPhase = bounded(checkpoint?.phase, 32);
|
|
43
|
-
const lastVerified = bounded(checkpoint?.lastVerified);
|
|
44
|
-
const nextAction = bounded(checkpoint?.nextAction);
|
|
45
|
-
const checkpointEvidence = bounded(checkpoint?.expectedEvidence);
|
|
46
|
-
const checkpointEpistemicState = bounded(checkpoint?.epistemicState, 32);
|
|
47
|
-
const rawNextTrigger = checkpoint?.nextTrigger;
|
|
48
|
-
let triggerKind = '';
|
|
49
|
-
let triggerCondition = '';
|
|
50
|
-
if (rawNextTrigger !== undefined) {
|
|
51
|
-
if (!rawNextTrigger || typeof rawNextTrigger !== 'object' || Array.isArray(rawNextTrigger)
|
|
52
|
-
|| Object.keys(rawNextTrigger).length !== TRIGGER_KEYS.size
|
|
53
|
-
|| Object.keys(rawNextTrigger).some((key) => !TRIGGER_KEYS.has(key))) return null;
|
|
54
|
-
triggerKind = String(rawNextTrigger.kind ?? '').trim();
|
|
55
|
-
triggerCondition = bounded(rawNextTrigger.condition);
|
|
56
|
-
if (!TRIGGER_KINDS.has(triggerKind) || !triggerCondition
|
|
57
|
-
|| checkpointPhase === 'wait' && triggerKind === 'immediate'
|
|
58
|
-
|| checkpointPhase !== 'wait' && triggerKind !== 'immediate') return null;
|
|
59
|
-
}
|
|
60
|
-
const hasExplicitTrigger = Boolean(triggerKind && triggerCondition);
|
|
61
|
-
const triggerValue = hasExplicitTrigger
|
|
62
|
-
? `${triggerKind.replaceAll('_', ' ')} - ${triggerCondition}`
|
|
63
|
-
: nextAction;
|
|
64
|
-
const problemFrame = checkpoint?.problemFrame && typeof checkpoint.problemFrame === 'object'
|
|
65
|
-
&& !Array.isArray(checkpoint.problemFrame) ? checkpoint.problemFrame : null;
|
|
66
|
-
const frameMissingKnowledge = Array.isArray(problemFrame?.missingKnowledge)
|
|
67
|
-
? problemFrame.missingKnowledge.slice(0, 5).map((item) => bounded(item, 256)).filter(Boolean)
|
|
68
|
-
: [];
|
|
69
|
-
const frameCandidates = Array.isArray(problemFrame?.candidateActions)
|
|
70
|
-
? problemFrame.candidateActions.slice(0, 5).map((item) => bounded(item, 256)).filter(Boolean)
|
|
71
|
-
: [];
|
|
72
|
-
const frameSuccessCriterion = bounded(problemFrame?.successCriterion);
|
|
73
|
-
const frameSelectedAction = bounded(problemFrame?.selectedAction, 256);
|
|
74
|
-
const frameSelectionReason = bounded(problemFrame?.selectionReason);
|
|
75
|
-
const frameSupportChoice = bounded(problemFrame?.supportChoice, 256);
|
|
76
|
-
const frameRisk = bounded(problemFrame?.risk);
|
|
77
|
-
const frameReversibility = bounded(problemFrame?.reversibility);
|
|
78
|
-
const frameDecisionBasis = Array.isArray(problemFrame?.decisionBasis)
|
|
79
|
-
&& problemFrame.decisionBasis.length >= 1 && problemFrame.decisionBasis.length <= 5
|
|
80
|
-
&& problemFrame.decisionBasis.every((item) => /^[a-f0-9]{16}$/u.test(String(item)))
|
|
81
|
-
&& new Set(problemFrame.decisionBasis).size === problemFrame.decisionBasis.length
|
|
82
|
-
? [...problemFrame.decisionBasis] : [];
|
|
83
|
-
const hasProblemFrame = problemFrame !== null && frameSuccessCriterion
|
|
84
|
-
&& frameMissingKnowledge.length > 0 && frameCandidates.length > 0
|
|
85
|
-
&& frameSelectedAction && frameSelectionReason && frameSupportChoice
|
|
86
|
-
&& frameRisk && frameReversibility;
|
|
87
|
-
const hasCheckpoint = checkpoint !== null && checkpointPhase && lastVerified
|
|
88
|
-
&& nextAction && checkpointEvidence;
|
|
89
|
-
const epistemicState = hasCheckpoint && EPISTEMIC_STATES.has(checkpointEpistemicState)
|
|
90
|
-
? checkpointEpistemicState : hasCheckpoint ? 'legacy_unknown' : 'verified';
|
|
91
|
-
const decisionFreshnessStatus = frameDecisionBasis.length > 0
|
|
92
|
-
&& ['current', 'stale', 'unknown'].includes(decisionFreshness?.status)
|
|
93
|
-
? decisionFreshness.status : frameDecisionBasis.length > 0 ? 'unknown' : '';
|
|
94
|
-
const staleDecision = decisionFreshnessStatus === 'stale' || decisionFreshnessStatus === 'unknown';
|
|
95
|
-
const replanKnowledgeGap = 'Re-evaluate the selected action against current durable evidence.';
|
|
96
|
-
const replanTrigger = 'Re-evaluate the selected action against the current durable evidence.';
|
|
97
|
-
const replanEvidence = 'A replacement action is bound to current durable evidence refs.';
|
|
98
|
-
const knowledgeGapValue = staleDecision ? `${replanKnowledgeGap} ${frameMissingKnowledge.join(' | ')}`
|
|
99
|
-
: hasProblemFrame ? frameMissingKnowledge.join(' | ') : 'none';
|
|
100
|
-
const decisionThread = hasProblemFrame ? [
|
|
101
|
-
...(staleDecision ? [`Decision basis ${decisionFreshnessStatus}; replan before executing the selected action.`] : []),
|
|
102
|
-
`Goal is ${status}`,
|
|
103
|
-
`Phase ${checkpointPhase}`,
|
|
104
|
-
`Last verified: ${bounded(lastVerified, 80)}`,
|
|
105
|
-
`Decision: ${bounded(frameSelectedAction, 64)}`,
|
|
106
|
-
`Why: ${bounded(frameSelectionReason, 64)}`,
|
|
107
|
-
`Support: ${bounded(frameSupportChoice, 64)}`,
|
|
108
|
-
`Risk: ${bounded(frameRisk, 64)}`,
|
|
109
|
-
`Reversible: ${bounded(frameReversibility, 64)}`,
|
|
110
|
-
].join('; ') : '';
|
|
111
|
-
const digest = crypto.createHash('sha256')
|
|
112
|
-
.update([
|
|
113
|
-
goalId, objective, completionCriterion, status, String(turnsUsed),
|
|
114
|
-
hasCheckpoint ? checkpointPhase : '',
|
|
115
|
-
hasCheckpoint ? lastVerified : '',
|
|
116
|
-
hasCheckpoint ? nextAction : '',
|
|
117
|
-
hasCheckpoint ? checkpointEvidence : '',
|
|
118
|
-
hasExplicitTrigger ? triggerKind : '',
|
|
119
|
-
hasExplicitTrigger ? triggerCondition : '',
|
|
120
|
-
epistemicState,
|
|
121
|
-
hasProblemFrame ? frameSuccessCriterion : '',
|
|
122
|
-
hasProblemFrame ? frameMissingKnowledge.join('\0') : '',
|
|
123
|
-
hasProblemFrame ? frameCandidates.join('\0') : '',
|
|
124
|
-
hasProblemFrame ? frameSelectedAction : '',
|
|
125
|
-
hasProblemFrame ? frameSelectionReason : '',
|
|
126
|
-
hasProblemFrame ? frameSupportChoice : '',
|
|
127
|
-
hasProblemFrame ? frameRisk : '',
|
|
128
|
-
hasProblemFrame ? frameReversibility : '',
|
|
129
|
-
hasProblemFrame ? frameDecisionBasis.join('\0') : '',
|
|
130
|
-
decisionFreshnessStatus,
|
|
131
|
-
].join('\0'))
|
|
132
|
-
.digest('hex').slice(0, 40);
|
|
133
|
-
const keyRoot = `goal:${goalId}`;
|
|
134
|
-
return {
|
|
135
|
-
snapshotId: `goalfocus-${digest}`,
|
|
136
|
-
focusScope,
|
|
137
|
-
observations: [
|
|
138
|
-
{ domain: 'goal', key: `${keyRoot}:objective`, value: objective, confidence: 1, epistemicState, scope: focusScope },
|
|
139
|
-
{
|
|
140
|
-
domain: 'open_thread', key: `${keyRoot}:status`,
|
|
141
|
-
value: bounded(hasCheckpoint
|
|
142
|
-
? hasProblemFrame ? decisionThread : [
|
|
143
|
-
`Goal is ${status}. Phase ${checkpointPhase}. Last verified: ${lastVerified}`,
|
|
144
|
-
`Next action: ${nextAction}`,
|
|
145
|
-
].join(' ')
|
|
146
|
-
: `Goal is ${status}.`),
|
|
147
|
-
confidence: 1,
|
|
148
|
-
epistemicState: staleDecision ? decisionFreshnessStatus : epistemicState,
|
|
149
|
-
scope: focusScope,
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
domain: 'knowledge_gap', key: `${keyRoot}:knowledge-gaps`,
|
|
153
|
-
value: knowledgeGapValue,
|
|
154
|
-
confidence: 1,
|
|
155
|
-
epistemicState: hasProblemFrame || staleDecision ? 'unknown' : 'verified',
|
|
156
|
-
scope: focusScope,
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
domain: 'next_trigger', key: `${keyRoot}:next`,
|
|
160
|
-
value: status === 'active' && hasCheckpoint
|
|
161
|
-
? staleDecision ? replanTrigger : triggerValue
|
|
162
|
-
: NEXT_TRIGGER.get(status),
|
|
163
|
-
confidence: 1,
|
|
164
|
-
epistemicState: staleDecision ? decisionFreshnessStatus : epistemicState,
|
|
165
|
-
scope: focusScope,
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
domain: 'expected_evidence', key: `${keyRoot}:evidence`,
|
|
169
|
-
value: status === 'active' && hasCheckpoint
|
|
170
|
-
? staleDecision ? replanEvidence : checkpointEvidence
|
|
171
|
-
: completionCriterion,
|
|
172
|
-
confidence: 1,
|
|
173
|
-
epistemicState: staleDecision ? decisionFreshnessStatus : epistemicState,
|
|
174
|
-
scope: focusScope,
|
|
175
|
-
},
|
|
176
|
-
],
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
module.exports = { buildCognitiveWorkFocus };
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { randomUUID } = require('node:crypto');
|
|
4
|
-
const { lstat, mkdir, readdir, unlink, writeFile } = require('node:fs/promises');
|
|
5
|
-
const path = require('node:path');
|
|
6
|
-
|
|
7
|
-
const COMPACTION_HISTORY_DIR = 'conversation-history';
|
|
8
|
-
const COMPACTION_HISTORY_RETENTION_DAYS = 30;
|
|
9
|
-
const MAX_COMPACTION_HISTORY_RETENTION_DAYS = 3650;
|
|
10
|
-
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
11
|
-
const INLINE_MEDIA_NOTICE = '[inline media payload omitted; original remains in session wire]';
|
|
12
|
-
|
|
13
|
-
async function archiveCompactionHistory(options = {}) {
|
|
14
|
-
const homedir = requiredString(options.homedir, 'homedir');
|
|
15
|
-
const messages = Array.isArray(options.messages) ? options.messages : [];
|
|
16
|
-
const now = finiteNumber(options.now, Date.now());
|
|
17
|
-
const id = safeFilePart(options.id || randomUUID());
|
|
18
|
-
const dir = path.join(homedir, COMPACTION_HISTORY_DIR);
|
|
19
|
-
const timestamp = new Date(now).toISOString().replace(/[:.]/g, '-');
|
|
20
|
-
const outputPath = path.join(dir, `compaction-${timestamp}-${id}.md`);
|
|
21
|
-
|
|
22
|
-
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
23
|
-
await sweepCompactionHistory({
|
|
24
|
-
homedir,
|
|
25
|
-
now,
|
|
26
|
-
retentionDays: options.retentionDays,
|
|
27
|
-
});
|
|
28
|
-
await writeFile(outputPath, serializeCompactionHistory(messages, { now }), {
|
|
29
|
-
encoding: 'utf8',
|
|
30
|
-
flag: 'wx',
|
|
31
|
-
mode: 0o600,
|
|
32
|
-
});
|
|
33
|
-
return outputPath;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function sweepCompactionHistory(options = {}) {
|
|
37
|
-
const homedir = requiredString(options.homedir, 'homedir');
|
|
38
|
-
const now = finiteNumber(options.now, Date.now());
|
|
39
|
-
const retentionDays = options.retentionDays === undefined
|
|
40
|
-
? resolveCompactionHistoryRetentionDays(process.env.BLUN_COMPACTION_HISTORY_RETENTION_DAYS)
|
|
41
|
-
: resolveCompactionHistoryRetentionDays(options.retentionDays);
|
|
42
|
-
const result = { deleted: 0, failed: 0 };
|
|
43
|
-
if (retentionDays === 0) return result;
|
|
44
|
-
const dir = path.join(homedir, COMPACTION_HISTORY_DIR);
|
|
45
|
-
let entries;
|
|
46
|
-
try {
|
|
47
|
-
entries = await readdir(dir, { withFileTypes: true });
|
|
48
|
-
} catch (error) {
|
|
49
|
-
if (error?.code !== 'ENOENT') result.failed += 1;
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
const cutoff = now - retentionDays * DAY_MS;
|
|
53
|
-
for (const entry of entries) {
|
|
54
|
-
if (!entry.isFile() || !/^compaction-.*\.md$/u.test(entry.name)) continue;
|
|
55
|
-
const candidate = path.join(dir, entry.name);
|
|
56
|
-
try {
|
|
57
|
-
const info = await lstat(candidate);
|
|
58
|
-
if (!info.isFile() || info.mtimeMs >= cutoff) continue;
|
|
59
|
-
await unlink(candidate);
|
|
60
|
-
result.deleted += 1;
|
|
61
|
-
} catch (error) {
|
|
62
|
-
if (error?.code !== 'ENOENT') result.failed += 1;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return result;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function resolveCompactionHistoryRetentionDays(value) {
|
|
69
|
-
if (value === undefined || value === null || value === '') {
|
|
70
|
-
return COMPACTION_HISTORY_RETENTION_DAYS;
|
|
71
|
-
}
|
|
72
|
-
const parsed = Number(value);
|
|
73
|
-
if (!Number.isInteger(parsed) || parsed < 0 || parsed > MAX_COMPACTION_HISTORY_RETENTION_DAYS) {
|
|
74
|
-
return COMPACTION_HISTORY_RETENTION_DAYS;
|
|
75
|
-
}
|
|
76
|
-
return parsed;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function serializeCompactionHistory(messages, options = {}) {
|
|
80
|
-
const now = finiteNumber(options.now, Date.now());
|
|
81
|
-
const lines = [
|
|
82
|
-
'# BLUN conversation history archive',
|
|
83
|
-
'',
|
|
84
|
-
`Archived at: ${new Date(now).toISOString()}`,
|
|
85
|
-
`Messages: ${messages.length}`,
|
|
86
|
-
'',
|
|
87
|
-
'This file contains the messages displaced by a full context compaction.',
|
|
88
|
-
'Inline media payloads are omitted here; the original session wire remains authoritative.',
|
|
89
|
-
];
|
|
90
|
-
|
|
91
|
-
for (let index = 0; index < messages.length; index += 1) {
|
|
92
|
-
const message = sanitizeMessage(messages[index]);
|
|
93
|
-
lines.push(
|
|
94
|
-
'',
|
|
95
|
-
`## Message ${index + 1}: ${typeof message?.role === 'string' ? message.role : 'unknown'}`,
|
|
96
|
-
'',
|
|
97
|
-
'```json',
|
|
98
|
-
JSON.stringify(message, null, 2),
|
|
99
|
-
'```',
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
lines.push('');
|
|
103
|
-
return lines.join('\n');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function buildCompactionArchiveNotice(historyPath) {
|
|
107
|
-
return [
|
|
108
|
-
'<system-reminder>',
|
|
109
|
-
'The complete messages displaced by this compaction were archived locally.',
|
|
110
|
-
`history_path: ${historyPath}`,
|
|
111
|
-
'next_step: Use Read with history_path to recover exact details that the summary omitted.',
|
|
112
|
-
'</system-reminder>',
|
|
113
|
-
].join('\n');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function sanitizeMessage(message) {
|
|
117
|
-
if (message === null || typeof message !== 'object') return message;
|
|
118
|
-
if (!Array.isArray(message.content)) return message;
|
|
119
|
-
return {
|
|
120
|
-
...message,
|
|
121
|
-
content: message.content.map(sanitizeContentPart),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function sanitizeContentPart(part) {
|
|
126
|
-
if (part === null || typeof part !== 'object') return part;
|
|
127
|
-
if (part.type === 'image_url' && isInlineMediaUrl(part.imageUrl?.url)) {
|
|
128
|
-
return { type: 'text', text: INLINE_MEDIA_NOTICE };
|
|
129
|
-
}
|
|
130
|
-
if (part.type === 'audio_url' && isInlineMediaUrl(part.audioUrl?.url)) {
|
|
131
|
-
return { type: 'text', text: INLINE_MEDIA_NOTICE };
|
|
132
|
-
}
|
|
133
|
-
if (part.type === 'video_url' && isInlineMediaUrl(part.videoUrl?.url)) {
|
|
134
|
-
return { type: 'text', text: INLINE_MEDIA_NOTICE };
|
|
135
|
-
}
|
|
136
|
-
return part;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function isInlineMediaUrl(value) {
|
|
140
|
-
return typeof value === 'string' && /^data:(?:image|audio|video)\//i.test(value);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
function requiredString(value, name) {
|
|
144
|
-
if (typeof value === 'string' && value.length > 0) return value;
|
|
145
|
-
throw new TypeError(`${name} must be a non-empty string`);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function safeFilePart(value) {
|
|
149
|
-
const cleaned = String(value).replace(/[^a-zA-Z0-9._-]+/g, '_').replace(/^_+|_+$/g, '').slice(0, 96);
|
|
150
|
-
return cleaned || randomUUID();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function finiteNumber(value, fallback) {
|
|
154
|
-
const number = Number(value);
|
|
155
|
-
return Number.isFinite(number) ? number : fallback;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
module.exports = {
|
|
159
|
-
COMPACTION_HISTORY_DIR,
|
|
160
|
-
COMPACTION_HISTORY_RETENTION_DAYS,
|
|
161
|
-
archiveCompactionHistory,
|
|
162
|
-
buildCompactionArchiveNotice,
|
|
163
|
-
resolveCompactionHistoryRetentionDays,
|
|
164
|
-
serializeCompactionHistory,
|
|
165
|
-
sweepCompactionHistory,
|
|
166
|
-
};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { sweepCompactionHistory } = require('./compaction-history-archive.cjs');
|
|
4
|
-
|
|
5
|
-
function startCompactionHistoryStartupSweep(options = {}) {
|
|
6
|
-
const sweep = typeof options.sweep === 'function'
|
|
7
|
-
? options.sweep
|
|
8
|
-
: sweepCompactionHistory;
|
|
9
|
-
const sweepOptions = { homedir: options.homedir };
|
|
10
|
-
if (options.now !== undefined) sweepOptions.now = options.now;
|
|
11
|
-
if (options.retentionDays !== undefined) sweepOptions.retentionDays = options.retentionDays;
|
|
12
|
-
|
|
13
|
-
return Promise.resolve()
|
|
14
|
-
.then(() => sweep(sweepOptions))
|
|
15
|
-
.then((result) => {
|
|
16
|
-
const normalized = normalizeSweepResult(result);
|
|
17
|
-
if (normalized.deleted > 0 || normalized.failed > 0) {
|
|
18
|
-
safeLog(options.logger, 'info', 'compaction history startup sweep completed', normalized);
|
|
19
|
-
}
|
|
20
|
-
return normalized;
|
|
21
|
-
})
|
|
22
|
-
.catch((error) => {
|
|
23
|
-
const result = { deleted: 0, failed: 1 };
|
|
24
|
-
safeLog(options.logger, 'warn', 'compaction history startup sweep failed', {
|
|
25
|
-
error: error instanceof Error ? error.message : String(error),
|
|
26
|
-
});
|
|
27
|
-
return result;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function normalizeSweepResult(result) {
|
|
32
|
-
return {
|
|
33
|
-
deleted: nonNegativeInteger(result?.deleted),
|
|
34
|
-
failed: nonNegativeInteger(result?.failed),
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function nonNegativeInteger(value) {
|
|
39
|
-
return Number.isInteger(value) && value >= 0 ? value : 0;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function safeLog(logger, level, message, properties) {
|
|
43
|
-
try {
|
|
44
|
-
logger?.[level]?.(message, properties);
|
|
45
|
-
} catch {}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
module.exports = {
|
|
49
|
-
startCompactionHistoryStartupSweep,
|
|
50
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function resolveCompactionModelAlias(configuredAlias, activeAlias) {
|
|
4
|
-
if (typeof configuredAlias === 'string' && configuredAlias.trim().length > 0) {
|
|
5
|
-
return configuredAlias.trim();
|
|
6
|
-
}
|
|
7
|
-
return activeAlias;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function normalizeCompactionModelSelection(value) {
|
|
11
|
-
if (typeof value !== 'string') return undefined;
|
|
12
|
-
const normalized = value.trim();
|
|
13
|
-
if (normalized.length === 0) return undefined;
|
|
14
|
-
if (['clear', 'default', 'inherit'].includes(normalized.toLowerCase())) return null;
|
|
15
|
-
return normalized;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function clearCompactionModelConfig(config) {
|
|
19
|
-
const loopControl = { ...(config?.loopControl ?? {}) };
|
|
20
|
-
delete loopControl.compactionModel;
|
|
21
|
-
return {
|
|
22
|
-
...config,
|
|
23
|
-
loopControl,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
module.exports = {
|
|
28
|
-
clearCompactionModelConfig,
|
|
29
|
-
normalizeCompactionModelSelection,
|
|
30
|
-
resolveCompactionModelAlias,
|
|
31
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const DEFAULT_COMPACTION_STAGE_MAX_TOKENS = 64_000;
|
|
4
|
-
const DEFAULT_COMPACTION_MAX_COMPLETION_TOKENS = 16_384;
|
|
5
|
-
|
|
6
|
-
function capCompactionStageTarget(safeRequestLimitTokens) {
|
|
7
|
-
if (!Number.isFinite(safeRequestLimitTokens) || safeRequestLimitTokens <= 0) return 0;
|
|
8
|
-
return Math.min(Math.floor(safeRequestLimitTokens), DEFAULT_COMPACTION_STAGE_MAX_TOKENS);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function capCompactionCompletionTokens(maxContextTokens) {
|
|
12
|
-
if (!Number.isFinite(maxContextTokens) || maxContextTokens <= 0) return undefined;
|
|
13
|
-
return Math.min(Math.floor(maxContextTokens), DEFAULT_COMPACTION_MAX_COMPLETION_TOKENS);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
module.exports = {
|
|
17
|
-
DEFAULT_COMPACTION_MAX_COMPLETION_TOKENS,
|
|
18
|
-
DEFAULT_COMPACTION_STAGE_MAX_TOKENS,
|
|
19
|
-
capCompactionCompletionTokens,
|
|
20
|
-
capCompactionStageTarget,
|
|
21
|
-
};
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { randomUUID } = require('node:crypto');
|
|
4
|
-
|
|
5
|
-
function positiveInteger(value, label) {
|
|
6
|
-
if (!Number.isSafeInteger(value) || value < 0) {
|
|
7
|
-
throw new TypeError(`${label} must be a non-negative safe integer`);
|
|
8
|
-
}
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function toolCallId(call) {
|
|
13
|
-
return typeof call?.id === 'string' && call.id.length > 0 ? call.id : undefined;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function assertBalancedToolPairs(messages, label = 'compaction history') {
|
|
17
|
-
const pending = new Set();
|
|
18
|
-
for (const message of messages) {
|
|
19
|
-
if (message?.role === 'assistant') {
|
|
20
|
-
for (const call of message.toolCalls ?? []) {
|
|
21
|
-
const id = toolCallId(call);
|
|
22
|
-
if (id === undefined) throw new Error(`${label} contains a tool call without an id`);
|
|
23
|
-
if (pending.has(id)) throw new Error(`${label} contains duplicate tool call id ${id}`);
|
|
24
|
-
pending.add(id);
|
|
25
|
-
}
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
if (message?.role !== 'tool') continue;
|
|
29
|
-
const id = typeof message.toolCallId === 'string' ? message.toolCallId : undefined;
|
|
30
|
-
if (id === undefined || !pending.delete(id)) {
|
|
31
|
-
throw new Error(`${label} contains an orphan tool result${id ? ` ${id}` : ''}`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (pending.size > 0) {
|
|
35
|
-
throw new Error(`${label} contains ${pending.size} tool call(s) without results`);
|
|
36
|
-
}
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function createCompactionTransaction({ source, turnId, tokensBefore, messageCountBefore }) {
|
|
41
|
-
const transaction = {
|
|
42
|
-
id: randomUUID(),
|
|
43
|
-
source,
|
|
44
|
-
turnId: turnId ?? null,
|
|
45
|
-
tokensBefore: positiveInteger(tokensBefore, 'tokensBefore'),
|
|
46
|
-
messageCountBefore: positiveInteger(messageCountBefore, 'messageCountBefore'),
|
|
47
|
-
state: 'started',
|
|
48
|
-
};
|
|
49
|
-
return {
|
|
50
|
-
transaction,
|
|
51
|
-
record: {
|
|
52
|
-
type: 'compaction/start',
|
|
53
|
-
compaction_id: transaction.id,
|
|
54
|
-
source: transaction.source,
|
|
55
|
-
turn_id: transaction.turnId,
|
|
56
|
-
size_before: transaction.tokensBefore,
|
|
57
|
-
message_count_before: transaction.messageCountBefore,
|
|
58
|
-
unit: 'tokens',
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function summarizeCompactionTransaction(transaction, input) {
|
|
64
|
-
if (transaction?.state !== 'started') {
|
|
65
|
-
throw new Error('compaction/summary requires exactly one open compaction/start');
|
|
66
|
-
}
|
|
67
|
-
if (typeof input.summary !== 'string' || input.summary.trim().length === 0) {
|
|
68
|
-
throw new Error('compaction/summary requires non-empty model-visible summary text');
|
|
69
|
-
}
|
|
70
|
-
assertBalancedToolPairs(input.historyBefore, 'history before compaction');
|
|
71
|
-
assertBalancedToolPairs(input.historyAfter, 'history after compaction');
|
|
72
|
-
transaction.state = 'summarized';
|
|
73
|
-
transaction.tokensAfter = positiveInteger(input.tokensAfter, 'tokensAfter');
|
|
74
|
-
transaction.messageCountAfter = positiveInteger(input.messageCountAfter, 'messageCountAfter');
|
|
75
|
-
return {
|
|
76
|
-
type: 'compaction/summary',
|
|
77
|
-
compaction_id: transaction.id,
|
|
78
|
-
source: transaction.source,
|
|
79
|
-
turn_id: transaction.turnId,
|
|
80
|
-
summary: input.summary,
|
|
81
|
-
shadowed_token_count: transaction.tokensBefore,
|
|
82
|
-
size_before: transaction.tokensBefore,
|
|
83
|
-
size_after: transaction.tokensAfter,
|
|
84
|
-
message_count_before: transaction.messageCountBefore,
|
|
85
|
-
message_count_after: transaction.messageCountAfter,
|
|
86
|
-
tool_pairing_balanced_before: true,
|
|
87
|
-
tool_pairing_balanced_after: true,
|
|
88
|
-
unit: 'tokens',
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function endCompactionTransaction(transaction, { status, error } = {}) {
|
|
93
|
-
if (transaction?.state === 'ended') return undefined;
|
|
94
|
-
if (transaction?.state !== 'started' && transaction?.state !== 'summarized') {
|
|
95
|
-
throw new Error('compaction/end requires an open compaction/start');
|
|
96
|
-
}
|
|
97
|
-
const normalizedStatus = status ?? 'success';
|
|
98
|
-
if (normalizedStatus === 'success' && transaction.state !== 'summarized') {
|
|
99
|
-
throw new Error('successful compaction/end requires one compaction/summary');
|
|
100
|
-
}
|
|
101
|
-
if (!['success', 'cancelled', 'failed'].includes(normalizedStatus)) {
|
|
102
|
-
throw new Error(`unsupported compaction status ${normalizedStatus}`);
|
|
103
|
-
}
|
|
104
|
-
transaction.state = 'ended';
|
|
105
|
-
return {
|
|
106
|
-
type: 'compaction/end',
|
|
107
|
-
compaction_id: transaction.id,
|
|
108
|
-
source: transaction.source,
|
|
109
|
-
turn_id: transaction.turnId,
|
|
110
|
-
status: normalizedStatus,
|
|
111
|
-
...(transaction.tokensAfter === undefined ? {} : { size_after: transaction.tokensAfter }),
|
|
112
|
-
...(typeof error === 'string' && error.length > 0 ? { error } : {}),
|
|
113
|
-
unit: 'tokens',
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
module.exports = {
|
|
118
|
-
assertBalancedToolPairs,
|
|
119
|
-
createCompactionTransaction,
|
|
120
|
-
endCompactionTransaction,
|
|
121
|
-
summarizeCompactionTransaction,
|
|
122
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('node:fs/promises');
|
|
4
|
-
|
|
5
|
-
async function configFileMatches(filePath, nextContent, fsImpl = fs) {
|
|
6
|
-
const content = Buffer.isBuffer(nextContent)
|
|
7
|
-
? nextContent
|
|
8
|
-
: Buffer.from(String(nextContent), 'utf8');
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
const stat = await fsImpl.lstat(filePath);
|
|
12
|
-
if (!stat.isFile() || stat.isSymbolicLink() || stat.size !== content.byteLength) {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const current = await fsImpl.readFile(filePath);
|
|
17
|
-
return Buffer.isBuffer(current)
|
|
18
|
-
? current.equals(content)
|
|
19
|
-
: Buffer.from(current).equals(content);
|
|
20
|
-
} catch {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
module.exports = {
|
|
26
|
-
configFileMatches,
|
|
27
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function wholeTokenCount(value) {
|
|
4
|
-
if (!Number.isFinite(value) || value <= 0) return 0;
|
|
5
|
-
return Math.floor(value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function reconcileContextBudget(input = {}) {
|
|
9
|
-
const totalTokens = wholeTokenCount(input.totalTokens);
|
|
10
|
-
const maxTokens = Math.max(totalTokens, wholeTokenCount(input.maxTokens));
|
|
11
|
-
const conversationTokens = Math.min(totalTokens, wholeTokenCount(input.conversationTokens));
|
|
12
|
-
const toolTokens = Math.min(
|
|
13
|
-
totalTokens - conversationTokens,
|
|
14
|
-
wholeTokenCount(input.toolTokens),
|
|
15
|
-
);
|
|
16
|
-
const systemTokens = totalTokens - conversationTokens - toolTokens;
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
systemTokens,
|
|
20
|
-
conversationTokens,
|
|
21
|
-
toolTokens,
|
|
22
|
-
freeTokens: maxTokens - totalTokens,
|
|
23
|
-
totalTokens,
|
|
24
|
-
maxTokens,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
module.exports = {
|
|
29
|
-
reconcileContextBudget,
|
|
30
|
-
wholeTokenCount,
|
|
31
|
-
};
|