blun-king-cli 9.1.587 → 9.1.588

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/CHANGELOG.md +11 -185
  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 +143076 -135288
  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 -19
  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 -80
  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
@@ -10,12 +10,14 @@ const ASSERTION_SCHEMA = "agentspine.world-assertion/v1";
10
10
  const MAX_STATE_BYTES = 5 * 1024 * 1024;
11
11
  const MAX_VALUE_BYTES = 8192;
12
12
  const EVIDENCE_KINDS = new Set([
13
- "objective-measurement", "explicit-user-feedback", "model-suggestion"
13
+ "objective-measurement", "explicit-user-feedback", "model-suggestion", "uninterpreted-user-message"
14
14
  ]);
15
15
  const PRIVACY = new Set(["private", "shared", "group"]);
16
16
  const STABLE_ID = /^[a-z][a-z0-9-]{0,31}:[A-Za-z0-9][A-Za-z0-9._/-]{0,190}$/;
17
17
  const PREDICATE = /^[a-z][a-z0-9.-]{0,127}$/;
18
18
  const DIGEST = /^[a-f0-9]{64}$/;
19
+ const PORTAL_REF = /^portal-ref:[a-f0-9]{32}$/;
20
+ const THREAD_REF = /^thread-ref:[a-f0-9]{32}$/;
19
21
  const FORBIDDEN = /(^|[-_.])(permissions?|rights?|authori[sz]ation|credentials?|secrets?|tokens?|api[-_]?keys?|delegation|tool[-_]?access|production[-_]?access|payments?|spending)([-_.]|$)/i;
20
22
 
