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.
Files changed (436) hide show
  1. package/CHANGELOG.md +11 -178
  2. package/LIESMICH.txt +51 -13
  3. package/README.md +44 -47
  4. package/agent-spine-plugin/.codex-plugin/plugin.json +16 -4
  5. package/agent-spine-plugin/CHANGELOG.md +37 -5
  6. package/agent-spine-plugin/README.md +3 -3
  7. package/agent-spine-plugin/blun.plugin.json +45 -10
  8. package/agent-spine-plugin/docs/artifact-evaluation.md +93 -0
  9. package/agent-spine-plugin/docs/host-integration.md +42 -27
  10. package/agent-spine-plugin/docs/preflight-recall.md +4 -2
  11. package/agent-spine-plugin/docs/session-timeline.md +97 -236
  12. package/agent-spine-plugin/docs/world-model.md +25 -0
  13. package/agent-spine-plugin/hooks/codex.json +1 -1
  14. package/agent-spine-plugin/hooks/hooks.json +1 -1
  15. package/agent-spine-plugin/package.json +1 -3
  16. package/agent-spine-plugin/scripts/check-hosts.js +3 -3
  17. package/agent-spine-plugin/scripts/release-check.js +10 -5
  18. package/agent-spine-plugin/scripts/run-checks.js +4 -1
  19. package/agent-spine-plugin/scripts/run-tests-hermetic.js +32 -6
  20. package/agent-spine-plugin/src/cli-learning.js +15 -0
  21. package/agent-spine-plugin/src/cli.js +2 -0
  22. package/agent-spine-plugin/src/hook.js +32 -32
  23. package/agent-spine-plugin/src/lib/action-lesson-recall.js +73 -8
  24. package/agent-spine-plugin/src/lib/briefing.js +146 -36
  25. package/agent-spine-plugin/src/lib/channel-continuity.js +19 -0
  26. package/agent-spine-plugin/src/lib/delivery-agent-usage.js +14 -7
  27. package/agent-spine-plugin/src/lib/gateway-group-response.js +128 -0
  28. package/agent-spine-plugin/src/lib/gateway-runs.js +24 -15
  29. package/agent-spine-plugin/src/lib/hook-briefing-use.js +13 -3
  30. package/agent-spine-plugin/src/lib/hook-context.js +16 -3
  31. package/agent-spine-plugin/src/lib/hook-output.js +129 -5
  32. package/agent-spine-plugin/src/lib/hook-timeline.js +5 -3
  33. package/agent-spine-plugin/src/lib/indexed-memory.js +2 -2
  34. package/agent-spine-plugin/src/lib/learning-artifact-evaluator.js +114 -0
  35. package/agent-spine-plugin/src/lib/learning-context.js +11 -4
  36. package/agent-spine-plugin/src/lib/learning-measurements.js +2 -2
  37. package/agent-spine-plugin/src/lib/mcp-runtime.js +89 -3
  38. package/agent-spine-plugin/src/lib/mcp-source-context.js +12 -2
  39. package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +91 -8
  40. package/agent-spine-plugin/src/lib/mcp-world-tools.js +2 -2
  41. package/agent-spine-plugin/src/lib/owned-file-lock.js +20 -1
  42. package/agent-spine-plugin/src/lib/persona-runtime.js +2 -2
  43. package/agent-spine-plugin/src/lib/preflight-delivery-id.js +27 -0
  44. package/agent-spine-plugin/src/lib/preflight.js +4 -4
  45. package/agent-spine-plugin/src/lib/session-timeline-codex.js +15 -0
  46. package/agent-spine-plugin/src/lib/session-timeline-contract.js +12 -4
  47. package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +36 -7
  48. package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +13 -10
  49. package/agent-spine-plugin/src/lib/session-timeline-invocation.js +1 -1
  50. package/agent-spine-plugin/src/lib/session-timeline-king.js +14 -0
  51. package/agent-spine-plugin/src/lib/session-timeline-prior.js +18 -12
  52. package/agent-spine-plugin/src/lib/session-timeline-provider.js +5 -0
  53. package/agent-spine-plugin/src/lib/session-timeline-query.js +2 -0
  54. package/agent-spine-plugin/src/lib/session-timeline-results.js +35 -10
  55. package/agent-spine-plugin/src/lib/session-timeline-source-open.js +30 -0
  56. package/agent-spine-plugin/src/lib/session-timeline.js +122 -75
  57. package/agent-spine-plugin/src/lib/source-roots.js +3 -2
  58. package/agent-spine-plugin/src/lib/task-knowledge-context.js +22 -1
  59. package/agent-spine-plugin/src/lib/timeline-continuation-update.js +100 -0
  60. package/agent-spine-plugin/src/lib/timeline-tool-guard.js +30 -7
  61. package/agent-spine-plugin/src/lib/timeline-user-feedback.js +217 -0
  62. package/agent-spine-plugin/src/lib/timeline-world-capture.js +233 -0
  63. package/agent-spine-plugin/src/lib/world-knowledge.js +59 -2
  64. package/agent-spine-plugin/src/lib/world-model.js +64 -9
  65. package/agent-spine-plugin/src/worker.js +13 -1
  66. package/bin/blun.js +43 -28
  67. package/bin/core-bootstrap.js +5 -4
  68. package/bin/king.js +43 -28
  69. package/bin/launcher-mode.js +1 -10
  70. package/bin/launcher-runtime.js +128 -295
  71. package/bin/managed-node.js +0 -0
  72. package/bin/managed-plugin-selection.cjs +0 -1
  73. package/bin/native-module-repair.js +0 -0
  74. package/bin/node-runtime.js +0 -0
  75. package/bin/node-version.js +0 -0
  76. package/bin/plugin-bootstrap.js +56 -120
  77. package/bin/private-paths.js +11 -34
  78. package/bin/standard-tools-bootstrap.js +34 -114
  79. package/bin/turn-thinking-policy.cjs +3 -11
  80. package/bin/update-copy.js +200 -0
  81. package/bin/update-lease.js +0 -0
  82. package/bin/update-notice.js +136 -289
  83. package/bin/verify-agent-behavior.cjs +122 -0
  84. package/bin/verify-agent-components.cjs +104 -0
  85. package/bin/verify-bundled-agent-sources.cjs +57 -0
  86. package/blun.mjs +143078 -135241
  87. package/bundled-agent-sources.json +701 -0
  88. package/package.json +12 -15
  89. package/standard-skills/translate-native/README.md +1293 -0
  90. package/standard-skills/translate-native/SKILL.md +172 -22
  91. package/standard-skills/translate-native/VERSION +1 -1
  92. package/standard-skills/translate-native/agents/openai.yaml +18 -0
  93. package/standard-skills/translate-native/assets/icon.svg +8 -0
  94. package/standard-skills/translate-native/docs/BLUN_CODE_INTEGRATION.md +76 -0
  95. package/standard-skills/translate-native/docs/PREMORTEM.md +489 -0
  96. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION.md +2035 -0
  97. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_API.md +1302 -0
  98. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_EVIDENCE_HTTP.md +136 -0
  99. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HEALTH_HTTP.md +130 -0
  100. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_HTTP_PROVIDER.md +175 -0
  101. package/standard-skills/translate-native/docs/WEBSITE_LOCALIZATION_RECEIPT_VERIFIER_HTTP.md +86 -0
  102. package/standard-skills/translate-native/integrations/AGENT_RULES.md +32 -0
  103. package/standard-skills/translate-native/integrations/adapters/blun-code-language-guard.js +514 -0
  104. package/standard-skills/translate-native/integrations/adapters/node-language-guard.js +230 -0
  105. package/standard-skills/translate-native/integrations/audit_log.py +327 -0
  106. package/standard-skills/translate-native/integrations/claude_language_hook.js +1536 -0
  107. package/standard-skills/translate-native/integrations/commercial_localization_profile.py +42 -0
  108. package/standard-skills/translate-native/integrations/delivery-policy.example.json +28 -0
  109. package/standard-skills/translate-native/integrations/enforced_delivery.py +543 -0
  110. package/standard-skills/translate-native/integrations/guard_service.py +435 -0
  111. package/standard-skills/translate-native/integrations/language_gateway.py +67 -0
  112. package/standard-skills/translate-native/integrations/mcp_auth_headers.py +198 -0
  113. package/standard-skills/translate-native/integrations/mcp_http_gateway.py +429 -0
  114. package/standard-skills/translate-native/integrations/non_language_html_entities.js +1485 -0
  115. package/standard-skills/translate-native/integrations/pre_output_guard.py +65 -0
  116. package/standard-skills/translate-native/integrations/task_router.py +101 -0
  117. package/standard-skills/translate-native/integrations/website_localization.py +401 -0
  118. package/standard-skills/translate-native/integrations/website_localization_api.py +581 -0
  119. package/standard-skills/translate-native/integrations/website_localization_benchmark.py +1885 -0
  120. package/standard-skills/translate-native/integrations/website_localization_benchmark_campaign.py +1772 -0
  121. package/standard-skills/translate-native/integrations/website_localization_benchmark_candidate.py +506 -0
  122. package/standard-skills/translate-native/integrations/website_localization_benchmark_http.py +400 -0
  123. package/standard-skills/translate-native/integrations/website_localization_benchmark_review_store.py +781 -0
  124. package/standard-skills/translate-native/integrations/website_localization_benchmark_reviewer_http.py +500 -0
  125. package/standard-skills/translate-native/integrations/website_localization_benchmark_runtime.py +1107 -0
  126. package/standard-skills/translate-native/integrations/website_localization_benchmark_suite.py +463 -0
  127. package/standard-skills/translate-native/integrations/website_localization_cms.py +2835 -0
  128. package/standard-skills/translate-native/integrations/website_localization_cms_client.py +875 -0
  129. package/standard-skills/translate-native/integrations/website_localization_cms_dispatch.py +805 -0
  130. package/standard-skills/translate-native/integrations/website_localization_cms_http.py +588 -0
  131. package/standard-skills/translate-native/integrations/website_localization_cms_lifecycle_monitor.py +991 -0
  132. package/standard-skills/translate-native/integrations/website_localization_cms_receiver.py +1441 -0
  133. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_runtime.py +414 -0
  134. package/standard-skills/translate-native/integrations/website_localization_cms_receiver_store.py +1073 -0
  135. package/standard-skills/translate-native/integrations/website_localization_cms_removal_dispatch.py +865 -0
  136. package/standard-skills/translate-native/integrations/website_localization_cms_source_client.py +583 -0
  137. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery.py +964 -0
  138. package/standard-skills/translate-native/integrations/website_localization_cms_source_delivery_runtime.py +665 -0
  139. package/standard-skills/translate-native/integrations/website_localization_cms_source_http.py +1153 -0
  140. package/standard-skills/translate-native/integrations/website_localization_cms_source_runtime.py +675 -0
  141. package/standard-skills/translate-native/integrations/website_localization_cms_source_service.py +1125 -0
  142. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification.py +674 -0
  143. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_http.py +444 -0
  144. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver.py +1469 -0
  145. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_notification_receiver_runtime.py +1142 -0
  146. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_processing_monitor.py +634 -0
  147. package/standard-skills/translate-native/integrations/website_localization_cms_terminal_receiver_client.py +804 -0
  148. package/standard-skills/translate-native/integrations/website_localization_deepl_baseline.py +922 -0
  149. package/standard-skills/translate-native/integrations/website_localization_evidence_http.py +482 -0
  150. package/standard-skills/translate-native/integrations/website_localization_health.py +1541 -0
  151. package/standard-skills/translate-native/integrations/website_localization_health_http.py +372 -0
  152. package/standard-skills/translate-native/integrations/website_localization_http_provider.py +297 -0
  153. package/standard-skills/translate-native/integrations/website_localization_native_reference_http.py +479 -0
  154. package/standard-skills/translate-native/integrations/website_localization_native_reference_intake.py +363 -0
  155. package/standard-skills/translate-native/integrations/website_localization_native_reference_queue.py +1449 -0
  156. package/standard-skills/translate-native/integrations/website_localization_native_reference_store.py +420 -0
  157. package/standard-skills/translate-native/integrations/website_localization_quality_profiles.py +235 -0
  158. package/standard-skills/translate-native/integrations/website_localization_queue.py +671 -0
  159. package/standard-skills/translate-native/integrations/website_localization_receipt_verifier_http.py +516 -0
  160. package/standard-skills/translate-native/integrations/website_localization_release.py +928 -0
  161. package/standard-skills/translate-native/integrations/website_localization_release_coordinator.py +1008 -0
  162. package/standard-skills/translate-native/integrations/website_localization_runner.py +276 -0
  163. package/standard-skills/translate-native/integrations/website_localization_runtime.py +862 -0
  164. package/standard-skills/translate-native/integrations/website_localization_service.py +350 -0
  165. package/standard-skills/translate-native/integrations/website_localization_supervisor.py +511 -0
  166. package/standard-skills/translate-native/integrations/website_localization_worker.py +663 -0
  167. package/standard-skills/translate-native/provenance.json +3 -4
  168. package/standard-skills/translate-native/references/commercial-localization.md +177 -0
  169. package/standard-skills/translate-native/scripts/blun_language_guard.py +7 -1
  170. package/standard-skills/translate-native/scripts/check_commercial_review.py +80 -0
  171. package/standard-skills/translate-native/scripts/commercial_localization_profile.py +333 -0
  172. package/standard-tools/language-guard/LICENSE +21 -0
  173. package/standard-tools/language-guard/VERSION +1 -0
  174. package/standard-tools/language-guard/blun_language_guard.py +7 -1
  175. package/standard-tools/language-guard/check_commercial_review.py +80 -0
  176. package/standard-tools/language-guard/commercial_localization_profile.py +333 -0
  177. package/standard-tools/language-guard/language_gateway.py +62 -0
  178. package/standard-tools/language-guard/pre_output_guard.py +64 -0
  179. package/standard-tools/language-guard/provenance.json +4 -11
  180. package/standard-tools/manifest.json +34 -11
  181. package/telegram-plugin/commands/access.md +2 -10
  182. package/telegram-plugin/dist/bridge.mjs +64041 -687
  183. package/telegram-plugin/dist/mcp-server.mjs +72810 -9027
  184. package/telegram-plugin/dist/noise.mjs +28 -63511
  185. package/agent-spine-plugin/CONTRIBUTING.md +0 -52
  186. package/agent-spine-plugin/SECURITY.md +0 -47
  187. package/agent-spine-plugin/docs/assignment-continuation.md +0 -48
  188. package/agent-spine-plugin/docs/releasing.md +0 -85
  189. package/agent-spine-plugin/docs/structured-completion.md +0 -67
  190. package/bin/abort-listener-policy.cjs +0 -43
  191. package/bin/active-steer-priority-policy.cjs +0 -24
  192. package/bin/agent-api-http-adapter.mjs +0 -446
  193. package/bin/agent-api-private-http-server.mjs +0 -288
  194. package/bin/agent-api-runtime.mjs +0 -252
  195. package/bin/agent-api-service-environment.mjs +0 -236
  196. package/bin/agent-api-service-host.mjs +0 -209
  197. package/bin/agent-api-service-process.mjs +0 -171
  198. package/bin/agent-api-session-registry.mjs +0 -428
  199. package/bin/agent-api-tool-broker.cjs +0 -248
  200. package/bin/agent-api-turn-controller.mjs +0 -461
  201. package/bin/agent-api-usage-journal.cjs +0 -259
  202. package/bin/agent-resume-snapshot.cjs +0 -241
  203. package/bin/agentspine-king-goal-inbox.mjs +0 -111
  204. package/bin/agentspine-king-goal-intake.mjs +0 -106
  205. package/bin/approval-rejection-stop.cjs +0 -15
  206. package/bin/assistant-message-offload-policy.cjs +0 -284
  207. package/bin/baseline-skill-performance-policy.cjs +0 -39
  208. package/bin/bash-search-scope-policy.cjs +0 -49
  209. package/bin/codebase-search-runtime.cjs +0 -23
  210. package/bin/cognitive-action-checkpoint.cjs +0 -1104
  211. package/bin/cognitive-attention-delivery.cjs +0 -76
  212. package/bin/cognitive-attention-policy.cjs +0 -143
  213. package/bin/cognitive-attention-runtime.cjs +0 -91
  214. package/bin/cognitive-context-projection.cjs +0 -73
  215. package/bin/cognitive-cross-portal-acceptance.cjs +0 -443
  216. package/bin/cognitive-effective-view.cjs +0 -77
  217. package/bin/cognitive-focus-projection.cjs +0 -206
  218. package/bin/cognitive-focus-scope.cjs +0 -37
  219. package/bin/cognitive-goal-autostart-policy.cjs +0 -72
  220. package/bin/cognitive-goal-time-trigger-controller.cjs +0 -146
  221. package/bin/cognitive-memory-adapter.cjs +0 -282
  222. package/bin/cognitive-memory-command.cjs +0 -293
  223. package/bin/cognitive-memory-provider.cjs +0 -92
  224. package/bin/cognitive-salience-policy.cjs +0 -159
  225. package/bin/cognitive-state-store.cjs +0 -508
  226. package/bin/cognitive-turn-lifecycle.cjs +0 -624
  227. package/bin/cognitive-work-focus.cjs +0 -180
  228. package/bin/compaction-history-archive.cjs +0 -166
  229. package/bin/compaction-history-startup.cjs +0 -50
  230. package/bin/compaction-model-policy.cjs +0 -31
  231. package/bin/compaction-stage-policy.cjs +0 -21
  232. package/bin/compaction-transaction-policy.cjs +0 -122
  233. package/bin/config-write-dedup-policy.cjs +0 -27
  234. package/bin/context-budget-ledger.cjs +0 -31
  235. package/bin/context-doctor-policy.cjs +0 -70
  236. package/bin/context-insight-policy.cjs +0 -36
  237. package/bin/context-performance-policy.cjs +0 -15
  238. package/bin/context-pressure-policy.cjs +0 -20
  239. package/bin/cron-run-output.cjs +0 -45
  240. package/bin/cron-run-store.cjs +0 -145
  241. package/bin/curiosity-scout-policy.cjs +0 -49
  242. package/bin/default-model-output-budget-policy.cjs +0 -28
  243. package/bin/durable-task-resume-policy.cjs +0 -130
  244. package/bin/durable-task-resume-runtime.cjs +0 -117
  245. package/bin/durable-task-resume-store.cjs +0 -88
  246. package/bin/editable-tool-approval-policy.cjs +0 -540
  247. package/bin/editable-tool-approval-runtime.cjs +0 -99
  248. package/bin/effective-system-prompt-cache-policy.cjs +0 -33
  249. package/bin/error-memory-performance-policy.cjs +0 -113
  250. package/bin/file-observation-policy.cjs +0 -133
  251. package/bin/foreground-output-capture-policy.cjs +0 -41
  252. package/bin/generated-source-health.cjs +0 -142
  253. package/bin/glob-pattern-policy.cjs +0 -13
  254. package/bin/goal-completion-evidence-policy.cjs +0 -120
  255. package/bin/grep-output-limit-policy.cjs +0 -39
  256. package/bin/historical-media-projection-policy.cjs +0 -48
  257. package/bin/history-offload-pressure-policy.cjs +0 -33
  258. package/bin/html-to-research-markdown.cjs +0 -147
  259. package/bin/identity-context-policy.cjs +0 -764
  260. package/bin/identity-journal-policy.cjs +0 -107
  261. package/bin/input-draft-persistence.cjs +0 -77
  262. package/bin/king-tui-function-contract.json +0 -33
  263. package/bin/launcher-restart-policy.cjs +0 -150
  264. package/bin/live-response-repetition-guard.cjs +0 -196
  265. package/bin/llm-config-log-dedup-policy.cjs +0 -76
  266. package/bin/loop-event-record-policy.cjs +0 -174
  267. package/bin/managed-context-startup-policy.cjs +0 -27
  268. package/bin/media-activity-layout-policy.cjs +0 -34
  269. package/bin/media-auto-retrieval-policy.cjs +0 -90
  270. package/bin/media-result-policy.cjs +0 -59
  271. package/bin/micro-compaction-policy.cjs +0 -145
  272. package/bin/mistake-relevance-policy.cjs +0 -319
  273. package/bin/model-retry-progress-policy.cjs +0 -46
  274. package/bin/native-large-file-io.cjs +0 -42
  275. package/bin/native-runtime-cache.cjs +0 -76
  276. package/bin/natural-presence-policy.cjs +0 -28
  277. package/bin/noninteractive-shell-env-policy.cjs +0 -19
  278. package/bin/observer-hooks.cjs +0 -14
  279. package/bin/outbound-claim-provenance.cjs +0 -150
  280. package/bin/oversized-context-offload-policy.cjs +0 -86
  281. package/bin/pending-media-policy.cjs +0 -182
  282. package/bin/pending-token-estimate-policy.cjs +0 -41
  283. package/bin/personal-memory-consent-policy.cjs +0 -72
  284. package/bin/personal-memory-performance-policy.cjs +0 -12
  285. package/bin/personality-choice-policy.cjs +0 -101
  286. package/bin/personality-memory-adapter.cjs +0 -379
  287. package/bin/personality-mode.cjs +0 -46
  288. package/bin/personality-setup-policy.cjs +0 -197
  289. package/bin/proactive-compaction-policy.cjs +0 -25
  290. package/bin/profile-identity-resolution.cjs +0 -136
  291. package/bin/profile-runtime.cjs +0 -318
  292. package/bin/profile-tool-exclusion-policy.cjs +0 -37
  293. package/bin/programmatic-context-isolation.cjs +0 -25
  294. package/bin/programmatic-tool-runtime.mjs +0 -627
  295. package/bin/provider-idle-timeout-policy.cjs +0 -14
  296. package/bin/provider-model-refresh-deadline.cjs +0 -53
  297. package/bin/provider-model-refresh-policy.cjs +0 -107
  298. package/bin/rate-limit-recovery-policy.cjs +0 -47
  299. package/bin/read-batch-policy.cjs +0 -32
  300. package/bin/read-continuation-policy.cjs +0 -59
  301. package/bin/recurring-cron-history-policy.cjs +0 -124
  302. package/bin/relationship-continuity-policy.cjs +0 -143
  303. package/bin/relationship-curiosity-policy.cjs +0 -107
  304. package/bin/relationship-learning-policy.cjs +0 -168
  305. package/bin/release-artifact-freeze-policy.cjs +0 -30
  306. package/bin/reload-plugin-bootstrap.cjs +0 -18
  307. package/bin/reload-queue-policy.cjs +0 -38
  308. package/bin/repeated-assistant-response-policy.cjs +0 -232
  309. package/bin/repeated-injection-projection.cjs +0 -107
  310. package/bin/repeated-user-message-projection.cjs +0 -8
  311. package/bin/research-page-result.cjs +0 -74
  312. package/bin/retry-checkpoint-policy.cjs +0 -13
  313. package/bin/runtime-exit-ledger.cjs +0 -144
  314. package/bin/scoped-cron-run-policy.cjs +0 -358
  315. package/bin/session-checkpoint-policy.cjs +0 -25
  316. package/bin/session-compaction-policy.cjs +0 -84
  317. package/bin/session-replay-policy.cjs +0 -20
  318. package/bin/session-replay-window-policy.cjs +0 -40
  319. package/bin/session-resume-checkpoint.cjs +0 -254
  320. package/bin/session-scrollback-archive.cjs +0 -229
  321. package/bin/skill-activation-performance-policy.cjs +0 -69
  322. package/bin/skill-listing-performance-policy.cjs +0 -92
  323. package/bin/soul-organization-policy.cjs +0 -78
  324. package/bin/soul-preservation-policy.cjs +0 -20
  325. package/bin/startup-preferences.cjs +0 -131
  326. package/bin/streaming-flush-performance-policy.cjs +0 -28
  327. package/bin/structured-agent-swarm-output.cjs +0 -325
  328. package/bin/structured-subagent-output.cjs +0 -252
  329. package/bin/subagent-context-fork-policy.cjs +0 -155
  330. package/bin/subagent-max-tokens-handoff-policy.cjs +0 -69
  331. package/bin/subagent-parent-responsiveness.cjs +0 -19
  332. package/bin/subagent-skill-policy.cjs +0 -206
  333. package/bin/subagent-timeout-policy.cjs +0 -182
  334. package/bin/subagent-tool-policy.cjs +0 -60
  335. package/bin/subagent-usage-rollup-policy.cjs +0 -29
  336. package/bin/system-prompt-context-policy.cjs +0 -124
  337. package/bin/system-prompt-token-cache-policy.cjs +0 -60
  338. package/bin/telegram-addressed-focus.cjs +0 -55
  339. package/bin/telegram-addressed-priority.cjs +0 -12
  340. package/bin/telegram-approval-relay.cjs +0 -290
  341. package/bin/telegram-bot-priority.cjs +0 -17
  342. package/bin/telegram-console-status-policy.cjs +0 -174
  343. package/bin/telegram-context-projection-policy.cjs +0 -141
  344. package/bin/telegram-delivery-lifecycle.cjs +0 -125
  345. package/bin/telegram-direct-focus-policy.cjs +0 -273
  346. package/bin/telegram-mcp-compatibility.cjs +0 -49
  347. package/bin/telegram-media-delivery-policy.cjs +0 -42
  348. package/bin/telegram-private-conversation-policy.cjs +0 -185
  349. package/bin/telegram-queue-handoff-policy.cjs +0 -73
  350. package/bin/telegram-remote-status-policy.cjs +0 -120
  351. package/bin/telegram-session-queue-runtime.mjs +0 -306
  352. package/bin/telegram-text-chunk-policy.cjs +0 -63
  353. package/bin/telegram-truncated-reply-policy.cjs +0 -37
  354. package/bin/telegram-urgent-policy.cjs +0 -45
  355. package/bin/telemetry-spool-policy.cjs +0 -57
  356. package/bin/thinking-activity-status-policy.cjs +0 -132
  357. package/bin/thinking-only-guard.cjs +0 -79
  358. package/bin/todo-list-turn-policy.cjs +0 -131
  359. package/bin/tool-call-loop-policy.cjs +0 -51
  360. package/bin/tool-file-persistence.cjs +0 -141
  361. package/bin/tool-result-offload-policy.cjs +0 -359
  362. package/bin/tool-result-offload-telemetry.cjs +0 -12
  363. package/bin/tool-schema-token-cache-policy.cjs +0 -41
  364. package/bin/tool-stream-preview-policy.cjs +0 -9
  365. package/bin/tui-functional-contract.cjs +0 -55
  366. package/bin/turn-tool-performance-policy.cjs +0 -486
  367. package/bin/usage-cache-efficiency-policy.cjs +0 -26
  368. package/bin/user-home-path-policy.cjs +0 -13
  369. package/bin/user-message-offload-policy.cjs +0 -103
  370. package/bin/user-prompt-hook-origin-policy.cjs +0 -34
  371. package/bin/user-tool-record-policy.cjs +0 -7
  372. package/bin/validated-learning-insight-policy.cjs +0 -58
  373. package/bin/validated-learning-outcome-trace.cjs +0 -107
  374. package/bin/validated-learning-performance-policy.cjs +0 -53
  375. package/bin/validated-learning-signal.cjs +0 -463
  376. package/bin/windows-bash-dialect-policy.cjs +0 -25
  377. package/bin/windows-node-crash-dump.cjs +0 -110
  378. package/bin/write-continuation-policy.cjs +0 -69
  379. package/codebase-index/README.md +0 -82
  380. package/codebase-index/codebase_index.py +0 -470
  381. package/standard-skills/agent-browser/SKILL.md +0 -19
  382. package/standard-skills/agent-browser/references/runtime.md +0 -8
  383. package/standard-skills/blun-session-inspector/SKILL.md +0 -41
  384. package/standard-skills/blun-session-inspector/scripts/inspect-session.cjs +0 -437
  385. package/standard-skills/design-taste-frontend/SKILL.md +0 -1206
  386. package/standard-skills/full-output-enforcement/SKILL.md +0 -49
  387. package/standard-skills/high-end-visual-design/SKILL.md +0 -98
  388. package/standard-skills/image-to-code/SKILL.md +0 -1228
  389. package/standard-skills/industrial-brutalist-ui/SKILL.md +0 -92
  390. package/standard-skills/minimalist-ui/SKILL.md +0 -85
  391. package/standard-skills/motion-design-taste/SKILL.md +0 -74
  392. package/standard-skills/playwright-testing/SKILL.md +0 -19
  393. package/standard-skills/playwright-testing/references/runtime.md +0 -7
  394. package/standard-skills/premortem/SKILL.md +0 -148
  395. package/standard-skills/redesign-existing-projects/SKILL.md +0 -178
  396. package/standard-skills/research-evidence/SKILL.md +0 -39
  397. package/standard-skills/research-evidence/references/evidence-format.md +0 -104
  398. package/standard-skills/research-evidence/scripts/evidence-collection.cjs +0 -260
  399. package/standard-skills/research-evidence/scripts/score-report.cjs +0 -130
  400. package/standard-skills/screenshot-lesen/SKILL.md +0 -52
  401. package/standard-skills/stitch-design-taste/DESIGN.md +0 -121
  402. package/standard-skills/stitch-design-taste/SKILL.md +0 -184
  403. package/standard-skills/telegram-channel/SKILL.md +0 -18
  404. package/standard-skills/telegram-channel/references/runtime.md +0 -7
  405. package/standard-skills/venture-flywheel/SKILL.md +0 -32
  406. package/standard-skills/venture-flywheel/identity/project-identity.cjs +0 -146
  407. package/standard-skills/venture-flywheel/policy/capability-engine.cjs +0 -114
  408. package/standard-skills/venture-flywheel/policy/repository-trust.cjs +0 -229
  409. package/standard-skills/venture-flywheel/references/BEISPIELE-phase0.md +0 -146
  410. package/standard-skills/venture-flywheel/references/CAPABILITY-MAP.md +0 -34
  411. package/standard-skills/venture-flywheel/references/SPEC-phase0-identity-trust.md +0 -77
  412. package/standard-skills/venture-flywheel/references/SPEC-phase0-state-events.md +0 -93
  413. package/standard-skills/venture-flywheel/schemas/capability-decision.schema.json +0 -13
  414. package/standard-skills/venture-flywheel/schemas/execution-event.schema.json +0 -44
  415. package/standard-skills/venture-flywheel/schemas/project-identity.schema.json +0 -32
  416. package/standard-skills/venture-flywheel/schemas/repository-trust.schema.json +0 -57
  417. package/standard-skills/venture-flywheel/schemas/run-transition.schema.json +0 -59
  418. package/standard-skills/venture-flywheel/state/execution-event.cjs +0 -191
  419. package/standard-skills/venture-flywheel/state/task-state-machine.cjs +0 -190
  420. package/standard-skills/web-lesen/SKILL.md +0 -73
  421. package/standard-skills/web-lesen/scripts/crawl_public.py +0 -379
  422. package/standard-skills/windows-mcp/SKILL.md +0 -19
  423. package/standard-skills/windows-mcp/references/runtime.md +0 -9
  424. package/telegram-plugin/DELIVERY.md +0 -36
  425. package/telegram-plugin/bin/telegram-approval-relay.cjs +0 -290
  426. package/telegram-plugin/bin/telegram-console-status-policy.cjs +0 -175
  427. package/telegram-plugin/bin/telegram-delivery-lifecycle.cjs +0 -125
  428. package/telegram-plugin/bin/telegram-direct-reply-policy.cjs +0 -48
  429. package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +0 -122
  430. package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +0 -186
  431. package/telegram-plugin/bin/telegram-remote-status-policy.cjs +0 -121
  432. package/telegram-plugin/bin/telegram-reply-parts.cjs +0 -149
  433. package/telegram-plugin/bin/telegram-text-chunk-policy.cjs +0 -63
  434. package/telegram-plugin/bin/telegram-typing-keepalive.cjs +0 -89
  435. package/telegram-plugin/compat/mcp-server-fa511cd1.mjs +0 -73825
  436. /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 };