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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Offline evidence-shape check, never a semantic approval or release token."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from commercial_localization_profile import CommercialReviewBlocked, review_contract, validate_review
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
PROFILE = "translate-native.commercial.v2"
|
|
15
|
+
MAX_INPUT_BYTES = 2_000_000
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _read(path: str) -> str:
|
|
19
|
+
# Bound each read; decode bytes directly to preserve CRLF and exact spans.
|
|
20
|
+
with Path(path).open("rb") as stream:
|
|
21
|
+
raw = stream.read(MAX_INPUT_BYTES + 1)
|
|
22
|
+
if len(raw) > MAX_INPUT_BYTES:
|
|
23
|
+
raise ValueError("input limit")
|
|
24
|
+
text = raw.decode("utf-8")
|
|
25
|
+
if not text.strip() or text.startswith("\ufeff"):
|
|
26
|
+
raise ValueError("empty input or BOM")
|
|
27
|
+
return text
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _object(pairs):
|
|
31
|
+
result = {}
|
|
32
|
+
for key, value in pairs:
|
|
33
|
+
if key in result:
|
|
34
|
+
raise ValueError("duplicate JSON key")
|
|
35
|
+
result[key] = value
|
|
36
|
+
return result
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _constant(value):
|
|
40
|
+
raise ValueError("nonfinite JSON number")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def main(argv=None) -> int:
|
|
44
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
45
|
+
parser.add_argument("--contract", action="store_true", help="print the review contract; not completed evidence")
|
|
46
|
+
parser.add_argument("--source", help="complete source text, UTF-8 without BOM")
|
|
47
|
+
parser.add_argument("--target", help="complete target text, UTF-8 without BOM")
|
|
48
|
+
parser.add_argument("--review", help="source-aware review JSON, UTF-8 without BOM")
|
|
49
|
+
args = parser.parse_args(argv)
|
|
50
|
+
if args.contract:
|
|
51
|
+
if any((args.source, args.target, args.review)):
|
|
52
|
+
parser.error("--contract cannot be combined with input files")
|
|
53
|
+
print(json.dumps({"status": "CONTRACT", "release_allowed": False,
|
|
54
|
+
"commercial_review": review_contract(PROFILE)}, ensure_ascii=False))
|
|
55
|
+
return 0
|
|
56
|
+
if not all((args.source, args.target, args.review)):
|
|
57
|
+
parser.error("--source, --target and --review are required")
|
|
58
|
+
result = {"schema": "translate-native.commercial-evidence-check.v1",
|
|
59
|
+
"profile": PROFILE, "release_allowed": False}
|
|
60
|
+
try:
|
|
61
|
+
source, target, raw_review = (_read(path) for path in (args.source, args.target, args.review))
|
|
62
|
+
review = json.loads(raw_review, object_pairs_hook=_object, parse_constant=_constant)
|
|
63
|
+
validate_review(review, source, target, PROFILE)
|
|
64
|
+
except CommercialReviewBlocked as error:
|
|
65
|
+
result.update(status="BLOCK", reason=error.code)
|
|
66
|
+
except (OSError, ValueError, RecursionError):
|
|
67
|
+
result.update(status="BLOCK", reason="review.commercial.input_invalid")
|
|
68
|
+
else:
|
|
69
|
+
result.update(
|
|
70
|
+
status="EVIDENCE_VALID", reason="independent_quality_and_signed_release_required",
|
|
71
|
+
source_sha256=hashlib.sha256(source.encode("utf-8")).hexdigest(),
|
|
72
|
+
target_sha256=hashlib.sha256(target.encode("utf-8")).hexdigest(),
|
|
73
|
+
review_sha256=hashlib.sha256(raw_review.encode("utf-8")).hexdigest(),
|
|
74
|
+
)
|
|
75
|
+
print(json.dumps(result, ensure_ascii=False, sort_keys=True))
|
|
76
|
+
return 0 if result["status"] == "EVIDENCE_VALID" else 1
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"""Language-neutral commercial review contract; not a semantic language detector.
|
|
2
|
+
|
|
3
|
+
Models provide semantic evidence. This module validates coverage, exact evidence
|
|
4
|
+
locations and verdict consistency, not the truth of a model's interpretation.
|
|
5
|
+
Only a host-verified quality receipt can authorize subsequent publication.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
PUBLIC_PROFILE_SCHEMA = "translate-native.commercial-capabilities.v2"
|
|
16
|
+
REVIEW_SUMMARY_CAPABILITIES_SCHEMA = (
|
|
17
|
+
"translate-native.commercial-review-summary-capabilities.v1"
|
|
18
|
+
)
|
|
19
|
+
REVIEW_SUMMARY_SCHEMA = "translate-native.commercial-review-summary.v1"
|
|
20
|
+
|
|
21
|
+
DIMENSIONS = {
|
|
22
|
+
"amount_currency": "Amounts, currency identity, units and price-to-product association; no conversion or rounding.",
|
|
23
|
+
"discount_basis": "Discount or saving amount/rate, comparison price, eligibility and reference period.",
|
|
24
|
+
"qualifiers": "From, up to, only, minimum, maximum, approximate and other limits on every claim.",
|
|
25
|
+
"tax_status": "Tax included/excluded, stated rates and scope; do not infer local tax treatment.",
|
|
26
|
+
"billing_interval": "Charge frequency and amount due now, separate from the advertised equivalent monthly price.",
|
|
27
|
+
"commitment": "Contract duration, minimum commitment, trial duration and whether a trial is paid or free.",
|
|
28
|
+
"renewal": "Automatic/manual renewal, renewal price, interval and conditions after introductory offers.",
|
|
29
|
+
"cancellation": "Cancellation deadline, notice period, fees, refund conditions and exceptions.",
|
|
30
|
+
"conditions": "Every remaining eligibility rule, quantity, tier count, limit, deadline and linked footnote.",
|
|
31
|
+
"offer_assignment": "Which offer, tier or product each claim belongs to; never accept swapped prices or conditions.",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _canonical_json(value: Any) -> bytes:
|
|
36
|
+
return json.dumps(
|
|
37
|
+
value, ensure_ascii=False, sort_keys=True, separators=(",", ":"),
|
|
38
|
+
).encode("utf-8")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def public_review_summary_contract(profile: str) -> dict[str, Any]:
|
|
42
|
+
"""Return the exact content-free summary contract external adapters consume."""
|
|
43
|
+
body = {
|
|
44
|
+
"schema": REVIEW_SUMMARY_CAPABILITIES_SCHEMA,
|
|
45
|
+
"result_schema": REVIEW_SUMMARY_SCHEMA,
|
|
46
|
+
"profile": profile,
|
|
47
|
+
"required_fields": [
|
|
48
|
+
"schema", "profile", "status", "review_required_dimensions",
|
|
49
|
+
"evidence_sha256",
|
|
50
|
+
],
|
|
51
|
+
"statuses": {
|
|
52
|
+
"verified": {"review_required_dimensions": "empty"},
|
|
53
|
+
"review_required": {
|
|
54
|
+
"review_required_dimensions": "one-or-more",
|
|
55
|
+
"requires_independent_review": True,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
"review_required_dimensions": {
|
|
59
|
+
"allowed": list(DIMENSIONS),
|
|
60
|
+
"order": list(DIMENSIONS),
|
|
61
|
+
"unique": True,
|
|
62
|
+
},
|
|
63
|
+
"evidence_sha256": {
|
|
64
|
+
"algorithm": "sha-256",
|
|
65
|
+
"canonicalization": "utf-8-json-sort-keys-no-insignificant-whitespace",
|
|
66
|
+
"covers": "complete-commercial-review-evidence",
|
|
67
|
+
},
|
|
68
|
+
"content_policy": {
|
|
69
|
+
"source_text": False,
|
|
70
|
+
"target_text": False,
|
|
71
|
+
"source_spans": False,
|
|
72
|
+
"target_spans": False,
|
|
73
|
+
"reviewer_prose": False,
|
|
74
|
+
"project_prices": False,
|
|
75
|
+
"project_brands": False,
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
**body,
|
|
80
|
+
"sha256": hashlib.sha256(_canonical_json(body)).hexdigest(),
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def public_profile(profile: str) -> dict[str, Any]:
|
|
85
|
+
"""Return the public, brand-neutral contract implemented by this module."""
|
|
86
|
+
body = {
|
|
87
|
+
"schema": PUBLIC_PROFILE_SCHEMA,
|
|
88
|
+
"profile": profile,
|
|
89
|
+
"review_summary_schema": REVIEW_SUMMARY_SCHEMA,
|
|
90
|
+
"review_summary_contract": public_review_summary_contract(profile),
|
|
91
|
+
"applies_to": {
|
|
92
|
+
"content_type": "commercial",
|
|
93
|
+
"locales": "all-supported-target-locales",
|
|
94
|
+
},
|
|
95
|
+
"dimensions": [
|
|
96
|
+
{"name": name, "requirement": requirement}
|
|
97
|
+
for name, requirement in DIMENSIONS.items()
|
|
98
|
+
],
|
|
99
|
+
"preservation": {
|
|
100
|
+
"amounts": "exact-value",
|
|
101
|
+
"currencies": "same-identity-no-conversion",
|
|
102
|
+
"discounts": "rate-amount-reference-basis-period-and-eligibility",
|
|
103
|
+
"qualifiers": "scope-and-limit-per-claim",
|
|
104
|
+
"taxes": "status-rate-and-scope-without-inference",
|
|
105
|
+
"billing": "charge-amount-and-frequency",
|
|
106
|
+
"commitment": "separate-duration-and-minimum-term",
|
|
107
|
+
"renewal": "mode-price-interval-and-conditions",
|
|
108
|
+
"cancellation": "deadline-notice-fees-refunds-and-exceptions",
|
|
109
|
+
"conditions": "eligibility-limits-deadlines-footnotes-and-links",
|
|
110
|
+
"offer_assignment": "every-claim-bound-to-its-own-offer",
|
|
111
|
+
},
|
|
112
|
+
"rendering": {
|
|
113
|
+
"locale_appropriate": True,
|
|
114
|
+
"natural_wording": True,
|
|
115
|
+
"native_digits_allowed": True,
|
|
116
|
+
"number_words_allowed": True,
|
|
117
|
+
"written_percentages_allowed": True,
|
|
118
|
+
"locale_separators_allowed": True,
|
|
119
|
+
"rounding_allowed": False,
|
|
120
|
+
"currency_conversion_allowed": False,
|
|
121
|
+
"exact_characters_only_when_project_configured": True,
|
|
122
|
+
},
|
|
123
|
+
"verification": {
|
|
124
|
+
"method": "semantic-provider-evidence",
|
|
125
|
+
"deterministic_numeric_regex_is_sufficient": False,
|
|
126
|
+
"evidence_granularity": "every-proposition-per-offer",
|
|
127
|
+
"directions": ["matched", "source_only", "target_only"],
|
|
128
|
+
"ambiguous_values": "unresolved",
|
|
129
|
+
"unresolved_route": "independent-model-or-qualified-native-domain-review",
|
|
130
|
+
"automatic_publication_when_unresolved": False,
|
|
131
|
+
},
|
|
132
|
+
"protected_terms": "project-configuration-only",
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
**body,
|
|
136
|
+
"sha256": hashlib.sha256(_canonical_json(body)).hexdigest(),
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
CREATION_GUIDANCE = """Localize prices, offers and subscriptions as natural native commercial copy.
|
|
140
|
+
Preserve every commercial proposition and its association with the correct offer, not merely a bag of numbers.
|
|
141
|
+
Keep brands, product names and protected slogans exactly as configured for this project; invent no universal list.
|
|
142
|
+
Locale formatting, native digits, number words and written percentages are allowed when semantically equivalent.
|
|
143
|
+
Do not convert currency, change a tax claim, round a price, strengthen a saving or conceal a condition.
|
|
144
|
+
Keep billing frequency distinct from contract length. Preserve footnote and link associations.
|
|
145
|
+
An explicit instruction to preserve exact characters (for example a currency symbol) overrides format adaptation."""
|
|
146
|
+
|
|
147
|
+
NATIVE_GUIDANCE = """Judge commercial copy as native writing: idiomatic pricing labels, CTAs, natural number,
|
|
148
|
+
currency and interval expressions, unambiguous offer layout and readable conditions. Do not require digits instead
|
|
149
|
+
of number words, ASCII instead of native digits, or source-locale punctuation. Do not infer missing commercial facts."""
|
|
150
|
+
|
|
151
|
+
FIDELITY_GUIDANCE = """For each commercial dimension inspect the COMPLETE source and candidate, including
|
|
152
|
+
all offers, headings, footnotes, links and conditions. Record every applicable proposition as an item with a stable
|
|
153
|
+
offer label, semantic explanation and relation: 'matched', 'source_only' for an omission, or 'target_only' for an
|
|
154
|
+
addition. Give exact zero-based Python Unicode code-point spans with an exclusive end; the absent side of a one-sided
|
|
155
|
+
item MUST be null. Repeated amounts must stay attached to their own offer; number multisets do not prove fidelity.
|
|
156
|
+
'not_present' is valid only if a dimension is absent from BOTH texts. 'equivalent' requires nonempty matched items
|
|
157
|
+
covering every applicable proposition. A dimension-level 'changed' or 'uncertain' verdict requires at least one
|
|
158
|
+
specific item; use coverage='uncertain' for unresolved overall completeness without inventing a span.
|
|
159
|
+
Use 'changed' for a known defect and 'uncertain' for unresolved interpretation, coverage or insufficient language/domain
|
|
160
|
+
evidence. Use coverage='uncertain' unless every proposition and offer association was checked. Never resolve numeric
|
|
161
|
+
ambiguity by guessing. Number words, written percentages, native digits and locale separators may be equivalent;
|
|
162
|
+
12 months and one year may be equivalent only when the actual commercial terms agree. State the interpretation in
|
|
163
|
+
the explanation. No average score can override a defect. Return commercial_review in addition to the normal review."""
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class CommercialReviewBlocked(ValueError):
|
|
167
|
+
def __init__(self, code: str):
|
|
168
|
+
super().__init__(code)
|
|
169
|
+
self.code = code
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def review_contract(schema: str) -> dict[str, Any]:
|
|
173
|
+
return {
|
|
174
|
+
"schema": schema,
|
|
175
|
+
"coverage": "complete or uncertain",
|
|
176
|
+
"checks": {
|
|
177
|
+
name: {
|
|
178
|
+
"status": "equivalent, not_present, changed or uncertain",
|
|
179
|
+
"items": [{
|
|
180
|
+
"offer": "stable offer label",
|
|
181
|
+
"relation": "matched, source_only, or target_only",
|
|
182
|
+
"source_span": [0, 1],
|
|
183
|
+
"target_span": [0, 1],
|
|
184
|
+
"explanation": description,
|
|
185
|
+
}],
|
|
186
|
+
}
|
|
187
|
+
for name, description in DIMENSIONS.items()
|
|
188
|
+
},
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def validate_review(
|
|
193
|
+
value: Any,
|
|
194
|
+
source: str,
|
|
195
|
+
target: str,
|
|
196
|
+
schema: str,
|
|
197
|
+
*,
|
|
198
|
+
allow_uncertain: bool = False,
|
|
199
|
+
) -> dict[str, Any]:
|
|
200
|
+
"""Validate evidence and return a content-free, hash-bound routing summary."""
|
|
201
|
+
def invalid() -> None:
|
|
202
|
+
raise CommercialReviewBlocked("review.commercial.invalid")
|
|
203
|
+
|
|
204
|
+
def span(value: Any, text: str) -> None:
|
|
205
|
+
if (
|
|
206
|
+
not isinstance(value, list) or len(value) != 2
|
|
207
|
+
or any(type(offset) is not int for offset in value)
|
|
208
|
+
or not 0 <= value[0] < value[1] <= len(text)
|
|
209
|
+
or not text[value[0]:value[1]].strip()
|
|
210
|
+
):
|
|
211
|
+
invalid()
|
|
212
|
+
|
|
213
|
+
if not isinstance(value, dict) or set(value) != {"schema", "coverage", "checks"}:
|
|
214
|
+
invalid()
|
|
215
|
+
if value["schema"] != schema or value["coverage"] not in ("complete", "uncertain"):
|
|
216
|
+
invalid()
|
|
217
|
+
checks = value["checks"]
|
|
218
|
+
if not isinstance(checks, dict) or set(checks) != set(DIMENSIONS):
|
|
219
|
+
invalid()
|
|
220
|
+
uncertain_dimensions: set[str] = set()
|
|
221
|
+
coverage_uncertain = value["coverage"] == "uncertain"
|
|
222
|
+
changed = False
|
|
223
|
+
evidenced = False
|
|
224
|
+
for name, check in checks.items():
|
|
225
|
+
if not isinstance(check, dict) or set(check) != {"status", "items"}:
|
|
226
|
+
invalid()
|
|
227
|
+
status, items = check["status"], check["items"]
|
|
228
|
+
if status not in ("equivalent", "not_present", "changed", "uncertain"):
|
|
229
|
+
invalid()
|
|
230
|
+
if not isinstance(items, list) or len(items) > 1000:
|
|
231
|
+
invalid()
|
|
232
|
+
if (
|
|
233
|
+
(status == "not_present" and items)
|
|
234
|
+
or (status in ("equivalent", "changed", "uncertain") and not items)
|
|
235
|
+
):
|
|
236
|
+
invalid()
|
|
237
|
+
seen = set()
|
|
238
|
+
for item in items:
|
|
239
|
+
if not isinstance(item, dict) or set(item) != {
|
|
240
|
+
"offer", "relation", "source_span", "target_span", "explanation",
|
|
241
|
+
}:
|
|
242
|
+
invalid()
|
|
243
|
+
for field in ("offer", "explanation"):
|
|
244
|
+
if not isinstance(item[field], str) or not item[field].strip() or len(item[field]) > 2000:
|
|
245
|
+
invalid()
|
|
246
|
+
relation = item["relation"]
|
|
247
|
+
if relation == "matched":
|
|
248
|
+
span(item["source_span"], source)
|
|
249
|
+
span(item["target_span"], target)
|
|
250
|
+
elif relation == "source_only":
|
|
251
|
+
span(item["source_span"], source)
|
|
252
|
+
if item["target_span"] is not None:
|
|
253
|
+
invalid()
|
|
254
|
+
elif relation == "target_only":
|
|
255
|
+
if item["source_span"] is not None:
|
|
256
|
+
invalid()
|
|
257
|
+
span(item["target_span"], target)
|
|
258
|
+
else:
|
|
259
|
+
invalid()
|
|
260
|
+
if status == "equivalent" and relation != "matched":
|
|
261
|
+
invalid()
|
|
262
|
+
identity = (
|
|
263
|
+
item["offer"], relation,
|
|
264
|
+
tuple(item["source_span"]) if item["source_span"] is not None else None,
|
|
265
|
+
tuple(item["target_span"]) if item["target_span"] is not None else None,
|
|
266
|
+
)
|
|
267
|
+
if identity in seen:
|
|
268
|
+
invalid()
|
|
269
|
+
seen.add(identity)
|
|
270
|
+
if status == "uncertain":
|
|
271
|
+
uncertain_dimensions.add(name)
|
|
272
|
+
changed |= status == "changed"
|
|
273
|
+
evidenced |= status == "equivalent"
|
|
274
|
+
if changed:
|
|
275
|
+
raise CommercialReviewBlocked("review.commercial.changed")
|
|
276
|
+
# Every evidenced condition must resolve to an explicitly reviewed offer.
|
|
277
|
+
assignment = checks["offer_assignment"]
|
|
278
|
+
if assignment["status"] != "equivalent" or not any(
|
|
279
|
+
check["status"] == "equivalent" for name, check in checks.items() if name != "offer_assignment"
|
|
280
|
+
):
|
|
281
|
+
uncertain_dimensions.add("offer_assignment")
|
|
282
|
+
else:
|
|
283
|
+
offers = {item["offer"] for item in assignment["items"]}
|
|
284
|
+
if any(item["offer"] not in offers for check in checks.values() for item in check["items"]):
|
|
285
|
+
invalid()
|
|
286
|
+
if coverage_uncertain or not evidenced:
|
|
287
|
+
uncertain_dimensions.update(DIMENSIONS)
|
|
288
|
+
summary = {
|
|
289
|
+
"schema": REVIEW_SUMMARY_SCHEMA,
|
|
290
|
+
"profile": schema,
|
|
291
|
+
"status": "review_required" if uncertain_dimensions else "verified",
|
|
292
|
+
"review_required_dimensions": [
|
|
293
|
+
name for name in DIMENSIONS if name in uncertain_dimensions
|
|
294
|
+
],
|
|
295
|
+
"evidence_sha256": hashlib.sha256(_canonical_json(value)).hexdigest(),
|
|
296
|
+
}
|
|
297
|
+
if uncertain_dimensions and not allow_uncertain:
|
|
298
|
+
raise CommercialReviewBlocked("review.commercial.independent_review_required")
|
|
299
|
+
return summary
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def validate_summary(
|
|
303
|
+
value: Any,
|
|
304
|
+
profile: str,
|
|
305
|
+
*,
|
|
306
|
+
review_required: bool,
|
|
307
|
+
) -> dict[str, Any]:
|
|
308
|
+
"""Validate a persisted summary without retaining customer or reviewer text."""
|
|
309
|
+
if (
|
|
310
|
+
not isinstance(value, dict)
|
|
311
|
+
or set(value) != {
|
|
312
|
+
"schema", "profile", "status", "review_required_dimensions",
|
|
313
|
+
"evidence_sha256",
|
|
314
|
+
}
|
|
315
|
+
or value["schema"] != REVIEW_SUMMARY_SCHEMA
|
|
316
|
+
or value["profile"] != profile
|
|
317
|
+
or value["status"] not in {"verified", "review_required"}
|
|
318
|
+
or not isinstance(value["evidence_sha256"], str)
|
|
319
|
+
or len(value["evidence_sha256"]) != 64
|
|
320
|
+
or any(character not in "0123456789abcdef" for character in value["evidence_sha256"])
|
|
321
|
+
or not isinstance(value["review_required_dimensions"], list)
|
|
322
|
+
):
|
|
323
|
+
raise CommercialReviewBlocked("review.commercial.summary_invalid")
|
|
324
|
+
dimensions = value["review_required_dimensions"]
|
|
325
|
+
if (
|
|
326
|
+
len(dimensions) != len(set(dimensions))
|
|
327
|
+
or any(name not in DIMENSIONS for name in dimensions)
|
|
328
|
+
or dimensions != [name for name in DIMENSIONS if name in dimensions]
|
|
329
|
+
or (value["status"] == "verified") != (not dimensions)
|
|
330
|
+
or (value["status"] == "review_required" and not review_required)
|
|
331
|
+
):
|
|
332
|
+
raise CommercialReviewBlocked("review.commercial.summary_invalid")
|
|
333
|
+
return json.loads(_canonical_json(value))
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Installed-skill entry point for the fail-closed BLUN Language Gateway."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import importlib.util
|
|
8
|
+
import json
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
GUARD_PATH = Path(__file__).with_name("blun_language_guard.py")
|
|
14
|
+
SPEC = importlib.util.spec_from_file_location("blun_installed_gateway_guard", GUARD_PATH)
|
|
15
|
+
assert SPEC and SPEC.loader
|
|
16
|
+
GUARD = importlib.util.module_from_spec(SPEC)
|
|
17
|
+
sys.modules[SPEC.name] = GUARD
|
|
18
|
+
SPEC.loader.exec_module(GUARD)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def gate(request: dict) -> dict:
|
|
22
|
+
required = ("task_kind", "target_text", "language")
|
|
23
|
+
missing = [
|
|
24
|
+
key for key in required
|
|
25
|
+
if not isinstance(request.get(key), str) or not request[key].strip()
|
|
26
|
+
]
|
|
27
|
+
if missing:
|
|
28
|
+
return {"status": "BLOCK", "release_allowed": False, "reason": "missing-fields", "fields": missing}
|
|
29
|
+
task_kind = request["task_kind"]
|
|
30
|
+
source = request.get("source_text", "")
|
|
31
|
+
if not isinstance(source, str):
|
|
32
|
+
return {"status": "BLOCK", "release_allowed": False, "reason": "invalid-source-type"}
|
|
33
|
+
if task_kind == "translation":
|
|
34
|
+
if not source.strip():
|
|
35
|
+
return {"status": "BLOCK", "release_allowed": False, "reason": "translation-source-required"}
|
|
36
|
+
result = GUARD.release_translation(request)
|
|
37
|
+
elif task_kind == "response":
|
|
38
|
+
if source.strip():
|
|
39
|
+
return {"status": "BLOCK", "release_allowed": False, "reason": "response-cannot-carry-source"}
|
|
40
|
+
result = GUARD.release_response(request)
|
|
41
|
+
else:
|
|
42
|
+
return {"status": "BLOCK", "release_allowed": False, "reason": "invalid-task-kind"}
|
|
43
|
+
result["gateway"] = f"blun-language-gateway/{GUARD.VERSION}"
|
|
44
|
+
result["task_kind"] = task_kind
|
|
45
|
+
return result
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def main() -> int:
|
|
49
|
+
parser = argparse.ArgumentParser(description="BLUN fail-closed language output gateway")
|
|
50
|
+
parser.add_argument("--input", type=Path)
|
|
51
|
+
args = parser.parse_args()
|
|
52
|
+
try:
|
|
53
|
+
request = json.loads(args.input.read_text(encoding="utf-8-sig") if args.input else sys.stdin.read().lstrip("\ufeff"))
|
|
54
|
+
result = gate(request)
|
|
55
|
+
except (OSError, json.JSONDecodeError) as error:
|
|
56
|
+
result = {"status": "BLOCK", "release_allowed": False, "reason": "invalid-input", "error": str(error)}
|
|
57
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
58
|
+
return 0 if result.get("release_allowed") else 1
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if __name__ == "__main__":
|
|
62
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Installed-skill hook that verifies an exact current V6 release receipt."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import hashlib
|
|
7
|
+
import importlib.util
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
QUALITY_PATH = Path(__file__).with_name("language_quality.py")
|
|
15
|
+
SPEC = importlib.util.spec_from_file_location("blun_installed_hook_quality", QUALITY_PATH)
|
|
16
|
+
assert SPEC and SPEC.loader
|
|
17
|
+
QUALITY = importlib.util.module_from_spec(SPEC)
|
|
18
|
+
SPEC.loader.exec_module(QUALITY)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def load_verification_key(path: Path) -> bytes:
|
|
22
|
+
"""Load an existing verifier key without creating or replacing trust state."""
|
|
23
|
+
environment_key = os.environ.get("BLUN_LANGUAGE_GUARD_KEY")
|
|
24
|
+
if environment_key:
|
|
25
|
+
return hashlib.sha256(environment_key.encode("utf-8")).digest()
|
|
26
|
+
try:
|
|
27
|
+
return QUALITY.load_existing_key(path)
|
|
28
|
+
except FileNotFoundError as error:
|
|
29
|
+
raise ValueError("signing key is missing; verification fails closed") from error
|
|
30
|
+
except OSError as error:
|
|
31
|
+
raise ValueError("signing key cannot be read") from error
|
|
32
|
+
except ValueError as error:
|
|
33
|
+
if "permissions" in str(error):
|
|
34
|
+
raise ValueError("signing key permissions are broader than owner-only") from error
|
|
35
|
+
raise ValueError("signing key is invalid") from error
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def main() -> int:
|
|
39
|
+
try:
|
|
40
|
+
request = json.loads(sys.stdin.read().lstrip("\ufeff"))
|
|
41
|
+
task_kind = request["task_kind"]
|
|
42
|
+
source = request.get("source_text", "")
|
|
43
|
+
if task_kind not in {"translation", "response"}:
|
|
44
|
+
raise ValueError("task_kind must be translation or response")
|
|
45
|
+
if task_kind == "translation" and not source.strip():
|
|
46
|
+
raise ValueError("translation receipts require source_text")
|
|
47
|
+
if task_kind == "response" and source.strip():
|
|
48
|
+
raise ValueError("response receipts cannot carry source_text")
|
|
49
|
+
key_path = Path(os.environ.get("BLUN_LANGUAGE_GUARD_KEY_FILE", Path.home() / ".config" / "blun-language-guard" / "signing.key"))
|
|
50
|
+
result = QUALITY.verify_receipt(
|
|
51
|
+
request["release_token"], source, request["target_text"],
|
|
52
|
+
request["language"], load_verification_key(key_path),
|
|
53
|
+
request.get("content_type", "prose"), request.get("short_text_reviewed") is True,
|
|
54
|
+
purpose=task_kind,
|
|
55
|
+
)
|
|
56
|
+
except (KeyError, ValueError, json.JSONDecodeError, OSError) as error:
|
|
57
|
+
print(json.dumps({"allow": False, "error": str(error)}))
|
|
58
|
+
return 1
|
|
59
|
+
print(json.dumps({"allow": result["valid"], "verification": result}))
|
|
60
|
+
return 0 if result["valid"] else 1
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
if __name__ == "__main__":
|
|
64
|
+
raise SystemExit(main())
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
3
|
-
"version": "6.
|
|
4
|
-
"sourceCommit": "
|
|
5
|
-
"sourceRepository": "https://github.com/Maykbiletti/translate-native"
|
|
6
|
-
"files": {
|
|
7
|
-
"blun_language_guard.py": "37ec76a20ac0656397e7923cd5b40800054cc95119de73e2fe6f437d760dda01",
|
|
8
|
-
"check_diacritics.py": "96d7a0faa4f6a8c827bcf6fe065975fc803389fa4a5363108383da4b9bbc995b",
|
|
9
|
-
"guard_service_client.py": "e3c000f2e5994738cb219cc82d14466d558206e7c7dd6a0e7d184071d8791f48",
|
|
10
|
-
"language_quality.py": "46fe4f2b22205d6d5514bc1d0d7354ae862395f53134c7d82d892440b98e8529",
|
|
11
|
-
"translation_guard.py": "56e74c2432aeeaecabfd58ba30ec507aab1d42c3e32fa1b39307c1043c8c7ac2"
|
|
12
|
-
}
|
|
2
|
+
"name": "translate-native",
|
|
3
|
+
"version": "6.64.0",
|
|
4
|
+
"sourceCommit": "d5d350ba61a5ea7fa4efb2244abcfc191452a33f",
|
|
5
|
+
"sourceRepository": "https://github.com/Maykbiletti/translate-native"
|
|
13
6
|
}
|
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
"agent-browser": {
|
|
6
6
|
"owner": "user-mcp",
|
|
7
7
|
"version": "0.31.2",
|
|
8
|
-
"detectTokens": [
|
|
8
|
+
"detectTokens": [
|
|
9
|
+
"agent-browser"
|
|
10
|
+
],
|
|
9
11
|
"config": {
|
|
10
12
|
"transport": "stdio",
|
|
11
13
|
"command": "npx",
|
|
12
|
-
"args": [
|
|
14
|
+
"args": [
|
|
15
|
+
"-y",
|
|
16
|
+
"agent-browser@0.31.2",
|
|
17
|
+
"mcp"
|
|
18
|
+
],
|
|
13
19
|
"enabled": false,
|
|
14
20
|
"startupTimeoutMs": 120000,
|
|
15
21
|
"toolTimeoutMs": 120000
|
|
@@ -18,13 +24,19 @@
|
|
|
18
24
|
"blun-language-guard": {
|
|
19
25
|
"owner": "user-mcp",
|
|
20
26
|
"version": "host-provisioned",
|
|
21
|
-
"skillVersion": "6.
|
|
22
|
-
"detectTokens": [
|
|
27
|
+
"skillVersion": "6.64.0",
|
|
28
|
+
"detectTokens": [
|
|
29
|
+
"blun-language-guard",
|
|
30
|
+
"blun_language_guard.py"
|
|
31
|
+
],
|
|
23
32
|
"provisioning": "The npm package provides the zero-dependency Python runtime files.",
|
|
24
33
|
"config": {
|
|
25
34
|
"transport": "stdio",
|
|
26
35
|
"command": "$BLUN_BUNDLED_PYTHON",
|
|
27
|
-
"args": [
|
|
36
|
+
"args": [
|
|
37
|
+
"$BLUN_BUNDLED_LANGUAGE_GUARD",
|
|
38
|
+
"serve"
|
|
39
|
+
],
|
|
28
40
|
"inheritEnv": false,
|
|
29
41
|
"enabled": false,
|
|
30
42
|
"startupTimeoutMs": 20000,
|
|
@@ -34,12 +46,17 @@
|
|
|
34
46
|
"context7": {
|
|
35
47
|
"owner": "user-mcp",
|
|
36
48
|
"version": "latest",
|
|
37
|
-
"
|
|
38
|
-
|
|
49
|
+
"detectTokens": [
|
|
50
|
+
"context7",
|
|
51
|
+
"@upstash/context7-mcp"
|
|
52
|
+
],
|
|
39
53
|
"config": {
|
|
40
54
|
"transport": "stdio",
|
|
41
55
|
"command": "npx",
|
|
42
|
-
"args": [
|
|
56
|
+
"args": [
|
|
57
|
+
"-y",
|
|
58
|
+
"@upstash/context7-mcp@latest"
|
|
59
|
+
],
|
|
43
60
|
"enabled": false,
|
|
44
61
|
"startupTimeoutMs": 40000,
|
|
45
62
|
"toolTimeoutMs": 120000
|
|
@@ -48,13 +65,19 @@
|
|
|
48
65
|
"telegram": {
|
|
49
66
|
"owner": "managed-plugin",
|
|
50
67
|
"version": "bundled",
|
|
51
|
-
"detectTokens": [
|
|
68
|
+
"detectTokens": [
|
|
69
|
+
"telegram"
|
|
70
|
+
]
|
|
52
71
|
},
|
|
53
72
|
"windows-mcp": {
|
|
54
73
|
"owner": "user-mcp",
|
|
55
74
|
"version": "0.8.5",
|
|
56
|
-
"platforms": [
|
|
57
|
-
|
|
75
|
+
"platforms": [
|
|
76
|
+
"win32"
|
|
77
|
+
],
|
|
78
|
+
"detectTokens": [
|
|
79
|
+
"windows-mcp"
|
|
80
|
+
],
|
|
58
81
|
"config": {
|
|
59
82
|
"transport": "stdio",
|
|
60
83
|
"command": "$BLUN_UVX",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: access
|
|
3
|
-
description: Manage Telegram channel access —
|
|
3
|
+
description: Manage Telegram channel access — approve pairings, edit allowlists, set DM/group policy.
|
|
4
4
|
---
|
|
5
5
|
Manage access control for the BLUN Telegram channel. The state file is
|
|
6
6
|
`~/.blun/channels/telegram/access.json` (create the directory and a default
|
|
7
|
-
`{"dmPolicy":"pairing","allowFrom":[],"groups":{},"pending":{}
|
|
7
|
+
`{"dmPolicy":"pairing","allowFrom":[],"groups":{},"pending":{}}` if missing).
|
|
8
8
|
Honor `BLUN_TELEGRAM_STATE_DIR` if that environment variable is set.
|
|
9
9
|
|
|
10
10
|
ARGUMENTS: $ARGUMENTS
|
|
@@ -13,14 +13,6 @@ Supported operations (parse from the arguments above; if empty, show current
|
|
|
13
13
|
state as a short summary — dmPolicy, allowFrom entries, groups, pending codes
|
|
14
14
|
with expiry):
|
|
15
15
|
|
|
16
|
-
- `connect` — generate a cryptographically random 6-character lowercase hex
|
|
17
|
-
code in this console. Store it as `connect[code]` with `createdAt` now and
|
|
18
|
-
`expiresAt` ten minutes from now, save atomically, then print exactly these
|
|
19
|
-
two useful lines (never ask for or print a Telegram chat id):
|
|
20
|
-
`Telegram-Code: <code>`
|
|
21
|
-
`Jetzt im gewuenschten privaten Chat oder in der Gruppe senden: /connect <code>`
|
|
22
|
-
The bridge consumes the code once and records the Telegram ids internally.
|
|
23
|
-
|
|
24
16
|
- `pair <code>` — look up `pending[<code>]`. If present and not expired
|
|
25
17
|
(`expiresAt` in ms since epoch): move its `senderId` into `allowFrom`
|
|
26
18
|
(deduplicated), delete the pending entry, save the file, then write an empty
|