21
23
  function sha256(value) {
@@ -59,6 +61,23 @@ function optionalStableId(value, field) {
59
61
  return value === null || value === undefined ? null : stableId(value, field);
60
62
  }
61
63
 
64
+ function routeBinding(input) {
65
+ const portalRef = input.portalRef ?? null;
66
+ const threadRef = input.threadRef ?? null;
67
+ if (Boolean(portalRef) !== Boolean(threadRef)) {
68
+ throw new Error("portalRef and threadRef must be provided together");
69
+ }
70
+ if (portalRef !== null && (!PORTAL_REF.test(portalRef) || !THREAD_REF.test(threadRef))) {
71
+ throw new Error("portalRef and threadRef must be opaque gateway references");
72
+ }
73
+ return portalRef ? { portalRef, threadRef } : {};
74
+ }
75
+
76
+ function sameRoute(left, right) {
77
+ return (left.portalRef ?? null) === (right.portalRef ?? null)
78
+ && (left.threadRef ?? null) === (right.threadRef ?? null);
79
+ }
80
+
62
81
  function emptyModel(root) {
63
82
  return { schema: SCHEMA, root, revision: 0, assertions: [], events: [], authority: "context-only" };
64
83
  }
@@ -72,6 +91,8 @@ function validateStoredAssertion(assertion, validKnowledgeFields) {
72
91
  if ((assertion.privacy === "group") !== Boolean(assertion.groupId)
73
92
  || (assertion.groupId && !STABLE_ID.test(assertion.groupId))
74
93
  || (assertion.projectId && !STABLE_ID.test(assertion.projectId))
94
+ || Boolean(assertion.portalRef) !== Boolean(assertion.threadRef)
95
+ || (assertion.portalRef && (!PORTAL_REF.test(assertion.portalRef) || !THREAD_REF.test(assertion.threadRef)))
75
96
  || !STABLE_ID.test(assertion.evidenceId || "") || !Array.isArray(assertion.supersedes)
76
97
  || assertion.supersedes.some((item) => !STABLE_ID.test(item))) return false;
77
98
  if (!validKnowledgeFields(assertion)) return false;
@@ -83,7 +104,8 @@ function validateStoredAssertion(assertion, validKnowledgeFields) {
83
104
  } catch {
84
105
  return false;
85
106
  }
86
- return assertion.status === (assertion.evidenceKind === "model-suggestion" ? "proposed" : "established");
107
+ return assertion.status === (["model-suggestion", "uninterpreted-user-message"].includes(assertion.evidenceKind)
108
+ ? "proposed" : "established");
87
109
  }
88
110
 
89
111
  function normalizeModel(value, root, validKnowledgeFields) {
@@ -156,8 +178,9 @@ function assertionInput(input, now, normalizeKnowledgeFields) {
156
178
  evidenceId, evidenceDigest: input.evidenceDigest, observedAt, expiresAt,
157
179
  projectId: optionalStableId(input.projectId, "projectId"), groupId, privacy,
158
180
  supersedes, reason: typeof input.reason === "string" ? input.reason.trim().slice(0, 500) : "",
159
- status: input.evidenceKind === "model-suggestion" ? "proposed" : "established",
181
+ status: ["model-suggestion", "uninterpreted-user-message"].includes(input.evidenceKind) ? "proposed" : "established",
160
182
  recordedAt: new Date(now).toISOString(), authority: "context-only",
183
+ ...routeBinding(input),
161
184
  ...(knowledge.knowledgeKind ? knowledge : {})
162
185
  };
163
186
  }
@@ -179,12 +202,29 @@ export async function recordWorldAssertion(input = {}) {
179
202
  if (assertionDigest(existing) !== assertionDigest(candidate)) throw new Error(`world assertion id is already used: ${candidate.id}`);
180
203
  return { status: "duplicate", assertion: structuredClone(existing), revision: model.revision, authority: "context-only" };
181
204
  }
205
+ if (input.requireActiveSupersedes === true) {
206
+ if (!candidate.supersedes.length) throw new Error("active supersession requires at least one assertion");
207
+ const cutoff = new Date(now).getTime();
208
+ const live = model.assertions.filter((item) => item.status === "established"
209
+ && item.subjectId === candidate.subjectId && item.predicate === candidate.predicate
210
+ && item.projectId === candidate.projectId && item.groupId === candidate.groupId
211
+ && item.privacy === candidate.privacy && sameRoute(item, candidate)
212
+ && (!item.expiresAt || new Date(item.expiresAt).getTime() > cutoff));
213
+ const replaced = new Set(live.flatMap((item) => item.supersedes));
214
+ const activeIds = live.filter((item) => !replaced.has(item.id)).map((item) => item.id).sort();
215
+ if (activeIds.join("\0") !== candidate.supersedes.join("\0")) {
216
+ throw new Error("active supersession compare-and-swap failed");
217
+ }
218
+ }
182
219
  for (const id of candidate.supersedes) {
183
220
  const previous = model.assertions.find((item) => item.id === id);
184
221
  if (!previous) throw new Error(`superseded assertion does not exist: ${id}`);
185
222
  if (previous.subjectId !== candidate.subjectId || previous.predicate !== candidate.predicate) {
186
223
  throw new Error("supersession must keep the same subject and predicate");
187
224
  }
225
+ if (!sameRoute(previous, candidate)) {
226
+ throw new Error("supersession must keep the same portal and thread scope");
227
+ }
188
228
  if (candidate.status !== "established") throw new Error("model suggestions cannot supersede established context");
189
229
  }
190
230
  model.revision += 1;
@@ -196,10 +236,18 @@ export async function recordWorldAssertion(input = {}) {
196
236
  });
197
237
  }
198
238
 
