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,107 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const path = require('node:path');
|
|
4
|
-
const { isDeepStrictEqual } = require('node:util');
|
|
5
|
-
const providerId = 'managed:blun';
|
|
6
|
-
const serviceKeys = ['blunSearch', 'blunFetch', 'blunMedia'];
|
|
7
|
-
const writers = new Map();
|
|
8
|
-
const jsonCopy = (value) => JSON.parse(JSON.stringify(value));
|
|
9
|
-
const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
10
|
-
|
|
11
|
-
function providerModelRefreshSnapshot(config) {
|
|
12
|
-
return jsonCopy({
|
|
13
|
-
provider: config.providers?.[providerId] ?? null,
|
|
14
|
-
models: Object.fromEntries(Object.entries(config.models ?? {}).filter(([, model]) => model?.provider === providerId)),
|
|
15
|
-
defaultModel: config.defaultModel ?? null,
|
|
16
|
-
thinkingEnabled: config.thinking?.enabled ?? null,
|
|
17
|
-
services: Object.fromEntries(serviceKeys.map((key) => [key, config.services?.[key] ?? null])),
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function exactKeys(value, keys) {
|
|
22
|
-
return record(value) && isDeepStrictEqual(Object.keys(value).sort(), [...keys].sort());
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function checkCredentials(value) {
|
|
26
|
-
if (value?.oauth != null && (value.apiKey?.trim() || value.apiKeyFile?.trim())) {
|
|
27
|
-
throw new Error('Provider refresh cannot combine OAuth and API key credentials.');
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function checkSnapshot(value) {
|
|
32
|
-
if (!exactKeys(value, ['provider', 'models', 'defaultModel', 'thinkingEnabled', 'services']) ||
|
|
33
|
-
!record(value.provider) || value.provider.type !== 'blun' || !record(value.models) ||
|
|
34
|
-
!(value.defaultModel === null || typeof value.defaultModel === 'string') ||
|
|
35
|
-
!(value.thinkingEnabled === null || typeof value.thinkingEnabled === 'boolean') ||
|
|
36
|
-
!exactKeys(value.services, serviceKeys)) throw new Error('Invalid provider refresh snapshot.');
|
|
37
|
-
checkCredentials(value.provider);
|
|
38
|
-
for (const [alias, model] of Object.entries(value.models)) {
|
|
39
|
-
if (['__proto__', 'prototype', 'constructor'].includes(alias) || !record(model) || model.provider !== providerId) {
|
|
40
|
-
throw new Error('Provider refresh contains a foreign or invalid model alias.');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
for (const service of Object.values(value.services)) {
|
|
44
|
-
if (service !== null && !record(service)) throw new Error('Invalid provider refresh service.');
|
|
45
|
-
checkCredentials(service);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function applyProviderModelRefresh(config, envelope) {
|
|
50
|
-
if (!exactKeys(envelope, ['providerModelRefresh'])) throw new Error('Provider refresh cannot be combined with a config patch.');
|
|
51
|
-
const request = envelope.providerModelRefresh;
|
|
52
|
-
if (!exactKeys(request, ['version', 'before', 'after']) || request.version !== 1) throw new Error('Invalid provider refresh request.');
|
|
53
|
-
const { before, after } = request;
|
|
54
|
-
checkSnapshot(before);
|
|
55
|
-
checkSnapshot(after);
|
|
56
|
-
if (!Object.hasOwn(after.models, 'blun/king')) throw new Error('Provider refresh must retain the BLUN King model.');
|
|
57
|
-
const current = providerModelRefreshSnapshot(config);
|
|
58
|
-
if (!isDeepStrictEqual(current.provider, before.provider) || !isDeepStrictEqual(current.models, before.models)) {
|
|
59
|
-
throw new Error('Provider or models changed during refresh; existing configuration retained.');
|
|
60
|
-
}
|
|
61
|
-
const next = structuredClone(config);
|
|
62
|
-
next.providers[providerId] = jsonCopy(after.provider);
|
|
63
|
-
next.models ??= {};
|
|
64
|
-
// The TOML writer otherwise revives omitted fields from these old raw tables.
|
|
65
|
-
if (record(next.raw?.providers)) delete next.raw.providers[providerId];
|
|
66
|
-
for (const alias of new Set([...Object.keys(current.models), ...Object.keys(after.models)])) {
|
|
67
|
-
const existing = next.models[alias];
|
|
68
|
-
if (existing !== undefined && existing.provider !== providerId) throw new Error('Provider refresh conflicts with another provider model.');
|
|
69
|
-
delete next.models[alias];
|
|
70
|
-
if (record(next.raw?.models)) delete next.raw.models[alias];
|
|
71
|
-
}
|
|
72
|
-
Object.assign(next.models, jsonCopy(after.models));
|
|
73
|
-
if (current.defaultModel === before.defaultModel) {
|
|
74
|
-
if (after.defaultModel === null) delete next.defaultModel;
|
|
75
|
-
else next.defaultModel = after.defaultModel;
|
|
76
|
-
}
|
|
77
|
-
if (next.defaultModel !== undefined && !Object.hasOwn(next.models, next.defaultModel)) throw new Error('Provider refresh would invalidate the selected default model.');
|
|
78
|
-
if (current.defaultModel === before.defaultModel && current.thinkingEnabled === before.thinkingEnabled) {
|
|
79
|
-
if (after.thinkingEnabled === null) {
|
|
80
|
-
if (next.thinking) delete next.thinking.enabled;
|
|
81
|
-
if (record(next.raw?.thinking)) delete next.raw.thinking.enabled;
|
|
82
|
-
} else next.thinking = { ...next.thinking, enabled: after.thinkingEnabled };
|
|
83
|
-
}
|
|
84
|
-
for (const key of serviceKeys) {
|
|
85
|
-
if (!isDeepStrictEqual(current.services[key], before.services[key])) continue;
|
|
86
|
-
if (after.services[key] === null) {
|
|
87
|
-
if (next.services) delete next.services[key];
|
|
88
|
-
} else {
|
|
89
|
-
next.services ??= {};
|
|
90
|
-
next.services[key] = jsonCopy(after.services[key]);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return next;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Share one read-modify-write queue across Core instances using the same file.
|
|
97
|
-
function withProviderConfigWrite(filePath, operation) {
|
|
98
|
-
const resolved = path.resolve(filePath);
|
|
99
|
-
const key = process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
100
|
-
const run = (writers.get(key) ?? Promise.resolve()).then(operation);
|
|
101
|
-
const tail = run.then(() => undefined, () => undefined);
|
|
102
|
-
writers.set(key, tail);
|
|
103
|
-
void tail.then(() => { if (writers.get(key) === tail) writers.delete(key); });
|
|
104
|
-
return run;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
module.exports = { providerModelRefreshSnapshot, applyProviderModelRefresh, withProviderConfigWrite };
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const MAX_AUTOMATIC_RATE_LIMIT_RESUMES = 3;
|
|
4
|
-
const MAX_EXPLICIT_RATE_LIMIT_RETRIES = 2;
|
|
5
|
-
const RATE_LIMIT_RETRY_BASE_MS = 60_000;
|
|
6
|
-
const RATE_LIMIT_COMPACTION_THRESHOLD_TOKENS = 64_000;
|
|
7
|
-
|
|
8
|
-
function isImmediateGenerateRetryAllowed(statusCode) {
|
|
9
|
-
return statusCode !== 429 && [500, 502, 503, 504].includes(statusCode);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function resolveTransportRetryBudget(configuredMaxRetries, statusCode, shouldRetryHeader) {
|
|
13
|
-
if (!Number.isInteger(configuredMaxRetries) || configuredMaxRetries < 0) {
|
|
14
|
-
throw new Error("configuredMaxRetries must be a non-negative integer.");
|
|
15
|
-
}
|
|
16
|
-
const explicitRetry = typeof shouldRetryHeader === "string"
|
|
17
|
-
&& shouldRetryHeader.trim().toLowerCase() === "true";
|
|
18
|
-
if (statusCode !== 429 || !explicitRetry) return configuredMaxRetries;
|
|
19
|
-
return Math.max(configuredMaxRetries, MAX_EXPLICIT_RATE_LIMIT_RETRIES);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function rateLimitRetryDelayMs(retryCount) {
|
|
23
|
-
if (!Number.isInteger(retryCount) || retryCount < 1) {
|
|
24
|
-
throw new Error("retryCount must be a positive integer.");
|
|
25
|
-
}
|
|
26
|
-
return RATE_LIMIT_RETRY_BASE_MS * (2 ** (retryCount - 1));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function shouldStopAutomaticRateLimitResume(retryCount) {
|
|
30
|
-
return retryCount >= MAX_AUTOMATIC_RATE_LIMIT_RESUMES;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function shouldCompactBeforeRateLimitResume(estimatedRequestTokens) {
|
|
34
|
-
return Number.isFinite(estimatedRequestTokens)
|
|
35
|
-
&& estimatedRequestTokens >= RATE_LIMIT_COMPACTION_THRESHOLD_TOKENS;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
module.exports = {
|
|
39
|
-
MAX_AUTOMATIC_RATE_LIMIT_RESUMES,
|
|
40
|
-
MAX_EXPLICIT_RATE_LIMIT_RETRIES,
|
|
41
|
-
RATE_LIMIT_RETRY_BASE_MS,
|
|
42
|
-
isImmediateGenerateRetryAllowed,
|
|
43
|
-
rateLimitRetryDelayMs,
|
|
44
|
-
resolveTransportRetryBudget,
|
|
45
|
-
shouldCompactBeforeRateLimitResume,
|
|
46
|
-
shouldStopAutomaticRateLimitResume,
|
|
47
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const MAX_READ_BATCH_REQUESTS = 12;
|
|
4
|
-
|
|
5
|
-
function readBatchAllFailed(results) {
|
|
6
|
-
return results.length === 0 || results.every((result) => result?.isError === true);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function renderReadBatchOutput(requests, results) {
|
|
10
|
-
return requests.map((request, index) => {
|
|
11
|
-
const result = results[index] ?? {
|
|
12
|
-
isError: true,
|
|
13
|
-
output: 'ReadBatch did not receive a result for this request.',
|
|
14
|
-
};
|
|
15
|
-
const range = [
|
|
16
|
-
request.line_offset === undefined ? null : `line_offset=${String(request.line_offset)}`,
|
|
17
|
-
request.n_lines === undefined ? null : `n_lines=${String(request.n_lines)}`,
|
|
18
|
-
].filter(Boolean);
|
|
19
|
-
const rangeSuffix = range.length === 0 ? '' : ` [${range.join(', ')}]`;
|
|
20
|
-
const status = result.isError === true ? 'error' : 'ok';
|
|
21
|
-
return [
|
|
22
|
-
`--- Read ${String(index + 1)}/${String(requests.length)}: ${JSON.stringify(request.path)}${rangeSuffix} (${status}) ---`,
|
|
23
|
-
String(result.output ?? ''),
|
|
24
|
-
].join('\n');
|
|
25
|
-
}).join('\n\n');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
module.exports = {
|
|
29
|
-
MAX_READ_BATCH_REQUESTS,
|
|
30
|
-
readBatchAllFailed,
|
|
31
|
-
renderReadBatchOutput,
|
|
32
|
-
};
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const READ_PRESSURE_RATIO = 0.75;
|
|
4
|
-
const READ_PRESSURE_CHUNK_BYTES = 10 * 1024;
|
|
5
|
-
const READ_PRESSURE_LINE_CAP = 1000;
|
|
6
|
-
const READ_ESTIMATED_BYTES_PER_TOKEN = 4;
|
|
7
|
-
|
|
8
|
-
function availableReadContextTokens(input = {}) {
|
|
9
|
-
const contextTokens = Number(input.contextTokens);
|
|
10
|
-
const maxContextTokens = Number(input.maxContextTokens);
|
|
11
|
-
if (!Number.isFinite(contextTokens) || contextTokens < 0) return undefined;
|
|
12
|
-
if (!Number.isFinite(maxContextTokens) || maxContextTokens <= 0) return undefined;
|
|
13
|
-
|
|
14
|
-
const pressureTokens = Math.floor(maxContextTokens * READ_PRESSURE_RATIO);
|
|
15
|
-
return Math.max(0, pressureTokens - contextTokens);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function readModelVisibleBytes(input = {}) {
|
|
19
|
-
const availableTokens = availableReadContextTokens(input);
|
|
20
|
-
if (availableTokens === undefined) return READ_PRESSURE_CHUNK_BYTES;
|
|
21
|
-
const availableBytes = Math.min(
|
|
22
|
-
Number.MAX_SAFE_INTEGER,
|
|
23
|
-
availableTokens * READ_ESTIMATED_BYTES_PER_TOKEN,
|
|
24
|
-
);
|
|
25
|
-
return Math.max(READ_PRESSURE_CHUNK_BYTES, availableBytes);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function readModelVisibleLines(input = {}) {
|
|
29
|
-
const availableTokens = availableReadContextTokens(input);
|
|
30
|
-
if (availableTokens === undefined) return READ_PRESSURE_LINE_CAP;
|
|
31
|
-
return Math.max(READ_PRESSURE_LINE_CAP, availableTokens);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function readContinuationNotice(input) {
|
|
35
|
-
if (!Number.isSafeInteger(input.lineOffset) || input.lineOffset < 1) return undefined;
|
|
36
|
-
let readLines;
|
|
37
|
-
if (input?.maxBytesReached === true) {
|
|
38
|
-
if (!Number.isSafeInteger(input.renderedLineCount) || input.renderedLineCount < 1) return undefined;
|
|
39
|
-
readLines = input.renderedLineCount;
|
|
40
|
-
} else if (input?.maxLinesReached === true) {
|
|
41
|
-
if (!Number.isSafeInteger(input.effectiveLimit) || input.effectiveLimit < input.maxLines) return undefined;
|
|
42
|
-
readLines = input.effectiveLimit;
|
|
43
|
-
} else {
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const nextLineOffset = input.lineOffset + readLines;
|
|
48
|
-
if (!Number.isSafeInteger(nextLineOffset)) return undefined;
|
|
49
|
-
return `Continue reading with line_offset=${String(nextLineOffset)}. Do not assume you have reached the end of the file.`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
module.exports = {
|
|
53
|
-
READ_PRESSURE_RATIO,
|
|
54
|
-
READ_PRESSURE_CHUNK_BYTES,
|
|
55
|
-
READ_PRESSURE_LINE_CAP,
|
|
56
|
-
readModelVisibleBytes,
|
|
57
|
-
readModelVisibleLines,
|
|
58
|
-
readContinuationNotice,
|
|
59
|
-
};
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const RECURRING_CRON_CONTEXT_MAX_MESSAGES = 24;
|
|
4
|
-
const RECURRING_CRON_CONTEXT_MAX_CHARS = 48_000;
|
|
5
|
-
const TRUNCATED_CONTEXT_MARKER = '\n[...context truncated...]';
|
|
6
|
-
|
|
7
|
-
function recurringCronJobId(message) {
|
|
8
|
-
if (message?.role !== 'user') return null;
|
|
9
|
-
if (message.origin?.kind !== 'cron_job' || message.origin.recurring !== true) return null;
|
|
10
|
-
const jobId = String(message.origin.jobId || '').trim();
|
|
11
|
-
return jobId || null;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function messageTextChars(message) {
|
|
15
|
-
if (!Array.isArray(message?.content)) return 0;
|
|
16
|
-
return message.content.reduce((total, part) => (
|
|
17
|
-
total + (part?.type === 'text' && typeof part.text === 'string' ? part.text.length : 0)
|
|
18
|
-
), 0);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function splitIntoUserSegments(messages) {
|
|
22
|
-
const segments = [];
|
|
23
|
-
let current = [];
|
|
24
|
-
for (const message of messages) {
|
|
25
|
-
if (message?.role === 'user' && current.length > 0) {
|
|
26
|
-
segments.push(current);
|
|
27
|
-
current = [];
|
|
28
|
-
}
|
|
29
|
-
current.push(message);
|
|
30
|
-
}
|
|
31
|
-
if (current.length > 0) segments.push(current);
|
|
32
|
-
return segments;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function segmentTextChars(segment) {
|
|
36
|
-
return segment.reduce((total, message) => total + messageTextChars(message), 0);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function isCompactionSummarySegment(segment) {
|
|
40
|
-
return segment[0]?.role === 'user' && segment[0]?.origin?.kind === 'compaction_summary';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function isRecurringCronSegment(segment) {
|
|
44
|
-
return recurringCronJobId(segment[0]) !== null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function projectSegmentInstruction(segment, maxChars) {
|
|
48
|
-
const message = segment[0];
|
|
49
|
-
if (message?.role !== 'user' || !Array.isArray(message.content) || maxChars <= 0) return null;
|
|
50
|
-
let remaining = maxChars;
|
|
51
|
-
const content = [];
|
|
52
|
-
for (const part of message.content) {
|
|
53
|
-
if (part?.type !== 'text' || typeof part.text !== 'string' || remaining <= 0) continue;
|
|
54
|
-
if (part.text.length <= remaining) {
|
|
55
|
-
content.push(part);
|
|
56
|
-
remaining -= part.text.length;
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
const marker = remaining > TRUNCATED_CONTEXT_MARKER.length
|
|
60
|
-
? TRUNCATED_CONTEXT_MARKER
|
|
61
|
-
: '';
|
|
62
|
-
const text = `${part.text.slice(0, remaining - marker.length)}${marker}`;
|
|
63
|
-
if (text.length > 0) content.push({ ...part, text });
|
|
64
|
-
remaining = 0;
|
|
65
|
-
}
|
|
66
|
-
return content.length === 0 ? null : { ...message, content };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function projectRecurringCronHistory(history, jobId) {
|
|
70
|
-
if (!Array.isArray(history) || history.length === 0) return history;
|
|
71
|
-
const normalizedJobId = String(jobId || '').trim();
|
|
72
|
-
if (!normalizedJobId) return history;
|
|
73
|
-
|
|
74
|
-
let wakeupIndex = -1;
|
|
75
|
-
for (let index = history.length - 1; index >= 0; index -= 1) {
|
|
76
|
-
if (recurringCronJobId(history[index]) === normalizedJobId) {
|
|
77
|
-
wakeupIndex = index;
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (wakeupIndex < 0) return history;
|
|
82
|
-
|
|
83
|
-
const currentSegment = history.slice(wakeupIndex);
|
|
84
|
-
const priorSegments = splitIntoUserSegments(history.slice(0, wakeupIndex));
|
|
85
|
-
const summaryIndex = priorSegments.findLastIndex(isCompactionSummarySegment);
|
|
86
|
-
const summary = summaryIndex >= 0 ? priorSegments[summaryIndex] : [];
|
|
87
|
-
const candidates = priorSegments.filter((segment, index) => (
|
|
88
|
-
index !== summaryIndex && !isRecurringCronSegment(segment)
|
|
89
|
-
));
|
|
90
|
-
|
|
91
|
-
const selected = [];
|
|
92
|
-
let selectedMessages = summary.length + currentSegment.length;
|
|
93
|
-
let selectedChars = segmentTextChars(summary) + segmentTextChars(currentSegment);
|
|
94
|
-
for (let index = candidates.length - 1; index >= 0; index -= 1) {
|
|
95
|
-
const segment = candidates[index];
|
|
96
|
-
const nextMessages = selectedMessages + segment.length;
|
|
97
|
-
const nextChars = selectedChars + segmentTextChars(segment);
|
|
98
|
-
if (
|
|
99
|
-
nextMessages > RECURRING_CRON_CONTEXT_MAX_MESSAGES
|
|
100
|
-
|| nextChars > RECURRING_CRON_CONTEXT_MAX_CHARS
|
|
101
|
-
) {
|
|
102
|
-
if (selected.length === 0 && selectedMessages < RECURRING_CRON_CONTEXT_MAX_MESSAGES) {
|
|
103
|
-
const instruction = projectSegmentInstruction(
|
|
104
|
-
segment,
|
|
105
|
-
RECURRING_CRON_CONTEXT_MAX_CHARS - selectedChars,
|
|
106
|
-
);
|
|
107
|
-
if (instruction !== null) selected.unshift([instruction]);
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
selected.unshift(segment);
|
|
112
|
-
selectedMessages = nextMessages;
|
|
113
|
-
selectedChars = nextChars;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return [...summary, ...selected.flat(), ...currentSegment];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
module.exports = {
|
|
120
|
-
RECURRING_CRON_CONTEXT_MAX_CHARS,
|
|
121
|
-
RECURRING_CRON_CONTEXT_MAX_MESSAGES,
|
|
122
|
-
projectRecurringCronHistory,
|
|
123
|
-
recurringCronJobId,
|
|
124
|
-
};
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('node:fs');
|
|
4
|
-
const path = require('node:path');
|
|
5
|
-
|
|
6
|
-
const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
|
|
7
|
-
const MAX_FILE_BYTES = 64 * 1024;
|
|
8
|
-
const MAX_ENTRIES = 6;
|
|
9
|
-
const MAX_RECENT_CONTEXT = 2;
|
|
10
|
-
const MAX_TEXT_CHARS = 240;
|
|
11
|
-
const LONG_GAP_MS = 7 * 24 * 60 * 60 * 1000;
|
|
12
|
-
const ATTENTION_COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
|
|
13
|
-
|
|
14
|
-
function safeId(value) {
|
|
15
|
-
const normalized = String(value ?? '').trim();
|
|
16
|
-
return SAFE_ID_RE.test(normalized) ? normalized : '';
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function isInside(root, target) {
|
|
20
|
-
const relative = path.relative(root, target);
|
|
21
|
-
return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function trustedTimestamp(value) {
|
|
25
|
-
const text = String(value ?? '').trim();
|
|
26
|
-
return text && !Number.isNaN(Date.parse(text)) ? new Date(text).toISOString() : '';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function redactSecrets(value) {
|
|
30
|
-
return String(value ?? '')
|
|
31
|
-
.replace(/\bsk-[A-Za-z0-9_-]{8,}\b/gu, '[REDACTED]')
|
|
32
|
-
.replace(/\b(?:token|password|passwort|secret|api[_ -]?key)\s*[:=]\s*\S+/giu, '$1=[REDACTED]')
|
|
33
|
-
.replace(/[\u0000-\u001f\u007f]+/gu, ' ')
|
|
34
|
-
.replace(/\s+/gu, ' ')
|
|
35
|
-
.trim()
|
|
36
|
-
.slice(0, MAX_TEXT_CHARS);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function readJson(root, target) {
|
|
40
|
-
if (!isInside(root, target)) return undefined;
|
|
41
|
-
try {
|
|
42
|
-
const stat = fs.lstatSync(target);
|
|
43
|
-
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_FILE_BYTES) return undefined;
|
|
44
|
-
const value = JSON.parse(fs.readFileSync(target, 'utf8'));
|
|
45
|
-
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
46
|
-
} catch {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function writeJsonAtomic(root, target, value) {
|
|
52
|
-
if (!isInside(root, target)) return false;
|
|
53
|
-
const parent = path.dirname(target);
|
|
54
|
-
let temporary;
|
|
55
|
-
try {
|
|
56
|
-
fs.mkdirSync(parent, { recursive: true });
|
|
57
|
-
if (!isInside(root, fs.realpathSync(parent))) return false;
|
|
58
|
-
if (fs.existsSync(target) && fs.lstatSync(target).isSymbolicLink()) return false;
|
|
59
|
-
temporary = `${target}.tmp-${process.pid}-${Date.now()}`;
|
|
60
|
-
fs.writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
61
|
-
fs.renameSync(temporary, target);
|
|
62
|
-
return true;
|
|
63
|
-
} catch {
|
|
64
|
-
if (temporary) {
|
|
65
|
-
try { fs.unlinkSync(temporary); } catch {}
|
|
66
|
-
}
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function attentionForReturn({ root, agentId, actorId, previousAt, currentAt }) {
|
|
72
|
-
if (!previousAt || Date.parse(currentAt) - Date.parse(previousAt) < LONG_GAP_MS) return undefined;
|
|
73
|
-
const target = path.resolve(root, 'attention', `${actorId}.json`);
|
|
74
|
-
const existing = readJson(root, target);
|
|
75
|
-
const lastNoticeAt = trustedTimestamp(existing?.noticed_at);
|
|
76
|
-
if (lastNoticeAt && Date.parse(currentAt) - Date.parse(lastNoticeAt) < ATTENTION_COOLDOWN_MS) return undefined;
|
|
77
|
-
const attention = {
|
|
78
|
-
status: 'noticed_on_return',
|
|
79
|
-
subject_type: 'human',
|
|
80
|
-
actor_id: actorId,
|
|
81
|
-
responsible_agent: agentId,
|
|
82
|
-
noticed_at: currentAt,
|
|
83
|
-
previous_interaction_at: previousAt,
|
|
84
|
-
message: 'A reliable long gap is visible in direct history. Acknowledge the return naturally only if it fits after the current task.',
|
|
85
|
-
};
|
|
86
|
-
return writeJsonAtomic(root, target, attention) ? attention : undefined;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function normalizedJournalEntries(value) {
|
|
90
|
-
if (!Array.isArray(value)) return [];
|
|
91
|
-
const entries = [];
|
|
92
|
-
const seen = new Set();
|
|
93
|
-
for (const entry of value) {
|
|
94
|
-
const occurredAt = trustedTimestamp(entry?.occurred_at);
|
|
95
|
-
const text = redactSecrets(entry?.text);
|
|
96
|
-
if (!occurredAt || !text) continue;
|
|
97
|
-
const key = `${occurredAt}\0${text}`;
|
|
98
|
-
if (seen.has(key)) continue;
|
|
99
|
-
seen.add(key);
|
|
100
|
-
entries.push({ occurred_at: occurredAt, text });
|
|
101
|
-
}
|
|
102
|
-
return entries.slice(-MAX_ENTRIES);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function prepareRelationshipTurn(input = {}) {
|
|
106
|
-
const root = path.resolve(String(input.root ?? ''));
|
|
107
|
-
const agentId = safeId(input.agentId);
|
|
108
|
-
const actorId = safeId(input.actorId);
|
|
109
|
-
const groupId = safeId(input.groupId);
|
|
110
|
-
const occurredAt = trustedTimestamp(input.occurredAt);
|
|
111
|
-
if (!agentId || !actorId || !occurredAt || !fs.existsSync(root)) return { recent: [], attention: undefined };
|
|
112
|
-
if (groupId) return { recent: [], attention: undefined };
|
|
113
|
-
|
|
114
|
-
const text = redactSecrets(input.text);
|
|
115
|
-
const target = path.resolve(root, 'agents', agentId, 'journal', 'recent', `${actorId}.json`);
|
|
116
|
-
const existing = readJson(root, target);
|
|
117
|
-
const rawEntries = Array.isArray(existing?.entries) ? existing.entries.slice(-MAX_ENTRIES) : [];
|
|
118
|
-
const entries = normalizedJournalEntries(rawEntries);
|
|
119
|
-
const currentKey = text ? `${occurredAt}\0${text}` : '';
|
|
120
|
-
const historical = currentKey
|
|
121
|
-
? entries.filter((entry) => `${entry.occurred_at}\0${entry.text}` !== currentKey)
|
|
122
|
-
: entries;
|
|
123
|
-
const previous = historical.at(-1);
|
|
124
|
-
const recent = historical.slice(-MAX_RECENT_CONTEXT);
|
|
125
|
-
const attention = attentionForReturn({
|
|
126
|
-
root,
|
|
127
|
-
agentId,
|
|
128
|
-
actorId,
|
|
129
|
-
previousAt: trustedTimestamp(previous?.occurred_at),
|
|
130
|
-
currentAt: occurredAt,
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
if (text) {
|
|
134
|
-
const alreadyStored = entries.some((entry) => `${entry.occurred_at}\0${entry.text}` === currentKey);
|
|
135
|
-
const next = alreadyStored ? entries : [...entries, { occurred_at: occurredAt, text }].slice(-MAX_ENTRIES);
|
|
136
|
-
if (JSON.stringify(next) !== JSON.stringify(rawEntries)) {
|
|
137
|
-
writeJsonAtomic(root, target, { version: 1, actor_id: actorId, entries: next });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return { recent, attention };
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
module.exports = { prepareRelationshipTurn };
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const crypto = require('node:crypto');
|
|
4
|
-
const { createPersonalityMemoryAdapter } = require('./personality-memory-adapter.cjs');
|
|
5
|
-
|
|
6
|
-
const SAFE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
|
|
7
|
-
const COOLDOWN_MS = 30 * 24 * 60 * 60 * 1000;
|
|
8
|
-
const WORK_OR_STRESS_RE = /(?:\b(?:auftrag|bauen|build|deploy|dringend|error|fehler|fix|funktioniert\s+nicht|problem|release|reparier|task|ticket|update|urgent)\b|https?:\/\/|[A-Za-z]:\\|```)/iu;
|
|
9
|
-
const CUES = [
|
|
10
|
-
{ topic: 'pets', sensitivity: 'low', pattern: /\b(?:dog|dogs|hund|hunde|katze|katzen|pet|pets|haustier|haustiere)\b/iu },
|
|
11
|
-
{ topic: 'family', sensitivity: 'medium', pattern: /\b(?:child|children|daughter|family|familie|kind|kinder|sohn|tochter)\b/iu },
|
|
12
|
-
{ topic: 'relationship', sensitivity: 'medium', pattern: /\b(?:beziehung|married|partner|partnerin|relationship|verheiratet)\b/iu },
|
|
13
|
-
{ topic: 'birthday', sensitivity: 'medium', pattern: /\b(?:birthday|geburtstag)\b/iu },
|
|
14
|
-
{ topic: 'personal_goals', sensitivity: 'low', pattern: /\b(?:in\s+einem\s+jahr|langfristig(?:es|e|en)?\s+ziel|long[- ]term\s+goal|personal\s+goal)\b/iu },
|
|
15
|
-
];
|
|
16
|
-
const RELAXED_FIRST_CONTACT_RE = /^(?:hallo|hey|hi|guten\s+(?:morgen|abend|tag)|moin|servus|wie\s+geht(?:'s|\s+es)?\s+dir|hello|how\s+are\s+you)[\s,.!?-]*.*$/iu;
|
|
17
|
-
|
|
18
|
-
function safeId(value) {
|
|
19
|
-
const normalized = String(value ?? '').trim();
|
|
20
|
-
return SAFE_ID_RE.test(normalized) ? normalized : '';
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function normalizedText(value) {
|
|
24
|
-
return String(value ?? '')
|
|
25
|
-
.replace(/[\u0000-\u001f\u007f]+/gu, ' ')
|
|
26
|
-
.replace(/\s+/gu, ' ')
|
|
27
|
-
.trim()
|
|
28
|
-
.slice(0, 500);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function trustedTimestamp(value) {
|
|
32
|
-
const text = String(value ?? '').trim();
|
|
33
|
-
return text && !Number.isNaN(Date.parse(text)) ? new Date(text).toISOString() : '';
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function digestId(prefix, values) {
|
|
37
|
-
return `${prefix}-${crypto.createHash('sha256').update(values.join('\0')).digest('hex').slice(0, 40)}`;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function curiosityCue(value) {
|
|
41
|
-
const text = normalizedText(value);
|
|
42
|
-
if (!text || WORK_OR_STRESS_RE.test(text)) return undefined;
|
|
43
|
-
for (const cue of CUES) {
|
|
44
|
-
if (cue.pattern.test(text)) return cue;
|
|
45
|
-
}
|
|
46
|
-
return RELAXED_FIRST_CONTACT_RE.test(text)
|
|
47
|
-
? { topic: 'getting_to_know_person', sensitivity: 'low' }
|
|
48
|
-
: undefined;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function opportunity(cue, idempotent = false) {
|
|
52
|
-
return {
|
|
53
|
-
topic: cue.topic,
|
|
54
|
-
sensitivity: cue.sensitivity,
|
|
55
|
-
source: 'direct_message_cue',
|
|
56
|
-
requires_question: false,
|
|
57
|
-
...(idempotent ? { idempotent: true } : {}),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function prepareCuriosityOpportunity(input = {}) {
|
|
62
|
-
if (input.groupId) return undefined;
|
|
63
|
-
const tenantId = safeId(input.tenantId);
|
|
64
|
-
const agentId = safeId(input.agentId);
|
|
65
|
-
const actorId = safeId(input.actorId);
|
|
66
|
-
const occurredAt = trustedTimestamp(input.occurredAt);
|
|
67
|
-
const receivedAt = trustedTimestamp(input.receivedAt);
|
|
68
|
-
const sourcePortal = safeId(input.sourcePortal) || 'telegram';
|
|
69
|
-
const sourceChannel = safeId(input.sourceChannel) || 'direct';
|
|
70
|
-
const conversationId = safeId(input.conversationId) || digestId('conversation', [actorId]);
|
|
71
|
-
const cue = curiosityCue(input.text);
|
|
72
|
-
if (!tenantId || !agentId || !actorId || !occurredAt || !receivedAt || !cue) return undefined;
|
|
73
|
-
const messageId = safeId(input.messageId) || digestId('message', [
|
|
74
|
-
sourcePortal, sourceChannel, conversationId, actorId, occurredAt, normalizedText(input.text),
|
|
75
|
-
]);
|
|
76
|
-
let memory = input.memoryAdapter;
|
|
77
|
-
let ownsMemory = false;
|
|
78
|
-
try {
|
|
79
|
-
if (!memory) {
|
|
80
|
-
memory = createPersonalityMemoryAdapter({ identityRoot: input.root });
|
|
81
|
-
ownsMemory = true;
|
|
82
|
-
}
|
|
83
|
-
const result = memory.claimCuriosityPresentation({
|
|
84
|
-
tenantId,
|
|
85
|
-
agentId,
|
|
86
|
-
actorId,
|
|
87
|
-
sourcePortal,
|
|
88
|
-
sourceChannel,
|
|
89
|
-
conversationId,
|
|
90
|
-
messageId,
|
|
91
|
-
occurredAt,
|
|
92
|
-
receivedAt,
|
|
93
|
-
topic: cue.topic,
|
|
94
|
-
sensitivity: cue.sensitivity,
|
|
95
|
-
cooldownMs: COOLDOWN_MS,
|
|
96
|
-
});
|
|
97
|
-
return result?.claimed === true ? opportunity(cue, result.idempotent === true) : undefined;
|
|
98
|
-
} catch {
|
|
99
|
-
return undefined;
|
|
100
|
-
} finally {
|
|
101
|
-
if (ownsMemory) {
|
|
102
|
-
try { memory.close(); } catch {}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
module.exports = { COOLDOWN_MS, prepareCuriosityOpportunity };
|