@sovovs/bycli 1.8.0 → 2.1.0
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/cli-manifest.json +0 -61
- package/clis/twitter/search.js +3 -3
- package/dist/src/adapter-shadow.js +2 -2
- package/dist/src/browser/analyze.d.ts +10 -99
- package/dist/src/browser/analyze.js +10 -226
- package/dist/src/browser/cdp.js +67 -7
- package/dist/src/browser/daemon-client.d.ts +2 -0
- package/dist/src/browser/daemon-client.js +1 -1
- package/dist/src/browser/extension-capabilities.d.ts +13 -0
- package/dist/src/browser/extension-capabilities.js +22 -0
- package/dist/src/browser/extension-capabilities.test.d.ts +1 -0
- package/dist/src/browser/extension-version-metadata.test.d.ts +1 -0
- package/dist/src/browser/navigation-guard.d.ts +78 -0
- package/dist/src/browser/navigation-guard.js +142 -0
- package/dist/src/browser/navigation-guard.test.d.ts +1 -0
- package/dist/src/browser/page.d.ts +1 -0
- package/dist/src/browser/page.js +20 -1
- package/dist/src/browser/url-policy.d.ts +89 -0
- package/dist/src/browser/url-policy.js +311 -0
- package/dist/src/browser/url-policy.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.js +2 -2
- package/dist/src/build-manifest.js +4 -2
- package/dist/src/capabilityRouting.d.ts +3 -2
- package/dist/src/capabilityRouting.js +10 -2
- package/dist/src/cli.js +11 -14
- package/dist/src/commanderAdapter.js +5 -5
- package/dist/src/config-paths.d.ts +19 -0
- package/dist/src/config-paths.js +31 -0
- package/dist/src/daemon.js +256 -0
- package/dist/src/discovery.d.ts +10 -3
- package/dist/src/discovery.js +20 -10
- package/dist/src/discovery.test.d.ts +1 -0
- package/dist/src/execution.d.ts +5 -0
- package/dist/src/execution.js +272 -48
- package/dist/src/help.js +8 -8
- package/dist/src/main.js +18 -2
- package/dist/src/manifest-schema.d.ts +9 -0
- package/dist/src/manifest-schema.js +162 -0
- package/dist/src/manifest-schema.test.d.ts +1 -0
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/observation/redaction.js +10 -4
- package/dist/src/plugin.js +11 -8
- package/dist/src/recorder/highlevel/analyze.d.ts +29 -0
- package/dist/src/recorder/highlevel/analyze.js +91 -0
- package/dist/src/recorder/highlevel/init.d.ts +125 -0
- package/dist/src/recorder/highlevel/init.js +279 -0
- package/dist/src/recorder/highlevel/init.test.d.ts +1 -0
- package/dist/src/recorder/highlevel/verify.d.ts +73 -0
- package/dist/src/recorder/highlevel/verify.js +74 -0
- package/dist/src/recorder/http/analyze-runner.d.ts +28 -0
- package/dist/src/recorder/http/analyze-runner.js +78 -0
- package/dist/src/recorder/http/analyze-runner.test.d.ts +1 -0
- package/dist/src/recorder/http/handlers.d.ts +51 -0
- package/dist/src/recorder/http/handlers.js +219 -0
- package/dist/src/recorder/http/wrapper-config.d.ts +20 -0
- package/dist/src/recorder/http/wrapper-config.js +82 -0
- package/dist/src/recorder/http/wrapper-envelope.d.ts +31 -0
- package/dist/src/recorder/http/wrapper-envelope.js +51 -0
- package/dist/src/recorder/http/wrapper-gates.d.ts +16 -0
- package/dist/src/recorder/http/wrapper-gates.js +28 -0
- package/dist/src/recorder/http/wrapper-metrics.d.ts +1 -0
- package/dist/src/recorder/http/wrapper-metrics.js +5 -0
- package/dist/src/recorder/http/wrapper-registry.d.ts +50 -0
- package/dist/src/recorder/http/wrapper-registry.js +98 -0
- package/dist/src/recorder/http/wrapper-server.d.ts +59 -0
- package/dist/src/recorder/http/wrapper-server.js +240 -0
- package/dist/src/recorder/http/wrapper.test.d.ts +1 -0
- package/dist/src/recorder/observability/logger.d.ts +5 -0
- package/dist/src/recorder/observability/logger.js +13 -0
- package/dist/src/recorder/runner/config.d.ts +34 -0
- package/dist/src/recorder/runner/config.js +84 -0
- package/dist/src/recorder/runner/config.test.d.ts +1 -0
- package/dist/src/recorder/runner/reap.d.ts +79 -0
- package/dist/src/recorder/runner/reap.js +230 -0
- package/dist/src/recorder/runner/reap.test.d.ts +1 -0
- package/dist/src/recorder/runner/runner-port.d.ts +95 -0
- package/dist/src/recorder/runner/runner-port.js +518 -0
- package/dist/src/recorder/runner/runner-port.test.d.ts +1 -0
- package/dist/src/recorder/runner/session-keys.d.ts +28 -0
- package/dist/src/recorder/runner/session-keys.js +72 -0
- package/dist/src/recorder/runner/session-keys.test.d.ts +1 -0
- package/dist/src/recorder/runner/verify-runner-main.d.ts +96 -0
- package/dist/src/recorder/runner/verify-runner-main.js +292 -0
- package/dist/src/recorder/runner/verify-runner-main.test.d.ts +1 -0
- package/dist/src/registry-api.d.ts +1 -1
- package/dist/src/registry-api.types.test.d.ts +1 -0
- package/dist/src/registry-transaction.d.ts +42 -0
- package/dist/src/registry-transaction.js +194 -0
- package/dist/src/registry-transaction.test.d.ts +1 -0
- package/dist/src/registry.d.ts +58 -16
- package/dist/src/registry.js +131 -15
- package/dist/src/serialization.d.ts +1 -1
- package/dist/src/serialization.js +3 -3
- package/dist/src/types.d.ts +2 -0
- package/package.json +8 -5
- package/scripts/m1-daemon-navigate-drive.mjs +138 -0
- package/scripts/m1-extension-spike.mjs +237 -0
- package/scripts/m1-live-spike.mjs +156 -0
- package/scripts/m6b-connect-back-spike.sh +31 -0
- package/clis/12306/utils.test.js +0 -331
- package/clis/1688/assets.test.js +0 -39
- package/clis/1688/download.test.js +0 -31
- package/clis/1688/item.test.js +0 -67
- package/clis/1688/search.test.js +0 -75
- package/clis/1688/shared.test.js +0 -57
- package/clis/1688/store.test.js +0 -62
- package/clis/36kr/article.test.js +0 -46
- package/clis/36kr/hot.test.js +0 -15
- package/clis/36kr/news.test.js +0 -85
- package/clis/51job/utils.test.js +0 -69
- package/clis/_atlassian/shared.test.js +0 -170
- package/clis/aibase/news.test.js +0 -59
- package/clis/amazon/bestsellers.test.js +0 -29
- package/clis/amazon/discussion.test.js +0 -124
- package/clis/amazon/offer.test.js +0 -29
- package/clis/amazon/product.test.js +0 -24
- package/clis/amazon/rankings.test.js +0 -41
- package/clis/amazon/search.test.js +0 -22
- package/clis/amazon/shared.test.js +0 -44
- package/clis/apple-podcasts/commands.test.js +0 -119
- package/clis/apple-podcasts/utils.test.js +0 -57
- package/clis/arxiv/arxiv.test.js +0 -112
- package/clis/baidu-scholar/search.test.js +0 -23
- package/clis/barchart/greeks.test.js +0 -138
- package/clis/bilibili/comment.test.js +0 -153
- package/clis/bilibili/comments.test.js +0 -142
- package/clis/bilibili/dynamic.test.js +0 -68
- package/clis/bilibili/hot.test.js +0 -17
- package/clis/bilibili/subtitle.test.js +0 -196
- package/clis/bilibili/summary.test.js +0 -210
- package/clis/bilibili/utils.test.js +0 -61
- package/clis/bilibili/video.test.js +0 -132
- package/clis/binance/commands.test.js +0 -70
- package/clis/bloomberg/utils.test.js +0 -129
- package/clis/booking/booking.test.js +0 -356
- package/clis/boss/chatlist.test.js +0 -211
- package/clis/boss/chatmsg.test.js +0 -230
- package/clis/boss/search.test.js +0 -78
- package/clis/boss/utils.test.js +0 -34
- package/clis/brave/search.test.js +0 -76
- package/clis/chaoxing/utils.test.js +0 -45
- package/clis/chatgpt/commands.test.js +0 -45
- package/clis/chatgpt/envelope.test.js +0 -108
- package/clis/chatgpt/image.test.js +0 -188
- package/clis/chatgpt/utils.test.js +0 -330
- package/clis/chatgpt-app/ax.test.js +0 -35
- package/clis/chatwise/composer.test.js +0 -186
- package/clis/chess/analyze.test.js +0 -79
- package/clis/chess/game.test.js +0 -178
- package/clis/chess/games.test.js +0 -164
- package/clis/chess/stats.test.js +0 -79
- package/clis/chess/utils.test.js +0 -230
- package/clis/claude/ask.test.js +0 -338
- package/clis/claude/commands.test.js +0 -118
- package/clis/claude/utils.test.js +0 -148
- package/clis/cnki/search.test.js +0 -18
- package/clis/codex/sidebar.test.js +0 -329
- package/clis/coingecko/coingecko.test.js +0 -109
- package/clis/confluence/commands.test.js +0 -195
- package/clis/coupang/coupang.test.js +0 -159
- package/clis/coupang/utils.test.js +0 -62
- package/clis/ctrip/ctrip.test.js +0 -719
- package/clis/dblp/dblp.test.js +0 -397
- package/clis/deepseek/ask.test.js +0 -312
- package/clis/deepseek/detail.test.js +0 -81
- package/clis/deepseek/send.test.js +0 -107
- package/clis/deepseek/utils.test.js +0 -370
- package/clis/defillama/defillama.test.js +0 -99
- package/clis/devto/devto.test.js +0 -236
- package/clis/dianping/dianping.test.js +0 -578
- package/clis/douban/download.test.js +0 -170
- package/clis/douban/movie-hot.test.js +0 -14
- package/clis/douban/search.test.js +0 -11
- package/clis/douban/subject.test.js +0 -11
- package/clis/douban/utils.test.js +0 -438
- package/clis/doubao/detail.test.js +0 -42
- package/clis/doubao/history.test.js +0 -37
- package/clis/doubao/utils.test.js +0 -344
- package/clis/douyin/_shared/browser-fetch.test.js +0 -64
- package/clis/douyin/_shared/creation-id.test.js +0 -22
- package/clis/douyin/_shared/imagex-upload.test.js +0 -87
- package/clis/douyin/_shared/sts2.test.js +0 -27
- package/clis/douyin/_shared/text-extra.test.js +0 -37
- package/clis/douyin/_shared/timing.test.js +0 -28
- package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
- package/clis/douyin/_shared/tos-upload.test.js +0 -229
- package/clis/douyin/_shared/transcode.test.js +0 -91
- package/clis/douyin/_shared/vod-upload.test.js +0 -38
- package/clis/douyin/activities.test.js +0 -55
- package/clis/douyin/collections.test.js +0 -45
- package/clis/douyin/delete.test.js +0 -100
- package/clis/douyin/draft.test.js +0 -335
- package/clis/douyin/drafts.test.js +0 -11
- package/clis/douyin/hashtag.test.js +0 -171
- package/clis/douyin/location.test.js +0 -23
- package/clis/douyin/profile.test.js +0 -46
- package/clis/douyin/publish-upload-id.test.js +0 -170
- package/clis/douyin/publish.test.js +0 -38
- package/clis/douyin/stats.test.js +0 -22
- package/clis/douyin/update.test.js +0 -11
- package/clis/douyin/user-videos.test.js +0 -151
- package/clis/douyin/videos.test.js +0 -54
- package/clis/duckduckgo/search.test.js +0 -128
- package/clis/duckduckgo/suggest.test.js +0 -66
- package/clis/eastmoney/hot-rank.test.js +0 -59
- package/clis/endoflife/endoflife.test.js +0 -51
- package/clis/facebook/feed.test.js +0 -169
- package/clis/facebook/marketplace.test.js +0 -91
- package/clis/facebook/notifications.test.js +0 -458
- package/clis/facebook/search.test.js +0 -55
- package/clis/flathub/flathub.test.js +0 -90
- package/clis/flomo/memos.test.js +0 -144
- package/clis/gemini/ask.test.js +0 -100
- package/clis/gemini/deep-research-result.test.js +0 -155
- package/clis/gemini/deep-research.test.js +0 -181
- package/clis/gemini/reply-state.test.js +0 -671
- package/clis/gemini/utils.test.js +0 -198
- package/clis/geogebra/geogebra.test.js +0 -175
- package/clis/gitee/search.test.js +0 -65
- package/clis/gitee/user.test.js +0 -63
- package/clis/google/utils.test.js +0 -75
- package/clis/google-scholar/cite.test.js +0 -47
- package/clis/google-scholar/profile.test.js +0 -49
- package/clis/google-scholar/search.test.js +0 -71
- package/clis/goproxy/goproxy.test.js +0 -103
- package/clis/gov-law/commands.test.js +0 -39
- package/clis/gov-policy/gov-policy.test.js +0 -224
- package/clis/grok/ask.test.js +0 -29
- package/clis/grok/utils.test.js +0 -103
- package/clis/hackernews/hackernews.test.js +0 -132
- package/clis/hf/hf.test.js +0 -16
- package/clis/hupu/hot.test.js +0 -224
- package/clis/imdb/utils.test.js +0 -88
- package/clis/indeed/indeed.test.js +0 -375
- package/clis/instagram/_shared/private-publish.test.js +0 -705
- package/clis/instagram/_shared/protocol-capture.test.js +0 -114
- package/clis/instagram/download.test.js +0 -118
- package/clis/instagram/note.test.js +0 -53
- package/clis/instagram/post.test.js +0 -1647
- package/clis/instagram/reel.test.js +0 -167
- package/clis/instagram/story.test.js +0 -134
- package/clis/jd/commands.test.js +0 -41
- package/clis/jd/item.test.js +0 -354
- package/clis/jianyu/search.test.js +0 -153
- package/clis/jianyu/shared/procurement-contract.test.js +0 -72
- package/clis/jianyu/shared/procurement-detail.test.js +0 -84
- package/clis/jike/read.test.js +0 -86
- package/clis/jira/commands.test.js +0 -287
- package/clis/juejin/search.js +0 -123
- package/clis/juejin/search.test.js +0 -98
- package/clis/lesswrong/frontpage.test.js +0 -37
- package/clis/lichess/lichess.test.js +0 -85
- package/clis/linkedin/connect.test.js +0 -213
- package/clis/linkedin/inbox.test.js +0 -152
- package/clis/linkedin/job-detail.test.js +0 -38
- package/clis/linkedin/jobs-preferences.test.js +0 -43
- package/clis/linkedin/people-search.test.js +0 -216
- package/clis/linkedin/post-analytics.test.js +0 -40
- package/clis/linkedin/posts.test.js +0 -40
- package/clis/linkedin/profile-analytics.test.js +0 -67
- package/clis/linkedin/profile-experience.test.js +0 -152
- package/clis/linkedin/profile-projects.test.js +0 -111
- package/clis/linkedin/profile-read.test.js +0 -77
- package/clis/linkedin/safe-send.test.js +0 -204
- package/clis/linkedin/salesnav-inbox.test.js +0 -113
- package/clis/linkedin/salesnav-message.test.js +0 -172
- package/clis/linkedin/salesnav-search.test.js +0 -76
- package/clis/linkedin/salesnav-thread.test.js +0 -79
- package/clis/linkedin/search.test.js +0 -222
- package/clis/linkedin/sent-invitations.test.js +0 -62
- package/clis/linkedin/services-read.test.js +0 -105
- package/clis/linkedin/thread-snapshot.test.js +0 -89
- package/clis/linkedin/timeline.test.js +0 -81
- package/clis/linkedin-learning/course.test.js +0 -114
- package/clis/linkedin-learning/search.test.js +0 -144
- package/clis/linkedin-learning/trending.test.js +0 -123
- package/clis/linux-do/feed.test.js +0 -153
- package/clis/linux-do/topic-content.test.js +0 -59
- package/clis/lobsters/lobsters.test.js +0 -169
- package/clis/notebooklm/add-source.test.js +0 -97
- package/clis/notebooklm/compat.test.js +0 -16
- package/clis/notebooklm/create.test.js +0 -58
- package/clis/notebooklm/generate-audio.test.js +0 -63
- package/clis/notebooklm/generate-slides.test.js +0 -75
- package/clis/notebooklm/history.test.js +0 -58
- package/clis/notebooklm/note-list.test.js +0 -56
- package/clis/notebooklm/notes-get.test.js +0 -72
- package/clis/notebooklm/open.test.js +0 -63
- package/clis/notebooklm/rpc.test.js +0 -131
- package/clis/notebooklm/source-fulltext.test.js +0 -106
- package/clis/notebooklm/source-get.test.js +0 -84
- package/clis/notebooklm/source-guide.test.js +0 -104
- package/clis/notebooklm/summary.test.js +0 -78
- package/clis/notebooklm/utils.test.js +0 -449
- package/clis/notebooklm/write-note.test.js +0 -70
- package/clis/nuget/nuget.test.js +0 -111
- package/clis/oeis/oeis.test.js +0 -88
- package/clis/ones/task-helpers.test.js +0 -12
- package/clis/ones/worklog.test.js +0 -20
- package/clis/openfda/openfda.test.js +0 -114
- package/clis/openreview/openreview.test.js +0 -427
- package/clis/osv/osv.test.js +0 -97
- package/clis/paperreview/commands.test.js +0 -243
- package/clis/paperreview/utils.test.js +0 -49
- package/clis/pixiv/download.test.js +0 -87
- package/clis/pixiv/illusts.test.js +0 -99
- package/clis/pixiv/search.test.js +0 -83
- package/clis/powerchina/search.test.js +0 -93
- package/clis/producthunt/utils.test.js +0 -64
- package/clis/pubmed/pubmed.test.js +0 -276
- package/clis/quark/utils.test.js +0 -58
- package/clis/qwen/utils.test.js +0 -45
- package/clis/reddit/extract-media.test.js +0 -149
- package/clis/reddit/frontpage.test.js +0 -34
- package/clis/reddit/home.test.js +0 -170
- package/clis/reddit/hot.test.js +0 -32
- package/clis/reddit/popular.test.js +0 -26
- package/clis/reddit/read.test.js +0 -335
- package/clis/reddit/reply.test.js +0 -89
- package/clis/reddit/search.test.js +0 -26
- package/clis/reddit/subreddit-info.test.js +0 -163
- package/clis/reddit/subreddit.test.js +0 -31
- package/clis/reddit/subscribed.test.js +0 -168
- package/clis/reddit/whoami.test.js +0 -105
- package/clis/rednote/navigation.test.js +0 -26
- package/clis/rednote/rednote.test.js +0 -222
- package/clis/rest-countries/rest-countries.test.js +0 -83
- package/clis/reuters/reuters.test.js +0 -299
- package/clis/rfc/rfc.test.js +0 -74
- package/clis/sinafinance/stock.test.js +0 -59
- package/clis/spotify/utils.test.js +0 -67
- package/clis/stackoverflow/stackoverflow.test.js +0 -404
- package/clis/steam/steam.test.js +0 -46
- package/clis/substack/utils.test.js +0 -44
- package/clis/suno/commands.test.js +0 -188
- package/clis/suno/download.test.js +0 -151
- package/clis/suno/generate.test.js +0 -252
- package/clis/suno/utils.test.js +0 -329
- package/clis/taobao/commands.test.js +0 -41
- package/clis/tdx/hot-rank.test.js +0 -59
- package/clis/ths/hot-rank.test.js +0 -64
- package/clis/tieba/commands.test.js +0 -79
- package/clis/tieba/utils.test.js +0 -290
- package/clis/tiktok/creator-videos.test.js +0 -113
- package/clis/tiktok/refactor.test.js +0 -389
- package/clis/tiktok/write-refactor.test.js +0 -370
- package/clis/toutiao/toutiao.test.js +0 -378
- package/clis/tvmaze/tvmaze.test.js +0 -93
- package/clis/twitter/bookmark-folder.test.js +0 -395
- package/clis/twitter/bookmark-folders.test.js +0 -152
- package/clis/twitter/bookmark.test.js +0 -74
- package/clis/twitter/bookmarks.test.js +0 -205
- package/clis/twitter/delete.test.js +0 -85
- package/clis/twitter/device-follow.test.js +0 -287
- package/clis/twitter/download.test.js +0 -457
- package/clis/twitter/followers.test.js +0 -62
- package/clis/twitter/following.test.js +0 -338
- package/clis/twitter/hide-reply.test.js +0 -76
- package/clis/twitter/like.test.js +0 -73
- package/clis/twitter/likes.test.js +0 -220
- package/clis/twitter/list-add.test.js +0 -133
- package/clis/twitter/list-create.test.js +0 -169
- package/clis/twitter/list-remove.test.js +0 -110
- package/clis/twitter/list-tweets.test.js +0 -196
- package/clis/twitter/lists.test.js +0 -253
- package/clis/twitter/post.test.js +0 -258
- package/clis/twitter/profile.test.js +0 -39
- package/clis/twitter/quote.test.js +0 -194
- package/clis/twitter/reply.test.js +0 -237
- package/clis/twitter/retweet.test.js +0 -73
- package/clis/twitter/search.test.js +0 -349
- package/clis/twitter/shared.test.js +0 -794
- package/clis/twitter/thread.test.js +0 -58
- package/clis/twitter/timeline.test.js +0 -104
- package/clis/twitter/trending.test.js +0 -15
- package/clis/twitter/tweets.test.js +0 -362
- package/clis/twitter/unbookmark.test.js +0 -73
- package/clis/twitter/unlike.test.js +0 -75
- package/clis/twitter/unretweet.test.js +0 -73
- package/clis/twitter/utils.test.js +0 -169
- package/clis/uisdc/news.test.js +0 -66
- package/clis/uiverse/_shared.test.js +0 -62
- package/clis/uiverse/navigation.test.js +0 -12
- package/clis/upwork/upwork.test.js +0 -566
- package/clis/wanfang/search.test.js +0 -23
- package/clis/web/read.test.js +0 -392
- package/clis/weibo/delete.test.js +0 -94
- package/clis/weibo/envelope.test.js +0 -85
- package/clis/weibo/favorites.test.js +0 -114
- package/clis/weibo/publish.test.js +0 -192
- package/clis/weibo/user-posts.test.js +0 -92
- package/clis/weibo/utils.test.js +0 -36
- package/clis/weixin/drafts.test.js +0 -69
- package/clis/weixin/search.test.js +0 -227
- package/clis/weread/ai-outline.test.js +0 -83
- package/clis/weread/book-search.test.js +0 -242
- package/clis/weread/commands.test.js +0 -398
- package/clis/weread/private-api-regression.test.js +0 -369
- package/clis/weread/search-regression.test.js +0 -494
- package/clis/weread/utils.test.js +0 -128
- package/clis/weread-official/commands.test.js +0 -385
- package/clis/weread-official/utils.test.js +0 -242
- package/clis/wikidata/wikidata.test.js +0 -83
- package/clis/wikipedia/trending.test.js +0 -57
- package/clis/wttr/wttr.test.js +0 -84
- package/clis/xianyu/chat.test.js +0 -84
- package/clis/xianyu/im.test.js +0 -253
- package/clis/xianyu/item.test.js +0 -56
- package/clis/xianyu/publish.test.js +0 -220
- package/clis/xianyu/search.test.js +0 -17
- package/clis/xiaoe/xiaoe.test.js +0 -486
- package/clis/xiaohongshu/comments.test.js +0 -258
- package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
- package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
- package/clis/xiaohongshu/creator-notes.test.js +0 -281
- package/clis/xiaohongshu/creator-stats.test.js +0 -24
- package/clis/xiaohongshu/delete-note.test.js +0 -172
- package/clis/xiaohongshu/download.test.js +0 -316
- package/clis/xiaohongshu/navigation.test.js +0 -34
- package/clis/xiaohongshu/note.test.js +0 -249
- package/clis/xiaohongshu/publish.test.js +0 -608
- package/clis/xiaohongshu/search.test.js +0 -325
- package/clis/xiaohongshu/user-helpers.test.js +0 -160
- package/clis/xiaoyuzhou/auth.test.js +0 -124
- package/clis/xiaoyuzhou/download.test.js +0 -135
- package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
- package/clis/xiaoyuzhou/transcript.test.js +0 -195
- package/clis/xiaoyuzhou/utils.test.js +0 -39
- package/clis/xueqiu/comments.test.js +0 -696
- package/clis/xueqiu/danjuan-utils.test.js +0 -41
- package/clis/xueqiu/utils.test.js +0 -26
- package/clis/yahoo/search.test.js +0 -94
- package/clis/youdao/note.test.js +0 -99
- package/clis/youtube/channel.test.js +0 -59
- package/clis/youtube/feed.test.js +0 -131
- package/clis/youtube/transcript-group.test.js +0 -99
- package/clis/youtube/transcript.test.js +0 -296
- package/clis/youtube/utils.test.js +0 -84
- package/clis/yuanbao/ask.test.js +0 -124
- package/clis/yuanbao/new.test.js +0 -30
- package/clis/yuanbao/shared.test.js +0 -80
- package/clis/zhihu/answer-comments.test.js +0 -287
- package/clis/zhihu/answer-detail.test.js +0 -338
- package/clis/zhihu/answer.test.js +0 -54
- package/clis/zhihu/collection.test.js +0 -337
- package/clis/zhihu/collections.test.js +0 -182
- package/clis/zhihu/comment.test.js +0 -50
- package/clis/zhihu/download.test.js +0 -12
- package/clis/zhihu/favorite.test.js +0 -59
- package/clis/zhihu/follow.test.js +0 -42
- package/clis/zhihu/like.test.js +0 -41
- package/clis/zhihu/question.test.js +0 -251
- package/clis/zhihu/recommend.test.js +0 -143
- package/clis/zhihu/search.test.js +0 -198
- package/clis/zhihu/target.test.js +0 -77
- package/clis/zhihu/text.test.js +0 -24
- package/clis/zhihu/write-shared.test.js +0 -176
- package/clis/zlibrary/commands.test.js +0 -65
- package/clis/zsxq/search.test.js +0 -24
- package/clis/zsxq/topic.test.js +0 -30
- package/clis/zsxq/topics.test.js +0 -24
- package/clis/zsxq/utils.test.js +0 -31
- package/dist/src/adapter-shadow.test.js +0 -49
- package/dist/src/adapter-source.test.js +0 -29
- package/dist/src/browser/analyze.test.js +0 -166
- package/dist/src/browser/article-extract.e2e.test.js +0 -105
- package/dist/src/browser/article-extract.test.js +0 -94
- package/dist/src/browser/ax-snapshot.test.js +0 -91
- package/dist/src/browser/base-page.test.js +0 -758
- package/dist/src/browser/cdp-click-fixture.test.js +0 -87
- package/dist/src/browser/cdp.test.js +0 -79
- package/dist/src/browser/compound.test.js +0 -175
- package/dist/src/browser/daemon-client.test.js +0 -199
- package/dist/src/browser/dom-helpers.test.js +0 -106
- package/dist/src/browser/dom-snapshot.test.js +0 -313
- package/dist/src/browser/errors.test.js +0 -60
- package/dist/src/browser/extract.test.js +0 -129
- package/dist/src/browser/find.test.js +0 -180
- package/dist/src/browser/html-tree.test.js +0 -181
- package/dist/src/browser/network-cache.test.js +0 -58
- package/dist/src/browser/network-key.test.js +0 -49
- package/dist/src/browser/page.test.js +0 -378
- package/dist/src/browser/shape-filter.test.js +0 -101
- package/dist/src/browser/shape.test.js +0 -82
- package/dist/src/browser/stealth.test.js +0 -134
- package/dist/src/browser/target-errors.test.js +0 -94
- package/dist/src/browser/target-resolver.test.js +0 -118
- package/dist/src/browser/utils.test.js +0 -29
- package/dist/src/browser/verify-fixture.test.js +0 -219
- package/dist/src/browser.test.js +0 -232
- package/dist/src/build-manifest.test.js +0 -341
- package/dist/src/capabilityRouting.test.js +0 -63
- package/dist/src/cli-argv-preprocess.test.js +0 -209
- package/dist/src/cli.test.js +0 -2803
- package/dist/src/commanderAdapter.test.js +0 -352
- package/dist/src/commands/daemon.test.js +0 -219
- package/dist/src/completion.test.js +0 -24
- package/dist/src/convention-audit.test.js +0 -247
- package/dist/src/daemon.test.js +0 -60
- package/dist/src/doctor.test.js +0 -263
- package/dist/src/download/article-download.test.js +0 -235
- package/dist/src/download/index.test.js +0 -140
- package/dist/src/download/media-download.test.js +0 -112
- package/dist/src/download/progress.test.js +0 -36
- package/dist/src/electron-apps.test.js +0 -49
- package/dist/src/engine.test.js +0 -312
- package/dist/src/errors.test.js +0 -109
- package/dist/src/execution.test.js +0 -623
- package/dist/src/extension-manifest-regression.test.js +0 -12
- package/dist/src/external.test.js +0 -146
- package/dist/src/help.test.js +0 -58
- package/dist/src/hooks.test.js +0 -92
- package/dist/src/interceptor.test.js +0 -81
- package/dist/src/launcher.test.js +0 -138
- package/dist/src/node-network.test.js +0 -55
- package/dist/src/observation/artifact.test.js +0 -121
- package/dist/src/observation/manager.test.js +0 -13
- package/dist/src/observation/redaction.test.js +0 -32
- package/dist/src/observation/retention.test.js +0 -118
- package/dist/src/observation/ring-buffer.test.js +0 -22
- package/dist/src/output.test.js +0 -53
- package/dist/src/package-exports.test.js +0 -112
- package/dist/src/pipeline/executor.test.js +0 -182
- package/dist/src/pipeline/steps/download.test.js +0 -102
- package/dist/src/pipeline/steps/fetch.test.js +0 -117
- package/dist/src/pipeline/template.test.js +0 -175
- package/dist/src/pipeline/transform.test.js +0 -133
- package/dist/src/plugin-manifest.test.js +0 -179
- package/dist/src/plugin-scaffold.test.js +0 -83
- package/dist/src/plugin.test.js +0 -1324
- package/dist/src/registry.test.js +0 -209
- package/dist/src/runtime-detect.test.js +0 -39
- package/dist/src/serialization.test.js +0 -78
- package/dist/src/snapshotFormatter.test.js +0 -521
- package/dist/src/tui.test.js +0 -19
- package/dist/src/update-check.test.js +0 -116
- package/dist/src/utils.test.js +0 -155
- package/dist/src/validate.test.js +0 -90
- package/dist/src/weixin-download.test.js +0 -45
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup reap (08:37) + age-based TTL sweep (M7b). On daemon (Local Service) restart, a
|
|
3
|
+
* verify-runner child and its temp dir can outlive the parent that spawned it (the parent crashed
|
|
4
|
+
* before cleanup). On startup — and periodically while running — we scan os.tmpdir() for
|
|
5
|
+
* `bycli-verify-*` dirs and clean up two classes:
|
|
6
|
+
* 1. TRUE orphans: runs whose `ownerPid` (the spawning daemon/CLI) is no longer alive.
|
|
7
|
+
* 2. AGED-OUT leaks (M7b): dirs older than the EFFECTIVE threshold, regardless of owner liveness.
|
|
8
|
+
* The caller floors that threshold at the run's hard deadline (`minLeakAgeMs` = timeoutMs +
|
|
9
|
+
* killGraceMs) — a verify cannot legitimately outlive its own kill deadline, and the runner-port
|
|
10
|
+
* deletes the temp dir on settle, so a dir still present past the deadline is a definite leak
|
|
11
|
+
* (the owning process died mid-run), never a live run. NOTE: the raw configured TTL alone is NOT
|
|
12
|
+
* safe — RECORDER_TEMP_TTL_MS can be set as low as 60000ms while timeoutMs reaches 600000ms, so
|
|
13
|
+
* without the floor the periodic sweep could kill a still-running verify.
|
|
14
|
+
* A run that is neither an orphan nor aged-out is left untouched, so a sibling process's in-flight
|
|
15
|
+
* verify is never disturbed.
|
|
16
|
+
*
|
|
17
|
+
* For a confirmed reap target whose child pid is still alive AND whose live cmdline matches
|
|
18
|
+
* (`verify-runner` + the marker requestId — a pid-reuse guard), we SIGTERM then SIGKILL. The
|
|
19
|
+
* temp dir (which holds input.json with raw seed args) is always deleted for a confirmed target.
|
|
20
|
+
*
|
|
21
|
+
* Pure helpers (parse / match / orphan / aged-out decision) are exported for unit testing; the IO
|
|
22
|
+
* entry point takes an injectable ProcProbe + clock so tests never read /proc, run `ps`, or kill.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'node:fs';
|
|
25
|
+
import * as os from 'node:os';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { execFileSync } from 'node:child_process';
|
|
28
|
+
/** Parse + validate marker.json. Returns null unless it is a well-formed verify marker. */
|
|
29
|
+
export function parseVerifyMarker(raw) {
|
|
30
|
+
let m;
|
|
31
|
+
try {
|
|
32
|
+
m = JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (!m || typeof m !== 'object')
|
|
38
|
+
return null;
|
|
39
|
+
const o = m;
|
|
40
|
+
if (o.operation !== 'verify')
|
|
41
|
+
return null;
|
|
42
|
+
if (typeof o.requestId !== 'string' || !o.requestId)
|
|
43
|
+
return null;
|
|
44
|
+
if (typeof o.tempRoot !== 'string' || !o.tempRoot)
|
|
45
|
+
return null;
|
|
46
|
+
const intOrNull = (v) => (typeof v === 'number' && Number.isInteger(v) && v > 0 ? v : null);
|
|
47
|
+
return {
|
|
48
|
+
requestId: o.requestId,
|
|
49
|
+
pid: intOrNull(o.pid),
|
|
50
|
+
ownerPid: intOrNull(o.ownerPid),
|
|
51
|
+
startedAt: typeof o.startedAt === 'number' ? o.startedAt : 0,
|
|
52
|
+
tempRoot: o.tempRoot,
|
|
53
|
+
operation: 'verify',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Does a live process's command line belong to THIS marker's runner? (pid-reuse guard) */
|
|
57
|
+
export function cmdlineMatchesMarker(cmdline, marker) {
|
|
58
|
+
return cmdline.includes('verify-runner') && cmdline.includes(marker.requestId);
|
|
59
|
+
}
|
|
60
|
+
/** Containment: the dir must sit directly under tmpRoot and carry our prefix. */
|
|
61
|
+
export function isReapableTempDir(dir, tmpRoot) {
|
|
62
|
+
const resolved = path.resolve(dir);
|
|
63
|
+
return path.dirname(resolved) === path.resolve(tmpRoot) && path.basename(resolved).startsWith('bycli-verify-');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* True orphan iff the spawning owner is gone. An unknown ownerPid (legacy marker without the
|
|
67
|
+
* field) is treated as live → skipped, so we never kill a run we cannot attribute to a dead owner.
|
|
68
|
+
*/
|
|
69
|
+
export function isOrphan(marker, ownerAlive) {
|
|
70
|
+
return marker.ownerPid !== null && !ownerAlive;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Aged-out leak (M7b · RECORDER_TEMP_TTL_MS / RECORDER_STARTUP_REAP_MAX_AGE_MS, 09:27-28):
|
|
74
|
+
* a temp dir older than `maxAgeMs` is reaped regardless of owner liveness. CALLERS MUST pass the
|
|
75
|
+
* floored threshold from `effectiveLeakThresholdMs` (never the raw config) — `maxAgeMs` here is
|
|
76
|
+
* assumed to already exceed the run's hard deadline, so a dir older than it is a definite leak,
|
|
77
|
+
* never a live run. An undatable legacy marker (startedAt<=0) is never aged-out (we cannot
|
|
78
|
+
* attribute its age). maxAgeMs<=0 disables age-based reaping (orphan-only, the pre-M7b behavior).
|
|
79
|
+
*/
|
|
80
|
+
export function isAgedOut(marker, now, maxAgeMs) {
|
|
81
|
+
return maxAgeMs > 0 && marker.startedAt > 0 && now - marker.startedAt > maxAgeMs;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Effective age-reap threshold: the configured `maxAgeMs` floored at the run's hard deadline
|
|
85
|
+
* (`minLeakAgeMs` = timeoutMs + killGraceMs). A threshold below the max legitimate run lifetime would
|
|
86
|
+
* let the sweep kill a still-running verify — a live run can outlive a short TTL but never its own
|
|
87
|
+
* kill deadline, so flooring closes that hole. A 0/negative configured value keeps age-reaping
|
|
88
|
+
* disabled (orphan-only).
|
|
89
|
+
*/
|
|
90
|
+
export function effectiveLeakThresholdMs(maxAgeMs, minLeakAgeMs) {
|
|
91
|
+
return maxAgeMs > 0 ? Math.max(maxAgeMs, minLeakAgeMs) : 0;
|
|
92
|
+
}
|
|
93
|
+
function defaultIsAlive(pid) {
|
|
94
|
+
try {
|
|
95
|
+
process.kill(pid, 0);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function defaultCmdline(pid) {
|
|
103
|
+
if (process.platform === 'win32')
|
|
104
|
+
return null; // no portable cmdline probe → don't kill on win32
|
|
105
|
+
try {
|
|
106
|
+
return execFileSync('ps', ['-p', String(pid), '-o', 'command='], { encoding: 'utf8', timeout: 2000 }).trim();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
} // ps non-zero → pid not alive
|
|
111
|
+
}
|
|
112
|
+
function defaultStartTime(pid) {
|
|
113
|
+
if (process.platform === 'win32')
|
|
114
|
+
return null; // no portable start-time probe on win32
|
|
115
|
+
try {
|
|
116
|
+
const out = execFileSync('ps', ['-p', String(pid), '-o', 'lstart='], { encoding: 'utf8', timeout: 2000 }).trim();
|
|
117
|
+
if (!out)
|
|
118
|
+
return null;
|
|
119
|
+
const t = new Date(out).getTime(); // `ps -o lstart` is an absolute local-time stamp Date can parse
|
|
120
|
+
return Number.isNaN(t) ? null : t;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const defaultProbe = {
|
|
127
|
+
isAlive: defaultIsAlive,
|
|
128
|
+
cmdline: defaultCmdline,
|
|
129
|
+
startTime: defaultStartTime,
|
|
130
|
+
kill: (pid, signal) => { process.kill(pid, signal); },
|
|
131
|
+
};
|
|
132
|
+
/** Tolerance (ms) absorbing start-time measurement granularity (`ps lstart` is second-resolution). */
|
|
133
|
+
const OWNER_PID_REUSE_TOLERANCE_MS = 60_000;
|
|
134
|
+
/**
|
|
135
|
+
* Owner pid-reuse guard (#6): the spawning owner necessarily started BEFORE it created this run, so a
|
|
136
|
+
* process now occupying `ownerPid` whose start time is meaningfully AFTER the run was created cannot be
|
|
137
|
+
* that owner — the real owner died and the pid was recycled, making this a true orphan. Undeterminable
|
|
138
|
+
* start time (win32 / ps failure → null) → NOT reused: we never escalate to a kill on a guess, so a
|
|
139
|
+
* live owner is never misclassified (its start time is ≤ runStartedAt, far below the threshold).
|
|
140
|
+
*/
|
|
141
|
+
export function isOwnerPidReused(liveStartTime, runStartedAt, toleranceMs) {
|
|
142
|
+
if (liveStartTime === null || runStartedAt <= 0)
|
|
143
|
+
return false;
|
|
144
|
+
return liveStartTime > runStartedAt + toleranceMs;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Scan tmpRoot for orphaned / aged-out verify temp dirs and clean them up. Synchronous (runs at
|
|
148
|
+
* daemon startup and on a periodic sweep); the SIGKILL backstop is scheduled async + unref'd so it
|
|
149
|
+
* never blocks. `maxAgeMs` (M7b) enables age-based reaping; 0/undefined keeps orphan-only behavior.
|
|
150
|
+
*/
|
|
151
|
+
export function reapOrphanedVerifyRuns(opts = {}) {
|
|
152
|
+
const tmpRoot = opts.tmpRoot ?? os.tmpdir();
|
|
153
|
+
const log = opts.log ?? (() => { });
|
|
154
|
+
const probe = opts.probe ?? defaultProbe;
|
|
155
|
+
const graceMs = opts.graceMs ?? 2000;
|
|
156
|
+
const maxAgeMs = effectiveLeakThresholdMs(opts.maxAgeMs ?? 0, opts.minLeakAgeMs ?? 0);
|
|
157
|
+
const now = opts.now ?? Date.now();
|
|
158
|
+
const result = { scanned: 0, orphans: 0, agedOut: 0, killed: 0, deleted: 0 };
|
|
159
|
+
let entries;
|
|
160
|
+
try {
|
|
161
|
+
entries = fs.readdirSync(tmpRoot);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
for (const entry of entries) {
|
|
167
|
+
if (!entry.startsWith('bycli-verify-'))
|
|
168
|
+
continue;
|
|
169
|
+
const dir = path.join(tmpRoot, entry);
|
|
170
|
+
if (!isReapableTempDir(dir, tmpRoot))
|
|
171
|
+
continue;
|
|
172
|
+
result.scanned++;
|
|
173
|
+
let marker = null;
|
|
174
|
+
try {
|
|
175
|
+
const st = fs.lstatSync(dir);
|
|
176
|
+
if (!st.isDirectory() || st.isSymbolicLink())
|
|
177
|
+
continue; // skip non-dirs / symlinks
|
|
178
|
+
if (typeof process.getuid === 'function' && st.uid !== process.getuid())
|
|
179
|
+
continue; // not ours
|
|
180
|
+
marker = parseVerifyMarker(fs.readFileSync(path.join(dir, 'marker.json'), 'utf8'));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
continue;
|
|
184
|
+
} // unreadable / missing marker → leave it (can't attribute ownership)
|
|
185
|
+
if (!marker)
|
|
186
|
+
continue;
|
|
187
|
+
let ownerAlive = marker.ownerPid !== null ? probe.isAlive(marker.ownerPid) : true;
|
|
188
|
+
if (ownerAlive && marker.ownerPid !== null) {
|
|
189
|
+
// pid-reuse guard (#6): an "alive" ownerPid that started after this run was created is a
|
|
190
|
+
// recycled pid, not the original owner → the real owner is dead → orphan.
|
|
191
|
+
const liveStart = probe.startTime ? probe.startTime(marker.ownerPid) : null;
|
|
192
|
+
if (isOwnerPidReused(liveStart, marker.startedAt, OWNER_PID_REUSE_TOLERANCE_MS))
|
|
193
|
+
ownerAlive = false;
|
|
194
|
+
}
|
|
195
|
+
const orphan = isOrphan(marker, ownerAlive);
|
|
196
|
+
const aged = isAgedOut(marker, now, maxAgeMs);
|
|
197
|
+
if (!orphan && !aged)
|
|
198
|
+
continue; // live owner + within TTL → still an active/managed run
|
|
199
|
+
if (orphan)
|
|
200
|
+
result.orphans++;
|
|
201
|
+
if (aged)
|
|
202
|
+
result.agedOut++;
|
|
203
|
+
// Confirmed target: terminate the child only if it is still alive AND identifiably ours.
|
|
204
|
+
if (marker.pid !== null && probe.isAlive(marker.pid)) {
|
|
205
|
+
const cmdline = probe.cmdline(marker.pid);
|
|
206
|
+
if (cmdline && cmdlineMatchesMarker(cmdline, marker)) {
|
|
207
|
+
const pid = marker.pid;
|
|
208
|
+
try {
|
|
209
|
+
probe.kill(pid, 'SIGTERM');
|
|
210
|
+
}
|
|
211
|
+
catch { /* already gone */ }
|
|
212
|
+
setTimeout(() => { try {
|
|
213
|
+
probe.kill(pid, 'SIGKILL');
|
|
214
|
+
}
|
|
215
|
+
catch { /* gone */ } }, graceMs).unref?.();
|
|
216
|
+
result.killed++;
|
|
217
|
+
log(`[reap] terminated verify runner pid=${pid} req=${marker.requestId}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
222
|
+
result.deleted++;
|
|
223
|
+
}
|
|
224
|
+
catch { /* best-effort */ }
|
|
225
|
+
}
|
|
226
|
+
if (result.scanned > 0) {
|
|
227
|
+
log(`[reap] verify temp: scanned=${result.scanned} orphans=${result.orphans} agedOut=${result.agedOut} killed=${result.killed} deleted=${result.deleted}`);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real RunnerPort (M6a · 08) — the child-process verify runner mechanism.
|
|
3
|
+
*
|
|
4
|
+
* Replaces M5c's stubRunnerPort. Responsibilities (08 Process Rules):
|
|
5
|
+
* - create requestId BEFORE launch; async registry of in-flight runs
|
|
6
|
+
* - write input.json securely: per-request `0700` temp dir (owner/mode/realpath/lstat
|
|
7
|
+
* checked), exclusive `0600` file; raw seed args live here only, never in status/log
|
|
8
|
+
* - spawn `bycli internal verify-runner --jsonl …` with an args array (no shell), minimal env
|
|
9
|
+
* - parse stdout JSONL via the pure parseRunnerEvent; one and only one terminal `result`
|
|
10
|
+
* - hard timeout → SIGTERM (graceful) → SIGKILL; stdout/stderr byte caps
|
|
11
|
+
* - cancel is idempotent; temp dir is always cleaned on done/cancel/timeout
|
|
12
|
+
*
|
|
13
|
+
* M6a does NOT implement: startup reap, browser-adapter execution (needs a daemon Page),
|
|
14
|
+
* concurrency-queue refinement — those are M6b/c. Browser adapters report not-yet from the
|
|
15
|
+
* runner itself (see verify-runner-main.ts).
|
|
16
|
+
*
|
|
17
|
+
* SECURITY: `rawSeedArgs` go into input.json (0600) only. getVerifyStatus returns a
|
|
18
|
+
* summary-only VerifySummary (normalizeRunnerResult) — raw values never reach it.
|
|
19
|
+
*/
|
|
20
|
+
import { type ChildProcess, type SpawnOptions } from 'node:child_process';
|
|
21
|
+
import { type VerifySummary, type RunnerConfig, type Metrics, type TempCapacity } from '@sovovs/bycli-recorder-core';
|
|
22
|
+
import type { RunnerPort } from '../highlevel/verify.js';
|
|
23
|
+
import { type Logger } from '../observability/logger.js';
|
|
24
|
+
type RunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'timeout' | 'cancelled';
|
|
25
|
+
type SpawnFn = (command: string, args: string[], options: SpawnOptions) => ChildProcess;
|
|
26
|
+
export interface RunnerPortOptions {
|
|
27
|
+
/** Range-validated config (09). Defaults to env (resolveRunnerConfig). */
|
|
28
|
+
config?: RunnerConfig;
|
|
29
|
+
/** What to launch: command + the args placed BEFORE the `internal verify-runner …` argv.
|
|
30
|
+
* Default: this node binary + the main entry, i.e. `node <main.js> internal verify-runner …`.
|
|
31
|
+
* Tests inject a fixture runner script here. */
|
|
32
|
+
launcher?: {
|
|
33
|
+
command: string;
|
|
34
|
+
prefixArgs: string[];
|
|
35
|
+
};
|
|
36
|
+
/** site/command → adapter module path. Default: ~/.bycli/clis/<site>/<command>.js. */
|
|
37
|
+
resolveAdapterPath?: (name: string) => string;
|
|
38
|
+
/** Injectable spawn (tests). Default node:child_process.spawn. */
|
|
39
|
+
spawnImpl?: SpawnFn;
|
|
40
|
+
/** Daemon port handed to the child (BYCLI_DAEMON_PORT) so M6b adapters can reach the Page. */
|
|
41
|
+
daemonPort?: number;
|
|
42
|
+
/** How long a terminal run lingers in `runs` for status reads before GC (default 5min). */
|
|
43
|
+
terminalRetentionMs?: number;
|
|
44
|
+
/** Observability (#1c · 09). The daemon injects its process singletons (shared with GET /metrics)
|
|
45
|
+
* via setDefaultRunnerObservability; standalone/tests get a throwaway registry + silent logger. */
|
|
46
|
+
metrics?: Metrics;
|
|
47
|
+
logger?: Logger;
|
|
48
|
+
/** Temp-store capacity guard (#1d · 09). When set, the runner measures verify temp usage before
|
|
49
|
+
* writing a new run and refuses (temp_store_full) past the high watermark. Undefined → no guard
|
|
50
|
+
* (one-shot CLI verify; only the long-running daemon enforces). */
|
|
51
|
+
tempCapacity?: TempCapacity;
|
|
52
|
+
/** Injectable temp-usage measurement (bytes). Default scans os.tmpdir() bycli-verify-* dirs.
|
|
53
|
+
* A throw is treated as over-capacity (fail-closed). Tests inject to force pressure without IO. */
|
|
54
|
+
measureTempBytes?: () => number;
|
|
55
|
+
/** Best-effort on-pressure sweep (shed orphan/aged temp dirs before re-measuring). The daemon
|
|
56
|
+
* passes its reap; default no-op (the periodic daemon sweep is the backstop). */
|
|
57
|
+
sweepTemp?: () => void;
|
|
58
|
+
}
|
|
59
|
+
/** The default runner port also exposes test/lifecycle helpers beyond the RunnerPort seam. */
|
|
60
|
+
export interface RunnerPortWithLifecycle extends RunnerPort {
|
|
61
|
+
/** Resolve when the run reaches a terminal state (test hook / status await). */
|
|
62
|
+
whenSettled(requestId: string): Promise<VerifySummary> | null;
|
|
63
|
+
/** Count of runs currently in the `running` state. */
|
|
64
|
+
activeCount(): number;
|
|
65
|
+
/** Count of runs waiting in the queue (status `queued`, not yet launched). */
|
|
66
|
+
queuedCount(): number;
|
|
67
|
+
/** Status + summary for an in-flight or settled run (daemon GET /v1/requests). null = unknown id. */
|
|
68
|
+
getRunStatus(requestId: string): {
|
|
69
|
+
status: RunStatus;
|
|
70
|
+
summary: VerifySummary | null;
|
|
71
|
+
} | null;
|
|
72
|
+
}
|
|
73
|
+
export declare function createRunnerPort(opts?: RunnerPortOptions): RunnerPortWithLifecycle;
|
|
74
|
+
/**
|
|
75
|
+
* Configure the daemon port the default runner hands to child processes via
|
|
76
|
+
* BYCLI_DAEMON_PORT (M6b: browser adapters connect back to this daemon for a Page).
|
|
77
|
+
* The daemon calls this at startup BEFORE the first defaultRunnerPort() use; calling it
|
|
78
|
+
* after the singleton is built is a no-op (the port is fixed at construction).
|
|
79
|
+
*/
|
|
80
|
+
export declare function setDefaultRunnerDaemonPort(port: number): void;
|
|
81
|
+
/**
|
|
82
|
+
* Share the daemon's metrics + structured logger with the default runner (#1c), so runner counters
|
|
83
|
+
* (timeout / queue depth / protocol error / verify duration) surface on the daemon's GET /metrics and
|
|
84
|
+
* runner verify logs share the daemon's level. Same injection contract as setDefaultRunnerDaemonPort:
|
|
85
|
+
* the daemon calls this at startup BEFORE the first defaultRunnerPort() use; later calls are no-ops.
|
|
86
|
+
*/
|
|
87
|
+
export declare function setDefaultRunnerObservability(metrics: Metrics, logger: Logger): void;
|
|
88
|
+
/**
|
|
89
|
+
* Enable the temp-store capacity guard on the default runner (#1d). Only the daemon (the long-running
|
|
90
|
+
* owner of verify temp dirs) calls this; one-shot CLI verify leaves it off. `sweepTemp` is the daemon's
|
|
91
|
+
* on-pressure shed (its reap). Same injection contract: call BEFORE the first defaultRunnerPort() use.
|
|
92
|
+
*/
|
|
93
|
+
export declare function setDefaultRunnerTempGuard(capacity: TempCapacity, sweepTemp?: () => void): void;
|
|
94
|
+
export declare function defaultRunnerPort(): RunnerPortWithLifecycle;
|
|
95
|
+
export {};
|