199
- function visible(assertion, { includePrivate, groupId, projectId }) {
239
+ function visible(assertion, { includePrivate, groupId, projectId, portalRef, threadRef, continuationTaskId }) {
200
240
  if (assertion.privacy === "private" && (!includePrivate || groupId)) return false;
201
241
  if (assertion.privacy === "group" && assertion.groupId !== groupId) return false;
202
- return assertion.projectId === null || assertion.projectId === projectId;
242
+ if (assertion.projectId !== null && assertion.projectId !== projectId) return false;
243
+ const currentRoute = Boolean(portalRef && threadRef);
244
+ const assertionRoute = Boolean(assertion.portalRef && assertion.threadRef);
245
+ if (assertionRoute) return currentRoute && sameRoute(assertion, { portalRef, threadRef });
246
+ // A portal-bound task must not silently inherit an older unbound checkpoint
247
+ // or task-local correction. General user/project knowledge remains portable.
248
+ if (currentRoute && continuationTaskId && assertion.knowledgeKind
249
+ && assertion.subjectId === continuationTaskId) return false;
250
+ return true;
203
251
  }
204
252
 
205
253
  function publicAssertion(assertion) {
@@ -209,7 +257,7 @@ function publicAssertion(assertion) {
209
257
  export async function worldContext({
210
258
  root = process.cwd(), subjectId = null, projectId = null, groupId = null,
211
259
  includePrivate = false, includeKnowledgeHistory = false, continuationTaskId = null,
212
- maxItems = 100, now = new Date()
260
+ portalRef = null, threadRef = null, maxItems = 100, now = new Date()
213
261
  } = {}) {
214
262
  if (groupId !== null && includePrivate) throw new Error("private world context cannot be assembled for a group audience");
215
263
  if (!Number.isInteger(maxItems) || maxItems < 1 || maxItems > 500) throw new Error("maxItems must be between 1 and 500");
@@ -217,12 +265,15 @@ export async function worldContext({
217
265
  projectId = optionalStableId(projectId, "projectId");
218
266
  groupId = optionalStableId(groupId, "groupId");
219
267
  continuationTaskId = optionalStableId(continuationTaskId, "continuationTaskId");
268
+ ({ portalRef = null, threadRef = null } = routeBinding({ portalRef, threadRef }));
220
269
  const names = await stateNames(root);
221
270
  const model = await readModel(names);
222
271
  const { structuredKnowledgeView } = await import("./world-knowledge.js");
223
272
  const cutoff = new Date(now).getTime();
224
273
  if (!Number.isFinite(cutoff)) throw new Error("now is invalid");
225
- const candidates = model.assertions.filter((item) => visible(item, { includePrivate, groupId, projectId })
274
+ const candidates = model.assertions.filter((item) => visible(item, {
275
+ includePrivate, groupId, projectId, portalRef, threadRef, continuationTaskId
276
+ })
226
277
  && (!subjectId || item.subjectId === subjectId));
227
278
  const stale = candidates.filter((item) => item.expiresAt && new Date(item.expiresAt).getTime() <= cutoff);
228
279
  const current = candidates.filter((item) => !item.expiresAt || new Date(item.expiresAt).getTime() > cutoff);
@@ -251,7 +302,9 @@ export async function worldContext({
251
302
  facts.push({ subjectId: newest.subjectId, predicate: newest.predicate, value: structuredClone(newest.value),
252
303
  assertionIds: assertions.map((item) => item.id).sort(), evidenceKinds: [...new Set(assertions.map((item) => item.evidenceKind))].sort(),
253
304
  latestObservedAt: newest.observedAt, expiresAt: newest.expiresAt, privacy: newest.privacy,
254
- groupId: newest.groupId, projectId: newest.projectId, authority: "context-only" });
305
+ groupId: newest.groupId, projectId: newest.projectId,
306
+ ...(newest.portalRef ? { portalRef: newest.portalRef, threadRef: newest.threadRef } : {}),
307
+ authority: "context-only" });
255
308
  }
256
309
  const order = (left, right) => left.subjectId.localeCompare(right.subjectId) || left.predicate.localeCompare(right.predicate);
257
310
  facts.sort(order); conflicts.sort(order); proposals.sort(order); stale.sort(order);
@@ -261,6 +314,8 @@ export async function worldContext({
261
314
  });
262
315
  return {
263
316
  schema: "agentspine.world-context/v1", root: names.root, revision: model.revision,
317
+ scope: { projectId, groupId, includePrivate,
318
+ ...(portalRef ? { portalRef, threadRef } : {}) },
264
319
  facts: facts.slice(0, maxItems), conflicts: conflicts.slice(0, maxItems),
265
320
  proposals: proposals.slice(0, maxItems).map(publicAssertion), stale: stale.slice(0, maxItems).map(publicAssertion),
266
321
  knowledge,
@@ -269,7 +324,7 @@ export async function worldContext({
269
324
  uncertainty: { requiresResolution: conflicts.length > 0, conflicts: conflicts.length,
270
325
  proposals: proposals.length, stale: stale.length },
271
326
  authority: "context-only",
272
- note: "Only unexpired, non-conflicting measured or explicitly user-confirmed assertions are facts. Model suggestions remain proposals and grant no authority."
327
+ note: "Only unexpired, non-conflicting measured or explicitly user-confirmed assertions are facts. Model suggestions and uninterpreted user messages remain proposals and grant no authority."
273
328
  };
274
329
  }
275
330
 
@@ -9,6 +9,8 @@ import {
9
9
  } from "./lib/gateway-runtime.js";
10
10
  import { createTelegramAdapter } from "./lib/telegram-adapter.js";
11
11
  import { acknowledgeChannelDelivery, loadChannelRuntime } from "./lib/channel-runtime.js";
12
+ import { channelTimelineContinuity } from "./lib/channel-continuity.js";
13
+ import { groupResponseContract, settleSuppressedGroupEvents } from "./lib/gateway-group-response.js";
12
14
  import { loadPersonaRuntime, syncPersonaRosterFromEnvironment } from "./lib/persona-runtime.js";
13
15
  import { selfHelpPolicyForWorkItem } from "./lib/knowledge-evidence.js";
14
16
  import { isMainModule } from "./lib/runtime.js";
@@ -101,12 +103,14 @@ async function hostWorkItem(root, item) {
101
103
  const event = item.channelEventId === null ? null
102
104
  : channel.runtime.events.find((entry) => entry.eventId === item.channelEventId) || null;
103
105
  if (item.channelEventId && !event) throw new Error("claimed channel work lost its exact event");
106
+ const continuity = channelTimelineContinuity(event);
104
107
  return {
105
108
  ...structuredClone(item), host: identity.host, profileId: identity.profileId, projectRoot: root,
106
109
  goal: goal ? structuredClone(goal) : null,
107
110
  goalStep: goalStep ? { ...structuredClone(goalStep),
108
111
  ...(executionAttempt === null ? {} : { executionAttempt }) } : null,
109
112
  selfHelpPolicy: goalStep ? selfHelpPolicyForWorkItem(goalStep) : null,
113
+ groupResponseContract: groupResponseContract(event),
110
114
  hostEnvironment: {
111
115
  AGENTSPINE_GATEWAY_CONTEXT: "agentspine.gateway-start/v1",
112
116
  AGENTSPINE_ENTITY_ID: item.agentId,
@@ -122,7 +126,9 @@ async function hostWorkItem(root, item) {
122
126
  } : {}),
123
127
  ...(event ? {
124
128
  AGENTSPINE_CHANNEL_EVENT_ID: event.eventId,
125
- AGENTSPINE_CHANNEL_PROVIDER: event.provider
129
+ AGENTSPINE_CHANNEL_PROVIDER: event.provider,
130
+ AGENTSPINE_PORTAL_REF: continuity.portalRef,
131
+ AGENTSPINE_THREAD_REF: continuity.threadRef
126
132
  } : {})
127
133
  },
128
134
  channelStart: event ? {
@@ -140,6 +146,7 @@ export async function runWorkerTick({ root = process.cwd(), workerId = "gateway-
140
146
  await syncPersonaRosterFromEnvironment({ root, env, now });
141
147
  const initial = await loadGatewayRuntime(root);
142
148
  if (!initial.policy.enabled || initial.policy.killSwitch) return { status: "stopped", processed: false };
149
+ await settleSuppressedGroupEvents({ root, now });
143
150
  if (typeof deliveryAdapter.poll === "function") {
144
151
  try { await deliveryAdapter.poll(); }
145
152
  catch (error) {
@@ -175,6 +182,11 @@ export async function runWorkerTick({ root = process.cwd(), workerId = "gateway-
175
182
  }
176
183
  const completed = await completeGatewayRun({ root, queueId: claim.item.queueId, workerId,
177
184
  claimedAt: claim.item.lease.claimedAt, attempt: claim.item.attempts, result, now });
185
+ if (completed.communication?.suppressed) {
186
+ await settleSuppressedGroupEvents({ root, now });
187
+ return { status: "silent", processed: true, queueId: completed.item.queueId,
188
+ communication: completed.communication, deliveryConfirmed: false, completionVerified: false };
189
+ }
178
190
  if (!completed.outbox) return {
179
191
  status: completed.clarification ? "needs-clarification"
180
192
  : completed.exploration ? "exploring" : completed.selfHelp ? "self-help-resolved"
package/bin/blun.js CHANGED
@@ -325,40 +325,55 @@ async function connectExistingRuntimeLease(timeoutMs = 3_000) {
325
325
  }
326
326
 
327
327
  async function main() {
328
- let noticeResult = await acquireNoticeLease();
329
- let runtimeResult;
330
- try {
331
- const installClear = await installLeaseIsClear();
332
- if (!installClear || !noticeResult.acquired) {
333
- runtimeResult = await connectExistingRuntimeLease();
334
- if (!runtimeResult.acquired && !installClear) {
335
- if (!await installLeaseIsClear()) {
336
- process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
337
- process.exitCode = 1;
338
- return;
339
- }
340
- runtimeResult = undefined;
341
- }
342
- if (!runtimeResult?.acquired && !noticeResult.acquired) {
343
- noticeResult = await acquireNoticeLease();
344
- if (!noticeResult.acquired) {
345
- process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
346
- process.exitCode = 1;
347
- return;
348
- }
349
- }
350
- }
328
+ const explicitUpdateRequest = process.argv.length === 3
329
+ && /^(?:update|upgrade)$/iu.test(process.argv[2] || '');
330
+ let noticeResult = await acquireNoticeLease();
331
+ let runtimeResult;
332
+ try {
333
+ if (explicitUpdateRequest) {
334
+ runtimeResult = await connectExistingRuntimeLease(750);
335
+ if (!runtimeResult.acquired) {
336
+ runtimeResult = undefined;
337
+ if (!noticeResult.acquired || !await installLeaseIsClear()) {
338
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
339
+ process.exitCode = 1;
340
+ return;
341
+ }
342
+ }
343
+ } else {
344
+ const installClear = await installLeaseIsClear();
345
+ if (!installClear || !noticeResult.acquired) {
346
+ runtimeResult = await connectExistingRuntimeLease();
347
+ if (!runtimeResult.acquired && !installClear) {
348
+ if (!await installLeaseIsClear()) {
349
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
350
+ process.exitCode = 1;
351
+ return;
352
+ }
353
+ runtimeResult = undefined;
354
+ }
355
+ if (!runtimeResult?.acquired && !noticeResult.acquired) {
356
+ noticeResult = await acquireNoticeLease();
357
+ if (!noticeResult.acquired) {
358
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
359
+ process.exitCode = 1;
360
+ return;
361
+ }
362
+ }
363
+ }
364
+ }
351
365
  noticeResult.lease?.assertOwned();
352
366
  runtimeResult?.lease?.assertOwned();
353
367
  const { runLauncher } = require('./launcher-runtime');
354
368
  noticeResult.lease?.assertOwned();
355
369
  runtimeResult?.lease?.assertOwned();
356
370
  const filename = path.basename(__filename).toLowerCase();
357
- await runLauncher({
358
- mode: filename.startsWith('king') ? 'king' : 'blun',
359
- noticeLease: noticeResult.lease,
360
- runtimeLease: runtimeResult?.lease,
361
- });
371
+ await runLauncher({
372
+ mode: filename.startsWith('king') ? 'king' : 'blun',
373
+ noticeLease: noticeResult.lease,
374
+ runtimeLease: runtimeResult?.lease,
375
+ skipUpdateNotice: runtimeResult?.acquired === true || !noticeResult.acquired,
376
+ });
362
377
  } finally {
363
378
  await runtimeResult?.lease?.release();
364
379
  await noticeResult.lease?.release();
@@ -5,15 +5,12 @@ const path = require('node:path');
5
5
  const { pathToFileURL } = require('node:url');
6
6
 
7
7
  const { acquireSharedRuntimeLease } = require('./update-lease');
8
- const { installWindowsNodeCrashDump } = require('./windows-node-crash-dump.cjs');
9
8
 
10
9
  const CORE_LOADED_MESSAGE = 'blun-core-bootstrap-loaded';
11
10
 
12
11
  async function runCoreBootstrap() {
13
12
  const packageRoot = path.resolve(__dirname, '..');
14
13
  const mainPath = path.join(packageRoot, 'blun.mjs');
15
- const informational = process.argv.slice(2).some(arg => ['-h', '--help', '-V', '--version'].includes(arg));
16
- if (!informational) installWindowsNodeCrashDump({ homeDir: process.env.BLUN_HOME });
17
14
  const leaseResult = await acquireSharedRuntimeLease({ packageRoot });
18
15
  if (!leaseResult.acquired) throw new Error('RUNTIME_PROTECTION_UNAVAILABLE');
19
16
 
@@ -34,7 +31,11 @@ async function runCoreBootstrap() {
34
31
 
35
32
  if (process.connected) {
36
33
  try {
37
- process.send({ type: CORE_LOADED_MESSAGE });
34
+ process.send({ type: CORE_LOADED_MESSAGE }, () => {
35
+ try {
36
+ process.disconnect();
37
+ } catch {}
38
+ });
38
39
  } catch {}
39
40
  }
40
41
  }
package/bin/king.js CHANGED
@@ -325,40 +325,55 @@ async function connectExistingRuntimeLease(timeoutMs = 3_000) {
325
325
  }
326
326
 
327
327
  async function main() {
328
- let noticeResult = await acquireNoticeLease();
329
- let runtimeResult;
330
- try {
331
- const installClear = await installLeaseIsClear();
332
- if (!installClear || !noticeResult.acquired) {
333
- runtimeResult = await connectExistingRuntimeLease();
334
- if (!runtimeResult.acquired && !installClear) {
335
- if (!await installLeaseIsClear()) {
336
- process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
337
- process.exitCode = 1;
338
- return;
339
- }
340
- runtimeResult = undefined;
341
- }
342
- if (!runtimeResult?.acquired && !noticeResult.acquired) {
343
- noticeResult = await acquireNoticeLease();
344
- if (!noticeResult.acquired) {
345
- process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
346
- process.exitCode = 1;
347
- return;
348
- }
349
- }
350
- }
328
+ const explicitUpdateRequest = process.argv.length === 3
329
+ && /^(?:update|upgrade)$/iu.test(process.argv[2] || '');
330
+ let noticeResult = await acquireNoticeLease();
331
+ let runtimeResult;
332
+ try {
333
+ if (explicitUpdateRequest) {
334
+ runtimeResult = await connectExistingRuntimeLease(750);
335
+ if (!runtimeResult.acquired) {
336
+ runtimeResult = undefined;
337
+ if (!noticeResult.acquired || !await installLeaseIsClear()) {
338
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
339
+ process.exitCode = 1;
340
+ return;
341
+ }
342
+ }
343
+ } else {
344
+ const installClear = await installLeaseIsClear();
345
+ if (!installClear || !noticeResult.acquired) {
346
+ runtimeResult = await connectExistingRuntimeLease();
347
+ if (!runtimeResult.acquired && !installClear) {
348
+ if (!await installLeaseIsClear()) {
349
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
350
+ process.exitCode = 1;
351
+ return;
352
+ }
353
+ runtimeResult = undefined;
354
+ }
355
+ if (!runtimeResult?.acquired && !noticeResult.acquired) {
356
+ noticeResult = await acquireNoticeLease();
357
+ if (!noticeResult.acquired) {
358
+ process.stderr.write('Der geschuetzte BLUN-Start ist gerade nicht verfuegbar.\n');
359
+ process.exitCode = 1;
360
+ return;
361
+ }
362
+ }
363
+ }
364
+ }
351
365
  noticeResult.lease?.assertOwned();
352
366
  runtimeResult?.lease?.assertOwned();
353
367
  const { runLauncher } = require('./launcher-runtime');
354
368
  noticeResult.lease?.assertOwned();
355
369
  runtimeResult?.lease?.assertOwned();
356
370
  const filename = path.basename(__filename).toLowerCase();
357
- await runLauncher({
358
- mode: filename.startsWith('king') ? 'king' : 'blun',
359
- noticeLease: noticeResult.lease,
360
- runtimeLease: runtimeResult?.lease,
361
- });
371
+ await runLauncher({
372
+ mode: filename.startsWith('king') ? 'king' : 'blun',
373
+ noticeLease: noticeResult.lease,
374
+ runtimeLease: runtimeResult?.lease,
375
+ skipUpdateNotice: runtimeResult?.acquired === true || !noticeResult.acquired,
376
+ });
362
377
  } finally {
363
378
  await runtimeResult?.lease?.release();
364
379
  await noticeResult.lease?.release();
@@ -10,8 +10,6 @@ const LAUNCHER_HELP_TEXT = [
10
10
  'Launchers:',
11
11
  ' blun Starts the CLI without automatically attaching Telegram.',
12
12
  ' king Starts the same CLI and automatically attaches the configured Telegram channel.',
13
- ' king <profile> starts an isolated named King profile.',
14
- ' king -c <profile> continues the last session in that profile.',
15
13
  ' Both use the same version, account, model, and commands.',
16
14
  ' blun tools list shows optional tools; enable writes only explicit choices.',
17
15
  '',
@@ -27,19 +25,13 @@ function launcherModeFromArgv(argv) {
27
25
  function createLauncherEnvironment(sourceEnv, mode, publicPackageVersion) {
28
26
  return {
29
27
  ...sourceEnv,
28
+ BLUN_NO_AUTO_UPDATE: '1',
30
29
  BLUN_PUBLIC_PACKAGE_VERSION: publicPackageVersion,
31
30
  BLUN_TELEGRAM_ATTACH: mode === LAUNCHER_MODES.KING ? 'on' : 'off',
32
31
  BLUN_TELEGRAM_HEADLESS: 'off',
33
32
  };
34
33
  }
35
34
 
36
- function createProtectedCoreEnvironment(sourceEnv) {
37
- return {
38
- ...sourceEnv,
39
- BLUN_NO_AUTO_UPDATE: '1',
40
- };
41
- }
42
-
43
35
  function isNpmPackageUpdateRequest(args) {
44
36
  if (!Array.isArray(args) || args.length !== 1) return false;
45
37
  const command = String(args[0] || '').toLowerCase();
@@ -53,7 +45,6 @@ function launcherHelpText() {
53
45
  module.exports = {
54
46
  LAUNCHER_MODES,
55
47
  createLauncherEnvironment,
56
- createProtectedCoreEnvironment,
57
48
  isNpmPackageUpdateRequest,
58
49
  launcherHelpText,
59
50
  launcherModeFromArgv,