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.
- package/README.md +16 -0
- package/dist/publish-build-manifest.json +47 -17
- package/dist/src/agents/acp/discovery.js +1 -1
- package/dist/src/agents/detect.js +1 -1
- package/dist/src/agents/model-values.js +1 -0
- package/dist/src/commands/config.js +1 -0
- package/dist/src/commands/local-apps.js +1 -0
- package/dist/src/index.js +3 -3
- package/dist/src/local-apps/service.js +1 -0
- package/dist/src/room/activation-service.js +7 -7
- package/dist/src/room/standalone-agent-turn.js +5 -0
- package/dist/src/session/handlers/chat-recovery.js +1 -1
- package/dist/src/session/handlers/chat.js +2 -2
- package/dist/src/session/handlers/local-apps.js +1 -0
- package/dist/src/session/manager.js +1 -1
- package/dist/src/session/queued-chat-dispatch.js +1 -1
- package/node_modules/@shennian/wire/dist/index.js +1 -1
- package/node_modules/@shennian/wire/dist/local-apps.js +5 -0
- package/node_modules/@sinclair/typebox/build/cjs/compiler/compiler.js +46 -26
- package/node_modules/@sinclair/typebox/build/cjs/parser/runtime/guard.d.ts +1 -1
- package/node_modules/@sinclair/typebox/build/cjs/parser/runtime/token.d.ts +2 -2
- package/node_modules/@sinclair/typebox/build/cjs/syntax/mapping.d.ts +1 -1
- package/node_modules/@sinclair/typebox/build/cjs/system/index.d.ts +0 -1
- package/node_modules/@sinclair/typebox/build/cjs/system/index.js +0 -1
- package/node_modules/@sinclair/typebox/build/cjs/type/object/object.d.ts +2 -2
- package/node_modules/@sinclair/typebox/build/cjs/type/object/object.js +2 -18
- package/node_modules/@sinclair/typebox/build/cjs/value/parse/parse.d.ts +1 -1
- package/node_modules/@sinclair/typebox/build/esm/compiler/compiler.mjs +47 -27
- package/node_modules/@sinclair/typebox/build/esm/parser/runtime/guard.d.mts +1 -1
- package/node_modules/@sinclair/typebox/build/esm/parser/runtime/token.d.mts +2 -2
- package/node_modules/@sinclair/typebox/build/esm/syntax/mapping.d.mts +1 -1
- package/node_modules/@sinclair/typebox/build/esm/system/index.d.mts +0 -1
- package/node_modules/@sinclair/typebox/build/esm/system/index.mjs +0 -1
- package/node_modules/@sinclair/typebox/build/esm/type/composite/composite.mjs +2 -2
- package/node_modules/@sinclair/typebox/build/esm/type/const/const.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/instantiate/instantiate.mjs +2 -2
- package/node_modules/@sinclair/typebox/build/esm/type/mapped/mapped.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/module/compute.mjs +2 -2
- package/node_modules/@sinclair/typebox/build/esm/type/object/object.d.mts +2 -2
- package/node_modules/@sinclair/typebox/build/esm/type/object/object.mjs +2 -18
- package/node_modules/@sinclair/typebox/build/esm/type/omit/omit.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/partial/partial.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/pick/pick.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/record/record.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/required/required.mjs +3 -3
- package/node_modules/@sinclair/typebox/build/esm/type/type/json.mjs +2 -2
- package/node_modules/@sinclair/typebox/build/esm/value/delta/delta.mjs +4 -4
- package/node_modules/@sinclair/typebox/build/esm/value/parse/parse.d.mts +1 -1
- package/node_modules/@sinclair/typebox/package.json +1 -1
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/index.js +4 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/package.json +54 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/readme.md +46 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/index.d.ts +29 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/index.js +47 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/package.json +56 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width/readme.md +50 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/index.js +4 -0
- 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
- 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
- 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
- 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
- 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
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/package.json +54 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi/readme.md +46 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/license +9 -0
- 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
- 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
- package/node_modules/qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/index.d.ts +29 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/index.js +47 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/README.md +73 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/es2015/index.js +6 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/es2015/text.js +6 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/index.d.ts +23 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/index.js +6 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/package.json +50 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/emoji-regex/text.js +6 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js +50 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json +42 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md +39 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/index.js +4 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/package.json +54 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/readme.md +46 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/package.json +56 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/string-width/readme.md +50 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase/license +9 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/index.js +13 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/license +21 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/package.json +38 -0
- package/node_modules/qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/decamelize/readme.md +48 -0
- package/node_modules/ws/lib/permessage-deflate.js +1 -3
- package/node_modules/ws/lib/receiver.js +0 -37
- package/node_modules/ws/lib/sender.js +1 -6
- package/node_modules/ws/lib/websocket-server.js +0 -8
- package/node_modules/ws/lib/websocket.js +3 -31
- package/node_modules/ws/package.json +1 -5
- package/package.json +1 -1
- package/node_modules/@sinclair/typebox/build/cjs/system/evaluate.d.ts +0 -5
- package/node_modules/@sinclair/typebox/build/cjs/system/evaluate.js +0 -11
- package/node_modules/@sinclair/typebox/build/esm/system/evaluate.d.mts +0 -5
- package/node_modules/@sinclair/typebox/build/esm/system/evaluate.mjs +0 -7
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/.travis.yml +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/CONTRIBUTING.md +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/LICENSE.md +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/README.md +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/dijkstra.js +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/package.json +0 -0
- /package/node_modules/{dijkstrajs → qrcode/node_modules/dijkstrajs}/test/dijkstra.test.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.eslintignore +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.eslintrc.json +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/.prettierignore +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/LICENSE +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/README.md +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/browser.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/base.css +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/bitmapper.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/bitpacker.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/block-navigation.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/chunkstream.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/constants.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/crc.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/favicon.png +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-pack.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse-async.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse-sync.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/filter-parse.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/format-normaliser.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/index.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/interlace.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer-async.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer-sync.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/packer.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/paeth-predictor.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser-async.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser-sync.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/parser.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/png-sync.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/png.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/prettify.css +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/prettify.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sorter.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sync-inflate.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov-report/sync-reader.js.html +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/coverage/lcov.info +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/bitmapper.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/bitpacker.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/chunkstream.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/constants.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/crc.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-pack.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse-async.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse-sync.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/filter-parse.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/format-normaliser.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/interlace.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer-async.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer-sync.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/packer.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/paeth-predictor.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser-async.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser-sync.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/parser.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/png-sync.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/png.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/sync-inflate.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/lib/sync-reader.js +0 -0
- /package/node_modules/{pngjs → qrcode/node_modules/pngjs}/package.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/LICENSE +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/README.md +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/apply-extends.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/apply-extends.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/argsert.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/argsert.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/command.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/command.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/common-types.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/common-types.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion-templates.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion-templates.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/completion.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/is-promise.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/is-promise.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/levenshtein.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/levenshtein.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/middleware.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/middleware.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/obj-filter.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/obj-filter.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/parse-command.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/parse-command.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/process-argv.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/process-argv.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/usage.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/usage.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/validation.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/validation.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yargs.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yargs.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yerror.d.ts +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/build/lib/yerror.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/index.js +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/be.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/de.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/en.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/es.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/fi.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/fr.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/hi.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/hu.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/id.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/it.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ja.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ko.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nb.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nl.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/nn.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pirate.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pl.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pt.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/pt_BR.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/ru.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/th.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/tr.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/zh_CN.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/locales/zh_TW.json +0 -0
- /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/LICENSE.txt +0 -0
- /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/README.md +0 -0
- /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/index.js +0 -0
- /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/index.d.ts +0 -0
- /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/index.js +0 -0
- /package/node_modules/{ansi-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/license +0 -0
- /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
- /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/README.md +0 -0
- /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
- /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
- /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
- /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/index.js +0 -0
- /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/package.json +0 -0
- /package/node_modules/{emoji-regex → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex}/text.js +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/index.js +0 -0
- /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/license +0 -0
- /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
- /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
- /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
- /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
- /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
- /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/package.json +0 -0
- /package/node_modules/{strip-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/strip-ansi}/readme.md +0 -0
- /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/package.json +0 -0
- /package/node_modules/{string-width → qrcode/node_modules/yargs/node_modules/cliui/node_modules/string-width}/readme.md +0 -0
- /package/node_modules/{is-fullwidth-code-point → qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi}/license +0 -0
- /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex}/license +0 -0
- /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/index.js +0 -0
- /package/node_modules/{p-limit → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/license +0 -0
- /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
- /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/index.js +0 -0
- /package/node_modules/{p-locate → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/license +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/package.json +0 -0
- /package/node_modules/{ansi-styles → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles}/readme.md +0 -0
- /package/node_modules/{p-try → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width}/license +0 -0
- /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
- /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
- /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
- /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi}/license +0 -0
- /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/package.json +0 -0
- /package/node_modules/{wrap-ansi → qrcode/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi}/readme.md +0 -0
- /package/node_modules/{cliui → qrcode/node_modules/yargs/node_modules/cliui}/package.json +0 -0
- /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/index.js +0 -0
- /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/license +0 -0
- /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/package.json +0 -0
- /package/node_modules/{decamelize → qrcode/node_modules/yargs/node_modules/decamelize}/readme.md +0 -0
- /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/index.d.ts +0 -0
- /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/index.js +0 -0
- /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/index.d.ts +0 -0
- /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/index.js +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/package.json +0 -0
- /package/node_modules/{locate-path → qrcode/node_modules/yargs/node_modules/find-up/node_modules/locate-path}/readme.md +0 -0
- /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/index.d.ts +0 -0
- /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/index.js +0 -0
- /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/package.json +0 -0
- /package/node_modules/{path-exists → qrcode/node_modules/yargs/node_modules/find-up/node_modules/path-exists}/readme.md +0 -0
- /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/package.json +0 -0
- /package/node_modules/{find-up → qrcode/node_modules/yargs/node_modules/find-up}/readme.md +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/LICENSE.md +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/README.md +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.d.ts +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.js +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/index.js.map +0 -0
- /package/node_modules/{get-caller-file → qrcode/node_modules/yargs/node_modules/get-caller-file}/package.json +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.jshintrc +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.npmignore +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/.travis.yml +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/LICENSE +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/README.markdown +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/index.js +0 -0
- /package/node_modules/{require-directory → qrcode/node_modules/yargs/node_modules/require-directory}/package.json +0 -0
- /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/LICENSE.txt +0 -0
- /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/README.md +0 -0
- /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/index.js +0 -0
- /package/node_modules/{require-main-filename → qrcode/node_modules/yargs/node_modules/require-main-filename}/package.json +0 -0
- /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/LICENSE.txt +0 -0
- /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/README.md +0 -0
- /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/index.js +0 -0
- /package/node_modules/{set-blocking → qrcode/node_modules/yargs/node_modules/set-blocking}/package.json +0 -0
- /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/LICENSE +0 -0
- /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/README.md +0 -0
- /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/index.js +0 -0
- /package/node_modules/{which-module → qrcode/node_modules/yargs/node_modules/which-module}/package.json +0 -0
- /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/LICENSE +0 -0
- /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/README.md +0 -0
- /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/index.js +0 -0
- /package/node_modules/{y18n → qrcode/node_modules/yargs/node_modules/y18n}/package.json +0 -0
- /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/LICENSE.txt +0 -0
- /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/README.md +0 -0
- /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/index.js +0 -0
- /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/lib/tokenize-arg-string.js +0 -0
- /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/index.d.ts +0 -0
- /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/index.js +0 -0
- /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/package.json +0 -0
- /package/node_modules/{camelcase → qrcode/node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase}/readme.md +0 -0
- /package/node_modules/{yargs-parser → qrcode/node_modules/yargs/node_modules/yargs-parser}/package.json +0 -0
- /package/node_modules/{yargs → qrcode/node_modules/yargs}/package.json +0 -0
- /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":
|
|
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":
|
|
85
|
-
"afterBytes":
|
|
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":
|
|
240
|
-
"afterBytes":
|
|
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":
|
|
695
|
-
"afterBytes":
|
|
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":
|
|
890
|
-
"afterBytes":
|
|
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":
|
|
1135
|
-
"afterBytes":
|
|
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":
|
|
1145
|
-
"afterBytes":
|
|
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":
|
|
1225
|
-
"afterBytes":
|
|
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":
|
|
1295
|
-
"afterBytes":
|
|
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
|
|
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{
|
|
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
|
|
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(
|
|
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
|
|
2
|
-
${n[0].text?.trim()||"\u7FA4\u804A\u72B6\u6001\u53D1\u751F\u53D8\u5316\u3002"}`;const e=n.map(
|
|
3
|
-
${
|
|
4
|
-
`)}`:"";return{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
|
|
10
|
-
${
|
|
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
|
|
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(
|
|
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};
|