blun-king-cli 9.1.586 → 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 -178
- 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 +143078 -135241
- 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 -15
- 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 -79
- 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,486 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const TOOL_SCHEMA_BUDGET_RATIO = 0.35;
|
|
4
|
-
const TOOL_SCHEMA_MAX_TOKENS = 64_000;
|
|
5
|
-
const DEFERRED_TOOL_LOADER_NAME = 'ToolSearch';
|
|
6
|
-
const MAX_PERSISTENT_DEFERRED_TOOLS = 12;
|
|
7
|
-
const MAX_TOOL_SEARCH_QUERY_CHARS = 1_000;
|
|
8
|
-
const MAX_AUTO_RANKED_TOOLS = 6;
|
|
9
|
-
const TOOL_RANK_EMBEDDED_CONTENT_RE = /<(attached_documents?|attachment_content|document_content|file_content)\b[^>]*>[\s\S]*?<\/\1>/giu;
|
|
10
|
-
const TOOL_RANK_STOP_WORDS = new Set([
|
|
11
|
-
'aber', 'also', 'and', 'aus', 'bitte', 'can', 'das', 'den', 'der', 'des', 'die', 'dies', 'diese',
|
|
12
|
-
'du', 'ein', 'eine', 'einer', 'eines', 'for', 'fuer', 'für', 'haben', 'ich', 'ist', 'kann', 'kannst',
|
|
13
|
-
'mal', 'me', 'mein', 'meine', 'mir', 'mit', 'of', 'please', 'soll', 'the', 'und', 'uns', 'von',
|
|
14
|
-
'was', 'wir', 'with', 'you', 'zeige', 'zeig', 'pruefe', 'prüfe', 'lies', 'read', 'show', 'get',
|
|
15
|
-
]);
|
|
16
|
-
const TOOL_SEARCH_INTENT_WORDS = new Set([
|
|
17
|
-
'find', 'fetch', 'get', 'holen', 'list', 'read', 'search', 'show', 'anzeigen', 'lesen', 'suchen',
|
|
18
|
-
]);
|
|
19
|
-
const TOOL_SEARCH_RELATED_TERM_GROUPS = Object.freeze([
|
|
20
|
-
Object.freeze([
|
|
21
|
-
'checklist', 'list', 'liste', 'listen',
|
|
22
|
-
]),
|
|
23
|
-
Object.freeze([
|
|
24
|
-
'aufgabe', 'aufgaben', 'aufgabenliste', 'todo', 'todos',
|
|
25
|
-
]),
|
|
26
|
-
Object.freeze([
|
|
27
|
-
'current', 'inbox', 'latest', 'message', 'messages', 'nachricht', 'nachrichten', 'queue', 'queued',
|
|
28
|
-
'recent', 'letzte', 'letzten', 'letzter', 'vergangen', 'update', 'updates',
|
|
29
|
-
]),
|
|
30
|
-
Object.freeze([
|
|
31
|
-
'chat', 'conversation', 'history', 'log', 'logs', 'processed', 'protokoll', 'transcript', 'verlauf',
|
|
32
|
-
]),
|
|
33
|
-
Object.freeze([
|
|
34
|
-
'fact', 'facts', 'fakt', 'fakten', 'memory', 'memories', 'merk', 'merken', 'note', 'notes',
|
|
35
|
-
'persist', 'persistent', 'profile', 'remember', 'save', 'speichern', 'store',
|
|
36
|
-
]),
|
|
37
|
-
]);
|
|
38
|
-
const TOOL_SEARCH_SINGLE_TERM_RELATED_FALLBACKS = new Set([
|
|
39
|
-
'fact', 'facts', 'fakt', 'fakten', 'memory', 'memories', 'merk', 'merken', 'note', 'notes',
|
|
40
|
-
'persist', 'persistent', 'profile', 'remember', 'save', 'speichern', 'store', 'transcript',
|
|
41
|
-
]);
|
|
42
|
-
const CORE_TOOL_NAMES = Object.freeze([
|
|
43
|
-
'Bash',
|
|
44
|
-
'Read',
|
|
45
|
-
'ReadBatch',
|
|
46
|
-
'Edit',
|
|
47
|
-
'Grep',
|
|
48
|
-
'Write',
|
|
49
|
-
'Glob',
|
|
50
|
-
'TodoList',
|
|
51
|
-
'mcp__plugin-telegram_telegram__reply',
|
|
52
|
-
]);
|
|
53
|
-
|
|
54
|
-
const IMAGE_MEDIA_TERM_RE = /(?:^|[^\p{L}])(?:bild(?:er)?|foto(?:s)?|grafik(?:en)?|illustration(?:en)?|logo(?:s)?|image|images|photo|photos|picture|pictures|illustration|illustrations|visual|visuals)(?=$|[^\p{L}])/u;
|
|
55
|
-
const VIDEO_MEDIA_TERM_RE = /(?:^|[^\p{L}])(?:video(?:s)?|clip(?:s)?|film(?:e)?|animation(?:en)?|movie|movies)(?=$|[^\p{L}])/u;
|
|
56
|
-
const ANIMATE_ACTION_RE = /(?:^|[^\p{L}])(?:animier(?:e|en|t)?|animate|animated|animating)(?=$|[^\p{L}])/u;
|
|
57
|
-
const CREATE_ACTION_RE = /(?:^|[^\p{L}])(?:erstell(?:e|en|t)?|generier(?:e|en|t)?|erzeug(?:e|en|t)?|produzier(?:e|en|t)?|zeichn(?:e|en|et)?|mal(?:e|en|t)?|render(?:e|n|t)?|mach(?:e|en|t)?|create|creates|creating|generate|generates|generating|make|makes|making|draw|draws|drawing|paint|paints|painting|render|renders|rendering|produce|produces|producing)(?=$|[^\p{L}])/u;
|
|
58
|
-
const REQUEST_PREFIX_RE = /^(?:bitte\s+|please\s+)?(?:erstell|generier|erzeug|produzier|zeichn|mal|render|mach|animier|create|generate|make|draw|paint|render|produce|animate)/u;
|
|
59
|
-
const REQUEST_PHRASE_RE = /(?:^|[^\p{L}])(?:bitte|kannst du|könntest du|ich möchte|ich will|ich brauche|please|can you|could you|i want|i need)(?=$|[^\p{L}])/u;
|
|
60
|
-
|
|
61
|
-
function mediaGenerationToolNamesForText(value) {
|
|
62
|
-
const text = String(value || '').normalize('NFKC').trim().toLowerCase();
|
|
63
|
-
const selected = new Set();
|
|
64
|
-
if (!text) return selected;
|
|
65
|
-
if (/(?:^|[^a-z])generateimage(?=$|[^a-z])/u.test(text)) selected.add('GenerateImage');
|
|
66
|
-
if (/(?:^|[^a-z])generatevideo(?=$|[^a-z])/u.test(text)) selected.add('GenerateVideo');
|
|
67
|
-
if (selected.size > 0) return selected;
|
|
68
|
-
|
|
69
|
-
const animate = ANIMATE_ACTION_RE.test(text);
|
|
70
|
-
const create = CREATE_ACTION_RE.test(text);
|
|
71
|
-
const explicitRequest = REQUEST_PREFIX_RE.test(text) || REQUEST_PHRASE_RE.test(text);
|
|
72
|
-
if (!explicitRequest || (!create && !animate)) return selected;
|
|
73
|
-
if (animate && (IMAGE_MEDIA_TERM_RE.test(text) || VIDEO_MEDIA_TERM_RE.test(text))) {
|
|
74
|
-
selected.add('GenerateVideo');
|
|
75
|
-
return selected;
|
|
76
|
-
}
|
|
77
|
-
if (IMAGE_MEDIA_TERM_RE.test(text)) selected.add('GenerateImage');
|
|
78
|
-
if (VIDEO_MEDIA_TERM_RE.test(text)) selected.add('GenerateVideo');
|
|
79
|
-
return selected;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function mediaToolNamesForTurnText(value) {
|
|
83
|
-
const text = String(value || '');
|
|
84
|
-
const selected = new Set();
|
|
85
|
-
const channelBodies = [...text.matchAll(
|
|
86
|
-
/(?:^|\r?\n)<channel\b[^>]*>\r?\n([\s\S]*?)\r?\n<\/channel>(?=\r?\n|$)/giu,
|
|
87
|
-
)].map((match) => match[1]);
|
|
88
|
-
const intentTexts = channelBodies.length > 0 ? channelBodies : [text];
|
|
89
|
-
|
|
90
|
-
for (const intentText of intentTexts) {
|
|
91
|
-
for (const name of mediaGenerationToolNamesForText(intentText)) selected.add(name);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (/\bimage_path\s*=\s*["'][^"']+["']/iu.test(text)) {
|
|
95
|
-
selected.add('ReadMediaFile');
|
|
96
|
-
selected.add('UnderstandImage');
|
|
97
|
-
}
|
|
98
|
-
if (/\battachment_file_id\s*=\s*["'][^"']+["']/iu.test(text)) {
|
|
99
|
-
selected.add('mcp__plugin-telegram_telegram__download_attachment');
|
|
100
|
-
selected.add('UnderstandImage');
|
|
101
|
-
}
|
|
102
|
-
return selected;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function toolSchemaBudgetTokens(maxContextTokens) {
|
|
106
|
-
const context = Number(maxContextTokens);
|
|
107
|
-
if (!Number.isFinite(context) || context <= 0) return TOOL_SCHEMA_MAX_TOKENS;
|
|
108
|
-
return Math.min(TOOL_SCHEMA_MAX_TOKENS, Math.floor(context * TOOL_SCHEMA_BUDGET_RATIO));
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function deferredToolNames(tools) {
|
|
112
|
-
return [...new Set((Array.isArray(tools) ? tools : [])
|
|
113
|
-
.map((tool) => String(tool?.name || '').trim())
|
|
114
|
-
.filter(Boolean))].sort((left, right) => left.localeCompare(right));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function deferredToolCatalog(tools) {
|
|
118
|
-
const names = deferredToolNames(tools);
|
|
119
|
-
const leaves = names.map((name) => name.split(/__|:/).at(-1) || name);
|
|
120
|
-
const leafCounts = new Map();
|
|
121
|
-
for (const leaf of leaves) leafCounts.set(leaf, (leafCounts.get(leaf) || 0) + 1);
|
|
122
|
-
return names.map((name, index) => leafCounts.get(leaves[index]) === 1 ? leaves[index] : name)
|
|
123
|
-
.sort((left, right) => left.localeCompare(right));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function normalizeDeferredToolQuery(value) {
|
|
127
|
-
const query = String(value ?? '').trim();
|
|
128
|
-
if (query.length <= MAX_TOOL_SEARCH_QUERY_CHARS) return query;
|
|
129
|
-
const bounded = query.slice(0, MAX_TOOL_SEARCH_QUERY_CHARS);
|
|
130
|
-
const wordBoundary = bounded.lastIndexOf(' ');
|
|
131
|
-
return (wordBoundary >= MAX_TOOL_SEARCH_QUERY_CHARS * 0.8
|
|
132
|
-
? bounded.slice(0, wordBoundary)
|
|
133
|
-
: bounded).trimEnd();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function searchDeferredTools(tools, query) {
|
|
137
|
-
const normalized = normalizeDeferredToolQuery(query).toLowerCase();
|
|
138
|
-
if (!normalized) return [];
|
|
139
|
-
if (normalized.startsWith('select:')) {
|
|
140
|
-
const selector = normalized.slice('select:'.length).trim();
|
|
141
|
-
if (!selector) return [];
|
|
142
|
-
const exact = tools.find((tool) => String(tool?.name || '').toLowerCase() === selector);
|
|
143
|
-
if (exact) return [exact];
|
|
144
|
-
return tools.filter((tool) => {
|
|
145
|
-
const name = String(tool?.name || '').toLowerCase();
|
|
146
|
-
const leaf = name.split(/__|:/).at(-1);
|
|
147
|
-
return leaf === selector;
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const tokens = normalized.split(/\s+/).filter(Boolean);
|
|
152
|
-
const requiredNameTokens = tokens.filter((token) => token.startsWith('+')).map((token) => token.slice(1)).filter(Boolean);
|
|
153
|
-
const searchTokens = tokens.filter((token) => !token.startsWith('+'));
|
|
154
|
-
const eligibleTools = tools.filter((tool) => {
|
|
155
|
-
const name = String(tool?.name || '').toLowerCase();
|
|
156
|
-
return requiredNameTokens.every((token) => name.includes(token));
|
|
157
|
-
});
|
|
158
|
-
const firstSelector = searchTokens[0];
|
|
159
|
-
if (firstSelector) {
|
|
160
|
-
const exactNameMatches = eligibleTools.filter((tool) => String(tool?.name || '').toLowerCase() === firstSelector);
|
|
161
|
-
if (exactNameMatches.length === 1) return exactNameMatches;
|
|
162
|
-
const exactLeafMatches = eligibleTools.filter((tool) => {
|
|
163
|
-
const name = String(tool?.name || '').toLowerCase();
|
|
164
|
-
return name.split(/__|:/).at(-1) === firstSelector;
|
|
165
|
-
});
|
|
166
|
-
if (exactLeafMatches.length === 1) return exactLeafMatches;
|
|
167
|
-
}
|
|
168
|
-
return tools.map((tool) => {
|
|
169
|
-
const name = String(tool?.name || '').toLowerCase();
|
|
170
|
-
const description = String(tool?.description || '').toLowerCase();
|
|
171
|
-
if (!requiredNameTokens.every((token) => name.includes(token))) return null;
|
|
172
|
-
if (!searchTokens.every((token) => name.includes(token) || description.includes(token))) return null;
|
|
173
|
-
const score = searchTokens.reduce((total, token) => total + (name.includes(token) ? 5 : 1), 0)
|
|
174
|
-
+ requiredNameTokens.length * 5;
|
|
175
|
-
return { tool, score };
|
|
176
|
-
}).filter(Boolean).sort((left, right) => right.score - left.score || String(left.tool.name).localeCompare(String(right.tool.name))).slice(0, 5).map((entry) => entry.tool);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function relatedSearchTerms(token) {
|
|
180
|
-
const group = TOOL_SEARCH_RELATED_TERM_GROUPS.find((terms) => terms.includes(token));
|
|
181
|
-
return group || [token];
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function rankingIntentTexts(value) {
|
|
185
|
-
const text = String(value || '');
|
|
186
|
-
const channelBodies = [...text.matchAll(
|
|
187
|
-
/(?:^|\r?\n)<channel\b[^>]*>\r?\n([\s\S]*?)\r?\n<\/channel>(?=\r?\n|$)/giu,
|
|
188
|
-
)].map((match) => match[1]);
|
|
189
|
-
const intentTexts = channelBodies.length > 0 ? channelBodies : [text];
|
|
190
|
-
return intentTexts.map((intentText) => normalizeDeferredToolQuery(
|
|
191
|
-
intentText.replace(TOOL_RANK_EMBEDDED_CONTENT_RE, ' '),
|
|
192
|
-
));
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function rankingTokens(value) {
|
|
196
|
-
return [...new Set(String(value || '')
|
|
197
|
-
.normalize('NFKC')
|
|
198
|
-
.toLowerCase()
|
|
199
|
-
.match(/[\p{L}\p{N}]{3,}/gu) || [])]
|
|
200
|
-
.filter((token) => !TOOL_RANK_STOP_WORDS.has(token));
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function toolRankingDocument(tool) {
|
|
204
|
-
const name = String(tool?.name || '');
|
|
205
|
-
const leaf = name.split(/__|:/).at(-1) || name;
|
|
206
|
-
const splitToolName = (value) => String(value || '')
|
|
207
|
-
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
208
|
-
.replaceAll('_', ' ');
|
|
209
|
-
const nameTokens = rankingTokens(`${splitToolName(name)} ${splitToolName(leaf)}`);
|
|
210
|
-
const descriptionTokens = rankingTokens(tool?.description);
|
|
211
|
-
const parameterText = [];
|
|
212
|
-
const properties = tool?.parameters?.properties;
|
|
213
|
-
if (properties && typeof properties === 'object') {
|
|
214
|
-
for (const [parameterName, definition] of Object.entries(properties)) {
|
|
215
|
-
parameterText.push(parameterName, definition?.description || '');
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
const exampleText = Array.isArray(tool?.examples)
|
|
219
|
-
? tool.examples.map((example) => example?.prompt || '').join(' ')
|
|
220
|
-
: '';
|
|
221
|
-
return {
|
|
222
|
-
name,
|
|
223
|
-
nameTokens: new Set(nameTokens),
|
|
224
|
-
descriptionTokens: new Set(descriptionTokens),
|
|
225
|
-
detailTokens: new Set(rankingTokens(`${parameterText.join(' ')} ${exampleText}`)),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function tokenMatchScore(document, token) {
|
|
230
|
-
if (document.nameTokens.has(token)) return 10;
|
|
231
|
-
if (document.descriptionTokens.has(token)) return 5;
|
|
232
|
-
if (document.detailTokens.has(token)) return 4;
|
|
233
|
-
const related = relatedSearchTerms(token).filter((term) => term !== token);
|
|
234
|
-
if (related.some((term) => document.nameTokens.has(term))) return 5;
|
|
235
|
-
if (related.some((term) => document.descriptionTokens.has(term))) return 3;
|
|
236
|
-
if (related.some((term) => document.detailTokens.has(term))) return 2;
|
|
237
|
-
return 0;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Select a tiny, high-confidence subset of deferred schemas for the current
|
|
242
|
-
* request. This mirrors AnythingLLM's tool-reranker boundary without adding an
|
|
243
|
-
* embedding runtime: King reuses the descriptions it already owns and keeps
|
|
244
|
-
* ToolSearch available whenever the lexical evidence is weak or ambiguous.
|
|
245
|
-
*/
|
|
246
|
-
function rankedToolNamesForTurnText(tools, value, options = {}) {
|
|
247
|
-
const maxTools = Math.max(0, Math.min(
|
|
248
|
-
MAX_AUTO_RANKED_TOOLS,
|
|
249
|
-
Number.isInteger(options.maxTools) ? options.maxTools : MAX_AUTO_RANKED_TOOLS,
|
|
250
|
-
));
|
|
251
|
-
if (maxTools === 0) return new Set();
|
|
252
|
-
const queryTokens = [...new Set(rankingIntentTexts(value).flatMap(rankingTokens))];
|
|
253
|
-
if (queryTokens.length === 0) return new Set();
|
|
254
|
-
|
|
255
|
-
const ranked = (Array.isArray(tools) ? tools : []).map((tool) => {
|
|
256
|
-
const document = toolRankingDocument(tool);
|
|
257
|
-
if (!document.name) return null;
|
|
258
|
-
let score = 0;
|
|
259
|
-
let matchedTokens = 0;
|
|
260
|
-
let exactNameMatches = 0;
|
|
261
|
-
let relatedNameMatches = 0;
|
|
262
|
-
for (const token of queryTokens) {
|
|
263
|
-
const tokenScore = tokenMatchScore(document, token);
|
|
264
|
-
if (tokenScore === 0) continue;
|
|
265
|
-
score += tokenScore;
|
|
266
|
-
matchedTokens += 1;
|
|
267
|
-
if (document.nameTokens.has(token)) exactNameMatches += 1;
|
|
268
|
-
else if (relatedSearchTerms(token).some((term) => document.nameTokens.has(term))) relatedNameMatches += 1;
|
|
269
|
-
}
|
|
270
|
-
const highConfidence = matchedTokens >= 2
|
|
271
|
-
|| (exactNameMatches >= 1 && score >= 10)
|
|
272
|
-
|| (relatedNameMatches >= 1 && score >= 5);
|
|
273
|
-
return highConfidence ? { name: document.name, score, matchedTokens, exactNameMatches } : null;
|
|
274
|
-
}).filter(Boolean).sort((left, right) => (
|
|
275
|
-
right.matchedTokens - left.matchedTokens
|
|
276
|
-
|| right.score - left.score
|
|
277
|
-
|| right.exactNameMatches - left.exactNameMatches
|
|
278
|
-
|| left.name.localeCompare(right.name)
|
|
279
|
-
));
|
|
280
|
-
|
|
281
|
-
return new Set(ranked.slice(0, maxTools).map((entry) => entry.name));
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function rankedSupportToolNamesForGoal(tools, goal, origin) {
|
|
285
|
-
if (origin?.kind !== 'system_trigger' || origin?.name !== 'goal_continuation') return new Set();
|
|
286
|
-
if (goal?.status !== 'active') return new Set();
|
|
287
|
-
const checkpoint = goal.actionCheckpoint;
|
|
288
|
-
if (checkpoint?.phase === 'wait' || checkpoint?.nextTrigger?.kind !== 'immediate') return new Set();
|
|
289
|
-
const supportChoice = String(checkpoint?.problemFrame?.supportChoice ?? '').trim();
|
|
290
|
-
const explicitSupport = supportChoice.match(/^(?:tool|skill)\s*:\s*(.+)$/iu);
|
|
291
|
-
if (!explicitSupport?.[1]) return new Set();
|
|
292
|
-
return rankedToolNamesForTurnText(tools, supportChoice, { maxTools: 1 });
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
function searchRelatedDeferredTools(tools, query, options = {}) {
|
|
296
|
-
const normalized = normalizeDeferredToolQuery(query).toLowerCase();
|
|
297
|
-
if (!normalized || normalized.startsWith('select:')) return [];
|
|
298
|
-
const tokens = normalized.split(/\s+/).filter(Boolean);
|
|
299
|
-
const requestedNameTokens = tokens
|
|
300
|
-
.filter((token) => token.startsWith('+'))
|
|
301
|
-
.map((token) => token.slice(1))
|
|
302
|
-
.filter(Boolean);
|
|
303
|
-
const relaxRequiredNameTokens = options.relaxRequiredNameTokens === true
|
|
304
|
-
&& requestedNameTokens.length > 0;
|
|
305
|
-
const requiredNameTokens = relaxRequiredNameTokens ? [] : requestedNameTokens;
|
|
306
|
-
const searchTokens = [
|
|
307
|
-
...tokens.filter((token) => !token.startsWith('+')),
|
|
308
|
-
...(relaxRequiredNameTokens ? requestedNameTokens : []),
|
|
309
|
-
]
|
|
310
|
-
.filter((token) => !TOOL_SEARCH_INTENT_WORDS.has(token));
|
|
311
|
-
if (searchTokens.length < 2 && !TOOL_SEARCH_SINGLE_TERM_RELATED_FALLBACKS.has(searchTokens[0])) return [];
|
|
312
|
-
const minimumMatchedTokens = searchTokens.length === 1 ? 1 : Math.max(2, Math.ceil(searchTokens.length * 0.75));
|
|
313
|
-
|
|
314
|
-
const ranked = tools.map((tool) => {
|
|
315
|
-
const name = String(tool?.name || '').toLowerCase();
|
|
316
|
-
const description = String(tool?.description || '').toLowerCase();
|
|
317
|
-
if (!requiredNameTokens.every((token) => name.includes(token))) return null;
|
|
318
|
-
let matchedTokens = 0;
|
|
319
|
-
let score = requiredNameTokens.length * 8;
|
|
320
|
-
for (const token of searchTokens) {
|
|
321
|
-
if (name.includes(token)) {
|
|
322
|
-
matchedTokens += 1;
|
|
323
|
-
score += 8;
|
|
324
|
-
continue;
|
|
325
|
-
}
|
|
326
|
-
if (description.includes(token)) {
|
|
327
|
-
matchedTokens += 1;
|
|
328
|
-
score += 4;
|
|
329
|
-
continue;
|
|
330
|
-
}
|
|
331
|
-
const related = relatedSearchTerms(token).filter((term) => term !== token);
|
|
332
|
-
if (related.some((term) => name.includes(term))) {
|
|
333
|
-
matchedTokens += 1;
|
|
334
|
-
score += 3;
|
|
335
|
-
} else if (related.some((term) => description.includes(term))) {
|
|
336
|
-
matchedTokens += 1;
|
|
337
|
-
score += 2;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
return matchedTokens >= minimumMatchedTokens ? { tool, score, matchedTokens } : null;
|
|
341
|
-
}).filter(Boolean).sort((left, right) => (
|
|
342
|
-
right.matchedTokens - left.matchedTokens
|
|
343
|
-
|| right.score - left.score
|
|
344
|
-
|| String(left.tool.name).localeCompare(String(right.tool.name))
|
|
345
|
-
));
|
|
346
|
-
if (relaxRequiredNameTokens && ranked.length > 0) {
|
|
347
|
-
const best = ranked[0];
|
|
348
|
-
return ranked.filter((entry) => (
|
|
349
|
-
entry.matchedTokens === best.matchedTokens && entry.score === best.score
|
|
350
|
-
)).slice(0, 5).map((entry) => entry.tool);
|
|
351
|
-
}
|
|
352
|
-
return ranked.slice(0, 5).map((entry) => entry.tool);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
function rememberLoadedTool(loadedToolNames, name) {
|
|
356
|
-
loadedToolNames.delete(name);
|
|
357
|
-
loadedToolNames.add(name);
|
|
358
|
-
while (loadedToolNames.size > MAX_PERSISTENT_DEFERRED_TOOLS) {
|
|
359
|
-
loadedToolNames.delete(loadedToolNames.values().next().value);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function rememberDeferredToolAfterNotFound(loadedToolNames, toolName, result) {
|
|
364
|
-
if (!(loadedToolNames instanceof Set) || result?.isError !== true) return false;
|
|
365
|
-
const name = String(toolName || '').trim();
|
|
366
|
-
if (!name || String(result?.output || '').trim() !== `Tool "${name}" not found`) return false;
|
|
367
|
-
rememberLoadedTool(loadedToolNames, name);
|
|
368
|
-
return true;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames = new Set()) {
|
|
372
|
-
if (!Array.isArray(selectedTools)) throw new TypeError('selectedTools must be an array');
|
|
373
|
-
if (!(loadedToolNames instanceof Set)) throw new TypeError('loadedToolNames must be a Set');
|
|
374
|
-
const available = new Map();
|
|
375
|
-
for (const tool of Array.isArray(deferredTools) ? deferredTools : []) {
|
|
376
|
-
const name = String(tool?.name || '').trim();
|
|
377
|
-
if (name && !available.has(name)) available.set(name, tool);
|
|
378
|
-
}
|
|
379
|
-
const deferredCount = available.size;
|
|
380
|
-
const deferredLabel = deferredCount === 1 ? 'tool schema' : 'tool schemas';
|
|
381
|
-
|
|
382
|
-
return {
|
|
383
|
-
name: DEFERRED_TOOL_LOADER_NAME,
|
|
384
|
-
description: [
|
|
385
|
-
`Search ${deferredCount} deferred ${deferredLabel} without loading all definitions.`,
|
|
386
|
-
'Use select:leaf_name for one known tool, plain keywords to search, or +word to require that word in the tool name.',
|
|
387
|
-
`Loaded tools are available in the next step; the ${MAX_PERSISTENT_DEFERRED_TOOLS} most recently selected schemas remain loaded.`,
|
|
388
|
-
].join('\n'),
|
|
389
|
-
parameters: {
|
|
390
|
-
type: 'object',
|
|
391
|
-
properties: {
|
|
392
|
-
query: {
|
|
393
|
-
type: 'string',
|
|
394
|
-
maxLength: MAX_TOOL_SEARCH_QUERY_CHARS,
|
|
395
|
-
description: 'Exact selection or keyword query, for example select:download_attachment or +slack send.',
|
|
396
|
-
},
|
|
397
|
-
},
|
|
398
|
-
required: ['query'],
|
|
399
|
-
additionalProperties: false,
|
|
400
|
-
},
|
|
401
|
-
resolveExecution(args) {
|
|
402
|
-
const query = normalizeDeferredToolQuery(args?.query);
|
|
403
|
-
return {
|
|
404
|
-
description: query ? `Searching tool schemas for ${query}` : 'Searching tool schemas',
|
|
405
|
-
approvalRule: DEFERRED_TOOL_LOADER_NAME,
|
|
406
|
-
execute: async () => {
|
|
407
|
-
let matches = searchDeferredTools([...available.values()], query);
|
|
408
|
-
let relatedFallback = false;
|
|
409
|
-
if (matches.length === 0) {
|
|
410
|
-
matches = searchRelatedDeferredTools([...available.values()], query);
|
|
411
|
-
relatedFallback = matches.length > 0;
|
|
412
|
-
}
|
|
413
|
-
if (matches.length === 0) {
|
|
414
|
-
matches = searchRelatedDeferredTools([...available.values()], query, {
|
|
415
|
-
relaxRequiredNameTokens: true,
|
|
416
|
-
});
|
|
417
|
-
relatedFallback = matches.length > 0;
|
|
418
|
-
}
|
|
419
|
-
if (matches.length === 0) {
|
|
420
|
-
const alreadyLoaded = query.toLowerCase().startsWith('select:')
|
|
421
|
-
? searchDeferredTools(
|
|
422
|
-
selectedTools.filter((tool) => tool?.name !== DEFERRED_TOOL_LOADER_NAME),
|
|
423
|
-
query,
|
|
424
|
-
)
|
|
425
|
-
: [];
|
|
426
|
-
if (alreadyLoaded.length === 1) {
|
|
427
|
-
return {
|
|
428
|
-
isError: false,
|
|
429
|
-
output: `Tool schema already loaded: ${alreadyLoaded[0].name}. Invoke it now.`,
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
const loaderIndex = selectedTools.findIndex(
|
|
433
|
-
(tool) => tool?.name === DEFERRED_TOOL_LOADER_NAME,
|
|
434
|
-
);
|
|
435
|
-
if (loaderIndex >= 0) selectedTools.splice(loaderIndex, 1);
|
|
436
|
-
return {
|
|
437
|
-
isError: false,
|
|
438
|
-
output: [
|
|
439
|
-
`No eligible deferred tool is available for: ${query || '[empty query]'}.`,
|
|
440
|
-
'Do not retry ToolSearch with synonyms; removed for this turn.',
|
|
441
|
-
'use a loaded alternative or report the integration as unavailable.',
|
|
442
|
-
].join(' '),
|
|
443
|
-
};
|
|
444
|
-
}
|
|
445
|
-
if (query.toLowerCase().startsWith('select:') && matches.length !== 1) {
|
|
446
|
-
return {
|
|
447
|
-
isError: true,
|
|
448
|
-
output: `Tool selection is ambiguous: ${matches.map((tool) => tool.name).join(', ')}`,
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
const loaded = [];
|
|
452
|
-
for (const tool of matches) {
|
|
453
|
-
const name = String(tool.name);
|
|
454
|
-
if (!selectedTools.some((candidate) => candidate?.name === name)) selectedTools.push(tool);
|
|
455
|
-
rememberLoadedTool(loadedToolNames, name);
|
|
456
|
-
loaded.push(name);
|
|
457
|
-
}
|
|
458
|
-
return {
|
|
459
|
-
isError: false,
|
|
460
|
-
output: `${relatedFallback ? 'Loaded related tool schemas' : 'Loaded tool schemas'}: ${loaded.join(', ')}. Invoke them in the next step.`,
|
|
461
|
-
};
|
|
462
|
-
},
|
|
463
|
-
};
|
|
464
|
-
},
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
module.exports = {
|
|
469
|
-
CORE_TOOL_NAMES,
|
|
470
|
-
DEFERRED_TOOL_LOADER_NAME,
|
|
471
|
-
MAX_PERSISTENT_DEFERRED_TOOLS,
|
|
472
|
-
MAX_AUTO_RANKED_TOOLS,
|
|
473
|
-
MAX_TOOL_SEARCH_QUERY_CHARS,
|
|
474
|
-
TOOL_SCHEMA_BUDGET_RATIO,
|
|
475
|
-
TOOL_SCHEMA_MAX_TOKENS,
|
|
476
|
-
createDeferredToolLoader,
|
|
477
|
-
deferredToolCatalog,
|
|
478
|
-
deferredToolNames,
|
|
479
|
-
mediaGenerationToolNamesForText,
|
|
480
|
-
mediaToolNamesForTurnText,
|
|
481
|
-
normalizeDeferredToolQuery,
|
|
482
|
-
rankedSupportToolNamesForGoal,
|
|
483
|
-
rankedToolNamesForTurnText,
|
|
484
|
-
rememberDeferredToolAfterNotFound,
|
|
485
|
-
toolSchemaBudgetTokens,
|
|
486
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function wholeNonNegative(value) {
|
|
4
|
-
if (!Number.isFinite(value) || value <= 0) return 0;
|
|
5
|
-
return Math.floor(value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function buildCacheEfficiency(usage = {}) {
|
|
9
|
-
const uncachedTokens = wholeNonNegative(usage.inputOther);
|
|
10
|
-
const readTokens = wholeNonNegative(usage.inputCacheRead);
|
|
11
|
-
const writeTokens = wholeNonNegative(usage.inputCacheCreation);
|
|
12
|
-
const inputTokens = uncachedTokens + readTokens + writeTokens;
|
|
13
|
-
|
|
14
|
-
return {
|
|
15
|
-
hasActivity: readTokens > 0 || writeTokens > 0,
|
|
16
|
-
hitRate: inputTokens > 0 ? Math.min(1, readTokens / inputTokens) : 0,
|
|
17
|
-
inputTokens,
|
|
18
|
-
readTokens,
|
|
19
|
-
writeTokens,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = {
|
|
24
|
-
buildCacheEfficiency,
|
|
25
|
-
wholeNonNegative,
|
|
26
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
function quotedPath(path) {
|
|
4
|
-
return `'${path.replaceAll("\\", "\\\\").replaceAll("'", "\\'")}'`;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
function unsupportedUserHomePathError(path) {
|
|
8
|
-
if (typeof path !== "string" || !path.startsWith("~")) return undefined;
|
|
9
|
-
if (path === "~" || path.startsWith("~/") || path.startsWith("~\\")) return undefined;
|
|
10
|
-
return `Named home-directory paths are not supported: ${quotedPath(path)}. Use '~/' for the current user or './' for a literal path.`;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
module.exports = { unsupportedUserHomePathError };
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const {
|
|
4
|
-
hasHistoricalOffloadPressure,
|
|
5
|
-
historyTextChars,
|
|
6
|
-
} = require('./history-offload-pressure-policy.cjs');
|
|
7
|
-
const { hasContextPressure } = require('./context-pressure-policy.cjs');
|
|
8
|
-
|
|
9
|
-
const USER_MESSAGE_MAX_CHARS = 200_000;
|
|
10
|
-
const HISTORICAL_USER_MESSAGE_MAX_CHARS = 4_000;
|
|
11
|
-
const USER_MESSAGE_KEEP_RECENT_MESSAGES = 20;
|
|
12
|
-
const USER_MESSAGE_PREVIEW_LINES = 5;
|
|
13
|
-
const USER_MESSAGE_PREVIEW_LINE_CHARS = 1_000;
|
|
14
|
-
const USER_MESSAGE_OFFLOAD_MARKER = '[User message offloaded]';
|
|
15
|
-
|
|
16
|
-
function shouldOffloadUserMessage(textChars) {
|
|
17
|
-
return Number.isSafeInteger(textChars) && textChars >= USER_MESSAGE_MAX_CHARS;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function shouldOffloadHistoricalUserMessage(options = {}) {
|
|
21
|
-
const historyIndex = Number(options.historyIndex);
|
|
22
|
-
const historyLength = Number(options.historyLength);
|
|
23
|
-
const historyChars = Number(options.historyChars);
|
|
24
|
-
const textChars = Number(options.textChars);
|
|
25
|
-
if (
|
|
26
|
-
!Number.isSafeInteger(historyIndex)
|
|
27
|
-
|| !Number.isSafeInteger(historyLength)
|
|
28
|
-
|| !Number.isSafeInteger(textChars)
|
|
29
|
-
|| historyIndex < 0
|
|
30
|
-
|| historyLength < 0
|
|
31
|
-
|| historyIndex >= historyLength
|
|
32
|
-
) return false;
|
|
33
|
-
const cutoff = Math.max(0, historyLength - USER_MESSAGE_KEEP_RECENT_MESSAGES);
|
|
34
|
-
return hasContextPressure(options)
|
|
35
|
-
&& hasHistoricalOffloadPressure({ historyLength, historyChars })
|
|
36
|
-
&& historyIndex < cutoff
|
|
37
|
-
&& textChars > HISTORICAL_USER_MESSAGE_MAX_CHARS;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function createUserMessagePreview(text) {
|
|
41
|
-
const lines = String(text).split(/\r?\n/u);
|
|
42
|
-
const render = (line, index) => `${index}: ${line.slice(0, USER_MESSAGE_PREVIEW_LINE_CHARS)}`;
|
|
43
|
-
if (lines.length <= USER_MESSAGE_PREVIEW_LINES * 2) {
|
|
44
|
-
return lines.map((line, index) => render(line, index + 1)).join('\n');
|
|
45
|
-
}
|
|
46
|
-
const head = lines.slice(0, USER_MESSAGE_PREVIEW_LINES)
|
|
47
|
-
.map((line, index) => render(line, index + 1));
|
|
48
|
-
const tailStart = lines.length - USER_MESSAGE_PREVIEW_LINES;
|
|
49
|
-
const tail = lines.slice(tailStart)
|
|
50
|
-
.map((line, index) => render(line, tailStart + index + 1));
|
|
51
|
-
return [
|
|
52
|
-
...head,
|
|
53
|
-
`... [${lines.length - USER_MESSAGE_PREVIEW_LINES * 2} lines omitted] ...`,
|
|
54
|
-
...tail,
|
|
55
|
-
].join('\n');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function compactHistoricalPersistedUserMessageReferences(messages) {
|
|
59
|
-
if (!Array.isArray(messages) || messages.length === 0) return messages;
|
|
60
|
-
|
|
61
|
-
const recentStart = Math.max(0, messages.length - USER_MESSAGE_KEEP_RECENT_MESSAGES);
|
|
62
|
-
return messages.map((message, index) => {
|
|
63
|
-
if (
|
|
64
|
-
index >= recentStart
|
|
65
|
-
|| message?.role !== 'user'
|
|
66
|
-
|| message.origin?.kind !== 'user'
|
|
67
|
-
|| !Array.isArray(message.content)
|
|
68
|
-
) return message;
|
|
69
|
-
|
|
70
|
-
let changed = false;
|
|
71
|
-
const content = message.content.map((part) => {
|
|
72
|
-
if (
|
|
73
|
-
part?.type !== 'text'
|
|
74
|
-
|| typeof part.text !== 'string'
|
|
75
|
-
|| !part.text.startsWith(`${USER_MESSAGE_OFFLOAD_MARKER}\n`)
|
|
76
|
-
|| !part.text.includes('\noutput_path: ')
|
|
77
|
-
) return part;
|
|
78
|
-
const previewIndex = part.text.indexOf('\n[preview: head and tail]\n');
|
|
79
|
-
if (previewIndex < 0) return part;
|
|
80
|
-
changed = true;
|
|
81
|
-
return {
|
|
82
|
-
...part,
|
|
83
|
-
text: part.text.slice(0, previewIndex).trimEnd(),
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return changed ? { ...message, content } : message;
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
module.exports = {
|
|
92
|
-
HISTORICAL_USER_MESSAGE_MAX_CHARS,
|
|
93
|
-
USER_MESSAGE_MAX_CHARS,
|
|
94
|
-
USER_MESSAGE_KEEP_RECENT_MESSAGES,
|
|
95
|
-
USER_MESSAGE_OFFLOAD_MARKER,
|
|
96
|
-
USER_MESSAGE_PREVIEW_LINES,
|
|
97
|
-
USER_MESSAGE_PREVIEW_LINE_CHARS,
|
|
98
|
-
compactHistoricalPersistedUserMessageReferences,
|
|
99
|
-
createUserMessagePreview,
|
|
100
|
-
historyTextChars,
|
|
101
|
-
shouldOffloadHistoricalUserMessage,
|
|
102
|
-
shouldOffloadUserMessage,
|
|
103
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const CHANNEL_TAG = /<channel\b([^>]*)>/iu;
|
|
4
|
-
const SOURCE_ATTRIBUTE = /\bsource=["']([^"']+)["']/iu;
|
|
5
|
-
const CHANNEL_SYSTEM_TRIGGERS = new Set(['channel', 'telegram']);
|
|
6
|
-
|
|
7
|
-
function promptText(input) {
|
|
8
|
-
if (typeof input === 'string') return input;
|
|
9
|
-
if (!Array.isArray(input)) return '';
|
|
10
|
-
return input.map((part) => {
|
|
11
|
-
if (typeof part === 'string') return part;
|
|
12
|
-
return part && typeof part === 'object' && typeof part.text === 'string' ? part.text : '';
|
|
13
|
-
}).join(' ');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function channelSource(input) {
|
|
17
|
-
const tag = promptText(input).match(CHANNEL_TAG)?.[1] || '';
|
|
18
|
-
return tag.match(SOURCE_ATTRIBUTE)?.[1]?.trim().toLowerCase() || '';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function userPromptHookContext(input, origin = {}) {
|
|
22
|
-
const source = channelSource(input);
|
|
23
|
-
if (source) return Object.freeze({ turnSource: 'channel', channel: source, actor: 'channel' });
|
|
24
|
-
if (origin.kind === 'cron_job') {
|
|
25
|
-
return Object.freeze({ turnSource: 'schedule', channel: 'cron', actor: 'scheduler' });
|
|
26
|
-
}
|
|
27
|
-
if (origin.kind === 'system_trigger' && CHANNEL_SYSTEM_TRIGGERS.has(String(origin.name || '').toLowerCase())) {
|
|
28
|
-
return Object.freeze({ turnSource: 'channel', channel: String(origin.name).toLowerCase(), actor: 'channel' });
|
|
29
|
-
}
|
|
30
|
-
if (origin.kind === 'user') return Object.freeze({ turnSource: 'user', channel: 'blun-code', actor: 'user' });
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
module.exports = { channelSource, promptText, userPromptHookContext };
|