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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const fs = require('node:fs');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const os = require('node:os');
|
|
5
|
+
const vm = require('node:vm');
|
|
6
|
+
const assert = require('node:assert/strict');
|
|
7
|
+
|
|
8
|
+
function functionSource(source, name) {
|
|
9
|
+
const found = source.match(new RegExp('^function ' + name + '\\([\\s\\S]*?^\\}', 'm'))?.[0];
|
|
10
|
+
if (!found) throw new Error('Missing executable contract: ' + name);
|
|
11
|
+
return found;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function verifyAgentBehavior(packageRoot, reportParent) {
|
|
15
|
+
const parent = reportParent || path.join(os.homedir(), '.blun', 'diagnostics', 'package-contracts');
|
|
16
|
+
fs.mkdirSync(parent, { recursive: true });
|
|
17
|
+
const work = fs.mkdtempSync(path.join(parent, 'check-'));
|
|
18
|
+
const passed = [];
|
|
19
|
+
const notApplicable = [];
|
|
20
|
+
const write = (file, data) => {
|
|
21
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
22
|
+
fs.writeFileSync(file, typeof data === 'string' ? data : JSON.stringify(data));
|
|
23
|
+
};
|
|
24
|
+
const read = file => JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
25
|
+
const core = fs.readFileSync(path.join(packageRoot, 'blun.mjs'), 'utf8');
|
|
26
|
+
const plugin = require(path.join(packageRoot, 'bin/plugin-bootstrap.js'));
|
|
27
|
+
const selected = require(path.join(packageRoot, 'bin/managed-plugin-selection.cjs'));
|
|
28
|
+
const tools = require(path.join(packageRoot, 'bin/standard-tools-bootstrap.js'));
|
|
29
|
+
const profile = path.join(work, 'profile');
|
|
30
|
+
plugin.installManagedAgentSpinePlugin({ packageRoot, blunDir: profile });
|
|
31
|
+
plugin.installManagedTelegramPlugin({ packageRoot, blunDir: profile });
|
|
32
|
+
tools.seedStandardTools({ packageRoot, blunDir: profile, names: ['blun-language-guard'], env: {} });
|
|
33
|
+
const registryFile = path.join(profile, 'plugins/installed.json');
|
|
34
|
+
const registry = read(registryFile);
|
|
35
|
+
const spine = registry.plugins.find(item => item.id === 'agent-spine');
|
|
36
|
+
const telegram = registry.plugins.find(item => item.id === 'telegram');
|
|
37
|
+
assert(spine?.enabled && telegram?.enabled, 'native startup omitted a bundled plugin');
|
|
38
|
+
assert(fs.existsSync(path.join(spine.root, 'src/hook.js')));
|
|
39
|
+
const mcpFile = path.join(profile, 'mcp.json');
|
|
40
|
+
const mcp = read(mcpFile);
|
|
41
|
+
const guard = mcp.mcpServers['blun-language-guard'];
|
|
42
|
+
assert.equal(guard.enabled, true);
|
|
43
|
+
assert.equal(guard.args[0], path.join(packageRoot, 'standard-tools/language-guard/blun_language_guard.py'));
|
|
44
|
+
passed.push('bootstrap-components-register-spine-telegram-guard');
|
|
45
|
+
|
|
46
|
+
spine.managedSelection = selected.describeAgentSpineSelection({ blunDir: profile, pluginRoot: spine.root });
|
|
47
|
+
write(registryFile, registry);
|
|
48
|
+
const before = fs.readFileSync(registryFile);
|
|
49
|
+
plugin.installManagedAgentSpinePlugin({ packageRoot, blunDir: profile });
|
|
50
|
+
assert.deepEqual(fs.readFileSync(registryFile), before);
|
|
51
|
+
guard.enabled = false; write(mcpFile, mcp);
|
|
52
|
+
tools.seedStandardTools({ packageRoot, blunDir: profile, names: ['blun-language-guard'], env: {} });
|
|
53
|
+
assert.equal(read(mcpFile).mcpServers['blun-language-guard'].enabled, false);
|
|
54
|
+
guard.args = [path.join(work, 'custom/blun_language_guard.py'), 'serve'];
|
|
55
|
+
guard.env = { SYNTHETIC_CUSTOM_SETTING: 'retained' }; write(mcpFile, mcp);
|
|
56
|
+
const custom = fs.readFileSync(mcpFile);
|
|
57
|
+
tools.seedStandardTools({ packageRoot, blunDir: profile, names: ['blun-language-guard'], env: {} });
|
|
58
|
+
assert.deepEqual(fs.readFileSync(mcpFile), custom);
|
|
59
|
+
passed.push('repeat-start-preserves-selected-plugin-disabled-and-custom-guard');
|
|
60
|
+
|
|
61
|
+
const sharedHome = path.join(work, 'old-user-home');
|
|
62
|
+
const staleRoot = path.join(sharedHome, '.blun/plugins/managed/old-telegram');
|
|
63
|
+
write(path.join(staleRoot, '.mcp.json'), { mcpServers: {} });
|
|
64
|
+
write(path.join(staleRoot, 'dist/mcp-server.mjs'), '// Synthetic old installed entrypoint.\n');
|
|
65
|
+
write(path.join(sharedHome, '.blun/plugins/installed.json'), { plugins: [{ id: 'telegram', enabled: true, root: staleRoot }] });
|
|
66
|
+
const env = { BLUN_HOME: profile };
|
|
67
|
+
const resolveRoot = vm.runInNewContext(functionSource(core, 'managedTelegramPluginRoot') + '\nmanagedTelegramPluginRoot;', {
|
|
68
|
+
process: { env }, join: path.join, homedir: () => sharedHome,
|
|
69
|
+
existsSync: fs.existsSync, readFileSync: fs.readFileSync,
|
|
70
|
+
});
|
|
71
|
+
assert.equal(resolveRoot(), telegram.root, 'bridge selected the old shared registration');
|
|
72
|
+
telegram.enabled = false; write(registryFile, registry);
|
|
73
|
+
assert.equal(resolveRoot(), undefined, 'disabled plugin was selected');
|
|
74
|
+
telegram.enabled = true; write(registryFile, registry);
|
|
75
|
+
passed.push('packed-host-selects-active-profile-not-stale-shared-copy');
|
|
76
|
+
|
|
77
|
+
const bridge = fs.readFileSync(path.join(telegram.root, 'dist/bridge.mjs'), 'utf8');
|
|
78
|
+
const access = { dmPolicy: 'allowlist', allowFrom: ['operator'], pending: {},
|
|
79
|
+
groups: { '-1001': { requireMention: true, alwaysAllowFrom: ['operator'], allowFrom: [] } } };
|
|
80
|
+
const gateHelpers = ['matchesAny', 'isMentioned', 'gate',
|
|
81
|
+
...(/^function connectionCode\(/m.test(bridge) ? ['connectionCode']
|
|
82
|
+
: ['isGermanGroupBroadcast', 'botLoopGuardAllows'])];
|
|
83
|
+
const gate = vm.runInNewContext(gateHelpers
|
|
84
|
+
.map(name => functionSource(bridge, name)).join('\n') + '\ngate;', {
|
|
85
|
+
readAccess: () => access, pruneExpired: () => false,
|
|
86
|
+
saveAccess: () => { throw new Error('unexpected access change'); },
|
|
87
|
+
BOT_COOLDOWN_MS: 15000, lastBotDelivery: new Map(),
|
|
88
|
+
});
|
|
89
|
+
const message = { chatId: '-1001', chatType: 'supergroup', text: 'Status for another participant', from: { id: 'operator' } };
|
|
90
|
+
assert.equal(gate(message, 'ExampleBot').action, 'drop');
|
|
91
|
+
assert.equal(gate({ ...message, from: { id: 'another-bot', isBot: true } }, 'ExampleBot').action, 'drop');
|
|
92
|
+
assert.equal(gate({ ...message, text: '@ExampleBot inspect', entities: [{ type: 'mention', offset: 0, length: 11 }] }, 'ExampleBot').action, 'deliver');
|
|
93
|
+
assert.equal(gate({ ...message, replyToUsername: 'ExampleBot' }, 'ExampleBot').action, 'deliver');
|
|
94
|
+
assert.equal(gate({ ...message, chatType: 'private', chatId: 'operator' }, 'ExampleBot').action, 'deliver');
|
|
95
|
+
passed.push('registered-bridge-drops-unmentioned-groups-preserves-mentions-replies-dms');
|
|
96
|
+
|
|
97
|
+
const thinkingFile = path.join(packageRoot, 'bin/thinking-only-guard.cjs');
|
|
98
|
+
if (fs.existsSync(thinkingFile)) {
|
|
99
|
+
const thinking = require(thinkingFile);
|
|
100
|
+
assert.equal(thinking.DEFAULT_THINKING_ONLY_LIMIT_MS, 120000);
|
|
101
|
+
const original = { messages: [{ role: 'user', content: 'synthetic inspection' }] };
|
|
102
|
+
assert.equal(thinking.forceAnswerParams(original).thinkingOnlyRecovery, true);
|
|
103
|
+
assert(core.includes('thinkingOnlyRecovery') && core.includes('withThinking("off")'), 'thinking recovery integration missing');
|
|
104
|
+
passed.push('bounded-thinking-recovery-retained-structural-only');
|
|
105
|
+
} else {
|
|
106
|
+
assert(fs.existsSync(path.join(packageRoot, 'bundled-agent-sources.json')), 'private thinking helper missing');
|
|
107
|
+
notApplicable.push({ check: 'private-thinking-helper', reason: 'The regular CLI does not ship this private test API; no recovery or host proof.' });
|
|
108
|
+
}
|
|
109
|
+
const routing = require(path.join(packageRoot, 'bin/turn-thinking-policy.cjs'));
|
|
110
|
+
for (const prompt of ['Which result file belongs to our task?', 'Quick status?', 'Do you remember our previous decision?']) {
|
|
111
|
+
assert.equal(routing.selectThinkingEffortForTurn(prompt, 'user', 'off'), undefined,
|
|
112
|
+
'continuity request lost its project context');
|
|
113
|
+
}
|
|
114
|
+
assert.equal(routing.selectThinkingEffortForTurn('Hi', 'user'), 'low');
|
|
115
|
+
passed.push('continuity-requests-retain-normal-context-routing');
|
|
116
|
+
const report = { verified: true, work, passed, notApplicable, launcherAutomaticRegistrationTested: false, modelApplicationTested: false,
|
|
117
|
+
hubCompletenessTested: false, realProfilesChanged: false };
|
|
118
|
+
write(path.join(work, 'report.json'), report);
|
|
119
|
+
return report;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports = { verifyAgentBehavior, functionSource };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { createHash } = require('node:crypto');
|
|
6
|
+
|
|
7
|
+
const RECEIPT = 'agent-components.json';
|
|
8
|
+
const SCHEMA = 'blun.bundled-agent-components/v1';
|
|
9
|
+
const REQUIRED = [
|
|
10
|
+
'blun.mjs',
|
|
11
|
+
'telegram-plugin/dist/bridge.mjs',
|
|
12
|
+
'bin/thinking-only-guard.cjs',
|
|
13
|
+
'bin/turn-thinking-policy.cjs',
|
|
14
|
+
'bin/context-performance-policy.cjs',
|
|
15
|
+
'bin/verify-agent-behavior.cjs',
|
|
16
|
+
'agent-spine-plugin/blun.plugin.json',
|
|
17
|
+
'agent-spine-plugin/src/hook.js',
|
|
18
|
+
'agent-spine-plugin/src/mcp.js',
|
|
19
|
+
'agent-spine-plugin/skills/agent-spine/SKILL.md',
|
|
20
|
+
'standard-skills/translate-native/SKILL.md',
|
|
21
|
+
'standard-tools/language-guard/blun_language_guard.py',
|
|
22
|
+
'standard-tools/language-guard/check_diacritics.py',
|
|
23
|
+
'standard-tools/language-guard/guard_service_client.py',
|
|
24
|
+
'standard-tools/language-guard/language_quality.py',
|
|
25
|
+
'standard-tools/language-guard/translation_guard.py',
|
|
26
|
+
'bin/plugin-bootstrap.js',
|
|
27
|
+
'bin/managed-plugin-selection.cjs',
|
|
28
|
+
'bin/standard-tools-bootstrap.js',
|
|
29
|
+
'bin/launcher-runtime.js',
|
|
30
|
+
];
|
|
31
|
+
const PREFIXES = ['agent-spine-plugin/', 'standard-skills/translate-native/', 'standard-tools/language-guard/'];
|
|
32
|
+
const sha256 = bytes => createHash('sha256').update(bytes).digest('hex');
|
|
33
|
+
|
|
34
|
+
function inventory(root, prefix = '', excluded = []) {
|
|
35
|
+
const result = {};
|
|
36
|
+
for (const name of fs.readdirSync(root).sort()) {
|
|
37
|
+
const file = path.join(root, name);
|
|
38
|
+
const relative = prefix + name;
|
|
39
|
+
if (excluded.some(item => relative === item || relative.startsWith(item + '/'))) continue;
|
|
40
|
+
const stat = fs.lstatSync(file);
|
|
41
|
+
if (stat.isSymbolicLink()) throw new Error('Linked component path: ' + relative);
|
|
42
|
+
if (stat.isDirectory()) Object.assign(result, inventory(file, relative + '/', excluded));
|
|
43
|
+
else if (stat.isFile()) result[relative] = sha256(fs.readFileSync(file));
|
|
44
|
+
else throw new Error('Unsupported component path: ' + relative);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function safeFile(root, relative) {
|
|
50
|
+
if (typeof relative !== 'string' || relative.includes('\\') || relative.includes(':')
|
|
51
|
+
|| relative.split('/').some(part => !part || part === '.' || part === '..')) {
|
|
52
|
+
throw new Error('Invalid component path');
|
|
53
|
+
}
|
|
54
|
+
let current = path.resolve(root);
|
|
55
|
+
for (const part of relative.split('/')) {
|
|
56
|
+
current = path.join(current, part);
|
|
57
|
+
if (fs.lstatSync(current).isSymbolicLink()) throw new Error('Linked component path: ' + relative);
|
|
58
|
+
}
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function verifyAgentComponents(packageRoot) {
|
|
63
|
+
const receipt = JSON.parse(fs.readFileSync(path.join(packageRoot, RECEIPT), 'utf8'));
|
|
64
|
+
if (receipt.schema !== SCHEMA || !receipt.files || typeof receipt.files !== 'object'
|
|
65
|
+
|| Array.isArray(receipt.files)) throw new Error('Invalid bundled component receipt');
|
|
66
|
+
for (const name of ['agentSpine', 'translateNative']) {
|
|
67
|
+
if (!/^[a-f0-9]{40}$/.test(receipt.sources?.[name]?.commit || '')) {
|
|
68
|
+
throw new Error('Missing bundled component source: ' + name);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const name of REQUIRED) {
|
|
72
|
+
if (!Object.hasOwn(receipt.files, name)) throw new Error('Missing bundled component: ' + name);
|
|
73
|
+
}
|
|
74
|
+
for (const [relative, expected] of Object.entries(receipt.files)) {
|
|
75
|
+
if (!/^[a-f0-9]{64}$/.test(expected) || sha256(fs.readFileSync(safeFile(packageRoot, relative))) !== expected) {
|
|
76
|
+
throw new Error('Bundled component digest mismatch: ' + relative);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const prefix of PREFIXES) {
|
|
80
|
+
const actual = Object.keys(inventory(safeFile(packageRoot, prefix.slice(0, -1)), prefix));
|
|
81
|
+
const expected = Object.keys(receipt.files).filter(file => file.startsWith(prefix)).sort();
|
|
82
|
+
if (JSON.stringify(actual.sort()) !== JSON.stringify(expected)) throw new Error('Unexpected bundled component files: ' + prefix);
|
|
83
|
+
}
|
|
84
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
85
|
+
if (manifest.scripts?.prepack !== 'node bin/verify-agent-components.cjs') {
|
|
86
|
+
throw new Error('Bundled component prepack check missing');
|
|
87
|
+
}
|
|
88
|
+
const launcher = fs.readFileSync(path.join(packageRoot, 'bin/launcher-runtime.js'), 'utf8');
|
|
89
|
+
if (!launcher.includes("require('./verify-agent-components.cjs').verifyAgentComponents(PKG);")) {
|
|
90
|
+
throw new Error('Bundled component startup check missing');
|
|
91
|
+
}
|
|
92
|
+
return { verified: true, files: Object.keys(receipt.files).length, sources: receipt.sources };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (require.main === module) {
|
|
96
|
+
try {
|
|
97
|
+
const root = path.resolve(__dirname, '..');
|
|
98
|
+
console.log(JSON.stringify(verifyAgentComponents(root)));
|
|
99
|
+
console.log(JSON.stringify(require('./verify-agent-behavior.cjs').verifyAgentBehavior(root)));
|
|
100
|
+
}
|
|
101
|
+
catch (error) { console.error(error.message); process.exitCode = 1; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = { inventory, sha256, verifyAgentComponents, SCHEMA, RECEIPT, REQUIRED, PREFIXES };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const fs = require('node:fs');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const { createHash } = require('node:crypto');
|
|
5
|
+
const RECEIPT = 'bundled-agent-sources.json';
|
|
6
|
+
const SCHEMA = 'blun.bundled-agent-sources/v1';
|
|
7
|
+
const PREFIXES = ['agent-spine-plugin/', 'standard-skills/translate-native/', 'standard-tools/language-guard/'];
|
|
8
|
+
const REQUIRED = [
|
|
9
|
+
'agent-spine-plugin/blun.plugin.json', 'agent-spine-plugin/src/hook.js',
|
|
10
|
+
'agent-spine-plugin/src/mcp.js', 'agent-spine-plugin/skills/agent-spine/SKILL.md',
|
|
11
|
+
'standard-skills/translate-native/SKILL.md', 'standard-tools/language-guard/blun_language_guard.py',
|
|
12
|
+
'standard-tools/language-guard/check_diacritics.py', 'standard-tools/language-guard/language_quality.py',
|
|
13
|
+
'standard-tools/language-guard/guard_service_client.py', 'standard-tools/language-guard/translation_guard.py',
|
|
14
|
+
];
|
|
15
|
+
const sha256 = bytes => createHash('sha256').update(bytes).digest('hex');
|
|
16
|
+
|
|
17
|
+
function payloadInventory(root, prefix = '') {
|
|
18
|
+
const files = {};
|
|
19
|
+
for (const name of fs.readdirSync(root).sort()) {
|
|
20
|
+
const target = path.join(root, name), relative = prefix + name;
|
|
21
|
+
const stat = fs.lstatSync(target);
|
|
22
|
+
if (stat.isSymbolicLink()) throw new Error('Linked bundled component: ' + relative);
|
|
23
|
+
if (stat.isDirectory()) Object.assign(files, payloadInventory(target, relative + '/'));
|
|
24
|
+
else if (stat.isFile()) files[relative] = sha256(fs.readFileSync(target));
|
|
25
|
+
else throw new Error('Unsupported bundled component: ' + relative);
|
|
26
|
+
}
|
|
27
|
+
return files;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function verifyBundledAgentSources(root, pins) {
|
|
31
|
+
const receipt = JSON.parse(fs.readFileSync(path.join(root, RECEIPT), 'utf8'));
|
|
32
|
+
if (receipt.schema !== SCHEMA || !receipt.files || Array.isArray(receipt.files)) throw new Error('Invalid bundled source receipt');
|
|
33
|
+
for (const name of ['agentSpine', 'translateNative']) {
|
|
34
|
+
if (!/^[a-f0-9]{40}$/.test(receipt.sources?.[name]?.commit || '')) throw new Error('Missing bundled source commit: ' + name);
|
|
35
|
+
if (pins && JSON.stringify(receipt.sources[name]) !== JSON.stringify(pins[name])) throw new Error('Stale bundled source: ' + name);
|
|
36
|
+
}
|
|
37
|
+
for (const file of REQUIRED) if (!Object.hasOwn(receipt.files, file)) throw new Error('Missing required bundled source: ' + file);
|
|
38
|
+
const actual = {};
|
|
39
|
+
for (const prefix of PREFIXES) {
|
|
40
|
+
const target = path.join(root, prefix);
|
|
41
|
+
if (fs.lstatSync(target).isSymbolicLink()) throw new Error('Linked component directory');
|
|
42
|
+
Object.assign(actual, payloadInventory(target, prefix));
|
|
43
|
+
}
|
|
44
|
+
const expectedNames = Object.keys(receipt.files).sort();
|
|
45
|
+
if (JSON.stringify(Object.keys(actual).sort()) !== JSON.stringify(expectedNames)) throw new Error('Bundled source inventory mismatch');
|
|
46
|
+
for (const file of expectedNames) {
|
|
47
|
+
if (!/^[a-f0-9]{64}$/.test(receipt.files[file]) || actual[file] !== receipt.files[file]) throw new Error('Bundled source digest mismatch: ' + file);
|
|
48
|
+
}
|
|
49
|
+
return receipt;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (require.main === module) {
|
|
53
|
+
try { const receipt = verifyBundledAgentSources(path.resolve(__dirname, '..'));
|
|
54
|
+
console.log(JSON.stringify({ verified: true, sources: receipt.sources, files: Object.keys(receipt.files).length }));
|
|
55
|
+
} catch (error) { console.error(error.message); process.exitCode = 1; }
|
|
56
|
+
}
|
|
57
|
+
module.exports = { verifyBundledAgentSources, payloadInventory, sha256, RECEIPT, SCHEMA, PREFIXES, REQUIRED };
|