waterplane 0.1.25 → 0.1.26
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/CHANGELOG.md +29 -0
- package/SECURITY.md +24 -4
- package/node_modules/@waterplane/shared/dist/agentseries/compare.d.ts +8 -0
- package/node_modules/@waterplane/shared/dist/agentseries/compare.js +103 -0
- package/node_modules/@waterplane/shared/dist/agentseries/compare.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/agentseries/markers.d.ts +17 -0
- package/node_modules/@waterplane/shared/dist/agentseries/markers.js +125 -0
- package/node_modules/@waterplane/shared/dist/agentseries/markers.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/agentseries/series.d.ts +16 -0
- package/node_modules/@waterplane/shared/dist/agentseries/series.js +93 -0
- package/node_modules/@waterplane/shared/dist/agentseries/series.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/agentseries/stats.d.ts +8 -0
- package/node_modules/@waterplane/shared/dist/agentseries/stats.js +33 -0
- package/node_modules/@waterplane/shared/dist/agentseries/stats.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/agentseries/types.d.ts +103 -0
- package/node_modules/@waterplane/shared/dist/agentseries/types.js +11 -0
- package/node_modules/@waterplane/shared/dist/agentseries/types.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/agentseries.d.ts +10 -0
- package/node_modules/@waterplane/shared/dist/agentseries.js +11 -0
- package/node_modules/@waterplane/shared/dist/agentseries.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/calday.d.ts +5 -0
- package/node_modules/@waterplane/shared/dist/calday.js +10 -0
- package/node_modules/@waterplane/shared/dist/calday.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth/healthfixture.d.ts +13 -1
- package/node_modules/@waterplane/shared/dist/clihealth/healthfixture.js +22 -4
- package/node_modules/@waterplane/shared/dist/clihealth/healthfixture.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth.d.ts +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth.js +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/dictate.d.ts +6 -0
- package/node_modules/@waterplane/shared/dist/dictate.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/dictatemodels.d.ts +23 -0
- package/node_modules/@waterplane/shared/dist/dictatemodels.js +31 -0
- package/node_modules/@waterplane/shared/dist/dictatemodels.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/healthspend.d.ts +23 -0
- package/node_modules/@waterplane/shared/dist/healthspend.js +31 -0
- package/node_modules/@waterplane/shared/dist/healthspend.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/index.d.ts +7 -0
- package/node_modules/@waterplane/shared/dist/index.js +7 -0
- package/node_modules/@waterplane/shared/dist/index.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/installrow.js +10 -0
- package/node_modules/@waterplane/shared/dist/installrow.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/itempaths.d.ts +23 -0
- package/node_modules/@waterplane/shared/dist/itempaths.js +38 -0
- package/node_modules/@waterplane/shared/dist/itempaths.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/pluginlaunch.d.ts +3 -2
- package/node_modules/@waterplane/shared/dist/pluginlaunch.js +1 -1
- package/node_modules/@waterplane/shared/dist/pluginlaunch.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/pricelist.d.ts +57 -0
- package/node_modules/@waterplane/shared/dist/pricelist.js +128 -0
- package/node_modules/@waterplane/shared/dist/pricelist.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/pricing.d.ts +86 -9
- package/node_modules/@waterplane/shared/dist/pricing.js +140 -20
- package/node_modules/@waterplane/shared/dist/pricing.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/queue/queuelanestate.d.ts +14 -0
- package/node_modules/@waterplane/shared/dist/queue/queuelanestate.js +25 -0
- package/node_modules/@waterplane/shared/dist/queue/queuelanestate.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/queue/queueplan.d.ts +4 -0
- package/node_modules/@waterplane/shared/dist/queue/queueplan.js +21 -0
- package/node_modules/@waterplane/shared/dist/queue/queueplan.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/queue/queuewords.js +2 -1
- package/node_modules/@waterplane/shared/dist/queue/queuewords.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/queue.d.ts +2 -0
- package/node_modules/@waterplane/shared/dist/queue.js +1 -0
- package/node_modules/@waterplane/shared/dist/queue.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/skillstate.d.ts +51 -0
- package/node_modules/@waterplane/shared/dist/skillstate.js +176 -0
- package/node_modules/@waterplane/shared/dist/skillstate.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/skillwords.d.ts +10 -0
- package/node_modules/@waterplane/shared/dist/skillwords.js +18 -0
- package/node_modules/@waterplane/shared/dist/skillwords.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/wire/agentreadings.d.ts +147 -3
- package/node_modules/@waterplane/shared/dist/wire/agentreadings.js +29 -0
- package/node_modules/@waterplane/shared/dist/wire/agentreadings.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/wire/backend.d.ts +2 -0
- package/node_modules/@waterplane/shared/dist/wire/costwindow.d.ts +4 -0
- package/node_modules/@waterplane/shared/dist/wire/dictatesetup.d.ts +42 -0
- package/node_modules/@waterplane/shared/dist/wire/dictatesetup.js +9 -0
- package/node_modules/@waterplane/shared/dist/wire/dictatesetup.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/wire/messages/hostcore.d.ts +22 -1
- package/node_modules/@waterplane/shared/dist/wire/skills.d.ts +142 -0
- package/node_modules/@waterplane/shared/dist/wire/skills.js +6 -0
- package/node_modules/@waterplane/shared/dist/wire/skills.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/wire/sysstat.d.ts +17 -0
- package/node_modules/@waterplane/shared/dist/wire/telemetry.d.ts +4 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/packages/extensions/diskspace/waterplane-plugin.json +16 -0
- package/packages/extensions/links/waterplane-plugin.json +18 -0
- package/packages/host/dist/agentclass.d.ts +42 -31
- package/packages/host/dist/agentclass.js +155 -5
- package/packages/host/dist/agentclass.js.map +1 -1
- package/packages/host/dist/agentmarkers.d.ts +49 -0
- package/packages/host/dist/agentmarkers.js +255 -0
- package/packages/host/dist/agentmarkers.js.map +1 -0
- package/packages/host/dist/agentreadings.d.ts +30 -2
- package/packages/host/dist/agentreadings.js +89 -7
- package/packages/host/dist/agentreadings.js.map +1 -1
- package/packages/host/dist/agentscan.d.ts +1 -1
- package/packages/host/dist/agentscan.js +107 -9
- package/packages/host/dist/agentscan.js.map +1 -1
- package/packages/host/dist/archive.js +9 -3
- package/packages/host/dist/archive.js.map +1 -1
- package/packages/host/dist/artifacts.js +4 -7
- package/packages/host/dist/artifacts.js.map +1 -1
- package/packages/host/dist/askrules.js +12 -4
- package/packages/host/dist/askrules.js.map +1 -1
- package/packages/host/dist/auth.d.ts +1 -0
- package/packages/host/dist/auth.js +5 -3
- package/packages/host/dist/auth.js.map +1 -1
- package/packages/host/dist/autopull.js +4 -8
- package/packages/host/dist/autopull.js.map +1 -1
- package/packages/host/dist/backends/claude.js +1 -0
- package/packages/host/dist/backends/claude.js.map +1 -1
- package/packages/host/dist/backends/derive.js +3 -1
- package/packages/host/dist/backends/derive.js.map +1 -1
- package/packages/host/dist/binguard.js +19 -2
- package/packages/host/dist/binguard.js.map +1 -1
- package/packages/host/dist/capture.js +7 -10
- package/packages/host/dist/capture.js.map +1 -1
- package/packages/host/dist/clifixtures.d.ts +24 -4
- package/packages/host/dist/clifixtures.js +50 -10
- package/packages/host/dist/clifixtures.js.map +1 -1
- package/packages/host/dist/clihealth.d.ts +8 -2
- package/packages/host/dist/clihealth.js +11 -3
- package/packages/host/dist/clihealth.js.map +1 -1
- package/packages/host/dist/costwindow.js +4 -2
- package/packages/host/dist/costwindow.js.map +1 -1
- package/packages/host/dist/ctxlog/ctxagents.d.ts +2 -0
- package/packages/host/dist/ctxlog/ctxagents.js +5 -5
- package/packages/host/dist/ctxlog/ctxagents.js.map +1 -1
- package/packages/host/dist/ctxlog/ctxcursor.d.ts +2 -0
- package/packages/host/dist/ctxlog/ctxcursor.js +2 -2
- package/packages/host/dist/ctxlog/ctxcursor.js.map +1 -1
- package/packages/host/dist/ctxlog/ctxupdate.js +11 -6
- package/packages/host/dist/ctxlog/ctxupdate.js.map +1 -1
- package/packages/host/dist/deliver/deliverknobs.d.ts +0 -2
- package/packages/host/dist/deliver/deliverknobs.js +0 -2
- package/packages/host/dist/deliver/deliverknobs.js.map +1 -1
- package/packages/host/dist/deliver/deliverproof.d.ts +3 -2
- package/packages/host/dist/deliver/deliverproof.js +9 -8
- package/packages/host/dist/deliver/deliverproof.js.map +1 -1
- package/packages/host/dist/deliver/deliverreturn.d.ts +3 -2
- package/packages/host/dist/deliver/deliverreturn.js +13 -12
- package/packages/host/dist/deliver/deliverreturn.js.map +1 -1
- package/packages/host/dist/deliver/deliverrun.js +20 -18
- package/packages/host/dist/deliver/deliverrun.js.map +1 -1
- package/packages/host/dist/deliver/deliverscreen.d.ts +2 -1
- package/packages/host/dist/deliver/deliverscreen.js +9 -8
- package/packages/host/dist/deliver/deliverscreen.js.map +1 -1
- package/packages/host/dist/deliver/delivertypes.d.ts +4 -0
- package/packages/host/dist/deliver.js +2 -1
- package/packages/host/dist/deliver.js.map +1 -1
- package/packages/host/dist/dictate.d.ts +11 -0
- package/packages/host/dist/dictate.js +20 -10
- package/packages/host/dist/dictate.js.map +1 -1
- package/packages/host/dist/dictatesetup.d.ts +54 -0
- package/packages/host/dist/dictatesetup.js +261 -0
- package/packages/host/dist/dictatesetup.js.map +1 -0
- package/packages/host/dist/doctor.js +1 -1
- package/packages/host/dist/doctor.js.map +1 -1
- package/packages/host/dist/exposurepush.js +2 -2
- package/packages/host/dist/exposurepush.js.map +1 -1
- package/packages/host/dist/extensions/diskspace/host/candidates.d.mts +180 -0
- package/packages/host/dist/extensions/diskspace/host/candidates.mjs +716 -0
- package/packages/host/dist/extensions/diskspace/host/candidates.mjs.map +1 -0
- package/packages/host/dist/extensions/diskspace/host/engine.d.mts +21 -0
- package/packages/host/dist/extensions/diskspace/host/engine.mjs +498 -0
- package/packages/host/dist/extensions/diskspace/host/engine.mjs.map +1 -0
- package/packages/host/dist/extensions/diskspace/host/index.d.mts +25 -0
- package/packages/host/dist/extensions/diskspace/host/index.mjs +135 -0
- package/packages/host/dist/extensions/diskspace/host/index.mjs.map +1 -0
- package/packages/host/dist/extensions/diskspace/host/large.d.mts +11 -0
- package/packages/host/dist/extensions/diskspace/host/large.mjs +56 -0
- package/packages/host/dist/extensions/diskspace/host/large.mjs.map +1 -0
- package/packages/host/dist/extensions/diskspace/host/run.d.mts +94 -0
- package/packages/host/dist/extensions/diskspace/host/run.mjs +200 -0
- package/packages/host/dist/extensions/diskspace/host/run.mjs.map +1 -0
- package/packages/host/dist/extensions/diskspace/shared/wire.d.mts +197 -0
- package/packages/host/dist/extensions/diskspace/shared/wire.mjs +23 -0
- package/packages/host/dist/extensions/diskspace/shared/wire.mjs.map +1 -0
- package/packages/host/dist/extensions/links/host/engine.d.mts +39 -0
- package/packages/host/dist/extensions/links/host/engine.mjs +285 -0
- package/packages/host/dist/extensions/links/host/engine.mjs.map +1 -0
- package/packages/host/dist/extensions/links/host/index.d.mts +10 -0
- package/packages/host/dist/extensions/links/host/index.mjs +72 -0
- package/packages/host/dist/extensions/links/host/index.mjs.map +1 -0
- package/packages/host/dist/extensions/links/host/parse.d.mts +61 -0
- package/packages/host/dist/extensions/links/host/parse.mjs +225 -0
- package/packages/host/dist/extensions/links/host/parse.mjs.map +1 -0
- package/packages/host/dist/extensions/links/host/run.d.mts +15 -0
- package/packages/host/dist/extensions/links/host/run.mjs +32 -0
- package/packages/host/dist/extensions/links/host/run.mjs.map +1 -0
- package/packages/host/dist/extensions/links/host/store.d.mts +11 -0
- package/packages/host/dist/extensions/links/host/store.mjs +76 -0
- package/packages/host/dist/extensions/links/host/store.mjs.map +1 -0
- package/packages/host/dist/extensions/links/shared/wire.d.mts +141 -0
- package/packages/host/dist/extensions/links/shared/wire.mjs +20 -0
- package/packages/host/dist/extensions/links/shared/wire.mjs.map +1 -0
- package/packages/host/dist/git.d.ts +5 -3
- package/packages/host/dist/git.js +16 -28
- package/packages/host/dist/git.js.map +1 -1
- package/packages/host/dist/halt.js +16 -3
- package/packages/host/dist/halt.js.map +1 -1
- package/packages/host/dist/jsonstore.d.ts +16 -4
- package/packages/host/dist/jsonstore.js +32 -8
- package/packages/host/dist/jsonstore.js.map +1 -1
- package/packages/host/dist/landedbase.d.ts +41 -0
- package/packages/host/dist/landedbase.js +59 -0
- package/packages/host/dist/landedbase.js.map +1 -0
- package/packages/host/dist/lantls.js +2 -2
- package/packages/host/dist/lantls.js.map +1 -1
- package/packages/host/dist/limitretry.js +2 -3
- package/packages/host/dist/limitretry.js.map +1 -1
- package/packages/host/dist/localledger.js +9 -12
- package/packages/host/dist/localledger.js.map +1 -1
- package/packages/host/dist/main.js +2 -0
- package/packages/host/dist/main.js.map +1 -1
- package/packages/host/dist/opendeliveries.d.ts +4 -0
- package/packages/host/dist/opendeliveries.js +27 -1
- package/packages/host/dist/opendeliveries.js.map +1 -1
- package/packages/host/dist/plugins/setupcontrib.js +3 -2
- package/packages/host/dist/plugins/setupcontrib.js.map +1 -1
- package/packages/host/dist/pricefetch.d.ts +80 -0
- package/packages/host/dist/pricefetch.js +289 -0
- package/packages/host/dist/pricefetch.js.map +1 -0
- package/packages/host/dist/pricegap.d.ts +11 -0
- package/packages/host/dist/pricegap.js +30 -0
- package/packages/host/dist/pricegap.js.map +1 -0
- package/packages/host/dist/repohealthscopes.js +16 -24
- package/packages/host/dist/repohealthscopes.js.map +1 -1
- package/packages/host/dist/repos.d.ts +4 -0
- package/packages/host/dist/repos.js +1 -1
- package/packages/host/dist/repos.js.map +1 -1
- package/packages/host/dist/routes/apiagentpoints.d.ts +5 -0
- package/packages/host/dist/routes/apiagentpoints.js +48 -0
- package/packages/host/dist/routes/apiagentpoints.js.map +1 -0
- package/packages/host/dist/routes/apidictate.d.ts +2 -0
- package/packages/host/dist/routes/apidictate.js +27 -0
- package/packages/host/dist/routes/apidictate.js.map +1 -0
- package/packages/host/dist/routes/apihost.js +3 -2
- package/packages/host/dist/routes/apihost.js.map +1 -1
- package/packages/host/dist/routes/apirepofiles.js +3 -1
- package/packages/host/dist/routes/apirepofiles.js.map +1 -1
- package/packages/host/dist/routes/apirepowork.js +3 -2
- package/packages/host/dist/routes/apirepowork.js.map +1 -1
- package/packages/host/dist/routes/apiroutes.js +4 -1
- package/packages/host/dist/routes/apiroutes.js.map +1 -1
- package/packages/host/dist/routes/apiskills.d.ts +3 -0
- package/packages/host/dist/routes/apiskills.js +81 -0
- package/packages/host/dist/routes/apiskills.js.map +1 -0
- package/packages/host/dist/routes/apistats.js +2 -2
- package/packages/host/dist/routes/apistats.js.map +1 -1
- package/packages/host/dist/server/billingwire.js +5 -0
- package/packages/host/dist/server/billingwire.js.map +1 -1
- package/packages/host/dist/server/deliveries.d.ts +4 -1
- package/packages/host/dist/server/deliveries.js +38 -6
- package/packages/host/dist/server/deliveries.js.map +1 -1
- package/packages/host/dist/server/intentDeps.js +7 -6
- package/packages/host/dist/server/intentDeps.js.map +1 -1
- package/packages/host/dist/server/wsops.js +2 -1
- package/packages/host/dist/server/wsops.js.map +1 -1
- package/packages/host/dist/sessions/core.d.ts +1 -0
- package/packages/host/dist/sessions/ctxseries.js +7 -5
- package/packages/host/dist/sessions/ctxseries.js.map +1 -1
- package/packages/host/dist/sessions/drive.d.ts +6 -1
- package/packages/host/dist/sessions/drive.js +13 -10
- package/packages/host/dist/sessions/drive.js.map +1 -1
- package/packages/host/dist/sessions/record.js +16 -17
- package/packages/host/dist/sessions/record.js.map +1 -1
- package/packages/host/dist/sessions/sidechannel.js +1 -1
- package/packages/host/dist/sessions/sidechannel.js.map +1 -1
- package/packages/host/dist/sessions/turn.js +5 -0
- package/packages/host/dist/sessions/turn.js.map +1 -1
- package/packages/host/dist/sessions.d.ts +2 -1
- package/packages/host/dist/sessions.js +1 -1
- package/packages/host/dist/sessions.js.map +1 -1
- package/packages/host/dist/settle.d.ts +3 -2
- package/packages/host/dist/settle.js +13 -13
- package/packages/host/dist/settle.js.map +1 -1
- package/packages/host/dist/sidecar/sidecarname.d.ts +2 -0
- package/packages/host/dist/sidecar/sidecarname.js +5 -1
- package/packages/host/dist/sidecar/sidecarname.js.map +1 -1
- package/packages/host/dist/sidecar/sidecarroute.d.ts +1 -1
- package/packages/host/dist/sidecar/sidecarroute.js +5 -0
- package/packages/host/dist/sidecar/sidecarroute.js.map +1 -1
- package/packages/host/dist/sidecar.d.ts +1 -1
- package/packages/host/dist/sidecar.js +1 -1
- package/packages/host/dist/sidecar.js.map +1 -1
- package/packages/host/dist/skills/skillinventory.d.ts +23 -0
- package/packages/host/dist/skills/skillinventory.js +275 -0
- package/packages/host/dist/skills/skillinventory.js.map +1 -0
- package/packages/host/dist/skills/skilllayers.d.ts +28 -0
- package/packages/host/dist/skills/skilllayers.js +73 -0
- package/packages/host/dist/skills/skilllayers.js.map +1 -0
- package/packages/host/dist/skills/skillrecommend.d.ts +42 -0
- package/packages/host/dist/skills/skillrecommend.js +171 -0
- package/packages/host/dist/skills/skillrecommend.js.map +1 -0
- package/packages/host/dist/skills/skillrefs.d.ts +2 -0
- package/packages/host/dist/skills/skillrefs.js +50 -0
- package/packages/host/dist/skills/skillrefs.js.map +1 -0
- package/packages/host/dist/skills/skilluse.d.ts +57 -0
- package/packages/host/dist/skills/skilluse.js +242 -0
- package/packages/host/dist/skills/skilluse.js.map +1 -0
- package/packages/host/dist/skills/skillweight.d.ts +18 -0
- package/packages/host/dist/skills/skillweight.js +69 -0
- package/packages/host/dist/skills/skillweight.js.map +1 -0
- package/packages/host/dist/skills/skillwrite.d.ts +56 -0
- package/packages/host/dist/skills/skillwrite.js +183 -0
- package/packages/host/dist/skills/skillwrite.js.map +1 -0
- package/packages/host/dist/sysstat.d.ts +34 -1
- package/packages/host/dist/sysstat.js +82 -14
- package/packages/host/dist/sysstat.js.map +1 -1
- package/packages/host/dist/tokenscan.js +5 -2
- package/packages/host/dist/tokenscan.js.map +1 -1
- package/packages/host/dist/tokenstats.js +7 -4
- package/packages/host/dist/tokenstats.js.map +1 -1
- package/packages/host/dist/transcript/transcriptparse.js +2 -2
- package/packages/host/dist/transcript/transcriptparse.js.map +1 -1
- package/packages/host/dist/waitclock.d.ts +12 -0
- package/packages/host/dist/waitclock.js +23 -0
- package/packages/host/dist/waitclock.js.map +1 -0
- package/packages/host/dist/worktreeleftover.js +13 -15
- package/packages/host/dist/worktreeleftover.js.map +1 -1
- package/packages/web/dist/assets/demo-DHkwSmU5.js +26 -0
- package/packages/web/dist/assets/{icons-D8RlmSLR.js → icons-5lVTFNUU.js} +1 -1
- package/packages/web/dist/assets/index-Bh4cH6X8.js +170 -0
- package/packages/web/dist/assets/index-F7VHtsLI.css +1 -0
- package/packages/web/dist/assets/shared-BvQMg9ra.js +51 -0
- package/packages/web/dist/assets/sheets-Cwi72V02.js +257 -0
- package/packages/web/dist/assets/sheets-DjU2XiUd.css +1 -0
- package/packages/web/dist/build-id.txt +1 -1
- package/packages/web/dist/buildstamp.json +1 -1
- package/packages/web/dist/index.html +7 -7
- package/packages/web/dist/sw.js +2 -2
- package/release.json +11 -3
- package/packages/web/dist/assets/demo-mKJo0QVO.js +0 -26
- package/packages/web/dist/assets/index-B6f7Lcp1.js +0 -170
- package/packages/web/dist/assets/index-DQIK94fc.css +0 -1
- package/packages/web/dist/assets/shared-Cd69oxHd.js +0 -51
- package/packages/web/dist/assets/sheets-BImsk1_Y.js +0 -256
- package/packages/web/dist/assets/sheets-DoUhPGK0.css +0 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The links extension's host half: the methods the phone's sheet calls (`shared/wire.mts`) over the
|
|
3
|
+
* engine (`engine.mts`). Contributed through the same `HostPluginApi` an external plugin gets.
|
|
4
|
+
*
|
|
5
|
+
* Spends nothing: `lsof`, `tailscale serve status`, `gcloud … list`, `git grep` and one HEAD per pin,
|
|
6
|
+
* each with a time bound and no shell. Nothing runs until the phone asks — no poller.
|
|
7
|
+
*/
|
|
8
|
+
import { access, constants } from "node:fs/promises";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { BRAND, handleAll, makeEnvReader } from "@waterplane/shared";
|
|
12
|
+
import { PUSH_CHANGED } from "../shared/wire.mjs";
|
|
13
|
+
import { createEngine } from "./engine.mjs";
|
|
14
|
+
import { run } from "./run.mjs";
|
|
15
|
+
export { createEngine } from "./engine.mjs";
|
|
16
|
+
const { env } = makeEnvReader(process.env, (text) => console.warn(text));
|
|
17
|
+
async function firstExe(places) {
|
|
18
|
+
for (const p of places) {
|
|
19
|
+
try {
|
|
20
|
+
await access(p, constants.X_OK);
|
|
21
|
+
return p;
|
|
22
|
+
}
|
|
23
|
+
catch { /* next */ }
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/** `PATH` first (the launchd plist sets one), then the usual install places. */
|
|
28
|
+
async function findBin(name, extra) {
|
|
29
|
+
const path = (process.env.PATH || "").split(":").filter(Boolean).map((d) => join(d, name));
|
|
30
|
+
return firstExe([...path, ...extra]);
|
|
31
|
+
}
|
|
32
|
+
/** This desktop's roots. The pins file sits in the config dir next to `plugin-paths.json`. */
|
|
33
|
+
export async function defaultRoots() {
|
|
34
|
+
const home = homedir();
|
|
35
|
+
const configDir = (env("CONFIG_DIR") || "").trim()
|
|
36
|
+
|| join((process.env.XDG_CONFIG_HOME || "").trim() || join(home, ".config"), BRAND.configDirName);
|
|
37
|
+
return {
|
|
38
|
+
root: (env("ROOT") || "").trim() || join(home, "dev"),
|
|
39
|
+
file: join(configDir, "links.json"),
|
|
40
|
+
lsofBin: (await findBin("lsof", ["/usr/sbin/lsof", "/usr/bin/lsof"])) ?? "lsof",
|
|
41
|
+
tailscaleBin: await findBin("tailscale", ["/opt/homebrew/bin/tailscale", "/usr/local/bin/tailscale", "/Applications/Tailscale.app/Contents/MacOS/Tailscale"]),
|
|
42
|
+
gcloudBin: await findBin("gcloud", ["/opt/homebrew/bin/gcloud", "/usr/local/bin/gcloud", join(home, "google-cloud-sdk", "bin", "gcloud")]),
|
|
43
|
+
gitBin: (await findBin("git", ["/usr/bin/git", "/opt/homebrew/bin/git"])) ?? "git",
|
|
44
|
+
run,
|
|
45
|
+
fetch: globalThis.fetch,
|
|
46
|
+
now: () => Date.now(),
|
|
47
|
+
selfPid: process.pid,
|
|
48
|
+
probeTimeoutMs: 6_000,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Wire an engine to `api`'s methods. Exported so the tests drive the real handlers. */
|
|
52
|
+
export function serve(api, engine) {
|
|
53
|
+
return handleAll(api, {
|
|
54
|
+
state: () => engine.state(),
|
|
55
|
+
discover: (a) => engine.discover({ cloud: a?.cloud === true }),
|
|
56
|
+
probe: () => engine.probe(),
|
|
57
|
+
pin: (a) => engine.pin(String(a?.key ?? "")),
|
|
58
|
+
add: (a) => engine.add((a ?? {})),
|
|
59
|
+
edit: (a) => engine.edit((a ?? {})),
|
|
60
|
+
unpin: (a) => engine.unpin(a?.id),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
let off = null;
|
|
64
|
+
export async function activate(api) {
|
|
65
|
+
const engine = createEngine(await defaultRoots(), () => { api.push(PUSH_CHANGED, { at: Date.now() }); });
|
|
66
|
+
off = serve(api, engine);
|
|
67
|
+
}
|
|
68
|
+
export function deactivate() {
|
|
69
|
+
off?.();
|
|
70
|
+
off = null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../../extensions/links/host/index.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The links extension's readers: pure functions over what `lsof`, `tailscale serve status --json`,
|
|
3
|
+
* `gcloud run services list --format=json` and the Firebase Hosting API print. No I/O here, so the
|
|
4
|
+
* tests feed them recorded output. A line or field that does not parse is skipped, never guessed.
|
|
5
|
+
*/
|
|
6
|
+
import type { FoundLink, LinkEnv } from "../shared/wire.mjs";
|
|
7
|
+
export interface Listener {
|
|
8
|
+
pid: number;
|
|
9
|
+
proc: string;
|
|
10
|
+
addr: string;
|
|
11
|
+
port: number;
|
|
12
|
+
}
|
|
13
|
+
/** `lsof -nP -iTCP -sTCP:LISTEN -Fpcn` → one row per (pid, address). */
|
|
14
|
+
export declare function parseLsofListen(out: string): Listener[];
|
|
15
|
+
/** `lsof -a -d cwd -p <pids> -Fpn` → pid → working directory. */
|
|
16
|
+
export declare function parseLsofCwd(out: string): Map<number, string>;
|
|
17
|
+
/** A repo under the code root: its folder name (what core calls `repoName`) and where it is. A repo
|
|
18
|
+
* may sit one folder down (`~/dev/watch/watch-monorepo`), so the name is not the first segment. */
|
|
19
|
+
export interface RepoDir {
|
|
20
|
+
name: string;
|
|
21
|
+
path: string;
|
|
22
|
+
}
|
|
23
|
+
/** The repo a path is in: the deepest repo folder holding it, or null outside every one. */
|
|
24
|
+
export declare function repoOf(path: string, repos: readonly RepoDir[]): string | null;
|
|
25
|
+
/** `tailscale serve status --json` → local port → the https front door that proxies to it. */
|
|
26
|
+
export declare function parseServeStatus(json: string): Map<number, string>;
|
|
27
|
+
/** The https ports a serve config already uses, so a suggestion does not collide. */
|
|
28
|
+
export declare function servePortsInUse(json: string): Set<number>;
|
|
29
|
+
/** The first free front-door port from 8781 up. */
|
|
30
|
+
export declare function suggestServePort(used: Set<number>, from?: number): number;
|
|
31
|
+
export declare const guessEnv: (name: string) => LinkEnv;
|
|
32
|
+
/** Ports at or above this are an OS-picked port: an IDE's helper, a dev server's HMR socket. */
|
|
33
|
+
export declare const EPHEMERAL_FROM = 32768;
|
|
34
|
+
/** Processes that listen in a repo but never serve a page: emulators, adb, VM helpers, databases. */
|
|
35
|
+
export declare const NOT_WEB_RE: RegExp;
|
|
36
|
+
export interface LocalInputs {
|
|
37
|
+
listeners: Listener[];
|
|
38
|
+
cwd: Map<number, string>;
|
|
39
|
+
repos: readonly RepoDir[];
|
|
40
|
+
serve: Map<number, string>;
|
|
41
|
+
servePorts: Set<number>;
|
|
42
|
+
tailnetIp: string | null;
|
|
43
|
+
tailscale: string;
|
|
44
|
+
selfPid: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Listening ports whose process works inside a repo under the code root, one row per port.
|
|
48
|
+
* The phone URL is the serve front door if there is one, else the tailnet address when the port is
|
|
49
|
+
* bound to it (or to every interface), else none — with the serve command that would make one.
|
|
50
|
+
*/
|
|
51
|
+
export declare function localFound(i: LocalInputs): FoundLink[];
|
|
52
|
+
/** `gcloud run services list --format=json` for one project → found rows (repo filled in later). */
|
|
53
|
+
export declare function parseRunServices(json: string, project: string): FoundLink[];
|
|
54
|
+
/** Firebase Hosting `GET v1beta1/projects/<p>/sites` → one row per site. */
|
|
55
|
+
export declare function parseHostingSites(json: string, project: string): FoundLink[];
|
|
56
|
+
/**
|
|
57
|
+
* `git grep -I -o -h -F -e <id1> -e <id2> …` per repo → id → repo with the most mentions. Used for
|
|
58
|
+
* project ids and for Firebase site ids alike.
|
|
59
|
+
* A tie between repos is left unassigned (null): a wrong repo is worse than none.
|
|
60
|
+
*/
|
|
61
|
+
export declare function assignProjects(hits: Map<string, string>, projects: readonly string[]): Map<string, string | null>;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/** `lsof -nP -iTCP -sTCP:LISTEN -Fpcn` → one row per (pid, address). */
|
|
2
|
+
export function parseLsofListen(out) {
|
|
3
|
+
const rows = [];
|
|
4
|
+
const seen = new Set();
|
|
5
|
+
let pid = 0, proc = "";
|
|
6
|
+
for (const line of out.split("\n")) {
|
|
7
|
+
const tag = line[0], v = line.slice(1);
|
|
8
|
+
if (tag === "p") {
|
|
9
|
+
pid = Number(v) || 0;
|
|
10
|
+
proc = "";
|
|
11
|
+
}
|
|
12
|
+
else if (tag === "c")
|
|
13
|
+
proc = v.replace(/\\x20/g, " ");
|
|
14
|
+
else if (tag === "n" && pid) {
|
|
15
|
+
const m = /^(.*):(\d+)$/.exec(v);
|
|
16
|
+
if (!m)
|
|
17
|
+
continue;
|
|
18
|
+
const addr = m[1].replace(/^\[|\]$/g, ""), port = Number(m[2]);
|
|
19
|
+
const k = `${pid} ${addr} ${port}`;
|
|
20
|
+
if (seen.has(k))
|
|
21
|
+
continue;
|
|
22
|
+
seen.add(k);
|
|
23
|
+
rows.push({ pid, proc, addr, port });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return rows;
|
|
27
|
+
}
|
|
28
|
+
/** `lsof -a -d cwd -p <pids> -Fpn` → pid → working directory. */
|
|
29
|
+
export function parseLsofCwd(out) {
|
|
30
|
+
const m = new Map();
|
|
31
|
+
let pid = 0;
|
|
32
|
+
for (const line of out.split("\n")) {
|
|
33
|
+
if (line[0] === "p")
|
|
34
|
+
pid = Number(line.slice(1)) || 0;
|
|
35
|
+
else if (line[0] === "n" && pid)
|
|
36
|
+
m.set(pid, line.slice(1));
|
|
37
|
+
}
|
|
38
|
+
return m;
|
|
39
|
+
}
|
|
40
|
+
/** The repo a path is in: the deepest repo folder holding it, or null outside every one. */
|
|
41
|
+
export function repoOf(path, repos) {
|
|
42
|
+
let best = null;
|
|
43
|
+
for (const r of repos) {
|
|
44
|
+
const p = r.path.replace(/\/+$/, "");
|
|
45
|
+
if ((path === p || path.startsWith(p + "/")) && (!best || p.length > best.path.length))
|
|
46
|
+
best = { name: r.name, path: p };
|
|
47
|
+
}
|
|
48
|
+
return best?.name ?? null;
|
|
49
|
+
}
|
|
50
|
+
/** `tailscale serve status --json` → local port → the https front door that proxies to it. */
|
|
51
|
+
export function parseServeStatus(json) {
|
|
52
|
+
const m = new Map();
|
|
53
|
+
let d;
|
|
54
|
+
try {
|
|
55
|
+
d = JSON.parse(json);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return m;
|
|
59
|
+
}
|
|
60
|
+
const web = d?.Web;
|
|
61
|
+
if (!web || typeof web !== "object")
|
|
62
|
+
return m;
|
|
63
|
+
for (const [hostPort, cfg] of Object.entries(web)) {
|
|
64
|
+
const root = cfg?.Handlers?.["/"]?.Proxy;
|
|
65
|
+
if (typeof root !== "string")
|
|
66
|
+
continue;
|
|
67
|
+
const target = /^https?:\/\/(?:127\.0\.0\.1|localhost|\[::1\]):(\d+)\/?$/.exec(root);
|
|
68
|
+
const hp = /^([^:]+):(\d+)$/.exec(hostPort);
|
|
69
|
+
if (!target || !hp)
|
|
70
|
+
continue;
|
|
71
|
+
const url = hp[2] === "443" ? `https://${hp[1]}` : `https://${hp[1]}:${hp[2]}`;
|
|
72
|
+
const port = Number(target[1]);
|
|
73
|
+
if (!m.has(port))
|
|
74
|
+
m.set(port, url);
|
|
75
|
+
}
|
|
76
|
+
return m;
|
|
77
|
+
}
|
|
78
|
+
/** The https ports a serve config already uses, so a suggestion does not collide. */
|
|
79
|
+
export function servePortsInUse(json) {
|
|
80
|
+
const s = new Set();
|
|
81
|
+
try {
|
|
82
|
+
const tcp = JSON.parse(json)?.TCP;
|
|
83
|
+
for (const k of Object.keys(tcp ?? {}))
|
|
84
|
+
if (/^\d+$/.test(k))
|
|
85
|
+
s.add(Number(k));
|
|
86
|
+
}
|
|
87
|
+
catch { /* none */ }
|
|
88
|
+
return s;
|
|
89
|
+
}
|
|
90
|
+
/** The first free front-door port from 8781 up. */
|
|
91
|
+
export function suggestServePort(used, from = 8781) {
|
|
92
|
+
let p = from;
|
|
93
|
+
while (used.has(p))
|
|
94
|
+
p++;
|
|
95
|
+
return p;
|
|
96
|
+
}
|
|
97
|
+
export const guessEnv = (name) => /(^|[^a-z0-9])(stg|staging|stage)([^a-z0-9]|$)/i.test(name) ? "staging" : "prod";
|
|
98
|
+
const isLoopback = (a) => a === "127.0.0.1" || a === "::1" || a === "localhost";
|
|
99
|
+
const isAny = (a) => a === "*" || a === "0.0.0.0" || a === "::";
|
|
100
|
+
const isTailnet = (a) => /^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(a) || /^fd7a:115c:a1e0:/i.test(a);
|
|
101
|
+
/** Ports at or above this are an OS-picked port: an IDE's helper, a dev server's HMR socket. */
|
|
102
|
+
export const EPHEMERAL_FROM = 32768;
|
|
103
|
+
/** Processes that listen in a repo but never serve a page: emulators, adb, VM helpers, databases. */
|
|
104
|
+
export const NOT_WEB_RE = /^(adb|qemu-system|netsimd|emulator|OrbStack|com\.docker|Docker|postgres|redis-server|mongod|mysqld)/i;
|
|
105
|
+
/**
|
|
106
|
+
* Listening ports whose process works inside a repo under the code root, one row per port.
|
|
107
|
+
* The phone URL is the serve front door if there is one, else the tailnet address when the port is
|
|
108
|
+
* bound to it (or to every interface), else none — with the serve command that would make one.
|
|
109
|
+
*/
|
|
110
|
+
export function localFound(i) {
|
|
111
|
+
const byPort = new Map();
|
|
112
|
+
for (const l of i.listeners) {
|
|
113
|
+
if (l.pid === i.selfPid)
|
|
114
|
+
continue;
|
|
115
|
+
const dir = i.cwd.get(l.pid);
|
|
116
|
+
const repo = dir ? repoOf(dir, i.repos) : null;
|
|
117
|
+
if (!repo)
|
|
118
|
+
continue;
|
|
119
|
+
const cur = byPort.get(l.port);
|
|
120
|
+
if (cur)
|
|
121
|
+
cur.addrs.add(l.addr);
|
|
122
|
+
else
|
|
123
|
+
byPort.set(l.port, { l, addrs: new Set([l.addr]), repo });
|
|
124
|
+
}
|
|
125
|
+
const used = new Set(i.servePorts);
|
|
126
|
+
const rows = [];
|
|
127
|
+
for (const [port, { l, addrs, repo }] of [...byPort].sort((a, b) => a[0] - b[0])) {
|
|
128
|
+
const served = i.serve.get(port);
|
|
129
|
+
const reach = [...addrs].some((a) => isAny(a) || isTailnet(a));
|
|
130
|
+
const url = served ?? (reach && i.tailnetIp ? `http://${i.tailnetIp}:${port}` : null);
|
|
131
|
+
const notWeb = NOT_WEB_RE.test(l.proc);
|
|
132
|
+
const hidden = notWeb || port >= EPHEMERAL_FROM;
|
|
133
|
+
const row = { key: `local:${port}`, kind: "local", repo, label: `${l.proc} :${port}`, url, port, proc: l.proc, env: "dev", hidden };
|
|
134
|
+
if (notWeb)
|
|
135
|
+
row.note = "an emulator, VM helper or database — not a page";
|
|
136
|
+
else if (hidden)
|
|
137
|
+
row.note = "an OS-picked port — usually a helper socket, not a page";
|
|
138
|
+
if (!url && !hidden && [...addrs].every(isLoopback)) {
|
|
139
|
+
const front = suggestServePort(used);
|
|
140
|
+
used.add(front);
|
|
141
|
+
row.serveCmd = `${i.tailscale} serve --bg --https=${front} http://127.0.0.1:${port}`;
|
|
142
|
+
row.note = row.note ?? "listens on this desktop only — the phone cannot reach it until it has a front door";
|
|
143
|
+
}
|
|
144
|
+
rows.push(row);
|
|
145
|
+
}
|
|
146
|
+
return rows;
|
|
147
|
+
}
|
|
148
|
+
/** `gcloud run services list --format=json` for one project → found rows (repo filled in later). */
|
|
149
|
+
export function parseRunServices(json, project) {
|
|
150
|
+
let d;
|
|
151
|
+
try {
|
|
152
|
+
d = JSON.parse(json);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
if (!Array.isArray(d))
|
|
158
|
+
return [];
|
|
159
|
+
const rows = [];
|
|
160
|
+
for (const s of d) {
|
|
161
|
+
const name = s?.metadata?.name, url = s?.status?.url;
|
|
162
|
+
if (typeof name !== "string" || typeof url !== "string" || !/^https:\/\//.test(url))
|
|
163
|
+
continue;
|
|
164
|
+
const labels = s.metadata?.labels ?? {}, ann = s.metadata?.annotations ?? {};
|
|
165
|
+
const fn = labels["goog-managed-by"] === "cloudfunctions";
|
|
166
|
+
const ingress = ann["run.googleapis.com/ingress"];
|
|
167
|
+
const internal = ingress === "internal" || ingress === "internal-and-cloud-load-balancing";
|
|
168
|
+
const row = {
|
|
169
|
+
key: `run:${project}/${name}`, kind: fn ? "function" : "cloudrun", repo: null, label: name, url, project,
|
|
170
|
+
env: guessEnv(`${name} ${project}`), hidden: fn || internal,
|
|
171
|
+
};
|
|
172
|
+
if (fn)
|
|
173
|
+
row.note = "a Cloud Function — an endpoint, usually not a page";
|
|
174
|
+
else if (internal)
|
|
175
|
+
row.note = "internal ingress — not reachable from the internet";
|
|
176
|
+
rows.push(row);
|
|
177
|
+
}
|
|
178
|
+
return rows;
|
|
179
|
+
}
|
|
180
|
+
/** Firebase Hosting `GET v1beta1/projects/<p>/sites` → one row per site. */
|
|
181
|
+
export function parseHostingSites(json, project) {
|
|
182
|
+
let d;
|
|
183
|
+
try {
|
|
184
|
+
d = JSON.parse(json);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
const sites = d?.sites;
|
|
190
|
+
if (!Array.isArray(sites))
|
|
191
|
+
return [];
|
|
192
|
+
const rows = [];
|
|
193
|
+
for (const s of sites) {
|
|
194
|
+
const id = typeof s?.name === "string" ? s.name.split("/").pop() : null;
|
|
195
|
+
if (!id || typeof s.defaultUrl !== "string" || !/^https:\/\//.test(s.defaultUrl))
|
|
196
|
+
continue;
|
|
197
|
+
rows.push({ key: `fb:${id}`, kind: "firebase", repo: null, label: id, url: s.defaultUrl, project, env: guessEnv(`${id} ${project}`), hidden: false });
|
|
198
|
+
}
|
|
199
|
+
return rows;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* `git grep -I -o -h -F -e <id1> -e <id2> …` per repo → id → repo with the most mentions. Used for
|
|
203
|
+
* project ids and for Firebase site ids alike.
|
|
204
|
+
* A tie between repos is left unassigned (null): a wrong repo is worse than none.
|
|
205
|
+
*/
|
|
206
|
+
export function assignProjects(hits, projects) {
|
|
207
|
+
const counts = new Map();
|
|
208
|
+
for (const [repo, out] of hits) {
|
|
209
|
+
for (const line of out.split("\n")) {
|
|
210
|
+
const p = line.trim();
|
|
211
|
+
if (!projects.includes(p))
|
|
212
|
+
continue;
|
|
213
|
+
const m = counts.get(p) ?? new Map();
|
|
214
|
+
m.set(repo, (m.get(repo) ?? 0) + 1);
|
|
215
|
+
counts.set(p, m);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const out = new Map();
|
|
219
|
+
for (const p of projects) {
|
|
220
|
+
const m = [...(counts.get(p) ?? new Map())].sort((a, b) => b[1] - a[1]);
|
|
221
|
+
out.set(p, m.length === 0 || (m.length > 1 && m[0][1] === m[1][1]) ? null : m[0][0]);
|
|
222
|
+
}
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=parse.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.mjs","sourceRoot":"","sources":["../../../../../extensions/links/host/parse.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RunResult {
|
|
2
|
+
code: number | null;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
timedOut: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export type Runner = (bin: string, argv: string[], opts: {
|
|
9
|
+
timeoutMs: number;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}) => Promise<RunResult>;
|
|
12
|
+
/** Run `bin argv` with no shell, killed (SIGKILL) after `timeoutMs`. Resolves, never rejects. */
|
|
13
|
+
export declare const run: Runner;
|
|
14
|
+
/** Map `items` through `fn` with at most `limit` in flight. Order kept. */
|
|
15
|
+
export declare function pool<T, R>(items: readonly T[], limit: number, fn: (t: T) => Promise<R>): Promise<R[]>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The links extension's process plumbing: async `execFile` with a hard time bound, no shell, and a
|
|
3
|
+
* small concurrency pool. Nothing here blocks the loop that pumps every PTY.
|
|
4
|
+
*/
|
|
5
|
+
import { execFile } from "node:child_process";
|
|
6
|
+
/** Run `bin argv` with no shell, killed (SIGKILL) after `timeoutMs`. Resolves, never rejects. */
|
|
7
|
+
export const run = (bin, argv, opts) => new Promise((resolve) => {
|
|
8
|
+
execFile(bin, argv, { timeout: opts.timeoutMs, killSignal: "SIGKILL", cwd: opts.cwd, maxBuffer: 16 * 1024 * 1024, encoding: "utf8" }, (err, stdout, stderr) => {
|
|
9
|
+
if (!err) {
|
|
10
|
+
resolve({ code: 0, stdout, stderr, timedOut: false });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const e = err;
|
|
14
|
+
const timedOut = e.killed === true && e.signal === "SIGKILL";
|
|
15
|
+
const code = typeof e.code === "number" ? e.code : null;
|
|
16
|
+
resolve({ code, stdout: stdout ?? "", stderr: stderr ?? "", timedOut, error: typeof e.code === "string" ? `${e.code}` : e.message });
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
/** Map `items` through `fn` with at most `limit` in flight. Order kept. */
|
|
20
|
+
export async function pool(items, limit, fn) {
|
|
21
|
+
const out = new Array(items.length);
|
|
22
|
+
let next = 0;
|
|
23
|
+
const worker = async () => { for (;;) {
|
|
24
|
+
const i = next++;
|
|
25
|
+
if (i >= items.length)
|
|
26
|
+
return;
|
|
27
|
+
out[i] = await fn(items[i]);
|
|
28
|
+
} };
|
|
29
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=run.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.mjs","sourceRoot":"","sources":["../../../../../extensions/links/host/run.mts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,iGAAiG;AACjG,MAAM,CAAC,MAAM,GAAG,GAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAClI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACtB,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,GAA4F,CAAC;QACvG,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvI,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAO,KAAmB,EAAE,KAAa,EAAE,EAAwB;IAC3F,MAAM,GAAG,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO;QAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IAC3H,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type LinkEnv, type PinnedLink } from "../shared/wire.mjs";
|
|
2
|
+
export declare const REPO_RE: RegExp;
|
|
3
|
+
export declare const cleanLabel: (s: unknown) => string | null;
|
|
4
|
+
export declare const isEnv: (e: unknown) => e is LinkEnv;
|
|
5
|
+
export interface Loaded {
|
|
6
|
+
links: PinnedLink[];
|
|
7
|
+
problems: string[];
|
|
8
|
+
writable: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadPins(file: string): Promise<Loaded>;
|
|
11
|
+
export declare function savePins(file: string, links: readonly PinnedLink[]): Promise<void>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pins, on disk: `<config dir>/links.json`, `{ "links": PinnedLink[] }`. Hand-editable — a row
|
|
3
|
+
* that does not validate is kept out of the list and NAMED, never rewritten away: while the file has
|
|
4
|
+
* any problem it is not written at all (`writable: false`) — a pin or edit then refuses in words.
|
|
5
|
+
*/
|
|
6
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
7
|
+
import { dirname } from "node:path";
|
|
8
|
+
import { LINK_ENVS, PIN_ID_RE, isHttpUrl } from "../shared/wire.mjs";
|
|
9
|
+
export const REPO_RE = /^[\w.-]{1,128}$/;
|
|
10
|
+
export const cleanLabel = (s) => {
|
|
11
|
+
if (typeof s !== "string")
|
|
12
|
+
return null;
|
|
13
|
+
const t = s.replace(/\s+/g, " ").trim().slice(0, 120);
|
|
14
|
+
return t || null;
|
|
15
|
+
};
|
|
16
|
+
export const isEnv = (e) => typeof e === "string" && LINK_ENVS.includes(e);
|
|
17
|
+
function valid(r) {
|
|
18
|
+
const o = r;
|
|
19
|
+
if (!o || typeof o !== "object" || typeof o.id !== "string" || !PIN_ID_RE.test(o.id))
|
|
20
|
+
return null;
|
|
21
|
+
const label = cleanLabel(o.label);
|
|
22
|
+
if (!label)
|
|
23
|
+
return null;
|
|
24
|
+
const hasUrl = isHttpUrl(o.url), hasPort = Number.isInteger(o.port) && o.port > 0 && o.port < 65536;
|
|
25
|
+
if (hasUrl === hasPort)
|
|
26
|
+
return null;
|
|
27
|
+
const repo = typeof o.repo === "string" && REPO_RE.test(o.repo) ? o.repo : null;
|
|
28
|
+
const p = { id: o.id, label, repo, env: isEnv(o.env) ? o.env : "dev" };
|
|
29
|
+
if (hasUrl)
|
|
30
|
+
p.url = o.url;
|
|
31
|
+
else
|
|
32
|
+
p.port = o.port;
|
|
33
|
+
if (typeof o.from === "string" && o.from.length < 300)
|
|
34
|
+
p.from = o.from;
|
|
35
|
+
return p;
|
|
36
|
+
}
|
|
37
|
+
export async function loadPins(file) {
|
|
38
|
+
let text;
|
|
39
|
+
try {
|
|
40
|
+
text = await readFile(file, "utf8");
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
if (e.code === "ENOENT")
|
|
44
|
+
return { links: [], problems: [], writable: true };
|
|
45
|
+
return { links: [], problems: [`${file} could not be read: ${e.message}`], writable: false };
|
|
46
|
+
}
|
|
47
|
+
let d;
|
|
48
|
+
try {
|
|
49
|
+
d = JSON.parse(text);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return { links: [], problems: [`${file} is not JSON — nothing in it is shown, and nothing is written over it until it parses.`], writable: false };
|
|
53
|
+
}
|
|
54
|
+
const rows = Array.isArray(d?.links) ? d.links : null;
|
|
55
|
+
if (!rows)
|
|
56
|
+
return { links: [], problems: [`${file} has no "links" list — nothing is written over it until it has one.`], writable: false };
|
|
57
|
+
const links = [];
|
|
58
|
+
let bad = 0;
|
|
59
|
+
for (const r of rows) {
|
|
60
|
+
const v = valid(r);
|
|
61
|
+
if (v)
|
|
62
|
+
links.push(v);
|
|
63
|
+
else
|
|
64
|
+
bad++;
|
|
65
|
+
}
|
|
66
|
+
if (!bad)
|
|
67
|
+
return { links, problems: [], writable: true };
|
|
68
|
+
return { links, writable: false, problems: [`${bad} row${bad === 1 ? "" : "s"} in ${file} did not read as a link and ${bad === 1 ? "is" : "are"} not shown — pins are not changed from the phone until the file is fixed by hand.`] };
|
|
69
|
+
}
|
|
70
|
+
export async function savePins(file, links) {
|
|
71
|
+
await mkdir(dirname(file), { recursive: true });
|
|
72
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
73
|
+
await writeFile(tmp, JSON.stringify({ links }, null, 2) + "\n", { mode: 0o600 });
|
|
74
|
+
await rename(tmp, file);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=store.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.mjs","sourceRoot":"","sources":["../../../../../extensions/links/host/store.mts"],"names":[],"mappings":"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"}
|