shennian 0.5.35 → 0.5.36

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 (392) hide show
  1. package/README.md +16 -0
  2. package/dist/publish-build-manifest.json +47 -17
  3. package/dist/src/agents/acp/discovery.js +1 -1
  4. package/dist/src/agents/detect.js +1 -1
  5. package/dist/src/agents/model-values.js +1 -0
  6. package/dist/src/commands/config.js +1 -0
  7. package/dist/src/commands/local-apps.js +1 -0
  8. package/dist/src/index.js +3 -3
  9. package/dist/src/local-apps/service.js +1 -0
  10. package/dist/src/room/activation-service.js +7 -7
  11. package/dist/src/room/standalone-agent-turn.js +5 -0
  12. package/dist/src/session/handlers/chat-recovery.js +1 -1
  13. package/dist/src/session/handlers/chat.js +2 -2
  14. package/dist/src/session/handlers/local-apps.js +1 -0
  15. package/dist/src/session/manager.js +1 -1
  16. package/dist/src/session/queued-chat-dispatch.js +1 -1
  17. package/node_modules/@shennian/wire/dist/index.js +1 -1
  18. package/node_modules/@shennian/wire/dist/local-apps.js +5 -0
  19. package/node_modules/@sinclair/typebox/build/cjs/compiler/compiler.js +46 -26
  20. package/node_modules/@sinclair/typebox/build/cjs/parser/runtime/guard.d.ts +1 -1
  21. package/node_modules/@sinclair/typebox/build/cjs/parser/runtime/token.d.ts +2 -2
  22. package/node_modules/@sinclair/typebox/build/cjs/syntax/mapping.d.ts +1 -1
  23. package/node_modules/@sinclair/typebox/build/cjs/system/index.d.ts +0 -1
  24. package/node_modules/@sinclair/typebox/build/cjs/system/index.js +0 -1
  25. package/node_modules/@sinclair/typebox/build/cjs/type/object/object.d.ts +2 -2
  26. package/node_modules/@sinclair/typebox/build/cjs/type/object/object.js +2 -18
  27. package/node_modules/@sinclair/typebox/build/cjs/value/parse/parse.d.ts +1 -1
  28. package/node_modules/@sinclair/typebox/build/esm/compiler/compiler.mjs +47 -27
  29. package/node_modules/@sinclair/typebox/build/esm/parser/runtime/guard.d.mts +1 -1
  30. package/node_modules/@sinclair/typebox/build/esm/parser/runtime/token.d.mts +2 -2
  31. package/node_modules/@sinclair/typebox/build/esm/syntax/mapping.d.mts +1 -1
  32. package/node_modules/@sinclair/typebox/build/esm/system/index.d.mts +0 -1
  33. package/node_modules/@sinclair/typebox/build/esm/system/index.mjs +0 -1
  34. package/node_modules/@sinclair/typebox/build/esm/type/composite/composite.mjs +2 -2
  35. package/node_modules/@sinclair/typebox/build/esm/type/const/const.mjs +3 -3
  36. package/node_modules/@sinclair/typebox/build/esm/type/instantiate/instantiate.mjs +2 -2
  37. package/node_modules/@sinclair/typebox/build/esm/type/mapped/mapped.mjs +3 -3
  38. package/node_modules/@sinclair/typebox/build/esm/type/module/compute.mjs +2 -2
  39. package/node_modules/@sinclair/typebox/build/esm/type/object/object.d.mts +2 -2
  40. package/node_modules/@sinclair/typebox/build/esm/type/object/object.mjs +2 -18
  41. package/node_modules/@sinclair/typebox/build/esm/type/omit/omit.mjs +3 -3
  42. package/node_modules/@sinclair/typebox/build/esm/type/partial/partial.mjs +3 -3
  43. package/node_modules/@sinclair/typebox/build/esm/type/pick/pick.mjs +3 -3
  44. package/node_modules/@sinclair/typebox/build/esm/type/record/record.mjs +3 -3
  45. package/node_modules/@sinclair/typebox/build/esm/type/required/required.mjs +3 -3
  46. package/node_modules/@sinclair/typebox/build/esm/type/type/json.mjs +2 -2
  47. package/node_modules/@sinclair/typebox/build/esm/value/delta/delta.mjs +4 -4
  48. package/node_modules/@sinclair/typebox/build/esm/value/parse/parse.d.mts +1 -1
  49. package/node_modules/@sinclair/typebox/package.json +1 -1
  50. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.d.ts +17 -0
  51. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.js +4 -0
  52. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
  53. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
  54. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
  55. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
  56. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/package.json +54 -0
  57. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/readme.md +46 -0
  58. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/index.d.ts +29 -0
  59. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/index.js +47 -0
  60. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  61. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/README.md +73 -0
  62. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/es2015/index.js +6 -0
  63. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/es2015/text.js +6 -0
  64. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/index.d.ts +23 -0
  65. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/index.js +6 -0
  66. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/package.json +50 -0
  67. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex/text.js +6 -0
  68. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  69. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js +50 -0
  70. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json +42 -0
  71. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md +39 -0
  72. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/index.d.ts +17 -0
  73. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/index.js +4 -0
  74. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
  75. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
  76. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
  77. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
  78. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/package.json +54 -0
  79. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/readme.md +46 -0
  80. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/package.json +56 -0
  81. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/readme.md +50 -0
  82. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/index.d.ts +17 -0
  83. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/index.js +4 -0
  84. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
  85. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
  86. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex/license +9 -0
  87. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
  88. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
  89. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/package.json +54 -0
  90. package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/readme.md +46 -0
  91. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/license +9 -0
  92. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/license +9 -0
  93. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/license +9 -0
  94. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/license +9 -0
  95. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/p-try/license +9 -0
  96. package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists/license +9 -0
  97. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/index.d.ts +29 -0
  98. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/index.js +47 -0
  99. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/license +9 -0
  100. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  101. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/README.md +73 -0
  102. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/es2015/index.js +6 -0
  103. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/es2015/text.js +6 -0
  104. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/index.d.ts +23 -0
  105. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/index.js +6 -0
  106. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/package.json +50 -0
  107. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/text.js +6 -0
  108. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  109. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js +50 -0
  110. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/license +9 -0
  111. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json +42 -0
  112. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md +39 -0
  113. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.d.ts +17 -0
  114. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.js +4 -0
  115. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/license +9 -0
  116. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
  117. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
  118. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/license +9 -0
  119. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
  120. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
  121. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/package.json +54 -0
  122. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/readme.md +46 -0
  123. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/package.json +56 -0
  124. package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/readme.md +50 -0
  125. package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase/license +9 -0
  126. package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/index.js +13 -0
  127. package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/license +21 -0
  128. package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/package.json +38 -0
  129. package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/readme.md +48 -0
  130. package/node_modules/ws/lib/permessage-deflate.js +1 -3
  131. package/node_modules/ws/lib/receiver.js +0 -37
  132. package/node_modules/ws/lib/sender.js +1 -6
  133. package/node_modules/ws/lib/websocket-server.js +0 -8
  134. package/node_modules/ws/lib/websocket.js +3 -31
  135. package/node_modules/ws/package.json +1 -5
  136. package/package.json +1 -1
  137. package/node_modules/@sinclair/typebox/build/cjs/system/evaluate.d.ts +0 -5
  138. package/node_modules/@sinclair/typebox/build/cjs/system/evaluate.js +0 -11
  139. package/node_modules/@sinclair/typebox/build/esm/system/evaluate.d.mts +0 -5
  140. package/node_modules/@sinclair/typebox/build/esm/system/evaluate.mjs +0 -7
  141. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/.travis.yml +0 -0
  142. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/CONTRIBUTING.md +0 -0
  143. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/LICENSE.md +0 -0
  144. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/README.md +0 -0
  145. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/dijkstra.js +0 -0
  146. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/package.json +0 -0
  147. /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/test/dijkstra.test.js +0 -0
  148. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.eslintignore +0 -0
  149. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.eslintrc.json +0 -0
  150. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.prettierignore +0 -0
  151. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/LICENSE +0 -0
  152. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/README.md +0 -0
  153. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/browser.js +0 -0
  154. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/base.css +0 -0
  155. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/bitmapper.js.html +0 -0
  156. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/bitpacker.js.html +0 -0
  157. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/block-navigation.js +0 -0
  158. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/chunkstream.js.html +0 -0
  159. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/constants.js.html +0 -0
  160. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/crc.js.html +0 -0
  161. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/favicon.png +0 -0
  162. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-pack.js.html +0 -0
  163. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse-async.js.html +0 -0
  164. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse-sync.js.html +0 -0
  165. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse.js.html +0 -0
  166. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/format-normaliser.js.html +0 -0
  167. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/index.html +0 -0
  168. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/interlace.js.html +0 -0
  169. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer-async.js.html +0 -0
  170. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer-sync.js.html +0 -0
  171. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer.js.html +0 -0
  172. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/paeth-predictor.js.html +0 -0
  173. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser-async.js.html +0 -0
  174. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser-sync.js.html +0 -0
  175. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser.js.html +0 -0
  176. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/png-sync.js.html +0 -0
  177. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/png.js.html +0 -0
  178. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/prettify.css +0 -0
  179. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/prettify.js +0 -0
  180. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  181. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sorter.js +0 -0
  182. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sync-inflate.js.html +0 -0
  183. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sync-reader.js.html +0 -0
  184. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov.info +0 -0
  185. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/bitmapper.js +0 -0
  186. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/bitpacker.js +0 -0
  187. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/chunkstream.js +0 -0
  188. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/constants.js +0 -0
  189. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/crc.js +0 -0
  190. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-pack.js +0 -0
  191. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse-async.js +0 -0
  192. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse-sync.js +0 -0
  193. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse.js +0 -0
  194. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/format-normaliser.js +0 -0
  195. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/interlace.js +0 -0
  196. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer-async.js +0 -0
  197. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer-sync.js +0 -0
  198. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer.js +0 -0
  199. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/paeth-predictor.js +0 -0
  200. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser-async.js +0 -0
  201. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser-sync.js +0 -0
  202. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser.js +0 -0
  203. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/png-sync.js +0 -0
  204. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/png.js +0 -0
  205. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/sync-inflate.js +0 -0
  206. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/sync-reader.js +0 -0
  207. /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/package.json +0 -0
  208. /package/node_modules/{yargs → qrcode/node_modules/yargs}/LICENSE +0 -0
  209. /package/node_modules/{yargs → qrcode/node_modules/yargs}/README.md +0 -0
  210. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/apply-extends.d.ts +0 -0
  211. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/apply-extends.js +0 -0
  212. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/argsert.d.ts +0 -0
  213. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/argsert.js +0 -0
  214. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/command.d.ts +0 -0
  215. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/command.js +0 -0
  216. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/common-types.d.ts +0 -0
  217. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/common-types.js +0 -0
  218. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion-templates.d.ts +0 -0
  219. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion-templates.js +0 -0
  220. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion.d.ts +0 -0
  221. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion.js +0 -0
  222. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/is-promise.d.ts +0 -0
  223. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/is-promise.js +0 -0
  224. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/levenshtein.d.ts +0 -0
  225. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/levenshtein.js +0 -0
  226. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/middleware.d.ts +0 -0
  227. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/middleware.js +0 -0
  228. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/obj-filter.d.ts +0 -0
  229. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/obj-filter.js +0 -0
  230. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/parse-command.d.ts +0 -0
  231. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/parse-command.js +0 -0
  232. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/process-argv.d.ts +0 -0
  233. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/process-argv.js +0 -0
  234. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/usage.d.ts +0 -0
  235. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/usage.js +0 -0
  236. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/validation.d.ts +0 -0
  237. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/validation.js +0 -0
  238. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yargs.d.ts +0 -0
  239. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yargs.js +0 -0
  240. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yerror.d.ts +0 -0
  241. /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yerror.js +0 -0
  242. /package/node_modules/{yargs → qrcode/node_modules/yargs}/index.js +0 -0
  243. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/be.json +0 -0
  244. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/de.json +0 -0
  245. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/en.json +0 -0
  246. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/es.json +0 -0
  247. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/fi.json +0 -0
  248. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/fr.json +0 -0
  249. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/hi.json +0 -0
  250. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/hu.json +0 -0
  251. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/id.json +0 -0
  252. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/it.json +0 -0
  253. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ja.json +0 -0
  254. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ko.json +0 -0
  255. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nb.json +0 -0
  256. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nl.json +0 -0
  257. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nn.json +0 -0
  258. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pirate.json +0 -0
  259. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pl.json +0 -0
  260. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pt.json +0 -0
  261. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pt_BR.json +0 -0
  262. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ru.json +0 -0
  263. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/th.json +0 -0
  264. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/tr.json +0 -0
  265. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/zh_CN.json +0 -0
  266. /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/zh_TW.json +0 -0
  267. /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/LICENSE.txt +0 -0
  268. /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/README.md +0 -0
  269. /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/index.js +0 -0
  270. /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/index.d.ts +0 -0
  271. /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/index.js +0 -0
  272. /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/license +0 -0
  273. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/LICENSE-MIT.txt +0 -0
  274. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/README.md +0 -0
  275. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/es2015/index.js +0 -0
  276. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/es2015/text.js +0 -0
  277. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/index.d.ts +0 -0
  278. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/index.js +0 -0
  279. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/package.json +0 -0
  280. /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/text.js +0 -0
  281. /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/is-fullwidth-code-point}/index.d.ts +0 -0
  282. /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/is-fullwidth-code-point}/index.js +0 -0
  283. /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/is-fullwidth-code-point}/license +0 -0
  284. /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/is-fullwidth-code-point}/package.json +0 -0
  285. /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/is-fullwidth-code-point}/readme.md +0 -0
  286. /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/index.d.ts +0 -0
  287. /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/index.js +0 -0
  288. /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/license +0 -0
  289. /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/index.d.ts +0 -0
  290. /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/index.js +0 -0
  291. /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/license +0 -0
  292. /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/package.json +0 -0
  293. /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/readme.md +0 -0
  294. /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/package.json +0 -0
  295. /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/readme.md +0 -0
  296. /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/package.json +0 -0
  297. /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/readme.md +0 -0
  298. /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi}/license +0 -0
  299. /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex}/license +0 -0
  300. /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/index.js +0 -0
  301. /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/license +0 -0
  302. /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/index.d.ts +0 -0
  303. /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/index.js +0 -0
  304. /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/license +0 -0
  305. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/LICENSE +0 -0
  306. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/README.md +0 -0
  307. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/conversions.js +0 -0
  308. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/index.js +0 -0
  309. /package/node_modules/{color-name → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name}/LICENSE +0 -0
  310. /package/node_modules/{color-name → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name}/README.md +0 -0
  311. /package/node_modules/{color-name → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name}/index.js +0 -0
  312. /package/node_modules/{color-name → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name}/package.json +0 -0
  313. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/package.json +0 -0
  314. /package/node_modules/{color-convert → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles/node_modules/color-convert}/route.js +0 -0
  315. /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/package.json +0 -0
  316. /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/readme.md +0 -0
  317. /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width}/license +0 -0
  318. /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/is-fullwidth-code-point}/license +0 -0
  319. /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi}/license +0 -0
  320. /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex}/license +0 -0
  321. /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi}/license +0 -0
  322. /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/package.json +0 -0
  323. /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/readme.md +0 -0
  324. /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/package.json +0 -0
  325. /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/index.js +0 -0
  326. /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/license +0 -0
  327. /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/package.json +0 -0
  328. /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/readme.md +0 -0
  329. /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/index.d.ts +0 -0
  330. /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/index.js +0 -0
  331. /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/index.d.ts +0 -0
  332. /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/index.js +0 -0
  333. /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate}/index.d.ts +0 -0
  334. /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate}/index.js +0 -0
  335. /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit}/index.d.ts +0 -0
  336. /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit}/index.js +0 -0
  337. /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/p-try}/index.d.ts +0 -0
  338. /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/p-try}/index.js +0 -0
  339. /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/p-try}/package.json +0 -0
  340. /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/p-try}/readme.md +0 -0
  341. /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit}/package.json +0 -0
  342. /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit}/readme.md +0 -0
  343. /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate}/package.json +0 -0
  344. /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate}/readme.md +0 -0
  345. /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/package.json +0 -0
  346. /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/readme.md +0 -0
  347. /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/index.d.ts +0 -0
  348. /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/index.js +0 -0
  349. /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/package.json +0 -0
  350. /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/readme.md +0 -0
  351. /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/package.json +0 -0
  352. /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/readme.md +0 -0
  353. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/LICENSE.md +0 -0
  354. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/README.md +0 -0
  355. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.d.ts +0 -0
  356. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.js +0 -0
  357. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.js.map +0 -0
  358. /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/package.json +0 -0
  359. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.jshintrc +0 -0
  360. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.npmignore +0 -0
  361. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.travis.yml +0 -0
  362. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/LICENSE +0 -0
  363. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/README.markdown +0 -0
  364. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/index.js +0 -0
  365. /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/package.json +0 -0
  366. /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/LICENSE.txt +0 -0
  367. /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/README.md +0 -0
  368. /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/index.js +0 -0
  369. /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/package.json +0 -0
  370. /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/LICENSE.txt +0 -0
  371. /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/README.md +0 -0
  372. /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/index.js +0 -0
  373. /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/package.json +0 -0
  374. /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/LICENSE +0 -0
  375. /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/README.md +0 -0
  376. /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/index.js +0 -0
  377. /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/package.json +0 -0
  378. /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/LICENSE +0 -0
  379. /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/README.md +0 -0
  380. /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/index.js +0 -0
  381. /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/package.json +0 -0
  382. /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/LICENSE.txt +0 -0
  383. /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/README.md +0 -0
  384. /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/index.js +0 -0
  385. /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/lib/tokenize-arg-string.js +0 -0
  386. /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/index.d.ts +0 -0
  387. /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/index.js +0 -0
  388. /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/package.json +0 -0
  389. /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/readme.md +0 -0
  390. /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/package.json +0 -0
  391. /package/node_modules/{yargs → qrcode/node_modules/yargs}/package.json +0 -0
  392. /package/node_modules/{yargs → qrcode/node_modules/yargs}/yargs.js +0 -0
package/README.md CHANGED
@@ -54,3 +54,19 @@ npx tsx src/__tests__/agents-e2e.ts claude
54
54
  ## 依赖
55
55
 
56
56
  - `@shennian/wire` — 协议类型定义
57
+
58
+ ## 本地应用(开发候选,需支持该能力的 Client 与手机 App)
59
+
60
+ 应用文件和业务数据保存在本人机器,不公开分享,不存云端 HTML 版本。将服务绑定到 `127.0.0.1`,以相对资源路径构建 HTML/JS/CSS;神念云端只负责鉴权与转发。
61
+
62
+ ```bash
63
+ shennian local-apps register --title "我的应用" --port 5173 --path / --directory /absolute/project
64
+ shennian local-apps list
65
+ shennian local-apps remove <app-id>
66
+ ```
67
+
68
+ 更新登记用相同 `--id <app-id>`;移除不删应用文件。页面使用 `await shennian.personal.service(machineId, 5173, 'POST', '/api/action', { value: 1 })`,返回 `{ status, headers, body }`。仅支持本人已登记的应用端口及 GET/POST/DELETE,不传递系统凭据,不自动重试写入。业务数据何时保存由自己的服务决定;展开、输入、动画不触发 HTML 保存。
69
+
70
+ 当前首期不代理 WebSocket/HMR,修改后在手机中刷新。详细约束见仓库 `docs/architecture/local-apps.md` 与 `docs/engineering/local-dev.md`;实际是否已发布以发布记录为准。
71
+
72
+ 用户问起本地应用的配置或连接时,AI 可用 `shennian local-apps inspect <id>` 按需读取元信息(不返回机器凭据),用 `shennian local-apps doctor <id>` 只读检查指定入口。诊断只做已登记端口的单次 GET,不扫描端口、自动修复或返回页面内容。`check: local_entry_http` 的成功不等于云端/手机整条链路健康;只有用户授权后再执行修复。
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "jsMinified": true,
4
4
  "minifier": "esbuild",
5
- "fileCount": 288,
5
+ "fileCount": 294,
6
6
  "files": [
7
7
  {
8
8
  "file": "bin/shennian-adapter-host.js",
@@ -81,8 +81,8 @@
81
81
  },
82
82
  {
83
83
  "file": "src/agents/acp/discovery.js",
84
- "beforeBytes": 11154,
85
- "afterBytes": 5045
84
+ "beforeBytes": 11532,
85
+ "afterBytes": 5226
86
86
  },
87
87
  {
88
88
  "file": "src/agents/acp/events.js",
@@ -236,8 +236,8 @@
236
236
  },
237
237
  {
238
238
  "file": "src/agents/detect.js",
239
- "beforeBytes": 5211,
240
- "afterBytes": 2494
239
+ "beforeBytes": 5184,
240
+ "afterBytes": 2481
241
241
  },
242
242
  {
243
243
  "file": "src/agents/event-terminal-gate.js",
@@ -299,6 +299,11 @@
299
299
  "beforeBytes": 986,
300
300
  "afterBytes": 928
301
301
  },
302
+ {
303
+ "file": "src/agents/model-values.js",
304
+ "beforeBytes": 938,
305
+ "afterBytes": 441
306
+ },
302
307
  {
303
308
  "file": "src/agents/native-capabilities.js",
304
309
  "beforeBytes": 9705,
@@ -459,6 +464,11 @@
459
464
  "beforeBytes": 963,
460
465
  "afterBytes": 465
461
466
  },
467
+ {
468
+ "file": "src/commands/config.js",
469
+ "beforeBytes": 1978,
470
+ "afterBytes": 1280
471
+ },
462
472
  {
463
473
  "file": "src/commands/contact.js",
464
474
  "beforeBytes": 2049,
@@ -514,6 +524,11 @@
514
524
  "beforeBytes": 827,
515
525
  "afterBytes": 468
516
526
  },
527
+ {
528
+ "file": "src/commands/local-apps.js",
529
+ "beforeBytes": 1570,
530
+ "afterBytes": 1343
531
+ },
517
532
  {
518
533
  "file": "src/commands/logout.js",
519
534
  "beforeBytes": 3040,
@@ -691,8 +706,13 @@
691
706
  },
692
707
  {
693
708
  "file": "src/index.js",
694
- "beforeBytes": 47391,
695
- "afterBytes": 23200
709
+ "beforeBytes": 46127,
710
+ "afterBytes": 22372
711
+ },
712
+ {
713
+ "file": "src/local-apps/service.js",
714
+ "beforeBytes": 8585,
715
+ "afterBytes": 4545
696
716
  },
697
717
  {
698
718
  "file": "src/log-redaction.js",
@@ -886,8 +906,8 @@
886
906
  },
887
907
  {
888
908
  "file": "src/room/activation-service.js",
889
- "beforeBytes": 29557,
890
- "afterBytes": 16983
909
+ "beforeBytes": 29888,
910
+ "afterBytes": 17070
891
911
  },
892
912
  {
893
913
  "file": "src/room/attachment-cache.js",
@@ -999,6 +1019,11 @@
999
1019
  "beforeBytes": 30639,
1000
1020
  "afterBytes": 17210
1001
1021
  },
1022
+ {
1023
+ "file": "src/room/standalone-agent-turn.js",
1024
+ "beforeBytes": 4069,
1025
+ "afterBytes": 2697
1026
+ },
1002
1027
  {
1003
1028
  "file": "src/room/wait-for-messages.js",
1004
1029
  "beforeBytes": 946,
@@ -1131,8 +1156,8 @@
1131
1156
  },
1132
1157
  {
1133
1158
  "file": "src/session/handlers/chat-recovery.js",
1134
- "beforeBytes": 6918,
1135
- "afterBytes": 3623
1159
+ "beforeBytes": 7020,
1160
+ "afterBytes": 3691
1136
1161
  },
1137
1162
  {
1138
1163
  "file": "src/session/handlers/chat-session-lifecycle.js",
@@ -1141,8 +1166,8 @@
1141
1166
  },
1142
1167
  {
1143
1168
  "file": "src/session/handlers/chat.js",
1144
- "beforeBytes": 36868,
1145
- "afterBytes": 15693
1169
+ "beforeBytes": 37156,
1170
+ "afterBytes": 15831
1146
1171
  },
1147
1172
  {
1148
1173
  "file": "src/session/handlers/codex-settings.js",
@@ -1159,6 +1184,11 @@
1159
1184
  "beforeBytes": 21969,
1160
1185
  "afterBytes": 10405
1161
1186
  },
1187
+ {
1188
+ "file": "src/session/handlers/local-apps.js",
1189
+ "beforeBytes": 930,
1190
+ "afterBytes": 587
1191
+ },
1162
1192
  {
1163
1193
  "file": "src/session/handlers/message-status.js",
1164
1194
  "beforeBytes": 676,
@@ -1221,8 +1251,8 @@
1221
1251
  },
1222
1252
  {
1223
1253
  "file": "src/session/manager.js",
1224
- "beforeBytes": 42129,
1225
- "afterBytes": 22145
1254
+ "beforeBytes": 42449,
1255
+ "afterBytes": 22329
1226
1256
  },
1227
1257
  {
1228
1258
  "file": "src/session/native-cleanup-outbox.js",
@@ -1291,8 +1321,8 @@
1291
1321
  },
1292
1322
  {
1293
1323
  "file": "src/session/queued-chat-dispatch.js",
1294
- "beforeBytes": 3189,
1295
- "afterBytes": 1809
1324
+ "beforeBytes": 3251,
1325
+ "afterBytes": 1844
1296
1326
  },
1297
1327
  {
1298
1328
  "file": "src/session/room-reply-notice.js",
@@ -1 +1 @@
1
- import{RequestError as P}from"@agentclientprotocol/sdk";import{buildCommandStringLaunchSpec as D,commandExists as L,resolveCommandFileIdentity as N,resolveCommandFilePath as _}from"../command-spec.js";import{registerAcpAgent as B}from"./adapter.js";import{getRegisteredAgents as q,unregisterAgent as K}from"../adapter.js";import{readAcpManifests as U}from"./manifests.js";import{AcpProcessClient as H}from"./process-client.js";import{acpAgentType as p}from"./types.js";import{loadAcpCatalog as O}from"./catalog.js";import{buildAcpCapabilityCacheKey as W,readAcpCapabilityCache as $,writeAcpCapabilityCache as V}from"./capability-cache.js";import{getAcpRuntimeAuthState as k,setAcpRuntimeAuthState as j}from"./auth-state.js";import{recordAcpScan as z}from"./metrics.js";import{fingerprintNativeExecutable as G}from"../../security/managed-agent-executable.js";const J=[{id:"qwen-code",name:"Qwen Code",source:"registry",launch:{command:"qwen",args:["--acp"]}},{id:"kimi",name:"Kimi CLI",source:"registry",launch:{command:"kimi",args:["acp"]}},{id:"dsh",name:"DSH",source:"registry",launch:{command:"dsh",args:["--profile","acp"]}}];let A=[];function de(){return A.map(t=>({...t,args:[...t.args]}))}const Q=new Set(["claude","codex","codebuddy","cursor","opencode","pi"]);async function fe(t={}){const a=Date.now();let o=0,n=0;const r={},g=new Set(q().filter(e=>e.startsWith("acp:"))),l=t.candidates?{candidates:t.candidates,revision:void 0}:await O(t),S=Y([...l.candidates.length?l.candidates:J,...U()]).filter(e=>!t.agentType||p(e.id)===t.agentType),M=S.filter(e=>{const s=e.launch.command;return Q.has(s)?!1:L(s)}).filter((e,s,d)=>d.findIndex(C=>C.id===e.id)===s),b=[],y=(await Z(M,3,async e=>{const s=_(e.launch.command),d=s?G(s):void 0,u={...D(e.launch.command,e.launch.args??[],t.cwd??process.cwd()),...e.launch.env?{env:e.launch.env}:{}},v=W({manifest:e,platform:process.platform,catalogRevision:l.revision,executableIdentity:N(e.launch.command)}),f=v?$(v):null;if(f?.type===p(e.id)&&f.integration==="acp"&&f.acpCapabilities?.protocolVersion===1)return o+=1,B({...e,launch:u,authLaunch:e.launch}),{...f,authState:k(p(e.id))??f.authState,command:u.command,args:u.args??[],executableFingerprint:d,display:{...f.display,name:e.name},...l.revision?{catalogRevision:l.revision}:{}};const w=new H(u,{onSessionUpdate:()=>{},onPermission:async()=>({outcome:{outcome:"cancelled"}})},process.env,{terminalAuth:!0});try{const c=await w.start(t.cwd??process.cwd()),i=c.agentCapabilities??{},F={protocolVersion:1,listSessions:!!i.sessionCapabilities?.list,loadSession:!!i.loadSession,resumeSession:!!i.sessionCapabilities?.resume,closeSession:!!i.sessionCapabilities?.close,deleteSession:!!i.sessionCapabilities?.delete,terminal:!!e.clientCapabilities?.terminal,fileRead:!!e.clientCapabilities?.readTextFile,fileWrite:!!e.clientCapabilities?.writeTextFile,permission:!0,modelConfig:!1};let h=c.authMethods?.length?"unknown":"ready";if(i.sessionCapabilities?.list)try{await w.listSessions(t.cwd??process.cwd()),h=c.authMethods?.length?"unknown":"ready"}catch(m){h=m instanceof P&&m.code===-32e3?"required":"unknown"}const I=k(p(e.id));I?h=I:h==="required"&&j(p(e.id),h),B({...e,launch:u,authLaunch:e.launch});const T={type:p(e.id),command:u.command,args:u.args??[],version:c.agentInfo?.version??void 0,runtimePlatform:process.platform,executableFingerprint:d,integration:"acp",display:{name:e.name,version:c.agentInfo?.version??void 0},acpCapabilities:F,authState:h,acpAuthMethods:(c.authMethods??[]).slice(0,8).map(m=>({id:m.id.slice(0,128),name:m.name.slice(0,80),type:"type"in m&&m.type==="terminal"?"terminal":"agent"})),...l.revision?{catalogRevision:l.revision}:{}};return v&&V(v,T),T}catch(c){n+=1;const i=X(c);return r[i]=(r[i]??0)+1,b.push({type:p(e.id),name:e.name,command:e.launch.command,args:[...e.launch.args??[]],reason:i}),null}finally{await w.close()}})).filter(e=>!!e),R=new Set(y.map(e=>e.type)),x=b.filter((e,s,d)=>!R.has(e.type)&&d.findIndex(C=>C.type===e.type)===s);A=t.agentType?[...A.filter(e=>e.type!==t.agentType),...x]:x;const E=new Set(y.map(e=>e.type));for(const e of g)E.has(e)||K(e);return z({durationMs:Date.now()-a,candidateCount:S.length,installedCount:y.length,cacheHits:o,handshakeFailures:n,handshakeFailuresByKind:r}),y}function X(t){const a=t instanceof Error?t.message:"";return/timed out/i.test(a)?"timeout":/protocol version/i.test(a)?"version":/safety limit|exceeded/i.test(a)?"output_limit":/json|parse/i.test(a)?"invalid_protocol":/enoent|not found/i.test(a)?"launch":"other"}function Y(t){const a=new Set(t.filter(n=>n.source==="local").map(n=>n.id)),o=new Map;for(const n of t){if(n.source!=="local"&&a.has(n.id))continue;const r=`${n.id}\0${n.launch.command}\0${JSON.stringify(n.launch.args??[])}`;o.has(r)||o.set(r,n)}return[...o.values()]}async function Z(t,a,o){const n=new Array(t.length);let r=0;return await Promise.all(Array.from({length:Math.min(a,t.length)},async()=>{for(;;){const g=r++;if(g>=t.length)return;n[g]=await o(t[g])}})),n}export{fe as discoverAcpAgents,de as getUnavailableAcpAgents};
1
+ import{RequestError as E}from"@agentclientprotocol/sdk";import{buildCommandStringLaunchSpec as F,commandExists as P,resolveCommandFileIdentity as D,resolveCommandFilePath as N}from"../command-spec.js";import{registerAcpAgent as B}from"./adapter.js";import{getRegisteredAgents as _,unregisterAgent as K}from"../adapter.js";import{readAcpManifests as U}from"./manifests.js";import{AcpProcessClient as H}from"./process-client.js";import{acpAgentType as d}from"./types.js";import{loadAcpCatalog as O}from"./catalog.js";import{buildAcpCapabilityCacheKey as Q,readAcpCapabilityCache as W,writeAcpCapabilityCache as $}from"./capability-cache.js";import{getAcpRuntimeAuthState as k,setAcpRuntimeAuthState as V}from"./auth-state.js";import{recordAcpScan as j}from"./metrics.js";import{fingerprintNativeExecutable as z}from"../../security/managed-agent-executable.js";const G=[{id:"qwen-code",name:"Qwen Code",source:"registry",launch:{command:"qwen",args:["--acp"]}},{id:"kimi",name:"Kimi CLI",source:"registry",launch:{command:"kimi",args:["acp"]}},{id:"dsh",name:"DSH",source:"registry",launch:{command:"dsh",args:["--profile","acp"]}},{id:"qoder",name:"Qoder CLI",source:"registry",launch:{command:"qoder",args:["--acp"]}},{id:"qoder",name:"Qoder CLI",source:"registry",launch:{command:"qoderclicn",args:["--acp"]}}];let A=[];function pe(){return A.map(t=>({...t,args:[...t.args]}))}const J=new Set(["claude","codex","codebuddy","cursor","opencode","pi"]);async function fe(t={}){const a=Date.now();let o=0,n=0;const r={},g=new Set(_().filter(e=>e.startsWith("acp:"))),l=t.candidates?{candidates:t.candidates,revision:void 0}:await O(t),S=Y([...l.candidates.length?l.candidates:G,...U()]).filter(e=>!t.agentType||d(e.id)===t.agentType),M=S.filter(e=>{const s=e.launch.command;return J.has(s)?!1:P(s)}).filter((e,s,p)=>p.findIndex(C=>C.id===e.id)===s),b=[],y=(await Z(M,3,async e=>{const s=N(e.launch.command),p=s?z(s):void 0,u={...F(e.launch.command,e.launch.args??[],t.cwd??process.cwd()),...e.launch.env?{env:e.launch.env}:{}},v=Q({manifest:e,platform:process.platform,catalogRevision:l.revision,executableIdentity:D(e.launch.command)}),f=v?W(v):null;if(f?.type===d(e.id)&&f.integration==="acp"&&f.acpCapabilities?.protocolVersion===1)return o+=1,B({...e,launch:u,authLaunch:e.launch}),{...f,authState:k(d(e.id))??f.authState,command:u.command,args:u.args??[],executableFingerprint:p,display:{...f.display,name:e.name},...l.revision?{catalogRevision:l.revision}:{}};const w=new H(u,{onSessionUpdate:()=>{},onPermission:async()=>({outcome:{outcome:"cancelled"}})},process.env,{terminalAuth:!0});try{const c=await w.start(t.cwd??process.cwd()),i=c.agentCapabilities??{},L={protocolVersion:1,listSessions:!!i.sessionCapabilities?.list,loadSession:!!i.loadSession,resumeSession:!!i.sessionCapabilities?.resume,closeSession:!!i.sessionCapabilities?.close,deleteSession:!!i.sessionCapabilities?.delete,terminal:!!e.clientCapabilities?.terminal,fileRead:!!e.clientCapabilities?.readTextFile,fileWrite:!!e.clientCapabilities?.writeTextFile,permission:!0,modelConfig:!1};let h=c.authMethods?.length?"unknown":"ready";if(i.sessionCapabilities?.list)try{await w.listSessions(t.cwd??process.cwd()),h=c.authMethods?.length?"unknown":"ready"}catch(m){h=m instanceof E&&m.code===-32e3?"required":"unknown"}const x=k(d(e.id));x?h=x:h==="required"&&V(d(e.id),h),B({...e,launch:u,authLaunch:e.launch});const T={type:d(e.id),command:u.command,args:u.args??[],version:c.agentInfo?.version??void 0,runtimePlatform:process.platform,executableFingerprint:p,integration:"acp",display:{name:e.name,version:c.agentInfo?.version??void 0},acpCapabilities:L,authState:h,acpAuthMethods:(c.authMethods??[]).slice(0,8).map(m=>({id:m.id.slice(0,128),name:m.name.slice(0,80),type:"type"in m&&m.type==="terminal"?"terminal":"agent"})),...l.revision?{catalogRevision:l.revision}:{}};return v&&$(v,T),T}catch(c){n+=1;const i=X(c);return r[i]=(r[i]??0)+1,b.push({type:d(e.id),name:e.name,command:e.launch.command,args:[...e.launch.args??[]],reason:i}),null}finally{await w.close()}})).filter(e=>!!e),R=new Set(y.map(e=>e.type)),I=b.filter((e,s,p)=>!R.has(e.type)&&p.findIndex(C=>C.type===e.type)===s);A=t.agentType?[...A.filter(e=>e.type!==t.agentType),...I]:I;const q=new Set(y.map(e=>e.type));for(const e of g)q.has(e)||K(e);return j({durationMs:Date.now()-a,candidateCount:S.length,installedCount:y.length,cacheHits:o,handshakeFailures:n,handshakeFailuresByKind:r}),y}function X(t){const a=t instanceof Error?t.message:"";return/timed out/i.test(a)?"timeout":/protocol version/i.test(a)?"version":/safety limit|exceeded/i.test(a)?"output_limit":/json|parse/i.test(a)?"invalid_protocol":/enoent|not found/i.test(a)?"launch":"other"}function Y(t){const a=new Set(t.filter(n=>n.source==="local").map(n=>n.id)),o=new Map;for(const n of t){if(n.source!=="local"&&a.has(n.id))continue;const r=`${n.id}\0${n.launch.command}\0${JSON.stringify(n.launch.args??[])}`;o.has(r)||o.set(r,n)}return[...o.values()]}async function Z(t,a,o){const n=new Array(t.length);let r=0;return await Promise.all(Array.from({length:Math.min(a,t.length)},async()=>{for(;;){const g=r++;if(g>=t.length)return;n[g]=await o(t[g])}})),n}export{fe as discoverAcpAgents,pe as getUnavailableAcpAgents};
@@ -1 +1 @@
1
- import{probeBuiltinAuthStatus as m}from"./auth-status.js";import{AVAILABLE_BUILTIN_AGENT_TYPES as u}from"@shennian/wire";import{loadConfig as l}from"../config/index.js";import{getBuiltinAgentVersion as p,resolveBuiltinCommand as f}from"./command-spec.js";import{registerCustomRuntimeSecurity as d,resolveCustomRuntimeExecutableFingerprint as g}from"./custom-managed-runtime.js";import{resolveManagedAgentExecutableIdentity as y}from"../security/managed-agent-executable.js";import{discoverAcpAgents as A}from"./acp/discovery.js";import{listNodeAdapters as T}from"../adapter-kit/registry.js";import{syncNodeAdapterAgents as v}from"./node-adapter.js";const h=u.filter(e=>e!=="pi");function x(e,o){const i=e?.match(/(?:^|v)(\d+)\.(\d+)\.(\d+)/);if(!i)return!1;const s=i.slice(1,4).map(Number);for(let a=0;a<o.length;a+=1)if(s[a]!==o[a])return s[a]>o[a];return!0}function S(e){return x(e,[0,85,0])}function b(e){const o=e.models?.length?e.models:e.model?[e.model]:[],i=e.defaultModel??e.model;return o.map(s=>({id:s,name:s,isDefault:s===i}))}async function M(e={}){const o=[];for(const n of h){if(e.agentType&&e.agentType!==n)continue;const t=f(n);if(!t)continue;const r=p(n,t);if((n==="codex"||n==="claude")&&!r||n==="pi-coding-agent"&&!S(r))continue;const c=y(t);o.push({type:n,command:t.command,args:t.args,version:r,runtimePlatform:c.platform,runtimeIsWsl:c.isWsl,executableFingerprint:c.executableFingerprint,authState:await m(n,t,r)})}const i=l(),s=new Set(Object.keys(i.customAgents??{}));for(const[n,t]of Object.entries(i.customAgents??{})){const r=`custom:${n}`;e.agentType&&e.agentType!==r||(d(r,t),o.push({type:r,command:t.command,args:[],version:t.caps.version,runtimePlatform:process.platform,runtimeIsWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:g(t),models:b(t.caps)}))}const a=T();v(a,s);for(const[n,t]of Object.entries(a)){if(s.has(n))continue;const r=`custom:${n}`;e.agentType&&e.agentType!==r||o.push({type:r,command:process.execPath,args:[],version:t.version,runtimePlatform:process.platform,runtimeIsWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:t.entrySha256,models:t.models.map(c=>({id:c,name:c,isDefault:c===t.defaultModel})),display:{name:t.name,version:t.version},authState:"ready",nodeAdapter:t})}return(!e.agentType||e.agentType.startsWith("acp:"))&&o.push(...await A(e)),o}export{M as detectAgents,S as isPiCodingAgentRuntimeCompatible};
1
+ import{normalizeAgentModels as m}from"./model-values.js";import{probeBuiltinAuthStatus as u}from"./auth-status.js";import{AVAILABLE_BUILTIN_AGENT_TYPES as l}from"@shennian/wire";import{loadConfig as p}from"../config/index.js";import{getBuiltinAgentVersion as d,resolveBuiltinCommand as f}from"./command-spec.js";import{registerCustomRuntimeSecurity as g,resolveCustomRuntimeExecutableFingerprint as y}from"./custom-managed-runtime.js";import{resolveManagedAgentExecutableIdentity as A}from"../security/managed-agent-executable.js";import{discoverAcpAgents as T}from"./acp/discovery.js";import{listNodeAdapters as v}from"../adapter-kit/registry.js";import{syncNodeAdapterAgents as h}from"./node-adapter.js";const x=l.filter(e=>e!=="pi");function S(e,o){const i=e?.match(/(?:^|v)(\d+)\.(\d+)\.(\d+)/);if(!i)return!1;const a=i.slice(1,4).map(Number);for(let s=0;s<o.length;s+=1)if(a[s]!==o[s])return a[s]>o[s];return!0}function b(e){return S(e,[0,85,0])}function I(e){const o=e.models?.length?e.models:e.model?[e.model]:[],i=e.defaultModel??e.model;return m(o,i)}async function R(e={}){const o=[];for(const n of x){if(e.agentType&&e.agentType!==n)continue;const t=f(n);if(!t)continue;const r=d(n,t);if((n==="codex"||n==="claude")&&!r||n==="pi-coding-agent"&&!b(r))continue;const c=A(t);o.push({type:n,command:t.command,args:t.args,version:r,runtimePlatform:c.platform,runtimeIsWsl:c.isWsl,executableFingerprint:c.executableFingerprint,authState:await u(n,t,r)})}const i=p(),a=new Set(Object.keys(i.customAgents??{}));for(const[n,t]of Object.entries(i.customAgents??{})){const r=`custom:${n}`;e.agentType&&e.agentType!==r||(g(r,t),o.push({type:r,command:t.command,args:[],version:t.caps.version,runtimePlatform:process.platform,runtimeIsWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:y(t),models:I(t.caps)}))}const s=v();h(s,a);for(const[n,t]of Object.entries(s)){if(a.has(n))continue;const r=`custom:${n}`;e.agentType&&e.agentType!==r||o.push({type:r,command:process.execPath,args:[],version:t.version,runtimePlatform:process.platform,runtimeIsWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:t.entrySha256,models:m(t.models,t.defaultModel),display:{name:t.name,version:t.version},authState:"ready",nodeAdapter:t})}return(!e.agentType||e.agentType.startsWith("acp:"))&&o.push(...await T(e)),o}export{R as detectAgents,b as isPiCodingAgentRuntimeCompatible};
@@ -0,0 +1 @@
1
+ function s(n,d){if(!Array.isArray(n))return[];const f=e(d),i=new Set;return n.flatMap(t=>{const r=e(t);if(!r||i.has(r))return[];i.add(r);const o=t&&typeof t=="object"&&typeof t.name=="string"&&t.name.trim()?t.name:r;return[{id:r,name:o,isDefault:r===f}]})}function e(n){if(typeof n=="string")return n.trim()?n:void 0;if(n&&typeof n=="object"&&"id"in n&&typeof n.id=="string")return n.id.trim()?n.id:void 0}export{s as normalizeAgentModels};
@@ -0,0 +1 @@
1
+ import r from"chalk";import{loadConfig as s,saveConfig as g,getConfigPath as a}from"../config/index.js";import{collectKnownLogSecrets as f,sanitizeCliLogValue as m}from"../log-redaction.js";import{SERVERS as c,regionToUrl as u,urlToRegion as d}from"../region.js";function b(l){const i=l.command("config").description("View or modify configuration");i.command("show",{isDefault:!0}).description("Show current configuration").action(()=>{console.log(`Config file: ${a()}`);const o=s(),e=m(o,f(process.env,o));if(o.serverUrl){const n=d(o.serverUrl);console.log(`Region: ${n} (${c[n].label})`)}console.log(JSON.stringify(e,null,2))}),i.command("set").description("Update a config value").argument("<key>",'Config key (e.g. "server")').argument("<value>",'Config value (e.g. "cn" or "global")').action((o,e)=>{const n=s();if(o==="server"){e!=="cn"&&e!=="global"&&(console.error(r.red('\u2717 Value must be "cn" or "global"')),process.exit(1));const t=e;n.serverUrl=u(t),g(n),console.log(r.green(`\u2713 Server set to ${c[t].label}`)),console.log(r.yellow(" Restart the background service for this to take effect: shennian stop && shennian start"));return}console.error(r.red(`\u2717 Unknown config key: ${o}. Supported: server`)),process.exit(1)})}export{b as registerConfigCommand};
@@ -0,0 +1 @@
1
+ import{loadConfig as a}from"../config/index.js";import{localApps as t}from"../local-apps/service.js";function c(e){const o=e.command("local-apps").description("Manage your private local applications (no cloud HTML or sharing)");o.command("list").action(async()=>console.log(JSON.stringify({apps:await t.list()}))),o.command("inspect <id>").description("Read application configuration for an explicit AI question; no network request").action(async i=>console.log(JSON.stringify({app:await t.get(i),machineId:a().machineId??null}))),o.command("doctor <id>").description("Read-only registered entry GET check; no repairs or page content in output").action(async i=>console.log(JSON.stringify(await t.doctor(i)))),o.command("register").requiredOption("--title <title>").requiredOption("--port <port>").option("--path <path>","Relative entry path","/").option("--directory <directory>","Application source directory",process.cwd()).option("--id <id>","Update an existing app").action(async i=>{console.log(JSON.stringify({app:await t.register({title:i.title,port:Number(i.port),entryPath:i.path,directory:i.directory,...i.id?{id:i.id}:{}})}))}),o.command("remove <id>").description("Remove registry entry only; keep application files and data").action(async i=>console.log(JSON.stringify(await t.remove(i))))}export{c as registerLocalAppsCommand};
package/dist/src/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import{registerScheduleCommand as be}from"./commands/schedule.js";import{resolvePersonalScheduleContext as Ae}from"./schedules/personal-context.js";import{isStewardSessionId as Pe}from"./steward/session.js";import{executeServerSchedule as ae,deliverServerSchedule as Ee}from"./schedules/server-client.js";import{Command as Te}from"commander";import T from"chalk";import Ue from"node:os";import{randomUUID as De}from"node:crypto";import J from"node:fs";import{loadConfig as p,saveConfig as Me,getConfigPath as _e,getShennianDir as Ne,resolveShennianPath as K,normalizeAutoUpgradePolicy as xe}from"./config/index.js";import{CliRelayClient as Oe}from"./relay/client.js";import{collectKnownLogSecrets as ie,installCliLogRedaction as $e,sanitizeCliLogValue as Le}from"./log-redaction.js";import{registerPairCommand as Ve,runSmartStart as je}from"./commands/pair.js";import{registerLogoutCommand as Fe}from"./commands/logout.js";import{clearDaemonPidIfOwner as se,createDaemonInstanceId as He,clearDaemonLauncher as ce,findRunningDaemonProcessIds as Be,isRemoteAccessDisabled as de,prepareRemoteAccessPause as We,stopPreparedRemoteAccessService as Ge,isIsolatedDaemonE2eInstance as qe,getDaemonStatus as le,registerDaemonCommand as ze,writeDaemonPid as me,writeDaemonLauncher as pe}from"./commands/daemon.js";import{registerRuntimeCommand as Je}from"./commands/runtime.js";import{registerAdapterCommand as Ke}from"./commands/adapter.js";import{registerAgentCommand as Qe}from"./commands/agent.js";import{registerManagerCommand as Ye}from"./commands/manager.js";import{registerWorkerCommand as Ze}from"./commands/worker.js";import{registerProjectCommand as Xe}from"./commands/project.js";import{registerStewardCommand as eo}from"./commands/steward.js";import{handleUpgradeStart as oo,registerUpgradeCommand as no}from"./commands/upgrade.js";import{registerToolsCommand as to}from"./commands/tools.js";import{registerQueueCommand as ro}from"./commands/queue.js";import{registerSkillCommand as ao}from"./commands/skill.js";import{refreshExistingSkillForHosts as io}from"./skill/hosts.js";import{registerSetupCommand as so}from"./commands/setup.js";import{getUnavailableAcpAgents as co}from"./agents/acp/discovery.js";import{registerCommandReference as lo}from"./commands/command-reference.js";import{registerIntegrationCommand as mo}from"./commands/integration.js";import{registerRoomCommand as po}from"./commands/room.js";import{registerContactCommand as go}from"./commands/contact.js";import{registerSupportCommand as uo}from"./commands/support.js";import{SessionManager as fo}from"./session/manager.js";import{createTrustedProjectFsRequestResolver as ho}from"./session/handlers/project-fs.js";import{SERVERS as Q,regionToUrl as vo,urlToRegion as Io}from"./region.js";import{clearUpgradeAttempt as So,getCurrentVersion as ge,handleStartupCrashCheck as yo,readUpgradeAttempt as wo}from"./upgrade/engine.js";import{AutoUpgradeScheduler as Co}from"./upgrade/scheduler.js";import{ensureUpdaterInstalled as ko}from"./upgrade/updater-bootstrap.js";import{launchUpdater as Ro,markUpdaterHealthy as bo}from"./upgrade/updater-launcher.js";import{detectAgents as ue}from"./agents/detect.js";import{PublicAgentDeliveryWorker as Ao}from"./agents/public-delivery-worker.js";import{augmentProcessPath as fe}from"./env-path.js";import{acquireDaemonInstanceLock as Po}from"./commands/daemon-instance-lock.js";fe();const U=ge();import{getCachedAgentInfos as V,resolveAgentInfos as Eo}from"./agents/model-registry.js";import{initCliLogReporter as To,reportLog as D,reportUpgradeAggregateMetric as Uo}from"./log-reporter.js";import{isNativeFusionEnabled as Do}from"./native-fusion/config.js";import{NativeSessionFusionService as Mo}from"./native-fusion/service.js";import{startDaemonLogRetention as _o}from"./daemon-log.js";import{startDaemonIpcServer as he}from"./daemon-ipc/server.js";import{resolveDaemonIpcPaths as No,resolveManagedRoomIpcPaths as xo}from"./daemon-ipc/paths.js";import{createDaemonControlHandlers as Oo}from"./daemon-ipc/control.js";import{createAgentReadinessHandlers as $o}from"./daemon-ipc/agent-readiness.js";import{scanMachineAgents as ve}from"./session/handlers/agents.js";import{validateAgentWorkspaceConfiguration as Lo}from"./session/handlers/agent-workspace-validation.js";import{DAEMON_IPC_VERSION as Vo}from"./daemon-ipc/protocol.js";import{RoomSessionRegistry as jo}from"./room/session-registry.js";import{HttpRoomBindingClient as Fo}from"./room/room-binding-client.js";import{TrustedManagedRoomBinder as Ho}from"./room/managed-room-binding.js";import{RoomHostSessionObservationStore as Bo}from"./room/host-session-observations.js";import{RoomMirrorSyncService as Wo}from"./room/mirror-sync-service.js";import{handleLiveRoomDelivery as Go}from"./room/live-delivery.js";import{NativeSourceDeletionStore as qo}from"./native-fusion/native-source-deletions.js";import{matchesRoomOwner as zo,isCurrentRegistration as Jo}from"./room/registration-authority.js";import{RoomActivationService as Ko,resolveManagedAgentPolicy as Qo}from"./room/activation-service.js";import{RoomActivationAudit as Yo}from"./room/activation-audit.js";import{RoomAttachmentCache as Zo}from"./room/attachment-cache.js";import{RoomAttachmentUploader as Xo}from"./room/attachment-upload.js";import{ManagedRoomContextAuthority as en}from"./room/managed-context.js";import{createManagedRoomExecutor as on}from"./room/managed-room-ipc.js";import{SESSION_SYNC_PROTOCOL_VERSION as Ie,SESSION_SYNC_ADVERTISED_CAPABILITIES as Se}from"@shennian/wire";import{getDaemonInstallationId as nn}from"./session/store.js";import{OWNER_DIRECT_TURN_OPTIONS as tn}from"./session/queue-helpers.js";import{synchronizeMachinePersonalAuthority as rn}from"./personal-sync/machine-authority.js";import{CLI_SESSION_SYNC_DATA_EPOCH as ye,ensurePersonalDataEpoch as an}from"./personal-sync/epoch.js";import{DeletionSyncRetryWaitError as sn,DeletionSyncTerminalError as cn}from"./session/deletion-sync-state.js";const we=Ne(),dn=K("daemon.pid"),ln=K("daemon.instance.lock");function mn(){try{const i=J.readFileSync(dn,"utf-8").trim();if(i.startsWith("{")){const g=JSON.parse(i),d=Number(g.pid);return Number.isInteger(d)&&d>0?d:null}const c=parseInt(i,10);return Number.isInteger(c)&&c>0?c:null}catch{return null}}function pn(i){return i.replace(/^https:\/\//,"wss://").replace(/^http:\/\//,"ws://")}function Y(){process.stdout.write(`${JSON.stringify({ok:!1,error:"integration_command_retired",message:"Room MCP and Hooks were retired. Use the Shennian Skill and CLI.",nextAction:{type:"open_install_guide",url:"https://shennian.net/install.md"}})}
2
- `),process.exitCode=1}function gn(i){const c=[`trigger=${i.trigger??"unknown"}`,`phase=${i.phase}`,`code=${i.code??"unknown"}`,`attempt=${i.reconnectAttempt}`];return i.reason&&c.push(`reason=${i.reason}`),i.error&&c.push(`error=${i.error}`),c.join(" ")}const a=new Te;a.name("shennian").description("Shennian \u2014 AI Agent Control Plane").version(U),a.enablePositionalOptions(),mo(a),po(a),go(a),uo(a),be(a),a.option("--api <url>","Server URL override").option("--name <name>","Machine name",Ue.hostname()).action(async i=>{const c=p(),g=i.api??process.env.SHENNIAN_DESKTOP_SERVER_URL??c.serverUrl??void 0;await je(g,i.name)}),a.command("run-service",{hidden:!0}).description("(internal) Connect to relay server, called by the background service").option("--api <url>","Server URL override").action(async i=>{const c=K("env.json");try{const e=JSON.parse(J.readFileSync(c,"utf-8"));for(const[n,o]of Object.entries(e))process.env[n]||(process.env[n]=o);fe()}catch{}$e(ie(process.env,p()));const g=_o();de()&&(console.log(`[${new Date().toISOString()}] remote access disabled, service start skipped`),clearInterval(g),process.exit(0));const d=He(),C=Po({lockPath:ln,instanceId:d});C.acquired||(console.log(`[${new Date().toISOString()}] daemon already running`+(C.ownerPid?` (PID ${C.ownerPid})`:"")+", skipping duplicate start"),clearInterval(g),process.exit(0));try{const e=mn();if(e&&e!==process.pid)try{process.kill(e,0),console.log(`[${new Date().toISOString()}] daemon already running (PID ${e}), skipping duplicate start`),C.release(),process.exit(0)}catch{}}catch{}const Z=qe(process.env,we)?[]:Be(process.pid);Z.length>0&&(console.log(`[${new Date().toISOString()}] daemon already running (PID ${Z[0]}), skipping duplicate start`),C.release(),process.exit(0)),me(process.pid,d,{version:U}),pe(process.pid,void 0,d),process.on("exit",()=>{se(process.pid,d),ce(d)}),process.on("exit",C.release);let j=null;try{j=ko()}catch(e){console.error(`[upgrade] updater bootstrap unavailable: ${e instanceof Error?e.message:String(e)}`)}const M=await yo();if(M){j||(console.error("[upgrade] Crash-loop rollback blocked: updater bootstrap unavailable"),process.exit(1));try{Ro({fromVersion:U,targetVersion:M.from,oldDaemonPid:process.pid,operation:"rollback",rollbackJobId:M.jobId},{readiness:j}),console.error(`[upgrade] New version crashed ${M.attemptCount} times; external rollback scheduled.`),process.stdin.resume();return}catch(e){console.error(`[upgrade] Crash-loop rollback could not start: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}try{an()}catch(e){console.error(`[personal-sync] data epoch initialization failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}const m=p(),u=i.api??process.env.SHENNIAN_DESKTOP_SERVER_URL??m.serverUrl??Q.cn.url,h=ge(),l=await ue({serverUrl:u,authToken:m.machineToken??m.accessToken}),S=l.map(e=>e.type);let F=V(l);const v=new jo,_=new Bo,R=new en(v),y=new Fo(u),ke=new Zo({actionClient:y}),Re=new Xo({actionClient:y});let w=null,r;const X=on({authority:R,actionClient:y,attachmentCache:ke,attachmentUploader:Re,observations:_,getMachineCredentials:()=>({machineToken:p().machineToken}),managerExecutor:e=>r.executeManagedManagerAction(e),onSendOutcome:e=>r.noteManagedRoomSendOutcome(e),getActiveRunId:(e,n)=>r.getManagedRoomActiveRunId(e,n),scheduleExecutor:(e,n,o)=>ae({serverUrl:u,machineToken:p().machineToken,sessionId:e,action:n,args:o}),onPaused:({registryKey:e,sessionId:n})=>{const t=v.getByRegistryKey(e)?.binding;t&&v.setBinding({registryKey:e,bindingId:t.bindingId,roomId:t.roomId,agentIdentityId:t.agentIdentityId,agentMembershipId:t.agentMembershipId,status:"paused",activationMode:"paused"}),R.revokeSession(e),r?.discardPendingManagedRoomMessages(n)}});let H=null,B=null,W=null,G=null,ee=!1;const b=await he({paths:No(),handlers:{...Oo({daemonVersion:h,protocolVersion:Vo,getStatus:()=>le(),getAgents:()=>l,requestShutdown:()=>{G?G():ee=!0},completeAgentAuthentication:e=>r.resumePendingAcpAuthentication(e),bindManagedRoom:e=>r.bindManagedRoomFromLocal(e),stewardSay:e=>r.stewardSayFromLocal(e),startUpgrade:async e=>{if(!H)throw new Error("upgrade_unavailable");return H(e)},prepareExternalUpgrade:e=>{if(!B)throw new Error("external_upgrade_unavailable");return B(e)},cancelExternalUpgrade:()=>{if(!W)throw new Error("external_upgrade_unavailable");return W()}}),...$o({getStatus:()=>le(),getSnapshot:()=>V(l).map(e=>{const n=l.find(o=>o.type===e.type);return{...e,runtimePlatform:n?.runtimePlatform,runtimeIsWsl:n?.runtimeIsWsl}}),getUnavailable:co,discover:async e=>{if(!r)throw new Error("daemon_starting");const n=await ve(!0,e);if(e){const t=l.filter(f=>f.type!==e);l.splice(0,l.length,...t,...n.detectedAgents)}else l.splice(0,l.length,...n.detectedAgents);const o=V(l);return s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:l.map(t=>t.type),agents:o}}),n.agents.map(t=>{const f=n.detectedAgents.find(z=>z.type===t.type);return{...t,runtimePlatform:f?.runtimePlatform,runtimeIsWsl:f?.runtimeIsWsl}})},validate:async e=>{if(!r)throw new Error("daemon_starting");return Lo(e,{ignoreNativeSession:(n,o)=>P?.ignoreNativeSource(n,o)})}})}});let A;try{A=await he({paths:xo(),handlers:{"managed-room.execute":e=>X(e),"schedule.personal":async e=>{const n=e,o=Ae(n?.context);if(v.getByNianSessionId(o)?.binding||!Pe(o))throw new Error("schedule_personal_context_required");return await ae({serverUrl:u,machineToken:p().machineToken,sessionId:o,action:n.operation,args:n})}}})}catch(e){throw await b.close(),e}let oe=!1;const N=()=>{oe||(oe=!0,Promise.allSettled([b.close(),A.close()]).finally(()=>process.exit(0)))};if(process.once("SIGINT",N),process.once("SIGTERM",N),!m.machineToken){console.error('Shennian CLI is not paired. Run "shennian pair --browser" or "shennian pair --token" first.'),await Promise.allSettled([b.close(),A.close()]),process.exitCode=1;return}process.removeListener("SIGINT",N),process.removeListener("SIGTERM",N);const ne=`${pn(u)}/relay/machine`,x=m.machineToken;if(!x)return;try{await rn({serverUrl:u,machineToken:x,machineId:m.machineId})}catch(e){console.error(`[personal-sync] machine authority verification failed: ${e instanceof Error?e.message:String(e)}`),await Promise.allSettled([b.close(),A.close()]),process.exit(1)}m.machineId&&To(u,m.machineId),console.log(`[${new Date().toISOString()}] Connecting to ${ne}... (v${h}) agents: ${S.join(",")}`),D({level:"info",wsEvent:"daemon.start",metadata:{version:h,agents:S}});let P=null,E=null,k=0,q=!1,I=wo();const te=xe(m.autoUpgrade),O=m.machineId?new Ao({serverUrl:u,machineId:m.machineId,getMachineToken:()=>p().machineToken,getDetectedAgents:()=>ue({serverUrl:u,authToken:p().machineToken}),onRuntimeChanged:async()=>{const e=k,n=await ve(!0);if(l.splice(0,l.length,...n.detectedAgents),S.splice(0,S.length,...n.agentList),F=n.agents,!(await s.sendReq({type:"req",id:De(),method:"machine.agents.report",params:{agents:n.agents}},2e4)).ok)throw new Error("machine_capability_report_rejected");e===k&&s.getState()==="connected"&&O?.start()},onError:()=>console.warn("[public-agent] delivery attempt failed")}):null,s=new Oe({serverUrl:ne,machineToken:x,cliVersion:h,agentList:S,autoUpgradePolicy:te,sessionSyncProtocolVersion:Ie,sessionSyncCapabilities:Se,daemonInstallationId:nn(),dataEpoch:ye,updaterProtocolVersion:1,onConnected:()=>{console.log(`[${new Date().toISOString()}] \u2713 Connected`),D({level:"info",wsEvent:"daemon.connected"}),s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:S,agents:F}}),Eo(l,{serverUrl:m.serverUrl??u,authToken:m.machineToken??m.accessToken}).then(o=>{JSON.stringify(o)!==JSON.stringify(F)&&s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:S,agents:o}})}).catch(()=>{}),I&&s.sendEvent({type:"event",event:"upgrade",payload:{state:"recovering",machineId:"self",from:I.from,to:I.to,...I.jobId?{jobId:I.jobId}:{},activeRunCount:r.getPendingRecoveryCount()}}),$.start(),E?.start();const e=++k,n=async()=>{try{if(await r.synchronizeSessionDeletions(),await r.recoverInterruptedRuns(),I){const o=I;I=null,o.jobId&&bo(o.jobId,o.to),So(),console.log(`[${new Date().toISOString()}] [upgrade] ${o.operation==="rollback"?"Rolled back":"Healthy"}: ${o.from} \u2192 ${o.to}`),Uo({kind:"upgrade",result:o.operation==="rollback"?"rolled_back":"healthy",stage:"terminal"}),s.sendEvent({type:"event",event:"upgrade",payload:{state:o.operation==="rollback"?"rolled_back":"healthy",machineId:"self",from:o.from,to:o.to,...o.jobId?{jobId:o.jobId}:{}}}),o.operation!=="rollback"&&s.sendEvent({type:"event",event:"upgrade",payload:{state:"success",machineId:"self",from:o.from,to:o.to}})}q||(q=!0,io({clientVersion:h}).then(o=>{const t=o.filter(f=>!f.ok||!["current","registered","updated"].includes(f.result.status));t.length>0&&console.warn(`[skill] ${t.length} installed Skill copies need attention; run shennian setup for details`)}).catch(()=>console.warn("[skill] Official Skill refresh failed; Client remains available")).finally(()=>{q=!1})),e===k&&s.getState()==="connected"&&(P?.handleConnected(),O?.start())}catch(o){if(console.error("[session.deletions] startup catch-up failed",o),e===k&&s.getState()==="connected"){if(o instanceof cn)return;const t=o instanceof sn?Math.max(1e3,o.retryAfterMs):5e3;setTimeout(()=>{n()},t).unref?.()}}};n()},onDisconnected:e=>{k+=1,r?.revokeProjectFsHandles(),O?.stop(),E?.stop(),console.log(`[${new Date().toISOString()}] \u26A0 Disconnected, reconnecting... ${gn(e)}`),D({level:"warn",wsEvent:"daemon.disconnected",metadata:{code:e.code,reason:e.reason,error:e.error,phase:e.phase,trigger:e.trigger,reconnectAttempt:e.reconnectAttempt}})},onProjectFsCapabilityChanged:e=>{e||r?.revokeProjectFsHandles()},onReq:e=>{if(console.log(`[${new Date().toISOString()}] [req] ${e.method}`),D({level:"info",type:"ws",wsEvent:e.method,wsDirection:"in",traceId:e.traceId}),e.method==="room.message.deliver"){Go(s,E,e);return}r.handleReq(e)}});P=Do()?new Mo(s):null,E=new Wo({registry:v,observations:_,actionClient:y,getMachineCredentials:()=>({machineToken:p().machineToken}),isSessionDeleted:e=>new qo().hasSession(e),onMessages:async(e,n,o,t)=>{await w?.processMessages(e,n,o,t)},onBindingPaused:e=>{e.lifecycleState==="closed"?(R.revokeSession(e.registryKey),r?.retireManagedRoomSession(e.nianSessionId).catch(()=>{console.warn("[room.sync] retired session cleanup failed")})):r?.discardPendingManagedRoomMessages(e.nianSessionId)}});const $=new Co({currentVersion:h,machineId:m.machineId??"unknown-machine",serverUrl:m.serverUrl??u,getIdleState:()=>r.getUpgradeIdleState(),sessionSyncProtocolVersion:Ie,dataEpoch:ye,advertisedCapabilities:Se,updaterProtocolVersion:1,startUpgrade:async(e,n)=>{const{handleUpgradeStart:o}=await import("./commands/upgrade.js");await o(s,"auto-upgrade",e,{currentVersion:h,prepareForUpgrade:t=>r.prepareForUpgrade(t),cancelUpgradePreparation:()=>r.cancelUpgradePreparation(),shutdownAfterHandoff:()=>{setTimeout(()=>process.kill(process.pid,"SIGTERM"),100).unref?.()},suppressResponse:!0,waitForCompletion:!0,canHandoff:n?void 0:()=>r.getUpgradeIdleState().idle})}});$.setPolicy(te),r=new fo(s,P,h,$,new Ho({registry:v,observations:_,bindingClient:y,getMachineCredentials:()=>{const e=p();return{machineId:e.machineId,machineToken:e.machineToken}},hostProcessIdentity:()=>`daemon:${d}`}),{prepare:()=>We(),isDisabled:()=>de(),shutdownAfterResponse:()=>{setTimeout(()=>{Ge(),process.kill(process.pid,"SIGTERM")},100).unref?.()}},e=>R.revokeToken(e),X,null,ho(x),()=>V(l)),H=async e=>{const n=e&&typeof e=="object"&&!Array.isArray(e)?e:{},o=typeof n.targetVersion=="string"?n.targetVersion:void 0,t=n.confirmedMajor===!0;return await oo(s,`local-upgrade-${Date.now()}`,o,{currentVersion:h,confirmedMajor:t,prepareForUpgrade:z=>r.prepareForUpgrade(z),cancelUpgradePreparation:()=>r.cancelUpgradePreparation(),shutdownAfterHandoff:()=>{setTimeout(()=>process.kill(process.pid,"SIGTERM"),100).unref?.()},suppressResponse:!0})},B=e=>{const n=e&&typeof e=="object"&&!Array.isArray(e)?e:{},t=`desktop-${(typeof n.targetVersion=="string"?n.targetVersion:"unknown").replace(/[^A-Za-z0-9._-]/g,"_")}-${Date.now()}`;return{jobId:t,...r.prepareForUpgrade(t)}},W=()=>(r.cancelUpgradePreparation(),{cancelled:!0}),w=new Ko({registry:v,observations:_,enqueueConversationBatch:e=>r.enqueueManagedRoomBatch(e),loadContext:async e=>{const n=p().machineToken?.trim(),o=e.binding;if(!n||!o)throw new Error("managed_room_context_unavailable");const t=await y.status({machineToken:n,roomId:o.roomId,bindingId:o.bindingId});if(!Jo(v,e)||!zo(e,t))throw new Error("managed_room_binding_unavailable");return{roomName:t.room.name,memberCount:t.room.memberCount,members:t.room.members,agentsByIdentityId:t.agent?{[t.agentIdentityId]:t.agent}:{},effectiveModelsBySessionId:t.effectiveModelId!==void 0?{[e.nianSessionId]:t.effectiveModelId}:void 0,agentSystemPromptsByIdentityId:t.agent?{[t.agentIdentityId]:t.agent.systemPrompt??""}:{}}},issueManagedRoomContext:(e,n,o,t)=>{const f=p().machineToken;if(!f)throw new Error("machine_not_authorized");return R.issue({registryKey:e,machineCredential:f,activationCauseMessageId:n,allowedActions:o,propagateWorkerRoomOrigin:t})},audit:new Yo,resolveManagedAgentPolicy:e=>Qo({...e,runtime:l.find(n=>n.type===e.registration.runtimeAdapter)})}),r.scheduleHandler=e=>Ee({serverUrl:u,machineToken:p().machineToken,req:e,client:s,queue:r.getScheduleQueue(),registry:v}),r.getScheduleQueue().validateScheduledTarget=async e=>{if(!e.bindingId||!e.roomId)return"ready";if(v.getByNianSessionId(e.sessionId)?.binding?.bindingId!==e.bindingId)return"ended";const o=await y.status({machineToken:p().machineToken,roomId:e.roomId,bindingId:e.bindingId});return o.status==="active"&&o.room.status==="active"?"ready":"ended"},r.setManagedRoomTurnPreparer(e=>w.prepareConversationTurn(e)),r.setManagedAgentDirectTurnPreparer((e,n)=>w.prepareDirectConversationTurn(e,n)),r.setManagedRecoveryPreparer(async e=>e.source==="managed_direct"?w.prepareDirectConversationTurn(e.sessionId,tn):e.source==="manager_event"?w.prepareDirectConversationTurn(e.sessionId,{allowedRoomActions:[],managerEvent:!0}):e.source!=="managed_room"||!e.roomContextRegistryKey||!e.activationCauseMessageId||!e.rootCauseMessageId||!e.activationSequence||e.activationHopCount===null?null:w.prepareConversationTurn([{registryKey:e.roomContextRegistryKey,causeMessageId:e.activationCauseMessageId,rootCauseMessageId:e.rootCauseMessageId,sequence:e.activationSequence,hopCount:e.activationHopCount}])),J.mkdirSync(we,{recursive:!0}),me(process.pid,d,{version:h}),pe(process.pid,void 0,d),s.connect(),process.stdin.resume();let re=!1;const L=async()=>{if(!re){re=!0,console.log(T.gray(`
3
- Disconnecting...`)),D({level:"info",wsEvent:"daemon.stop"}),clearInterval(g),O?.stop();try{await r.cleanup(),$.stop(),P?.stop(),E?.stop(),s.disconnect(),await Promise.allSettled([b.close(),A.close()]),se(process.pid,d),ce(d)}finally{process.exit(0)}}};G=L,ee&&L(),process.on("SIGINT",()=>{L()}),process.on("SIGTERM",()=>{L()})}),a.command("workbuddy-session-hook",{hidden:!0}).description("(retired) WorkBuddy Room Hook").allowUnknownOption(!0).action(()=>Y()),a.command("room-session-hook",{hidden:!0}).description("(internal) Authorize the official Room tool for one trusted Agent Session").argument("<runtime>","Trusted runtime adapter").allowUnknownOption(!0).action(()=>Y()),a.command("room-tool-server",{hidden:!0}).description("(internal) Run the official Shennian Room MCP tool").allowUnknownOption(!0).action(()=>Y());const Ce=a.command("config").description("View or modify configuration");Ce.command("show",{isDefault:!0}).description("Show current configuration").action(()=>{console.log(`Config file: ${_e()}`);const i=p(),c=Le(i,ie(process.env,i));if(i.serverUrl){const g=Io(i.serverUrl);console.log(`Region: ${g} (${Q[g].label})`)}console.log(JSON.stringify(c,null,2))}),Ce.command("set").description("Update a config value").argument("<key>",'Config key (e.g. "server")').argument("<value>",'Config value (e.g. "cn" or "global")').action((i,c)=>{const g=p();if(i==="server"){c!=="cn"&&c!=="global"&&(console.error(T.red('\u2717 Value must be "cn" or "global"')),process.exit(1));const d=c;g.serverUrl=vo(d),Me(g),console.log(T.green(`\u2713 Server set to ${Q[d].label}`)),console.log(T.yellow(" Restart the background service for this to take effect: shennian stop && shennian start"));return}console.error(T.red(`\u2717 Unknown config key: ${i}. Supported: server`)),process.exit(1)}),so(a),Ve(a),Fe(a),ze(a),Je(a),Ke(a,{clientVersion:U}),Qe(a),Ye(a),Ze(a),Xe(a),eo(a),no(a),to(a),ro(a),ao(a),lo(a,U),a.parse();
1
+ import{registerConfigCommand as we}from"./commands/config.js";import{registerLocalAppsCommand as Ce}from"./commands/local-apps.js";import{registerScheduleCommand as ke}from"./commands/schedule.js";import{resolvePersonalScheduleContext as Re}from"./schedules/personal-context.js";import{isStewardSessionId as be}from"./steward/session.js";import{executeServerSchedule as ne,deliverServerSchedule as Ae}from"./schedules/server-client.js";import{Command as Pe}from"commander";import Ee from"chalk";import Te from"node:os";import{randomUUID as De}from"node:crypto";import z from"node:fs";import{loadConfig as m,getShennianDir as Me,resolveShennianPath as K,normalizeAutoUpgradePolicy as Ue}from"./config/index.js";import{CliRelayClient as _e}from"./relay/client.js";import{collectKnownLogSecrets as Ne,installCliLogRedaction as Oe}from"./log-redaction.js";import{registerPairCommand as xe,runSmartStart as $e}from"./commands/pair.js";import{registerLogoutCommand as Le}from"./commands/logout.js";import{clearDaemonPidIfOwner as re,createDaemonInstanceId as Ve,clearDaemonLauncher as ae,findRunningDaemonProcessIds as je,isRemoteAccessDisabled as ie,prepareRemoteAccessPause as Fe,stopPreparedRemoteAccessService as He,isIsolatedDaemonE2eInstance as Be,getDaemonStatus as se,registerDaemonCommand as We,writeDaemonPid as ce,writeDaemonLauncher as de}from"./commands/daemon.js";import{registerRuntimeCommand as Ge}from"./commands/runtime.js";import{registerAdapterCommand as qe}from"./commands/adapter.js";import{registerAgentCommand as ze}from"./commands/agent.js";import{registerManagerCommand as Ke}from"./commands/manager.js";import{registerWorkerCommand as Je}from"./commands/worker.js";import{registerProjectCommand as Qe}from"./commands/project.js";import{registerStewardCommand as Ye}from"./commands/steward.js";import{handleUpgradeStart as Ze,registerUpgradeCommand as Xe}from"./commands/upgrade.js";import{registerToolsCommand as et}from"./commands/tools.js";import{registerQueueCommand as tt}from"./commands/queue.js";import{registerSkillCommand as ot}from"./commands/skill.js";import{refreshExistingSkillForHosts as nt}from"./skill/hosts.js";import{registerSetupCommand as rt}from"./commands/setup.js";import{getUnavailableAcpAgents as at}from"./agents/acp/discovery.js";import{registerCommandReference as it}from"./commands/command-reference.js";import{registerIntegrationCommand as st}from"./commands/integration.js";import{registerRoomCommand as ct}from"./commands/room.js";import{registerContactCommand as dt}from"./commands/contact.js";import{registerSupportCommand as lt}from"./commands/support.js";import{SessionManager as mt}from"./session/manager.js";import{createTrustedProjectFsRequestResolver as pt}from"./session/handlers/project-fs.js";import{SERVERS as ut}from"./region.js";import{clearUpgradeAttempt as gt,getCurrentVersion as le,handleStartupCrashCheck as ft,readUpgradeAttempt as ht}from"./upgrade/engine.js";import{AutoUpgradeScheduler as It}from"./upgrade/scheduler.js";import{ensureUpdaterInstalled as vt}from"./upgrade/updater-bootstrap.js";import{launchUpdater as St,markUpdaterHealthy as yt}from"./upgrade/updater-launcher.js";import{detectAgents as me}from"./agents/detect.js";import{PublicAgentDeliveryWorker as wt}from"./agents/public-delivery-worker.js";import{augmentProcessPath as pe}from"./env-path.js";import{acquireDaemonInstanceLock as Ct}from"./commands/daemon-instance-lock.js";pe();const T=le();import{getCachedAgentInfos as L,resolveAgentInfos as kt}from"./agents/model-registry.js";import{initCliLogReporter as Rt,reportLog as D,reportUpgradeAggregateMetric as bt}from"./log-reporter.js";import{isNativeFusionEnabled as At}from"./native-fusion/config.js";import{NativeSessionFusionService as Pt}from"./native-fusion/service.js";import{startDaemonLogRetention as Et}from"./daemon-log.js";import{startDaemonIpcServer as ue}from"./daemon-ipc/server.js";import{resolveDaemonIpcPaths as Tt,resolveManagedRoomIpcPaths as Dt}from"./daemon-ipc/paths.js";import{createDaemonControlHandlers as Mt}from"./daemon-ipc/control.js";import{createAgentReadinessHandlers as Ut}from"./daemon-ipc/agent-readiness.js";import{scanMachineAgents as ge}from"./session/handlers/agents.js";import{validateAgentWorkspaceConfiguration as _t}from"./session/handlers/agent-workspace-validation.js";import{DAEMON_IPC_VERSION as Nt}from"./daemon-ipc/protocol.js";import{RoomSessionRegistry as Ot}from"./room/session-registry.js";import{HttpRoomBindingClient as xt}from"./room/room-binding-client.js";import{TrustedManagedRoomBinder as $t}from"./room/managed-room-binding.js";import{RoomHostSessionObservationStore as Lt}from"./room/host-session-observations.js";import{RoomMirrorSyncService as Vt}from"./room/mirror-sync-service.js";import{handleLiveRoomDelivery as jt}from"./room/live-delivery.js";import{NativeSourceDeletionStore as Ft}from"./native-fusion/native-source-deletions.js";import{matchesRoomOwner as Ht,isCurrentRegistration as Bt}from"./room/registration-authority.js";import{RoomActivationService as Wt,resolveManagedAgentPolicy as Gt}from"./room/activation-service.js";import{prepareStandaloneAgentTurn as qt}from"./room/standalone-agent-turn.js";import{RoomActivationAudit as zt}from"./room/activation-audit.js";import{RoomAttachmentCache as Kt}from"./room/attachment-cache.js";import{RoomAttachmentUploader as Jt}from"./room/attachment-upload.js";import{ManagedRoomContextAuthority as Qt}from"./room/managed-context.js";import{createManagedRoomExecutor as Yt}from"./room/managed-room-ipc.js";import{SESSION_SYNC_PROTOCOL_VERSION as fe,SESSION_SYNC_ADVERTISED_CAPABILITIES as he}from"@shennian/wire";import{getDaemonInstallationId as Zt}from"./session/store.js";import{OWNER_DIRECT_TURN_OPTIONS as Xt}from"./session/queue-helpers.js";import{synchronizeMachinePersonalAuthority as eo}from"./personal-sync/machine-authority.js";import{CLI_SESSION_SYNC_DATA_EPOCH as Ie,ensurePersonalDataEpoch as to}from"./personal-sync/epoch.js";import{DeletionSyncRetryWaitError as oo,DeletionSyncTerminalError as no}from"./session/deletion-sync-state.js";const ve=Me(),ro=K("daemon.pid"),ao=K("daemon.instance.lock");function io(){try{const i=z.readFileSync(ro,"utf-8").trim();if(i.startsWith("{")){const v=JSON.parse(i),l=Number(v.pid);return Number.isInteger(l)&&l>0?l:null}const u=parseInt(i,10);return Number.isInteger(u)&&u>0?u:null}catch{return null}}function so(i){return i.replace(/^https:\/\//,"wss://").replace(/^http:\/\//,"ws://")}function J(){process.stdout.write(`${JSON.stringify({ok:!1,error:"integration_command_retired",message:"Room MCP and Hooks were retired. Use the Shennian Skill and CLI.",nextAction:{type:"open_install_guide",url:"https://shennian.net/install.md"}})}
2
+ `),process.exitCode=1}function co(i){const u=[`trigger=${i.trigger??"unknown"}`,`phase=${i.phase}`,`code=${i.code??"unknown"}`,`attempt=${i.reconnectAttempt}`];return i.reason&&u.push(`reason=${i.reason}`),i.error&&u.push(`error=${i.error}`),u.join(" ")}const a=new Pe;a.name("shennian").description("Shennian \u2014 AI Agent Control Plane").version(T),a.enablePositionalOptions(),st(a),ct(a),dt(a),lt(a),ke(a),a.option("--api <url>","Server URL override").option("--name <name>","Machine name",Te.hostname()).action(async i=>{const u=m(),v=i.api??process.env.SHENNIAN_DESKTOP_SERVER_URL??u.serverUrl??void 0;await $e(v,i.name)}),a.command("run-service",{hidden:!0}).description("(internal) Connect to relay server, called by the background service").option("--api <url>","Server URL override").action(async i=>{const u=K("env.json");try{const e=JSON.parse(z.readFileSync(u,"utf-8"));for(const[o,t]of Object.entries(e))process.env[o]||(process.env[o]=t);pe()}catch{}Oe(Ne(process.env,m()));const v=Et();ie()&&(console.log(`[${new Date().toISOString()}] remote access disabled, service start skipped`),clearInterval(v),process.exit(0));const l=Ve(),C=Ct({lockPath:ao,instanceId:l});C.acquired||(console.log(`[${new Date().toISOString()}] daemon already running`+(C.ownerPid?` (PID ${C.ownerPid})`:"")+", skipping duplicate start"),clearInterval(v),process.exit(0));try{const e=io();if(e&&e!==process.pid)try{process.kill(e,0),console.log(`[${new Date().toISOString()}] daemon already running (PID ${e}), skipping duplicate start`),C.release(),process.exit(0)}catch{}}catch{}const Q=Be(process.env,ve)?[]:je(process.pid);Q.length>0&&(console.log(`[${new Date().toISOString()}] daemon already running (PID ${Q[0]}), skipping duplicate start`),C.release(),process.exit(0)),ce(process.pid,l,{version:T}),de(process.pid,void 0,l),process.on("exit",()=>{re(process.pid,l),ae(l)}),process.on("exit",C.release);let V=null;try{V=vt()}catch(e){console.error(`[upgrade] updater bootstrap unavailable: ${e instanceof Error?e.message:String(e)}`)}const M=await ft();if(M){V||(console.error("[upgrade] Crash-loop rollback blocked: updater bootstrap unavailable"),process.exit(1));try{St({fromVersion:T,targetVersion:M.from,oldDaemonPid:process.pid,operation:"rollback",rollbackJobId:M.jobId},{readiness:V}),console.error(`[upgrade] New version crashed ${M.attemptCount} times; external rollback scheduled.`),process.stdin.resume();return}catch(e){console.error(`[upgrade] Crash-loop rollback could not start: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}try{to()}catch(e){console.error(`[personal-sync] data epoch initialization failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}const d=m(),p=i.api??process.env.SHENNIAN_DESKTOP_SERVER_URL??d.serverUrl??ut.cn.url,f=le(),c=await me({serverUrl:p,authToken:d.machineToken??d.accessToken}),S=c.map(e=>e.type);let j=L(c);const h=new Ot,U=new Lt,R=new Qt(h),y=new xt(p),Se=new Kt({actionClient:y}),ye=new Jt({actionClient:y});let w=null,r;const Y=Yt({authority:R,actionClient:y,attachmentCache:Se,attachmentUploader:ye,observations:U,getMachineCredentials:()=>({machineToken:m().machineToken}),managerExecutor:e=>r.executeManagedManagerAction(e),onSendOutcome:e=>r.noteManagedRoomSendOutcome(e),getActiveRunId:(e,o)=>r.getManagedRoomActiveRunId(e,o),scheduleExecutor:(e,o,t)=>ne({serverUrl:p,machineToken:m().machineToken,sessionId:e,action:o,args:t}),onPaused:({registryKey:e,sessionId:o})=>{const n=h.getByRegistryKey(e)?.binding;n&&h.setBinding({registryKey:e,bindingId:n.bindingId,roomId:n.roomId,agentIdentityId:n.agentIdentityId,agentMembershipId:n.agentMembershipId,status:"paused",activationMode:"paused"}),R.revokeSession(e),r?.discardPendingManagedRoomMessages(o)}});let F=null,H=null,B=null,W=null,Z=!1;const b=await ue({paths:Tt(),handlers:{...Mt({daemonVersion:f,protocolVersion:Nt,getStatus:()=>se(),getAgents:()=>c,requestShutdown:()=>{W?W():Z=!0},completeAgentAuthentication:e=>r.resumePendingAcpAuthentication(e),bindManagedRoom:e=>r.bindManagedRoomFromLocal(e),stewardSay:e=>r.stewardSayFromLocal(e),startUpgrade:async e=>{if(!F)throw new Error("upgrade_unavailable");return F(e)},prepareExternalUpgrade:e=>{if(!H)throw new Error("external_upgrade_unavailable");return H(e)},cancelExternalUpgrade:()=>{if(!B)throw new Error("external_upgrade_unavailable");return B()}}),...Ut({getStatus:()=>se(),getSnapshot:()=>L(c).map(e=>{const o=c.find(t=>t.type===e.type);return{...e,runtimePlatform:o?.runtimePlatform,runtimeIsWsl:o?.runtimeIsWsl}}),getUnavailable:at,discover:async e=>{if(!r)throw new Error("daemon_starting");const o=await ge(!0,e);if(e){const n=c.filter(g=>g.type!==e);c.splice(0,c.length,...n,...o.detectedAgents)}else c.splice(0,c.length,...o.detectedAgents);const t=L(c);return s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:c.map(n=>n.type),agents:t}}),o.agents.map(n=>{const g=o.detectedAgents.find(q=>q.type===n.type);return{...n,runtimePlatform:g?.runtimePlatform,runtimeIsWsl:g?.runtimeIsWsl}})},validate:async e=>{if(!r)throw new Error("daemon_starting");return _t(e,{ignoreNativeSession:(o,t)=>P?.ignoreNativeSource(o,t)})}})}});let A;try{A=await ue({paths:Dt(),handlers:{"managed-room.execute":e=>Y(e),"schedule.personal":async e=>{const o=e,t=Re(o?.context);if(h.getByNianSessionId(t)?.binding||!be(t))throw new Error("schedule_personal_context_required");return await ne({serverUrl:p,machineToken:m().machineToken,sessionId:t,action:o.operation,args:o})}}})}catch(e){throw await b.close(),e}let X=!1;const _=()=>{X||(X=!0,Promise.allSettled([b.close(),A.close()]).finally(()=>process.exit(0)))};if(process.once("SIGINT",_),process.once("SIGTERM",_),!d.machineToken){console.error('Shennian CLI is not paired. Run "shennian pair --browser" or "shennian pair --token" first.'),await Promise.allSettled([b.close(),A.close()]),process.exitCode=1;return}process.removeListener("SIGINT",_),process.removeListener("SIGTERM",_);const ee=`${so(p)}/relay/machine`,N=d.machineToken;if(!N)return;try{await eo({serverUrl:p,machineToken:N,machineId:d.machineId})}catch(e){console.error(`[personal-sync] machine authority verification failed: ${e instanceof Error?e.message:String(e)}`),await Promise.allSettled([b.close(),A.close()]),process.exit(1)}d.machineId&&Rt(p,d.machineId),console.log(`[${new Date().toISOString()}] Connecting to ${ee}... (v${f}) agents: ${S.join(",")}`),D({level:"info",wsEvent:"daemon.start",metadata:{version:f,agents:S}});let P=null,E=null,k=0,G=!1,I=ht();const te=Ue(d.autoUpgrade),O=d.machineId?new wt({serverUrl:p,machineId:d.machineId,getMachineToken:()=>m().machineToken,getDetectedAgents:()=>me({serverUrl:p,authToken:m().machineToken}),onRuntimeChanged:async()=>{const e=k,o=await ge(!0);if(c.splice(0,c.length,...o.detectedAgents),S.splice(0,S.length,...o.agentList),j=o.agents,!(await s.sendReq({type:"req",id:De(),method:"machine.agents.report",params:{agents:o.agents}},2e4)).ok)throw new Error("machine_capability_report_rejected");e===k&&s.getState()==="connected"&&O?.start()},onError:()=>console.warn("[public-agent] delivery attempt failed")}):null,s=new _e({serverUrl:ee,machineToken:N,cliVersion:f,agentList:S,autoUpgradePolicy:te,sessionSyncProtocolVersion:fe,sessionSyncCapabilities:he,daemonInstallationId:Zt(),dataEpoch:Ie,updaterProtocolVersion:1,onConnected:()=>{console.log(`[${new Date().toISOString()}] \u2713 Connected`),D({level:"info",wsEvent:"daemon.connected"}),s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:S,agents:j}}),kt(c,{serverUrl:d.serverUrl??p,authToken:d.machineToken??d.accessToken}).then(t=>{JSON.stringify(t)!==JSON.stringify(j)&&s.sendEvent({type:"event",event:"machine.agents",payload:{agentList:S,agents:t}})}).catch(()=>{}),I&&s.sendEvent({type:"event",event:"upgrade",payload:{state:"recovering",machineId:"self",from:I.from,to:I.to,...I.jobId?{jobId:I.jobId}:{},activeRunCount:r.getPendingRecoveryCount()}}),x.start(),E?.start();const e=++k,o=async()=>{try{if(await r.synchronizeSessionDeletions(),await r.recoverInterruptedRuns(),I){const t=I;I=null,t.jobId&&yt(t.jobId,t.to),gt(),console.log(`[${new Date().toISOString()}] [upgrade] ${t.operation==="rollback"?"Rolled back":"Healthy"}: ${t.from} \u2192 ${t.to}`),bt({kind:"upgrade",result:t.operation==="rollback"?"rolled_back":"healthy",stage:"terminal"}),s.sendEvent({type:"event",event:"upgrade",payload:{state:t.operation==="rollback"?"rolled_back":"healthy",machineId:"self",from:t.from,to:t.to,...t.jobId?{jobId:t.jobId}:{}}}),t.operation!=="rollback"&&s.sendEvent({type:"event",event:"upgrade",payload:{state:"success",machineId:"self",from:t.from,to:t.to}})}G||(G=!0,nt({clientVersion:f}).then(t=>{const n=t.filter(g=>!g.ok||!["current","registered","updated"].includes(g.result.status));n.length>0&&console.warn(`[skill] ${n.length} installed Skill copies need attention; run shennian setup for details`)}).catch(()=>console.warn("[skill] Official Skill refresh failed; Client remains available")).finally(()=>{G=!1})),e===k&&s.getState()==="connected"&&(P?.handleConnected(),O?.start())}catch(t){if(console.error("[session.deletions] startup catch-up failed",t),e===k&&s.getState()==="connected"){if(t instanceof no)return;const n=t instanceof oo?Math.max(1e3,t.retryAfterMs):5e3;setTimeout(()=>{o()},n).unref?.()}}};o()},onDisconnected:e=>{k+=1,r?.revokeProjectFsHandles(),O?.stop(),E?.stop(),console.log(`[${new Date().toISOString()}] \u26A0 Disconnected, reconnecting... ${co(e)}`),D({level:"warn",wsEvent:"daemon.disconnected",metadata:{code:e.code,reason:e.reason,error:e.error,phase:e.phase,trigger:e.trigger,reconnectAttempt:e.reconnectAttempt}})},onProjectFsCapabilityChanged:e=>{e||r?.revokeProjectFsHandles()},onReq:e=>{if(console.log(`[${new Date().toISOString()}] [req] ${e.method}`),D({level:"info",type:"ws",wsEvent:e.method,wsDirection:"in",traceId:e.traceId}),e.method==="room.message.deliver"){jt(s,E,e);return}r.handleReq(e)}});P=At()?new Pt(s):null,E=new Vt({registry:h,observations:U,actionClient:y,getMachineCredentials:()=>({machineToken:m().machineToken}),isSessionDeleted:e=>new Ft().hasSession(e),onMessages:async(e,o,t,n)=>{await w?.processMessages(e,o,t,n)},onBindingPaused:e=>{e.lifecycleState==="closed"?(R.revokeSession(e.registryKey),r?.retireManagedRoomSession(e.nianSessionId).catch(()=>{console.warn("[room.sync] retired session cleanup failed")})):r?.discardPendingManagedRoomMessages(e.nianSessionId)}});const x=new It({currentVersion:f,machineId:d.machineId??"unknown-machine",serverUrl:d.serverUrl??p,getIdleState:()=>r.getUpgradeIdleState(),sessionSyncProtocolVersion:fe,dataEpoch:Ie,advertisedCapabilities:he,updaterProtocolVersion:1,startUpgrade:async(e,o)=>{const{handleUpgradeStart:t}=await import("./commands/upgrade.js");await t(s,"auto-upgrade",e,{currentVersion:f,prepareForUpgrade:n=>r.prepareForUpgrade(n),cancelUpgradePreparation:()=>r.cancelUpgradePreparation(),shutdownAfterHandoff:()=>{setTimeout(()=>process.kill(process.pid,"SIGTERM"),100).unref?.()},suppressResponse:!0,waitForCompletion:!0,canHandoff:o?void 0:()=>r.getUpgradeIdleState().idle})}});x.setPolicy(te),r=new mt(s,P,f,x,new $t({registry:h,observations:U,bindingClient:y,getMachineCredentials:()=>{const e=m();return{machineId:e.machineId,machineToken:e.machineToken}},hostProcessIdentity:()=>`daemon:${l}`}),{prepare:()=>Fe(),isDisabled:()=>ie(),shutdownAfterResponse:()=>{setTimeout(()=>{He(),process.kill(process.pid,"SIGTERM")},100).unref?.()}},e=>R.revokeToken(e),Y,null,pt(N),()=>L(c)),F=async e=>{const o=e&&typeof e=="object"&&!Array.isArray(e)?e:{},t=typeof o.targetVersion=="string"?o.targetVersion:void 0,n=o.confirmedMajor===!0;return await Ze(s,`local-upgrade-${Date.now()}`,t,{currentVersion:f,confirmedMajor:n,prepareForUpgrade:q=>r.prepareForUpgrade(q),cancelUpgradePreparation:()=>r.cancelUpgradePreparation(),shutdownAfterHandoff:()=>{setTimeout(()=>process.kill(process.pid,"SIGTERM"),100).unref?.()},suppressResponse:!0})},H=e=>{const o=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=`desktop-${(typeof o.targetVersion=="string"?o.targetVersion:"unknown").replace(/[^A-Za-z0-9._-]/g,"_")}-${Date.now()}`;return{jobId:n,...r.prepareForUpgrade(n)}},B=()=>(r.cancelUpgradePreparation(),{cancelled:!0}),w=new Wt({registry:h,observations:U,enqueueConversationBatch:e=>r.enqueueManagedRoomBatch(e),loadContext:async e=>{const o=m().machineToken?.trim(),t=e.binding;if(!o||!t)throw new Error("managed_room_context_unavailable");const n=await y.status({machineToken:o,roomId:t.roomId,bindingId:t.bindingId});if(!Bt(h,e)||!Ht(e,n))throw new Error("managed_room_binding_unavailable");return{roomName:n.room.name,memberCount:n.room.memberCount,members:n.room.members,agentsByIdentityId:n.agent?{[n.agentIdentityId]:n.agent}:{},effectiveModelsBySessionId:n.effectiveModelId!==void 0?{[e.nianSessionId]:n.effectiveModelId}:void 0,agentSystemPromptsByIdentityId:n.agent?{[n.agentIdentityId]:n.agent.systemPrompt??""}:{}}},issueManagedRoomContext:(e,o,t,n)=>{const g=m().machineToken;if(!g)throw new Error("machine_not_authorized");return R.issue({registryKey:e,machineCredential:g,activationCauseMessageId:o,allowedActions:t,propagateWorkerRoomOrigin:n})},audit:new zt,prepareUnboundDirectTurn:qt,resolveManagedAgentPolicy:e=>Gt({...e,runtime:c.find(o=>o.type===e.registration.runtimeAdapter)})}),r.scheduleHandler=e=>Ae({serverUrl:p,machineToken:m().machineToken,req:e,client:s,queue:r.getScheduleQueue(),registry:h}),r.getScheduleQueue().validateScheduledTarget=async e=>{if(!e.bindingId||!e.roomId)return"ready";if(h.getByNianSessionId(e.sessionId)?.binding?.bindingId!==e.bindingId)return"ended";const t=await y.status({machineToken:m().machineToken,roomId:e.roomId,bindingId:e.bindingId});return t.status==="active"&&t.room.status==="active"?"ready":"ended"},r.setManagedRoomTurnPreparer(e=>w.prepareConversationTurn(e)),r.setManagedAgentDirectTurnPreparer((e,o)=>w.prepareDirectConversationTurn(e,o)),r.setManagedRecoveryPreparer(async e=>e.source==="managed_direct"?w.prepareDirectConversationTurn(e.sessionId,Xt):e.source==="manager_event"?w.prepareDirectConversationTurn(e.sessionId,{allowedRoomActions:[],managerEvent:!0}):e.source!=="managed_room"||!e.roomContextRegistryKey||!e.activationCauseMessageId||!e.rootCauseMessageId||!e.activationSequence||e.activationHopCount===null?null:w.prepareConversationTurn([{registryKey:e.roomContextRegistryKey,causeMessageId:e.activationCauseMessageId,rootCauseMessageId:e.rootCauseMessageId,sequence:e.activationSequence,hopCount:e.activationHopCount}])),z.mkdirSync(ve,{recursive:!0}),ce(process.pid,l,{version:f}),de(process.pid,void 0,l),s.connect(),process.stdin.resume();let oe=!1;const $=async()=>{if(!oe){oe=!0,console.log(Ee.gray(`
3
+ Disconnecting...`)),D({level:"info",wsEvent:"daemon.stop"}),clearInterval(v),O?.stop();try{await r.cleanup(),x.stop(),P?.stop(),E?.stop(),s.disconnect(),await Promise.allSettled([b.close(),A.close()]),re(process.pid,l),ae(l)}finally{process.exit(0)}}};W=$,Z&&$(),process.on("SIGINT",()=>{$()}),process.on("SIGTERM",()=>{$()})}),a.command("workbuddy-session-hook",{hidden:!0}).description("(retired) WorkBuddy Room Hook").allowUnknownOption(!0).action(()=>J()),a.command("room-session-hook",{hidden:!0}).description("(internal) Authorize the official Room tool for one trusted Agent Session").argument("<runtime>","Trusted runtime adapter").allowUnknownOption(!0).action(()=>J()),a.command("room-tool-server",{hidden:!0}).description("(internal) Run the official Shennian Room MCP tool").allowUnknownOption(!0).action(()=>J()),we(a),rt(a),xe(a),Le(a),We(a),Ce(a),Ge(a),qe(a,{clientVersion:T}),ze(a),Ke(a),Je(a),Qe(a),Ye(a),Xe(a),et(a),tt(a),ot(a),it(a,T),a.parse();
@@ -0,0 +1 @@
1
+ import{promises as c}from"node:fs";import v from"node:path";import{randomUUID as b}from"node:crypto";import{LOCAL_APP_MAX_BYTES as E,localServicePath as A,personalServiceInput as _}from"@shennian/wire";import{getShennianDir as S}from"../config/index.js";function P(d=v.join(S(),"local-apps"),k=fetch){let m=Promise.resolve(),f=0;const h=r=>{if(!/^[a-zA-Z0-9_-]{1,80}$/.test(r))throw new Error("invalid_app_id");return v.join(d,r+".json")},u=async r=>{try{const e=JSON.parse(await c.readFile(h(r),"utf8"));if(e.id!==r||typeof e.title!="string"||e.title.length>120||typeof e.directory!="string"||e.directory.length>1e3||typeof e.updatedAt!="string")throw new Error;return _({appId:e.id,port:e.port,method:"GET",path:e.entryPath}),e}catch{throw new Error("local_app_unavailable")}};return{get:u,async list(){let r;try{r=await c.readdir(d)}catch(t){if(t.code==="ENOENT")return[];throw t}return(await Promise.all(r.filter(t=>/^[\w-]+\.json$/.test(t)).slice(0,100).map(t=>u(t.slice(0,-5)).catch(()=>null)))).filter(t=>t!==null).sort((t,o)=>o.updatedAt.localeCompare(t.updatedAt))},async register(r){const e=m.then(async()=>{if(!r||typeof r!="object"||Array.isArray(r))throw new Error("invalid_app_registration");const t=r;if(Object.keys(t).some(p=>!["id","title","port","entryPath","directory"].includes(p))||typeof t.title!="string"||!t.title.trim()||t.title.length>120||typeof t.directory!="string"||t.directory.length>1e3||!/^(?:\/|[A-Za-z]:[\\/]|\\\\)/.test(t.directory)||/[\u0000-\u001f]/.test(t.directory))throw new Error("invalid_app_registration");const o=typeof t.id=="string"?t.id:b(),y=A(t.entryPath??"/");_({appId:o,port:t.port,method:"GET",path:y});const i={id:o,title:t.title.trim(),port:Number(t.port),entryPath:y,directory:t.directory,updatedAt:new Date().toISOString()};await c.mkdir(d,{recursive:!0,mode:448});const a=await c.readdir(d);if(a.filter(p=>/^[\w-]+\.json$/.test(p)).length>=100&&!a.includes(o+".json"))throw new Error("local_app_limit");const l=h(o)+"."+b()+".tmp";try{await c.writeFile(l,JSON.stringify(i),{mode:384}),await c.rename(l,h(o))}finally{await c.unlink(l).catch(()=>{})}return i});return m=e.then(()=>{},()=>{}),e},async doctor(r){let e;try{e=await u(r)}catch{return{check:"local_entry_http",appId:r,status:"unavailable",reason:"app_not_registered"}}try{const t=await this.request({appId:r,port:e.port,method:"GET",path:e.entryPath,asset:!0});return{check:"local_entry_http",appId:r,status:t.status>=200&&t.status<300?"ready":"http_error",httpStatus:t.status}}catch(t){const o=["service_timeout","service_busy","service_redirect_blocked","service_response_too_large","service_port_forbidden","local_app_unavailable"];return{check:"local_entry_http",appId:r,status:"unavailable",reason:t instanceof Error&&o.includes(t.message)?t.message:"service_unavailable"}}},async remove(r){return await c.unlink(h(r)),{removed:!0}},async request(r){const e=_(r);if((await u(e.appId)).port!==e.port)throw new Error("service_port_forbidden");if(f>=8)throw new Error("service_busy");f++;const o=new AbortController,y=setTimeout(()=>o.abort(),15e3);try{const i=new URL(e.path,`http://127.0.0.1:${e.port}`);if(i.hostname!=="127.0.0.1"||i.port!==String(e.port))throw new Error("invalid_service_path");if(e.method==="GET"&&e.args)for(const[s,n]of Object.entries(e.args))i.searchParams.set(s,typeof n=="string"?n:JSON.stringify(n));const a=await k(i,{method:e.method,redirect:"manual",signal:o.signal,headers:{"accept-encoding":"identity",...e.method!=="GET"?{"content-type":"application/json"}:{}},...e.method!=="GET"?{body:JSON.stringify(e.args??{})}:{}});if(a.status>=300&&a.status<400)throw await a.body?.cancel(),new Error("service_redirect_blocked");const l=Number(a.headers.get("content-length"));if(Number.isFinite(l)&&l>E)throw await a.body?.cancel(),new Error("service_response_too_large");const p=[];let w=0;if(a.body){const s=a.body.getReader();try{for(;;){const n=await s.read();if(n.done)break;if(w+=n.value.byteLength,w>E)throw await s.cancel(),new Error("service_response_too_large");p.push(n.value)}}finally{s.releaseLock()}}const g={};for(const s of["content-type","etag","last-modified"]){const n=a.headers.get(s);n&&!/[\r\n]/.test(n)&&(g[s]=n)}return{status:a.status,headers:g,base64:Buffer.concat(p).toString("base64")}}catch(i){throw o.signal.aborted?new Error("service_timeout"):i instanceof Error&&["service_redirect_blocked","service_response_too_large"].includes(i.message)?i:new Error("service_unavailable")}finally{clearTimeout(y),f--}}}}const G=P();export{P as createLocalAppService,G as localApps};
@@ -1,14 +1,14 @@
1
- import{isAvailableBuiltinAgentType as k,managedAgentExecutionMode as P}from"@shennian/wire";import{getBuiltinAgentVersion as S,resolveBuiltinCommand as B}from"../agents/command-spec.js";import{registerCustomRuntimeSecurity as K,resolveCustomRuntimeExecutableFingerprint as $}from"../agents/custom-managed-runtime.js";import{loadConfig as x}from"../config/index.js";import{resolveManagedAgentExecutableIdentity as T}from"../security/managed-agent-executable.js";import{compileManagedAgentPolicy as W}from"../security/managed-agent-policy.js";import{resolveManagedAgentRuntimeProtection as R}from"../security/managed-agent-runtime.js";import{selectRoomActivationTargets as q}from"./activation-policy.js";import{buildManagedAgentPermissionPrompt as E,composeManagedRoomPrompt as D}from"./managed-prompt-composer.js";import{isCurrentRegistration as f}from"./registration-authority.js";const N=4,F=6e4,O=6,V=5*6e4;class ce{deps;latestContexts=new Map;constructor(e){this.deps=e}async processMessages(e,o,t,a={roomName:"\u5F53\u524D\u7FA4\u804A"}){const d=[],m=[],c=new Map,u=new Set,g=[...o].sort((i,s)=>J(i.sequence,s.sequence));for(const i of t){const s=this.deps.registry.getByRegistryKey(i.registryKey);!s?.binding||!f(this.deps.registry,i)||s.binding.roomId!==e||s.binding.status!=="active"&&s.binding.status!=="paused"&&s.binding.activationQueue.length}for(const i of t){const s=this.deps.registry.getByRegistryKey(i.registryKey);if(!s?.binding||!f(this.deps.registry,i)||s.binding.roomId!==e||s.binding.activationQueue.length===0&&!s.binding.activeActivation||(u.add(s.registryKey),s.binding.status!=="active"||s.binding.activationMode==="paused")||s.binding.activationQueue.length===0)continue;const l=this.deps.observations.getBySource(s);if(!l?.workspacePath||l.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");this.latestContexts.set(s.registryKey,a);for(const r of s.binding.activationQueue)d.push({registration:s,input:{params:{sessionId:s.nianSessionId,text:r.deliveryText??"\u7FA4\u804A\u4E2D\u6709\u4E00\u6761\u5F85\u5904\u7406\u6D88\u606F\uFF0C\u8BF7\u7ED3\u5408\u5F53\u524D\u7FA4\u804A\u4E0A\u4E0B\u6587\u5904\u7406\u3002",agentType:y(s.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:l.workspacePath,agentSessionId:s.sourceSessionKey,queueMessageId:`room-activation-${s.binding.bindingId}-${r.causeMessageId}`,clientMessageId:`room-activation-${s.binding.bindingId}-${r.causeMessageId}`},context:{registryKey:s.registryKey,causeMessageId:r.causeMessageId,rootCauseMessageId:r.rootCauseMessageId,sequence:r.sequence,hopCount:r.hopCount}}})}for(const i of g){const s=new Set(q(i,t).map(l=>l.registration.registryKey));for(const l of t){const r=this.deps.registry.getByRegistryKey(l.registryKey);if(!r?.binding||!f(this.deps.registry,l)||r.binding.roomId!==e||r.binding.status!=="active"&&r.binding.status!=="paused"||a.agentsByIdentityId?.[r.binding.agentIdentityId]?.configurationPending||BigInt(i.sequence)<=BigInt(r.binding.lastActivatedSequence))continue;const h=c.get(r.registryKey)??[...r.binding.mentionContext??[]];if(c.set(r.registryKey,h),s.has(r.registryKey)){const p=(i.activationCause?.hopCount??0)+(i.author.principalType==="agent"?1:0),I=i.activationCause?.rootCauseMessageId??i.id;if(p>N)this.audit(r,i.id,I,p,"suppressed","max_hops");else{const w=this.deps.registry.claimActivation({registryKey:r.registryKey,causeMessageId:i.id,windowMs:F,maxActivations:O,pauseMs:V,now:this.deps.now?.()});if(!w.allowed){w.newlyPaused&&this.audit(r,i.id,I,p,"suppressed","rate_limited"),m.push({registryKey:r.registryKey,sequence:i.sequence});continue}const b=this.deps.observations.getBySource(r);if(!b?.workspacePath||b.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const M=v([i]),A=r.binding.activationMode==="mention_only"?Q([...h.map(C=>C.deliveryText),M]):M;this.latestContexts.set(r.registryKey,a),d.push({registration:r,input:{params:{sessionId:r.nianSessionId,text:A,agentType:y(r.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[r.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:b.workspacePath,agentSessionId:r.sourceSessionKey,queueMessageId:`room-activation-${r.binding.bindingId}-${i.id}`,clientMessageId:`room-activation-${r.binding.bindingId}-${i.id}`,roomMessageCreatedAt:i.createdAt},context:{registryKey:r.registryKey,causeMessageId:i.id,rootCauseMessageId:I,sequence:i.sequence,hopCount:p}}}),r.binding.activationMode==="mention_only"&&c.set(r.registryKey,[])}}else r.binding.activationMode==="mention_only"&&i.kind!=="system"&&i.author.membershipId!==r.binding.agentMembershipId&&(h.some(p=>p.sequence===i.sequence)||h.push({sequence:i.sequence,deliveryText:v([i])}));m.push({registryKey:r.registryKey,sequence:i.sequence})}}await this.deps.enqueueConversationBatch(d.map(i=>i.input));for(const i of u)this.deps.registry.retireLegacyActivationState(i,this.deps.now?.()??new Date);for(const[i,s]of c)this.deps.registry.getByRegistryKey(i)?.lifecycleState!=="closed"&&this.deps.registry.replaceMentionContext(i,s,this.deps.now?.()??new Date);for(const i of d)this.audit(i.registration,i.input.context.causeMessageId,i.input.context.rootCauseMessageId,i.input.context.hopCount,"queued","conversation_queue");for(const i of m)this.deps.registry.getByRegistryKey(i.registryKey)?.lifecycleState!=="closed"&&this.deps.registry.advanceCursor({registryKey:i.registryKey,cursor:"activated",sequence:i.sequence})}async prepareConversationTurn(e){const o=e.at(-1);if(!o)throw new Error("managed_room_queue_context_missing");const t=this.deps.registry.getByRegistryKey(o.registryKey);if(!t)throw new Error("managed_room_binding_unavailable");const a=await this.prepareManagedTurn(t,o.causeMessageId);return this.audit(t,o.causeMessageId,o.rootCauseMessageId,o.hopCount,"activated","conversation_queue_dispatch"),a}async prepareDirectConversationTurn(e,o={}){const t=o.roomOrigin?this.deps.registry.getByRegistryKey(o.roomOrigin.registryKey):this.deps.registry.getByNianSessionId(e);return t?.nianSessionId!==e||!t||o.roomOrigin&&(t.registrationEpoch!==o.roomOrigin.registrationEpoch||t.binding?.bindingId!==o.roomOrigin.bindingId||t.binding.roomId!==o.roomOrigin.roomId)?null:this.prepareManagedTurn(t,void 0,o)}async prepareManagedTurn(e,o,t){if(!f(this.deps.registry,e)||!e.binding||e.binding.status!=="active")throw new Error("managed_room_binding_unavailable");const a=this.deps.loadContext?await this.deps.loadContext(e):this.latestContexts.get(e.registryKey);if(!a)throw new Error("managed_room_prompt_context_unavailable");const d=a.agentsByIdentityId?.[e.binding.agentIdentityId];if(d?.configurationPending)throw new Error("managed_agent_configuration_pending");if(!d?.permissionPolicy)throw new Error("managed_agent_policy_missing");const m=d.sessionMode==="manager"?"manager":"standard",c=m==="manager"?{...d.managerConfig,defaultWorkerAgentType:d.managerConfig?.defaultWorkerAgentType??y(e.runtimeAdapter),defaultWorkerModelId:d.managerConfig?.defaultWorkerModelId??null}:null,u=this.deps.observations.getBySource(e);if(!u?.workspacePath||u.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const g=this.deps.resolveManagedAgentPolicy?await this.deps.resolveManagedAgentPolicy({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:u.workspacePath}):await U({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:u.workspacePath});if(!f(this.deps.registry,e))throw new Error("managed_room_binding_unavailable");const i=H(a,e,g),s=this.deps.issueManagedRoomContext(e.registryKey,o,t?.allowedRoomActions,t?.propagateWorkerRoomOrigin);if(!/^mrc_[A-Za-z0-9_-]{43}$/.test(s))throw new Error("managed_room_context_unavailable");return{agentType:y(e.runtimeAdapter),effectiveModelId:a.effectiveModelsBySessionId?.[e.nianSessionId],workDir:g.adapterPolicy.workDir,agentSessionId:e.sourceSessionKey,systemPrompt:t?G({managerEvent:t.managerEvent===!0,scheduledTask:t.scheduledTask===!0,roomSendAllowed:t.allowedRoomActions?.includes("send")===!0,agentSystemPrompt:a.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],managedAgentPolicy:g,runtimeAdapter:y(e.runtimeAdapter)}):i.systemPrompt,sessionMode:m,managerConfig:c,managerDefaultWorkerAgentType:c?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:c?.defaultWorkerModelId??null,roomContextRegistryKey:e.registryKey,managedRoomContextToken:s,managedAgentPolicy:g,managedRoomPromptSnapshot:i.snapshot}}audit(e,o,t,a,d,m){e.binding&&this.deps.audit?.record({roomId:e.binding.roomId,bindingId:e.binding.bindingId,causeMessageId:o,rootCauseMessageId:t,hopCount:a,outcome:d,reason:m,at:this.deps.now?.()})}}function v(n){if(n.length===1&&n[0].kind==="system")return`[\u7FA4\u4E8B\u4EF6]
2
- ${n[0].text?.trim()||"\u7FA4\u804A\u72B6\u6001\u53D1\u751F\u53D8\u5316\u3002"}`;const e=n.map(o=>{const t=o.text?.trim()||"\u53D1\u9001\u4E86\u4E00\u6761\u6D88\u606F",a=o.attachments.length>0?`
3
- ${o.attachments.map(L).join(`
4
- `)}`:"";return{speaker:o.author.displayName,body:`${t}${a}`}});return _(e)}function L(n){return`\u9644\u4EF6\uFF1A${`${j(n.name)} \xB7 ${z(n.byteSize)}`}\uFF5C${n.mimeType}\uFF5CattachmentId=${n.attachmentId}`}function j(n){return String(n||"\u9644\u4EF6").replace(/[[\]\\]/g,"\\$&").replace(/[\r\n]+/g," ")}function z(n){const e=Number(n);if(!Number.isFinite(e)||e<0)return`${n} B`;if(e<1024)return`${e} B`;const o=["KB","MB","GB","TB"];let t=e,a=-1;do t/=1024,a+=1;while(t>=1024&&a<o.length-1);const d=t>=100?0:t>=10?1:2;return`${t.toFixed(d).replace(/\.0+$|(?<=\.[0-9])0+$/,"")} ${o[a]}`}function Q(n){return _(n.map(X))}function X(n){const e=n.match(/^\[群消息\][ \t]+<([^>\n]+)>\n([\s\S]*)$/);if(e)return{speaker:e[1],body:e[2]};const o=n.match(/^\[群消息\]\n<([^>\n]+)>\n([\s\S]*)$/);if(o)return{speaker:o[1],body:o[2]};const t=n.match(/^群消息\n([^\n]+)\n([\s\S]*)$/);if(t)return{speaker:t[1],body:t[2]};const a=n.match(/^([^\n]+)\n([\s\S]*)$/);return a?{speaker:a[1],body:a[2]}:{speaker:"\u7FA4\u6210\u5458",body:n.trim()}}function _(n){if(n.length===1){const[e]=n;return`[\u7FA4\u6D88\u606F] <${e.speaker}>
1
+ import{isAvailableBuiltinAgentType as k,managedAgentExecutionMode as P}from"@shennian/wire";import{getBuiltinAgentVersion as S,resolveBuiltinCommand as B}from"../agents/command-spec.js";import{registerCustomRuntimeSecurity as K,resolveCustomRuntimeExecutableFingerprint as $}from"../agents/custom-managed-runtime.js";import{loadConfig as x}from"../config/index.js";import{resolveManagedAgentExecutableIdentity as T}from"../security/managed-agent-executable.js";import{compileManagedAgentPolicy as W}from"../security/managed-agent-policy.js";import{resolveManagedAgentRuntimeProtection as R}from"../security/managed-agent-runtime.js";import{selectRoomActivationTargets as q}from"./activation-policy.js";import{buildManagedAgentPermissionPrompt as D,composeManagedRoomPrompt as E}from"./managed-prompt-composer.js";import{isCurrentRegistration as f}from"./registration-authority.js";const N=4,O=6e4,F=6,V=5*6e4;class ce{deps;latestContexts=new Map;constructor(e){this.deps=e}async processMessages(e,i,t,a={roomName:"\u5F53\u524D\u7FA4\u804A"}){const d=[],m=[],c=new Map,u=new Set,g=[...i].sort((r,s)=>J(r.sequence,s.sequence));for(const r of t){const s=this.deps.registry.getByRegistryKey(r.registryKey);!s?.binding||!f(this.deps.registry,r)||s.binding.roomId!==e||s.binding.status!=="active"&&s.binding.status!=="paused"&&s.binding.activationQueue.length}for(const r of t){const s=this.deps.registry.getByRegistryKey(r.registryKey);if(!s?.binding||!f(this.deps.registry,r)||s.binding.roomId!==e||s.binding.activationQueue.length===0&&!s.binding.activeActivation||(u.add(s.registryKey),s.binding.status!=="active"||s.binding.activationMode==="paused")||s.binding.activationQueue.length===0)continue;const l=this.deps.observations.getBySource(s);if(!l?.workspacePath||l.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");this.latestContexts.set(s.registryKey,a);for(const o of s.binding.activationQueue)d.push({registration:s,input:{params:{sessionId:s.nianSessionId,text:o.deliveryText??"\u7FA4\u804A\u4E2D\u6709\u4E00\u6761\u5F85\u5904\u7406\u6D88\u606F\uFF0C\u8BF7\u7ED3\u5408\u5F53\u524D\u7FA4\u804A\u4E0A\u4E0B\u6587\u5904\u7406\u3002",agentType:y(s.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[s.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:l.workspacePath,agentSessionId:s.sourceSessionKey,queueMessageId:`room-activation-${s.binding.bindingId}-${o.causeMessageId}`,clientMessageId:`room-activation-${s.binding.bindingId}-${o.causeMessageId}`},context:{registryKey:s.registryKey,causeMessageId:o.causeMessageId,rootCauseMessageId:o.rootCauseMessageId,sequence:o.sequence,hopCount:o.hopCount}}})}for(const r of g){const s=new Set(q(r,t).map(l=>l.registration.registryKey));for(const l of t){const o=this.deps.registry.getByRegistryKey(l.registryKey);if(!o?.binding||!f(this.deps.registry,l)||o.binding.roomId!==e||o.binding.status!=="active"&&o.binding.status!=="paused"||a.agentsByIdentityId?.[o.binding.agentIdentityId]?.configurationPending||BigInt(r.sequence)<=BigInt(o.binding.lastActivatedSequence))continue;const h=c.get(o.registryKey)??[...o.binding.mentionContext??[]];if(c.set(o.registryKey,h),s.has(o.registryKey)){const p=(r.activationCause?.hopCount??0)+(r.author.principalType==="agent"?1:0),I=r.activationCause?.rootCauseMessageId??r.id;if(p>N)this.audit(o,r.id,I,p,"suppressed","max_hops");else{const w=this.deps.registry.claimActivation({registryKey:o.registryKey,causeMessageId:r.id,windowMs:O,maxActivations:F,pauseMs:V,now:this.deps.now?.()});if(!w.allowed){w.newlyPaused&&this.audit(o,r.id,I,p,"suppressed","rate_limited"),m.push({registryKey:o.registryKey,sequence:r.sequence});continue}const b=this.deps.observations.getBySource(o);if(!b?.workspacePath||b.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const M=v([r]),A=o.binding.activationMode==="mention_only"?Q([...h.map(C=>C.deliveryText),M]):M;this.latestContexts.set(o.registryKey,a),d.push({registration:o,input:{params:{sessionId:o.nianSessionId,text:A,agentType:y(o.runtimeAdapter),sessionMode:a.agentsByIdentityId?.[o.binding.agentIdentityId]?.sessionMode??"standard",managerConfig:a.agentsByIdentityId?.[o.binding.agentIdentityId]?.managerConfig??null,managerDefaultWorkerAgentType:a.agentsByIdentityId?.[o.binding.agentIdentityId]?.managerConfig?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a.agentsByIdentityId?.[o.binding.agentIdentityId]?.managerConfig?.defaultWorkerModelId??null,workDir:b.workspacePath,agentSessionId:o.sourceSessionKey,queueMessageId:`room-activation-${o.binding.bindingId}-${r.id}`,clientMessageId:`room-activation-${o.binding.bindingId}-${r.id}`,roomMessageCreatedAt:r.createdAt},context:{registryKey:o.registryKey,causeMessageId:r.id,rootCauseMessageId:I,sequence:r.sequence,hopCount:p}}}),o.binding.activationMode==="mention_only"&&c.set(o.registryKey,[])}}else o.binding.activationMode==="mention_only"&&r.kind!=="system"&&r.author.membershipId!==o.binding.agentMembershipId&&(h.some(p=>p.sequence===r.sequence)||h.push({sequence:r.sequence,deliveryText:v([r])}));m.push({registryKey:o.registryKey,sequence:r.sequence})}}await this.deps.enqueueConversationBatch(d.map(r=>r.input));for(const r of u)this.deps.registry.retireLegacyActivationState(r,this.deps.now?.()??new Date);for(const[r,s]of c)this.deps.registry.getByRegistryKey(r)?.lifecycleState!=="closed"&&this.deps.registry.replaceMentionContext(r,s,this.deps.now?.()??new Date);for(const r of d)this.audit(r.registration,r.input.context.causeMessageId,r.input.context.rootCauseMessageId,r.input.context.hopCount,"queued","conversation_queue");for(const r of m)this.deps.registry.getByRegistryKey(r.registryKey)?.lifecycleState!=="closed"&&this.deps.registry.advanceCursor({registryKey:r.registryKey,cursor:"activated",sequence:r.sequence})}async prepareConversationTurn(e){const i=e.at(-1);if(!i)throw new Error("managed_room_queue_context_missing");const t=this.deps.registry.getByRegistryKey(i.registryKey);if(!t)throw new Error("managed_room_binding_unavailable");const a=await this.prepareManagedTurn(t,i.causeMessageId);return this.audit(t,i.causeMessageId,i.rootCauseMessageId,i.hopCount,"activated","conversation_queue_dispatch"),a}async prepareDirectConversationTurn(e,i={}){const t=i.roomOrigin?this.deps.registry.getByRegistryKey(i.roomOrigin.registryKey):this.deps.registry.getByNianSessionId(e);return t?.binding?t.nianSessionId!==e||i.roomOrigin&&(t.registrationEpoch!==i.roomOrigin.registrationEpoch||t.binding?.bindingId!==i.roomOrigin.bindingId||t.binding.roomId!==i.roomOrigin.roomId)?null:this.prepareManagedTurn(t,void 0,i):i.roomOrigin||i.scheduledTask?null:this.deps.prepareUnboundDirectTurn?.(e)??null}async prepareManagedTurn(e,i,t){if(!f(this.deps.registry,e)||!e.binding||e.binding.status!=="active")throw new Error("managed_room_binding_unavailable");const a=this.deps.loadContext?await this.deps.loadContext(e):this.latestContexts.get(e.registryKey);if(!a)throw new Error("managed_room_prompt_context_unavailable");const d=a.agentsByIdentityId?.[e.binding.agentIdentityId];if(d?.configurationPending)throw new Error("managed_agent_configuration_pending");if(!d?.permissionPolicy)throw new Error("managed_agent_policy_missing");const m=d.sessionMode==="manager"?"manager":"standard",c=m==="manager"?{...d.managerConfig,defaultWorkerAgentType:d.managerConfig?.defaultWorkerAgentType??y(e.runtimeAdapter),defaultWorkerModelId:d.managerConfig?.defaultWorkerModelId??null}:null,u=this.deps.observations.getBySource(e);if(!u?.workspacePath||u.lifecycleState==="closed")throw new Error("managed_room_workspace_unavailable");const g=this.deps.resolveManagedAgentPolicy?await this.deps.resolveManagedAgentPolicy({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:u.workspacePath}):await H({registration:e,permissionPolicy:d.permissionPolicy,permissionConfirmation:d.permissionConfirmation,workDir:u.workspacePath});if(!f(this.deps.registry,e))throw new Error("managed_room_binding_unavailable");const r=G(a,e,g),s=this.deps.issueManagedRoomContext(e.registryKey,i,t?.allowedRoomActions,t?.propagateWorkerRoomOrigin);if(!/^mrc_[A-Za-z0-9_-]{43}$/.test(s))throw new Error("managed_room_context_unavailable");return{agentType:y(e.runtimeAdapter),effectiveModelId:a.effectiveModelsBySessionId?.[e.nianSessionId],workDir:g.adapterPolicy.workDir,agentSessionId:e.sourceSessionKey,systemPrompt:t?X({managerEvent:t.managerEvent===!0,scheduledTask:t.scheduledTask===!0,roomSendAllowed:t.allowedRoomActions?.includes("send")===!0,agentSystemPrompt:a.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],managedAgentPolicy:g,runtimeAdapter:y(e.runtimeAdapter)}):r.systemPrompt,sessionMode:m,managerConfig:c,managerDefaultWorkerAgentType:c?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:c?.defaultWorkerModelId??null,roomContextRegistryKey:e.registryKey,managedRoomContextToken:s,managedAgentPolicy:g,managedRoomPromptSnapshot:r.snapshot}}audit(e,i,t,a,d,m){e.binding&&this.deps.audit?.record({roomId:e.binding.roomId,bindingId:e.binding.bindingId,causeMessageId:i,rootCauseMessageId:t,hopCount:a,outcome:d,reason:m,at:this.deps.now?.()})}}function v(n){if(n.length===1&&n[0].kind==="system")return`[\u7FA4\u4E8B\u4EF6]
2
+ ${n[0].text?.trim()||"\u7FA4\u804A\u72B6\u6001\u53D1\u751F\u53D8\u5316\u3002"}`;const e=n.map(i=>{const t=i.text?.trim()||"\u53D1\u9001\u4E86\u4E00\u6761\u6D88\u606F",a=i.attachments.length>0?`
3
+ ${i.attachments.map(L).join(`
4
+ `)}`:"";return{speaker:i.author.displayName,body:`${t}${a}`}});return _(e)}function L(n){return`\u9644\u4EF6\uFF1A${`${j(n.name)} \xB7 ${z(n.byteSize)}`}\uFF5C${n.mimeType}\uFF5CattachmentId=${n.attachmentId}`}function j(n){return String(n||"\u9644\u4EF6").replace(/[[\]\\]/g,"\\$&").replace(/[\r\n]+/g," ")}function z(n){const e=Number(n);if(!Number.isFinite(e)||e<0)return`${n} B`;if(e<1024)return`${e} B`;const i=["KB","MB","GB","TB"];let t=e,a=-1;do t/=1024,a+=1;while(t>=1024&&a<i.length-1);const d=t>=100?0:t>=10?1:2;return`${t.toFixed(d).replace(/\.0+$|(?<=\.[0-9])0+$/,"")} ${i[a]}`}function Q(n){return _(n.map(U))}function U(n){const e=n.match(/^\[群消息\][ \t]+<([^>\n]+)>\n([\s\S]*)$/);if(e)return{speaker:e[1],body:e[2]};const i=n.match(/^\[群消息\]\n<([^>\n]+)>\n([\s\S]*)$/);if(i)return{speaker:i[1],body:i[2]};const t=n.match(/^群消息\n([^\n]+)\n([\s\S]*)$/);if(t)return{speaker:t[1],body:t[2]};const a=n.match(/^([^\n]+)\n([\s\S]*)$/);return a?{speaker:a[1],body:a[2]}:{speaker:"\u7FA4\u6210\u5458",body:n.trim()}}function _(n){if(n.length===1){const[e]=n;return`[\u7FA4\u6D88\u606F] <${e.speaker}>
5
5
  ${e.body}`}return`[\u7FA4\u6D88\u606F]
6
6
  ${n.map(e=>`<${e.speaker}>
7
7
  ${e.body}`).join(`
8
8
 
9
- `)}`}function G(n){const e=E({requestedPolicy:n.managedAgentPolicy.requestedPolicy,enforcement:n.managedAgentPolicy.enforcement,resolvedWorkDir:n.managedAgentPolicy.adapterPolicy.workDir}),o=n.scheduledTask?`\u8FD9\u662F\u670D\u52A1\u5668\u5DF2\u4FDD\u5B58\u7684\u5B9A\u65F6\u4EFB\u52A1\u73B0\u5728\u89E6\u53D1\uFF0C\u4E0D\u662F\u8981\u6C42\u4F60\u521B\u5EFA\u6216\u4FEE\u6539\u5B9A\u65F6\u4EFB\u52A1\u3002\u7ACB\u5373\u6267\u884C\u672C\u8F6E\u6536\u5230\u7684\u5DE5\u4F5C\u5185\u5BB9\uFF1B\u5176\u4E2D\u7684\u5468\u671F\u548C\u65F6\u95F4\u53EA\u662F\u539F\u5B89\u6392\u80CC\u666F\uFF0C\u4E0D\u8981\u518D\u6B21\u8C03\u7528\u5B9A\u65F6\u4EFB\u52A1\u521B\u5EFA\u5DE5\u5177\u3002\u9700\u8981\u5411\u5F53\u524D\u7ED1\u5B9A\u7FA4\u804A\u6C47\u62A5\u65F6\uFF0C\u5FC5\u987B\u663E\u5F0F\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\uFF1B\u53EA\u5728\u5185\u90E8\u5BF9\u8BDD\u56DE\u590D\u4E0D\u4F1A\u53D1\u5E03\u5230\u7FA4\u804A\u3002\u53EA\u80FD\u5411\u5F53\u524D\u7ED1\u5B9A\u7FA4\u804A\u53D1\u9001\uFF0C\u4E0D\u80FD\u8BFB\u53D6\u7FA4\u5386\u53F2\u6216\u64CD\u4F5C\u5176\u4ED6\u7FA4\u804A\u3002\u82E5\u6267\u884C\u6216\u53D1\u9001\u5931\u8D25\uFF0C\u5982\u5B9E\u62A5\u544A\uFF0C\u4E0D\u5F97\u58F0\u79F0\u5DF2\u64AD\u62A5\u3002`:n.managerEvent&&n.roomSendAllowed?`\u8FD9\u662F\u7531\u5F53\u524D\u7FA4\u804A\u4EFB\u52A1\u521B\u5EFA\u7684 Worker \u89E6\u53D1\u7684\u79C1\u6709 Manager \u7EED\u8F6E\u3002\u5148\u4F7F\u7528 Manager \u5DE5\u5177\u8BFB\u53D6\u5E76\u6838\u9A8C Worker \u7ED3\u679C\u3002\u53EA\u628A\u9762\u5411\u7528\u6237\u7684\u6700\u7EC8\u8FDB\u5C55\u6216\u7ED3\u8BBA\u53D1\u9001\u5230\u8BE5\u4EFB\u52A1\u539F\u59CB\u7FA4\u804A\uFF0C\u4E0D\u53D1\u9001 Worker \u539F\u59CB\u6D3B\u52A8\u3001\u5DE5\u5177\u65E5\u5FD7\u3001\u5185\u90E8\u6807\u8BC6\u6216\u8C03\u5EA6\u7EC6\u8282\u3002\u9700\u8981\u53D1\u5E03\u65F6\u5FC5\u987B\u663E\u5F0F\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\uFF1B\u53EA\u5728\u5F53\u524D\u5185\u90E8\u5BF9\u8BDD\u4E2D\u751F\u6210\u6587\u5B57\u4E0D\u4F1A\u53D1\u9001\u5230\u7FA4\u804A\u3002`:!n.managerEvent&&n.roomSendAllowed?`\u8FD9\u662F Owner \u4E0E Manager \u7684\u79C1\u6709\u5BF9\u8BDD\u3002\u4F60\u4ECD\u53EF\u4EE3\u8868\u5F53\u524D\u7ED1\u5B9A\u7684\u667A\u80FD\u4F53\uFF0C\u6309 Owner \u660E\u786E\u8981\u6C42\u5C06\u8FDB\u5C55\u6216\u7ED3\u8BBA\u663E\u5F0F\u53D1\u9001\u5230\u5B83\u6240\u5C5E\u7684 Room\uFF1B\u9700\u8981\u53D1\u5E03\u65F6\u5FC5\u987B\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\u3002\u4F60\u4E0D\u80FD\u8BFB\u53D6 Room \u5386\u53F2\u6216\u5411\u5176\u4ED6 Room \u53D1\u9001\u3002`:n.managerEvent?"\u8FD9\u662F Worker \u89E6\u53D1\u7684\u79C1\u6709 Manager \u7EED\u8F6E\u3002\u53EF\u4EE5\u4F7F\u7528 Manager \u5DE5\u5177\u8BFB\u53D6\u5E76\u6838\u9A8C Worker \u7ED3\u679C\uFF0C\u4F46\u4E0D\u5F97\u8BFB\u53D6\u3001\u53D1\u9001\u6216\u56DE\u590D\u4EFB\u4F55 Room \u5185\u5BB9\u3002":"\u8FD9\u662F Owner \u4E0E Manager \u7684\u79C1\u6709\u5BF9\u8BDD\u3002\u53EF\u4EE5\u4F7F\u7528 Manager \u5DE5\u5177\u7BA1\u7406 Worker\uFF0C\u4F46\u5F53\u524D\u6CA1\u6709 Room \u53D1\u5E03\u6743\u9650\u3002",t=n.agentSystemPrompt?.trim();return[`[\u795E\u5FF5\u53D7\u7BA1\u79C1\u6709\u7EED\u8F6E\u89C4\u5219]
10
- ${o}
9
+ `)}`}function X(n){const e=D({requestedPolicy:n.managedAgentPolicy.requestedPolicy,enforcement:n.managedAgentPolicy.enforcement,resolvedWorkDir:n.managedAgentPolicy.adapterPolicy.workDir}),i=n.scheduledTask?`\u8FD9\u662F\u670D\u52A1\u5668\u5DF2\u4FDD\u5B58\u7684\u5B9A\u65F6\u4EFB\u52A1\u73B0\u5728\u89E6\u53D1\uFF0C\u4E0D\u662F\u8981\u6C42\u4F60\u521B\u5EFA\u6216\u4FEE\u6539\u5B9A\u65F6\u4EFB\u52A1\u3002\u7ACB\u5373\u6267\u884C\u672C\u8F6E\u6536\u5230\u7684\u5DE5\u4F5C\u5185\u5BB9\uFF1B\u5176\u4E2D\u7684\u5468\u671F\u548C\u65F6\u95F4\u53EA\u662F\u539F\u5B89\u6392\u80CC\u666F\uFF0C\u4E0D\u8981\u518D\u6B21\u8C03\u7528\u5B9A\u65F6\u4EFB\u52A1\u521B\u5EFA\u5DE5\u5177\u3002\u9700\u8981\u5411\u5F53\u524D\u7ED1\u5B9A\u7FA4\u804A\u6C47\u62A5\u65F6\uFF0C\u5FC5\u987B\u663E\u5F0F\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\uFF1B\u53EA\u5728\u5185\u90E8\u5BF9\u8BDD\u56DE\u590D\u4E0D\u4F1A\u53D1\u5E03\u5230\u7FA4\u804A\u3002\u53EA\u80FD\u5411\u5F53\u524D\u7ED1\u5B9A\u7FA4\u804A\u53D1\u9001\uFF0C\u4E0D\u80FD\u8BFB\u53D6\u7FA4\u5386\u53F2\u6216\u64CD\u4F5C\u5176\u4ED6\u7FA4\u804A\u3002\u82E5\u6267\u884C\u6216\u53D1\u9001\u5931\u8D25\uFF0C\u5982\u5B9E\u62A5\u544A\uFF0C\u4E0D\u5F97\u58F0\u79F0\u5DF2\u64AD\u62A5\u3002`:n.managerEvent&&n.roomSendAllowed?`\u8FD9\u662F\u7531\u5F53\u524D\u7FA4\u804A\u4EFB\u52A1\u521B\u5EFA\u7684 Worker \u89E6\u53D1\u7684\u79C1\u6709 Manager \u7EED\u8F6E\u3002\u5148\u4F7F\u7528 Manager \u5DE5\u5177\u8BFB\u53D6\u5E76\u6838\u9A8C Worker \u7ED3\u679C\u3002\u53EA\u628A\u9762\u5411\u7528\u6237\u7684\u6700\u7EC8\u8FDB\u5C55\u6216\u7ED3\u8BBA\u53D1\u9001\u5230\u8BE5\u4EFB\u52A1\u539F\u59CB\u7FA4\u804A\uFF0C\u4E0D\u53D1\u9001 Worker \u539F\u59CB\u6D3B\u52A8\u3001\u5DE5\u5177\u65E5\u5FD7\u3001\u5185\u90E8\u6807\u8BC6\u6216\u8C03\u5EA6\u7EC6\u8282\u3002\u9700\u8981\u53D1\u5E03\u65F6\u5FC5\u987B\u663E\u5F0F\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\uFF1B\u53EA\u5728\u5F53\u524D\u5185\u90E8\u5BF9\u8BDD\u4E2D\u751F\u6210\u6587\u5B57\u4E0D\u4F1A\u53D1\u9001\u5230\u7FA4\u804A\u3002`:!n.managerEvent&&n.roomSendAllowed?`\u8FD9\u662F Owner \u4E0E Manager \u7684\u79C1\u6709\u5BF9\u8BDD\u3002\u4F60\u4ECD\u53EF\u4EE3\u8868\u5F53\u524D\u7ED1\u5B9A\u7684\u667A\u80FD\u4F53\uFF0C\u6309 Owner \u660E\u786E\u8981\u6C42\u5C06\u8FDB\u5C55\u6216\u7ED3\u8BBA\u663E\u5F0F\u53D1\u9001\u5230\u5B83\u6240\u5C5E\u7684 Room\uFF1B\u9700\u8981\u53D1\u5E03\u65F6\u5FC5\u987B\u4F7F\u7528${n.runtimeAdapter==="codex"?" shennian_room_send \u5DE5\u5177":" shennian room send \u547D\u4EE4"}\u3002\u4F60\u4E0D\u80FD\u8BFB\u53D6 Room \u5386\u53F2\u6216\u5411\u5176\u4ED6 Room \u53D1\u9001\u3002`:n.managerEvent?"\u8FD9\u662F Worker \u89E6\u53D1\u7684\u79C1\u6709 Manager \u7EED\u8F6E\u3002\u53EF\u4EE5\u4F7F\u7528 Manager \u5DE5\u5177\u8BFB\u53D6\u5E76\u6838\u9A8C Worker \u7ED3\u679C\uFF0C\u4F46\u4E0D\u5F97\u8BFB\u53D6\u3001\u53D1\u9001\u6216\u56DE\u590D\u4EFB\u4F55 Room \u5185\u5BB9\u3002":"\u8FD9\u662F Owner \u4E0E Manager \u7684\u79C1\u6709\u5BF9\u8BDD\u3002\u53EF\u4EE5\u4F7F\u7528 Manager \u5DE5\u5177\u7BA1\u7406 Worker\uFF0C\u4F46\u5F53\u524D\u6CA1\u6709 Room \u53D1\u5E03\u6743\u9650\u3002",t=n.agentSystemPrompt?.trim();return[`[\u795E\u5FF5\u53D7\u7BA1\u79C1\u6709\u7EED\u8F6E\u89C4\u5219]
10
+ ${i}
11
11
  \u4E0D\u5F97\u731C\u6D4B\u6216\u5C55\u793A Room\u3001Agent\u3001Session\u3001Binding\u3001Membership\u3001Machine \u6807\u8BC6\u6216\u4EFB\u4F55\u51ED\u636E\u3002`,e,t?`[\u667A\u80FD\u4F53\u79C1\u6709\u7CFB\u7EDF\u63D0\u793A\u8BCD]
12
12
  ${t}`:""].filter(Boolean).join(`
13
13
 
14
- `)}function H(n,e,o){const t=e.binding?n.agentsByIdentityId?.[e.binding.agentIdentityId]:void 0;if(!e.binding||!t)throw new Error("managed_room_prompt_incomplete");return D({runtimeAdapter:y(e.runtimeAdapter),agent:{displayName:t.displayName,description:t.description,systemPrompt:n.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],configurationVersion:t.configurationVersion},room:{name:n.roomName,activationMode:e.binding.activationMode,members:n.members},runtimePermissions:{requestedPolicy:o.requestedPolicy,enforcement:o.enforcement,resolvedWorkDir:o.adapterPolicy.workDir}})}async function U(n){const e=y(n.registration.runtimeAdapter),o=k(e)?B(e):null,t=e.startsWith("custom:")?x().customAgents?.[e.slice(7)]:void 0;t&&K(e,t);const a=n.runtime?.version??(o?S(e,o):t?.caps.version),d=n.runtime?{platform:n.runtime.runtimePlatform??process.platform,isWsl:n.runtime.runtimeIsWsl??!1,executableFingerprint:n.runtime.executableFingerprint}:o?T(o):{platform:process.platform,isWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:t?$(t):void 0},m={agentType:e,runtimeVersion:a,platform:d.platform,isWsl:d.isWsl,executableFingerprint:d.executableFingerprint,requireExecutableFingerprint:!0},c=R(m);if(e==="codex"&&n.permissionConfirmation&&(n.permissionConfirmation.platform==="win32"&&c.platform==="wsl"||n.permissionConfirmation.platform==="wsl"&&c.platform==="win32"))throw new Error("managed_agent_runtime_changed");const u=Z({confirmation:n.permissionConfirmation,policy:n.permissionPolicy,runtimeAdapter:e,protection:c}),g=await W({...m,policy:n.permissionPolicy,workDir:n.workDir,hostFullAccessConfirmed:u&&n.permissionConfirmation?.hostFullAccess,limitedProtectionConfirmed:u&&n.permissionConfirmation?.limitedProtection});if(!g.ok){const i=g.unsupportedCapabilities?.length?`:${g.unsupportedCapabilities.join(",")}`:"";throw new Error(`${g.errorCode}${i}`)}return g.value}function Z(n){const{confirmation:e,policy:o,runtimeAdapter:t}=n,a=P(o);return!!(e&&e.policyVersion===o.version&&e.runtimeAdapter===t&&(e.executionMode??"restricted")===a&&e.hostFullAccess===(a==="native-full"||o.fileAccess==="host-full"))}function y(n){return n==="claude_code"?"claude":n}function J(n,e){const o=BigInt(n),t=BigInt(e);return o<t?-1:o>t?1:0}export{ce as RoomActivationService,Z as managedAgentPermissionConfirmationMatches,U as resolveManagedAgentPolicy};
14
+ `)}function G(n,e,i){const t=e.binding?n.agentsByIdentityId?.[e.binding.agentIdentityId]:void 0;if(!e.binding||!t)throw new Error("managed_room_prompt_incomplete");return E({runtimeAdapter:y(e.runtimeAdapter),agent:{displayName:t.displayName,description:t.description,systemPrompt:n.agentSystemPromptsByIdentityId?.[e.binding.agentIdentityId],configurationVersion:t.configurationVersion},room:{name:n.roomName,activationMode:e.binding.activationMode,members:n.members},runtimePermissions:{requestedPolicy:i.requestedPolicy,enforcement:i.enforcement,resolvedWorkDir:i.adapterPolicy.workDir}})}async function H(n){const e=y(n.registration.runtimeAdapter),i=k(e)?B(e):null,t=e.startsWith("custom:")?x().customAgents?.[e.slice(7)]:void 0;t&&K(e,t);const a=n.runtime?.version??(i?S(e,i):t?.caps.version),d=n.runtime?{platform:n.runtime.runtimePlatform??process.platform,isWsl:n.runtime.runtimeIsWsl??!1,executableFingerprint:n.runtime.executableFingerprint}:i?T(i):{platform:process.platform,isWsl:process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSL_INTEROP),executableFingerprint:t?$(t):void 0},m={agentType:e,runtimeVersion:a,platform:d.platform,isWsl:d.isWsl,executableFingerprint:d.executableFingerprint,requireExecutableFingerprint:!0},c=R(m);if(e==="codex"&&n.permissionConfirmation&&(n.permissionConfirmation.platform==="win32"&&c.platform==="wsl"||n.permissionConfirmation.platform==="wsl"&&c.platform==="win32"))throw new Error("managed_agent_runtime_changed");const u=Z({confirmation:n.permissionConfirmation,policy:n.permissionPolicy,runtimeAdapter:e,protection:c}),g=await W({...m,policy:n.permissionPolicy,workDir:n.workDir,hostFullAccessConfirmed:u&&n.permissionConfirmation?.hostFullAccess,limitedProtectionConfirmed:u&&n.permissionConfirmation?.limitedProtection});if(!g.ok){const r=g.unsupportedCapabilities?.length?`:${g.unsupportedCapabilities.join(",")}`:"";throw new Error(`${g.errorCode}${r}`)}return g.value}function Z(n){const{confirmation:e,policy:i,runtimeAdapter:t}=n,a=P(i);return!!(e&&e.policyVersion===i.version&&e.runtimeAdapter===t&&(e.executionMode??"restricted")===a&&e.hostFullAccess===(a==="native-full"||i.fileAccess==="host-full"))}function y(n){return n==="claude_code"?"claude":n}function J(n,e){const i=BigInt(n),t=BigInt(e);return i<t?-1:i>t?1:0}export{ce as RoomActivationService,Z as managedAgentPermissionConfirmationMatches,H as resolveManagedAgentPolicy};
@@ -0,0 +1,5 @@
1
+ import{createHash as g}from"node:crypto";import{isRoomRuntimeAdapter as p}from"@shennian/wire";import{PublicAgentClient as u}from"../agents/public-agent-client.js";import{resolveManagedAgentPolicy as f}from"./activation-service.js";import{buildManagedAgentPermissionPrompt as y,MANAGED_ROOM_POLICY_VERSION as P}from"./managed-prompt-composer.js";async function C(i,s={list:()=>new u().list(),resolvePolicy:f}){const m=await s.list();if(!Array.isArray(m.agents))throw new Error("managed_agent_context_unavailable");const e=m.agents.find(r=>r.sessions?.some(c=>c.id===i)),n=e?.sessions.find(r=>r.id===i);if(!e||!n)return null;if(n.room||e.status!=="active"||n.status==="failed"||n.machineId!==e.machineId||!e.runtimeAdapter||!p(e.runtimeAdapter)||!e.workDir||!e.permissionPolicy)throw new Error("managed_agent_context_unavailable");const o=await s.resolvePolicy({registration:{runtimeAdapter:e.runtimeAdapter},permissionPolicy:e.permissionPolicy,permissionConfirmation:e.permissionConfirmation??null,workDir:e.workDir}),d=[`[\u795E\u5FF5\u81EA\u7528\u667A\u80FD\u4F53\u5BF9\u8BDD]
2
+ \u8FD9\u662F\u521B\u5EFA\u8005\u4E0E\u667A\u80FD\u4F53\u7684\u79C1\u6709\u5BF9\u8BDD\uFF0C\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u7FA4\u804A\u3002\u6CA1\u6709\u7FA4\u804A\u8BFB\u53D6\u3001\u53D1\u9001\u6216\u6210\u5458\u7BA1\u7406\u6743\u9650\u3002\u4E0D\u5F97\u731C\u6D4B\u6216\u5C55\u793A\u5185\u90E8\u6807\u8BC6\u6216\u51ED\u636E\u3002`,y({requestedPolicy:o.requestedPolicy,enforcement:o.enforcement,resolvedWorkDir:o.adapterPolicy.workDir}),e.systemPrompt?.trim()?`[\u667A\u80FD\u4F53\u79C1\u6709\u7CFB\u7EDF\u63D0\u793A\u8BCD]
3
+ ${e.systemPrompt.trim()}`:""].filter(Boolean).join(`
4
+
5
+ `),t=r=>g("sha256").update(r).digest("hex"),l=e.sessionMode==="manager"?"manager":"standard",a=l==="manager"?e.managerConfig:null;return{standalone:!0,agentType:e.runtimeAdapter,effectiveModelId:n.modelId??e.modelId,workDir:o.adapterPolicy.workDir,agentSessionId:`managed:${i}`,systemPrompt:d,sessionMode:l,managerConfig:a,managerDefaultWorkerAgentType:a?.defaultWorkerAgentType??null,managerDefaultWorkerModelId:a?.defaultWorkerModelId??null,roomContextRegistryKey:"",managedRoomContextToken:"",managedAgentPolicy:o,managedRoomPromptSnapshot:{agentConfigurationVersion:e.configurationVersion,providerBaseVersion:"provider-owned",managedRoomPolicyVersion:P,sessionModeInstructionsHash:null,agentSystemPromptHash:e.systemPrompt?t(e.systemPrompt):null,runtimePermissionPolicyHash:t(JSON.stringify({requestedPolicy:o.requestedPolicy,enforcement:o.enforcement})),resolvedWorkDirHash:t(o.adapterPolicy.workDir),enforcementLevel:o.enforcement.level,trustedRoomContextHash:t(""),allowedRoomOperations:[]}}}export{C as prepareStandaloneAgentTurn};
@@ -1 +1 @@
1
- import{createHash as u}from"node:crypto";import{buildManagedAgentPermissionPrompt as g}from"../../room/managed-prompt-composer.js";import{configureAdapterForSession as d,replaceManagedRoomContextToken as p}from"./chat-adapter-config.js";import{createActiveSession as c}from"./chat-session-lifecycle.js";import{validateManagedRoomExecutionContext as y}from"./chat.js";async function R(a,e,m=()=>{}){let o=null,s=null,i=null,r;if(e.source==="managed_room"||e.source==="managed_direct"||e.source==="manager_event"&&e.managedPolicyVersion){const n=await a.prepareManagedRecovery?.(e);if(!n)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"managed recovery requires a fresh permission context"};if(n.agentType!==e.agentType||n.sessionMode!==e.sessionMode||a.resolvePath(n.workDir)!==a.resolvePath(e.workDir)||n.managedRoomPromptSnapshot.managedRoomPolicyVersion!==e.managedPolicyVersion||n.managedRoomPromptSnapshot.runtimePermissionPolicyHash!==e.managedRuntimePolicyHash)return a.revokeManagedRoomContextToken?.(n.managedRoomContextToken),{result:"recovery_failed",reason:"permission_context_unavailable",message:"managed recovery authority no longer matches the interrupted run"};if(o=n.managedAgentPolicy,e.source==="manager_event"||e.source==="managed_direct")s=n.managedRoomContextToken,i=n.systemPrompt,r={source:"managed_private",recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"};else{const l={source:"room_activation",managedAgentPolicy:n.managedAgentPolicy,managedRoomPromptSnapshot:n.managedRoomPromptSnapshot};y(l,n.systemPrompt,n.managedRoomContextToken),s=n.managedRoomContextToken,i=n.systemPrompt,r={...l,recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"}}}else if(e.source==="manager_worker"&&!e.managerWorkerNativeFull){const n=e.parentSessionId;if(o=n?a.managerRuntime?.getManagedAgentPolicyForWorker(n,e.workDir)??null:null,!o)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"manager worker recovery requires the current parent policy"};if(u("sha256").update(JSON.stringify({requestedPolicy:o.requestedPolicy,enforcement:o.enforcement})).digest("hex")!==e.managedRuntimePolicyHash)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"manager worker policy changed after interruption"};i=g({requestedPolicy:o.requestedPolicy,enforcement:o.enforcement,resolvedWorkDir:o.adapterPolicy.workDir})}r??={source:"upgrade_recovery",recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"};let t=a.sessions.get(e.sessionId);return t||(t=await c(a,e.sessionId,e.agentType,e.sessionMode,e.workDir,e.agentSessionId,null,null,o,e.nativeSessionVisibility)),s&&(p(a,t,s),d(t.adapter,e.sessionId,e.agentType,null,null,s,o,a.managedRoomExecutor)),t.journalRunId=e.runId,t.currentRunId=e.providerRunId??`recovery:${e.runId}`,t.currentRunPhase="thinking",t.lastProviderActivityAt=Date.now(),e.agentType==="codex"&&e.deliveryMode==="external_owner_queue"&&e.agentSessionId&&e.externalRunId&&a.nativeFusion?.restoreExternalObservation({sessionId:e.sessionId,sourceSessionKey:e.agentSessionId,runId:e.externalRunId,canonicalMessageId:e.clientMessageId,createdAt:Date.parse(e.createdAt)})?{result:"reattached"}:t.adapter.recoverInterruptedRun({sessionId:e.sessionId,shennianRunId:e.runId,workDir:e.workDir,agentSessionId:e.agentSessionId,modelId:e.modelId,reasoningEffort:e.reasoningEffort,providerRunId:e.providerRunId,lastObservedEventSeq:e.lastObservedEventSeq,continueDispatchState:e.continueDispatchState,systemPrompt:i,sendContext:r,beforeContinueDispatch:m})}export{R as recoverJournaledRun};
1
+ import{createHash as u}from"node:crypto";import{buildManagedAgentPermissionPrompt as g}from"../../room/managed-prompt-composer.js";import{configureAdapterForSession as d,replaceManagedRoomContextToken as p}from"./chat-adapter-config.js";import{createActiveSession as c}from"./chat-session-lifecycle.js";import{validateManagedRoomExecutionContext as y}from"./chat.js";async function R(o,e,m=()=>{}){let a=null,s=null,i=null,r;if(e.source==="managed_room"||e.source==="managed_direct"||e.source==="manager_event"&&e.managedPolicyVersion){const n=await o.prepareManagedRecovery?.(e);if(!n)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"managed recovery requires a fresh permission context"};if(n.agentType!==e.agentType||n.sessionMode!==e.sessionMode||o.resolvePath(n.workDir)!==o.resolvePath(e.workDir)||n.managedRoomPromptSnapshot.managedRoomPolicyVersion!==e.managedPolicyVersion||n.managedRoomPromptSnapshot.runtimePermissionPolicyHash!==e.managedRuntimePolicyHash)return o.revokeManagedRoomContextToken?.(n.managedRoomContextToken),{result:"recovery_failed",reason:"permission_context_unavailable",message:"managed recovery authority no longer matches the interrupted run"};if(a=n.managedAgentPolicy,e.source==="manager_event"||e.source==="managed_direct")s=n.managedRoomContextToken,i=n.systemPrompt,r={source:"managed_private",recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"};else{const l={source:"room_activation",managedAgentPolicy:n.managedAgentPolicy,managedRoomPromptSnapshot:n.managedRoomPromptSnapshot};y(l,n.systemPrompt,n.managedRoomContextToken),s=n.managedRoomContextToken,i=n.systemPrompt,r={...l,recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"}}}else if(e.source==="manager_worker"&&!e.managerWorkerNativeFull){const n=e.parentSessionId;if(a=n?o.managerRuntime?.getManagedAgentPolicyForWorker(n,e.workDir)??null:null,!a)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"manager worker recovery requires the current parent policy"};if(u("sha256").update(JSON.stringify({requestedPolicy:a.requestedPolicy,enforcement:a.enforcement})).digest("hex")!==e.managedRuntimePolicyHash)return{result:"recovery_failed",reason:"permission_context_unavailable",message:"manager worker policy changed after interruption"};i=g({requestedPolicy:a.requestedPolicy,enforcement:a.enforcement,resolvedWorkDir:a.adapterPolicy.workDir})}r??={source:"upgrade_recovery",recovery:"upgrade",modelSelectionSource:"upgrade_recovery_model"};let t=o.sessions.get(e.sessionId);return t||(t=await c(o,e.sessionId,e.agentType,e.sessionMode,e.workDir,e.agentSessionId,null,null,a,e.nativeSessionVisibility)),(s||a&&(e.source==="managed_direct"||e.source==="manager_event"))&&(p(o,t,s??""),d(t.adapter,e.sessionId,e.agentType,null,null,s,a,o.managedRoomExecutor)),t.journalRunId=e.runId,t.currentRunId=e.providerRunId??`recovery:${e.runId}`,t.currentRunPhase="thinking",t.lastProviderActivityAt=Date.now(),e.agentType==="codex"&&e.deliveryMode==="external_owner_queue"&&e.agentSessionId&&e.externalRunId&&o.nativeFusion?.restoreExternalObservation({sessionId:e.sessionId,sourceSessionKey:e.agentSessionId,runId:e.externalRunId,canonicalMessageId:e.clientMessageId,createdAt:Date.parse(e.createdAt)})?{result:"reattached"}:t.adapter.recoverInterruptedRun({sessionId:e.sessionId,shennianRunId:e.runId,workDir:e.workDir,agentSessionId:e.agentSessionId,modelId:e.modelId,reasoningEffort:e.reasoningEffort,providerRunId:e.providerRunId,lastObservedEventSeq:e.lastObservedEventSeq,continueDispatchState:e.continueDispatchState,systemPrompt:i,sendContext:r,beforeContinueDispatch:m})}export{R as recoverJournaledRun};